+importnumpyasnumpy
+frommatplotlib.tickerimportFormatter
+
+
+class_FormatterMixin(Formatter):
+ """ A mpl-axes formatter mixin class """
+
+ @classmethod
+ def_sig_figs(cls,x,n,expthresh=5,forceint=False):
+ """
+ Formats a number with the correct number of significant digits.
+
+ Parameters
+ ----------
+ x : int or float
+ The number you want to format.
+ n : int
+ The number of significan figures it should have.
+ expthresh : int, optional (default = 5)
+ The absolute value of the order of magnitude at which numbers
+ are formatted in exponential notation.
+ forceint : bool, optional (default is False)
+ If true, simply returns int(x)
+
+ Returns
+ -------
+ formatted : str
+ The formatted number as a string
+
+ Examples
+ --------
+ >>> _sig_figs(1247.15, 3)
+ '1250'
+ >>> _sig_figs(1247.15, 7)
+ '1247.150'
+
+ """
+
+ # return a string value unaltered
+ ifisinstance(x,str):
+ out=cls._sig_figs(float(x),n,expthresh=expthresh,forceint=forceint)
+
+ elifx==0.0:
+ out='0'
+
+ # check on the number provided
+ elifxisnotNoneandnumpy.isfinite(x):
+
+ # check on the _sig_figs
+ ifn<1:
+ raiseValueError("number of sig figs (n) must be greater than zero")
+
+ elifforceint:
+ out='{:,.0f}'.format(x)
+
+ # logic to do all of the rounding
+ else:
+ order=numpy.floor(numpy.log10(numpy.abs(x)))
+
+ if(-1.0*expthresh<=order<=expthresh):
+ decimal_places=int(n-1-order)
+
+ ifdecimal_places<=0:
+ out='{0:,.0f}'.format(round(x,decimal_places))
+
+ else:
+ fmt='{0:,.%df}'%decimal_places
+ out=fmt.format(x)
+
+ else:
+ decimal_places=n-1
+ fmt='{0:.%de}'%decimal_places
+ out=fmt.format(x)
+
+ # with NAs and INFs, just return 'NA'
+ else:
+ out='NA'
+
+ returnout
+
+ def__call__(self,x,pos=None):
+ ifx<(10/self.factor):
+ out=self._sig_figs(x,1)
+ elifx<=(99/self.factor):
+ out=self._sig_figs(x,2)
+ else:
+ order=numpy.ceil(numpy.round(numpy.abs(numpy.log10(self.top-x)),6))
+ out=self._sig_figs(x,order+self.offset)
+
+ return'{}'.format(out)
+
+
+
+importnumpy
+frommatplotlib.scaleimportScaleBase
+frommatplotlib.tickerimport(
+ FixedLocator,
+ NullLocator,
+ NullFormatter,
+ FuncFormatter,
+)
+
+from.transformsimportProbTransform
+from.formattersimportPctFormatter,ProbFormatter
+
+
+class_minimal_norm(object):
+ """
+ A basic implmentation of a normal distribution, minimally
+ API-complient with scipt.stats.norm
+
+ """
+
+ _A=-(8*(numpy.pi-3.0)/(3.0*numpy.pi*(numpy.pi-4.0)))
+
+ @classmethod
+ def_approx_erf(cls,x):
+ """ Approximate solution to the error function
+
+ http://en.wikipedia.org/wiki/Error_function
+
+ """
+
+ guts=-x**2*(4.0/numpy.pi+cls._A*x**2)/(1.0+cls._A*x**2)
+ returnnumpy.sign(x)*numpy.sqrt(1.0-numpy.exp(guts))
+
+ @classmethod
+ def_approx_inv_erf(cls,z):
+ """ Approximate solution to the inverse error function
+
+ http://en.wikipedia.org/wiki/Error_function
+
+ """
+
+ _b=(2/numpy.pi/cls._A)+(0.5*numpy.log(1-z**2))
+ _c=numpy.log(1-z**2)/cls._A
+ returnnumpy.sign(z)*numpy.sqrt(numpy.sqrt(_b**2-_c)-_b)
+
+ @classmethod
+ defppf(cls,q):
+ """ Percent point function (inverse of cdf)
+
+ Wikipedia: https://goo.gl/Rtxjme
+
+ """
+ returnnumpy.sqrt(2)*cls._approx_inv_erf(2*q-1)
+
+ @classmethod
+ defcdf(cls,x):
+ """ Cumulative density function
+
+ Wikipedia: https://goo.gl/ciUNLx
+
+ """
+ return0.5*(1+cls._approx_erf(x/numpy.sqrt(2)))
+
+
+
[docs]classProbScale(ScaleBase):
+ """ A probability scale for matplotlib Axes.
+
+ Parameters
+ ----------
+ axis : a matplotlib axis artist
+ The axis whose scale will be set.
+ dist : scipy.stats probability distribution, optional
+ The distribution whose ppf/cdf methods should be used to compute
+ the tick positions. By default, a minimal implimentation of the
+ ``scipy.stats.norm`` class is used so that scipy is not a
+ requirement.
+
+ Examples
+ --------
+ The most basic use:
+
+ .. plot::
+ :context: close-figs
+
+ >>> from matplotlib import pyplot
+ >>> import probscale
+ >>> fig, ax = pyplot.subplots(figsize=(4, 7))
+ >>> ax.set_ylim(bottom=0.5, top=99.5)
+ >>> ax.set_yscale('prob')
+
+ """
+
+ name='prob'
+
+ def__init__(self,axis,**kwargs):
+ self.dist=kwargs.pop('dist',_minimal_norm)
+ self.as_pct=kwargs.pop('as_pct',True)
+ self.nonpos=kwargs.pop('nonpos','mask')
+ self._transform=ProbTransform(self.dist,as_pct=self.as_pct)
+
+ @classmethod
+ def_get_probs(cls,nobs,as_pct):
+ """ Returns the x-axis labels for a probability plot based on
+ the number of observations (`nobs`).
+ """
+ ifas_pct:
+ factor=1.0
+ else:
+ factor=100.0
+
+ order=int(numpy.floor(numpy.log10(nobs)))
+ base_probs=numpy.array([10,20,30,40,50,60,70,80,90])
+
+ axis_probs=base_probs.copy()
+ forninrange(order):
+ ifn<=2:
+ lower_fringe=numpy.array([1,2,5])
+ upper_fringe=numpy.array([5,8,9])
+ else:
+ lower_fringe=numpy.array([1])
+ upper_fringe=numpy.array([9])
+
+ new_lower=lower_fringe/10**(n)
+ new_upper=upper_fringe/10**(n)+axis_probs.max()
+ axis_probs=numpy.hstack([new_lower,axis_probs,new_upper])
+
+ locs=axis_probs/factor
+ returnlocs
+
+
[docs]defset_default_locators_and_formatters(self,axis):
+ """
+ Set the locators and formatters to specialized versions for
+ log scaling.
+ """
+
+ axis.set_major_locator(FixedLocator(self._get_probs(1e8,self.as_pct)))
+ ifself.as_pct:
+ axis.set_major_formatter(FuncFormatter(PctFormatter()))
+ else:
+ axis.set_major_formatter(FuncFormatter(ProbFormatter()))
+ axis.set_minor_locator(NullLocator())
+ axis.set_minor_formatter(NullFormatter())
+
+
[docs]defget_transform(self):
+ """
+ Return a :class:`~matplotlib.transforms.Transform` instance
+ appropriate for the given logarithm base.
+ """
+ returnself._transform
+
+
[docs]deflimit_range_for_scale(self,vmin,vmax,minpos):
+ """
+ Limit the domain to positive values.
+ """
+ return(vmin<=0.0andminposorvmin,vmax<=0.0andminposorvmax)
+importnumpy
+frommatplotlib.transformsimportTransform
+
+
+def_mask_out_of_bounds(a):
+ """
+ Return a Numpy array where all values outside ]0, 1[ are
+ replaced with NaNs. If all values are inside ]0, 1[, the original
+ array is returned.
+ """
+ a=numpy.array(a,float)
+ mask=(a<=0.0)|(a>=1.0)
+ ifmask.any():
+ returnnumpy.where(mask,numpy.nan,a)
+ returna
+
+
+def_clip_out_of_bounds(a):
+ """
+ Return a Numpy array where all values outside ]0, 1[ are
+ replaced with eps or 1 - eps. If all values are inside ]0, 1[
+ the original array is returned. (eps = 1e-300)
+ """
+ a=numpy.array(a,float)
+ a[a<=0.0]=1e-300
+ a[a>=1.0]=1-1e-300
+ returna
+
+
+class_ProbTransformMixin(Transform):
+ """
+ Mixin for MPL axes transform for quantiles/probabilities or
+ percentages.
+
+ """
+
+ input_dims=1
+ output_dims=1
+ is_separable=True
+ has_inverse=True
+
+ def__init__(self,dist,as_pct=True,out_of_bounds='mask'):
+ Transform.__init__(self)
+ self.dist=dist
+ self.as_pct=as_pct
+ self.out_of_bounds=out_of_bounds
+ ifself.as_pct:
+ self.factor=100.0
+ else:
+ self.factor=1.0
+
+ ifself.out_of_bounds=='mask':
+ self._handle_out_of_bounds=_mask_out_of_bounds
+ elifself.out_of_bounds=='clip':
+ self._handle_out_of_bounds=_clip_out_of_bounds
+ else:
+ raiseValueError("`out_of_bounds` muse be either 'mask' or 'clip'")
+
+
+
[docs]classProbTransform(_ProbTransformMixin):
+ """
+ MPL axes tranform class to convert quantiles to probabilities
+ or percents.
+
+ Parameters
+ ----------
+ dist : scipy.stats distribution
+ The distribution whose ``cdf`` and ``pdf`` methods wiil set the
+ scale of the axis.
+ as_pct : bool, optional (True)
+ Toggles the formatting of the probabilities associated with the
+ tick labels as percentanges (0 - 100) or fractions (0 - 1).
+ out_of_bounds : string, optionals ('mask' or 'clip')
+ Determines how data outside the range of valid values is
+ handled. The default behavior is to mask the data.
+ Alternatively, the data can be clipped to values arbitrarily
+ close to the limits of the scale.
+
+ """
+
+
[docs]classQuantileTransform(_ProbTransformMixin):
+ """
+ MPL axes tranform class to convert probabilities or percents to
+ quantiles.
+
+ Parameters
+ ----------
+ dist : scipy.stats distribution
+ The distribution whose ``cdf`` and ``pdf`` methods wiil set the
+ scale of the axis.
+ as_pct : bool, optional (True)
+ Toggles the formatting of the probabilities associated with the
+ tick labels as percentanges (0 - 100) or fractions (0 - 1).
+ out_of_bounds : string, optionals ('mask' or 'clip')
+ Determines how data outside the range of valid values is
+ handled. The default behavior is to mask the data.
+ Alternatively, the data can be clipped to values arbitrarily
+ close to the limits of the scale.
+
+ """
+
+
[docs]defaxes_object(ax):
+ """ Checks if a value if an Axes. If None, a new one is created.
+ Both the figure and axes are returned (in that order).
+
+ """
+
+ ifaxisNone:
+ ax=pyplot.gca()
+ fig=ax.figure
+ elifisinstance(ax,pyplot.Axes):
+ fig=ax.figure
+ else:
+ msg="`ax` must be a matplotlib Axes instance or None"
+ raiseValueError(msg)
+
+ returnfig,ax
+
+
+
[docs]defaxis_name(axis,axname):
+ """
+ Checks that an axis name is in ``{'x', 'y'}``. Raises an error on
+ an invalid value. Returns the lower case verion of valid values.
+
+ """
+
+ valid_args=['x','y']
+ ifaxis.lower()notinvalid_args:
+ msg='Invalid value for {} ({}). Must be on of {}.'
+ raiseValueError(msg.format(axname,axis,valid_args))
+
+ returnaxis.lower()
+
+
+
[docs]deffit_argument(arg,argname):
+ """
+ Checks that an axis options is in ``{'x', y', 'both', None}``.
+ Raises an error on an invalid value. Returns the lower case verion
+ of valid values.
+
+ """
+
+ valid_args=['x','y','both',None]
+ ifargnotinvalid_args:
+ msg='Invalid value for {} ({}). Must be on of {}.'
+ raiseValueError(msg.format(argname,arg,valid_args))
+ elifargisnotNone:
+ arg=arg.lower()
+
+ returnarg
+
+
+
[docs]defaxis_type(axtype):
+ """
+ Checks that a valid axis type is requested.
+
+ - *pp* - percentile axis
+ - *qq* - quantile axis
+ - *prob* - probability axis
+
+ Raises an error on an invalid value. Returns the lower case verion
+ of valid values.
+
+ """
+
+ ifaxtype.lower()notin['pp','qq','prob']:
+ raiseValueError("invalid axtype: {}".format(axtype))
+ returnaxtype.lower()
+
+
+
[docs]defaxis_label(label):
+ """
+ Replaces None with an empty string for axis labels.
+
+ """
+
+ return''iflabelisNoneelselabel
+
+
+
[docs]defother_options(options):
+ """
+ Replaces None with an empty dict for plotting options.
+
+ """
+
+ returndict()ifoptionsisNoneelseoptions.copy()
+
+
+
[docs]defestimator(value):
+ ifvalue.lower()in['res','resid','resids','residual','residuals']:
+ msg='Bootstrapping the residuals is not ready yet'
+ raiseNotImplementedError(msg)
+ elifvalue.lower()in['fit','values']:
+ est=_bs_fit
+ else:
+ raiseValueError('estimator must be either "resid" or "fit".')
+
+ returnest
[docs]defprobplot(data,ax=None,plottype='prob',dist=None,probax='x',
+ problabel=None,datascale='linear',datalabel=None,
+ bestfit=False,return_best_fit_results=False,
+ estimate_ci=False,ci_kws=None,pp_kws=None,
+ scatter_kws=None,line_kws=None,**fgkwargs):
+ """
+ Probability, percentile, and quantile plots.
+
+ Parameters
+ ----------
+ data : array-like
+ 1-dimensional data to be plotted
+
+ ax : matplotlib axes, optional
+ The Axes on which to plot. If one is not provided, a new Axes
+ will be created.
+
+ plottype : string (default = 'prob')
+ Type of plot to be created. Options are:
+
+ - 'prob': probabilty plot
+ - 'pp': percentile plot
+ - 'qq': quantile plot
+
+
+ dist : scipy distribution, optional
+ A distribtion to compute the scale's tick positions. If not
+ specified, a standard normal distribution will be used.
+
+ probax : string, optional (default = 'x')
+ The axis ('x' or 'y') that will serve as the probability (or
+ quantile) axis.
+
+ problabel, datalabel : string, optional
+ Axis labels for the probability/quantile and data axes
+ respectively.
+
+ datascale : string, optional (default = 'log')
+ Scale for the other axis that is not
+
+ bestfit : bool, optional (default is False)
+ Specifies whether a best-fit line should be added to the plot.
+
+ return_best_fit_results : bool (default is False)
+ If True a dictionary of results of is returned along with the
+ figure.
+
+ estimate_ci : bool, optional (False)
+ Estimate and draw a confidence band around the best-fit line
+ using a percentile bootstrap.
+
+ ci_kws : dict, optional
+ Dictionary of keyword arguments passed directly to
+ ``viz.fit_line`` when computing the best-fit line.
+
+ pp_kws : dict, optional
+ Dictionary of keyword arguments passed directly to
+ ``viz.plot_pos`` when computing the plotting positions.
+
+ scatter_kws, line_kws : dict, optional
+ Dictionary of keyword arguments passed directly to ``ax.plot``
+ when drawing the scatter points and best-fit line, respectively.
+
+ Other Parameters
+ ----------------
+ color : string, optional
+ A directly-specified matplotlib color argument for both the
+ data series and the best-fit line if drawn. This argument is
+ made available for compatibility for the seaborn package and
+ is not recommended for general use. Instead colors should be
+ specified within ``scatter_kws`` and ``line_kws``.
+
+ .. note::
+ Users should not specify this parameter. It is inteded to
+ only be used by seaborn when operating within a
+ ``FacetGrid``.
+
+ label : string, optional
+ A directly-specified legend label for the data series. This
+ argument is made available for compatibility for the seaborn
+ package and is not recommended for general use. Instead the
+ data series label should be specified within ``scatter_kws``.
+
+ .. note::
+ Users should not specify this parameter. It is inteded to
+ only be used by seaborn when operating within a
+ ``FacetGrid``.
+
+
+ Returns
+ -------
+ fig : matplotlib.Figure
+ The figure on which the plot was drawn.
+
+ result : dict of linear fit results, optional
+ Keys are:
+
+ - q : array of quantiles
+ - x, y : arrays of data passed to function
+ - xhat, yhat : arrays of modeled data plotted in best-fit line
+ - res : array of coeffcients of the best-fit line.
+
+ See also
+ --------
+ viz.plot_pos
+ viz.fit_line
+ numpy.polyfit
+ scipy.stats.probplot
+ scipy.stats.mstats.plotting_positions
+
+ Examples
+ --------
+
+ Probability plot with the probabilities on the y-axis
+
+ .. plot::
+ :context: close-figs
+
+ >>> import numpy; numpy.random.seed(0)
+ >>> from matplotlib import pyplot
+ >>> from scipy import stats
+ >>> from probscale.viz import probplot
+ >>> data = numpy.random.normal(loc=5, scale=1.25, size=37)
+ >>> fig = probplot(data, plottype='prob', probax='y',
+ ... problabel='Non-exceedance probability',
+ ... datalabel='Observed values', bestfit=True,
+ ... line_kws=dict(linestyle='--', linewidth=2),
+ ... scatter_kws=dict(marker='o', alpha=0.5))
+
+
+ Quantile plot with the quantiles on the x-axis
+
+ .. plot::
+ :context: close-figs
+
+ >>> fig = probplot(data, plottype='qq', probax='x',
+ ... problabel='Theoretical Quantiles',
+ ... datalabel='Observed values', bestfit=True,
+ ... line_kws=dict(linestyle='-', linewidth=2),
+ ... scatter_kws=dict(marker='s', alpha=0.5))
+
+ """
+
+ ifdistisNone:
+ dist=_minimal_norm
+
+ # check input values
+ fig,ax=validate.axes_object(ax)
+ probax=validate.axis_name(probax,'probability axis')
+ problabel=validate.axis_label(problabel)
+ datalabel=validate.axis_label(datalabel)
+
+ # default values for symbology options
+ scatter_kws=validate.other_options(scatter_kws)
+ line_kws=validate.other_options(line_kws)
+ pp_kws=validate.other_options(pp_kws)
+
+ # check plottype
+ plottype=validate.axis_type(plottype)
+
+ ## !-- kwarg that only seaborn should use --! ##
+ _color=fgkwargs.get('color',None)
+ if_colorisnotNone:
+ scatter_kws['color']=_color
+ line_kws['color']=_color
+
+ ## !-- kwarg that only seaborn should use --! ##
+ _label=fgkwargs.get('label',None)
+ if_labelisnotNone:
+ scatter_kws['label']=_label
+
+ # compute the plotting positions and sort the data
+ probs,datavals=plot_pos(data,**pp_kws)
+ qntls=dist.ppf(probs)
+
+ # determine how the probability values should be expressed
+ ifplottype=='qq':
+ probvals=qntls
+ else:
+ probvals=probs*100
+
+ # set up x, y, Axes for probabilities on the x
+ ifprobax=='x':
+ x,y=probvals,datavals
+ ax.set_xlabel(problabel)
+ ax.set_ylabel(datalabel)
+ ifplottype=='prob':
+ ax.set_xscale('prob',dist=dist)
+ fitprobs='x'
+ else:
+ fitprobs=None
+ ifplottype=='pp':
+ ax.set_xlim(left=0,right=100)
+
+ ax.set_yscale(datascale)
+ fitlogs='y'ifdatascale=='log'elseNone
+
+ # setup x, y, Axes for probabilities on the y
+ elifprobax=='y':
+ y,x=probvals,datavals
+ ax.set_xlabel(datalabel)
+ ax.set_ylabel(problabel)
+ ifplottype=='prob':
+ ax.set_yscale('prob',dist=dist)
+ fitprobs='y'
+ else:
+ fitprobs=None
+ ifplottype=='pp':
+ ax.set_ylim(bottom=0,top=100)
+
+ ax.set_xscale(datascale)
+ fitlogs='x'ifdatascale=='log'elseNone
+
+ # finally plot the data
+ linestyle=scatter_kws.pop('linestyle','none')
+ marker=scatter_kws.pop('marker','o')
+ ax.plot(x,y,linestyle=linestyle,marker=marker,**scatter_kws)
+
+ # maybe do a best-fit and plot
+ ifbestfit:
+ xhat,yhat,modelres=fit_line(x,y,xhat=sorted(x),dist=dist,
+ fitprobs=fitprobs,fitlogs=fitlogs,
+ estimate_ci=estimate_ci)
+ ax.plot(xhat,yhat,**line_kws)
+ ifestimate_ci:
+ # for alpha, use half of existing or 0.5 * 0.5 = 0.25
+ # for zorder, use 1 less than existing or 1 - 1 = 0
+ opts={
+ 'facecolor':line_kws.get('color','k'),
+ 'edgecolor':line_kws.get('color','None'),
+ 'alpha':line_kws.get('alpha',0.5)*0.5,
+ 'zorder':line_kws.get('zorder',1)-1,
+ 'label':'95% conf. interval'
+ }
+ ax.fill_between(xhat,y1=modelres['yhat_hi'],y2=modelres['yhat_lo'],
+ **opts)
+ else:
+ xhat,yhat,modelres=(None,None,None)
+
+ # set the probability axes limits
+ ifplottype=='prob':
+ _set_prob_limits(ax,probax,len(probs))
+
+ # return the figure and maybe results of the best-fit
+ ifreturn_best_fit_results:
+ results=dict(q=qntls,x=x,y=y,xhat=xhat,yhat=yhat,res=modelres)
+ returnfig,results
+ else:
+ returnfig
+
+
+
[docs]defplot_pos(data,postype=None,alpha=None,beta=None):
+ """
+ Compute the plotting positions for a dataset. Heavily borrows from
+ ``scipy.stats.mstats.plotting_positions``.
+
+ A plottiting position is defined as: ``(i-alpha)/(n+1-alpha-beta)``
+ where:
+
+ - ``i`` is the rank order
+ - ``n`` is the size of the dataset
+ - ``alpha`` and ``beta`` are parameters used to adjust the
+ positions.
+
+ The values of ``alpha`` and ``beta`` can be explicitly set. Typical
+ values can also be access via the ``postype`` parameter. Available
+ ``postype`` values (alpha, beta) are:
+
+ "type 4" (alpha=0, beta=1)
+ Linear interpolation of the empirical CDF.
+ "type 5" or "hazen" (alpha=0.5, beta=0.5)
+ Piecewise linear interpolation.
+ "type 6" or "weibull" (alpha=0, beta=0)
+ Weibull plotting positions. Unbiased exceedance probability
+ for all distributions. Recommended for hydrologic
+ applications.
+ "type 7" (alpha=1, beta=1)
+ The default values in R. Not recommended with probability
+ scales as the min and max data points get plotting positions
+ of 0 and 1, respectively, and therefore cannot be shown.
+ "type 8" (alpha=1/3, beta=1/3)
+ Approximately median-unbiased.
+ "type 9" or "blom" (alpha=0.375, beta=0.375)
+ Approximately unbiased positions if the data are normally
+ distributed.
+ "median" (alpha=0.3175, beta=0.3175)
+ Median exceedance probabilities for all distributions
+ (used in ``scipy.stats.probplot``).
+ "apl" or "pwm" (alpha=0.35, beta=0.35)
+ Used with probability-weighted moments.
+ "cunnane" (alpha=0.4, beta=0.4)
+ Nearly unbiased quantiles for normally distributed data.
+ This is the default value.
+ "gringorten" (alpha=0.44, beta=0.44)
+ Used for Gumble distributions.
+
+ Parameters
+ ----------
+ data : array-like
+ The values whose plotting positions need to be computed.
+
+ postype : string, optional (default: "cunnane")
+
+ alpha, beta : float, optional
+ Custom plotting position parameters is the options available
+ through the `postype` parameter are insufficient.
+
+ Returns
+ -------
+ plot_pos : numpy.array
+ The computed plotting positions, sorted.
+
+ data_sorted : numpy.array
+ The original data values, sorted.
+
+ References
+ ----------
+ http://artax.karlin.mff.cuni.cz/r-help/library/lmomco/html/pp.html
+ http://astrostatistics.psu.edu/su07/R/html/stats/html/quantile.html
+ http://docs.scipy.org/doc/scipy-0.17.0/reference/generated/scipy.stats.probplot.html
+ http://docs.scipy.org/doc/scipy-0.17.0/reference/generated/scipy.stats.mstats.plotting_positions.html
+
+ """
+
+ pos_params={
+ 'type 4':(0,1),
+ 'type 5':(0.5,0.5),
+ 'type 6':(0,0),
+ 'type 7':(1,1),
+ 'type 8':(1/3.,1/3.),
+ 'type 9':(0.375,0.375),
+ 'weibull':(0,0),
+ 'median':(0.3175,0.3175),
+ 'apl':(0.35,0.35),
+ 'pwm':(0.35,0.35),
+ 'blom':(0.375,0.375),
+ 'hazen':(0.5,0.5),
+ 'cunnane':(0.4,0.4),
+ 'gringorten':(0.44,0.44),# Gumble
+ }
+
+ postype='cunnane'ifpostypeisNoneelsepostype
+ ifalphaisNoneandbetaisNone:
+ alpha,beta=pos_params[postype.lower()]
+
+ data=numpy.asarray(data,dtype=float).flatten()
+ n=data.shape[0]
+ pos=numpy.empty_like(data)
+ pos[n:]=0
+
+ sorted_index=data.argsort()
+ pos[sorted_index[:n]]=(numpy.arange(1,n+1)-alpha)/(n+1.0-alpha-beta)
+
+ returnpos[sorted_index],data[sorted_index]
+
+
+def_set_prob_limits(ax,probax,N):
+ """ Sets the limits of a probabilty axis based the number of point.
+
+ Parameters
+ ----------
+ ax : matplotlib Axes
+ The Axes object that will be modified.
+ N : int
+ Maximum number of points for the series plotted on the Axes.
+ which : string
+ The axis whose ticklabels will be rotated. Valid values are 'x',
+ 'y', or 'both'.
+
+ Returns
+ -------
+ None
+
+ """
+
+ fig,ax=validate.axes_object(ax)
+ which=validate.axis_name(probax,'probability axis')
+
+ ifN<=5:
+ minval=10
+ elifN<=10:
+ minval=5
+ else:
+ minval=10**(-1*numpy.ceil(numpy.log10(N)-2))
+
+ ifwhichin['x','both']:
+ ax.set_xlim(left=minval,right=100-minval)
+ elifwhichin['y','both']:
+ ax.set_ylim(bottom=minval,top=100-minval)
+
+
+
[docs]deffit_line(x,y,xhat=None,fitprobs=None,fitlogs=None,dist=None,
+ estimate_ci=False,niter=10000,alpha=0.05):
+ """
+ Fits a line to x-y data in various forms (linear, log, prob scales).
+
+ Parameters
+ ----------
+ x, y : array-like
+ Independent and dependent data, respectively.
+
+ xhat : array-like, optional
+ The values at which ``yhat`` should should be estimated. If
+ not provided, falls back to the sorted values of ``x``.
+
+ fitprobs, fitlogs : str, optional.
+ Defines how data should be transformed. Valid values are
+ 'x', 'y', or 'both'. If using ``fitprobs``, variables should
+ be expressed as a percentage, i.e.,
+ for a probablility transform, data will be transformed with
+ ``lambda x: dist.ppf(x / 100.)``.
+ For a log transform, ``lambda x: numpy.log(x)``.
+ Take care to not pass the same value to both ``fitlogs`` and
+ ``figprobs`` as both transforms will be applied.
+
+ dist : distribution, optional
+ A fully-spec'd scipy.stats distribution-like object
+ such that ``dist.ppf`` and ``dist.cdf`` can be called. If not
+ provided, defaults to a minimal implementation of
+ ``scipt.stats.norm``.
+
+ estimate_ci : bool, optional (False)
+ Estimate and draw a confidence band around the best-fit line
+ using a percentile bootstrap.
+
+ niter : int, optional (default = 10000)
+ Number of bootstrap iterations if ``estimate_ci`` is provided.
+
+ alpha : float, optional (default = 0.05)
+ The confidence level of the bootstrap estimate.
+
+ Returns
+ -------
+ xhat, yhat : numpy arrays
+ Linear model estimates of ``x`` and ``y``.
+ results : dict
+ Dictionary of linear fit results. Keys include:
+
+ - slope
+ - intersept
+ - yhat_lo (lower confidence interval of the estimated y-vals)
+ - yhat_hi (upper confidence interval of the estimated y-vals)
+
+ """
+
+ fitprobs=validate.fit_argument(fitprobs,"fitprobs")
+ fitlogs=validate.fit_argument(fitlogs,"fitlogs")
+
+ # maybe set xhat to default values
+ ifxhatisNone:
+ xhat=copy.copy(x)
+
+ # maybe set dist to default value
+ ifdistisNone:
+ dist=_minimal_norm
+
+ # maybe compute ppf of x
+ iffitprobsin['x','both']:
+ x=dist.ppf(x/100.)
+ xhat=dist.ppf(numpy.array(xhat)/100.)
+
+ # maybe compute ppf of y
+ iffitprobsin['y','both']:
+ y=dist.ppf(y/100.)
+
+ # maybe compute log of x
+ iffitlogsin['x','both']:
+ x=numpy.log(x)
+
+ # maybe compute log of y
+ iffitlogsin['y','both']:
+ y=numpy.log(y)
+
+ yhat,results=algo._fit_simple(x,y,xhat,fitlogs=fitlogs)
+
+ ifestimate_ci:
+ yhat_lo,yhat_hi=algo._bs_fit(x,y,xhat,fitlogs=fitlogs,
+ niter=niter,alpha=alpha)
+ else:
+ yhat_lo,yhat_hi=None,None
+
+ # maybe undo the ppf transform
+ iffitprobsin['y','both']:
+ yhat=100.*dist.cdf(yhat)
+ ifyhat_loisnotNone:
+ yhat_lo=100.*dist.cdf(yhat_lo)
+ yhat_hi=100.*dist.cdf(yhat_hi)
+
+ # maybe undo ppf transform
+ iffitprobsin['x','both']:
+ xhat=100.*dist.cdf(xhat)
+
+ results['yhat_lo']=yhat_lo
+ results['yhat_hi']=yhat_hi
+
+ returnxhat,yhat,results
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mpl-probscale/_sources/api.txt b/mpl-probscale/_sources/api.txt
new file mode 100644
index 00000000000..6ecfa49f00c
--- /dev/null
+++ b/mpl-probscale/_sources/api.txt
@@ -0,0 +1,11 @@
+API and Source Reference
+------------------------
+
+.. toctree::
+ :maxdepth: 2
+
+ api/viz.rst
+ api/probscale.rst
+ api/formatters.rst
+ api/transforms.rst
+ api/validate.rst
diff --git a/mpl-probscale/_sources/api/formatters.txt b/mpl-probscale/_sources/api/formatters.txt
new file mode 100644
index 00000000000..44059611ca8
--- /dev/null
+++ b/mpl-probscale/_sources/api/formatters.txt
@@ -0,0 +1,11 @@
+.. _formatters_auto:
+
+ The ``formatters`` API
+
+``formatters`` API Reference
+============================
+
+.. automodule:: probscale.formatters
+ :members:
+ :undoc-members:
+ :show-inheritance:
\ No newline at end of file
diff --git a/mpl-probscale/_sources/api/probscale.txt b/mpl-probscale/_sources/api/probscale.txt
new file mode 100644
index 00000000000..f595714684d
--- /dev/null
+++ b/mpl-probscale/_sources/api/probscale.txt
@@ -0,0 +1,11 @@
+.. _probscale_auto:
+
+ The ``probscale`` API
+
+``probscale`` API Reference
+===========================
+
+.. automodule:: probscale.probscale
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/mpl-probscale/_sources/api/transforms.txt b/mpl-probscale/_sources/api/transforms.txt
new file mode 100644
index 00000000000..be18037468d
--- /dev/null
+++ b/mpl-probscale/_sources/api/transforms.txt
@@ -0,0 +1,11 @@
+.. _transforms_auto:
+
+ The ``transforms`` API
+
+``transforms`` API Reference
+============================
+
+.. automodule:: probscale.transforms
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/mpl-probscale/_sources/api/validate.txt b/mpl-probscale/_sources/api/validate.txt
new file mode 100644
index 00000000000..430a0819834
--- /dev/null
+++ b/mpl-probscale/_sources/api/validate.txt
@@ -0,0 +1,11 @@
+.. _validate_auto:
+
+ The ``validate`` API
+
+``validate`` API Reference
+============================
+
+.. automodule:: probscale.validate
+ :members:
+ :undoc-members:
+ :show-inheritance:
\ No newline at end of file
diff --git a/mpl-probscale/_sources/api/viz.txt b/mpl-probscale/_sources/api/viz.txt
new file mode 100644
index 00000000000..b594a658ef1
--- /dev/null
+++ b/mpl-probscale/_sources/api/viz.txt
@@ -0,0 +1,11 @@
+.. _viz_auto:
+
+ The ``viz`` API
+
+``viz`` API Reference
+=====================
+
+.. automodule:: probscale.viz
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/mpl-probscale/_sources/authors.txt b/mpl-probscale/_sources/authors.txt
new file mode 100644
index 00000000000..e122f914a87
--- /dev/null
+++ b/mpl-probscale/_sources/authors.txt
@@ -0,0 +1 @@
+.. include:: ../AUTHORS.rst
diff --git a/mpl-probscale/_sources/contributing.txt b/mpl-probscale/_sources/contributing.txt
new file mode 100644
index 00000000000..e582053ea01
--- /dev/null
+++ b/mpl-probscale/_sources/contributing.txt
@@ -0,0 +1 @@
+.. include:: ../CONTRIBUTING.rst
diff --git a/mpl-probscale/_sources/examples/index.txt b/mpl-probscale/_sources/examples/index.txt
new file mode 100644
index 00000000000..144aedc4fca
--- /dev/null
+++ b/mpl-probscale/_sources/examples/index.txt
@@ -0,0 +1,85 @@
+
+
+.. raw:: html
+
+
+
+.. _example_gallery:
+
+Example gallery
+===============
+
+
+
+.. toctree::
+ :hidden:
+
+
+
+
+
+
+
+.. raw:: html
+
+
diff --git a/mpl-probscale/_sources/index.txt b/mpl-probscale/_sources/index.txt
new file mode 100644
index 00000000000..417a56f433d
--- /dev/null
+++ b/mpl-probscale/_sources/index.txt
@@ -0,0 +1,100 @@
+.. probscale documentation master file, created by
+ sphinx-quickstart on Thu Nov 19 23:14:08 2015.
+ You can adapt this file completely to your liking, but it should at least
+ contain the root `toctree` directive.
+
+
+mpl-probscale: Real probability scales for matplotlib
+=====================================================
+
+.. image:: https://travis-ci.org/matplotlib/mpl-probscale.svg?branch=master
+ :target: https://travis-ci.org/matplotlib/mpl-probscale
+
+.. image:: https://coveralls.io/repos/matplotlib/mpl-probscale/badge.svg?branch=master&service=github
+ :target: https://coveralls.io/github/matplotlib/mpl-probscale?branch=master
+
+https://github.com/matplotlib/mpl-probscale
+
+Installation
+------------
+
+Official releases
+~~~~~~~~~~~~~~~~~
+
+Official releases are available through the conda-forge channel or pip:
+
+``conda install mpl-probscale --channel=conda-forge``
+
+or
+
+``pip install probscale``
+
+Development builds
+~~~~~~~~~~~~~~~~~~
+
+Development builds are available through my conda channel:
+
+``conda install mpl-probscale --channel=conda-forge``
+
+
+Quickstart
+----------
+
+Simply importing ``probscale`` lets you use probability scales in your matplotlib figures:
+
+.. code-block:: python
+
+ import matplotlib.pyplot as plt
+ import probscale
+ import seaborn
+ clear_bkgd = {'axes.facecolor':'none', 'figure.facecolor':'none'}
+ seaborn.set(style='ticks', context='notebook', rc=clear_bkgd)
+
+ fig, ax = plt.subplots(figsize=(8, 4))
+ ax.set_ylim(1e-2, 1e2)
+ ax.set_yscale('log')
+
+ ax.set_xlim(0.5, 99.5)
+ ax.set_xscale('prob')
+ seaborn.despine(fig=fig)
+
+
+.. image:: /img/example.png
+
+
+Tutorials
+=========
+
+.. toctree::
+ :maxdepth: 2
+
+ tutorial/getting_started.rst
+ tutorial/closer_look_at_viz.rst
+ tutorial/closer_look_at_plot_pos.rst
+
+Testing
+=======
+
+It's easiest to run the tests from an interactive python session:
+
+.. code-block:: python
+
+ import matplotlib
+ matplotlib.use('agg')
+ import probscale
+ probscale.test()
+
+API References
+==============
+
+.. toctree::
+ :maxdepth: 2
+
+ api.rst
+
+Indices and tables
+==================
+
+* :ref:`genindex`
+* :ref:`modindex`
+* :ref:`search`
diff --git a/mpl-probscale/_sources/installation.txt b/mpl-probscale/_sources/installation.txt
new file mode 100644
index 00000000000..e139ad90090
--- /dev/null
+++ b/mpl-probscale/_sources/installation.txt
@@ -0,0 +1,51 @@
+.. highlight:: shell
+
+============
+Installation
+============
+
+
+Stable release
+--------------
+
+To install mpl-probscale, run this command in your terminal:
+
+.. code-block:: console
+
+ $ pip install probscale
+
+This is the preferred method to install mpl-probscale, as it will always install the most recent stable release.
+
+If you don't have `pip`_ installed, this `Python installation guide`_ can guide
+you through the process.
+
+.. _pip: https://pip.pypa.io
+.. _Python installation guide: http://docs.python-guide.org/en/latest/starting/installation/
+
+
+From sources
+------------
+
+The sources for mpl-probscale can be downloaded from the `Github repo`_.
+
+You can either clone the public repository:
+
+.. code-block:: console
+
+ $ git clone git://github.com/matplotlib/mpl-probscale
+
+Or download the `tarball`_:
+
+.. code-block:: console
+
+ $ curl -OL https://github.com/matplotlib/mpl-probscale/tarball/master
+
+Once you have a copy of the source, you can install it with:
+
+.. code-block:: console
+
+ $ pip install .
+
+
+.. _Github repo: https://github.com/matplotlib/mpl-probscale
+.. _tarball: https://github.com/matplotlib/mpl-probscale/tarball/master
diff --git a/mpl-probscale/_sources/readme.txt b/mpl-probscale/_sources/readme.txt
new file mode 100644
index 00000000000..bdff72a8eef
--- /dev/null
+++ b/mpl-probscale/_sources/readme.txt
@@ -0,0 +1 @@
+.. include:: ../README.md
diff --git a/mpl-probscale/_sources/tutorial/closer_look_at_plot_pos.txt b/mpl-probscale/_sources/tutorial/closer_look_at_plot_pos.txt
new file mode 100644
index 00000000000..c724acb8fd9
--- /dev/null
+++ b/mpl-probscale/_sources/tutorial/closer_look_at_plot_pos.txt
@@ -0,0 +1,226 @@
+
+Using different formulations of plotting positions
+==================================================
+
+Computing plotting positions
+----------------------------
+
+When drawing a percentile, quantile, or probability plot, the potting
+positions of ordered data must be computed.
+
+For a sample :math:`X` with population size :math:`n`, the plotting
+position of of the :math:`j^\mathrm{th}` element is defined as:
+
+.. math:: \frac{x_{j} - \alpha}{n + 1 - \alpha - \beta }
+
+In this equation, α and β can take on several values. Common values are
+described below:
+
+ "type 4" (α=0, β=1)
+ Linear interpolation of the empirical CDF.
+ "type 5" or "hazen" (α=0.5, β=0.5)
+ Piecewise linear interpolation.
+ "type 6" or "weibull" (α=0, β=0)
+ Weibull plotting positions. Unbiased exceedance probability for all distributions.
+ Recommended for hydrologic applications.
+ "type 7" (α=1, β=1)
+ The default values in R.
+ Not recommended with probability scales as the min and max data points get plotting positions of 0 and 1, respectively, and therefore cannot be shown.
+ "type 8" (α=1/3, β=1/3)
+ Approximately median-unbiased.
+ "type 9" or "blom" (α=0.375, β=0.375)
+ Approximately unbiased positions if the data are normally distributed.
+ "median" (α=0.3175, β=0.3175)
+ Median exceedance probabilities for all distributions (used in ``scipy.stats.probplot``).
+ "apl" or "pwm" (α=0.35, β=0.35)
+ Used with probability-weighted moments.
+ "cunnane" (α=0.4, β=0.4)
+ Nearly unbiased quantiles for normally distributed data.
+ This is the default value.
+ "gringorten" (α=0.44, β=0.44)
+ Used for Gumble distributions.
+
+The purpose of this tutorial is to show how the selected α and β can
+alter the shape of a probability plot.
+
+First let's get some analytical setup out of the way...
+
+.. code:: python
+
+ %matplotlib inline
+
+.. code:: python
+
+ import warnings
+ warnings.simplefilter('ignore')
+
+ import numpy
+ from matplotlib import pyplot
+ from scipy import stats
+ import seaborn
+
+ clear_bkgd = {'axes.facecolor':'none', 'figure.facecolor':'none'}
+ seaborn.set(style='ticks', context='talk', color_codes=True, rc=clear_bkgd)
+
+ import probscale
+
+
+ def format_axes(ax1, ax2):
+ """ Sets axes labels and grids """
+ for ax in (ax1, ax2):
+ if ax is not None:
+ ax.set_ylim(bottom=1, top=99)
+ ax.set_xlabel('Values of Data')
+ seaborn.despine(ax=ax)
+ ax.yaxis.grid(True)
+
+ ax1.legend(loc='upper left', numpoints=1, frameon=False)
+ ax1.set_ylabel('Normal Probability Scale')
+ if ax2 is not None:
+ ax2.set_ylabel('Weibull Probability Scale')
+
+Normal vs Weibull scales and Cunnane vs Weibull plotting positions
+------------------------------------------------------------------
+
+Here we'll generate some fake, normally distributed data and define a
+Weibull distribution from scipy to use for a probability scale.
+
+.. code:: python
+
+ numpy.random.seed(0) # reproducible
+ data = numpy.random.normal(loc=5, scale=1.25, size=37)
+
+ # simple weibull distribution
+ weibull = stats.weibull_min(2)
+
+Now let's create probability plots on both Weibull and normal
+probability scales. Additionally, we'll compute the plotting positions
+two different but commone ways for each plot.
+
+First, in blue circles, we'll show the data with Weibull (α=0, β=0)
+plotting positions. Weibull plotting positions are commonly use in
+fields such as hydrology and water resources engineering.
+
+In green squares, we'll use Cunnane (α=0.4, β=0.4) plotting positions.
+Cunnane plotting positions are good for normally distributed data and
+are the default values.
+
+.. code:: python
+
+ w_opts = {'label': 'Weibull (α=0, β=0)', 'marker': 'o', 'markeredgecolor': 'b'}
+ c_opts = {'label': 'Cunnane (α=0.4, β=0.4)', 'marker': 's', 'markeredgecolor': 'g'}
+
+ common_opts = {
+ 'markerfacecolor': 'none',
+ 'markeredgewidth': 1.25,
+ 'linestyle': 'none'
+ }
+
+ fig, (ax1, ax2) = pyplot.subplots(figsize=(10, 8), ncols=2, sharex=True, sharey=False)
+
+ for dist, ax in zip([None, weibull], [ax1, ax2]):
+ for opts, postype in zip([w_opts, c_opts,], ['weibull', 'cunnane']):
+ probscale.probplot(data, ax=ax, dist=dist, probax='y',
+ scatter_kws={**opts, **common_opts},
+ pp_kws={'postype': postype})
+
+ format_axes(ax1, ax2)
+ fig.tight_layout()
+
+
+
+.. image:: closer_look_at_plot_pos_files/output_9_0.png
+
+
+This demostrates that the different formulations of the plotting
+positions vary most at the extreme values of the dataset.
+
+Hazen plotting positions
+~~~~~~~~~~~~~~~~~~~~~~~~
+
+Next, let's compare the Hazen/Type 5 (α=0.5, β=0.5) formulation to
+Cunnane. Hazen plotting positions (shown as red triangles) represet a
+piece-wise linear interpolation of the emperical cumulative distribution
+function of the dataset.
+
+Given the values of α and β=0.5 vary only slightly from the Cunnane
+values, the plotting position predictably are similar.
+
+.. code:: python
+
+ h_opts = {'label': 'Hazen (α=0.5, β=0.5)', 'marker': '^', 'markeredgecolor': 'r'}
+ fig, (ax1, ax2) = pyplot.subplots(figsize=(10, 8), ncols=2, sharex=True, sharey=False)
+
+ for dist, ax in zip([None, weibull], [ax1, ax2]):
+ for opts, postype in zip([c_opts, h_opts,], ['cunnane', 'Hazen']):
+ probscale.probplot(data, ax=ax, dist=dist, probax='y',
+ scatter_kws={**opts, **common_opts},
+ pp_kws={'postype': postype})
+
+ format_axes(ax1, ax2)
+ fig.tight_layout()
+
+
+
+.. image:: closer_look_at_plot_pos_files/output_11_0.png
+
+
+Summary
+~~~~~~~
+
+At the risk of showing a very cluttered and hard to read figure, let's
+throw all three on the same normal probability scale:
+
+.. code:: python
+
+ fig, ax1 = pyplot.subplots(figsize=(6, 8))
+
+ for opts, postype in zip([w_opts, c_opts, h_opts,], ['weibull', 'cunnane', 'hazen']):
+ probscale.probplot(data, ax=ax1, dist=None, probax='y',
+ scatter_kws={**opts, **common_opts},
+ pp_kws={'postype': postype})
+
+ format_axes(ax1, None)
+ fig.tight_layout()
+
+
+
+.. image:: closer_look_at_plot_pos_files/output_13_0.png
+
+
+Again, the different values of α and β don't significantly alter the
+shape of the probability plot near between -- say -- the lower and upper
+quartiles. Beyond the quartiles, however, the difference is more
+obvious.
+
+The cell below computes the plotting positions with the three sets of α
+and β values that we've investigated and prints the first ten value for
+easy comparison.
+
+.. code:: python
+
+ # weibull plotting positions and sorted data
+ w_probs, _ = probscale.plot_pos(data, postype='weibull')
+
+ # normal plotting positions, returned "data" is identical to above
+ c_probs, _ = probscale.plot_pos(data, postype='cunnane')
+
+ # type 4 plot positions
+ h_probs, _ = probscale.plot_pos(data, postype='hazen')
+
+ # convert to percentages
+ w_probs *= 100
+ c_probs *= 100
+ h_probs *= 100
+
+ print('Weibull: ', numpy.round(w_probs[:10], 2))
+ print('Cunnane: ', numpy.round(c_probs[:10], 2))
+ print('Hazen: ', numpy.round(h_probs[:10], 2))
+
+
+.. parsed-literal::
+
+ Weibull: [ 2.63 5.26 7.89 10.53 13.16 15.79 18.42 21.05 23.68 26.32]
+ Cunnane: [ 1.61 4.3 6.99 9.68 12.37 15.05 17.74 20.43 23.12 25.81]
+ Hazen: [ 1.35 4.05 6.76 9.46 12.16 14.86 17.57 20.27 22.97 25.68]
+
diff --git a/mpl-probscale/_sources/tutorial/closer_look_at_viz.txt b/mpl-probscale/_sources/tutorial/closer_look_at_viz.txt
new file mode 100644
index 00000000000..25c88b0f811
--- /dev/null
+++ b/mpl-probscale/_sources/tutorial/closer_look_at_viz.txt
@@ -0,0 +1,604 @@
+
+A closer look at probability plots
+==================================
+
+Overview
+--------
+
+The ``probscale.probplot`` function let's you do a couple of things.
+They are:
+
+1. Creating percentile, quantile, or probability plots.
+2. Placing your probability scale either axis.
+3. Specifying an arbitrary distribution for your probability scale.
+4. Drawing a best-fit line line in linear-probability or log-probability
+ space.
+5. Computing the plotting positions of your data anyway you want.
+6. Using probability axes on seaborn ``FacetGrids``
+
+We'll go over all of these options in this tutorial.
+
+.. code:: python
+
+ %matplotlib inline
+
+.. code:: python
+
+ import warnings
+ warnings.simplefilter('ignore')
+
+ import numpy
+ from matplotlib import pyplot
+ import seaborn
+
+ import probscale
+ clear_bkgd = {'axes.facecolor':'none', 'figure.facecolor':'none'}
+ seaborn.set(style='ticks', context='talk', color_codes=True, rc=clear_bkgd)
+
+ # load up some example data from the seaborn package
+ tips = seaborn.load_dataset("tips")
+ iris = seaborn.load_dataset("iris")
+
+Different plot types
+--------------------
+
+In general, there are three plot types:
+
+1. Percentile, a.k.a. P-P plots
+2. Quantile, a.k.a. Q-Q plots
+3. Probability, a.k.a. Prob Plots
+
+Percentile plots
+~~~~~~~~~~~~~~~~
+
+Percentile plots are the simplest plots. You simply plot the data
+against their plotting positions. The plotting positions are shown on a
+linear scale, but the data can be scaled as appropriate.
+
+If you were doing that from scratch, it would look like this:
+
+.. code:: python
+
+ position, bill = probscale.plot_pos(tips['total_bill'])
+ position *= 100
+ fig, ax = pyplot.subplots(figsize=(6, 3))
+ ax.plot(position, bill, marker='.', linestyle='none', label='Bill amount')
+ ax.set_xlabel('Percentile')
+ ax.set_ylabel('Total Bill (USD)')
+ ax.set_yscale('log')
+ ax.set_ylim(bottom=1, top=100)
+ seaborn.despine()
+
+
+
+.. image:: closer_look_at_viz_files/output_4_0.png
+
+
+Using the ``probplot`` function with ``plottype='pp'``, it becomes:
+
+.. code:: python
+
+ fig, ax = pyplot.subplots(figsize=(6, 3))
+ fig = probscale.probplot(tips['total_bill'], ax=ax, plottype='pp', datascale='log',
+ problabel='Percentile', datalabel='Total Bill (USD)',
+ scatter_kws=dict(marker='.', linestyle='none', label='Bill Amount'))
+ ax.set_ylim(bottom=1, top=100)
+ seaborn.despine()
+
+
+
+.. image:: closer_look_at_viz_files/output_6_0.png
+
+
+Quantile plots
+~~~~~~~~~~~~~~
+
+Quantile plots are similar to propbabilty plots. The main differences is
+that plotting positions are converted into quantiles or :math:`Z`-scores
+based on a probability distribution. The default distribution is the
+standard-normal distribution. Using a different distribution is covered
+further down.
+
+Usings the same dataset as a above let's make a quantile plot. Like
+above, we'll do it from scratch and then using ``probplot``.
+
+.. code:: python
+
+ from scipy import stats
+
+ position, bill = probscale.plot_pos(tips['total_bill'])
+ quantile = stats.norm.ppf(position)
+
+ fig, ax = pyplot.subplots(figsize=(6, 3))
+ ax.plot(quantile, bill, marker='.', linestyle='none', label='Bill amount')
+ ax.set_xlabel('Normal Quantiles')
+ ax.set_ylabel('Total Bill (USD)')
+ ax.set_yscale('log')
+ ax.set_ylim(bottom=1, top=100)
+ seaborn.despine()
+
+
+
+.. image:: closer_look_at_viz_files/output_8_0.png
+
+
+Using ``probplot``:
+
+.. code:: python
+
+ fig, ax = pyplot.subplots(figsize=(6, 3))
+ fig = probscale.probplot(tips['total_bill'], ax=ax, plottype='qq', datascale='log',
+ problabel='Standard Normal Quantiles', datalabel='Total Bill (USD)',
+ scatter_kws=dict(marker='.', linestyle='none', label='Bill Amount'))
+
+ ax.set_ylim(bottom=1, top=100)
+ seaborn.despine()
+
+
+
+.. image:: closer_look_at_viz_files/output_10_0.png
+
+
+You'll notice that the shape of the data is straighter on the Q-Q plot
+than the P-P plot. This is due to the transformation that takes place
+when converting the plotting positions to a distribution's quantiles.
+The plot below hopefully illustrates this more clearly. Additionally,
+we'll show how use the ``probax`` option to flip the plot so that the
+P-P/Q-Q/Probability axis is on the y-scale.
+
+.. code:: python
+
+ fig, (ax1, ax2) = pyplot.subplots(figsize=(6, 6), ncols=2, sharex=True)
+ markers = dict(marker='.', linestyle='none', label='Bill Amount')
+
+ fig = probscale.probplot(tips['total_bill'], ax=ax1, plottype='pp', probax='y',
+ datascale='log', problabel='Percentiles',
+ datalabel='Total Bill (USD)', scatter_kws=markers)
+
+ fig = probscale.probplot(tips['total_bill'], ax=ax2, plottype='qq', probax='y',
+ datascale='log', problabel='Standard Normal Quantiles',
+ datalabel='Total Bill (USD)', scatter_kws=markers)
+
+ ax1.set_xlim(left=1, right=100)
+ fig.tight_layout()
+ seaborn.despine()
+
+
+
+.. image:: closer_look_at_viz_files/output_12_0.png
+
+
+In these case of P-P plots and simple Q-Q plots, the ``probplot``
+function doesn't offer much convencience compared to writing raw
+matplotlib commands. However, this changes when you start making
+probability plots and using more advanced options.
+
+Probability plots
+~~~~~~~~~~~~~~~~~
+
+Visually, the curve of plots on probability and quantile scales should
+be the same. The difference is that the axis ticks are placed and
+labeled based on non-exceedance probailities rather than the more
+abstract quantiles of the distribution.
+
+Unsurprisingly, a picture explains this much better. Let's build off of
+the previos plot:
+
+.. code:: python
+
+ fig, (ax1, ax2, ax3) = pyplot.subplots(figsize=(9, 6), ncols=3, sharex=True)
+ common_opts = dict(
+ probax='y',
+ datascale='log',
+ datalabel='Total Bill (USD)',
+ scatter_kws=dict(marker='.', linestyle='none')
+ )
+
+ fig = probscale.probplot(tips['total_bill'], ax=ax1, plottype='pp',
+ problabel='Percentiles', **common_opts)
+
+ fig = probscale.probplot(tips['total_bill'], ax=ax2, plottype='qq',
+ problabel='Standard Normal Quantiles', **common_opts)
+
+ fig = probscale.probplot(tips['total_bill'], ax=ax3, plottype='prob',
+ problabel='Standard Normal Probabilities', **common_opts)
+
+ ax3.set_xlim(left=1, right=100)
+ ax3.set_ylim(bottom=0.13, top=99.87)
+ fig.tight_layout()
+ seaborn.despine()
+
+
+
+.. image:: closer_look_at_viz_files/output_14_0.png
+
+
+Visually, shapes of the curves on the right-most plots are identical.
+The difference is that the y-axis ticks and labels are more "human"
+readable.
+
+In other words, the probability (right) axis gives us the ease of
+finding e.g. the 75th percentile found on percentile (left) axis, and
+illustrates how well the data fit a given distribution like the quantile
+(middle) axes.
+
+Using different distributions for your scales
+---------------------------------------------
+
+When using quantile or probability scales, you can pass a distribution
+from the ``scipy.stats`` module to the ``probplot`` function. When a
+distribution is not provided to the ``dist`` parameter, a standard
+normal distribution is used.
+
+.. code:: python
+
+ common_opts = dict(
+ plottype='prob',
+ probax='y',
+ datascale='log',
+ datalabel='Total Bill (USD)',
+ scatter_kws=dict(marker='+', linestyle='none', mew=1)
+ )
+
+ alpha = stats.alpha(10)
+ beta = stats.beta(6, 3)
+
+ fig, (ax1, ax2, ax3) = pyplot.subplots(figsize=(9, 6), ncols=3, sharex=True)
+ fig = probscale.probplot(tips['total_bill'], ax=ax1, dist=alpha,
+ problabel='Alpha(10) Probabilities', **common_opts)
+
+ fig = probscale.probplot(tips['total_bill'], ax=ax2, dist=beta,
+ problabel='Beta(6, 1) Probabilities', **common_opts)
+
+ fig = probscale.probplot(tips['total_bill'], ax=ax3, dist=None,
+ problabel='Standard Normal Probabilities', **common_opts)
+
+ ax3.set_xlim(left=1, right=100)
+ for ax in [ax1, ax2, ax3]:
+ ax.set_ylim(bottom=0.2, top=99.8)
+ seaborn.despine()
+ fig.tight_layout()
+
+
+
+.. image:: closer_look_at_viz_files/output_16_0.png
+
+
+This can also be done for QQ scales:
+
+.. code:: python
+
+ common_opts = dict(
+ plottype='qq',
+ probax='y',
+ datascale='log',
+ datalabel='Total Bill (USD)',
+ scatter_kws=dict(marker='+', linestyle='none', mew=1)
+ )
+
+ alpha = stats.alpha(10)
+ beta = stats.beta(6, 3)
+
+ fig, (ax1, ax2, ax3) = pyplot.subplots(figsize=(9, 6), ncols=3, sharex=True)
+ fig = probscale.probplot(tips['total_bill'], ax=ax1, dist=alpha,
+ problabel='Alpha(10) Quantiles', **common_opts)
+
+ fig = probscale.probplot(tips['total_bill'], ax=ax2, dist=beta,
+ problabel='Beta(6, 3) Quantiles', **common_opts)
+
+ fig = probscale.probplot(tips['total_bill'], ax=ax3, dist=None,
+ problabel='Standard Normal Quantiles', **common_opts)
+
+ ax1.set_xlim(left=1, right=100)
+ seaborn.despine()
+ fig.tight_layout()
+
+
+
+.. image:: closer_look_at_viz_files/output_18_0.png
+
+
+Using a specific distribution with a quantile scale can give us an idea
+of how well the data fit that distribution. For instance, let's say we
+have a hunch that the values of the ``total_bill`` column in our dataset
+are normally distributed and their mean and standard deviation are 19.8
+and 8.9, respectively. We could investigate that by create a
+``scipy.stat.norm`` distribution with those parameters and use that
+distribution in the Q-Q plot.
+
+.. code:: python
+
+ def equality_line(ax, label=None):
+ limits = [
+ numpy.min([ax.get_xlim(), ax.get_ylim()]),
+ numpy.max([ax.get_xlim(), ax.get_ylim()]),
+ ]
+ ax.set_xlim(limits)
+ ax.set_ylim(limits)
+ ax.plot(limits, limits, 'k-', alpha=0.75, zorder=0, label=label)
+
+ norm = stats.norm(loc=21, scale=8)
+ fig, ax = pyplot.subplots(figsize=(5, 5))
+ ax.set_aspect('equal')
+
+ common_opts = dict(
+ plottype='qq',
+ probax='x',
+ problabel='Theoretical Quantiles',
+ datalabel='Emperical Quantiles',
+ scatter_kws=dict(label='Bill amounts')
+ )
+
+ fig = probscale.probplot(tips['total_bill'], ax=ax, dist=norm, **common_opts)
+
+ equality_line(ax, label='Guessed Normal Distribution')
+ ax.legend(loc='lower right')
+ seaborn.despine()
+
+
+
+.. image:: closer_look_at_viz_files/output_20_0.png
+
+
+Hmm. That doesn't look too good. Let's use scipy's fitting functionality
+to try out a lognormal distribution.
+
+.. code:: python
+
+ lognorm_params = stats.lognorm.fit(tips['total_bill'], floc=0)
+ lognorm = stats.lognorm(*lognorm_params)
+ fig, ax = pyplot.subplots(figsize=(5, 5))
+ ax.set_aspect('equal')
+
+ fig = probscale.probplot(tips['total_bill'], ax=ax, dist=lognorm, **common_opts)
+
+ equality_line(ax, label='Fit Lognormal Distribution')
+ ax.legend(loc='lower right')
+ seaborn.despine()
+
+
+
+.. image:: closer_look_at_viz_files/output_22_0.png
+
+
+That's a little bit better.
+
+Finding the best distribution is left as an exercise to the reader.
+
+Best-fit lines
+--------------
+
+Adding a best-fit line to a probability plot can provide insight as to
+whether or not a dataset can be characterized by a distribution.
+
+This is simply done with the ``bestfit=True`` option in ``probplot``.
+Behind the scenes, ``probplot`` transforms both the x- and y-data of fed
+to the regression based on the plot type and scale of the data axis
+(controlled via ``datascale``).
+
+Visual attributes of the line can be controled with the ``line_kws``
+parameter. If you want label the best-fit line, that is where you
+specify its label.
+
+Simple examples
+~~~~~~~~~~~~~~~
+
+The most trivial case is a P-P plot with a linear data axis
+
+.. code:: python
+
+ fig, ax = pyplot.subplots(figsize=(6, 3))
+ fig = probscale.probplot(tips['total_bill'], ax=ax, plottype='pp', bestfit=True,
+ problabel='Percentile', datalabel='Total Bill (USD)',
+ scatter_kws=dict(label='Bill Amount'),
+ line_kws=dict(label='Best-fit line'))
+ ax.legend(loc='upper left')
+ seaborn.despine()
+
+
+
+.. image:: closer_look_at_viz_files/output_25_0.png
+
+
+The least trivial case is a probability plot with a log-scaled data
+axes.
+
+As suggested by the section on quantile plots with custom distributions,
+using a normal probability scale with a lognormal data scale provides a
+decent fit (visually speaking).
+
+Note that you still put the probability scale on either the x- or
+y-axis.
+
+.. code:: python
+
+ fig, ax = pyplot.subplots(figsize=(4, 6))
+ fig = probscale.probplot(tips['total_bill'], ax=ax, plottype='prob', probax='y', bestfit=True,
+ datascale='log', problabel='Probabilities', datalabel='Total Bill (USD)',
+ scatter_kws=dict(label='Bill Amount'),
+ line_kws=dict(label='Best-fit line'))
+ ax.legend(loc='upper left')
+ ax.set_ylim(bottom=0.1, top=99.9)
+ ax.set_xlim(left=1, right=100)
+ seaborn.despine()
+
+
+
+.. image:: closer_look_at_viz_files/output_27_0.png
+
+
+Bootstrapped confidence intervals
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Regardless of the scales of the plot (linear, log, or prob), you can add
+bootstrapped confidence intervals around the best-fit line. Simply use
+the ``estimate_ci=True`` option along with ``bestfit=True``:
+
+.. code:: python
+
+ N = 15
+ numpy.random.seed(0)
+ x = numpy.random.normal(size=N) + numpy.random.uniform(size=N)
+ fig, ax = pyplot.subplots(figsize=(8, 4))
+ fig = probscale.probplot(x, ax=ax, bestfit=True, estimate_ci=True,
+ line_kws={'label': 'BF Line', 'color': 'b'},
+ scatter_kws={'label': 'Observations'},
+ problabel='Probability (%)')
+ ax.legend(loc='lower right')
+ ax.set_ylim(bottom=-2, top=4)
+ seaborn.despine(fig)
+
+
+
+.. image:: closer_look_at_viz_files/output_29_0.png
+
+
+Tuning the plotting positions
+-----------------------------
+
+The ``probplot`` function calls the :func:`viz.plot_plos` function to compute each dataset's plotting positions.
+
+You should read that function's docstring for more detailed information.
+But the high-level overview is that there are a couple of parameters (``alpha`` and ``beta``) that you can tweak in the plotting positions calculation.
+
+The most common values can be selected via the ``postype`` parameter.
+
+These are controlled via the `pp_kws` parameter in `probplot`
+and are discussed in much more detail in the `next tutorial `_.
+
+.. code:: python
+
+ common_opts = dict(
+ plottype='prob',
+ probax='x',
+ datalabel='Data',
+ )
+
+ numpy.random.seed(0)
+ x = numpy.random.normal(size=15)
+
+ fig, (ax1, ax2, ax3) = pyplot.subplots(figsize=(6, 6), nrows=3,
+ sharey=True, sharex=True)
+ fig = probscale.probplot(x, ax=ax1, problabel='Cunnuane (default) plotting positions',
+ **common_opts)
+
+ fig = probscale.probplot(x, ax=ax2, problabel='Weibull plotting positions',
+ pp_kws=dict(postype='weibull'), **common_opts)
+
+ fig = probscale.probplot(x, ax=ax3, problabel='Custom plotting positions',
+ pp_kws=dict(alpha=0.6, beta=0.1), **common_opts)
+ ax1.set_xlim(left=1, right=99)
+ seaborn.despine()
+ fig.tight_layout()
+
+
+
+.. image:: closer_look_at_viz_files/output_32_0.png
+
+
+Controlling the aesthetics of the plot elements
+-----------------------------------------------
+
+As it has been hinted in the examples above, the ``probplot`` function
+takes two dictionaries to customize the data series and the best-fit
+line (``scatter_kws`` and ``line_kws``, respectively. These dictionaries
+are passed directly to the ``plot`` method of current axes.
+
+By default, the data series assumes that ``linestyle='none'`` and
+``marker='o'``. These can be overwritten through ``scatter_kws``
+
+Revisting the previous example, we can customize it like so:
+
+.. code:: python
+
+ scatter_options = dict(
+ marker='^',
+ markerfacecolor='none',
+ markeredgecolor='firebrick',
+ markeredgewidth=1.25,
+ linestyle='none',
+ alpha=0.35,
+ zorder=5,
+ label='Meal Cost ($)'
+ )
+
+ line_options = dict(
+ dashes=(10,2,5,2,10,2),
+ color='0.25',
+ linewidth=3,
+ zorder=10,
+ label='Best-fit line'
+ )
+
+ fig, ax = pyplot.subplots(figsize=(4, 6))
+ fig = probscale.probplot(tips['total_bill'], ax=ax, plottype='prob', probax='y', bestfit=True,
+ datascale='log', problabel='Probabilities', datalabel='Total Bill (USD)',
+ scatter_kws=scatter_options, line_kws=line_options)
+ ax.legend(loc='upper left')
+ ax.set_ylim(bottom=0.1, top=99.9)
+ seaborn.despine()
+
+
+
+.. image:: closer_look_at_viz_files/output_34_0.png
+
+
+.. note::
+ The ``probplot`` function can take two additional aesthetic parameters:
+ `color` and `label`. If provided, `color` will override the marker face color
+ and line color options of the `scatter_kws` and `line_kws` parameters, respectively.
+ Similarly, the label of the scatter series will be overridden by the explicit parameter.
+ It is not recommended that `color` and `label` are used. They exist primarily for
+ compatibility with the seaborn package.
+
+Mapping probability plots to seaborn `FacetGrids `__
+-----------------------------------------------------------------------------------------------------------------------------------------------------------
+
+In general, ``probplot`` was written with ``FacetGrids`` in mind. All
+you need to do is specify the data column and other options in the call
+to ``FacetGrid.map``.
+
+Unfortunately the labels don't work out exactly like I want, but it's a
+work in progress.
+
+.. code:: python
+
+ fg = (
+ seaborn.FacetGrid(data=iris, hue='species', aspect=2)
+ .map(probscale.probplot, 'sepal_length')
+ .set_axis_labels(x_var='Probability', y_var='Sepal Length')
+ .add_legend()
+ )
+
+
+
+.. image:: closer_look_at_viz_files/output_37_0.png
+
+
+.. code:: python
+
+ fg = (
+ seaborn.FacetGrid(data=iris, hue='species', aspect=2)
+ .map(probscale.probplot, 'petal_length', plottype='qq', probax='y')
+ .set_ylabels('Quantiles')
+ .add_legend()
+ )
+
+
+
+.. image:: closer_look_at_viz_files/output_38_0.png
+
+
+.. code:: python
+
+ fg = (
+ seaborn.FacetGrid(data=tips, hue='sex', row='smoker', col='time', margin_titles=True, size=4)
+ .map(probscale.probplot, 'total_bill', probax='y', bestfit=True)
+ .set_ylabels('Probability')
+ .add_legend()
+ )
+
+
+
+.. image:: closer_look_at_viz_files/output_39_0.png
+
diff --git a/mpl-probscale/_sources/tutorial/getting_started.txt b/mpl-probscale/_sources/tutorial/getting_started.txt
new file mode 100644
index 00000000000..cc9cda6a3c9
--- /dev/null
+++ b/mpl-probscale/_sources/tutorial/getting_started.txt
@@ -0,0 +1,313 @@
+
+Getting started with ``mpl-probscale``
+======================================
+
+Installation
+------------
+
+``mpl-probscale`` is developed on Python 3.6. It is also tested on
+Python 3.4, 3.5, and even 2.7 (for the time being).
+
+From conda
+~~~~~~~~~~
+
+Official releases of ``mpl-probscale`` can be found on conda-forge:
+
+``conda install --channel=conda-forge mpl-probscale``
+
+Fairly recent builds of the development verions are available on my
+channel:
+
+``conda install --channel=conda-forge mpl-probscale``
+
+From PyPI
+~~~~~~~~~
+
+Official source releases are also available on PyPI
+``pip install probscale``
+
+From source
+~~~~~~~~~~~
+
+``mpl-probscale`` is a pure python package. It should be fairly trivial
+to install from source on any platform. To do that, download or clone
+from `github `__, unzip the
+archive if necessary then do:
+
+::
+
+ cd mpl-probscale # or wherever the setup.py got placed
+ pip install .
+
+I recommend ``pip install .`` over ``python setup.py install`` for
+`reasons I don't fully
+understand `__.
+
+.. code:: python
+
+ %matplotlib inline
+
+.. code:: python
+
+ import warnings
+ warnings.simplefilter('ignore')
+
+ import numpy
+ from matplotlib import pyplot
+ from scipy import stats
+ import seaborn
+
+ clear_bkgd = {'axes.facecolor':'none', 'figure.facecolor':'none'}
+ seaborn.set(style='ticks', context='talk', color_codes=True, rc=clear_bkgd)
+
+Background
+----------
+
+Built-in matplotlib scales
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+To the casual user, you can set matplotlib scales to either "linear" or
+"log" (logarithmic). There are others (e.g., logit, symlog), but I
+haven't seen them too much in the wild.
+
+Linear scales are the default:
+
+.. code:: python
+
+ fig, ax = pyplot.subplots()
+ seaborn.despine(fig=fig)
+
+
+
+.. image:: getting_started_files/output_4_0.png
+
+
+Logarithmic scales can work well when your data cover several orders of
+magnitude and don't have to be in base 10.
+
+.. code:: python
+
+ fig, (ax1, ax2) = pyplot.subplots(nrows=2, figsize=(8,3))
+ ax1.set_xscale('log')
+ ax1.set_xlim(left=1e-3, right=1e3)
+ ax1.set_xlabel("Base 10")
+ ax1.set_yticks([])
+
+ ax2.set_xscale('log', basex=2)
+ ax2.set_xlim(left=2**-3, right=2**3)
+ ax2.set_xlabel("Base 2")
+ ax2.set_yticks([])
+
+ seaborn.despine(fig=fig, left=True)
+
+
+
+.. image:: getting_started_files/output_6_0.png
+
+
+Probabilty Scales
+~~~~~~~~~~~~~~~~~
+
+``mpl-probscale`` lets you use probability scales. All you need to do is
+import it.
+
+Before importing, there is no probability scale available in matplotlib:
+
+.. code:: python
+
+ try:
+ fig, ax = pyplot.subplots()
+ ax.set_xscale('prob')
+ except ValueError as e:
+ pyplot.close(fig)
+ print(e)
+
+
+.. parsed-literal::
+
+ Unknown scale type 'prob'
+
+
+To access probability scales, simply import the ``probscale`` module.
+
+.. code:: python
+
+ import probscale
+ fig, ax = pyplot.subplots(figsize=(8, 3))
+ ax.set_xscale('prob')
+ ax.set_xlim(left=0.5, right=99.5)
+ ax.set_xlabel('Normal probability scale (%)')
+ seaborn.despine(fig=fig)
+
+
+
+.. image:: getting_started_files/output_11_0.png
+
+
+Probability scales default to the standard normal distribution (note
+that the formatting is a percentage-based probability)
+
+You can even use different probability distributions, though it can be
+tricky. You have to pass a frozen distribution from either
+`scipy.stats `__
+or `paramnormal `__ to the
+``dist`` kwarg in ``ax.set_[x|y]scale``.
+
+Here's a standard normal scale with two different beta scales and a
+linear scale for comparison.
+
+.. code:: python
+
+ fig, (ax1, ax2, ax3, ax4) = pyplot.subplots(figsize=(9, 5), nrows=4)
+
+ for ax in [ax1, ax2, ax3, ax4]:
+ ax.set_xlim(left=2, right=98)
+ ax.set_yticks([])
+
+ ax1.set_xscale('prob')
+ ax1.set_xlabel('Normal probability scale, as percents')
+
+ beta1 = stats.beta(a=3, b=2)
+ ax2.set_xscale('prob', dist=beta1)
+ ax2.set_xlabel('Beta probability scale (α=3, β=2)')
+
+ beta2 = stats.beta(a=2, b=7)
+ ax3.set_xscale('prob', dist=beta2)
+ ax3.set_xlabel('Beta probability scale (α=2, β=7)')
+
+ ax4.set_xticks(ax1.get_xticks()[12:-12])
+ ax4.set_xlabel('Linear scale (for reference)')
+
+ seaborn.despine(fig=fig, left=True)
+
+
+
+.. image:: getting_started_files/output_13_0.png
+
+
+Ready-made probability plots
+----------------------------
+
+``mpl-probscale`` ships with a small ``viz`` module that can help you
+make a probability plot of a sample.
+
+With only the sample data, ``probscale.probplot`` will create a figure,
+compute the plotting position and non-exceedance probabilities, and plot
+everything:
+
+.. code:: python
+
+ numpy.random.seed(0)
+ sample = numpy.random.normal(loc=4, scale=2, size=37)
+
+ fig = probscale.probplot(sample)
+ seaborn.despine(fig=fig)
+
+
+
+.. image:: getting_started_files/output_15_0.png
+
+
+You should specify the matplotlib axes on which the plot should occur if
+you want to customize the plot using matplotlib commands directly:
+
+.. code:: python
+
+ fig, ax = pyplot.subplots(figsize=(7, 3))
+
+ probscale.probplot(sample, ax=ax)
+
+ ax.set_ylabel('Normal Values')
+ ax.set_xlabel('Non-exceedance probability')
+ ax.set_xlim(left=1, right=99)
+ seaborn.despine(fig=fig)
+
+
+
+.. image:: getting_started_files/output_17_0.png
+
+
+Lots of other options are directly accessible from the ``probplot``
+function signature.
+
+.. code:: python
+
+ fig, ax = pyplot.subplots(figsize=(3, 7))
+
+ numpy.random.seed(0)
+ new_sample = numpy.random.lognormal(mean=2.0, sigma=0.75, size=37)
+
+ probscale.probplot(
+ new_sample,
+ ax=ax,
+ probax='y', # flip the plot
+ datascale='log', # scale of the non-probability axis
+ bestfit=True, # draw a best-fit line
+ estimate_ci=True,
+ datalabel='Lognormal Values', # labels and markers...
+ problabel='Non-exceedance probability',
+ scatter_kws=dict(marker='d', zorder=2, mew=1.25, mec='w', markersize=10),
+ line_kws=dict(color='0.17', linewidth=2.5, zorder=0, alpha=0.75),
+ )
+
+ ax.set_ylim(bottom=1, top=99)
+ seaborn.despine(fig=fig)
+
+
+
+.. image:: getting_started_files/output_19_0.png
+
+
+Percentile and Quanitile plots
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+For convenience, you can do percetile and quantile plots with the same
+function.
+
+.. note::
+ The percentile and probability axes are plotted against the
+ same values. The difference is only that "percentiles"
+ are plotted on a linear scale.
+
+.. code:: python
+
+ fig, (ax1, ax2, ax3) = pyplot.subplots(nrows=3, figsize=(8, 7))
+
+ probscale.probplot(sample, ax=ax1, plottype='pp', problabel='Percentiles')
+ probscale.probplot(sample, ax=ax2, plottype='qq', problabel='Quantiles')
+ probscale.probplot(sample, ax=ax3, plottype='prob', problabel='Probabilities')
+
+ ax2.set_xlim(left=-2.5, right=2.5)
+ ax3.set_xlim(left=0.5, right=99.5)
+ fig.tight_layout()
+ seaborn.despine(fig=fig)
+
+
+
+.. image:: getting_started_files/output_22_0.png
+
+
+Working with seaborn ``FacetGrids``
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Good news, everyone. The ``probplot`` function generally works as
+expected with
+`FacetGrids `__.
+
+.. code:: python
+
+ plot = (
+ seaborn.load_dataset("tips")
+ .assign(pct=lambda df: 100 * df['tip'] / df['total_bill'])
+ .pipe(seaborn.FacetGrid, hue='sex', col='time', row='smoker', margin_titles=True, aspect=1., size=4)
+ .map(probscale.probplot, 'pct', bestfit=True, scatter_kws=dict(alpha=0.75), probax='y')
+ .add_legend()
+ .set_ylabels('Non-Exceedance Probabilty')
+ .set_xlabels('Tips as percent of total bill')
+ .set(ylim=(0.5, 99.5), xlim=(0, 100))
+ )
+
+
+
+.. image:: getting_started_files/output_24_0.png
+
diff --git a/mpl-probscale/_static/ajax-loader.gif b/mpl-probscale/_static/ajax-loader.gif
new file mode 100644
index 00000000000..61faf8cab23
Binary files /dev/null and b/mpl-probscale/_static/ajax-loader.gif differ
diff --git a/mpl-probscale/_static/basic.css b/mpl-probscale/_static/basic.css
new file mode 100644
index 00000000000..9fa77d886d4
--- /dev/null
+++ b/mpl-probscale/_static/basic.css
@@ -0,0 +1,599 @@
+/*
+ * basic.css
+ * ~~~~~~~~~
+ *
+ * Sphinx stylesheet -- basic theme.
+ *
+ * :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+/* -- main layout ----------------------------------------------------------- */
+
+div.clearer {
+ clear: both;
+}
+
+/* -- relbar ---------------------------------------------------------------- */
+
+div.related {
+ width: 100%;
+ font-size: 90%;
+}
+
+div.related h3 {
+ display: none;
+}
+
+div.related ul {
+ margin: 0;
+ padding: 0 0 0 10px;
+ list-style: none;
+}
+
+div.related li {
+ display: inline;
+}
+
+div.related li.right {
+ float: right;
+ margin-right: 5px;
+}
+
+/* -- sidebar --------------------------------------------------------------- */
+
+div.sphinxsidebarwrapper {
+ padding: 10px 5px 0 10px;
+}
+
+div.sphinxsidebar {
+ float: left;
+ width: 230px;
+ margin-left: -100%;
+ font-size: 90%;
+}
+
+div.sphinxsidebar ul {
+ list-style: none;
+}
+
+div.sphinxsidebar ul ul,
+div.sphinxsidebar ul.want-points {
+ margin-left: 20px;
+ list-style: square;
+}
+
+div.sphinxsidebar ul ul {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+
+div.sphinxsidebar form {
+ margin-top: 10px;
+}
+
+div.sphinxsidebar input {
+ border: 1px solid #98dbcc;
+ font-family: sans-serif;
+ font-size: 1em;
+}
+
+div.sphinxsidebar #searchbox input[type="text"] {
+ width: 170px;
+}
+
+div.sphinxsidebar #searchbox input[type="submit"] {
+ width: 30px;
+}
+
+img {
+ border: 0;
+ max-width: 100%;
+}
+
+/* -- search page ----------------------------------------------------------- */
+
+ul.search {
+ margin: 10px 0 0 20px;
+ padding: 0;
+}
+
+ul.search li {
+ padding: 5px 0 5px 20px;
+ background-image: url(file.png);
+ background-repeat: no-repeat;
+ background-position: 0 7px;
+}
+
+ul.search li a {
+ font-weight: bold;
+}
+
+ul.search li div.context {
+ color: #888;
+ margin: 2px 0 0 30px;
+ text-align: left;
+}
+
+ul.keywordmatches li.goodmatch a {
+ font-weight: bold;
+}
+
+/* -- index page ------------------------------------------------------------ */
+
+table.contentstable {
+ width: 90%;
+}
+
+table.contentstable p.biglink {
+ line-height: 150%;
+}
+
+a.biglink {
+ font-size: 1.3em;
+}
+
+span.linkdescr {
+ font-style: italic;
+ padding-top: 5px;
+ font-size: 90%;
+}
+
+/* -- general index --------------------------------------------------------- */
+
+table.indextable {
+ width: 100%;
+}
+
+table.indextable td {
+ text-align: left;
+ vertical-align: top;
+}
+
+table.indextable dl, table.indextable dd {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+
+table.indextable tr.pcap {
+ height: 10px;
+}
+
+table.indextable tr.cap {
+ margin-top: 10px;
+ background-color: #f2f2f2;
+}
+
+img.toggler {
+ margin-right: 3px;
+ margin-top: 3px;
+ cursor: pointer;
+}
+
+div.modindex-jumpbox {
+ border-top: 1px solid #ddd;
+ border-bottom: 1px solid #ddd;
+ margin: 1em 0 1em 0;
+ padding: 0.4em;
+}
+
+div.genindex-jumpbox {
+ border-top: 1px solid #ddd;
+ border-bottom: 1px solid #ddd;
+ margin: 1em 0 1em 0;
+ padding: 0.4em;
+}
+
+/* -- general body styles --------------------------------------------------- */
+
+a.headerlink {
+ visibility: hidden;
+}
+
+h1:hover > a.headerlink,
+h2:hover > a.headerlink,
+h3:hover > a.headerlink,
+h4:hover > a.headerlink,
+h5:hover > a.headerlink,
+h6:hover > a.headerlink,
+dt:hover > a.headerlink,
+caption:hover > a.headerlink,
+p.caption:hover > a.headerlink,
+div.code-block-caption:hover > a.headerlink {
+ visibility: visible;
+}
+
+div.body p.caption {
+ text-align: inherit;
+}
+
+div.body td {
+ text-align: left;
+}
+
+.field-list ul {
+ padding-left: 1em;
+}
+
+.first {
+ margin-top: 0 !important;
+}
+
+p.rubric {
+ margin-top: 30px;
+ font-weight: bold;
+}
+
+img.align-left, .figure.align-left, object.align-left {
+ clear: left;
+ float: left;
+ margin-right: 1em;
+}
+
+img.align-right, .figure.align-right, object.align-right {
+ clear: right;
+ float: right;
+ margin-left: 1em;
+}
+
+img.align-center, .figure.align-center, object.align-center {
+ display: block;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+.align-left {
+ text-align: left;
+}
+
+.align-center {
+ text-align: center;
+}
+
+.align-right {
+ text-align: right;
+}
+
+/* -- sidebars -------------------------------------------------------------- */
+
+div.sidebar {
+ margin: 0 0 0.5em 1em;
+ border: 1px solid #ddb;
+ padding: 7px 7px 0 7px;
+ background-color: #ffe;
+ width: 40%;
+ float: right;
+}
+
+p.sidebar-title {
+ font-weight: bold;
+}
+
+/* -- topics ---------------------------------------------------------------- */
+
+div.topic {
+ border: 1px solid #ccc;
+ padding: 7px 7px 0 7px;
+ margin: 10px 0 10px 0;
+}
+
+p.topic-title {
+ font-size: 1.1em;
+ font-weight: bold;
+ margin-top: 10px;
+}
+
+/* -- admonitions ----------------------------------------------------------- */
+
+div.admonition {
+ margin-top: 10px;
+ margin-bottom: 10px;
+ padding: 7px;
+}
+
+div.admonition dt {
+ font-weight: bold;
+}
+
+div.admonition dl {
+ margin-bottom: 0;
+}
+
+p.admonition-title {
+ margin: 0px 10px 5px 0px;
+ font-weight: bold;
+}
+
+div.body p.centered {
+ text-align: center;
+ margin-top: 25px;
+}
+
+/* -- tables ---------------------------------------------------------------- */
+
+table.docutils {
+ border: 0;
+ border-collapse: collapse;
+}
+
+table caption span.caption-number {
+ font-style: italic;
+}
+
+table caption span.caption-text {
+}
+
+table.docutils td, table.docutils th {
+ padding: 1px 8px 1px 5px;
+ border-top: 0;
+ border-left: 0;
+ border-right: 0;
+ border-bottom: 1px solid #aaa;
+}
+
+table.field-list td, table.field-list th {
+ border: 0 !important;
+}
+
+table.footnote td, table.footnote th {
+ border: 0 !important;
+}
+
+th {
+ text-align: left;
+ padding-right: 5px;
+}
+
+table.citation {
+ border-left: solid 1px gray;
+ margin-left: 1px;
+}
+
+table.citation td {
+ border-bottom: none;
+}
+
+/* -- figures --------------------------------------------------------------- */
+
+div.figure {
+ margin: 0.5em;
+ padding: 0.5em;
+}
+
+div.figure p.caption {
+ padding: 0.3em;
+}
+
+div.figure p.caption span.caption-number {
+ font-style: italic;
+}
+
+div.figure p.caption span.caption-text {
+}
+
+
+/* -- other body styles ----------------------------------------------------- */
+
+ol.arabic {
+ list-style: decimal;
+}
+
+ol.loweralpha {
+ list-style: lower-alpha;
+}
+
+ol.upperalpha {
+ list-style: upper-alpha;
+}
+
+ol.lowerroman {
+ list-style: lower-roman;
+}
+
+ol.upperroman {
+ list-style: upper-roman;
+}
+
+dl {
+ margin-bottom: 15px;
+}
+
+dd p {
+ margin-top: 0px;
+}
+
+dd ul, dd table {
+ margin-bottom: 10px;
+}
+
+dd {
+ margin-top: 3px;
+ margin-bottom: 10px;
+ margin-left: 30px;
+}
+
+dt:target, .highlighted {
+ background-color: #fbe54e;
+}
+
+dl.glossary dt {
+ font-weight: bold;
+ font-size: 1.1em;
+}
+
+.field-list ul {
+ margin: 0;
+ padding-left: 1em;
+}
+
+.field-list p {
+ margin: 0;
+}
+
+.optional {
+ font-size: 1.3em;
+}
+
+.sig-paren {
+ font-size: larger;
+}
+
+.versionmodified {
+ font-style: italic;
+}
+
+.system-message {
+ background-color: #fda;
+ padding: 5px;
+ border: 3px solid red;
+}
+
+.footnote:target {
+ background-color: #ffa;
+}
+
+.line-block {
+ display: block;
+ margin-top: 1em;
+ margin-bottom: 1em;
+}
+
+.line-block .line-block {
+ margin-top: 0;
+ margin-bottom: 0;
+ margin-left: 1.5em;
+}
+
+.guilabel, .menuselection {
+ font-family: sans-serif;
+}
+
+.accelerator {
+ text-decoration: underline;
+}
+
+.classifier {
+ font-style: oblique;
+}
+
+abbr, acronym {
+ border-bottom: dotted 1px;
+ cursor: help;
+}
+
+/* -- code displays --------------------------------------------------------- */
+
+pre {
+ overflow: auto;
+ overflow-y: hidden; /* fixes display issues on Chrome browsers */
+}
+
+td.linenos pre {
+ padding: 5px 0px;
+ border: 0;
+ background-color: transparent;
+ color: #aaa;
+}
+
+table.highlighttable {
+ margin-left: 0.5em;
+}
+
+table.highlighttable td {
+ padding: 0 0.5em 0 0.5em;
+}
+
+div.code-block-caption {
+ padding: 2px 5px;
+ font-size: small;
+}
+
+div.code-block-caption code {
+ background-color: transparent;
+}
+
+div.code-block-caption + div > div.highlight > pre {
+ margin-top: 0;
+}
+
+div.code-block-caption span.caption-number {
+ padding: 0.1em 0.3em;
+ font-style: italic;
+}
+
+div.code-block-caption span.caption-text {
+}
+
+div.literal-block-wrapper {
+ padding: 1em 1em 0;
+}
+
+div.literal-block-wrapper div.highlight {
+ margin: 0;
+}
+
+code.descname {
+ background-color: transparent;
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+code.descclassname {
+ background-color: transparent;
+}
+
+code.xref, a code {
+ background-color: transparent;
+ font-weight: bold;
+}
+
+h1 code, h2 code, h3 code, h4 code, h5 code, h6 code {
+ background-color: transparent;
+}
+
+.viewcode-link {
+ float: right;
+}
+
+.viewcode-back {
+ float: right;
+ font-family: sans-serif;
+}
+
+div.viewcode-block:target {
+ margin: -1px -10px;
+ padding: 0 10px;
+}
+
+/* -- math display ---------------------------------------------------------- */
+
+img.math {
+ vertical-align: middle;
+}
+
+div.body div.math p {
+ text-align: center;
+}
+
+span.eqno {
+ float: right;
+}
+
+/* -- printout stylesheet --------------------------------------------------- */
+
+@media print {
+ div.document,
+ div.documentwrapper,
+ div.bodywrapper {
+ margin: 0 !important;
+ width: 100%;
+ }
+
+ div.sphinxsidebar,
+ div.related,
+ div.footer,
+ #top-link {
+ display: none;
+ }
+}
\ No newline at end of file
diff --git a/mpl-probscale/_static/comment-bright.png b/mpl-probscale/_static/comment-bright.png
new file mode 100644
index 00000000000..551517b8c83
Binary files /dev/null and b/mpl-probscale/_static/comment-bright.png differ
diff --git a/mpl-probscale/_static/comment-close.png b/mpl-probscale/_static/comment-close.png
new file mode 100644
index 00000000000..09b54be46da
Binary files /dev/null and b/mpl-probscale/_static/comment-close.png differ
diff --git a/mpl-probscale/_static/comment.png b/mpl-probscale/_static/comment.png
new file mode 100644
index 00000000000..92feb52b882
Binary files /dev/null and b/mpl-probscale/_static/comment.png differ
diff --git a/mpl-probscale/_static/css/badge_only.css b/mpl-probscale/_static/css/badge_only.css
new file mode 100644
index 00000000000..7e17fb148c6
--- /dev/null
+++ b/mpl-probscale/_static/css/badge_only.css
@@ -0,0 +1,2 @@
+.fa:before{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-weight:normal;font-style:normal;src:url("../font/fontawesome_webfont.eot");src:url("../font/fontawesome_webfont.eot?#iefix") format("embedded-opentype"),url("../font/fontawesome_webfont.woff") format("woff"),url("../font/fontawesome_webfont.ttf") format("truetype"),url("../font/fontawesome_webfont.svg#FontAwesome") format("svg")}.fa:before{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;text-decoration:inherit}a .fa{display:inline-block;text-decoration:inherit}li .fa{display:inline-block}li .fa-large:before,li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-0.8em}ul.fas li .fa{width:0.8em}ul.fas li .fa-large:before,ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before{content:""}.icon-book:before{content:""}.fa-caret-down:before{content:""}.icon-caret-down:before{content:""}.fa-caret-up:before{content:""}.icon-caret-up:before{content:""}.fa-caret-left:before{content:""}.icon-caret-left:before{content:""}.fa-caret-right:before{content:""}.icon-caret-right:before{content:""}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;border-top:solid 10px #343131;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;z-index:400}.rst-versions a{color:#2980B9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27AE60;*zoom:1}.rst-versions .rst-current-version:before,.rst-versions .rst-current-version:after{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book{float:left}.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#E74C3C;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#F1C40F;color:#000}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:gray;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:solid 1px #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px}.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge .fa-book{float:none}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book{float:left}.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge .rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width: 768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}img{width:100%;height:auto}}
+/*# sourceMappingURL=badge_only.css.map */
diff --git a/mpl-probscale/_static/css/theme.css b/mpl-probscale/_static/css/theme.css
new file mode 100644
index 00000000000..7be93399a4f
--- /dev/null
+++ b/mpl-probscale/_static/css/theme.css
@@ -0,0 +1,5 @@
+*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}[hidden]{display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:hover,a:active{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;color:#000;text-decoration:none}mark{background:#ff0;color:#000;font-style:italic;font-weight:bold}pre,code,.rst-content tt,.rst-content code,kbd,samp{font-family:monospace,serif;_font-family:"courier new",monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:before,q:after{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}ul,ol,dl{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure{margin:0}form{margin:0}fieldset{border:0;margin:0;padding:0}label{cursor:pointer}legend{border:0;*margin-left:-7px;padding:0;white-space:normal}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0;*width:13px;*height:13px}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top;resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:0.2em 0;background:#ccc;color:#000;padding:0.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none !important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{html,body,section{background:none !important}*{box-shadow:none !important;text-shadow:none !important;filter:none !important;-ms-filter:none !important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,.rst-content .toctree-wrapper p.caption,h3{orphans:3;widows:3}h2,.rst-content .toctree-wrapper p.caption,h3{page-break-after:avoid}}.fa:before,.wy-menu-vertical li span.toctree-expand:before,.wy-menu-vertical li.on a span.toctree-expand:before,.wy-menu-vertical li.current>a span.toctree-expand:before,.rst-content .admonition-title:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content dl dt .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content tt.download span:first-child:before,.rst-content code.download span:first-child:before,.icon:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-alert,.rst-content .note,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .warning,.rst-content .seealso,.rst-content .admonition-todo,.btn,input[type="text"],input[type="password"],input[type="email"],input[type="url"],input[type="date"],input[type="month"],input[type="time"],input[type="datetime"],input[type="datetime-local"],input[type="week"],input[type="number"],input[type="search"],input[type="tel"],input[type="color"],select,textarea,.wy-menu-vertical li.on a,.wy-menu-vertical li.current>a,.wy-side-nav-search>a,.wy-side-nav-search .wy-dropdown>a,.wy-nav-top a{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:""}.clearfix:after{clear:both}/*!
+ * Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome
+ * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
+ */@font-face{font-family:'FontAwesome';src:url("../fonts/fontawesome-webfont.eot?v=4.2.0");src:url("../fonts/fontawesome-webfont.eot?#iefix&v=4.2.0") format("embedded-opentype"),url("../fonts/fontawesome-webfont.woff?v=4.2.0") format("woff"),url("../fonts/fontawesome-webfont.ttf?v=4.2.0") format("truetype"),url("../fonts/fontawesome-webfont.svg?v=4.2.0#fontawesomeregular") format("svg");font-weight:normal;font-style:normal}.fa,.wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.current>a span.toctree-expand,.rst-content .admonition-title,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink,.rst-content p.caption .headerlink,.rst-content tt.download span:first-child,.rst-content code.download span:first-child,.icon{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:0.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:0.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:solid 0.08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.wy-menu-vertical li span.pull-left.toctree-expand,.wy-menu-vertical li.on a span.pull-left.toctree-expand,.wy-menu-vertical li.current>a span.pull-left.toctree-expand,.rst-content .pull-left.admonition-title,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content dl dt .pull-left.headerlink,.rst-content p.caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.rst-content code.download span.pull-left:first-child,.pull-left.icon{margin-right:.3em}.fa.pull-right,.wy-menu-vertical li span.pull-right.toctree-expand,.wy-menu-vertical li.on a span.pull-right.toctree-expand,.wy-menu-vertical li.current>a span.pull-right.toctree-expand,.rst-content .pull-right.admonition-title,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content dl dt .pull-right.headerlink,.rst-content p.caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.rst-content code.download span.pull-right:first-child,.pull-right.icon{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-remove:before,.fa-close:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-gear:before,.fa-cog:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content tt.download span:first-child:before,.rst-content code.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-rotate-right:before,.fa-repeat:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.rst-content .admonition-title:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-warning:before,.fa-exclamation-triangle:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-gears:before,.fa-cogs:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-save:before,.fa-floppy-o:before{content:""}.fa-square:before{content:""}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.wy-dropdown .caret:before,.icon-caret-down:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-unsorted:before,.fa-sort:before{content:""}.fa-sort-down:before,.fa-sort-desc:before{content:""}.fa-sort-up:before,.fa-sort-asc:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-legal:before,.fa-gavel:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-flash:before,.fa-bolt:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-paste:before,.fa-clipboard:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-unlink:before,.fa-chain-broken:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.on a span.toctree-expand:before,.wy-menu-vertical li.current>a span.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:""}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:""}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:""}.fa-euro:before,.fa-eur:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-rupee:before,.fa-inr:before{content:""}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:""}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:""}.fa-won:before,.fa-krw:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-turkish-lira:before,.fa-try:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li span.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-institution:before,.fa-bank:before,.fa-university:before{content:""}.fa-mortar-board:before,.fa-graduation-cap:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:""}.fa-file-zip-o:before,.fa-file-archive-o:before{content:""}.fa-file-sound-o:before,.fa-file-audio-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before{content:""}.fa-ge:before,.fa-empire:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-send:before,.fa-paper-plane:before{content:""}.fa-send-o:before,.fa-paper-plane-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:""}.fa-meanpath:before{content:""}.fa,.wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.current>a span.toctree-expand,.rst-content .admonition-title,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink,.rst-content p.caption .headerlink,.rst-content tt.download span:first-child,.rst-content code.download span:first-child,.icon,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context{font-family:inherit}.fa:before,.wy-menu-vertical li span.toctree-expand:before,.wy-menu-vertical li.on a span.toctree-expand:before,.wy-menu-vertical li.current>a span.toctree-expand:before,.rst-content .admonition-title:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content dl dt .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content tt.download span:first-child:before,.rst-content code.download span:first-child:before,.icon:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before{font-family:"FontAwesome";display:inline-block;font-style:normal;font-weight:normal;line-height:1;text-decoration:inherit}a .fa,a .wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li a span.toctree-expand,.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.current>a span.toctree-expand,a .rst-content .admonition-title,.rst-content a .admonition-title,a .rst-content h1 .headerlink,.rst-content h1 a .headerlink,a .rst-content h2 .headerlink,.rst-content h2 a .headerlink,a .rst-content h3 .headerlink,.rst-content h3 a .headerlink,a .rst-content h4 .headerlink,.rst-content h4 a .headerlink,a .rst-content h5 .headerlink,.rst-content h5 a .headerlink,a .rst-content h6 .headerlink,.rst-content h6 a .headerlink,a .rst-content dl dt .headerlink,.rst-content dl dt a .headerlink,a .rst-content p.caption .headerlink,.rst-content p.caption a .headerlink,a .rst-content tt.download span:first-child,.rst-content tt.download a span:first-child,a .rst-content code.download span:first-child,.rst-content code.download a span:first-child,a .icon{display:inline-block;text-decoration:inherit}.btn .fa,.btn .wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li .btn span.toctree-expand,.btn .wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.on a .btn span.toctree-expand,.btn .wy-menu-vertical li.current>a span.toctree-expand,.wy-menu-vertical li.current>a .btn span.toctree-expand,.btn .rst-content .admonition-title,.rst-content .btn .admonition-title,.btn .rst-content h1 .headerlink,.rst-content h1 .btn .headerlink,.btn .rst-content h2 .headerlink,.rst-content h2 .btn .headerlink,.btn .rst-content h3 .headerlink,.rst-content h3 .btn .headerlink,.btn .rst-content h4 .headerlink,.rst-content h4 .btn .headerlink,.btn .rst-content h5 .headerlink,.rst-content h5 .btn .headerlink,.btn .rst-content h6 .headerlink,.rst-content h6 .btn .headerlink,.btn .rst-content dl dt .headerlink,.rst-content dl dt .btn .headerlink,.btn .rst-content p.caption .headerlink,.rst-content p.caption .btn .headerlink,.btn .rst-content tt.download span:first-child,.rst-content tt.download .btn span:first-child,.btn .rst-content code.download span:first-child,.rst-content code.download .btn span:first-child,.btn .icon,.nav .fa,.nav .wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li .nav span.toctree-expand,.nav .wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.on a .nav span.toctree-expand,.nav .wy-menu-vertical li.current>a span.toctree-expand,.wy-menu-vertical li.current>a .nav span.toctree-expand,.nav .rst-content .admonition-title,.rst-content .nav .admonition-title,.nav .rst-content h1 .headerlink,.rst-content h1 .nav .headerlink,.nav .rst-content h2 .headerlink,.rst-content h2 .nav .headerlink,.nav .rst-content h3 .headerlink,.rst-content h3 .nav .headerlink,.nav .rst-content h4 .headerlink,.rst-content h4 .nav .headerlink,.nav .rst-content h5 .headerlink,.rst-content h5 .nav .headerlink,.nav .rst-content h6 .headerlink,.rst-content h6 .nav .headerlink,.nav .rst-content dl dt .headerlink,.rst-content dl dt .nav .headerlink,.nav .rst-content p.caption .headerlink,.rst-content p.caption .nav .headerlink,.nav .rst-content tt.download span:first-child,.rst-content tt.download .nav span:first-child,.nav .rst-content code.download span:first-child,.rst-content code.download .nav span:first-child,.nav .icon{display:inline}.btn .fa.fa-large,.btn .wy-menu-vertical li span.fa-large.toctree-expand,.wy-menu-vertical li .btn span.fa-large.toctree-expand,.btn .rst-content .fa-large.admonition-title,.rst-content .btn .fa-large.admonition-title,.btn .rst-content h1 .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.btn .rst-content dl dt .fa-large.headerlink,.rst-content dl dt .btn .fa-large.headerlink,.btn .rst-content p.caption .fa-large.headerlink,.rst-content p.caption .btn .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.rst-content tt.download .btn span.fa-large:first-child,.btn .rst-content code.download span.fa-large:first-child,.rst-content code.download .btn span.fa-large:first-child,.btn .fa-large.icon,.nav .fa.fa-large,.nav .wy-menu-vertical li span.fa-large.toctree-expand,.wy-menu-vertical li .nav span.fa-large.toctree-expand,.nav .rst-content .fa-large.admonition-title,.rst-content .nav .fa-large.admonition-title,.nav .rst-content h1 .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.nav .rst-content dl dt .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.nav .rst-content p.caption .fa-large.headerlink,.rst-content p.caption .nav .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.nav .rst-content code.download span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.nav .fa-large.icon{line-height:0.9em}.btn .fa.fa-spin,.btn .wy-menu-vertical li span.fa-spin.toctree-expand,.wy-menu-vertical li .btn span.fa-spin.toctree-expand,.btn .rst-content .fa-spin.admonition-title,.rst-content .btn .fa-spin.admonition-title,.btn .rst-content h1 .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.btn .rst-content dl dt .fa-spin.headerlink,.rst-content dl dt .btn .fa-spin.headerlink,.btn .rst-content p.caption .fa-spin.headerlink,.rst-content p.caption .btn .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.rst-content tt.download .btn span.fa-spin:first-child,.btn .rst-content code.download span.fa-spin:first-child,.rst-content code.download .btn span.fa-spin:first-child,.btn .fa-spin.icon,.nav .fa.fa-spin,.nav .wy-menu-vertical li span.fa-spin.toctree-expand,.wy-menu-vertical li .nav span.fa-spin.toctree-expand,.nav .rst-content .fa-spin.admonition-title,.rst-content .nav .fa-spin.admonition-title,.nav .rst-content h1 .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.nav .rst-content dl dt .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.nav .rst-content p.caption .fa-spin.headerlink,.rst-content p.caption .nav .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.nav .rst-content code.download span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.nav .fa-spin.icon{display:inline-block}.btn.fa:before,.wy-menu-vertical li span.btn.toctree-expand:before,.rst-content .btn.admonition-title:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content dl dt .btn.headerlink:before,.rst-content p.caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.rst-content code.download span.btn:first-child:before,.btn.icon:before{opacity:0.5;-webkit-transition:opacity 0.05s ease-in;-moz-transition:opacity 0.05s ease-in;transition:opacity 0.05s ease-in}.btn.fa:hover:before,.wy-menu-vertical li span.btn.toctree-expand:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content p.caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.rst-content code.download span.btn:first-child:hover:before,.btn.icon:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .wy-menu-vertical li span.toctree-expand:before,.wy-menu-vertical li .btn-mini span.toctree-expand:before,.btn-mini .rst-content .admonition-title:before,.rst-content .btn-mini .admonition-title:before,.btn-mini .rst-content h1 .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.btn-mini .rst-content dl dt .headerlink:before,.rst-content dl dt .btn-mini .headerlink:before,.btn-mini .rst-content p.caption .headerlink:before,.rst-content p.caption .btn-mini .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.rst-content tt.download .btn-mini span:first-child:before,.btn-mini .rst-content code.download span:first-child:before,.rst-content code.download .btn-mini span:first-child:before,.btn-mini .icon:before{font-size:14px;vertical-align:-15%}.wy-alert,.rst-content .note,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .warning,.rst-content .seealso,.rst-content .admonition-todo{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.wy-alert-title,.rst-content .admonition-title{color:#fff;font-weight:bold;display:block;color:#fff;background:#6ab0de;margin:-12px;padding:6px 12px;margin-bottom:12px}.wy-alert.wy-alert-danger,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.admonition-todo{background:#fdf3f2}.wy-alert.wy-alert-danger .wy-alert-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .danger .wy-alert-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .danger .admonition-title,.rst-content .error .admonition-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title{background:#f29f97}.wy-alert.wy-alert-warning,.rst-content .wy-alert-warning.note,.rst-content .attention,.rst-content .caution,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.tip,.rst-content .warning,.rst-content .wy-alert-warning.seealso,.rst-content .admonition-todo{background:#ffedcc}.wy-alert.wy-alert-warning .wy-alert-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .attention .wy-alert-title,.rst-content .caution .wy-alert-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .admonition-todo .wy-alert-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .attention .admonition-title,.rst-content .caution .admonition-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .warning .admonition-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .admonition-todo .admonition-title{background:#f0b37e}.wy-alert.wy-alert-info,.rst-content .note,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.rst-content .seealso,.rst-content .wy-alert-info.admonition-todo{background:#e7f2fa}.wy-alert.wy-alert-info .wy-alert-title,.rst-content .note .wy-alert-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.rst-content .note .admonition-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .seealso .admonition-title,.rst-content .wy-alert-info.admonition-todo .admonition-title{background:#6ab0de}.wy-alert.wy-alert-success,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.warning,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.admonition-todo{background:#dbfaf4}.wy-alert.wy-alert-success .wy-alert-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .hint .wy-alert-title,.rst-content .important .wy-alert-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .hint .admonition-title,.rst-content .important .admonition-title,.rst-content .tip .admonition-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.admonition-todo .admonition-title{background:#1abc9c}.wy-alert.wy-alert-neutral,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.admonition-todo{background:#f3f6f6}.wy-alert.wy-alert-neutral .wy-alert-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .admonition-title{color:#404040;background:#e1e4e5}.wy-alert.wy-alert-neutral a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.admonition-todo a{color:#2980B9}.wy-alert p:last-child,.rst-content .note p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.rst-content .seealso p:last-child,.rst-content .admonition-todo p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0px;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,0.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all 0.3s ease-in;-moz-transition:all 0.3s ease-in;transition:all 0.3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27AE60}.wy-tray-container li.wy-tray-item-info{background:#2980B9}.wy-tray-container li.wy-tray-item-warning{background:#E67E22}.wy-tray-container li.wy-tray-item-danger{background:#E74C3C}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width: 768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px 12px;color:#fff;border:1px solid rgba(0,0,0,0.1);background-color:#27AE60;text-decoration:none;font-weight:normal;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;box-shadow:0px 1px 2px -1px rgba(255,255,255,0.5) inset,0px -2px 0px 0px rgba(0,0,0,0.1) inset;outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all 0.1s linear;-moz-transition:all 0.1s linear;transition:all 0.1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:0px -1px 0px 0px rgba(0,0,0,0.05) inset,0px 2px 0px 0px rgba(0,0,0,0.1) inset;padding:8px 12px 6px 12px}.btn:visited{color:#fff}.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:0.4;cursor:not-allowed;box-shadow:none}.btn-disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:0.4;cursor:not-allowed;box-shadow:none}.btn-disabled:hover,.btn-disabled:focus,.btn-disabled:active{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:0.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980B9 !important}.btn-info:hover{background-color:#2e8ece !important}.btn-neutral{background-color:#f3f6f6 !important;color:#404040 !important}.btn-neutral:hover{background-color:#e5ebeb !important;color:#404040}.btn-neutral:visited{color:#404040 !important}.btn-success{background-color:#27AE60 !important}.btn-success:hover{background-color:#295 !important}.btn-danger{background-color:#E74C3C !important}.btn-danger:hover{background-color:#ea6153 !important}.btn-warning{background-color:#E67E22 !important}.btn-warning:hover{background-color:#e98b39 !important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f !important}.btn-link{background-color:transparent !important;color:#2980B9;box-shadow:none;border-color:transparent !important}.btn-link:hover{background-color:transparent !important;color:#409ad5 !important;box-shadow:none}.btn-link:active{background-color:transparent !important;color:#409ad5 !important;box-shadow:none}.btn-link:visited{color:#9B59B6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:before,.wy-btn-group:after{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:solid 1px #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,0.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980B9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:solid 1px #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type="search"]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980B9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned input,.wy-form-aligned textarea,.wy-form-aligned select,.wy-form-aligned .wy-help-inline,.wy-form-aligned label{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{border:0;margin:0;padding:0}legend{display:block;width:100%;border:0;padding:0;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label{display:block;margin:0 0 0.3125em 0;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;*zoom:1;max-width:68em;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:before,.wy-control-group:after{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group:before,.wy-control-group:after{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#E74C3C}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full input[type="text"],.wy-control-group .wy-form-full input[type="password"],.wy-control-group .wy-form-full input[type="email"],.wy-control-group .wy-form-full input[type="url"],.wy-control-group .wy-form-full input[type="date"],.wy-control-group .wy-form-full input[type="month"],.wy-control-group .wy-form-full input[type="time"],.wy-control-group .wy-form-full input[type="datetime"],.wy-control-group .wy-form-full input[type="datetime-local"],.wy-control-group .wy-form-full input[type="week"],.wy-control-group .wy-form-full input[type="number"],.wy-control-group .wy-form-full input[type="search"],.wy-control-group .wy-form-full input[type="tel"],.wy-control-group .wy-form-full input[type="color"],.wy-control-group .wy-form-halves input[type="text"],.wy-control-group .wy-form-halves input[type="password"],.wy-control-group .wy-form-halves input[type="email"],.wy-control-group .wy-form-halves input[type="url"],.wy-control-group .wy-form-halves input[type="date"],.wy-control-group .wy-form-halves input[type="month"],.wy-control-group .wy-form-halves input[type="time"],.wy-control-group .wy-form-halves input[type="datetime"],.wy-control-group .wy-form-halves input[type="datetime-local"],.wy-control-group .wy-form-halves input[type="week"],.wy-control-group .wy-form-halves input[type="number"],.wy-control-group .wy-form-halves input[type="search"],.wy-control-group .wy-form-halves input[type="tel"],.wy-control-group .wy-form-halves input[type="color"],.wy-control-group .wy-form-thirds input[type="text"],.wy-control-group .wy-form-thirds input[type="password"],.wy-control-group .wy-form-thirds input[type="email"],.wy-control-group .wy-form-thirds input[type="url"],.wy-control-group .wy-form-thirds input[type="date"],.wy-control-group .wy-form-thirds input[type="month"],.wy-control-group .wy-form-thirds input[type="time"],.wy-control-group .wy-form-thirds input[type="datetime"],.wy-control-group .wy-form-thirds input[type="datetime-local"],.wy-control-group .wy-form-thirds input[type="week"],.wy-control-group .wy-form-thirds input[type="number"],.wy-control-group .wy-form-thirds input[type="search"],.wy-control-group .wy-form-thirds input[type="tel"],.wy-control-group .wy-form-thirds input[type="color"]{width:100%}.wy-control-group .wy-form-full{float:left;display:block;margin-right:2.35765%;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child{margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(2n+1){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child{margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control{margin:6px 0 0 0;font-size:90%}.wy-control-no-input{display:inline-block;margin:6px 0 0 0;font-size:90%}.wy-control-group.fluid-input input[type="text"],.wy-control-group.fluid-input input[type="password"],.wy-control-group.fluid-input input[type="email"],.wy-control-group.fluid-input input[type="url"],.wy-control-group.fluid-input input[type="date"],.wy-control-group.fluid-input input[type="month"],.wy-control-group.fluid-input input[type="time"],.wy-control-group.fluid-input input[type="datetime"],.wy-control-group.fluid-input input[type="datetime-local"],.wy-control-group.fluid-input input[type="week"],.wy-control-group.fluid-input input[type="number"],.wy-control-group.fluid-input input[type="search"],.wy-control-group.fluid-input input[type="tel"],.wy-control-group.fluid-input input[type="color"]{width:100%}.wy-form-message-inline{display:inline-block;padding-left:0.3em;color:#666;vertical-align:middle;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:0.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;*overflow:visible}input[type="text"],input[type="password"],input[type="email"],input[type="url"],input[type="date"],input[type="month"],input[type="time"],input[type="datetime"],input[type="datetime-local"],input[type="week"],input[type="number"],input[type="search"],input[type="tel"],input[type="color"]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border 0.3s linear;-moz-transition:border 0.3s linear;transition:border 0.3s linear}input[type="datetime-local"]{padding:0.34375em 0.625em}input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0;margin-right:0.3125em;*height:13px;*width:13px}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}input[type="text"]:focus,input[type="password"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus{outline:0;outline:thin dotted \9;border-color:#333}input.no-focus:focus{border-color:#ccc !important}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:1px auto #129FEA}input[type="text"][disabled],input[type="password"][disabled],input[type="email"][disabled],input[type="url"][disabled],input[type="date"][disabled],input[type="month"][disabled],input[type="time"][disabled],input[type="datetime"][disabled],input[type="datetime-local"][disabled],input[type="week"][disabled],input[type="number"][disabled],input[type="search"][disabled],input[type="tel"][disabled],input[type="color"][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#E74C3C;border:1px solid #E74C3C}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#E74C3C}input[type="file"]:focus:invalid:focus,input[type="radio"]:focus:invalid:focus,input[type="checkbox"]:focus:invalid:focus{outline-color:#E74C3C}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif}select,textarea{padding:0.5em 0.625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border 0.3s linear;-moz-transition:border 0.3s linear;transition:border 0.3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type="radio"][disabled],input[type="checkbox"][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:solid 1px #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{width:36px;height:12px;margin:12px 0;position:relative;border-radius:4px;background:#ccc;cursor:pointer;-webkit-transition:all 0.2s ease-in-out;-moz-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out}.wy-switch:before{position:absolute;content:"";display:block;width:18px;height:18px;border-radius:4px;background:#999;left:-3px;top:-3px;-webkit-transition:all 0.2s ease-in-out;-moz-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out}.wy-switch:after{content:"false";position:absolute;left:48px;display:block;font-size:12px;color:#ccc}.wy-switch.active{background:#1e8449}.wy-switch.active:before{left:24px;background:#27AE60}.wy-switch.active:after{content:"true"}.wy-switch.disabled,.wy-switch.active.disabled{cursor:not-allowed}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#E74C3C}.wy-control-group.wy-control-group-error input[type="text"],.wy-control-group.wy-control-group-error input[type="password"],.wy-control-group.wy-control-group-error input[type="email"],.wy-control-group.wy-control-group-error input[type="url"],.wy-control-group.wy-control-group-error input[type="date"],.wy-control-group.wy-control-group-error input[type="month"],.wy-control-group.wy-control-group-error input[type="time"],.wy-control-group.wy-control-group-error input[type="datetime"],.wy-control-group.wy-control-group-error input[type="datetime-local"],.wy-control-group.wy-control-group-error input[type="week"],.wy-control-group.wy-control-group-error input[type="number"],.wy-control-group.wy-control-group-error input[type="search"],.wy-control-group.wy-control-group-error input[type="tel"],.wy-control-group.wy-control-group-error input[type="color"]{border:solid 1px #E74C3C}.wy-control-group.wy-control-group-error textarea{border:solid 1px #E74C3C}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:0.5em 0.625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27AE60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#E74C3C}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#E67E22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980B9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width: 480px){.wy-form button[type="submit"]{margin:0.7em 0 0}.wy-form input[type="text"],.wy-form input[type="password"],.wy-form input[type="email"],.wy-form input[type="url"],.wy-form input[type="date"],.wy-form input[type="month"],.wy-form input[type="time"],.wy-form input[type="datetime"],.wy-form input[type="datetime-local"],.wy-form input[type="week"],.wy-form input[type="number"],.wy-form input[type="search"],.wy-form input[type="tel"],.wy-form input[type="color"]{margin-bottom:0.3em;display:block}.wy-form label{margin-bottom:0.3em;display:block}.wy-form input[type="password"],.wy-form input[type="email"],.wy-form input[type="url"],.wy-form input[type="date"],.wy-form input[type="month"],.wy-form input[type="time"],.wy-form input[type="datetime"],.wy-form input[type="datetime-local"],.wy-form input[type="week"],.wy-form input[type="number"],.wy-form input[type="search"],.wy-form input[type="tel"],.wy-form input[type="color"]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:0.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0 0}.wy-form .wy-help-inline,.wy-form-message-inline,.wy-form-message{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width: 768px){.tablet-hide{display:none}}@media screen and (max-width: 480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.wy-table,.rst-content table.docutils,.rst-content table.field-list{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.wy-table caption,.rst-content table.docutils caption,.rst-content table.field-list caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.wy-table td,.rst-content table.docutils td,.rst-content table.field-list td,.wy-table th,.rst-content table.docutils th,.rst-content table.field-list th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.wy-table td:first-child,.rst-content table.docutils td:first-child,.rst-content table.field-list td:first-child,.wy-table th:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list th:first-child{border-left-width:0}.wy-table thead,.rst-content table.docutils thead,.rst-content table.field-list thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.wy-table thead th,.rst-content table.docutils thead th,.rst-content table.field-list thead th{font-weight:bold;border-bottom:solid 2px #e1e4e5}.wy-table td,.rst-content table.docutils td,.rst-content table.field-list td{background-color:transparent;vertical-align:middle}.wy-table td p,.rst-content table.docutils td p,.rst-content table.field-list td p{line-height:18px}.wy-table td p:last-child,.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child{margin-bottom:0}.wy-table .wy-table-cell-min,.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min{width:1%;padding-right:0}.wy-table .wy-table-cell-min input[type=checkbox],.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox],.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:gray;font-size:90%}.wy-table-tertiary{color:gray;font-size:80%}.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td,.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td{background-color:#f3f6f6}.wy-table-backed{background-color:#f3f6f6}.wy-table-bordered-all,.rst-content table.docutils{border:1px solid #e1e4e5}.wy-table-bordered-all td,.rst-content table.docutils td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.wy-table-bordered-all tbody>tr:last-child td,.rst-content table.docutils tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px 0;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0 !important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980B9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9B59B6}html{height:100%;overflow-x:hidden}body{font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;font-weight:normal;color:#404040;min-height:100%;overflow-x:hidden;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#E67E22 !important}a.wy-text-warning:hover{color:#eb9950 !important}.wy-text-info{color:#2980B9 !important}a.wy-text-info:hover{color:#409ad5 !important}.wy-text-success{color:#27AE60 !important}a.wy-text-success:hover{color:#36d278 !important}.wy-text-danger{color:#E74C3C !important}a.wy-text-danger:hover{color:#ed7669 !important}.wy-text-neutral{color:#404040 !important}a.wy-text-neutral:hover{color:#595959 !important}h1,h2,.rst-content .toctree-wrapper p.caption,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:"Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif}p{line-height:24px;margin:0;font-size:16px;margin-bottom:24px}h1{font-size:175%}h2,.rst-content .toctree-wrapper p.caption{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}code,.rst-content tt,.rst-content code{white-space:nowrap;max-width:100%;background:#fff;border:solid 1px #e1e4e5;font-size:75%;padding:0 5px;font-family:Consolas,"Andale Mono WT","Andale Mono","Lucida Console","Lucida Sans Typewriter","DejaVu Sans Mono","Bitstream Vera Sans Mono","Liberation Mono","Nimbus Mono L",Monaco,"Courier New",Courier,monospace;color:#E74C3C;overflow-x:auto}code.code-large,.rst-content tt.code-large{font-size:90%}.wy-plain-list-disc,.rst-content .section ul,.rst-content .toctree-wrapper ul,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.wy-plain-list-disc li,.rst-content .section ul li,.rst-content .toctree-wrapper ul li,article ul li{list-style:disc;margin-left:24px}.wy-plain-list-disc li p:last-child,.rst-content .section ul li p:last-child,.rst-content .toctree-wrapper ul li p:last-child,article ul li p:last-child{margin-bottom:0}.wy-plain-list-disc li ul,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li ul,article ul li ul{margin-bottom:0}.wy-plain-list-disc li li,.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,article ul li li{list-style:circle}.wy-plain-list-disc li li li,.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,article ul li li li{list-style:square}.wy-plain-list-disc li ol li,.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,article ul li ol li{list-style:decimal}.wy-plain-list-decimal,.rst-content .section ol,.rst-content ol.arabic,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.wy-plain-list-decimal li,.rst-content .section ol li,.rst-content ol.arabic li,article ol li{list-style:decimal;margin-left:24px}.wy-plain-list-decimal li p:last-child,.rst-content .section ol li p:last-child,.rst-content ol.arabic li p:last-child,article ol li p:last-child{margin-bottom:0}.wy-plain-list-decimal li ul,.rst-content .section ol li ul,.rst-content ol.arabic li ul,article ol li ul{margin-bottom:0}.wy-plain-list-decimal li ul li,.rst-content .section ol li ul li,.rst-content ol.arabic li ul li,article ol li ul li{list-style:disc}.codeblock-example{border:1px solid #e1e4e5;border-bottom:none;padding:24px;padding-top:48px;font-weight:500;background:#fff;position:relative}.codeblock-example:after{content:"Example";position:absolute;top:0px;left:0px;background:#9B59B6;color:#fff;padding:6px 12px}.codeblock-example.prettyprint-example-only{border:1px solid #e1e4e5;margin-bottom:24px}.codeblock,pre.literal-block,.rst-content .literal-block,.rst-content pre.literal-block,div[class^='highlight']{border:1px solid #e1e4e5;padding:0px;overflow-x:auto;background:#fff;margin:1px 0 24px 0}.codeblock div[class^='highlight'],pre.literal-block div[class^='highlight'],.rst-content .literal-block div[class^='highlight'],div[class^='highlight'] div[class^='highlight']{border:none;background:none;margin:0}div[class^='highlight'] td.code{width:100%}.linenodiv pre{border-right:solid 1px #e6e9ea;margin:0;padding:12px 12px;font-family:Consolas,"Andale Mono WT","Andale Mono","Lucida Console","Lucida Sans Typewriter","DejaVu Sans Mono","Bitstream Vera Sans Mono","Liberation Mono","Nimbus Mono L",Monaco,"Courier New",Courier,monospace;font-size:12px;line-height:1.5;color:#d9d9d9}div[class^='highlight'] pre{white-space:pre;margin:0;padding:12px 12px;font-family:Consolas,"Andale Mono WT","Andale Mono","Lucida Console","Lucida Sans Typewriter","DejaVu Sans Mono","Bitstream Vera Sans Mono","Liberation Mono","Nimbus Mono L",Monaco,"Courier New",Courier,monospace;font-size:12px;line-height:1.5;display:block;overflow:auto;color:#404040}@media print{.codeblock,pre.literal-block,.rst-content .literal-block,.rst-content pre.literal-block,div[class^='highlight'],div[class^='highlight'] pre{white-space:pre-wrap}}.hll{background-color:#ffc;margin:0 -12px;padding:0 12px;display:block}.c{color:#998;font-style:italic}.err{color:#a61717;background-color:#e3d2d2}.k{font-weight:bold}.o{font-weight:bold}.cm{color:#998;font-style:italic}.cp{color:#999;font-weight:bold}.c1{color:#998;font-style:italic}.cs{color:#999;font-weight:bold;font-style:italic}.gd{color:#000;background-color:#fdd}.gd .x{color:#000;background-color:#faa}.ge{font-style:italic}.gr{color:#a00}.gh{color:#999}.gi{color:#000;background-color:#dfd}.gi .x{color:#000;background-color:#afa}.go{color:#888}.gp{color:#555}.gs{font-weight:bold}.gu{color:purple;font-weight:bold}.gt{color:#a00}.kc{font-weight:bold}.kd{font-weight:bold}.kn{font-weight:bold}.kp{font-weight:bold}.kr{font-weight:bold}.kt{color:#458;font-weight:bold}.m{color:#099}.s{color:#d14}.n{color:#333}.na{color:teal}.nb{color:#0086b3}.nc{color:#458;font-weight:bold}.no{color:teal}.ni{color:purple}.ne{color:#900;font-weight:bold}.nf{color:#900;font-weight:bold}.nn{color:#555}.nt{color:navy}.nv{color:teal}.ow{font-weight:bold}.w{color:#bbb}.mf{color:#099}.mh{color:#099}.mi{color:#099}.mo{color:#099}.sb{color:#d14}.sc{color:#d14}.sd{color:#d14}.s2{color:#d14}.se{color:#d14}.sh{color:#d14}.si{color:#d14}.sx{color:#d14}.sr{color:#009926}.s1{color:#d14}.ss{color:#990073}.bp{color:#999}.vc{color:teal}.vg{color:teal}.vi{color:teal}.il{color:#099}.gc{color:#999;background-color:#EAF2F5}.wy-breadcrumbs li{display:inline-block}.wy-breadcrumbs li.wy-breadcrumbs-aside{float:right}.wy-breadcrumbs li a{display:inline-block;padding:5px}.wy-breadcrumbs li a:first-child{padding-left:0}.wy-breadcrumbs li code,.wy-breadcrumbs li .rst-content tt,.rst-content .wy-breadcrumbs li tt{padding:5px;border:none;background:none}.wy-breadcrumbs li code.literal,.wy-breadcrumbs li .rst-content tt.literal,.rst-content .wy-breadcrumbs li tt.literal{color:#404040}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width: 480px){.wy-breadcrumbs-extra{display:none}.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:before,.wy-menu-horiz:after{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz ul,.wy-menu-horiz li{display:inline-block}.wy-menu-horiz li:hover{background:rgba(255,255,255,0.1)}.wy-menu-horiz li.divide-left{border-left:solid 1px #404040}.wy-menu-horiz li.divide-right{border-right:solid 1px #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{height:32px;display:inline-block;line-height:32px;padding:0 1.618em;margin-bottom:0;display:block;font-weight:bold;text-transform:uppercase;font-size:80%;color:#555;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:solid 1px #404040}.wy-menu-vertical li.divide-bottom{border-bottom:solid 1px #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:gray;border-right:solid 1px #c9c9c9;padding:0.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.wy-menu-vertical li code,.wy-menu-vertical li .rst-content tt,.rst-content .wy-menu-vertical li tt{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li span.toctree-expand{display:block;float:left;margin-left:-1.2em;font-size:0.8em;line-height:1.6em;color:#4d4d4d}.wy-menu-vertical li.on a,.wy-menu-vertical li.current>a{color:#404040;padding:0.4045em 1.618em;font-weight:bold;position:relative;background:#fcfcfc;border:none;border-bottom:solid 1px #c9c9c9;border-top:solid 1px #c9c9c9;padding-left:1.618em -4px}.wy-menu-vertical li.on a:hover,.wy-menu-vertical li.current>a:hover{background:#fcfcfc}.wy-menu-vertical li.on a:hover span.toctree-expand,.wy-menu-vertical li.current>a:hover span.toctree-expand{color:gray}.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.current>a span.toctree-expand{display:block;font-size:0.8em;line-height:1.6em;color:#333}.wy-menu-vertical li.toctree-l1.current li.toctree-l2>ul,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>ul{display:none}.wy-menu-vertical li.toctree-l1.current li.toctree-l2.current>ul,.wy-menu-vertical li.toctree-l2.current li.toctree-l3.current>ul{display:block}.wy-menu-vertical li.toctree-l2.current>a{background:#c9c9c9;padding:0.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{display:block;background:#c9c9c9;padding:0.4045em 4.045em}.wy-menu-vertical li.toctree-l2 a:hover span.toctree-expand{color:gray}.wy-menu-vertical li.toctree-l2 span.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3{font-size:0.9em}.wy-menu-vertical li.toctree-l3.current>a{background:#bdbdbd;padding:0.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{display:block;background:#bdbdbd;padding:0.4045em 5.663em;border-top:none;border-bottom:none}.wy-menu-vertical li.toctree-l3 a:hover span.toctree-expand{color:gray}.wy-menu-vertical li.toctree-l3 span.toctree-expand{color:#969696}.wy-menu-vertical li.toctree-l4{font-size:0.9em}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical .local-toc li ul{display:block}.wy-menu-vertical li ul li a{margin-bottom:0;color:#b3b3b3;font-weight:normal}.wy-menu-vertical a{display:inline-block;line-height:18px;padding:0.4045em 1.618em;display:block;position:relative;font-size:90%;color:#b3b3b3}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover span.toctree-expand{color:#b3b3b3}.wy-menu-vertical a:active{background-color:#2980B9;cursor:pointer;color:#fff}.wy-menu-vertical a:active span.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:0.809em;margin-bottom:0.809em;z-index:200;background-color:#2980B9;text-align:center;padding:0.809em;display:block;color:#fcfcfc;margin-bottom:0.809em}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto 0.809em auto;height:45px;width:45px;background-color:#2980B9;padding:5px;border-radius:100%}.wy-side-nav-search>a,.wy-side-nav-search .wy-dropdown>a{color:#fcfcfc;font-size:100%;font-weight:bold;display:inline-block;padding:4px 6px;margin-bottom:0.809em}.wy-side-nav-search>a:hover,.wy-side-nav-search .wy-dropdown>a:hover{background:rgba(255,255,255,0.1)}.wy-side-nav-search>a img.logo,.wy-side-nav-search .wy-dropdown>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search>a.icon img.logo,.wy-side-nav-search .wy-dropdown>a.icon img.logo{margin-top:0.85em}.wy-side-nav-search>div.version{margin-top:-0.4045em;margin-bottom:0.809em;font-weight:normal;color:rgba(255,255,255,0.3)}.wy-nav .wy-menu-vertical header{color:#2980B9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980B9;color:#fff}[data-menu-wrap]{-webkit-transition:all 0.2s ease-in;-moz-transition:all 0.2s ease-in;transition:all 0.2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:left repeat-y #fcfcfc;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoxOERBMTRGRDBFMUUxMUUzODUwMkJCOThDMEVFNURFMCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoxOERBMTRGRTBFMUUxMUUzODUwMkJCOThDMEVFNURFMCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjE4REExNEZCMEUxRTExRTM4NTAyQkI5OEMwRUU1REUwIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjE4REExNEZDMEUxRTExRTM4NTAyQkI5OEMwRUU1REUwIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+EwrlwAAAAA5JREFUeNpiMDU0BAgwAAE2AJgB9BnaAAAAAElFTkSuQmCC);background-size:300px 1px}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980B9;color:#fff;padding:0.4045em 0.809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:before,.wy-nav-top:after{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:bold}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980B9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,0.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:#999}footer p{margin-bottom:12px}footer span.commit code,footer span.commit .rst-content tt,.rst-content footer span.commit tt{padding:0px;font-family:Consolas,"Andale Mono WT","Andale Mono","Lucida Console","Lucida Sans Typewriter","DejaVu Sans Mono","Bitstream Vera Sans Mono","Liberation Mono","Nimbus Mono L",Monaco,"Courier New",Courier,monospace;font-size:1em;background:none;border:none;color:#999}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:before,.rst-footer-buttons:after{display:table;content:""}.rst-footer-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:solid 1px #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:solid 1px #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:gray;font-size:90%}@media screen and (max-width: 768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-side-scroll{width:auto}.wy-side-nav-search{width:auto}.wy-menu.wy-menu-vertical{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width: 1400px){.wy-nav-content-wrap{background:rgba(0,0,0,0.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,footer,.wy-nav-side{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;border-top:solid 10px #343131;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;z-index:400}.rst-versions a{color:#2980B9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27AE60;*zoom:1}.rst-versions .rst-current-version:before,.rst-versions .rst-current-version:after{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version span.toctree-expand,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content p.caption .headerlink,.rst-content p.caption .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .icon{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#E74C3C;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#F1C40F;color:#000}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:gray;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:solid 1px #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px}.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge .rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width: 768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}img{width:100%;height:auto}}.rst-content img{max-width:100%;height:auto !important}.rst-content div.figure{margin-bottom:24px}.rst-content div.figure p.caption{font-style:italic}.rst-content div.figure.align-center{text-align:center}.rst-content .section>img,.rst-content .section>a>img{margin-bottom:24px}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content .note .last,.rst-content .attention .last,.rst-content .caution .last,.rst-content .danger .last,.rst-content .error .last,.rst-content .hint .last,.rst-content .important .last,.rst-content .tip .last,.rst-content .warning .last,.rst-content .seealso .last,.rst-content .admonition-todo .last{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,0.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent !important;border-color:rgba(0,0,0,0.1) !important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha li{list-style:upper-alpha}.rst-content .section ol p,.rst-content .section ul p{margin-bottom:12px}.rst-content .line-block{margin-left:24px}.rst-content .topic-title{font-weight:bold;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0px 0px 24px 24px}.rst-content .align-left{float:left;margin:0px 24px 24px 0px}.rst-content .align-center{margin:auto;display:block}.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content .toctree-wrapper p.caption .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink,.rst-content p.caption .headerlink{display:none;visibility:hidden;font-size:14px}.rst-content h1 .headerlink:after,.rst-content h2 .headerlink:after,.rst-content .toctree-wrapper p.caption .headerlink:after,.rst-content h3 .headerlink:after,.rst-content h4 .headerlink:after,.rst-content h5 .headerlink:after,.rst-content h6 .headerlink:after,.rst-content dl dt .headerlink:after,.rst-content p.caption .headerlink:after{visibility:visible;content:"";font-family:FontAwesome;display:inline-block}.rst-content h1:hover .headerlink,.rst-content h2:hover .headerlink,.rst-content .toctree-wrapper p.caption:hover .headerlink,.rst-content h3:hover .headerlink,.rst-content h4:hover .headerlink,.rst-content h5:hover .headerlink,.rst-content h6:hover .headerlink,.rst-content dl dt:hover .headerlink,.rst-content p.caption:hover .headerlink{display:inline-block}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:solid 1px #e1e4e5}.rst-content .sidebar p,.rst-content .sidebar ul,.rst-content .sidebar dl{font-size:90%}.rst-content .sidebar .last{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:"Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif;font-weight:bold;background:#e1e4e5;padding:6px 12px;margin:-24px;margin-bottom:24px;font-size:100%}.rst-content .highlighted{background:#F1C40F;display:inline-block;font-weight:bold;padding:0 6px}.rst-content .footnote-reference,.rst-content .citation-reference{vertical-align:super;font-size:90%}.rst-content table.docutils.citation,.rst-content table.docutils.footnote{background:none;border:none;color:#999}.rst-content table.docutils.citation td,.rst-content table.docutils.citation tr,.rst-content table.docutils.footnote td,.rst-content table.docutils.footnote tr{border:none;background-color:transparent !important;white-space:normal}.rst-content table.docutils.citation td.label,.rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}.rst-content table.docutils.citation tt,.rst-content table.docutils.citation code,.rst-content table.docutils.footnote tt,.rst-content table.docutils.footnote code{color:#555}.rst-content table.field-list{border:none}.rst-content table.field-list td{border:none;padding-top:5px}.rst-content table.field-list td>strong{display:inline-block;margin-top:3px}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left;padding-left:0}.rst-content tt,.rst-content tt,.rst-content code{color:#000;padding:2px 5px}.rst-content tt big,.rst-content tt em,.rst-content tt big,.rst-content code big,.rst-content tt em,.rst-content code em{font-size:100% !important;line-height:normal}.rst-content tt.literal,.rst-content tt.literal,.rst-content code.literal{color:#E74C3C}.rst-content tt.xref,a .rst-content tt,.rst-content tt.xref,.rst-content code.xref,a .rst-content tt,a .rst-content code{font-weight:bold;color:#404040}.rst-content a tt,.rst-content a tt,.rst-content a code{color:#2980B9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:bold}.rst-content dl p,.rst-content dl table,.rst-content dl ul,.rst-content dl ol{margin-bottom:12px !important}.rst-content dl dd{margin:0 0 12px 24px}.rst-content dl:not(.docutils){margin-bottom:24px}.rst-content dl:not(.docutils) dt{display:inline-block;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980B9;border-top:solid 3px #6ab0de;padding:6px;position:relative}.rst-content dl:not(.docutils) dt:before{color:#6ab0de}.rst-content dl:not(.docutils) dt .headerlink{color:#404040;font-size:100% !important}.rst-content dl:not(.docutils) dl dt{margin-bottom:6px;border:none;border-left:solid 3px #ccc;background:#f0f0f0;color:#555}.rst-content dl:not(.docutils) dl dt .headerlink{color:#404040;font-size:100% !important}.rst-content dl:not(.docutils) dt:first-child{margin-top:0}.rst-content dl:not(.docutils) tt,.rst-content dl:not(.docutils) tt,.rst-content dl:not(.docutils) code{font-weight:bold}.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) tt.descclassname,.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) code.descname,.rst-content dl:not(.docutils) tt.descclassname,.rst-content dl:not(.docutils) code.descclassname{background-color:transparent;border:none;padding:0;font-size:100% !important}.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) code.descname{font-weight:bold}.rst-content dl:not(.docutils) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:bold}.rst-content dl:not(.docutils) .property{display:inline-block;padding-right:8px}.rst-content .viewcode-link,.rst-content .viewcode-back{display:inline-block;color:#27AE60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:bold}.rst-content tt.download,.rst-content code.download{background:inherit;padding:inherit;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content tt.download span:first-child:before,.rst-content code.download span:first-child:before{margin-right:4px}@media screen and (max-width: 480px){.rst-content .sidebar{width:100%}}span[id*='MathJax-Span']{color:#404040}.math{text-align:center}@font-face{font-family:"Inconsolata";font-style:normal;font-weight:400;src:local("Inconsolata"),local("Inconsolata-Regular"),url(../fonts/Inconsolata-Regular.ttf) format("truetype")}@font-face{font-family:"Inconsolata";font-style:normal;font-weight:700;src:local("Inconsolata Bold"),local("Inconsolata-Bold"),url(../fonts/Inconsolata-Bold.ttf) format("truetype")}@font-face{font-family:"Lato";font-style:normal;font-weight:400;src:local("Lato Regular"),local("Lato-Regular"),url(../fonts/Lato-Regular.ttf) format("truetype")}@font-face{font-family:"Lato";font-style:normal;font-weight:700;src:local("Lato Bold"),local("Lato-Bold"),url(../fonts/Lato-Bold.ttf) format("truetype")}@font-face{font-family:"Roboto Slab";font-style:normal;font-weight:400;src:local("Roboto Slab Regular"),local("RobotoSlab-Regular"),url(../fonts/RobotoSlab-Regular.ttf) format("truetype")}@font-face{font-family:"Roboto Slab";font-style:normal;font-weight:700;src:local("Roboto Slab Bold"),local("RobotoSlab-Bold"),url(../fonts/RobotoSlab-Bold.ttf) format("truetype")}
+/*# sourceMappingURL=theme.css.map */
diff --git a/mpl-probscale/_static/doctools.js b/mpl-probscale/_static/doctools.js
new file mode 100644
index 00000000000..c7bfe760aa8
--- /dev/null
+++ b/mpl-probscale/_static/doctools.js
@@ -0,0 +1,263 @@
+/*
+ * doctools.js
+ * ~~~~~~~~~~~
+ *
+ * Sphinx JavaScript utilities for all documentation.
+ *
+ * :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+/**
+ * select a different prefix for underscore
+ */
+$u = _.noConflict();
+
+/**
+ * make the code below compatible with browsers without
+ * an installed firebug like debugger
+if (!window.console || !console.firebug) {
+ var names = ["log", "debug", "info", "warn", "error", "assert", "dir",
+ "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace",
+ "profile", "profileEnd"];
+ window.console = {};
+ for (var i = 0; i < names.length; ++i)
+ window.console[names[i]] = function() {};
+}
+ */
+
+/**
+ * small helper function to urldecode strings
+ */
+jQuery.urldecode = function(x) {
+ return decodeURIComponent(x).replace(/\+/g, ' ');
+};
+
+/**
+ * small helper function to urlencode strings
+ */
+jQuery.urlencode = encodeURIComponent;
+
+/**
+ * This function returns the parsed url parameters of the
+ * current request. Multiple values per key are supported,
+ * it will always return arrays of strings for the value parts.
+ */
+jQuery.getQueryParameters = function(s) {
+ if (typeof s == 'undefined')
+ s = document.location.search;
+ var parts = s.substr(s.indexOf('?') + 1).split('&');
+ var result = {};
+ for (var i = 0; i < parts.length; i++) {
+ var tmp = parts[i].split('=', 2);
+ var key = jQuery.urldecode(tmp[0]);
+ var value = jQuery.urldecode(tmp[1]);
+ if (key in result)
+ result[key].push(value);
+ else
+ result[key] = [value];
+ }
+ return result;
+};
+
+/**
+ * highlight a given string on a jquery object by wrapping it in
+ * span elements with the given class name.
+ */
+jQuery.fn.highlightText = function(text, className) {
+ function highlight(node) {
+ if (node.nodeType == 3) {
+ var val = node.nodeValue;
+ var pos = val.toLowerCase().indexOf(text);
+ if (pos >= 0 && !jQuery(node.parentNode).hasClass(className)) {
+ var span = document.createElement("span");
+ span.className = className;
+ span.appendChild(document.createTextNode(val.substr(pos, text.length)));
+ node.parentNode.insertBefore(span, node.parentNode.insertBefore(
+ document.createTextNode(val.substr(pos + text.length)),
+ node.nextSibling));
+ node.nodeValue = val.substr(0, pos);
+ }
+ }
+ else if (!jQuery(node).is("button, select, textarea")) {
+ jQuery.each(node.childNodes, function() {
+ highlight(this);
+ });
+ }
+ }
+ return this.each(function() {
+ highlight(this);
+ });
+};
+
+/*
+ * backward compatibility for jQuery.browser
+ * This will be supported until firefox bug is fixed.
+ */
+if (!jQuery.browser) {
+ jQuery.uaMatch = function(ua) {
+ ua = ua.toLowerCase();
+
+ var match = /(chrome)[ \/]([\w.]+)/.exec(ua) ||
+ /(webkit)[ \/]([\w.]+)/.exec(ua) ||
+ /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) ||
+ /(msie) ([\w.]+)/.exec(ua) ||
+ ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) ||
+ [];
+
+ return {
+ browser: match[ 1 ] || "",
+ version: match[ 2 ] || "0"
+ };
+ };
+ jQuery.browser = {};
+ jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true;
+}
+
+/**
+ * Small JavaScript module for the documentation.
+ */
+var Documentation = {
+
+ init : function() {
+ this.fixFirefoxAnchorBug();
+ this.highlightSearchWords();
+ this.initIndexTable();
+ },
+
+ /**
+ * i18n support
+ */
+ TRANSLATIONS : {},
+ PLURAL_EXPR : function(n) { return n == 1 ? 0 : 1; },
+ LOCALE : 'unknown',
+
+ // gettext and ngettext don't access this so that the functions
+ // can safely bound to a different name (_ = Documentation.gettext)
+ gettext : function(string) {
+ var translated = Documentation.TRANSLATIONS[string];
+ if (typeof translated == 'undefined')
+ return string;
+ return (typeof translated == 'string') ? translated : translated[0];
+ },
+
+ ngettext : function(singular, plural, n) {
+ var translated = Documentation.TRANSLATIONS[singular];
+ if (typeof translated == 'undefined')
+ return (n == 1) ? singular : plural;
+ return translated[Documentation.PLURALEXPR(n)];
+ },
+
+ addTranslations : function(catalog) {
+ for (var key in catalog.messages)
+ this.TRANSLATIONS[key] = catalog.messages[key];
+ this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')');
+ this.LOCALE = catalog.locale;
+ },
+
+ /**
+ * add context elements like header anchor links
+ */
+ addContextElements : function() {
+ $('div[id] > :header:first').each(function() {
+ $('\u00B6').
+ attr('href', '#' + this.id).
+ attr('title', _('Permalink to this headline')).
+ appendTo(this);
+ });
+ $('dt[id]').each(function() {
+ $('\u00B6').
+ attr('href', '#' + this.id).
+ attr('title', _('Permalink to this definition')).
+ appendTo(this);
+ });
+ },
+
+ /**
+ * workaround a firefox stupidity
+ * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075
+ */
+ fixFirefoxAnchorBug : function() {
+ if (document.location.hash)
+ window.setTimeout(function() {
+ document.location.href += '';
+ }, 10);
+ },
+
+ /**
+ * highlight the search words provided in the url in the text
+ */
+ highlightSearchWords : function() {
+ var params = $.getQueryParameters();
+ var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : [];
+ if (terms.length) {
+ var body = $('div.body');
+ if (!body.length) {
+ body = $('body');
+ }
+ window.setTimeout(function() {
+ $.each(terms, function() {
+ body.highlightText(this.toLowerCase(), 'highlighted');
+ });
+ }, 10);
+ $('