PK4;M`nnfityk-latest/objects.inv# Sphinx inventory version 2 # Project: Fityk # Version: 1.3.1 # The remainder of this file is compressed using zlib. xڭn7|EFw9v7s)ɑ}>I\,'-:- ϼ|-Ծ?FE-=Wg[ߪ7} ڗo%JUMk/vI[biN{=Tp8@{8Y_զ.CkZ<$<hZ} ޫ2M~$ԍIF@pէYZ**ݷk`Oo`s`?s " \L+ "a_qCI}zӏD.i$Lgƨ\"ݠܖ$)iV4:]:&aؚtp^ɜ_{AWpKs#u{̳߸+w@#kPC ލ}AڂkQ*x'fO!+\;/W #fX7mJM_0 ?̒#h|c| :9yZ~v Wzi3 MtfK,,PΣ|(8t!"|vRߠ&DYSokWpiexbƲ4:CgݭOzuӢ/5$9Iett -ZD2`‘ TYb<]>uVխ̨+nPBCJLαcmz 5/gEY<:+n)kt>?Rr!Bd!ݺ<$Et@E緹͈Q1D AU[Dn.G%`8u8M KbH H{Ȋ~\u}Yi%0>"&uRJG^\I)LM yk0v^EOs$_ MKzؙ6|[訃F+S5FF؁6g*KF],gFT/PK4;M~fityk-latest/.buildinfo# Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. config: 025703b827763047cd3cab16221ee043 tags: 0957a7f5604f7fa265ade309e7b795c2 PK4;MȎ#..fityk-latest/fityk-manual.html Fityk 1.3.1 manual

Fityk 1.3.1 - User’s Manual

Introduction

Fityk is a program for nonlinear fitting of analytical functions (especially peak-shaped) to data (usually experimental data).

To put it differently, it is primarily peak fitting software, but can handle other types of functions as well.

Apart from the actual fitting, the program helps with data processing and provides ergonomic graphical interface (and also command line interface and scripting API – but if the program is popular in some fields, it’s thanks to its graphical interface).

It is reportedly used in crystallography, chromatography, photoluminescence and photoelectron spectroscopy, infrared and Raman spectroscopy, to name but a few.

Fityk offers various nonlinear fitting methods, simple background subtraction and other manipulations to the dataset, easy placement of peaks and changing of peak parameters, support for analysis of series of datasets, automation of common tasks with scripts, and much more.

In simple cases, the program can be operated with mouse only. Let say that you want to model the data with multiple peaks or other function shapes. You select a built-in function type (such as Gaussian, Voigt, sigmoid, polynomial and dozens of others) place it with the mouse, place other functions and click a button to fit it.

But the program can also handle quite complex scenarios. You can define your own function types. You can specify sophisticated dependencies between parameters of the functions (say, peak widths given as a function of peak positions). You can fit multiple datasets together using common set of parameters. You can model zero-shift in your instrument or do more complicated refinement of the X scale. And you can automate all this work. If you don’t know how to handle your case, do not hesistate to ask on the users group or contact the author.

To download the latest version of the program or to contact the author visit fityk.nieto.pl.

Reference for academic papers: M. Wojdyr, J. Appl. Cryst. 43, 1126-1128 (2010) [reprint]

Open Source

Fityk is open-source (GPL2+). If you are interested, please find the source code at GitHub.

It uses a few open source projects:

  • NLopt for several optional fitting methods
  • one of the fitting methods uses MPFIT library (MINPACK-1 Least Squares Fitting Library in C), which includes software developed by the University of Chicago, as Operator of Argonne National Laboratory.
  • xylib library handles reading data files
  • Lua interpreter is embedded for scripting
  • and a few popular libraries and tools that make programming much easier: wxWidgets (GUI), Boost (misc), zlib (compression), readline (CLI), SWIG (bindings), Catch (testing).

About this manual

This manual is written in ReStructuredText. All corrections and improvements are welcome. Use the Show Source link to get the source of the page, edit it and send me either the modified version or a patch.

Alternatively, go to GitHub, open corresponding rst file, press Fork and edit this file button, do edits in your web browser and click Propose file change.

The following people have contributed to this manual (in chronological order): Marcin Wojdyr (maintainer), Stan Gierlotka, Jaap Folmer, Michael Richardson.

Getting Started

Graphical Interface

That’s how the GUI looks like:

_images/fityk-with-tooltip.png

The main plot can display data points, model that is to be fitted to the data and individual functions in the model. You can configure what is displayed and how (through GUI ‣ Configure or context menu).

The helper plot shows how well the model fits the data. You may have one, two or no helper plots (GUI ‣ Show). By default, the plot shows the difference between the data and the model. It can also show weighted or cumulative difference, and a couple of other things.

The helper plot is also handy for zooming – with left and middle mouse buttons. Selecting a horizontal span with the left button zooms into this span. The middle button goes back to the whole dataset (the same as Zoom All in the toolbar).

The sidebar is for switching between datasets, inspecting functions, and for changing function parameters. It also provides quick access to a few properties of the main plot, such as the size of data points.

On the main plot, the meaning of the left and right mouse button depends on the current mouse mode. Mouse modes are switched using toolbar buttons:

  • Normal Mode normal mode – the left button zooms in and the right button shows pop-up menu,
  • Data-Range Mode data-range mode – for activating and de-activating data, i.e. for selecting regions of interest,
  • Baseline Mode baseline mode – manual baseline subtraction (you may never need it),
  • Add-Peak Mode add-peak mode – for placing peaks and other functions.

The status bar shows a hint of what the mouse does in the current mode.

Finally, the input field and the output window provide alternative, console-like way of interacting with the program. Also, the GUI operations that change the state of the program (data, model, non-visual settings) are translated into textual commands and printed in the output window.

Note

To save configuration of the GUI (visible windows, colors, etc.) for next session use GUI ‣ Save current config.

Minimal Example

Let us analyze a diffraction pattern of NaCl. Our goal is to determine the position of the center of the highest peak. It is needed for calculating the pressure under which the sample was measured, but this later detail in the processing is irrelevant for the time being.

The data file used in this example is distributed with the program and can be found in the samples directory.

Textual commands that correspond to performed operations are shown in this section in CLI boxes.

First load data from the nacl01.dat file. Select Data ‣ Load File from the menu (or Load Data from the toolbar) and choose the file.

CLI

@0 < nacl01.dat

You can zoom-in to the biggest peak using the left mouse button on the residual (helper) plot. To zoom out, press Zoom All on the toolbar.

Now all data points are active. Only the biggest peak is of our interest, so we want to deactivate the remaining points. Change to the range mode (toolbar: Data-Range Mode) and deactivate not needed points with the right mouse button.

CLI

A = (x > 23.0 and x < 26.0)

As our example data has no background to worry about, our next step is to define a peak with reasonable initial values and fit it to the data. We will use Gaussian. To see its formula, type: info Gaussian (or i Gaussian) or look for it in the section Built-In Functions.

Select Gaussian from the list of functions on the toolbar and press Auto Add.

CLI

guess Gaussian

Automatic peak detection works in this case, but if it wouldn’t, you may set the initial peak position, height and width manually. Either with the mouse in the add-peak mode, or with a command.

CLI

F += Gaussian(~60000, ~24.6, ~0.2)

Parameters of an existing function can be changed in the sideber, or by dragging that little circle handle attached to each function (you should see a handle at the top of your Gaussian).

If the peaks/functions are not named explicitely (like in this example), they get automatic names %_1, %_2, etc.

Now let us fit the function. Select Fit ‣ Run from the menu or press Fit.

CLI

fit

Important

Fitting minimizes the weighted sum of squared residuals (see Nonlinear Optimization). The default weights of points are not equal.

Now you can check the peak position together with other parameters on the sidebar. Alternatively, right click the peak handle and select Show Info from the context menu.

CLI

info prop %_1

That’s it!

By the way, you can save all the issued commands to a file (Session ‣ Save History)

CLI

info history > myscript.fit

and later use it as a macro (Session ‣ Execute script).

CLI

exec myscript.fit

Command Line

Fityk comes with a small domain-specific language (DSL). All operations in Fityk are driven by commands of this language. Commands can be typed in the input box in the GUI, but if all you want to do is to type commands, the program has a separate CLI version (cfityk) for this.

Do not worry

you do not need to learn these commands. It is possible to use menus and dialogs in the GUI and completely avoid typing commands.

When you use the GUI and perform an action using the menu, you can see the corresponding command in the output window. Fityk has less than 30 commands. Each performs a single actions, such as loading data from file, adding function, assigning variable, fitting, or writing results to a file.

A sequence of commands written down in a file makes a script (macro), which can automate common tasks. Complex tasks may need to be programmed in a general-purpose language. That is why Fityk has an embedded Lua interpreter (Lua is a lightweight programming language). It is also possible to use Fityk library from a program in Python, C, C++, Java, Ruby or Perl, and possibly from other languages supported by SWIG.

Now a quick glimpse at the syntax. The =-> prompt below marks an input:

=-> print pi
3.14159
=-> # this is a comment -- from `#' to the end of line
=-> p '2+3=', 2+3  # p stands for print
2+3 = 5
=-> set numeric_format='%.9f'  # show 9 digits after dot
=-> pr pi, pi^2, pi^3  # pr, pri and prin also stand for print
3.141592654 9.869604401 31.006276680

Usually, one line has one command, but if it is really needed, two or more commands can be put in one line:

=-> $a = 3; $b = 5  # two commands separated with `;'

or a backslash can be used to continue a command in the next line:

=-> print \
... 'this'
this

If you want to work with multiple datasets simultaneously, you can refer to a dataset through its number: the first dataset is @0, the second – @1, etc:

=-> fit # perform fitting of the default dataset (the first one)
=-> @2: fit # fit the third dataset (@2)
=-> @2 @3: fit # fit the third dataset (@2) and then the fourth one (@3)
=-> @*: fit # fit all datasets, one by one

Settings in the program are changed with the command set:

set key = value

For example:

=-> set logfile = 'C:\log.fit' # log all commands to this file
=-> set verbosity = 1 # make output from the program more verbose
=-> set epsilon = 1e-14

The last example changes the ε value, which is used to test floating-point numbers a and b for equality (it is well known that due to rounding errors the equality test for two numbers should have some tolerance, and the tolerance should be tailored to the application): |a−b| < ε.

To run a single command with different settings, add with key=value before the command:

=-> print pi == 3.14  # default epsilon = 10^-12
0
=-> with epsilon = 0.1 print pi == 3.14  # abusing epsilon
1

Putting it all together, a line typically has a single command, often prefixed with datasets+:, sometimes prefixed with with. In general it is:

[[@...:] [with ...] command [";" command]...] [#comment]

All the commands are described in next chapters.

Data

Loading Data

Data files are read using the xylib library.

In the GUI

click Load Data. If it just works for your files, you may go straight to Active and Inactive Points.

Points are loaded from files using the command:

dataslot < filename[:xcol:ycol:scol:block] [filetype options...]

where

  • dataslot should be replaced with @0, unless many datasets are to be used simultaneously (for details see: Working with Multiple Datasets),
  • xcol, ycol, scol (supported only in text and CSV files) are columns corresponding to x, y and std. dev. of y. Column 0 means index of the point: 0 for the first point, 1 for the second, etc.
  • block - selects one or more blocks of data from a multi-block file such as VAMAS
  • filetype usually can be omitted, because in most of the cases the filetype can be detected; the list of supported filetypes is at the end of this section
  • options depend on a filetype and usually are omitted

If the filename contains blank characters, a semicolon or comma, it should be put inside single quotation marks (together with colon-separated indices, if any).

A few examples should clarify it:

@0 < foo.vms
@0 < 'foo.vms'  # filename can be quoted
@0 < foo.fii text first_line_header  # with filetype options
@0 < foo.csv:1:4::  # x,y - 1st and 4th columns
@0 < foo.csv:1:2:3:  # read std. dev. of y from 3rd column
@0 < foo.csv:0:1::  # x - index (0,1,2,...), y - first column
@0 < foo.raw::::0,1  # load two first blocks of data (as one dataset)

You may also specify multiple y columns. It will load each x/y pair as a separate dataset. In this case you need to use @+ < ... (@+ denotes new dataslot):

@+ < foo.csv:1:3,4:: # load two dataset (with y in columns 3,4)
@+ < foo.csv:1:3..5:: # load three dataset (with y in columns 3,4,5)
@+ < foo.csv:1:4..6,2:: # load four dataset (y: 4,5,6,2)
@+ < foo.csv:1:2..:: # load 2nd and all the next columns as y

Information about loaded data can be obtained with:

info data

Supported Filetypes

text
ASCII text, multicolumn numeric data. The details are given in the next section.
csv
CSV or TSV file. Similar to text but supports quoted (") values and uses different heuristic to interpret ambiguous cases.
dbws
format used by DBWS (program for Rietveld analysis) and DMPLOT.
canberra_cnf
Canberra CNF format
cpi
Sietronics Sieray CPI format
uxd
Siemens/Bruker UXD format (powder diffraction data)
bruker_raw
Simens-Bruker RAW format (version 1,2,3)
rigaku_dat
Rigaku dat format (powder diffraction data)
vamas
VAMAS ISO-14976 (only experiment modes: “SEM” or “MAPSV” or “MAPSVDP” and only “REGULAR” scan mode are supported)
philips_udf
Philips UDF (powder diffraction data)
philips_rd
Philips RD raw scan format V3 (powder diffraction data)
spe
Princeton Instruments WinSpec SPE format (only 1-D data is supported)
pdcif
CIF for powder diffraction

And a few others. The full list is available at: http://xylib.sourceforge.net/.

Reading Text Files

The xylib library can read TSV or CSV formats (tab or comma separated values). In fact, the values can be separated by any whitespace character or by one of ,;: punctations, or by any combination of these.

Empty lines and comments that start with hash (#) are skipped.

Since there is a lot of files in the world that contain numeric data mixed with text, unless the strict option is given any text that can not be interpreted as a number is regarded a start of comment (the rest of the line is ignored).

Note that the file is parsed regardless of blocks and columns specified by the user. The data read from the file are first stored in a table with m columns and n rows. If some of the lines have 3 numbers in it, and some have 5 numbers, we can either discard the lines that have 3 numbers or we can discard the numbers in 4th and 5th column. Usually the latter is done, but there are exceptions. The shorter lines are ignored

  • if it is the last line in the file (probably the program was terminated while writing the file),
  • if it contains only one number, but the prior lines had more numbers (this may be a comment that starts with a number)
  • if all the (not ignored) prior lines and the next line are longer

These rule were introduced to read free-format log files with textual comments inserted between lines with numeric data.

For now, xylib does not handle well nan’s and inf’s in the data.

Data blocks and columns may have names. These names are used to set a title of the dataset (see Working with Multiple Datasets for details). If the option first_line_header is given and the number of words in the first line is equal to the number of data columns, each word is used as a name of corresponding column. If the number of words is different, the first line is used as a name of the block. If the last_line_header option is given, the line preceding the first data line is used to set either column names or the block name.

If the file starts with the “LAMMPS (” string, the last_line_header option is set automatically. This is very helpful when plotting data from LAMMPS log files.

Active and Inactive Points

We often have the situation that only a part of the data from a file is of interest. In Fityk, each point is either active or inactive. Inactive points are excluded from fitting and all calculations. (Since active points do not need to be in one region, we do not use the region of interest term here, but such region can be easy selected). A data transformation:

A = boolean-condition

can be used to change the state of points.

In the GUI

data points can be activated and disactivated with mouse in the data-range mode (toolbar: Data-Range Mode).

Standard Deviation (or Weight)

When fitting data, we assume that only the y coordinate is subject to statistical errors in measurement. This is a common assumption. To see how the y’s standard deviation, σ, influences fitting (optimization), look at the weighted sum of squared residuals formula in Nonlinear Optimization. We can also think about weights of points – every point has a weight assigned, that is equal w_i=1/\sigma_i^2.

Standard deviation of points can be read from file together with the x and y coordinates. Otherwise, it is set either to max(y1/2, 1) or to 1, depending on the default_sigma option. Setting std. dev. as a square root of the value is common and has theoretical ground when y is the number of independent events. You can always change the standard deviation, e.g. make it equal for every point with the command: S=1. See Data Point Transformations for details.

Note

It is often the case that user is not sure what standard deviation should be assumed, but it is her responsibility to pick something.

Data Point Transformations

Every data point has four properties: x coordinate, y coordinate, standard deviation of y and active/inactive flag. These properties can be changed using symbols X, Y, S and A, respectively. It is possible to either change a single point or apply a transformation to all points. For example:

  • Y[3]=1.2 assigns the y coordinate of the 4th point (0 is first),
  • Y = -y changes the sign of the y coordinate for all points.

On the left side of the equality sign you can have one of symbols X, Y, S, A, possibly with the index in brackets. The symbols on the left side are case insensitive.

The right hand side is a mathematical expression that can have special variables:

  • lower case letters x, y, s, a represent properties of data points before transformation,
  • upper case X, Y, S, A stand for the same properties after transformation,
  • M stands for the number of points.
  • n stands for the index of currently transformed point, e.g., Y=y[M-n-1] means that n-th point (n=0, 1, … M-1) is assigned y value of the n-th point from the end.

Before the transformation a new array of points is created as a copy of the old array. Operations are applied sequentially from the first point to the last one, so while Y[n+1] and y[n+1] have always the same value, Y[n-1] and y[n-1] may differ. For example, the two commands:

Y = y[n] + y[n-1]
Y = y[n] + Y[n-1]

differ. The first one adds to each point the value of the previous point. The second one adds the value of the previous point after transformation, so effectively it adds the sum of all previous points. The index [n] could be omitted (Y = y + y[n-1]). The value of undefined points, like y[-1] and Y[-1], is explained later in this section.

Expressions can contain:

  • real numbers in normal or scientific format (e.g. 1.23e5),
  • constants pi, true (1), false (0)
  • binary operators: +, -, *, /, ^,
  • boolean operators: and, or, not,
  • comparisions: >, >=, <, <=, ==, !=.
  • one argument functions:
    • sqrt
    • exp
    • log10
    • ln
    • sin
    • cos
    • tan
    • sinh
    • cosh
    • tanh
    • atan
    • asin
    • acos
    • erf
    • erfc
    • gamma
    • lgamma (=ln(|gamma()|))
    • abs
    • round (rounds to the nearest integer)
  • two argument functions:
    • mod (modulo)
    • min2
    • max2 (max2(3,5) gives 5),
    • randuniform(a, b) (random number from interval (a, b)),
    • randnormal(mu, sigma) (random number from normal distribution),
    • voigt(a, b) = \frac{b}{\pi} \int_{-\infty}^{+\infty} \frac{\exp(-t^2)}{b^2+(a-t)^2} dt
  • ternary ?: operator: condition ?  expression1 : expression2, which returns expression1 if condition is true and expression2 otherwise.

A few examples.

  • The x scale of diffraction pattern can be changed from 2θ to Q:

    X = 4*pi * sin(x/2*pi/180) / 1.54051 # Cu 2θ -> Q
    
  • Negative y values can be zeroed:

    Y = max2(y, 0)
    
  • All standard deviations can be set to 1:

    S = 1
    
  • It is possible to select active range of data:

    A = x > 40 and x < 60 # select range (40, 60)
    

All operations are performed on real numbers. Two numbers that differ less than ε (the value of ε is set by the option epsilon) are considered equal.

Points can be created or deleted by changing the value of M. For example, the following commands:

M=500; x=n/100; y=sin(x)

create 500 points and generate a sinusoid.

Points are kept sorted according to their x coordinate. The sorting is performed after each transformation.

Note

Changing the x coordinate may change the order and indices of points.

Indices, like all other values, are computed in the real number domain. If the index is not integer (it is compared using ε to the rounded value):

  • x, y, s, a are interpolated linearly. For example, y[2.5] is equal to (y[2]+[3])/2. If the index is less than 0 or larger than M-1, the value for the first or the last point, respectively, is returned.
  • For X, Y, S, A the index is rounded to integer. If the index is less than 0 or larger than M-1, 0 is returned.

Transformations separated by commas (,) form a sequance of transformations. During the sequance, the vectors x, y, s and a that contain old values are not changed. This makes possible to swap the axes:

X=y, Y=x

The special index(arg) function returns the index of point that has x equal arg, or, if there is no such point, the linear interpolation of two neighbouring indices. This enables equilibrating the step of data (with interpolation of y and σ):

X = x[0] + n * (x[M-1]-x[0]) / (M-1), Y = y[index(X)], S = s[index(X)]

It is possible to delete points for which given condition is true, using expression delete(condition):

delete(not a) # delete inactive points

# reduce twice the number of points, averaging x and adding y
x = (x[n]+x[n+1])/2
y = y[n]+y[n+1]
delete(mod(n,2) == 1)

If you have more than one dataset, you may need to specify to which dataset the transformation applies. See Working with Multiple Datasets for details.

The value of a data expression can be shown using the print command. The precision of printed numbers is governed by the numeric_format option.

print M # the number of points
print y[index(20)] # value of y for x=20

Aggregate Functions

Aggregate functions have syntax:

aggregate(expression [if condition])

and return a single value, calculated from values of all points for which the given condition is true. If the condition is omitted, all points in the dataset are taken into account.

The following aggregate functions are recognized:

  • min() — the smallest value,
  • max() — the largest value,
  • argmin() — (stands for the argument of the minimum)
    the x value of the point for which the expression in brackets has the smallest value,
  • argmax() — the x value of the point for which the expression
    in brackets has the largest value,
  • sum() — the sum,
  • count() — the number of points for which the expression is true,
  • avg() — the arithmetic mean,
  • stddev() — the standard deviation,
  • centile(N, ) — percentile
  • darea() — a function used to normalize the area (see the example below). It returns the sum of expression*(x[n+1]-x[n-1])/2. In particular, darea(y) returns the interpolated area under data points.

Examples:

p avg(y) # print the average y value
p centile(50, y) # print the median y value
p max(y) # the largest y value
p argmax(y) # the position of data maximum
p max(y if x > 40 and x < 60)   # the largest y value for x in (40, 60)
p max(y if a) # the largest y value in the active range
p min(x if y > 0.1)] # x of the first point with y > 0.1
p count(y>100) # the number of points that have y above 100
p count(y>avg(y)) # aggregate functions can be nested
p y[min(n if y > 100)] # the first (from the left) value of y above 100

# take the first 2000 points, average them and subtract as background
Y = y - avg(y if n<2000)

Y = y / darea(y) # normalize data area

# make active only the points on the left from the first
# point with y > 0.1
a = x < min(x if y > 0.1)]

Functions and Variables in Data Transformation

You may postpone reading this section and read about the Models first.

Variables ($foo) and functions (%bar) can be used in data expressions:

Y = y / $foo  # divides all y's by $foo
Y = y - %f(x) # subtracts function %f from data
Y = y - @0.F(x) # subtracts all functions in F

# print the abscissa value of the maximum of the model
# (only the values in points are considered,
#  so it's not exactly the model's maximum)
print argmax(F(x))

# print the maximum of the sum of two functions
print max(%_1(x) + %_2(x))

# Fit constant x-correction (i.e. fit the instrumental zero error), ...
Z = Constant(~0)
fit
X = x + Z(x)        # ... correct the data
Z = 0               # ... and remove the correction from the model.

In the GUI

in the Baseline Mode (Baseline Mode), functions Spline and Polyline are used to subtract manually selected background. Clicking Strip Background results in a command like this:

%bg0 = Spline(14.2979,62.1253, 39.5695,35.0676, 148.553,49.9493)
Y = y - %bg0(x)

Clicking the same button again undoes the subtraction:

Y = y + %bg0(x)

The function edited in the Baseline Mode is always named %bgX, where X is the index of the dataset.

Values of the function parameters (e.g. %fun.a0) and pseudo-parameters Center, Height, FWHM, IB and Area (e.g. %fun.Area) can also be used. IB stands for Integral Breadth – width of rectangle with the same area and height as the peak, in other words Area/Height. Not all functions have pseudo-parameters.

It is also possible to calculate some properties of %functions:

  • %f.numarea(x1, x2, n) gives area integrated numerically from x1 to x2 using trapezoidal rule with n equal steps.
  • %f.findx(x1, x2, y) finds x in interval (x1, x2) such that %f(x)=y using bisection method combined with Newton-Raphson method. It is a requirement that %f(x1) < y < %f(x2).
  • %f.extremum(x1, x2) finds x in interval (x1, x2) such that %f’(x)=0 using bisection method. It is a requirement that %f’(x1) and %f’(x2) have different signs.

A few examples:

print %fun.findx(-10, 10, 0)  # find the zero of %fun in [-10, 10]
print F.findx(-10, 10, 0)     # find the zero of the model in [-10, 10]
print %fun.numarea(0, 100, 10000) # shows area of function %fun
print %_1(%_1.extremum(40, 50)) # shows extremum value

# calculate FWHM numerically, value 50 can be tuned
$c = {%f.Center}
p %f.findx($c, $c+50, %f.Height/2) - %f.findx($c, $c-50, %f.Height/2)
p %f.FWHM # should give almost the same.

Working with Multiple Datasets

Let us call a set of data that usually comes from one file – a dataset. It is possible to work simultaneously with multiple datasets. Datasets have numbers and are referenced by @ with the number, (e.g. @3). The user can specify which dataset the command should be applied to:

@0: M=500    # change the number of points in the first dataset
@1 @2: M=500 # the same command applied to two datasets
@*: M=500    # and the same applied to all datasets

If the dataset is not specified, the command applies to the default dataset, which is initially @0. The use command changes the default dataset:

use @2 # set @2 as default

To load dataset from file, use one of the commands:

@n < filename:xcol:ycol:scol:block filetype options...

@+ < filename:xcol:ycol:scol:block filetype options...

The first one uses existing data slot and the second one creates a new slot. Using @+ increases the number of datasets, and the command delete @n decreases it.

The dataset can be duplicated (@+ = @n) or transformed, more on this in the next section.

Each dataset has a separate model, that can be fitted to the data. This is explained in the next chapter.

Each dataset also has a title (it does not have to be unique, however). When loading file, a title is automatically created:

  • if there is a name associated with the column ycol, the title is based on it;
  • otherwise, if there is a name associated with the data block read from file, the title is set to this name;
  • otherwise, the title is based on the filename

Titles can be changed using the command:

@n: title = 'new-title'

To print the title of the dataset, type @n: info title.

Dataset Transformations

There are a few transformations defined for a whole dataset or for two datasets. The syntax is @n = ... or @+ = .... The the right hand side expression supports the following operations:

-@n
negation of all y values,
d * @n
(e.g. 0.4*@0) y values are multiplied by d,
@n + @m
returns @n with added y values from interpolated @m,
@n - @m
returns @n with subtracted y values from interpolated @m,
@n and @m
returns points from both datasets (re-sorted),

and functions:

sum_same_x(@n)
Merges points which have distance in x is smaller than epsilon. x of the merged point is the average, and y and σ are sums of components.
avg_same_x(@n)
The same as sum_same_x, but y and σ are set as the average of components.
shirley_bg(@n)
Calculates Shirley background (useful in X-ray photoelectron spectroscopy).

Examples:

@+ = @0 # duplicate the dataset
@+ = @0 and @1 # create a new dataset from @0 and @1
@0 = @0 - shirley_bg(@0) # remove Shirley background
@0 = @0 - @1 # subtract @1 from @0
@0 = @0 - 0.28*@1 # subtract scaled dataset @1 from @0

Exporting Data

Command:

print all: expression, ... > file.tsv

can export data to an ASCII TSV (tab separated values) file.

In the GUI

Data ‣ Export

To export data in a 3-column (x, y and standard deviation) format, use:

print all: x, y, s > file.tsv

Any expressions can be printed out:

p all: n+1, x, y, F(x), y-F(x), %foo(x), sin(pi*x)+y^2 > file.tsv

It is possible to select which points are to be printed by replacing all with if followed by a condition:

print if a: x, y # only active points are printed
print if x > 30 and x < 40: x, y # only points in (30,40)

The option numeric_format controls the format and precision of all numbers.

Models

From Numerical Recipes, chapter 15.0:

Given a set of observations, one often wants to condense and summarize the data by fitting it to a “model” that depends on adjustable parameters. Sometimes the model is simply a convenient class of functions, such as polynomials or Gaussians, and the fit supplies the appropriate coefficients. Other times, the model’s parameters come from some underlying theory that the data are supposed to satisfy; examples are coefficients of rate equations in a complex network of chemical reactions, or orbital elements of a binary star. Modeling can also be used as a kind of constrained interpolation, where you want to extend a few data points into a continuous function, but with some underlying idea of what that function should look like.

This chapter shows how to construct the model.

Complex models are often a sum of many functions. That is why in Fityk the model F is constructed as a list of component functions and is computed as F = \sum_i f_i.

Each component function f_i is one of predefined functions, such as Gaussian or polynomial. This is not a limitation, because the user can add any function to the predefined functions.

To avoid confusion, the name function will be used only when referring to a component function, not when when referring to the sum (model), which mathematically is also a function. The predefined functions will be sometimes called function types.

Function f_i=f_i(x; \boldsymbol{a}) is a function of x, and depends on a vector of parameters \boldsymbol{a}. The parameters \boldsymbol{a} will be fitted to achieve agreement of the model and data.

In experiments we often have the situation that the measured x values are subject to systematic errors caused, for example, by instrumental zero shift or, in powder diffraction measurements, by displacement of sample in the instrument. If this is the case, such errors should be a part of the model. In Fityk, this part of the model is called x-correction. The final formula for the model is:

F(x; \boldsymbol{a}) = \sum_i f_i(x+Z(x; \boldsymbol{a}); \boldsymbol{a})

where Z(x; \boldsymbol{a}) = \sum_i z_i(x; \boldsymbol{a}) is the x-correction. Z is constructed as a list of components, analogously to F, although in practice it has rarely more than one component.

Each component function is created by specifying a function type and binding variables to type’s parameters. The next section explains what are variables in Fityk, and then we get back to functions.

Variables

Variables have names prefixed with the dollar symbol ($) and are created by assigning a value:

$foo=~5.3           # simple-variable
$bar=5*sin($foo)    # compound-variable
$c=3.1              # constant (the simplest compound-variable)

The numbers prefixed with the tilde (~) are adjustable when the model is fitted to the data. Variable created by assigning ~number (like $foo in the example above) will be called a simple-variable.

All other variables are called compound-variables. Compound variables either depend on other variables ($bar above) or are constant ($c).

Important

Unlike in popular programming languages, variable can store either a single numeric (floating-point) value or a mathematical expression. Nothing else. In case of expression, if we define $b=2*$a the value of $b will be recalculated every time $a changes.

To assign a value (constant) of another variable, use: $b={$a}. Braces return the current value of the enclosed expression. The left brace can be preceded by the tilde (~). The assignment $b=~{$a} creates a simple variable.

Compound-variables can be build using operators +, -, *, /, ^ and the functions sqrt, exp, log10, ln, sin, cos, tan, sinh, cosh, tanh, atan, asin, acos, erf, erfc, lgamma, abs, voigt. This is a subset of the functions used in data transformations.

The braces may contain any data expression:

$x0 = {x[0]}
$min_y = {min(y if a)}
$c = {max2($a, $b)}
$t = {max(x) < 78 ? $a : $b}

Sometimes it is useful to freeze a variable, i.e. to prevent it from changing while fitting:

$a = ~12.3 # $a is fittable (simple-variable)
$a = {$a}  # $a is not fittable (constant)
$a = ~{$a} # $a is fittable (simple-variable) again

In the GUI

a variable can be switched between constant and simple-variable by clicking the padlock button on the sidebar. The icons open lock and lock show that the variable is fittable and frozen, respectively.

If the assigned expression contains tildes:

$bleh=~9.1*exp(~2)

it automatically creates simple-variables corresponding to the tilde-prefixed numbers. In the example above two simple-variables (with values 9.1 and 2) are created. Automatically created variables are named $_1, $_2, $_3, and so on.

Variables can be deleted using the command:

delete $variable

Domains

Simple-variables may have a domain, which is used for two things when fitting.

Most importantly, fitting methods that support bound constraints use the domain as lower and/or upper bounds. See the section Bound Constraints for details.

The other use is for randomizing parameters (simple-variables) of the model. Methods that stochastically initialize or modify parameters (usually generating a set of initial points) need well-defined domains (minimum and maximum values for parameters) to work effectively. Such methods include Nelder-Mead simplex and Genetic Algorithms, but not the default Lev-Mar method, so in most cases you do not need to worry about it.

The syntax is as follows:

$a = ~12.3 [0:20] # initial values are drawn from the (0, 20) range
$a = ~12.3 [0:]   # only lower bound
$a = ~12.3 [:20]  # only upper bound
$a = ~15.0        # domain stays the same
$a = ~15.0 []     # no domain
$a = ~{$a} [0:20] # domain is set again

If the domain is not specified but it is required (for the latter use) by the fitting method, we assume it to be ±p% of the current value, where p can be set using the domain_percent option.

Function Types and Functions

Function types have names that start with upper case letter (Linear, Voigt).

Functions have names prefixed with the percent symbol (%func). Every function has a type and variables bound to its parameters. One way to create a function is to specify both type and variables:

%f1 = Gaussian(~66254., ~24.7, ~0.264)
%f2 = Gaussian(~6e4, $ctr, $b+$c)
%f3 = Gaussian(height=~66254., hwhm=~0.264, center=~24.7)

Every expression which is valid on the right-hand side of a variable assignment can be used as a variable. If it is not just a name of a variable, an automatic variable is created. In the above examples, two variables were implicitely created for %f2: first for value 6e4 and the second for $b+$c).

If the names of function’s parameters are given (like for %f3 above), the variables can be given in any order.

Function types can can have specified default values for some parameters. The variables for such parameters can be omitted, e.g.:

=-> i Pearson7
Pearson7(height, center, hwhm, shape=2) = height/(1+((x-center)/hwhm)^2*(2^(1/shape)-1))^shape
=-> %f4 = Pearson7(height=~66254., center=~24.7, hwhm=~0.264) # no shape is given
New function %f4 was created.

Functions can be copied. The following command creates a deep copy (i.e. all variables are also duplicated) of %foo:

%bar = copy(%foo)

Functions can be also created with the command guess, as described in Guessing Initial Parameters.

Variables bound to the function parameters can be changed at any time:

=-> %f = Pearson7(height=~66254., center=~24.7, fwhm=~0.264)
New function %f was created.
=-> %f.center=~24.8
=-> $h = ~66254
=-> %f.height=$h
=-> info %f
%f = Pearson7($h, $_5, $_3, $_4)
=-> $h = ~60000 # variables are kept by name, so this also changes %f
=-> %p1.center = %p2.center + 3 # keep fixed distance between %p1 and %p2

Functions can be deleted using the command:

delete %function

Built-In Functions

The list of all functions can be obtained using i types. Some formulae here have long parameter names (like “height”, “center” and “hwhm”) replaced with a_i

Gaussian:

y = a_0
    \exp\left[-\ln(2)\left(\frac{x-a_1}{a_2}\right)^{2}\right]

a_2 here is half width at half maximum (HWHM=FWHM/2, where FWHM stands for full width…), which is proportional to the standard deviation: a_2=\sqrt{2\ln2}\sigma.

SplitGaussian:

y(x;a_0,a_1,a_2,a_3) = \begin{cases}
\textrm{Gaussian}(x;a_0,a_1,a_2) & x\leq a_1\\
\textrm{Gaussian}(x;a_0,a_1,a_3) & x>a_1\end{cases}

GaussianA:

y = \sqrt{\frac{\ln(2)}{\pi}}\frac{a_0}{a_2}
    \exp\left[-\ln(2)\left(\frac{x-a_1}{a_2}\right)^{2}\right]

Lorentzian:

y = \frac{a_0}{1+\left(\frac{x-a_1}{a_2}\right)^2}

SplitLorentzian:

y(x;a_0,a_1,a_2,a_3) = \begin{cases}
\textrm{Lorentzian}(x;a_0,a_1,a_2) & x\leq a_1\\
\textrm{Lorentzian}(x;a_0,a_1,a_3) & x>a_1\end{cases}

LorentzianA:

y = \frac{a_0}{\pi a_2\left[1+\left(\frac{x-a_1}{a_2}\right)^2\right]}

Pearson VII (Pearson7):

y = \frac{a_0} {\left[1+\left(\frac{x-a_1}{a_2}\right)^2
                        \left(2^{\frac{1}{a_3}}-1\right)\right]^{a_3}}

split Pearson VII (SplitPearson7):

y(x;a_{0},a_{1},a_{2},a_{3},a_{4},a_{5}) = \begin{cases}
 \textrm{Pearson7}(x;a_0,a_1,a_2,a_4) & x\leq a_1\\
 \textrm{Pearson7}(x;a_0,a_1,a_3,a_5) & x>a_1\end{cases}

Pearson VII Area (Pearson7A):

y = \frac{a_0\Gamma(a_3)\sqrt{2^{\frac{1}{a_3}}-1}}
         {a_2\Gamma(a_3-\frac{1}{2})\sqrt{\pi} \left[
            1 + \left(\frac{x-a_1}{a_2}\right)^2
                \left(2^{\frac{1}{a_3}}-1\right)
         \right]^{a_3}}

Pseudo-Voigt (PseudoVoigt):

y = a_0 \left[(1-a_3)\exp\left(-\ln(2)\left(\frac{x-a_1}{a_2}\right)^2\right)
              + \frac{a_3}{1+\left(\frac{x-a_1}{a_2}\right)^2}
        \right]

Pseudo-Voigt is a name given to the sum of Gaussian and Lorentzian. a_3 parameters in Pearson VII and Pseudo-Voigt are not related.

split Pseudo-Voigt (SplitPseudoVoigt):

y(x;a_{0},a_{1},a_{2},a_{3},a_{4},a_{5}) = \begin{cases}
 \textrm{PseudoVoigt}(x;a_0,a_1,a_2,a_4) & x\leq a_1\\
 \textrm{PseudoVoigt}(x;a_0,a_1,a_3,a_5) & x>a_1\end{cases}

Pseudo-Voigt Area (PseudoVoigtA):

y = a_0 \left[\frac{(1-a_3)\sqrt{\ln(2)}}{a_2\sqrt{\pi}}
              \exp\left(-\ln2\left(\frac{x-a_1}{a_2}\right)^2\right)
              + \frac{a_3}{\pi a_2
                           \left[1+\left(\frac{x-a_1}{a_2}\right)^2\right]}
        \right]

Voigt:

y = \frac
    {a_0 \int_{-\infty}^{+\infty}
             \frac{\exp(-t^2)}{a_3^2+(\frac{x-a_1}{a_2}-t)^2} dt}
    {\int_{-\infty}^{+\infty}
             \frac{\exp(-t^2)}{a_3^2+t^2} dt}

The Voigt function is a convolution of Gaussian and Lorentzian functions. a_0 = heigth, a_1 = center, a_2 is proportional to the Gaussian width, and a_3 is proportional to the ratio of Lorentzian and Gaussian widths.

Voigt is computed according to R.J.Wells, Rapid approximation to the Voigt/Faddeeva function and its derivatives, Journal of Quantitative Spectroscopy & Radiative Transfer 62 (1999) 29-48. The approximation is very fast, but not very exact.

FWHM is estimated using an approximation called modified Whiting (Olivero and Longbothum, 1977, JQSRT 17, 233): 0.5346 w_L + \sqrt{0.2169 w_L^2 + w_G^2}, where w_G=2\sqrt{\ln(2)} |a_2|, w_L=2 |a_2| a_3.

VoigtA:

y = \frac{a_0}{\sqrt{\pi}a_2}
    \int_{-\infty}^{+\infty}
        \frac{\exp(-t^2)}{a_3^2+(\frac{x-a_1}{a_2}-t)^2} dt

split Voigt (SplitVoigt):

y(x;a_{0},a_{1},a_{2},a_{3},a_{4},a_{5}) = \begin{cases}
 \textrm{Voigt}(x;a_0,a_1,a_2,a_4) & x\leq a_1\\
 \textrm{Voigt}(x;a_0,a_1,a_3,a_5) & x>a_1\end{cases}

Exponentially Modified Gaussian (EMG):

y = \frac{ac\sqrt{2\pi}}{2d}
    \exp\left(\frac{c^2}{2d^2}-\frac{x-b}{d}\right)
    \left[\frac{d}{\left|d\right|}
          +\textrm{erf}\left(\frac{x-b}{\sqrt{2}c}
                             - \frac{c}{\sqrt{2}d}\right)
    \right]

The exponentially modified Gaussian is a convolution of Gaussian and exponential probability density. a = Gaussian heigth, b = location parameter (Gaussian center), c = Gaussian width, d = distortion parameter (a.k.a. modification factor or time constant).

LogNormal:

y = h \exp\left\{ -\ln(2) \left[
                                \frac{\ln\left(1+2b\frac{x-c}{w}\right)}{b}
                         \right]^{2} \right\}

Doniach-Sunjic (DoniachSunjic):

y = \frac{h\left[\frac{\pi a}{2}
                 + (1-a)\arctan\left(\frac{x-E}{F}\right)\right]}
         {F+(x-E)^2}

Polynomial5:

y = a_0 + a_1 x +a_2 x^2 + a_3 x^3 + a_4 x^4 + a_5 x^5

Sigmoid:

y = L + \frac{U-L}{1+\exp\left(-\frac{x-x_{mid}}{w}\right)}

FCJAsymm:

Axial asymmetry peak shape in the Finger, Cox and Jephcoat model, see J. Appl. Cryst. (1994) 27, 892 and J. Appl. Cryst. (2013) 46, 1219.

Variadic Functions

Variadic function types have variable number of parameters. Two variadic function types are defined:

Spline(x1, y1, x2, y2, ...)
Polyline(x1, y1, x2, y2, ...)

This example:

%f = Spline(22.1, 37.9, 48.1, 17.2, 93.0, 20.7)

creates a function that is a natural cubic spline interpolation through points (22.1, 37.9), (48.1, 17.2), ….

The Polyline function is a polyline interpolation (spline of order 1).

Both Spline and Polyline functions are primarily used for the manual baseline subtraction via the GUI.

The derivatives of Spline function are not calculated, so this function is not refined by the default, derivative-based fitting algorithm.

Since the Polyline derivatives are calculated, it is possible to perform weighted least squares approximation by broken lines, although non-linear fitting algorithms are not optimal for this task.

User-Defined Functions (UDF)

User-defined function types can be added using command define, and then used in the same way as built-in functions.

Example:

define MyGaussian(height, center, hwhm) = height*exp(-ln(2)*((x-center)/hwhm)^2)
  • The name of new type must start with an upper-case letter, contain only letters and digits and have at least two characters.

  • The name of the type is followed by parameters in brackets.

  • Parameter name must start with lowercase letter and, contain only lowercase letters, digits and the underscore (‘_’).

  • The name “x” is reserved, do not put it into parameter list, just use it on the right-hand side of the definition.

  • There are special names of parameters that Fityk understands:

    • if the functions is peak-like (bell-shaped): height, center, hwhm, area,
    • if the functions is S-shaped (sigmoidal) or step-like: lower, upper, xmid, wsig,
    • if the function is more like linear: slope, intercept, avgy.

    The initial values of these parameters can be guessed (command guess) from the data. hwhm means half width at half maximum, the other names are self-explaining.

  • Each parameter may have a default value (see the examples below). The default value can be either a number or an expression that depends on the parameters listed above (e.g. 0.8*hwhm). The default value always binds a simple-variable to the parameter.

UDFs can be defined in a few ways:

  • by giving a full formula, like in the example above,
  • as a re-parametrization of existing function (see the GaussianArea example below),
  • as a sum of already defined functions (see the GLSum example below),
  • as a split (bifurcated) function: x < expression ? Function1(…) : Function2(…) (see the SplitL example below).

When giving a full formula, the right-hand side of the equality sign is similar to the definiton of variable, but the formula can also depend on x. Hopefully the examples can make the syntax clear:

# this is how some built-in functions could be defined
define MyGaussian(height, center, hwhm) = height*exp(-ln(2)*((x-center)/hwhm)^2)
define MyLorentzian(height, center, hwhm) = height/(1+((x-center)/hwhm)^2)
define MyCubic(a0=height,a1=0, a2=0, a3=0) = a0 + a1*x + a2*x^2 + a3*x^3

# supersonic beam arrival time distribution
define SuBeArTiDi(c, s, v0, dv) = c*(s/x)^3*exp(-(((s/x)-v0)/dv)^2)/x

# area-based Gaussian can be defined as modification of built-in Gaussian
# (it is the same as built-in GaussianA function)
define GaussianArea(area, center, hwhm) = Gaussian(area/hwhm/sqrt(pi/ln(2)), center, hwhm)

# sum of Gaussian and Lorentzian, a.k.a. PseudoVoigt (should be in one line)
define GLSum(height, center, hwhm, shape) = Gaussian(height*(1-shape), center, hwhm)
+ Lorentzian(height*shape, center, hwhm)

# split-Gaussian, the same as built-in SplitGaussian (should be in one line)
define SplitG(height, center, hwhm1=fwhm*0.5, hwhm2=fwhm*0.5) =
  x < center ? Lorentzian(height, center, hwhm1)
             : Lorentzian(height, center, hwhm2)

There is a simple substitution mechanism that makes writing complicated functions easier. Substitutions must be assigned in the same line, after the keyword where.

Example:

define ReadShockley(sigma0=1, a=1) = sigma0 * t * (a - ln(t)) where t=x*pi/180

# more complicated example, with nested substitutions
define FullGBE(k, alpha) = k * alpha * eta * (eta / tanh(eta) - ln (2*sinh(eta))) where eta = 2*pi/alpha * sin(theta/2), theta=x*pi/180

How it works internally

The formula is parsed, derivatives of the formula are calculated symbolically, expressions are simplified and bytecode for virtual machine (VM) is created.

When fitting, the VM calculates the value of the function and derivatives for every point.

Defined functions can be undefined using command undefine:

undefine GaussianArea

It is common to add own definitions to the init file. See the section Starting fityk and cfityk for details.

Cutoff

With default settings, the value of every function is calculated at every point. Peak functions, such as Gaussian, often have non-negligible values only in a small fraction of all points, so if you have many narrow peaks (like here), the basic optimization is to calculate values of each peak function only near the function’s center. If the option function_cutoff is set to a non-zero value, each function is evaluated only in the range where its values are greater than the function_cutoff.

This optimization is supported only by some built-in functions.

Model, F and Z

As already discussed, each dataset has a separate model that can be fitted to the data. As can be seen from the formula at the beginning of this chapter, the model is defined as a set functions f_i and a set of functions z_i. These sets are named F and Z respectively. The model is constructed by specifying names of functions in these two sets.

In many cases x-correction Z is not used. The fitted curve is thus the sum of all functions in F.

Command:

F += %function

adds %function to F, and

Z += %function

adds %function to Z.

A few examples:

# create and add function to F
%g = Gaussian(height=~66254., hwhm=~0.264, center=~24.7)
F += %g

# create unnamed function and add it to F
F += Gaussian(height=~66254., hwhm=~0.264, center=~24.7)

# clear F
F = 0

# clear F and put three functions in it
F = %a + %b + %c

# show info about the first and the last function in F
info F[0], F[-1]

The next sections shows an easier way to add a function (command guess).

If there is more than one dataset, F and Z can be prefixed with the dataset number (e.g. @1.F).

The model can be copied. To copy the model from @0 to @1 we type one of the two commands:

@1.F = @0.F        # shallow copy
@1.F = copy(@0.F)  # deep copy

The former command uses the same functions in both models: if you shift a peak in @1, it will be also shifted in @0. The latter command (deep copy) duplicates all functions and variables and makes an independent model.

In the GUI

click the button Copy-Model on the sidebar to make a deep copy.

It is often required to keep the width or shape of peaks constant for all peaks in the dataset. To change the variables bound to parameters with a given name for all functions in F, use the command:

F[*].param = variable

Examples:

# Set hwhm of all functions in F that have a parameter hwhm to $foo
# (hwhm here means half-width-at-half-maximum)
F[*].hwhm = $foo

# Bound the variable used for the shape of peak %_1 to shapes of all
# functions in F
F[*].shape = %_1.shape

# Create a new simple-variable for each function in F and bound the
# variable to parameter hwhm. All hwhm parameters will be independent.
F[*].hwhm = ~0.2

In the GUI

buttons =W and =S on the sidebar make, respectively, the HWHM and shape of all functions the same. Pressing the buttons again will make all the parameters independent.

Guessing Initial Parameters

The program can automatically set initial parameters of peaks (using peak-detection algorithm) and lines (using linear regression). Choosing initial parameters of a function by the program will be called guessing.

It is possible to guess peak location and add it to F with the command:

guess [%name =] PeakType [(initial values...)] [[x1:x2]]

Examples:

# add Gaussian in the given range
@0: guess Gaussian [22.1:30.5]

# the same, but name the new function %f1
@0: guess %f1 = Gaussian [22.1:30.5]

# search for the peak in the whole dataset
@0: guess Gaussian

# add one Gaussian to each dataset
@*: guess Gaussian

# set the center and shape explicitely (determine height and width)
guess PseudoVoigt(center=$ctr, shape=~0.3) [22.1:30.5]
  • Name of the function is optional.
  • Some of the parameters can be specified in brackets.
  • If the range is omitted, the whole dataset will be searched.

Fityk offers a simple algorithm for peak-detection. It finds the highest point in the given range (center and height), and than tries to find the width of the peak (hwhm, and area = height × hwhm).

If the highest point is at boundary of the given range, the points from the boundary to the nearest local minimum are ignored.

The values of height and width found by the algorithm are multiplied by the values of options height_correction and width_correction, respectively. The default value for both options is 1.

Another simple algorithm can roughly estimate initial parameters of sigmoidal functions.

The linear traits slope and intercept are calculated using linear regression (without weights of points). avgy is calculated as average value of y.

In the GUI

select a function from the list of functions on the toolbar and press Auto Add to add (guess) the selected function.

To choose a data range change the GUI mode to Add-Peak Mode and select the range with the right mouse button.

Displaying Information

The info command can be show useful information when constructing the model.

info types
shows the list of available function types.
info FunctionType
(e.g. info Pearson7) shows the formula (definition).
info guess [range]
shows where the guess command would locate a peak.
info functions
lists all defined functions.
info variables
lists all defined variables.
info F
lists components of F.
info Z
lists components of Z.
info formula
shows the full mathematical formula of the fitted model.
info simplified_formula
shows the same, but the formula is simplified.
info gnuplot_formula
shows same as formula, but the output is readable by gnuplot, e.g. x^2 is replaced by x**2.
info simplified_gnuplot_formula
shows the simplified formula in the gnuplot format.
info peaks
show a formatted list of parameters of functions in F.
info peaks_err
shows the same data, additionally including uncertainties of the parameters.
info models
a script that reconstructs all variables, functions and models.

The last two commands are often redirected to a file (info peaks > filename).

The complete list of info arguments can be found in Information Display.

In the GUI

most of the above commands has clickable equivalents.

Curve Fitting

Nonlinear Optimization

This is the core. We have a set of observations (data points) to which we want to fit a model that depends on adjustable parameters. Let me quote Numerical Recipes, chapter 15.0, page 656):

The basic approach in all cases is usually the same: You choose or design a figure-of-merit function (merit function, for short) that measures the agreement between the data and the model with a particular choice of parameters. The merit function is conventionally arranged so that small values represent close agreement. The parameters of the model are then adjusted to achieve a minimum in the merit function, yielding best-fit parameters. The adjustment process is thus a problem in minimization in many dimensions. […] however, there exist special, more efficient, methods that are specific to modeling, and we will discuss these in this chapter. There are important issues that go beyond the mere finding of best-fit parameters. Data are generally not exact. They are subject to measurement errors (called noise in the context of signal-processing). Thus, typical data never exactly fit the model that is being used, even when that model is correct. We need the means to assess whether or not the model is appropriate, that is, we need to test the goodness-of-fit against some useful statistical standard. We usually also need to know the accuracy with which parameters are determined by the data set. In other words, we need to know the likely errors of the best-fit parameters. Finally, it is not uncommon in fitting data to discover that the merit function is not unimodal, with a single minimum. In some cases, we may be interested in global rather than local questions. Not, “how good is this fit?” but rather, “how sure am I that there is not a very much better fit in some corner of parameter space?”

Our function of merit is the weighted sum of squared residuals (WSSR), also called chi-square:

\chi^{2}(\mathbf{a})
  =\sum_{i=1}^{N} \left[\frac{y_i-y(x_i;\mathbf{a})}{\sigma_i}\right]^{2}
  =\sum_{i=1}^{N} w_{i}\left[y_{i}-y(x_{i};\mathbf{a})\right]^{2}

Weights are based on standard deviations, w_i=1/\sigma_i^2. You can learn why squares of residuals are minimized e.g. from chapter 15.1 of Numerical Recipes.

The most popular method for curve-fitting is Levenberg-Marquardt. Fityk can also use a few general-purpose optimization methods. These methods are slower, some of them are orders of magnitude slower. Sometimes alternative methods find global minimum when the L-M algorithm is stuck in a local minimum, but in majority of cases the default L-M method is superior.

Uncertainty of Parameters

(It is easier for me to find a quote than to express it myself).

From the book J. Wolberg, Data Analysis Using the Method of Least Squares: Extracting the Most Information from Experiments, Springer, 2006, p.50:

(…) we turn to the task of determining the uncertainties associated with the a_k‘s. The usual measures of uncertainty are standard deviation (i.e., σ) or variance (i.e., σ2) so we seek an expression that allows us to estimate the \sigma_{a_k}‘s. It can be shown (…) that the following expression gives us an unbiased estimate of \sigma_{a_k}:

\sigma_{a_k}^{2}=\frac{S}{n-p}C_{kk}^{-1}

Note that \sigma_{a_k} is a square root of the value above. In this formula n-p, the number of (active) data points minus the number of independent parameters, is equal to the number of degrees of freedom. S is another symbol for \chi^2.

Terms of the C matrix are given as (p. 47 in the same book):

C_{jk}=\sum_{i=1}^n w_i \frac{\partial f}{\partial a_j} \frac{\partial f}{\partial a_k}

\sigma_{a_k} above is often called a standard error. Having standard errors, it is easy to calculate confidence intervals. But all these values should be used with care. Now another book will be cited: H. Motulsky and A. Christopoulos, Fitting Models to Biological Data Using Linear and Nonlinear Regression: A Practical Guide to Curve Fitting, Oxford University Press, 2004. This book can be downloaded for free as a manual to GraphPad Prism 4.

The standard errors reported by most nonlinear regression programs (…) are “approximate” or “asymptotic”. Accordingly, the confidence intervals computed using these errors should also be considered approximate.

It would be a mistake to assume that the “95% confidence intervals” reported by nonlinear regression have exactly a 95% chance of enclosing the true parameter values. The chance that the true value of the parameter is within the reported confidence interval may not be exactly 95%. Even so, the asymptotic confidence intervals will give you a good sense of how precisely you have determined the value of the parameter.

The calculations only work if nonlinear regression has converged on a sensible fit. If the regression converged on a false minimum, then the sum-of-squares as well as the parameter values will be wrong, so the reported standard error and confidence intervals won’t be helpful.

Bound Constraints

Simple-variables can have a domain. Fitting method mpfit (Lev-Mar implementation) and the methods from the NLOpt library use domains to constrain the parameters – they never let the parameters go outside of the domain during fitting.

In the literature, bound constraints are also called box constraints or, more generally, inequality constraints. Now a quotation discouraging the use of constraints. Peter Gans, Data Fitting in the Chemical Sciences by the Method of Least Squares, John Wiley & Sons, 1992, chapter 5.2.2:

Before looking at ways of dealing with inequality constraints we must ask a fundamental question: are they necessary? In the physical sciences and in least-squares minimizations in particular, inequality constraints are not always justified. The most common inequality constraint is that some number that relates to a physical quantity should be positive, pj > 0. If an unconstrained minimalization leads to a negative value, what are we to conclude? There are three possibilities; (a) the refinement has converged to a false minimum; (b) the model is wrong; (c) the parameter is not well defined by the data and is not significantly different from zero. In each of these three cases a remedy is at hand that does not involve constrained minimization: (a) start the refinement from good first estimates of the parameters; (b) change the model; (c) improve the quality of the data by further experimental work. If none of these remedies cure the problem of non-negativity constraints, then something is seriously wrong with the patient, and constrained minimization will probably not help.

Setting the domain is described in the section Domains.

For a convenience, the box_constraints option can globally disable (and re-enable) the constraints.

Levenberg-Marquardt

This is a standard nonlinear least-squares routine, and involves computing the first derivatives of functions. For a description of the algorithm see Numerical Recipes, chapter 15.5 or Siegmund Brandt, Data Analysis, chapter 10.15. Essentially, it combines an inverse-Hessian method with a steepest descent method by introducing a λ factor. When λ is equal to 0, the method is equivalent to the inverse-Hessian method. When λ increases, the shift vector is rotated toward the direction of steepest descent and the length of the shift vector decreases. (The shift vector is a vector that is added to the parameter vector.) If a better fit is found on iteration, λ is decreased.

Two implementation of this method are available: one from the MPFIT library, based on the old good MINPACK code (default method since ver. 1.3.0), and a custom implementation (default method in earlier fityk versions).

To switch between the two implementation use command:

set fitting_method = mpfit               # switch to MPFIT
set fitting_method = levenberg_marquardt # switch to fityk implem. of L-M

The following stopping criteria are available for mpfit:

  • the relative change of WSSR is smaller than the value of the ftol_rel option (default: 10^-10),
  • the relative change of parameters is smaller than the value of the xtol_rel option (default: 10^-10),

and for levenberg_marquardt:

  • the relative change of WSSR is smaller than the value of the lm_stop_rel_change option twice in row,
  • λ is greater than the value of the lm_max_lambda option (default: 10^15), which normally means WSSR is not changing due to limited numerical precision.

Nelder-Mead Downhill Simplex

To quote chapter 4.8.3, p. 86 of Peter Gans, Data Fitting in the Chemical Sciences by the Method of Least Squares:

A simplex is a geometrical entity that has n+1 vertices corresponding to variations in n parameters. For two parameters the simplex is a triangle, for three parameters the simplex is a tetrahedron and so forth. The value of the objective function is calculated at each of the vertices. An iteration consists of the following process. Locate the vertex with the highest value of the objective function and replace this vertex by one lying on the line between it and the centroid of the other vertices. Four possible replacements can be considered, which I call contraction, short reflection, reflection and expansion.[…] It starts with an arbitrary simplex. Neither the shape nor position of this are critically important, except insofar as it may determine which one of a set of multiple minima will be reached. The simplex than expands and contracts as required in order to locate a valley if one exists. Then the size and shape of the simplex is adjusted so that progress may be made towards the minimum. Note particularly that if a pair of parameters are highly correlated, both will be simultaneously adjusted in about the correct proportion, as the shape of the simplex is adapted to the local contours.[…] Unfortunately it does not provide estimates of the parameter errors, etc. It is therefore to be recommended as a method for obtaining initial parameter estimates that can be used in the standard least squares method.

This method is also described in previously mentioned Numerical Recipes (chapter 10.4) and Data Analysis (chapter 10.8).

There are a few options for tuning this method. One of these is a stopping criterium nm_convergence. If the value of the expression 2(Mm)/(M+m), where M and m are the values of the worst and best vertices respectively (values of objective functions of vertices, to be precise!), is smaller then the value of nm_convergence option, fitting is stopped. In other words, fitting is stopped if all vertices are almost at the same level.

The remaining options are related to initialization of the simplex. Before starting iterations, we have to choose a set of points in space of the parameters, called vertices. Unless the option nm_move_all is set, one of these points will be the current point – values that parameters have at this moment. All but this one are drawn as follows: each parameter of each vertex is drawn separately. It is drawn from a distribution that has its center in the center of the domain of the parameter, and a width proportional to both width of the domain and value of the nm_move_factor parameter. Distribution shape can be set using the option nm_distribution as one of: uniform, gaussian, lorentzian and bound. The last one causes the value of the parameter to be either the greatest or smallest value in the domain of the parameter – one of the two bounds of the domain (assuming that nm_move_factor is equal 1).

NLopt

A few methods from the NLopt library are available:

  • nlopt_nm – Nelder-Mead method, similar to the one described above,
  • nlopt_lbfgs – low-storage BFGS,
  • nlopt_var2 – shifted limited-memory variable-metric,
  • nlopt_praxis – PRAXIS (PRincipal AXIS),
  • nlopt_bobyqa – BOBYQA,
  • nlopt_sbplx – Sbplx (based on Subplex),

All NLopt methods have the same stopping criteria (in addition to the common criteria):

  • an optimization step changes the WSSR value by less than the value of the ftol_rel option (default: 10^-10) multiplied by the WSSR,
  • an optimization step changes every parameter by less than the value of the xtol_rel option (default: 10^-10) multiplied by the absolute value of the parameter.

Scripts

Working with Scripts

Fityk can run two kinds of scripts:

  • Fityk scripts composed of the commands described in previous sections,
  • and Lua scripts (extension .lua), in the Lua language.

Scripts are executed using the exec command:

exec file1.fit
exec file2.lua
exec file3.fit.gz  # read script compressed with gzip

Note

Fityk can save its state to a script (info state > file.fit). It can also save all commands executed (directly or via GUI) in the session to a script (info history > file.fit).

Embedded Lua interpreter can execute any program in Lua 5.2. One-liners can be run with command lua:

=-> lua print(_VERSION)
Lua 5.1
=-> lua print(os.date("Today is %A."))
Today is Thursday.
=-> lua for n,f in F:all_functions() do print(n, f, f:get_template_name()) end
0       %_1     Constant
1       %_2     Cycle

(The Lua print function in fityk is redefined to show the output in the GUI instead of writing to stdout).

Like in the Lua interpreter, = at the beginning of line can be used to save some typing:

=-> = os.date("Today is %A.")
Today is Thursday.

Similarly, exec= also interprets the rest of line as Lua expressions, but this time the resulting string is executed as a fityk command:

=-> = string.format("fit @%d", math.random(0,5))
fit @4
=-> exec= string.format("fit @%d", math.random(0,5))
# fitting random dataset (useless example)

The embedded Lua interpreter interacts with the rest of the program through the global object F:

=-> = F:get_info("version")
Fityk 1.2.1

All methods of F are documented in the section Fityk library API.

A few more examples.

Let’s say that we work with a number of datasets, and for each of them we want to save output of the info peaks command to a file named original-data-filename.out. This can be done in one line:

=-> @*: lua F:execute("info peaks >'%s.out'" % F:get_info("filename"))

Now a more complex script that would need to be put into a file (with extension .lua) and run with exec. :

-- load data from files file01.dat, file02.dat, ... file13.dat
for i=1,13 do
    F:execute("@+ < file%02d.dat:0:1::" % i)
end

-- print some statistics about the loaded data
n = F:get_dataset_count()
print(n .. " datasets loaded.")

total_max_y = 0
for i=0, n-1 do
    max_y = F:calculate_expr("max(y)", i)
    if max_y > total_max_y then
        total_max_y = max_y
    end
end
print("The largest y: " .. total_max_y)

If a fityk command executed from Lua script fails, the whole script is stopped, unless you catch the error:

-- wrap F:execute() in pcall to handle possible errors
status, err = pcall(function() F:execute("fit") end)
if status == false then
    print("Error: " .. err)
end

The Lua interpreter was added in ver. 1.0.3. If you need help with writing Lua scripts - feel free to ask. Usage scenarios give us a better idea what functions should be available from the Lua interface.

Fityk also has a simple mechanism to interact with external programs. It is useful mostly on Unix systems. ! runs a program, exec! runs a program, reads its standard output and executes it as a Fityk script. Here is an example of using Unix utilties echo, ls and head to load the newest CIF file from the current directory:

=-> ! pwd
/home/wojdyr/fityk/data
=-> ! ls -t *.cif | head -1
lab6_3-2610-q.cif
=-> exec! echo "@+ < $(ls -t *.cif | head -1)"
> @+ < lab6_3-2610-q.cif
2300 points. No explicit std. dev. Set as sqrt(y)

Fityk DSL

As was described in Command Line, each line has a syntax:

[[@…:] [with …] command [“;” command]…] [#comment]

The datasets listed before the colon (:) make a foreach loop. Here is a silly example:

=-> $a=0
=-> @0 @0 @0: $a={$a+1}; print $a
1
2
3

Command that follows the colon is run for each specified dataset in the context of that dataset. This is to say that:

=-> @2 @4: guess Voigt

is equivalent to:

=-> use @2
=-> guess Voigt
=-> use @4
=-> guess Voigt

(except that the latter sets permenently default dataset to @4.

@* stands for all datasets, from @0 to the last one.

Usually, when working with multiple datasets, one executes a command either for a single dataset or for all of them:

=-> @3: guess Voigt  # just for @3
=-> @*: guess Voigt  # for all datasets

The whole line is parsed and partly validated before the execution. This may lead to unexpected errors when the line has multiple semicolon-separated commands:

=-> $a=4; print $a  # print gives unexpected error
Error: undefined variable: $a

=-> $b=2
=-> $b=4; print $b  # $b is already defined at the check time
4

Therefore, it is recommended to have one command in one line.

Grammar

The grammar is expressed in EBNF-like notation:

  • (*this is a comment*)
  • A* means 0 or more occurrences of A.
  • A+ means 1 or more occurrences of A.
  • A % B means A (B A)* and the % operator has the highest precedence. For example: term % "+" comment is the same as term ("+" term)* comment.
  • The colon : in quoted string means that the string can be shortened, e.g. "del:ete" means that any of del, dele, delet and delete can be used.

The functions that can be used in p_expr and v_expr are available here and here, respectively. v_expr contains only a subset of functions from p_expr (partly, because we need to calculate symbolical derivatives of v_expr)

Line structure

line      ::=  [statement] [comment]
statement ::=  [Dataset+ ":"] [with_opts] command % ";"
with_opts ::=  "w:ith" (Lname "=" value) % ","
comment   ::=  "#" AllChars*

Commands

The kCmd* names in the comments correspond to constants in the code.

command ::=  (
             "deb:ug" RestOfLine              | (*kCmdDebug*)
             "def:ine" define                 | (*kCmdDefine*)
             "del:ete" delete                 | (*kCmdDelete*)
             "del:ete" delete_points          | (*kCmdDeleteP*)
             "e:xecute" exec                  | (*kCmdExec*)
             "f:it" fit                       | (*kCmdFit*)
             "g:uess" guess                   | (*kCmdGuess*)
             "i:nfo" info_arg % "," [redir]   | (*kCmdInfo*)
             "l:ua" RestOfLine                | (*kCmdLua*)
             "=" RestOfLine                   | (*kCmdLua*)
             "pl:ot" [range] [range] Dataset* [redir] | (*kCmdPlot*)
             "p:rint" print_args [redir]      | (*kCmdPrint*)
             "quit"                           | (*kCmdQuit*)
             "reset"                          | (*kCmdReset*)
             "s:et" (Lname "=" value) % ","   | (*kCmdSet*)
             "sleep" expr                     | (*kCmdSleep*)
             "title" "=" filename             | (*kCmdTitle*)
             "undef:ine" Uname % ","          | (*kCmdUndef*)
             "use" Dataset                    | (*kCmdUse*)
             "!" RestOfLine                   | (*kCmdShell*)
             Dataset "<" load_arg             | (*kCmdLoad*)
             Dataset "=" dataset_expr         | (*kCmdDatasetTr*)
             Funcname "=" func_rhs            | (*kCmdNameFunc*)
             param_lhs "=" v_expr             | (*kCmdAssignParam*)
             Varname "=" v_expr               | (*kCmdNameVar*)
             Varname "=" "copy" "(" var_id ")" | (*kCmdNameVar*)
             model_id ("="|"+=") model_rhs    | (*kCmdChangeModel*)
             (p_attr "[" expr "]" "=" p_expr) % "," | (*kCmdPointTr*)
             (p_attr "=" p_expr) % ","        | (*kCmdAllPointsTr*)
             "M" "=" expr                     ) (*kCmdResizeP*)

Other rules

define         ::=  Uname "(" (Lname [ "=" v_expr]) % "," ")" "="
                       ( v_expr |
                         component_func % "+" |
                         "x" "<" v_expr "?" component_func ":" component_func
                       )
component_func ::=  Uname "(" v_expr % "," ")"
delete         ::=  (Varname | func_id | Dataset | "file" filename) % ","
delete_points  ::=  "(" p_expr ")"
exec           ::=  filename |
                    "!" RestOfLine |
                    "=" RestOfLine
fit            ::=  [Number] [Dataset*] |
                    "undo" |
                    "redo" |
                    "history" Number |
                    "clear_history"
guess          ::=  [Funcname "="] Uname ["(" (Lname "=" v_expr) % "," ")"] [range]
info_arg       ::=  ...TODO
print_args     ::=  [("all" | ("if" p_expr ":")]
                    (p_expr | QuotedString | "title" | "filename") % ","
redir          ::=  (">"|">>") filename
value          ::=  (Lname | QuotedString | expr) (*value type depends on the option*)
model_rhs      ::=  "0" |
                    func_id |
                    func_rhs |
                    model_id |
                    "copy" "(" model_id ")"
func_rhs       ::=  Uname "(" ([Lname "="] v_expr) % "," ")" |
                    "copy" "(" func_id ")"
load_arg       ::=  filename Lname* |
                    "."
p_attr         ::=  ("X" | "Y" | "S" | "A")
model_id       ::=  [Dataset "."] ("F"|"Z")
func_id        ::=  Funcname |
                    model_id "[" Number "]"
param_lhs      ::=  Funcname "." Lname |
                    model_id "[" (Number | "*") "]" "." Lname
var_id         ::=  Varname |
                    func_id "." Lname
range          ::=  "[" [expr] ":" [expr] "]"
filename       ::=  QuotedString | NonblankString

Mathematical expressions

expr        ::=  expr_or ? expr_or : expr_or
expr_or     ::=  expr_and % "or"
expr_and    ::=  expr_not % "and"
expr_not    ::=  "not" expr_not | comparison
comparison  ::=  arith % ("<"|">"|"=="|">="|"<="|"!=")
arith       ::=  term % ("+"|"-")
term        ::=  factor % ("*"|"/")
factor      ::=  ('+'|'-') factor | power
power       ::=  atom ['**' factor]
atom        ::=  Number | "true" | "false" | "pi" |
                 math_func | braced_expr | ?others?
math_func   ::=  "sqrt" "(" expr ")" |
                 "gamma" "(" expr ")" |
                  ...
braced_expr ::=  "{" [Dataset+ ":"] p_expr "}"

The atom rule also accepts some fityk expressions, such as $variable, %function.parameter, %function(expr), etc.

p_expr and v_expr are similar to expr, but they use additional variables in the atom rule.

p_expr recognizes n, M, x, y, s, a, X, Y, S and A. All of them but n and M can be indexed (e.g. x[4]). Example: (x+x[n-1])/2.

v_expr uses all unknown names (Lname) as variables (example: a+b*x^2). Only a subset of functions (math_func) from expr is supported. The tilde (~) can be used to create simple-variables (~5), optionally with a domain in square brackets (~5[1:6]).

Since v_expr is used to define variables and user-defined functions, the program calculates symbolically derivatives of v_expr. That is why not all the function from expr are supported (they may be added in the future).

dataset_expr supports very limited set of operators and a few functions that take Dataset token as argument (example: @0 - shirley_bg(@0)).

Lexer

Below, some of the tokens produced by the fityk lexer are defined.

The lexer is context-dependend: NonblankString and RestOfLine are produced only when they are expected in the grammar.

Uname is used only for function types (Gaussian) and pseudo-parameters (%f.Area).

Dataset        ::=  "@"(Digit+|"+"|"*")
Varname        ::=  "$" Lname
Funcname       ::=  "%" Lname
QuotedString   ::=  "'" (AllChars - "'")* "'"
Lname          ::=  (LowerCase | "_") (LowerCase | Digit | "_")*
Uname          ::=  UpperCase AlphaNum+
Number         ::=  ?number read by strtod()?
NonblankString ::=  (AllChars - (WhiteSpace | ";" | "#" ))*
RestOfLine     ::=  AllChars*

Fityk library API

Fityk comes with embedded Lua interpreter and this language is used in this section. The API for other supported languages is similar. Lua communicates with Fityk using object F of type Fityk. To call the methods listed below use F:method(), for example F:get_dof() (not Fityk.get_dof()).

Note

Other supported languages include C++, C, Python, Perl, Ruby and Java. Except for C, all APIs are similar.

Unlike in built-in Lua, in other cases it is necessary to create an instance of the Fityk class first. Then you use this object in the same way as F is used below.

The fityk.h header file is the best reference. Additionally, C++ and Python have access to functions from the ui_api.h header. These functions are used in command line versions of fityk (cfityk or its equivalent – samples/cfityk.py).

Examples of scripts in all the listed languages and in the samples directory.

Here is the most general function:

Fityk.execute(cmd)

Executes a fityk command. Example: F:execute("fit").

The % operator for the string type is pre-set to support Python-like formatting:

= "%d pigs" % 3
= "%d %s" % {3, "pigs"}

Input / output

Fityk.input(prompt)

Query user. In the CLI user is asked for input in the command line, and in the GUI in a pop-up box. As a special case, if the prompt contains string “[y/n]” the GUI shows Yes/No buttons instead of text entry.

Example: TODO

Fityk.out(s)

Print string in the output area. The print() function in built-in Lua is redefined to do the same.

Settings

Fityk.set_option_as_string(opt, val)

Set option opt to value val. Equivalent of fityk command set opt=val.

Fityk.set_option_as_number(opt, val)

Set option opt to numeric value val.

Fityk.get_option_as_string(opt)

Returns value of opt (string).

Fityk.get_option_as_number(opt)

Returns value of opt (real number).

Data

Fityk.load(spec[, d])

Load data to @*d* slot. The first argument is either a string with path or LoadSpec struct that apart from the path has also the following optional members: x_col, y_col, sig_col, blocks, format, options. The meaning of these parameters is the same as described in Loading Data.

For example, due to limitations of the Fityk DSL a file with the ' character in the path must be loaded through Lua:

lua F:load([[Kat's file.dat]])

LoadSpec is used to specify also format of the file, columns, etc:

spec = fityk.LoadSpec('my.csv')
spec.x_col = 1
spec.y_col = 3
spec.format = 'csv'
spec.options = 'decimal_comma'
F:load(spec)
Fityk.load_data(d, xx, yy, sigmas[, title])

Load data to @*d* slot. xx and yy must be numeric arrays of the same size, sigmas must either be empty or have the same size. title is an optional data title (string).

Fityk.add_point(x, y, sigma[, d])

Add one data point ((x, y) with std. dev. set to sigma) to an existing dataset d. If d is not specified, the default dataset is used.

Example: F:add_point(30, 7.5, 1).

Fityk.get_dataset_count()

Returns number of datasets (n >= 1).

Fityk.get_default_dataset()

Returns default dataset. Default dataset is set by the “use @n” command.

Fityk.get_data([d])

Returns points for dataset d.

  • in C++ – returns vector<Point>
  • in Lua – userdata with array-like methods, indexed from 0.

Each point has 4 properties: x, y, sigma (real numbers) and is_active (bool).

Example:

points = F:get_data()
for i = 0, #points-1 do
    p = points[i]
    if p.is_active then
        print(i, p.x, p.y, p.sigma)
    end
end
1       4.24    1.06    1
2       6.73    1.39    1
3       8.8     1.61    1
...

General Info

Fityk.get_info(s[, d])

Returns output of the fityk info command as a string. If d is not specified, the default dataset is used (the dataset is relevant for few arguments of the info command).

Example: F:get_info("history") – returns a multiline string containing all fityk commands issued in this session.

Fityk.calculate_expr(s[, d])

Returns output of the fityk print command as a number. If d is not specified, the default dataset is used.

Example: F:calculate_expr("argmax(y)", 0).

Fityk.get_view_boundary(side)

Get coordinates of the plotted rectangle, which is set by the plot command. Return numeric value corresponding to given side, which should be a letter L(eft), R(ight), T(op) or B(ottom).

Model info

Fityk.get_parameter_count()

Returns number of simple-variables (parameters that can be fitted)

Fityk.all_parameters()

Returns array of simple-variables.

  • in C++ – vector<double>
  • in Lua – userdata with array-like methods, indexed from 0.
Fityk.all_variables()

Returns array of all defined variables.

  • in C++ – vector<Var*>
  • in Lua – userdata with array-like methods, indexed from 0.

Example:

variables = F:all_variables()
for i = 0, #variables-1 do
    v = variables[i]
    print(i, v.name, v:value(), v.domain.lo, v.domain.hi,
          v:gpos(), v:is_simple())
end

Var.is_simple() returns true for simple-variables.

Var.gpos() returns position of the variable in the global array of parameters (Fityk.all_parameters()), or -1 for compound variables.

Fityk.get_variable(name)

Returns variable $name.

Fityk.all_functions()

Returns array of functions.

  • in C++ – vector<Func*>
  • in Lua – userdata with array-like methods, indexed from 0.

Example:

f = F:all_functions()[0] -- first functions
print(f.name, f:get_template_name())          -- _1        Gaussian
print(f:get_param(0), f:get_param(1))         -- height  center
print("$" .. f:var_name("height"))            -- $_4
print("center:", f:get_param_value("center")) -- center: 24.72235945525
print("f(25)=", f:value_at(25))               -- f(25)=  4386.95533969
Fityk.get_function(name)

Return the function with given name, or NULL if there is no such function.

Example:

f = F:get_function("_1")
print("f(25)=", f:value_at(25))               -- f(25)=  4386.95533969
Fityk.get_components(d[, fz])

Returns %functions used in dataset d. If fz is Z, returns zero-shift functions.

Example:

func = F:get_components(1)[3] -- get 4th (index 3) function in @1
print(func)                   -- <Func %_6>
vname = func:var_name("hwhm")
print(vname)                  -- _21
v = get_variable(vname)
print(v, v:value())           -- <Var $_21>       0.1406587
Fityk.get_model_value(x[, d])

Returns the value of the model for dataset @d at x.

Fit statistics

Fityk.get_wssr([d])

Returns WSSR (weighted sum of squared residuals).

Fityk.get_ssr([d])

Returns SSR (sum of squared residuals).

Fityk.get_rsquared([d])

Returns R-squared.

Fityk.get_dof([d])

Returns the number of degrees of freedom (#points - #parameters).

Fityk.get_covariance_matrix([d])

Returns covariance matrix.

Examples in Lua

Show how the peak center moves between datasets:

-- file list-max.lua
prev_x = nil
for n = 0, F:get_dataset_count()-1 do
    local path = F:get_info("filename", n)
    local filename = string.match(path, "[^/\\]+$") or ""
    -- local x = F:calculate_expr("argmax(y)", n)
    local x = F:calculate_expr("F[0].center", n)
    s = string.format("%s: max at x=%.4f", filename, x)
    if prev_x ~= nil then
        s = s .. string.format("  (%+.4f)", x-prev_x)
    end
    prev_x = x
    print(s)
end
=-> exec list-max.lua
frame-000.dat: max at x=-0.0197
frame-001.dat: max at x=-0.0209  (-0.0012)
frame-002.dat: max at x=-0.0216  (-0.0007)
frame-003.dat: max at x=-0.0224  (-0.0008)

Write to file values of the model F(x) at chosen x’s (in this example x = 0, 1.5, 3, … 150):

-- file tabular-f.lua
file = io.open("output.dat", "w")
for x = 0, 150, 1.5 do
    file:write(string.format("%g\t%g\n", x, F:get_model_value(x)))
end
file:close()
=-> exec tabular-f.lua
=-> !head -5 output.dat
0       12.1761
1.5     12.3004
3       10.9096
4.5     9.12635
6       8.27044

All the Rest

Settings

The syntax is simple:

  • set option = value changes the option,
  • info set option shows the current value,
  • info set lists all available options.

In the GUI

the options can be set in a dialog (Session ‣ Settings).

The GUI configuration (colors, fonts, etc.) is changed in a different way (GUI ‣ …) and is not covered here.

It is possible to change the value of the option temporarily:

with option1=value1 [,option2=value2]  command args...

For example:

info set fitting_method  # show the current fitting method
set fitting_method = nelder_mead_simplex # change the method
# change the method only for this one fit command
with fitting_method = levenberg_marquardt fit
# and now the default method is back Nelder-Mead

# multiple comma-separated options can be given
with fitting_method=levenberg_marquardt, verbosity=quiet fit

The list of available options:

autoplot
See autoplot.
cwd
Current working directory or empty string if it was not set explicitely. Affects relative paths.
default_sigma
Default y standard deviation. See Standard Deviation (or Weight). Possible values: sqrt max(y1/2, 1) and one (1).
domain_percent
See the section about variables.
epsilon
The ε value used to test floating-point numbers a and b for equality (it is well known that due to rounding errors the equality test for two numbers should have some tolerance, and the tolerance should be tailored to the application): |a−b| < ε. Default value: 10-12. You may need to decrease it when working with very small numbers.
fit_replot
Refresh the plot when fitting (0/1).
fitting_method
See Fitting Related Commands.
function_cutoff
See description in the chapter about model.
height_correction
See Guessing Initial Parameters.
lm_*
Setting to tune the Levenberg-Marquardt fitting method.
logfile
String. File where the commands are logged. Empty – no logging.
log_output
When logfile is set, log output together with input (0/1).
max_fitting_time
Stop fitting when this number of seconds of processor time is exceeded. See Fitting Related Commands.
max_wssr_evaluations
See Fitting Related Commands.
nm_*
Setting to tune the Nelder-Mead downhill simplex fitting method.
numeric_format
Format of numbers printed by the info command. It takes as a value a format string, the same as sprintf() in the C language. For example set numeric_format='%.3f' changes the precision of numbers to 3 digits after the decimal point. Default value: %g.
on_error
Action performed on error. If the option is set to stop (default) and the error happens in script, the script is stopped. Other possible values are nothing (do nothing) and exit (finish program – ensures that no error can be overlooked).
pseudo_random_seed
Some fitting methods and functions, such as randnormal in data expressions use a pseudo-random number generator. In some situations one may want to have repeatable and predictable results of the fitting, e.g. to make a presentation. Seed for a new sequence of pseudo-random numbers can be set using the option pseudo_random_seed. If it is set to 0, the seed is based on the current time and a sequence of pseudo-random numbers is different each time.
refresh_period
During time-consuming computations (like fitting) user interface can remain not changed for this time (in seconds). This option was introduced, because on one hand frequent refreshing of the program’s window notably slows down fitting, and on the other hand irresponsive program is a frustrating experience.
verbosity
Possible values: -1 (silent), 0 (normal), 1 (verbose), 2 (very verbose).
width_correction
See Guessing Initial Parameters.

Data View

The command plot controls the region of the graph that is displayed:

plot [[xrange] yrange] [@n, ...]

xrange and yrange has syntax [min:max]. If the boundaries are skipped, they are automatically determined using the given datasets.

In the GUI

there is hardly ever a need to use this command directly.

The CLI version on Unix systems visualizes the data using the gnuplot program, which has similar syntax for the plot range.

Examples:

plot [20.4:50] [10:20] # show x from 20.4 to 50 and y from 10 to 20
plot [20.4:] # x from 20.4 to the end,
             # y range will be adjusted to encompass all data
plot         # all data will be shown

The values of the options autoplot and fit_replot change the automatic plotting behaviour. By default, the plot is refreshed automatically after changing the data or the model (autoplot=1). It is also possible to replot the model when fitting, to show the progress (see the options fit_replot and refresh_period).

Redirecting the plot command to a file saves a plot as an image:

plot [20.4:50] [10:20] > myplot.png

For now, it works only in fityk (not cfityk) and is less flexible than Session ‣ Save as Image.

Information Display

First, there is an option verbosity which sets the amount of messages displayed when executing commands.

There are three commands that print explicitely requested information:

  • info – used to show preformatted information
  • print – mainly used to output numbers (expression values)
  • debug – used for testing the program itself

The output of info and print can be redirected to a file:

info args > filename    # truncate the file
info args >> filename   # append to the file
info args > 'filename'  # the filename can (and sometimes must) be in quotes

The redirection can create a file, so there is also a command to delete it:

delete file filename

info

The following info arguments are recognized:

  • TypeName – definition
  • $variable_name – formula and value
  • %function_name – formula
  • F – the list of functions in F
  • Z – the list of functions in Z
  • compiler – options used when compiling the program
  • confidence level @n – confidence limits for given confidence level
  • cov @n – covariance matrix
  • data – number of points, data filename and title
  • dataset_count – number of datasets
  • errors @n – estimated uncertainties of parameters
  • filename – dataset filename
  • fit – goodness of fit
  • fit_history – info about recorded parameter sets
  • formula – full formula of the model
  • functions – the list of %functions
  • gnuplot_formula – full formula of the model, gnuplot style
  • guess – peak-detection and linear regression info
  • guess [from:to] – the same, but in the given range
  • history – the list of all the command issued in this session
  • history [m:n] – selected commands from the history
  • history_summary – the summary of command history
  • models – script that re-constructs all variables, functions and models
  • peaks – formatted list of parameters of functions in F.
  • peaks_err – the same as peaks + uncertainties
  • prop %function_name – parameters of the function
  • refs $variable_name – references to the variable
  • set – the list of settings
  • set option – the current value of the option
  • simplified_formula – simplified formula
  • simplified_gnuplot_formula – simplified formula, gnuplot style
  • state – generates a script that can reproduce the current state of the program. The scripts embeds all datasets.
  • title – dataset title
  • types – the list of function types
  • variables – the list of variables
  • version – version number
  • view – boundaries of the visualized rectangle

Both info state and info history can be used to restore the current session.

In the GUI

Session ‣ Save State and Session ‣ Save History.

print

The print command is followed by a comma-separated list of expressions and/or strings:

=-> p pi, pi^2, pi^3
3.14159 9.8696 31.0063
=-> with numeric_format='%.15f' print pi
3.141592653589793
=-> p '2+3 =', 2+3
2+3 = 5

The other valid arguments are filename and title. They are useful for listing the same values for multiple datasets, e.g.:

=-> @*: print filename, F[0].area, F[0].area.error

print can also print a list where each line corresponds to one data point, as described in the section Exporting Data.

As an exception, print expression > filename does not work if the filename is not enclosed in single quotes. That is because the parser interprets > as a part of the expression. Just use quotes (print 2+3 > 'tmp.dat').

debug

Only a few debug sub-commands are documented here:

  • der mathematic-function – shows derivatives:

    =-> debug der sin(a) + 3*exp(b/a)
    f(a, b) = sin(a)+3*exp(b/a)
    df / d a = cos(a)-3*exp(b/a)*b/a^2
    df / d b = 3*exp(b/a)/a
    
  • df x – compares the symbolic and numerical derivatives of F in x.

  • lex command – the list of tokens from the Fityk lexer

  • parse command – show the command as stored after parsing

  • expr expression – VM code from the expression

  • rd – derivatives for all variables

  • %function – bytecode, if available

  • $variable – derivatives

Other Commands

  • reset – reset the session
  • sleep sec – makes the program wait sec seconds.
  • quit – works as expected; if it is found in a script it quits the program, not only the script.
  • ! – commands that start with ! are passed (without the !) to the system() call (i.e. to the operating system).

Starting fityk and cfityk

On startup, the program runs a script from the $HOME/.fityk/init file (on MS Windows XP: C:\Documents and Settings\USERNAME\.fityk\init). Following this, the program executes command passed with the --cmd option, if given, and processes command line arguments:

  • if the argument starts with =->, the string following =-> is regarded as a command and executed (otherwise, it is regarded as a filename),
  • if the filename has extension “.fit” or the file begins with a “# Fityk” string, it is assumed to be a script and is executed,
  • otherwise, it is assumed to be a data file; columns and data blocks can be specified in the normal way, see Loading Data.

There are also other parameters to the CLI and GUI versions of the program. Option “-h” (“/h” on MS Windows) gives the full listing:

$ fityk -h
Usage: fityk [-h] [-V] [--full-version] [-c <str>] [-g <str>] [-I] [-r] [script or data file...]
  -h, --help        	show this help message
  -V, --version     	output version information and exit
  --full-version    	print version with additional info and exit
  -c, --cmd=<str>   	script passed in as string
  -g, --config=<str>	choose GUI configuration
  -I, --no-init     	don't process $HOME/.fityk/init file
  -r, --reorder     	reorder data (50.xy before 100.xy)

$ cfityk -h
Usage: cfityk [-h] [-V] [-c <str>] [script or data file...]
  -h, --help            show this help message
  -V, --version         output version information and exit
  -c, --cmd=<str>       script passed in as string
  -I, --no-init         don't process $HOME/.fityk/init file
  -n, --no-plot         disable plotting (gnuplot)
  -q, --quit            don't enter interactive shell

The example of non-interactive using CLI version on Linux:

wojdyr@ubu:~/foo$ ls *.rdf
dat_a.rdf  dat_r.rdf  out.rdf
wojdyr@ubu:~/foo$ cfityk -q -I "=-> set verbosity=-1, autoplot=0" \
> *.rdf "=-> @*: print min(x if y > 0)"
in @0 dat_a: 1.8875
in @1 dat_r: 1.5105
in @2 out: 1.8305
PK4;M﮸m/m/fityk-latest/index.html Contents — Fityk 1.3.1 manual
PK4;MRvkk&fityk-latest/_images/copyfunc_icon.pngPNG  IHDRשsRGB pHYsttfxtIMETPLTE  '''(((222333444>>>@@@IIIJJJSSSTTTXRtYSv[[[^^^b[yr}}}}w~~~ɯ .tRNS@fbKGDQi|*IDAT(υZQ 4 V3DPAGb :#caf\8y2&c)`^zÌgKtZo0dLTCD~_xP[`~'N&gAaFbvw ֖R颇1'V_߇DG>k1F"B+ dpW6y]ƿёڝ"՚óNwB!ؤ25(7>oY"{%IENDB`PK4;M{''!fityk-latest/_images/zoom_all.pngPNG  IHDRJ~ssRGBbKGD̿ pHYsttfxtIME 8)IIDAT8˕?kTQ}5_%"b `&&AlSU>AK!"B-ʒdw}ce$`30F,zڋPNE)'T~zi_1kIuIcw$LĜy9fLMi+J, +<q7w-G2 Iˆ 1<jXz|*[.j-RBEu^\鮹1*yd !&-eIMe q Rم-〥¶VZZ-m՘7) X*-<J5,J, qq]u5IR!k۴E0mݲ>AKf^ rcxe/k=(gD^`\IENDB`PK4;M=y**%fityk-latest/_images/eq_fwhm_icon.pngPNG  IHDRY sRGB pHYsttfxtIME".gPLTE1Nk1Nk1NkqtRNSLfЂbKGDf |drIDATc````.@8 )hAY8R U u 06H L (G"HIIL)PN D0 1A`yV DƎFG"V+?PIENDB`PK4;M`\.GG&fityk-latest/_images/eq_shape_icon.pngPNG  IHDRשsRGB pHYsttfxtIME76'PLTE *+ ,#1&4!4H"6J#.:%1=%2>)AY)BZ*7E1Nk9AJCYpHS^Ld~WsXtl{{B'tRNS +-.;<=@ABGILSk~bKGD%IDAT(ϭ1 MmZա0K-B,9$$G"͗-Ux/\5DFl"W "x"V|/c;IU:] es\O:)U8sB |y1eYD)_YaѤ6"VRj> kY?gxDiDͶiZs\ Ѭ`IENDB`PK4;M& U&fityk-latest/_images/strip_bg_icon.pngPNG  IHDRשsRGB pHYsttfxtIME8cPLTE %( L wNNNTQM}zrg¼ĻĸŹŻє tRNS@fbKGD k=IDAT(ϭG1 C% z/,2a^G47J$aI,3-H:JA:q'sND >opv:d<$Haqlt!ۄ0!ILW{#\lOdK # JhތIENDB`PK4;M=%fityk-latest/_images/mode_bg_icon.pngPNG  IHDRY sRGB pHYsttfxtIME:.yPLTEwє (ntRNS@fbKGDhQ`IDAT 0 0?#1rʟm@:)(!!C!J!@!-(耂 =Ͻhg{h}/ .?w +rIENDB`PK4;MN'fityk-latest/_images/load_data_icon.pngPNG  IHDRw=sRGBbKGD pHYsttfxtIME 5o:>AIDATHk\U~d&dlb"-Xŝ`ƕ( /pхQ?Ѕ-B+UVMӚ0!jt$343w|T';_8s=<>s΁]'"|N7WqGloItK~{sދ'3Q O~rl# n@}]pnZ#0 (V'<y wBd< :C&Rnw":s0 6!PRaC6Jiĩgp%r}ұ%?4㥘|21_n&ίNeHC-J1ܬ@myz/Mc-j?cQCIi n|[!b%@ Q(8bXv*xxz?d ;RT~ tCZ-^r8(/&3gҳ< k|;5~#_|,> I6KFV/kY0ax7IDuF|yg 8~`PRJ2Smʻd/aL WU/71gwb"R2=+OQK;{'>b-SAUW%N4"OutsXWaOش8];RCoJ mPK}Q:5Ƹ3y?j[.8cdzN>ZȚ ۩~OF|cef$$YEsUYFvLHO2ny$&@P(0]۞|cKv^AGQ?ydd˹W0%ƯR]ty '7Rc Hr\'nn6TBJ%i9!mҩ1޿#ANn9l:G1~=3vt|;Iߝ"oBLmMs Y C#ϻs%h4CZlgI>M>uyAl M<<!]ΌfIP65NUz::?pM[Fݭ=b]RMxѴ[hB(N#ݒv* 9Ǟl7ܼ 5Qt*ܼ=Jv* 9GdrUYF-igu *@Pf(O=.?"F q{)8'eYFuX: ]^y#)] [wN8D @T C]svĵkh7gcp[`m]mh}E5rzg{׿?lˆ{g0nqrL{]sңht4 `onI'bBwR̛I+/ wzsN9q>ZUsJ|@gh ӧ<į}Qs/SFGh-=iEk//|8w97ܩ /mFFޚp.;Bw*n&Ԍ0(W ZΧi]iĭgO8n-a vv#;Z磬3 뢑4dI-Gs&RjSm=jt[zc +&٨7&ǶH*~1zR}1eO`zz3>PqI.:/89s!tT~ BU0`=FޕT)BBEg5TjUS R|SoTZ5e}׺}fw|Z"c`tQl8}5%o:=Сj̪4cDz XUMvzGr*4 }MS+IiӼ u@>$j^)I3?CDLdNUdd| GMTiM)Kֲ7YyCƺq}PӎatlȈ#IǓ,wٔO?@L13YALFڼhIv EV&*!I ) (!U'}Qjwv;4m[ F Feh& iFwkώ5 LL>3_$?Lˇ;! 5Aw+Bjl" %V/3d YoYY}U[ou)Kv[}K<)\&bPӆh! 27p\g'$ %amnT=$ r;8IOXuWʳuEFVeu5o I7.dd$T9[]~Q$&*nT ITxf#! e.*hBB=#VUyAK l}ƒ%K7hР}ҥKs<,]4O{2!8rQc!qFvZm!rAIr`Ȳb::@gF3|,\?7M(w~ UZv$q| vX2vlӜƪ.gU4+þ7AơSdڱ&I'6/&{1 ID:~?A)[YYvI'67&-wEfP5Mi!i ' | <) MKJ6wl娡6 ǫ#$פ[uff)eGٹK+^fŻP&<3׸bED٦u(Hmޕ"u,c\G#ICt@ 7PgBJ`mOźN-xv'֢wGޚ]ݧWƼz_sL_to֜3uk07h~'&a]KhAǯu gxB GV^B#1 \ #+9Ɨ@ AY"0 3Qk#Vn r[xtaXRJ:̢_ӯ뷢5r kOjJ#ﶎt3$>tlٝ%-vJ2mt BɓbP+žKih|W>U ܋wv $Po@v糬swiK*h%)hUWwkNLq\ _Fn ?6Nߦyvt]nYCT6y}cAE{GIsOՏRґ\$9$@q{zr̷xX:7G `;H6gK_eW} zn@ ;XlR_햴ls@Z@lo,abH!ݢ-1X;ƗJ @Pv>RgqM'k䔎m{AC(FaÆ{˵jv ưaXH!j/|u214,ξ.bL!!1@B^#!y7YQ+}7ӟ#/zmH5~&RI6*HO|?#r߸ư٧pB-9JG\oIIJ!hWiyzU!)$`a&56d3hт))4 ?/4SH33^߫B ;Tv;mIK%5d3u9ׂ=O .s۬]c #ktIR d72|PR҈Ő;xŜJbb*F%2j;^^1H"(i~xƂyh$u,1 *L-*9cqFqx#,L+y[%I7]Cev#Iɤ wO/5`L!>nSvS"-O3&3C%@PZ̛7y\9!yp2Α#G3g(lAtȍ@VAu<湎s}_/u)z~n]xPU[oG- d8OF_)ñ54F7wk0dhuWo o?w[UB_4d<dS/Ov -M/fvfؚmސʳr-ڭ;a1*//rs SV9E]5_IoXR-Aj7ޞNc){<:;Nc*tQm;nxxϺT 6O!Xo!@P(YK3đ"L̂3i*[ t}w\ R_vK@H/eI\r @ r^[&HdPbEz7T*Hʸ{ib,;㷿Njr'm~^ra>/\ǙsG[8rOź@ W#Nyr;!uY@ +oE9"(I9Ta@ @ '#G@ @.5M @ @  pW@ @F#@ @ ا("!@ ?9"@ ?G@ @ )jL|f6Fٽɽ^>@ @#G 1m@{jDHt2c,h5=J:ޥ;EeUokmM:`"eX_^X 6Pw,{SC$e l trM1jD!fЛ5BvWKGF3gER (SSY-LIA06XtN2<_?p˂@ @ 9~\M/!Z埿NbFBɏ?HJm| =~%dbcOsylxo=K6+lnK *`!gy,+XXp߅8$ZR94 _{es H:kh 7+.%..'Op5sjF~}o:u[~ML!%-3;+9dC)>@ K7Ά>oTԘ:Ѽ1+fh,iY㴨L`P0:ݱN L`: y3]㛮Uh/{+ F~Gd^9>nS3eSmLpnKFj׬Ii@^_C}2uFYtN/C-kZR^Z$HAxSSRP0_fWJnf07lHDƧa<0aYy`Vר)vUSpkyWxqe<&s~XX׷]>~$P6nkP9^߹]b Ƽc,^ݎ& Ѩ<1}~ḙNF\94vXeBb?L @ 8҇Ę`cľ'Wƾ2>~~at;F&`wD|U#ݵovKfs>?}i%ǯ\d ~{uGn&˦}x{xڷ?>LO/:;ͣk˱@1rG򡣎zon懃*ھܟZnjU^9z+NX^8F "@ ܣZ_}'Ou@ͦh~?ZaY+u _;~K*zVϢͷU*1*؈A* R-)&6EQ0Fe_j~:Zc3GCyZG T{h(Ά3))Y8O)vp4 Uڄ{8w1RGR߶Ly{kƭ[h6]( $<(sslqlSD2,ۖ{V]ìZc"Tj̓yT\[ݽr{Y94QsyIV\'A zاH^@yZ9LCROs>sEYilLQ[>8-w&b+?dg|DK/:ʸ@ @p/#y#|n8dc,煴]KNUjbQ=8.bL,v?;QS­Fc~Rzc۫ jN:1hu\ IDATZ<)KJJ1h_WCD3 SxtP{ěrx uwfkhxWAͱ|ӯR!>fAQѭqc5*3/*yI r]iQkx񉅔޺ ӟdBl+[&TLSK~qD @ )wWe=/N6ᥐ#|6{'IjœC׸yzqѺel]:nc~<[,۾:=GP\)Or>ٍUc#6;O_n)9*3kؐ Ұa}+h -'cvcʱ1SDb?=R,i-^HG $N VH*4jC!kX $@QeFyi|TFs.@ =+(V⒐*6:'Y+sNǫЏ~&z5M{S(hBgD{{Cpo$'g*J!YY;o'umx4õ=74乡!c$ILs%d %rˇz}&v_#3Siw Ԯ澣1e$fezAhS.)Lh+C0qy1b 7ػ?zU] #>#>#>#>@P*H^°~/3 >vv|hTѬw11o63Vµ?%'茁xwJv[ؿnM/;ϯ|b=>'lCbw9Μ\-3>@o8mzTQԥ|?ĈBٟщ̟zBCD37KF@J|8WN(()Y13+*A^'r)2ǶM70:ɣX)GaL]>H33w<_'Nrt~g,TH'S*v<˩l5eC 2err¸kbY6:Y`}D@ Q}өZd]M4?2u`42to0^|Ѱ\_!A=54sw4U'>Íжc}ik<1'^!mu?o4;xn}ǯRk~AvͶM]fZ }Mƃc^48燏GUC/9 ?:}^cs7ݟүtj@7z9jE/[KSMʲ6!@ ȗ8⬓m2" 0F$HRLoJj*8A1 4_,(6D @ %I8mZf\OT ))hQ2,#ɲ 9jD߾me 1-H`8qb@3Q(( H A F,pYQk4 gb#s͑lH uJ$: 9rgċN7%CQH#A()Dq!@ HMN&22G#/Gez=uգJ{z {(dyp*zߝ)hH"өSg1LY]] Ǖ$8QWcHOZ5K.]R*J8_dl5GG8>B]= S{7t\DˆȑhgbA8m\Kr,v(T|z6Z%xq℻ELnݼA*9c_xb"I]w&-έGSڴm,t҅ R\9, ofϞ=4h]zÇЪu;RSKѷ@p-\"%SϗlJ]be8' n>9o.M+|o!Bfhѣtҕa&/tVjk I;+j UO1qj)Y9S@Pqȹ(O<5 ={c2ذnmb8֑ʷ%(TVK)y7hڼU|g&bhgftMt18Iՙldℋ;9![кuky_K@ر#˖-j\x6dF:} wK(bp$G"aĜأ w;h\+WNӨԶ1&<驅Mqeɓ'|p>`ٳg-[,r !ؘnøǍ.fx53ZkڨY]Ù8V&Z1*Wk~h4;zo))7׹YRZ˗X 6ٳțSf6{֯[ˬ!1!"6r~%8RޥNh5h%s l}|7uĶ- Q(slq߆Y&Ehp̘s\@!qJ0aP2OF4o2߱VZu.^8_[a4j܄Gy{ wwwt:^^^t:j5$=z4T\+/UW͛Ԕ4=FxR&LXd[6Yl$Zn윏)51ONAY,_hU~6Ӓ3&ITp?KyQ$'g2JbbbļǗO&q=%}?eÝU*KJ *nLM!G1jqq?Ųt1t>CǢУW_0HrbX*~.ܿ[d\S@mJD܈X*ϵ^O _~Jtt4Ϝv/go(=osԬμK%v.%i@qā^&f9#|~+H8v[~vgۖب4)Suzk*u%[´iӘ6mZ+:GQ#G$?Ɍ&N(\gJUw&ҹ9{{ohԘ֭[ӯ_?<==EQX,j<==aСDFFZ W\.w<|HĂڗ8g>a"7z_6w9./ >LqŋyYp! `ŊՋ6mJf-ؿwwB~4٥Kآ^\hH*%|m_ VǿDݦ;Ic`#}|wQE>qWҟ GIh4h4dYDQgF#&Lw&39p =Z${:wl߷dwپbO޽ۗիW=Aၯ/Hd_tq0xzzRzuγ>z im޼9cF#Νc_`ۃDt SW@Z*VkNܹHեXWƱc/,&ix;ؾ.^^QD (;:.JU8һ-DqLfqcmO|'zAz~S!CgСȲ̐!CP!C`64h#GsNݛ%|F\j3*Xvo-:8/sqmͨ@Jb@} ӮزX-q2y2D3 6䥘et&Z}./IEQPTY:·c08sm;;wرc pɔcg8c˲ly_>۷/Q{*T[ouqfb̘1ꟺӷo_^6@ƣM0QFу`n޸R)) /@pp0>>ֺ:ۥVÔm[rr2~~~YGW^t:~W#GJhZ>Ύkj\zde_ͩy,W7"X47gaYlԙ-g]y,C;EwK&Em[EuoȲLV/k?Gpa6n܈?y}n:[[(nh04KM#~gFk=c]玁<=sbK|}.k)R9E鱄 k#@vܙQha(E^"yPgFR;ͦ |Ҭ<}}cŠML-'￧q.mg5o7Dt;/ բ?@Qr_._LB|,BrJj'L[VTq$f[:} eT҅ T[t6$===ET!աS `o,C94[jMjj*GpIfz:ȑ0aEV\eϣ x]&$$nݺaÆb͋mm$s~N:ufo.UWϋf@h籘 ~7&ܬ yc>I;Km-lDžvR2StCeN$uW^eMM uZFefӿ~ 'y"n?#&{a=iuЗMGypdGx $cO77Ij[<|M{$6<<@LL <ׯϿ@pruJpE[DIrօ] )4~7g`}IBٲu6+y1aG/Gq_ҚOXGUVX%OAYCv)8S<`<ÊU nk{{{ۇgo<7>?1?[qM\ ,%n8^0纚g}(ݾ}{u/CW$:l6Sr,欣,fcU8vns8=C a۶mtСbq'Cl۶=7Æ ~xjذ!FرcLhh(Z._-l[6ȱ-mbѣ>,7)&^$ Gw3/>z ;v`0pg9|0?C#4hPw?ocšT}^5{nQ_cº)׋z1al:7\w:v߿YI9҂}n!1xUz/9>KVn(SP(vniJ:u׸ϼf3*ɜfUqѹzvZM~|){x'Ɠč<օ-wfzxը[wIs9QV{SV]12v>Zn;del?ZUcVԓh{=k<ۮxX:]F0J GL<&OL=8x`ҍr4pjϢط5pƽGpU=ekkbMP #DkW3[[sty~ 7vΧB9/V}Ae,oI( iiUzܘL&BCCqssq<{N M9t`_i;„;;WG;36V3Ͷ u͛7~jP5mƶG\lL?p- zKF}2VwkK,h4%\;[gBDw=vbٲem۶mc۶m̝;77n܈jO6g3b/s_}$ѳgOT*{&&&Xc렠 R/]$t:fVkicX0FL&. N%ݩ 󗾙΢(p5IHHuhZ_q1{EYY>hݩ;UnlAZǚp2WaQN-Ӵys>fbyp$[.MS&'vm*KQE'=k7bC`ў_lŷb[-B2칺Ow|Eu%R8(8/7u\>מWoٰaXu'oufZu\kф>Fd (/-y7@rS 4#0hԙ*;Ǿ} hQP1l| Cbоb:G 8;3sgHo7V͇C>QK?>ݍWM}#H-N%¯/\~ek[XK}+?>[31_ہ}~}0ßg}Lś+as봚gLQ\>KYYM43fX`Ĉxzz2i$}PذMmu#-]ϒ3,y5]l" {`oo;}|r ׏:qw넏3gLeķ6_4:712ɾ:${*4%(6n':7]q` Ijck;a(bwdždYѾyp{`/xjԻ4=}}{)/u)'xRq IDATC*fs'uN#J?BRq ٓ9ٳg '=%ԫ֑|-[$,,Ç?M||@W j9||ҏ[ÁY3(=p'66Eӈ 8aaEJ4 fقRTT:}gLa$((5:#YBK)?EQqLJ,zWi5 u%b|s*P^{}'U`cY j["5 WW"Қ<34FO0sn2UCC0m-"?5HzVr/LSz^gg5ny3׸*U#Ϟ! ,wzj0bWbJčȋ\4f> z,s-m}%~[Vy`^Xs{CEblRޭS:f'~~q~?s#Ƃ!իoA#{tNS%/^bŊ,GuX,L&f~&85Ւŋ\&L余3UɎMq# ˒WSf--6jլG0nСC'V_?bSm6r$66_Ȑ!C$e˖9AaX㏋3i6ľNCQL&S{ⲧy3!Cжm[ׯC=;IIIx/$I"!!JoŞuq1}]mV w 5 E?&=}Cҵ_QyT!-%e /Ax@$L&_;>n6=! zh ,(XX(ĂQ| H @ }f7Kz|>̹̽3ss ]okGSw+?=E1tP:uDf8HNN۷o6ΜΠglX;SdE7Ɯ3#ºя'~:߶3o<O*۳眈#z̬G\"^Ǿ GƴlلfЄ NQտ^qi<t_TԞ+ $Uy868 u-{͵Ɓڨێ\|sKxb1P:P AnLׇ35:u UUX,tA\ەOW_ꏃ…\1thoٲm(rn ܫ Dk"ݝ>֭⚫rF4A ٝ]x+ǖNc-l氮-Ou(Vn}vm?hWy-g $=9_~c/0E`YJ^l.)\[לk<֔.*8{kZ&X~=_8-^QO9syhy?{u˖D|zϯd-qDUU|^}' Vs S;6hvh"."Ơ^ l4ZV1YZ[FfY{'+1sۗ_|>*\necc.bE=;aw' {P~[GGpNxķ5C0ݎNby9{jxkUCM<}vQEaϗ_~g}ƚ5kh׮f|[.x_YK.[o)89&jĻ fƨaa􋻎#bpiڵs2DS|>=Ctj`#uyZ$11Fd>яݻ4cJIގ~~~~ǥXl"őZ4NIM=<Eh-sv6]C)h]ո>jCT~QQ{>u~\%؟\2&0*hmb"C6qgrOwmߵk0fE T*lGè@^Z]v%۔/n$=]b1` h4( u&)c>ӓ*vlj:?7nH󉊊w^FTUu }2d;t&a{a*U%u+FTC,ً@} 4%:P >skp%^ U&/":XoFT`ٌMT;Nb3zjƬa0 Ujb6ӵdmy/lC@3fkim4l,V;*V=+*WW%eZWgҞmb}}MGYhaq8jxIrJNHѣܙ֭[be.q*ыݞ!Cؤg4H밡 Pm{#4krssXjCFnnN ݦzf~gFIVZFqX,7_CKa*9;C(f#vO*)KvO:[Tkʺ ֡|>cn:ΜɤADd^gQ>}ycPݎi=Yf( wu!ǹVU6y\~}1Kq|-ÇҤi3=ƍ#..%Kп|}a-Vez}mpgɒ%qt޽Fqvw 58d>)ұ?0rHP3g^#Gp/5%ZYޠAw5pQ+xŨJ\\z$O?DvGO\f3)BČ(Oq{GϜ9FkV~۟ysҨ;-rwƔӡ TЬr`k,6|`ʔ)7aw#i'VUa[C`w|ƛ)"Su=S0fРAm6,V ˖-EߍԔV+5!9:t PjCi;vqMG:5IK~5rC '#e%%W%L0t%V[˦&踟la_F}MظM,/.uXfM]zt -~Hn|{(ጘ~1A<w!־U{"o&MCt: L+nn~˯~Nmϧ#ˆyCVbٿǏ $4W^ˡ16f77?V-s-7vzOT09={U{@ZBGZW^ba/V(ukVo@^{5}]F#&'9 377W6l+/T%\Gy!, [YJR֝ ɬO5k,iǏW@RQUU]r 999s)Fv1i*e\{F#ݻwW^zSo:q63qDV+9995jyG]ñNW͝;XaIII@a?NƍٷoM4q8y$pԩAn5iz U[9;{gڰYm.j͚5׏{7Wڞ-,#:~Gl/FuAԊיUl\/]x dMt:FR EgXHZ|t&Ϧ9.xX|zMzzk>b @|Ba1-5膱(W@V7kK#2-l{ 7ʀL*=0KĪ?2{6a@Pޙ]O/vM!^7M%0cl0|p>Ād2;Z?ħ]dh:2i«!>wl+KzFWsyCmӉpÇ`4ғb5;o aήS2bu0zhfxS;l U{eF6m\=z{4iC.GҥKgKn^ciE˫\IغzhdM riԎ_Cj8~X ǵ_xޱ'N~w?Y~+0qD|||0 7oFs ^^3gdn5E}l>~ĴɏĽو\ZK*uv]{o?pE{~w짖E^*F~.SaO?q(6>4-ʴixq =ǹپ};'WMg6+aOE8z$eOyUdOqdeeU=Ӓo$"1V{,0cƍݻu-@yϿG_<wp}*Cdd$wt _C !::8Vh]i[˛揤9哸5 `6ݱXm-ΜdΫ+k@ǎԑ핶(Gls=1e=RbޡrJ٣JFV: @$buBծmhhXMfS C!'pH텍Ȑz!dfuG@(>- _TiM-;Ci2Y5Q~í h2ͅ|$&^ۙC )! O>qpYWlψG'p3)qp\Y|ÚoC[a(t'Cs? }1N*tEXX>NJykREr8t aż+d|Ddϡ tz13N1o0RU*N{-\P=O=]]Lm0A~B;)Ѳu7oD`/GPV7s*4McՊdhNX,޽Yfc~*W>@.T(,RQ4iK it>ocDe8y4h]nnM@ĞLئ#D7lTsxn̹C"̞".1L6v>}zXzK$)NnH0ZU5P}> cS w88>EwU{`gg*WCip)݉ +ޗ'~J\ }Vq߬vو5S\?()>Vr[~%m(' gJ ;3goy]|t/^k|_}K{/:E]<[ң+w˗C]W hG>߫e>6oT(>+wX7FuM44*(o6 ᎑r%T{vn/xQ<3D,}Ȥ8iQZ4ӏqqK<ӪԯbSa^nDT4W<9%oel޼6:3y*]c׼V5jDvv6l?.K{4hQ# b1a6[ NaW^nwAQ-Uɂb%ps~[ Ke:nW@իWӯ_?ϟ'~[eN3FuΝ;H%mQqCFA)dga-,~A! 7y걇+gOjdgfߩюEq٥Xx1DFFһw/z+ȐGZ:Bpԫ=_0 @ -.MS0궢t2Ul[}wZj3'ѽ[gX֭]"jerK >?TTĞuw #Ue T8Fa5f.l0_Iɹ|O\JqiҞ~HM-hV+,#O)i g0|zې|h!]LP1=1Fn1 B:1]lJ5vDFEu~^_Kvesɓ1[R6ǏV"@V*lyǬD7<F͛S$6&#HJa@S]|Q̝mtwząjaL[wcD-Elv;qL6 ;1T8*jύ#s)TYaڪXmVv3/o_IrƗL=vVrD39d^pUkxw;\XLvADF7/͊^k*JSH;!/\}phbW(Rm3#e#,RUʓ[U<֔z:tӬ]ܼ||ݟ0~] ϟoB#/ߧN1meIj+qc7̆]>/cɬ\uѧߥ]Ua=B;Rng}Ͻ|AR ;/e8>k׆{-v;"Tޘ#TumNƏѣG9tPԈNs3wyGE}iV+~~~DMƻhDu SLyfc fvL`;D^/X: %pJ$,,#ӧOWʖo`UZ,KYHDF1,p${EQ=@ IDATl ,K뜤W=gS9dDc9L'ҰٔOXx"lBUX|T U?ߚ5qZu?ܩ^"rrr7MYԜ3mU#ɧm.Л+ו\PA=P∳9q|sȗ_99v _~u cYr} ,?@ӦM9tPӶ)5MՓ7!֮[w>'Nv9}=1Ln1aѩh޸5#wlVsλS~HHRnHҨW#Q fEm68o盟Ir8FF7t uy#*8O܂Fhe~1%?8v W.СCg+ ^ =W꾕92?ܸJ*A9čQ]wxޠ~t۷n.QFnD4&{Ğʖsࡥ?{|!2o K *?ϭw=LG \rssyd\4 ȁ f۶UfV,>>T*c38o #*eӮ)U~T=Q I,G)o%iJ_Kʛ6@9_ObΥv۳q.ѓȨr&jrq6mH||<Rђmˊ 8zh~/?_~=P(i&Lg&S3ZgYǟ!ekOqd{}' KoߺwjQ8)ѧiwI8zZmK5:HrRYYYu$t:hӶ QQQlΨ;U**˯{'j2#8881"J@JJ %?/OUm@AAʊiX.o( FQQqDIVSXS~>w&Wj(nUYC=ǂ  Ԫ2>F_|:` T'q˩+BXx8I7$ g@h75bjij^.|SΌ*$"y#   'TxB^Oǎظڵk/jAڿVъ83Ӽy l6yBBHEίѥGqO+   T G qm?֑qĀXi]>KlEQya6&kA_ɂ   BPs,f3Mh5&^_1 |Mʴݦi*6 S#EQBTkK5AAA0T6\rsǺeJ8-rP!   u 8oߞ{#P_K7b kA]Ǟ>yAAAk\C&7j nݗӄmR߂  TV8kjekr*3zƑ!\?4 .P~5 p6r75(yyt%nǢ(@:oa2)7V+( z=*_U}^Mfl6|4 sחd ekGG{>/&a6Mâ(18b4ON*hf2Q`Ɲ|iR |rIN\̈́d ,qWAAlMN˿ս4@ӟUb^99Z*P|G2鐟_ظ4X,4XDN[h6YY46YvVL&.+`fF\6-0ʏ+n皌 B N4hhV&?FDxlod6s3{L48Pl:&efb#f# S3ׄAA[b]:u$4& 5 6qD#a6a%4z{䔘L<<CΜA)lpIv66`G $}FUOSڻff3CϜᯰb{pFJ}^SAnv2cqTkW$+3S*E!8$qmس;YUFEFEC: N0 +ffeZ,mm] u_UL~??6h9/yy9GHƸ*$((:M1*gf:kBC9f4V+}hP jX,ęL |n4.#LJS0T{13 PG܁n]D'=fDUUO`捨v;%*6oDq:XXkCBh}IzX .R{p֒n y 8j4^=l5!!*L&@<6Wî((v]\n7YRm^nǟn00/<g]gsppȹ  u^zZgMOߏ,]NN_mw`Or##A[̜"zpX^=n sŶj4QYRFZrӬ ᤏO7sR˨o^0>oGBPK)   : +Ym|W\W9-8Fs=X'#Ny5ClUX`Z,V+7:1aW|C ^H-&8' B-~0ցjP˞ "EQ4MUN BV}~bVU6~}9C[ýB#dVV,^S9yf p~WZp+" VYQs5 Kuƴf-4ӠM&丂#) ţ'×XkI ]QйmѴrIm  Ƞsč E%7V4s%Qj$+ęRz(VВ8__z-h<8{LbTt:#VGqf p?@SUTM}vKc\A־rOjPw/GgYO{s^^DKEQ] 8UE99=).tyR̬4Q' ^ZA@r/Y٠!cWeW,}%g@VYʶ8Y/AqMł^間S   (__TZEvK#^Gra5&!!\Z!/yyŦYLrϏHxem^->6 .v+3fӧLdbP}~ח75Ϛ8jAAHExS *GJC=w|֟7o6}Lt( ̷b!rN=~>>rG/11gS.ju$ ]mʐv{/0gӖDRl b}p0e_P[},416Oj E.ESK_'W3߸/~QԔw~Jbf ]x?3;HaMvIiJew#0kFIjq`;Wg燰:Oˁ&%"թ#>~/^sDZ/0 య/1gf@9ד΀rztͥDݎVȎn=y Cn.-fBl68☜6΀"n dhl6bc4Y#[縏y롲>t D\~> V|5 ׳ߟ^%P'0K.Aƃa) B{*?u=Ĭ[w}9>cyYq^{Mg;% y+3z_Wof8"屭4A]j#©}'7CzCpw}VW]e˾Bj );Ѵ4ǩQfX:)|]rz618B6Zu:6%`̖ ;ʬݵ( {[x=0OA^iK{K35n4w? ljw&k/`΄Hz/-ƿK1[㙰~:A_`t;^Z?KmĽ ^'tP7l. fm盩]s;S^}||O;ՠ |0;쯃c'h_0'/{e|6؟<䯖t!^z+Dm_4>).]ofOIyZc>೵r3rUc|\,!za=)7/N㮋ꡯ.  #{ɋpy@׺h| n՜zAAydfi+ᶔPW_"^;!+NP +{=,z:+~Ư,]_>Y8#q;^"!-̛47:!;K/ߖ3=~իXE+gAi(v}sK(nCBWsܽ9Mhs/G8chBiAqPyqDh 7Ɲ௹{1iɖ֣I`4_ڍi&OOٓ_xCQ(:SY0xnZラ ?.yb ˝o>[8-ǿ} ݚ+/A HPcA7nss $ƍ pA#.բ|cesCc.G/_>k+ &XIwM VjwUzZK؊hvVc a PmV*͊jC|h"řFl3pHkؼ˷۰kykv:k6Ќ1-} Ӈ%<{20+|]a/ӧ >s8Zδ3YK˒3 '+iцnikeCOE- [_4M?ahBRq B]@z .=DEwA"…/>j^<-7?LŠOTvcXQMg^ 4i'ejv;9()a)W#u if񞂸\=UȼVo~?>Kϰi=cjtD AɅ73[~eқaXʔ?%ij۷oc ջ1/[>,s?5M׉W%m˂ZS  # B)$$$A NQR]cF4]ưЁkx#}{&tQL+[Nǯ%\OA?iz'=A6hyCKKS/pQyyYI+!:c4Q|GChXcbm0Fw1Y'׵v"4BWJ>V}sS3_D _6s۬ $Yqm}h^L[|W<ٴ,=OSm,:/6BS`K>Z*/Aa5 B (`$By0.T~?u;OF'}C%G q&cJGن(D^$1jJD )x|0zDFs݃Z܏lyj]4Z$^IGבϽmhv˟!~kޭ:t_d~=Bt]q B]@4M0aWo q1Et!$$$R@)YmAj+V8kW½FaZj׵pinRed{b]#+]{Nʞ4{=F# qѵk<7( a 1!Q%cXRTb(c YYsD9"Ա{@ApG_ x#  4_ YDAAZA "  BfVڝsTX0)GB\4 5# B# \Ylm̝Rq)?t,jGA;Aj1M v:'9I!("  VU ї`DjGAA7'B q$:EQPUU"("  B1X,Za+ R_P tA8  …AH0VA4Ml R_B@AAAb %GA:H A(kPl R_B@A:# iJon % $ P!$( uQXԢe #S6׶E,.m5-i??3KR*Js8yaU>rk_e)Uue y+(mYf-k,ۇB`m1-w}gvձMA~E PuRӊ\ ES#!}[k)[Y~ݨ#i~v$2zW`Y3I:_F;{,*6"jW IDATUF.80ٌؗߎ`m}- : `~*մMAxLEfA(I)zAOqi,%k=@~|tgIkeasVt)Vb=Mt?!V'~IC|1"K,]5&P)"?Վ)75]͠ &(mvѵ>=_# &4[?fŎt͇LeI[aykLPP01=FS6ե,VU%8K{K8j@%h6*`l2SZ.INFa m B $" E)-7kp/LhڗbCvz=1lkxr][^Xmk>ϸul˫CxAax?kLP|oDُg_7,~TJ;Ƽ=yt4C. ;ޟAwY^ﺙGMCWqG >8{^J3XU_ي~ȎktIf\?ؤ8b@9}so_ctPtOfd"vhe   O/m~buG"nMjMNWgSK>Iȭ_dlIdgC olNd{} m &}̧4LQH(Kד0[Yj<;"&ޣyu.CR^a>!3tl׋۟KLzv#yvZ [_ z۴#W>6Ŭ'8"Pwđ@0֏g3{8NAAty6$LLƝV+!ɧaO.83אo81M1oM"x \:lF& q퍡,XU+Wj*~ \VKHh=3EIxQdẾH\ne vWdt/(7df!Tb/j!!tkTPB"Cؓ{EKy1DFir k*߮]z򓘻( N; .S iJ!)4RsUհMA8pXUpbX^Yjbшn|ձbT@f`#v 4RInSAD}؋׃z~ah۾=ix;4'@62 Rʭ_-)a{*VN6)GǹcA v1g:=F"NEK3X=|:;&Ē%syS_]  y"hĎ|Qtm>jA\} 톽o3ήVc;޿fRq,hvhJmlv 4I"tUr3Znў&ZES#ᘛ.\AKQ.j9s670{SVG C)L[~+r[_舯kh   Լ8RJSSn:(#'~i ٟLV3߸rxMJQ46{. ߥBjp!Ai;K!v2-5LƶI[vhub=i0OE_or+tl;Ũydxc}{vCXlڽ!7/WKآ[ZUoG`PcXBԺUpp77[m:]y*YCKTV m~j,j1^פ>ŷm5],"ſ^Yտ_S]#OO#Ůvх/(%ݧ(5;ܡuZ7'@p8|&83(|ߑ^2 (,G HQV8RIuoY;{NGRTBb-JjǪ=qh=F]Ū,{f5˒ono =!K9%zp!:Tq,+^Q$ɪփV"v8$ ?!mUXFe5 I2\r:ϫU 6sut׻:%uĞL[ ٢TגE':,ǵ7':"ryZp.,y,r\K p _se\GE+8WuPƅ` 58L QjjX9kS@U# Ah{}+5: #>S`.+B8}7(g@p!xZ ∼\*'<H*8r apXG@P#ApPd9)Tj Ngd*p5G@P#Ap5G@P#X3E)Δc~^#Yp^"Gu(1$Y }Pj#  *ّ\g&8 DFF8j#jp$L"P LX2F8j# F8j#jp$L"PF8'(3EG2j# F8j# F8VG*59TG@PSX#h9ŃT# F8ŦNfjaP 6@ F@s8$ @ E8'3E#Ap5ԘFP|9rr-GNFtL@ B8} Cڥ1钤ZFX,T+VKE@M~ P7ڥ=ʃ_nܘʑF`T-F gj..۳GYCeA}42#C=rrD'(# % ۷'3#YNg 'p>(#.EuD|~=G߾u&V:D/7lWݮ4]կW5bLÑLE@`Q7hmqdqXG]%r4^Æ=+RMP#yV=߸Egt7f@rpR>yGx#HOњRz(uuաY-~jŝzzWK )*$1I1V*m~dlQz5jE5SV3H5Y3}>MOLWGV2vԯ11>.N_%YYjXG6vjIt׭aaeU^N;p@rrԢ@unzͶٴ+4T##SL~QF #9͍՝-[*әp:*Qa(nך͍ӷ:!}u(?%nזP9slEDTw&֙s~{a(nְ0((>{'|8t:> 9+*: NyZR[U`lz*.SK]. Mv֕{*0n}^TMiH4hP_۰A<^c^NKӆ0=ܢVEV_AkhFnݹSyg߯nukmo4i): 8PGܡW /כ\rmI \}u)Zq8%|uMvIAumnzt6O ![ZCM @, Fv TVAU|Uz ͙:=/4ibt}~UL|{uiAטygǎJTRznv붝;@2W|گ^n;}?WǺouDDE)fS#[ct޽~o!izݺ^v˥sHz2"B"#53!A)QQ|U>ZkDF9ީ:u,+>__)QQam~&٣tqqr_VDD gtl6|jrc^FfdoVV}߯fVG"^]g{EbLLԆ0hHf.KMUhwzaC -q#^#R7n]ְ0ܸl6ݴkWi\$$1<\O5mйiiEm\J7]ޮ]96VDEiETvb-!:Vog7ևY<*JlW7lPbaOj,eWhM#"1"B&$hdz&mZ$@J:=3S1nYff[b-ZhV||e#"zDZML}P.Hә"p5*Yf{>p0RاuXA;P3iQK{X4^٦ʘXKH ?J6..D0Rʨ(Ms{֠.P8H P@l(4rtzf99jn"|R qO㤄Yg"ZUxUbQKRS#?H-gm=K޹SC23d(85+T1hSOK5LWԽ تNT#ACn^ٰA x?}K\?TT%-ar%LNP{qxƍ FP $-xJ' $l7L4ORAT;㆜h:#$ȾZ0vJR V& n5AK,[iiyd(f;܅řBa\%i?>"B͊443Sˢor`CxʲWdXvM6`϶d1 5pcm|jefXN h *`Zw57. I TjQC~CK6Ð0T֐Lqc JܼYT0u^Ʀutώ%ɷXc9Bbu9;>^łk]:/Oa>|>u}۶-[Jb#X$n߮323U0Tw"Ńh9vE!٣k - ,` P?-2IݺJ3ndSu%v>[W.0t=6qzN}%,LQR7ocHә"#@@ˑ &gH+"#JFb^kP*\zaR: p$_Wb6IoR,ԭ-[U :a^EZo֭-4~^=*u jb/iH[֞V?>N"$elzaC]ٶҏR_&$X~ Ex2ɮO ];=Jm֭SPs DFȃ 22Rtqii+Uժ=!!Zccsl^]k߯xGi!!.>^$&tU6w*fSݮՑZ`Kjv}joH~՛ >n׃-Z tfFzdg+@1$ݮaaZoaǦp]оLO./O^|UivϣL! '‘c\#ϱa~D IDAT2˰DfzY*/oyTԟUٰ,c<kJcTTժ/uǖ'X!-\xunnᇥ3?_q4qT%&J87Zpf>(=ԑOҐ!Yg-kfJi ߤ1kZzƎF a4eK+q GhF+@_#m,}gUi"`;ғO? x_\Zw5W_6-9Z.KM5_+VIfңJ&}!C@ğC/7N{,}t]Utyz$%*jfNS#޽jx1u`ğ3k[|)mt%}yU*VoZ29bPA#@måT~tuUw^nlR{LzuÇ-eÇtJ+Wy[噡Ky,FI]*pmf,ÇK-[V͹C喪9s.,v/ /_W.2+VHsV]P #HәBE@E⮻1[$~}m /˛5x.ans4}ٍ,a.Ҽ fۥ>+y~:F26ٷ,f`R4l=SN1ty7F~]}xf}*Yڦyss@žyF.\(-XPrJ'EE]ިt櫬q~AZn̠#.&MsΑƍ. J : hsgu`Stt飏/~}spbb̠wosn+W6С*FŜ9TS>9Eu*(Hf1mZ`<7(y-UR"}z5bǼ첒ˊ\Gs#@5!j{5-̮-b?\rwK!!;\֧Rj۶~U9(k"4[sp'$,k||u*Ku9S̳iiK/I]ZndwؾNq7m22EoN:䲽{K.۱leҪt_Hk֘c5Oyڱ#}QÆf gR.f  t_ήziܸQrY9%9mSՄpvۥ[wޑ 1,kرjc3CUSo_e s֛T@-G8vWHgAɽJaaE=ۜ2J.[eS7hlE-^\rYӦG?k?@8H76gqӒyr7 /T?>u9eJeyo.]nHn@E8.ls˾Vq g)~ں3 ᇥ,n#׭+~<骫]͖6"m\1r#7G**P7ǽpQG馒5sJ ;Ϝ2xsL\wK|?)_Mrr.*cr׸e4mيͺ(cmsscfdH)Գ4iR}z :_]ٵ1_;wxF_L@ ` C TγJVI+ѩ4f%׭\)v[Ŏ$]~yn?>LV3fHD)k3b1+ּD6i`4kH}}3Z@-tHe/@9WT/,իW3RV۷@:zGـ ;*Pa#@msg`+M͖#f8s6m*e-b?%uWZ˒w8GfܸSʖnnU9ࠕu)Ғ%Сm_N`۵jeN |xyZ?m~۶[7sى/Ҩ݋>}?o3sɎ"]iki 8n"gI))Ү]R~nf@%%{,@iiઉf0p9{K76Vz5s>~ds԰0J˖R҈g%}e:vs|Ds*Yi vfzd i~)" Mz2;֬G@aCTE#Ho*&4TBUYQ}{6_U}fͤ6_q}Ç2bb;0_eWO2|U=PntAp5GǕÑ,'8"ZL^*A8j# F8j# ;#YNg pj3EG2TG@P#Ap5G@P#ApP#8r:Ss#P8)r8 F8j# @-rp&ftF81d9icpjdG IBT ;UPh9j# F8Fq8tP8fGp:S`_ZF8j# F8q8tP8& Gl7ϋiѢsW{h:^gQ?ΞoߺU}s'3EG2T{~]B/YQ>y/װacuϲzT:jPf8MS?.ڨ^pTDH m~-3r櫯Yg8&PuYu|9TPPc$8SH@˜#}TB5Y0' 1J9=-GSFxh9*6pcjUk8 ̛3[a%ؠ[ n5Hf:cb~6k * (hϥJMM-s[ժDuSIIIT+\~we, @SG7oү ꌡCղekl6> Ð!C|ou٣_."hD%⸡[ jܹ:餓Ԯ]YVy=y<n].)//WZjР4o*N j3k@xX,& z52=[#\GnZA_?n[=:$F.]vE8rNS}i׽u飇VwM=޹]nV{vjޤjmnuyϻw?$շ[dXT`:GgbhUv=QDuVט.<|pu}vCՄ9 tyYOE_1sAk+orЀI2k #Un5F<>~ߧ"]_f=KcJG[9_gNܠ!oU)薨xCZ@|饣NzZ5.SS5ZO,xkuZ"+ur?Q#vI OS'\?5aڱ}[BX"@ [MVtf}[^A?G?SO=%YqWKO;|R'oyS,:pjwúzPiK<lM7sozWW>[߾QC _hr0uu}$խ}u':/s^ȡV,Hzzpmn#7tvȖC|I.wc:Z6 XdI\ s+ջQ#$Q~Yk.Qj֥zaNms֪ț55<"_+_D}[-r,y9<yɝ.lָlfǭuOwUH=J)tj#s΋yguyi`d);ũ I$ |M U)n5G҄{+*}WubQtv: R鯚wk0u?ް_@nmx,u,? oQigSn ->@t;xDz1Qn^A[#ZTgdeiݫ%gjw_rn[Y:4zYMRJ=u\Z gj3=9c.Ϭ0dSKNmmߡM/4qt Yoݛ>+cuM` >e?7kռǕ}"eK/M_.xWZy~9hk_!J7AwN״ՇCtY|}i0J689K7I]׾,NO΁ bPsoՐ?5sum=fozMJ2P]1ZI彳ZZpn`})Ǎj°jۢ:RHCmZcevxSPc5NM92_yw}G;*U^ϼ_!wO!:zc\~zFKdígCwKg}pK8wk z6j$D-z>Dur$h_:۲D-5[k iOg5tU΍u8rQ|xTWlܠohY~w.Zɑէ׹ ̮1F~̴HiIczR7ט ݴiZ/ <\},RZ^\6_-nƛ i3zdZ$5i0pڭUWٻc EOąլe:SMhٯc=ڒ!7(e3Mհ=5y.yMݒ8O}gW~{mؑesdvGWnoCGb8Qڜ$'遅b,M?<|y YdȕR|2-;eJiQBEƟRq(pТҔFuz)Xˏ ~n*@a*b=^M}O”4ht Fһ_mBkZo"exlG O6U4OXRʵGU{7}U:%k/ @8"VYSןYvi3JBV{k-Ż45A85I mKZ5gWK_Վ闪Їπzy+ab}uznS8cZKnvեbI.e?srn@뷮O\GW:,9ҥYo6.Z^N7*cԮs{/=[Y)'?szWZn.B%?#^F_mt %r,޳)a7ї?[rVOZvz_ai򌿴a9ggmϵD#ꮽܬ;Ո(s4Xͺ\gf]^VMYU )_)G߿>ep4@U xhМ+tex>\-0]=1uropjokv)tN|Em:֥S-zf@@҇ߟPub:/ipXG=2sj{Ni7RrDEj?N&>SW,G& ίn-դI[ wPI^Ιz_Jծo_\t|f#*Q&֫֊oVVŚ-дK\z{9 )OQJE?1kmjC^ÐkHP+ܐ<W#P:LQ2$FSzqɺu1]O\B=2Yy}|>? <0/?"ؘ)&jBh=@)5K #:V8 T[ E!21HQL *UIW'`Z”fyzY5.&QϮ2jMdXdY* "#P$; FܭH'-X_EQ0b5&QA+Ҏ IDAT٤'j觩2cx6OE׍ӌJ5Uш ǨkUl UՆ T 蔯[ES_*ВjYWQAX񦎺_vւ2V ֺ\'K *R'PkYWػxjY5-GtۭƞN=zW. Ez}rjm8IzZ&tkC#)>"[B]&%KԷuZ@=/"g?Ǧj6X4JO?_.~ ܯ)Ӵx o>N/wR"Kk|EյZdDлVW5_á2^7kq|j?07͘3cEG/n5_4yTkEX,=YNݠ+gޑ3uv\}.w92,vu{b\jRωV)?w⊴`jVwc:Z6 XdIX?~HAR5lxY_}G1Ɨ7 YiS#/ԇ=ƻv-՚gӫ{||rY;)Z5q%qF߳HGFpiꡯc4EZ] .Tɭ vUu}25>gW4}6e6I)yu 8TO6i?nIZJY" ʗfC#;DX¡N}təzh`d6ξC)w,C]-ιQR?)9}s_яQa@.z߿H^w;*uo9 x)Sc5zAוt- ;*uiCB4@r|*ضD-uGíBSZ&S^s e o̕{~:I;S)jxF_5S|ۖhRN9lZ_Cn*eito4Df=[*:-<ju>NyK7>W獗g(g35 -Gtۭ#uhv* [o+`wCuD,G2dȐ/+M;IF3Jƌj+OzEXe/H \e*]V6WASD)eEPNq .;+ouoGC%K4sEzmb*End+[Cb=G€4^G|U5TE9-V긼9MMPs 'u~jK*䮭jnu:ԋQJ2`~ @(]X^J2j#w_ƫ[ =JѪ#bWz?F^~~MQ]*Tް=ؤ?l_y<΋ּ+R+/Qc*U28ymJ<)i.HWrltPw59G/լ+l%nՔUGcBvSK}e(ge̜G/W;_~CR?Wz“c:YsK\um\!-onU-ௌOS5:׭ރHu:v|v*8>(US}Os yk/j}"|Ūz~m']sAq}ccԮs{/=쾁׮Fchi醯wS2Y\3K#vLf&hؔE8͸Oj]*)@0^o:Jkmpll%ګL>pjokD vTۻ\&4ƺ?SS۫uxMQ_|# e3{I!)ɢg?{Eշq-B衄$ R  Aǂ(6DU(k!gs]s%;̙s~{ծJ="og1<$jMngeЭ,C:=ʭay]"1At;.۞ N 5yI9zwMɭyGw[|ÅNHg2 >|8+WTn! 4ҳ' FB|Nysf3h0eV:%ab갭lxan6wvZB]/q) Ӿ{oOⓝazuvAʾY_f#>>KvF&N =FDDrccFe=F*k{g`h8㈎˜}4kY`)IB1~=R{3wͼŕPO@)F6Fm$B%)RVs 瞼dӘv]5;>d#qLWc~BL]g\r2?$T#]E6|=$ز:H9YEDDDSOC)vQV#"")8"""FDdDFFYE84zL[;q /t',/"RpDDI5""Oj2qce!\?$:J$Ki%&W>ʴ])g:9ӳԹլ&Lp]a^>hGGDDDD䒣n5縏-}-LvTOײu 8{$Gq}T\r ܭHbѱ ɄB[;@*[>LFiˬ5hdζplg|s_ڼ6Sd7FZ˙]_b)y۴|*}ٙ܏#I͏OQ%&*o1M??c{t 澄)/iJ Kv<8}csIӀ+W,'iѶ~|ƄUy?=RQO  S<4mKJ{QpDDDDD"Vn5}34~}G/g)-0Kٹ?[As\8lVoZB~dOXUSMLl8qޕaK1zV[O2]|{؝O kC[#Ԛv-wJNؓ>63x{?_O Sױk.L}JF:Fܿ,e7y֚~V#0} ѝOޅOc37y=>~k_'a1_rUEOD.%VeHx#E>(ODj\6{ijڄ/@c/}LW~zh&\IK2<Ȼm? 𳙌pF_agGUkbkҔ1?O}iQLYx~ a=U~acͳ4I{zs%3F-bwbzk7'm5ҺbLřGb^ZGSM+J`h S$mScmTedNmE[Ɏ݌k]dӜs4<I~=iz(‡j LX*S?$O盺k\c 1b˞h"Sk%ũVTXFPE+MU*P/!}YrDDDDD.9K/W8sT-8MK~a:z^}l ?OĿҤjRV ~LHL-~4dƚy㉁δ92<|yhCjgn鿾mO/i郚YC9VBbLφqr bf+>lvuq] +j9V=1Q!>zG;y7ͫ'iW L6Bsjg4Vҥ1?® 3aIY#fṤ.5/+?RR8ufePz\н)stcg*cXt2OakO=c%kN1Z Go Խ~۴b)v]̓2n5""Rn;""RXVF57ȑݬ9-ڄV eY4N }388V+}p߼W77၇"e=K譌ȼnװ~v=_|[yy`3OJS~k 1}q@{Z;3|rϳ]97]_z̕iqfDm;H ߰ p9kݛ$_mF}i" vձrprDDFD)LTD,pd(i@hh-_3-|SndC A[>???y({~9$ =''4 k@[H#gp8| |!x% vv4ߘ+Nfc)x~`Θ,rZw͂q\~vپ=Wi3Now5'nwaՆCxK(@5=C悥 CmOY՚|8+WTn(8|KŠߗg74d q8N͙͠!J7aoӖ`a%siɤAzXT$L nwfl6q,_72qDe )v٨.!""R\*k+0""#"".k@D qGDD'[{k ""Ո bODD.6>(儈HR)8""R" DEDDDDʔՈEO#zj\r\ԡ?#b+:|īE=Fc)w)eċ#F ?^];87X]2y[(>Z-lxQ*9\}iM‹8}o +JΗpryb¯NN[ή(mJY( 87yf-lZ/quO^ۂ^wUxO͋.|q7ue_^qw_I$u=5<n˅tt8HMM!%%dHJL$11A&eN|Xh޲%x ,O1ʖӹQ & LT3_sFlLB2)meqG˷v89.e7?>݃FLL&W.Hf83//K}cRN߇ɋ4Fn~|'MҎ[#_4lW,'iѶ~|ƄUy?=RAGDDR>H0N]7V?y);g7X;#WH}fo־O؍00b䪊ymUn(:4 ʰ=o+D'.=y5w$l#Wrž |ܓO^?҅;_c]( YǗnhEiXkv [ql[툈#""R4ol<٨k4dӸ@c/0g;ԯOcI3m)(\8Yޟ}W aF} u`x0I+ͳfmOrm=s%{^;-ۿѸ~c"{^u;LH*X c43k,bccϛwΝ{Y" H0ζt07'm5ҺLřɵ_m.\꾕H͸~i^L&L>yi[ 1NB_h^|٪6/-JL'JݿFKF`.~ ,ƾ}3$g;Xt2G#"""""E:~k\ə ?C}$\wSŒH:O)ґ/aklG>L次yYbig@, ֣7ˁiӆݺK/ѳW/y9U)%RSLP 8@>M!?юOy XL.NӮs3O.&{}e+i&~XqO dM~֙Ʀ^g) 0w ʺbсʴ~9RNI/W^y%&M+`„w1U/+)""b[:~)nmG׏bއTÌf˲h$mgCFk au\-'8u:S~d>\EXz+c2x5<dV;&{1+'% e=?{{!jW|20ά;i=v̧0rlw|=3WvġXa=*^ G)FD ((""%tlՊvs%ۘp|K7Fv<Ԉ4k!^~At;.۞ N 5y&XTuU9y<GYXw}$,xHba|BW`H٘l!.d%3 m~]|`}|Mlߞ+4xs'ڷQUt,@2p] 2a >+W*7DDJ(EĻ}yyACdޜ 2L%R@ӾCyx0<pyGlDZ|b֮ĉR*baXzUټy6M'eJDFFn{uv܉˕w,ٿ?̓2_g+ʺ?ӾB Raaas%Ξ'''fBBBrUԯ̓2H ؘƨ,TD}c?eHeID GDDJAOd޵FvDBnjrgekKعM %Pc O}8BODrjcƌIDDDk/FT{0e#**p"ic[REϞ=ٽ{7={TD#""@#sD~D@u$V_uoĎTHr͇ ZVCa?;/&nG 2{d;!f _Wc3`Q\ڱOϦop(J1mo獖h33F؜V|-0ϲ>=1s- Pb`$gIJwS`{wsiB+x1V<Ζob>}jokB%k<R [͆ ݻ7cƌ!..1cлwo6lؠn5#t HaOeci2?u3xzd|)8+DuP7_?(?bl_ w&L>'D@ 4G@"ۊκihDлsi߯}n9GNm~zlc͏|OyN-b <|Ul߁y4weMyy&v\緜;w3;䷾'_`Եl߽?0*-L;;Hv:q.}2eNv{ 딑,HP0Fśoc=F xx75j2GUY "O<\wK["RH~N[ruhjڄʈ=}>zzL8z^nOxoAs'r@L4㕯[ts2"0 l{Y1W8Ε+8Q"iU?<}u l@[dz=;<}x<:t =Y *4NwяV=|{q h'sYu,vgJf^ |!̞=СC;"j9""RHOI"IN\mD$?~yIq}=?Ul؄J B+ىI`?\: #Hkՙcٴ nF\swl'n߈aݼ~5r3}%jLUTb<9pq> Q%;0>6-mЊs 6p`{.@xx͹Um* FH~E* DD= twc{˯6Fm_˜a |\N'.W.:4酻W~[yqCCW2L 'v{jZ@c؝n \ToӎnI$_+`hU+nU^իIK`bwv\qdJwz.7\vT<@Ŏ<)KRjæ&BK' =X 9Nk?xޱʍsM~lJŞ. N;vO.Yerm7P$ Y[l,iF.IkYЧبUȥ&)-4~7ϼ% W}'⫍6dz],ٜqt5OѪi &DPu=:Bk/}iobTHmA9)}6HoUiyN{ħ[#Oĝ;}vi;m>0al>oS'~>1/zz|믹[5 (8oy}P^N:,**8y+ y/h$s[ETF/ύ$׹O~PP^(^1rZM? Vn9#{9ls֢E k:Y s K~{/Wb߿sxdM ztsIka3hv}cΙѺqY)tdy-cy#|Ϥ]͸؊/Z50v_^yOf;v~k}aF%|a4KeնphJFDYj7m+zSy#ʶ_~bАa$Ǒȏ?|?P y OFעug Ͽ޹v:w&uwS~A۶mW_|N~Z:q,_72qDe #"yu[PC2ad-KI )%\$ 0={UL_<mZfXVeQDNDDDD. qr,e nv;pğtG=l*B{vѮC'bOK2r$RSoۦ<[mϿKk9Rԭ&'g]LbՈd** rq8oKߗgSˑaCMsYǟy6Q6ILLc[5ia֐'O˾\.f#li@ֲg'd^,o?~xV>9\֏~ÔaŃ 8k e4֞xHl*{Ky%WF!\j!."U8k^d2cǨQ2Dh$E'g9xML-Yv ǎq&M#^Tw_6>ӧ} 2.J\,mu"PffqBReDňylFwoxg߃IbqUhLW?ĩxA5q˴ ϰ/!^fѠQcjr"%d2c)0"eN2aC̻*bs |8O~B>L=8l.Vj\֎zv#`#IЃ.M3ԓɣ)i'fwkԲNxAu#&e;a5-X;IxBntyٌfWCwO٢ "eN2zct/9os@Cg$<`x=ՎM:]tˊWo⮡8MkQ/C1E:`'T/)Н\Y忟r4sXҋErR{寵k8qxV@kbXLppZ ix$LT>ErVlPbƲQ#І6Lf71d싳8 2xghpgFLN`+f .ʭxgs߼9/1Sv/&Qv1pݻ˖ѳwj-ǔNyt:ٷo˖,r`nׯm*[>5(8r J4s^xx&#oL-%]T}Ĉ?)ċ?C R~VF]N'^py+J8jҤI30L^5VpDӻgj. =WDDDDy<N?NZKix<&Ñq:&X[ʧʧ\LTDDDDDJj V4mذVlذ!2ͦ )u)o[BTT}ݛsYvv{ !>щݲaKT+z)R)w s⹑o_СC/3gګn'*j=k׬w]w䆾+iv\jMKT)8ȉ|$GDDDDD )j5bN,#}q8)hHHj|w4VC&bG/3j@"?`Sk'O?aZ3^35yx "q jxMz;%b~{*oR},Zdjї'y:URd$}ڋ<Əl8k0M{>7Oc(ݮ~˖.p)|SŲ`#<1ȟQ)"%EW$҃+Eҡ<7neQG6`3h^\R~N`?)xPBVKj]>[&m:!62vԭFDDrSKTM/>C,5|*?xoëd6pF_K;&;5w]V<%Kywߞ/)HDe $lPr5$Juh֢NDJlj|n}P#.[nPSSSu{9 /bjDkځ q7yo7e>[*"ϑ3ڈ㈎РB~O刈H!e d1ԔBiu#/ x۟yAk`9K*5+aPS7[K4 vqp\j@ [gS@ w$hOub+WMB6{O(8"""""RҒ72eTryb+ >y-W3cu. 5m}ns0׾3og{a_ŠiGbqlxwx|C;2p<ԧ泭!=|;Ͻΰ`x6d|ʅ_i&S|HIS1f)=.S :ۿ5-E{rР߿?wu3k,~zf3)))^rr2K>iܗk&<&3oߎ<ڧ.}FMϨgqoaL?XHHLɱZXӌ|L1SALy"*pAs?Q CL=©'iǣwPpDDDDDbṈkM̩$Pn}\PBy ʗ^|]w2);vq8X,tة\\S}JuN<<Ӿλ2zawз?7_mvWr,1痿nw`[Λ@|O???DDOo݂LJkuvt:%^!""""r0a78z:˗tf䳡%[!-ŀyLc:@ZGɓIۯA|\EU".sOkKʴ|&2oB+vq:::oͽƅ_Ù{_Xme>x?Zb%XlRO__.#N C>fe3zھ6wԵ>.^z'sm6rJFZbql֭mt:8vOJj9"""""创#?+1DTZcSxKhl6SF :H{t) ){CY """"(Go|m)1^Tl\ޱK,f% }MSNv:vBDS$@DDDD3t`G +JmFocxZg)*UB۵4lА$KOͦ$eB)WA]x[A&4xqaŀ%ɄIl^c)x<#)GDDDD0swdnh ;*0tw|;`\f+ר*>&j5 'R Hr~!wx"=a_Pl6cZ-=Z)=YcEf6^?ޖv; ("#-yaѯDb΃7_ɀxwDT6 ˊS X&""""k*]_~1L) yŅ,>ÖƔv*]~tyVC>!3s<6Gs:>M-Պ@@-Z^nޖ$Μ#$&&jſbJԪJhݺxn]GD.$8g x/]|2v=_".EDDD$WN/}˛ek~nNhŽv9r0M=kR*gt:ٿo/+/0 4L;oJ"<@m Zcۉ9um[P9 uHOiJ( IDAT['z?O6`ˌ#ǛhUa1-ڲ?LDDDDf\۽ 7)cl64mdbͪ?];U1 ǎкmkvSOrbX^&`bԼ]fɳ:e'DJYY "x;r2i9)snOEM1GlnŋIJJ}dsp3I4ҙ5PA #bbw885]i֝7A7AƔEiFzrNޜnZW{)exݗ1fd"T4V޻ԯlbxTB3#مƮpglk G.>>6f׮]tڕN*%[6o`g7H-VY$%) "Rr)L~`7ox1 wLDn |-\1ēZFԩSi V᭘`]w- )Y"_s^+FDJ#"""""p9K`$]R™#1qc] gNTÇ ;tаʯa/zzQbӗX G.. ʼn'p\8Nn75k2$;ࡃ\.֭ȑhf35kߟ={vg;NA'yf~۲>?yfu1GDDDDDrDŚtcyq$ܱ7 ?me=NNo攞ĄB#&)) E`` u9Ixx8-Z`-T\sf6mBfMR% 6l@͋|k׹-X Sz2LJzZkWp{BTs1f6BfV3˯%%+)6v;5].@~R%ٻ7ۼaaܒH$z2ܖ7?.zeV UT9c(8"g}p8}>-n7>9'ΜW}^SCӿ``HXZV嘵dÇ%=6u\.0"6Z* 0{i琸8^!k 2Ŝw%W 8=˃qqpP㡪N{GΜa~Ŋ !ƪ!Јsrlǎ5\ަ nljwZ$d^ȥ^$ qښ6/=x7իSzu֬YCbb"_*lp$>>.[P^*u;oY))0UGrglΧ<KAۙ\LÇV-6`Kz5%Y<\{y_WQc蔚Zmz%%Z؛O+2 E;jʄ_'Gвu bNNj{>Knc0虶<>Zbh[ǝu%kE9x 'N񐘘6 && ^g_g@@ qgI02g{+iqg2)1ED0q[w.]lB;aѣ %[!E[GshM繴B|e^0|x#j|y7o +""^ɹ[D$ &3&s=VcNۯd'sرǏǀǁ/1gR`O`p(h Խ$0`MEmQbpac[QzuL&iiFX,aޭ&=ʏ*?YOִ涎QpD.@E$~}6{4S`$`jѭ5\r~? .L4EnjԬJLW|\%`InAtqLgᆪg7j:A:JQ~ 6RDADWQi*44- @lʶM)|8;wΝ;ޢprfo^OBBZUVaPB%rgg$ 4#׮^a.˜u-8bnBB!&1d 1J MJ%Zgd"= ѸY#_yzٙdg`F# :(F55@TeOix>0..%rO܎*ck;sLJ\\5&gp |Sz܋AyJ$`"$90r=`*ժc2Zbz'=&P2'tpՔq-U;ͳ\9r+W( +W.NnWIhD ;<&Ea7nkxm\&u}/GwEaOA"7aswuFܲM)\QbUW1(rFnOO&:z v (+`"!]ɣǂ))}oH?W+m3idx8|3#`H̙h={38st# P?/0(43T Af!GD1e^\>қdyLLYΕRnn9nZTZݽUaͥnq,F9 7Fnfv/eyk֫VXE)O)7U]]IpDFp'({8cW-mdL|do֙l7zc9\~;wB`goWc%rƷY5 ͥE/Gi5F .oIEb$Se9p#nI%c#߂& B$FCZ?$t:UAX,]uDQ4[eӓ))T(uB! ? 9y8)%6G"Fà %J#h>+2.!));x$9^^noVbKz6Khӓ^^XNgy`o]t ݄z ; ,ssc_{Պ;E!~RwؖMy#c!GlQFHmQgrNRX=4l@tjLYpUNaM..lsvFk%vqa-LVPj*22XpWUR4jvtd5<Ϣ'D]sݲf2`eFL&~uKh8׳ɉD `Gj*uM&B}(37ԕBQRHa5sD$U!BQn0B B!B!=M#B!BQXhBYȀ,!? !B!neKahR% U[7H]O4rtf5/QC4 ڴ;OםLђrӳ4 X!Bq y:m>ٿ1,f?W Vl92}m3x%q#Ψl!RJ%CNrQIpDCCsRWB!(y#vUmh}`aśsЍ~LU >ܔUBP'VFc*J!,YDvԜ_?ax4kF,0F24 YX/G![I^ 6ldH:ܑ4/xn3E맾ᴉr )YvO|0%«~B!B9m`sti7Z\ i׆рJy,{i伥xQ?_1Z3gtP65v= ii8֒f5fTL }}AwjǹZ/ }k{bߣr&Q9mXVǫr Q$8"B!CA|F?+_Dh;_'.8X#9}$"l`r Dװ|n;ߠiB!B6k?ù=8NSx2C^_Ǐm71f|8WoLR\o!v/>!G-}g4vXN ^͛ظt,Pʕ-tǺeN Iĩ5`Tf<8>gSmfzD놟SWӤ+8~i=ҰaC6[Ҳ>5k(ЮmFG;#M!BQ'f0>x1W7c4 Cxș=#lXV d>/ }P=`F~S5գ~\Z2jŸ|b{|ΖU㭵ed l3ukaxl IDAT *>N6cxM?-q49 s+#8ׇWtqmWR9d) PߥiB!BRf7~$ժW4(B&s,\;nlyh;3͟.1י/䰹/=߅h W|\ jڍrZEr ^<ѓaͦy_ɂCB,8TQKoV|U536N.❙G-L~ GlN88]&3i ֜Z ~7~SwT]-amʳ~eLXnͨdb ]\+Ugc·_fh|6cώSϼ0ۧ_'J sxiHUc@=zIǿ?l8[3'>8O CZ2h G9wF i *,Sl6mԨQْtT{{T =~1޺KiOưr|o' %3FS{CqhZӄB!B!Bt5>ys8ZP4&v,HPCz{f\Î2"ƨ\#M!B!gXB!w'V#D'jDI%aB!BqOB!B!i2B!PV,|۵<ͣǻшlFUeؒhppttB!Jg==W۰`66\5`KZj*碢ػoW$@R[ߏf͚jJQIpD!BZOPB3;Ŗm֭AAAh42jXVټy3T h4JQNIpD!Bj@vWC{=Z=@YVN?n\x}W`x+ &la|~Oc|\8ߟeͦ'ZQ3}=?K~fӭ[77o.TT ???֮]K:u$8"D9&!B!n0qt"ޘ㼉Z8F}_y7ofh8m^e`@1,ya03冗h9ׯfAC{`;V*e+E\|^;~$\/rΝ;8qx:ԪU-[J%QIpD!Bxt;@1ou2ޡkh/3m[\\ܭ5gΝjZnQ~RB!B\bP\zo*JS1FmtYvaF][.$ZS՝ols֖Zu9΁v*7Pˊ=ko$8B#B!BE?p br-7ճ}yڽr4r MݝJ\ؼzPOo3%|ɜ?ۍhD~zPz7e[C_Sh d\y0+Th;7mé(Ո*l˧gL+9SFnz85) ]W>͛njTTU*b0g^ E!..ή|;oS2%>jUQP7oqv]uťeZwB!Lxyc$9FW.HB?o_N`jȐ7vGzz<c)\ْ2e*`IlE ~Æ…^!&4 8+k#UÇ@Ɓ̜{pr~c&3giyPbֳ;}N_sW&/Mê66Y>?}j3ry+qmF_`6:tc񆟘LF@b1H(qvZ41GB!(5ymE^ys3>:rT vnTb?zscѷo,ǧA:h$,Dk(mIqLӌUpށ!j砬/67 !ņx#LrX!DiWV%4FA/ߌ ޣG;Ӏ^L}Gfl '~1Ccl]۽ĶhXŕ}2~je?R6 :2qDZD:O8cB{a' scsp t 78( Vc21Wө[? 1Gb7QLzgeiiQ#B!r@Gc!G5W^KFЮ/'OQ͕aese2ӆu[|‘_1bbcyawhz-%Ӯ|l5rֆ'v$Ao :? 7Q=I5Q@rwy;T4g( |o*4=t8x;濯?X?}TYsX7zSB#Bq7Jy|,(x_G&58q;p@`5̀S}\j gKոUv݊@qs6N;lډm2#L- 47zvUs &s6_j16lj=:|p¯mi ~9Tq9ҫmZNT v!dWP^zUZ[P^۶[# _H #=ʩ,܄_?fut懃ƒ~gҳwW\xj\NCvq W>ZyZ0 ~ɲ5m>Ɋ(zaJ|{;,V/jc̞{i+tN\G?"h|i7|4=BE~ Rm/2{"?L]iKκu rW ^|5G>MWkaOڜ"j9SkXswp-0{S^|“YgAt=&Ǿ51z~9K;?v+L !9w!>>>j4|}}iڬ9UVEݥtMz5pґ+u㥿93.g=6K&>Om=`s5a@Z|-f l̷x=jZ@DeϡȰ(v'Nab Uc~fx(O W;S4ZjMa!/-zYFBILYFf2sf*dLAԲDhի9@.ص&Q\N1u NP#Y&ơR_SX|'ӿD-DџfxeKcL`HF{ʡ Cڙ7ܹV#-x>Mz90`L%քz<8r8<1H3/W} &a.WsG܆5 ;śTWl^$e|Q]A0|\HW6cC!xI\~}r+1 LXs㨚0~]vl$=ʯq09mN$KVPS8zsqBb~^X{ c%WJXʥ-Vo <&X *X[5~wdv 6jg%@F)-S0a~N9SX^>bŽn7捣(mWvޏˋp]5jMu%%'Sn}^a…8AXs`yX w'b!P_%*W \!(}ׯ-UVłͦb4oOT3!Nh.X1\N \FRk2@FBP86yWOK .hPċW1_/W+5'%4| Sl S\6J!Ѡa#tz=ZvQDU6,/WEwMKM\T{#>HJFߏf͚jJQjLljISK܃hNgsN1ؗby?`CfWl*T{$B!  5LF#Ee6uFPP,[V+l޼ʪABc-8bI"V:8x}X\SP#PACƣ2U\ҹYO7'7Ej~|c C0K!QIљGt>wP0ؑ51DQK(3r.BQ>27F@ؔAS~`Z`2βrX>q3#2}[5Yk DMgHqm}ϴGDk>jޡޯX=q9fӭ[77o.TT ???֮]K:u$8"q A<xh-Gѕ''nDeWH>al"O^] 1&J&sbO =0:}cU5w᩾ZEkk_Ϋ[Ӄe[V+ЪWsZ<&.z@_`_jNN/C:z,ʣ 3)_-8}" OvO``\R˗@•ҽU;wpbuU6-ZKn hpD QYc z-Saqz/x|WFQS8zsqBb~^X3`QSQ*g`OMo`[:Veats21Gv$.Yw{s&~潳/f _sPS# 6d=tfɪyz?d7wK!B]fXcs:,ڇ0#[Z 0 z ? Υp/O!${iӦ Æ #66/R+ɓ'xgpwwV]ޣaa=8rQp iBk,S*zwZ%!Bq36m3fGa``.CL2aj9#=y*huB-* ʞ:3{lzt܅ &_!6).Szz:nnث!%lbbF8{5A4ۋ[y.Ɋ3B!J-aD>榴P~cſ OgVРՀͦ,LIl_q|#ץjQ=3Q$lFt0 :?^I/1vvƦN7͈Yubpl&|VC;H˳N\PnT.HܺM? (tžzMhpW'D7 Lʁ3q?:%4iQo5_?~6 ̦Bn,(X,i>Nբu&B!DzR/ 7HI`g: ,ũ:MZcrIW vn{yMO]d+dfÜnDu9+b>ǂfR~-;pE-R<^!ҭ)gZbc%=-i|:}*;0dT^T3'-1˧9l~ҽa_;#bAUUn_$8"}pDE_ա|J} ?A؎OjG"2Ej sq0.ҳe+k$FtuGc>Srxo }雚J{ xZj&n  `"WLCe+Dn&N/qLonKO0C6`i`ș$ ?dTNc D _غﰢ`5&s50zd(D#/o9(Xsmy=տ.gě6/پϘj!$ AMpgTBsYD4seܲ49W N-ďǍw߽U@JhP_{YO&z {pT臫2k? ո'|`Luu40^lZIz†ŀ*aI?fw Fm|g t+4}a]X dV]{-eiț| Oè/ۓTH8/`;w<{][Lamx"iWN~LϠ-s.6 4| zeUUŜF#d1}||NJuӦb͚sĚ7ȸoܼؖ8|$)ZZmR:ַѿYy-x;a7+, vGRDX3ɭ~?lľ\٩x5ȓػ+\vyi3 Sa_H:'ӣWiF}psCrkf癗%uՄ3MPh欼 ذWŬs'C̊yo|xῗ} /4`|F`$<32^`ѯ/R%3vb=@۪Ly#Lp?<׿vt[Ej׭Ѹ=ǜmџ'R2wq@`5Pn#TBL2i)="Y-bLrR"...Gj ))xwipDK~_u~0Wb[T3ItY)N0vfX3#p!p2.3=~Yk0C*F|l_&_}J3p S霺7M|@aKbkHl0UuvϞ-3fՆMKM:Ѱl+)7|РwrjJ#X#(P;ZjmVZhk1ǩڵ5j!5 (xx(}+Ws6ف&=yGq{k'6(8UiNM,KΥc+`}-px<&7d/MdLl߉?يT|b`HK:oݘ z ~,h[KK`sP z=9l4~ctWGcFv=eY|Ӌ'z٪FH26xd[Um>(cя˾DCMG+0qr'1EO9?mDtA4'~;]GWN{*6L.b35;88Z/n}qAgtU,&G^s‰U󿗏ѯwm-KN]GG2+,;0z+NAT%)9Q5/n/ǫNv$PߕLxVQ!gãI*MHE^ułs]ŵu]ݵZWAi" *BBBz2}c$3$p~3sv{ιd||/"k4~S]8]T7Lwn4\u#>5uҲT# F+Ѽ-hv0k@05V82Ʇ<O4lfRڵ%!i_~]4ZFvv3\o_OՂRӂjOs|y}gN|Ktxo4я\ɫzS"y3{>ŧ9yPKlr=S1;ڵkXpVfڵkO.]0rcrDёݜhx^KҮrqjdcHtKdQn..M-{BASmT;Vo%V۝1dRBQIa℠X饞[X:bmNIe3sW 6g*+-xťt݊(!*Nr,%pk:o8H⿏:X|8bmI*ذ6:/lαWيt%WaKYKh Qę4ҟ_f\If섻P{` >6<\Fv 7uیE=:~M2;sy=Pw!eSX@Y9%GrHч9d?-mO=&5!QbRR+Dсr~lڨd")#?45^QN/;}(s06m,GknjDUTܪ(UPӍ*zF+| Ky嶥rZl-ܔmWsv,S/aޣqLX*4d4^~'^ˊ!_yhq yjׯ?;w9u0S8#Vh XcBѺkcW\zr9lhI6oZ&6 ʣn*N,;N=7yp}Ȋ9%`W()k. 1cg \=BɡAU[9Vw)GU/*20jEKxAՏ)7 t$WM N8 Q([S\zĂۑw:eQmV۪Ӳs\~XE3IN{^=X:/n<'̨Ĩs_4)eYi6:eW&=ۻ-2(s fHWXJ6\B^?\ {@žjO.YI;CLPǴzJ~ ;Uv3>tp4cj69Bgg؄6^tr8X#@fvfԫ~17.r0N'AU)ja42lfVh(NMü/nn'&RQ(jXfsLpbaF>kdPvq=9WnsVTEWp(Ozl7ra13BNrj>UHiojH{;p{?rwtN£D?"""dU,9Q1x E(Mk5N|aΣ)U%;w WQ) yV?S4awV}û_zo'>j+ I^u, G9s[ bC6_9N'{VPcɧMG:kGaw1|@75Eڔ_\ IU[)DV;c5f`+Xs'iv(ͣ4 AW鷌NUL[3z* 2V+c,.-@IBP˹?66:v+)W۝(( =Ntʣee_^ ^Qw8ף0 Pj]J8J2]ZֺqaphEޭQדe |yb['s<.fa)\J4 ?ۚ鉩jA>)t:B0סpRIm‰ CB>*,0[g#ʨ96KYZߛkT[|xb~QW@zJhb4$%*,A ِs*<]C&I'DقV t7p[OȒyidwWzdj̴ۙ5l)}}mϟ>m<h>cG"Z.AvfH4T]MZR"A7 [V+-ᴉPWAFf#GgӘw6m U^  z[}HOdEE~#޴vQP@38+*QPW1PoZ#u]~PANrD)lw+û6'>:3J cg}.=bT[ ?Ђ*\٧%q x-RX.{wbeFI&D'wbս9(y tj Ƅ`1MwݚDҕW$X%ϴܷ;IF cwiBzcd$$cؑ4-]ϊ,;'eѺ`)&MHI G1ؔ&M6iwO<X9N}C-i܄{2I̶^Eaz^[rGiʑ>ZUoa!)._A}^VgFb0k\lkPN;hպ'WTJI vHSuNo-EQr(Q^PA٬ZI1S˯b51(pEǟq ȹZZ6zȠ\!sdJ:@[.Uݥl~ 1׏~"2> fJ6fКygڰgvNZ U3sݵ\@t\6W`'鬸z&={9Ѿ`|ʕ^\WY~8n[ ,X>WÛiaa\e1wtiKhv;/v'VT0$<]RS jq"BՊ ';%"<VKߔjz'+%&GDq!Ls:y`qq~뙑O_VNXJ8ESNxa] \;f$eg:Rd IDAT^ҷLPYQ9?ЧO/޽{?>C /; 3`jړ^S 'I_7*p.K2ea.?oc,11l1j4 ;*|kS5JN[Be0nOH/-0FL?WT`ZlXmCU~uBw zQ,/FE1>!e!!شZZ-L&c9]lUl63$)"#b4Rh)4XQ? zɒ%KسgFw.rسgfbȐ8 mZS2]͸=`prA<-@')DZ>lfN-Fν^v;7-aa\bsx i<5ZUϫF?չbjRYI:Imix8kqo܏"lCNBp0H.]dvBZ- =SYk 9Qf[;ݶc?^UsN~}DfX̄dǟi0h9sOE ǭS9tr:phD`HpFǷ,ÈR뱱FAqiچ$Y@Q(F !W Y_@AwQ,݌Zp&y-oXxhj~Λg!gq=)~ʏ[ιx=os8|.yMv;vĥA8D, ԋ? ~[cVgf߹2ka`hvz-Z,U;h,lꮇG>z |koccĕ2l8q y(}*ZD͑tIhwWANERD~ (?EE'?.N'ϗ%R|"NQx~7~2)arL\2 …q,>yYԛy.-7.+DD'S5O݋+#CA 5s&*-fN|Zb)`n@FޖWf@DEi-wF&%8)yXmC5ڿCOgB_Fr0j0%`UC*J2W1_9&{E={C8Іf8FMy-U'P](`` ATrdjr4&^z# iK%f9SIC؅|8{cJfhe.źTN GZZyķs:YE߂H=CZU PU8w3 }ZX_׋;|usfj_QORS_JZBnBB΋| ѭFA8ʑ *hKhYn@O\h*Doyy!*`Lc20}2K,uaiBIO಺=od'sЇ~ 48 5g'ߒ匡ˈv;}7l6-\ϼJST+5 nh)ѽ;^d/fv}Rmlo*f'#Usֳ]m˂*blp1vEZ/*66ql_F-~ƿךLh 'U>ciIx8ϗY^:ӹoVy@ﮨ8ișϷ9QÅ5\5h?ܽi~rNe]q:SY@բ70ļ[ryt/}h,%娺Z6| :l~;PCoeg@gt|Esf6r8baLײ0,hr gndϱn7.4m#zWEW ?olc?0*+5De۰0-+3pd5&f[I GE52L\26J2dƍV$$ӫW/trFǮ#ꐄqS9Sbٱ{)}]*a$čb,mi²2(}0&bK%UVZb/|#>V0ZBC]CYdĬTߖ6*s~$BWM%X89zȶv픋\N5sf&P}e-(ࣈ~ `C;+++.Dy?ZVMaVh(%Z-)n7WX|8ɲvs!.]Jdd$mȮA(#E/nGaG:`ϡ|\"a'M;=vz"XIAA23veVP+{VٗN,nw[NX]R}9맯3 (6clj?'괦3y{k7t$CRVwc Cqf-MY|:AR;.2ֆtK@r v8JZ)JBCU2lDkJMmZpĿ2Bv2펖"J+Mf~6Qq M$RrDN9:_s6fE7_S>yHG/{i)` z=ݼOT>.*jP}cVXgUx8~=XzL\g`>ƣw+ӱ;&iЫg˖֝t^NFQn UӟۭmwXt$SXԝS n daVչe'o4]}\4~ mėa#)osUfǼz : HA8-P w[-?n"ǘm fdQQا]X h- '19:>7v*[zG'8;:6Eca'=[ع`?}H7تveBu]U[t~ML6w[dzE ^'"vΟfW^x(BAAIII`:iӆv=yG jEa͚ٽ:f;Чo_\ruC8"(X hTNːae؋]L,c5#yC[b^uO@q$/;y}kce#_m.{ kHBJvTo* *['J\sCgk׬?M `O?v/'pRIh?|-M.J2sp9ږtځ(uSP  &@lwV~^>`//MDZ_ZؖQrEG՘iٷ3kRg|OhHW Mx]$)PYdA 3ruy\^_1nrRNic&8E]\݀ƘD[admM1S+U4Z 걗2TR9!}Y6%.tsURBCR|%*1<}} vPo\e||<zWF[\P:c84xwaHuQRf3ӹibĕ, rg x k 4Նc]3$NESk.ibׂݔeyEZ,d[i1~"qpAU-D)D#5FODJKg{/gĉ :3y֟{0rDDD*Jf3#F$=}/A ¹HͧRA־̃Ҷb=cOa ǾGqo"i0)d=7בj#szJǀ櫘$ܻ,"XGLt&EX JX_C.oGŁ;хvH*qzBJ~I?HzRʘmLw);ogmcs?2$]| XN]wky;K%NNn r_qU6-?19tb$MKcEus˽nvbII TNW2PϷ8ƑI4JK#` E16K>%` VvDZ,IuVղ_gĬ02j#>˭VXpWUHczf3_g002)k++e$ZQVXސU ;$D( Z-Z-یFVLd6SieZXwUs(""rEDԈ1< l tmnM౨Ym2mXkxa͡N[TTT #;`ym1[o%8.jٝ!o`&CDjUOFhWOP|geCy9r$هl0&OL\|B]l9*XV+a(w9 bPQ^~ktl,n|ζr7b1w/IJ"hOn-N\<.65 +ƭ7֙kZ\AXtp'Z4Rc G` a_T@q`oc(_ la' rlZDOf?gmRWS|sZ49?ŏc{D/E,:UV{"} J_=Rۊ?%u87C"s|MX.jgRqG*#~? <Ԅ2|x$X˲'u;TTSs7U %ɲlfQ͛5w6o&K@ VLEp>0&Sէߛ&8o[h~93ujC^$܂A=Uk<.dŻ8`ѓVs\ڟEܟ_aǿnsEB7-O߮iM&psEQPk5ɼ<\>_{R}qryWc'S T ^[pn(h8u#z(GQ  p6qXmt|]M$S9`ʃ̺ [fsVQb۟7Z({yo͢~n܇ho`Kk;UqϔﹹP?wJ඗[dc.8Unݲ9zZm{O?y(GAAAsߧP5j!w6kӞ-HXD4蚥2 =]W4D%fN}Os lw%(O__Oqk>jΔ7'10ʶY \725`sܝX`g*fG}Yv .j6Lvܥ &QnJ(GAAl( V( `5|WWUKBx' |o[9Hq5|vU|F$X;N=-q`qY1_h{# yɷD.^:p_PK|PS\Ʒ_88?7)hZO]NA]:L&T#rDAAs]<+V_f(IN+gdC:3 |7ϔ-:44__eQ\h9яfЊAAAA  (8s|Ǐc8NpA:  (?š+q9=-N'[7oRih2AZ#  BE=ضe+/%!)#LnQZR(Ǭjq2g˅V+ߜἿAAƀFs׋KH$4E=(++m/Z- dggE222HLLvBƍX餏v;}`AB|/hԹ+ 4i֜F Փ%KKjjlzq\߿ٳg3z(x7 gTA5a*OqCe%x32F#9ٖK AA< Ĥ$*+8F#]t!"" 擟_ gVKbbGCTV!A8O"**r(9(FADX,Lrh,4 M6t&q/t8D1"QT'JQ).cVUV2"9Y" )`0fJ ,2۷o`04*9vv '(G-Xp NI  .v9+/#ISZj EQ8r r PQTcFh(|&i,)! pZiժ+W,ǹsꌷjҁiٲOAqȖ͛p8 3Ao>{^U?U&'i%[  5Z-zx2bc>|D BujXX*+=AjIHW^t]6&&Ν>-  58qdfdي >dx-4W_Iz衇AA8+n:ҥK$M_*t:9p`?HZ4o![ 5WhlشÇӻw K !Ck*zk3n)Sয়`F8zHH=`x0'Ζ-P\ p5Э[hK`!&MO'A>~vJ_?>Ǝ <_ïŽUs0hr tZw=|>u*z2SzuM"w3AӼys?>iiiU#z=uUêUIMmf EQ((( ))Íi੧AÇ=y`t޽~mt5JK=LςQM w>ڴovysxyӟr/o Xd:x}2|+Wz:<^ -ZL?x|зVZUUQX\.z}Zh?u C'(t:JCPfoa`ض~mx+Fj_woXr% kСCppu_^4?<=z<[i?_œVZZXcM)ן pOĨGARqF:wƍ} ~٢q{Yb.=7'30y7}Rx5XɓKdA EUk6lF~5 7# d6;颰yD }oxܕ䓵?,sa_qKꛞ|݁,Ə;M_J{.|@כ_~1nvL%{ĭzIAAt3 ?D9r&7j=m~o"{LT6oͿ^oڎ}!lY{l+ 5Pݭ&OA!ʑ3I\o[7ߴvKй"ߴN|ӎ \.*U_}9FAbrDA8"3)3 ߴ2?f4?nO+VԞr% (& U~ZǏF ."hdS[ l?ى[11u/?E7^{°aݳAtq 7}f ~ƦMu/>};LY׮Mk));w_uUl{޷RsAAc9bZ[ Pil|oZ~f:T{YY'7gMt?}zz7_]yaHO\޽cAAsDQ1FAiL.Lw;loSnȋq_W߼+8'GmL|cL_~~m {9A l۲ù9lߺF#AND9r>qMop0\۷àA#ef-|^|z˳c{,Oԅ=3fxvq={:k`rO o^j;$1Gs[߆ !!~l>ͽm# (Bj۳#yq9dg}ۣ:NA!Y'Oέ:<ɾ֭ N=  `; ^}fZ|GLZ=_  t+c=S5c”x)AA8f9B=زi#w`42a(n7κbz b9Ҹ^zބ c/Y= ЩSS?^y-MY0&O=nRO pV9*&Sݺ$<< rp8$ Q4VXNxT_p_kkh4#mAjjn~BC}Voyr%! c.AAQQQԚ?D>}q\v|AAG V}sN/KK!)c?FN0qb{gV<` ~٣`hj?eKXRq'.$.O[媙q|t@.'pkY B{̥4t8p>nDYAAzNKBB4o\$s.x'Ȋ%DB‰`7??""<ʁ5kzQUU}G_bF˗`ܸqKֳ73~b * b̞=ѣGڦ 6֓RTTڵwTT6X@*VlP쉨hwc%DcIQcb11Mc}!b%D%V+ HgJ9gq{3w9γ3s_zg,$pϖfxsYҿ1#?bb`DigXJ‚:u`kk{UZf>!XR*-[N^Fy>m^z*F !F#\._GKL (%9P(0 TuBZ5e>Ӗٳ$.B!(}#I<% |B>e ty<u4o&!! SŶH B!D()4PdU((JT?''Zuyj_݋,*"B!#III ٳDDD|J;;;jZ FC$ТX|!A I!t`^ԅtB< !!;vySrT*UΙĵWؿw&Uܤ(}˖7Gu$QDD#ƍ0V Eǎs LJSC)/I`/+L9/YILR/Oz5T߼M}0VVk4mj~dZY!㢮ɟss3?ullOlʖ5rZH6) ={J9ƒB!DN^% !OFsx7UV+sj4UBȡ8::aI^̈́éӧDz:/FuTƣzWзn"g}ۨ_#[LU^ ?!!>Dw{c[FY{udO^׹s0jT^!66H+ jԀ7 •q*0RĘ{"x{C?7Oٳе+ԭ[kDE5KZqq9ǸUWBN)Bd"\*Ud2ŵ֭t\̂E }z*Od޿?Sb$]/(ՙ3#[/sb$#޽N(zYڕ)1{׮?gNdt"+v v킛7 wc֭#c ?3'Frq1##GQI'jxFju-ƚL`4,V(.L&>7[R m[mѶu&[[}}1YYa};KWL⫯Bv5e9 řG/5jԲ%&{{>zɓ=U["t:tP6;c4`yI4&&¦M %OT J ?0OrΜ ^ҥsgprؼ>L?*:e֬_s9b.CN8u'ٕ+wlhSKrD!y%jx1%HWҽ_g{}6wl'6>1&uR PMTh3$G_m۠>59#ԩt#F$zwޞ!>U``J']}$6[ 5ZA+' :͏E2gg:u۩SKg^IX.upp+޿yGG!5^- CTb\ ɴ!dZuYnc͚ӰYl߿ tJexY0F`V J;Ӱ,IL|?1͜hFnS2Th6_@ nYRPK?#o3*Wba0?k8mþ,Y5?i:&;xR(G2$UMdH^uz֧Rt-6oF<#+.jyEW")HGRERP#ʘiMnҿ_nݒ?B! =t6-xe\3`_?S[[YbmedW﷨L 7gz~+uG^pf7Cy;㠪FF 2M>&n;ı> 8s҅\zilS~ޙ/ go_"F|~4jԨ#M6(=e_xE)_wkBx;3W 7ibN#Ҝg?qϦTP2U1n 3݉KC5}$z|waנ0VuLE<(*m[N-͛h@bݽ[z?M9IRPi\ 6վ=XƘ`X¼HkV1B!JQ\-+W|dI{JL}eƑ%/fAVEBZFM͏`rC|KC/ѯY5*ĔSq{VEdv>opkjF}vr]j6yG"!Bs^~o_8Q1 $$͞$$szV1Fg>Prt c[jH9Ў3<[ߛ蕤Ĝ;2>%[doOB1/nCTy1Ҵ \)pXɒ0pyN/˵c\ ɚ#B!DF#Sjx: oW%}&yTIq`zx9}sT-z`EUFֶMYCSޓ#9I974PQVU‘n6Qc[El819NOxH.j'%eu$]~ jW+e.cb0h,x+/x U]ru?dRk`2M Kv^ױɵHϠPfL0a2,'2X9թSYvGo ZOڵL@1B!BV#ċGTJU5 (2I+a嫗QUG`2Iz􄓒%~v,h™NL*Msbԩ*m,~f'/CnUP<5)J:`\} oB}KPDERFg ]2'I"Xhy`k CVI//pwG0OQʼpkŊ/nbO<6?&,?^ɏGpgZ(Sj>ňd2ƌ_Q!"dZ/DO4lD ܷoSl %$؏ٍFɜ!!11kׯ2o̞9jժK5sl/^,OB! HbQ*rw#l֌eˢPl2{.GꡱHWZOcLPX[[kn+S)Q$H($9"BLŢRqqhԉDEEzqUR=uգ\XYYKW\\\HF}vTJ%SNN$BcB!FCe8:UDOT *J4I<ߏVVV JI̜5[!B!x%/ZJۇ/XXXSlTL;&B!ؐFӴmۖɓ'3rHlmm%A"D1#jB!Œ`@VS~}oNdРAHDbD#B!BbIףRh4xzzOΝwAIDbB#B!Bb`0Q(lْ7obii/֒ 5GB!J#VZ?z`Ԩ*xyEUJDB!BK!ejJJI3t`{ai)OE&B!BKj_ix׼{$dн/.V#B!(VܸqV򲰰~\r0J(Y҆ >q* / V#B!(Gܺuү_?̊+xe# tFTjb0%9" JF!B!#AAADDDo˗ٙ>}1zX[kQ(h4*Z JL ċHB!Bb͛tꫯ`̘1++m'FCxfKj.˽pM Fg :WS8<ʷٴq߃=.!B!DԳgO3f SN嫯"**crr4'OGb⣮!wT<,P'6_{v[y*-%Զ~q;nl]ilCU.=귁_y|ZU(B!(n ۷wߥA4lؐ%K`kkG} ..)vLh;},:E]$_,:eӂ&J6 _ fbpTU, !B!R̙3;v,קdɒX[[0|^yΞ=cz)1g݆hFCbDzw8?u0:tr0ּĒ>)A \%mN烮DOFPB?PL&okNCkfL9y%FlN׍]V-8u1~o{^w׍ eӔS&sC YQu=\ԊVyke|t|SFIcH\ǼOgכ9C҉.m!<ދyKy.xL nbl8{)lG1B!B|`ܸqcooRDTҼys~j׮Mδk23 fs=b 'bz7cښ39xOLxZXGN5ʎFfu_G2Ï3A?rLT E X F~ /2lz ܹkggA8&ve9:7Ѿ?[98 M~cD+tw@5j $8yY%u=V6/P=_/vggt3;Ϙd=鹲x$rs[)MB!B+* -jfƌjUʕˣ<٣@ƶGjiϋ*]a,ِ5uJ?ګ>xɻ:n>MqhukwTvF2ۍZM2e+a{r3 !rKG0EEy1mUjғCx~ WTh'_LGH F-WθVϤQLt `dJ$FjThʘRﮃ]RNFX|].eѲs\6ڱa7l%gdy[١BME>LoW%hi KG7y:cW?j(B!(n E۴Z-Z[[ \SjBGUWc&蒋&kYò73} x{f܍N~gW ;4f%*PFkK\W815)ũWhN\!tJg&ֶJVCji-KiҕJv!I8 '&,,~>||,D,oM R"dsk(5h %E-׺{,@TH)*[jַ%T(F3c ^ 2rD!B! dԣ2arJUNEv簮̤]?qltŮQ0 @@L [ PH[gM{+.NLיi#*KF$dZ$PSk>Xfxutzo&*ڟ;{Jrl]cC4kyrݓ{I3e2aH2k~_<B!BǟFA1QP˻dZϚERBs \M! HOt;i qn m Lrh؎z~#|:GubDK3u$+b S\fGǫ[0#?cƆ ݸCh9+.$eqEkVS\/2MTRm_Is#cű1}uèʑ}(37+yP&oeo I!B!ij0bS,X5yoc]7wnfX[1o̫}*2N'`:.Ş~516Fsrq `gtؕۗs$Gokk9{Uv0hQLЏ?!:BK=ofqs\ȱl~3;[Zšb4Y2/u.?zN-Q_ seHt7`lZMF¶ZࠪH&vr!oeW I!B!ijpm2zik*LDV~@a8E=^S_4njږ)] {I9ė\:-*VϋiP;=9 ]7G\FZVX8U]\h?q,d+Ekdl+{4 v{v (tt3vzjXZZQp;i0r-?m, OB!B"-KiҕxHBu;bήviT *JTС" !pbLGAS2ќ#Yf`F{O;xVwlyLgTQu%W;ӎ3D$ֹ9jJ-ҊVI\1JO`wcz+3#*brv)oeO$GB!Yc2bR`ť.Ȫ^+UiΩ 0Ȱ%K `L>ܺ2vDq?>Ƨs^#hk=)dQdKaD/fgOl_ܜ\;忍ES!B!(ZT*%ëu)] $:{6ԩCA1 )eՇ$8&M6D):2t|ik2GM$ʐy_c\2T갆akF^bɀ8uvl ~4%"tEg~(L6U^CAW' {m#(gB4CA8C4?']coCbe "FOq˱Ώxm>ئECʭLB!B<~z.| ycФn,{jw56;G9l(;/F~5[Zqr>gb O ]X F~ /2lz ܹkggA8&ve9'sxɻ:n>Mq#|QCx33iX٥Gph~X׹WIHce|2=UN;ur[(E< IDATtt3vi*25GB!W2 APVdJ5m6+԰ܙM%gU48$q-Ɣr87v:]),JӨգdt(b5@B%+S:%WhN\,kx3?#'xn6 p)6#M27qn7LgTQu%W;ӎ3Drscs*Z>c8vEJK$GB!(Ӎ)*(0aTs(2&L&2lɒBa~cc֕'=4> E3+.-wyE[Y{\(2͵_[rUbHe*?2F!B!mj8B؟R)]9^`2moW\WSRIulS]RibRvofRچZ7]G&~֜՝\cߑNxrC=GlԹ%eޖkQX硝D!B!㧮،w[ǰrwl<}g{;1) t:sEġ/r9y1_F.7zjeiRǹc9c29V-ǁwu+&0T-[ǎ1cn!QV}-So*Z:2`Ps)K1b9WFB7.]8W4GAc"I!B!ώ1_6HW;ѩѪҁzZ/_\W޸]?1E+w ӼR<[uf^ԳkDFYounT?M󲍹JK5@Vϼ0^_615Ԡ{|֍?vW|>e\K,&׳ȵ,Y(m9H|eLzUZFDa*1YB!B۹-Zد M1䗼[Y%)YB!0u|[R=Dz1` *JbDI#B!Boy;jn]*5!&I!B!P^*# !B!XB!B!5I!B!4[z}VwYՕ oh1,;ҟ;112@e-DB!BG}m}|(46o̾0Szf]j[?v 4gCZn^y6ڳ+MzF:O,bSutoAdB!BŠʜ>flWE Ǿ׹k\WvXڦI< zjC*ahE z7X [ETFDc 8HI!B! Iz?l]8SVeҞ J1*%}SNi !Ow0=dSn]NTPl$O]Ņɭm$.&)B4C5qj2/>Pe4?']coz؋ҕNi>Ao3P83]>K,0gtnm284?fti$/GRwOc؝b)~icbud!y*).MSS%1fKz \:M6婹3ߛ^Sr'y=·fh4'_cs+uX0$GB!y*QhNL>u9l(;/F~5[f*lysf .eۏOnXμA?1!i{2>d)Ĕ-8+VtdX+db-}&r,p)k 喖ckLc׵ gtؕۗs$Gokk9Zov9#prn)6Jn=WDWn{3ƵKjϯl"vv1 wӘr F|BXsz3+ٻ3mL0t9ޱtH^i5a[ BXFk"ء2OCxڍbQ?^dzHs98_]ςB!B<_g^=wZ8Z >F1)Pph~X׹WS9ė\:-*VϋiP;Ly߁meFaAnN&J,h錝*5.Φ_0EsS^z<Ϯ xFTөQ.$X5)]H}v j_ ZwUFkL̟s1./5ZK ,--PbcϝδVrg^mq{P׽6}Ja7i$ݨմ-SF,71B!BM[w84G9ε_ϟsGtɽ_-N6I\1a9߿/nHb:3AθP4 n<$ [QQu%W;ӎ3D$ !pbL딄;^e9q)CcsU mJrVI\1JO`wze[Gnԏ;w{[S 5~*@MGr6Y$R۷&ө4]0=Vrg2GUD 8Sؑ0jRYQ5GǨ(QA"6|W#B!B QٔOt`|d,_9*ުY S!% gzYc3ꭜB_Wգ2|^z&#&U V\Z@YgHxe~j3;%ϢQ:Z$3:^RZOy l _ӕ틛S^xtPVfĿ2F!B!Kq$I_OJ ; l\*Ѡ* TA}GJh,qf~ߠ*a⻺Skl;2ShRF_A7 zب-qALxBu7 1p۴5p5+ u>IҭgC" <_/ͿcwgPH7~pS":S#1>D u.T:ޒB!Bލ[+GҸ9~Ư :ZOEK'qVEY7R x+_}W{e!˨p25z}7,+fMdVZF9Ф;/(rF54i6VY#9o0Q:taL(mпu/6stXwoYo uk楡s&Vڱ5KATpM~'h0971.u@ʕFG+WOUat)L0G!B!a;wvE$B2rD!B!Ś$GB!BQIrD!B!Ś$GB!BQIrD!B!Ś$GB!qK u->,JÅ7Izq_택]OʝE U'u͟D{<3D#B!BQnaFTA ڼ3LyYRKtmf,Ҝ ky}XkϮ4Y|u<3'P {i3D-„B!2絏YyUQou6NmmJv~} VoD6C#8!B!($}iw`NZiJ{&/*sƨ N9:1ZDH?MvE8{gSACw8?u0:tr0&|Mi1c9_e&aϺ {ZOr=t .zƲ=u0?']coz؋ҕNi>Ao3Px|1Kf[>]<3 ۴mGٶ9y~No^Sy ^*yZvi9؟Ѧ<ŢPc}5G<\%9"B!EMU4ќulGx X# eEO#f K-o̞%lb [ ˙W[U<'&d<-tE7Ѿ?[98 Mb^'wl\tiE`aWfn_ΙÓL\j9مv\ɹ<*\Y<]9.@vænm!,l aa obPeV&_4Ӂq~;˒8*oxڍbQ?^dzHs98_]ςB!B-E)Oޒq)ݛF?a;f"ivhdC׬F)h ϋT]bwiJ:Eڮ~a1d|=Z%-@E'xVX8U]\h?q,d+:Njz.qŴU}KO@ƶGjiNKG7y:c!"ϩ=PZZ`ii"xG}t5Pe*K_Tu)Kט?b\^9^hukwTvF2ۍZM2e+a{r3I#B!BQ,>h*毟ѷ W~EGdԁ&{[l1a97uBl Sy΍lGؠޝeU7D`,2h$Y-ܗThBMˍ,ԮQ˟5niVM(0 f+}rN9~އu}|ιnRrǝhQ6v3pLU2cxӸ'iqKRR9fm= !?ξ l[LJur89Mk]-qq1]p b TW;}/^hB6*w3rx틓o lǕ{RGj_>2/iJH0ш<і8we'&Lfsčb[T^Y33*BD3|9NJTLtb4 fe߂002RX>~9q1 ؆8Q,q#{w2lϠ07a'u; {Q7HD 4!;;QP3o5:%4r18WF%˷*doLDDDDDdiE0Xv#6OOLlJ8SJ!1h\kb5wA>D%8gW0/ b*1XWJ؈3|jo^ _>a4CzLEOpJ!ƈF~8߆GLŅOtI7Bݡ뵓z?pVZK?mnmIݛ"- ޟG}<ĊwPnɎ*a^wf2 _$"""""RlЖ͇I'÷\ͬ$\q#Nd7cM5F#""""""0{hۉ?E5gFw9"""""""2DRFDDDDDDD45GDDDDDDDLSsDDDDDD^yi8}Wշ+}5~e#""""""1.i鲇F=QtqL~av4uR͔RɓchJ1/J """""RD9)6xFN󊠼0,?EN0m\3VkVxZ~N7JɔvKky9(?Nն%~0D5rXak?냏5kp.;IqR45UjvMG3y3c|+ !cCcnEwS5bOjӋ@g6wN5d]We0m5]F\Gűi _ jx8Ҍ)=_HD$^q6%AFNKTLGrNN"v}ΘAnq;,%.+>315_Ć+E6fWe<ӞƲv򎮧O.%.cxq190r+rQb]txS73/N쾜"ăv+13!Sr.c-)#inX}%]w#"""""":&q/M.,,I|u0tٺ5Tcmۈr:l7P?.=_}j mLG[=4-{9 y)ۙB9~sdkz[ˠ,hB5 _:RXnFEwsqQ1rj\jN˓TEI#~rDDDDDDL̨ nO``e>BZNIt5LɄMG}dNf\+ ;6}AFQ1?a>߈!l:MqũOqQr2گۛ$5ҡ戈]95r#jUplqzQ~\kd13"'rԫe-&/JŰN$r8+*B ryn;N붌fWh۷|svss\#G9̹+M/G9Ą V ˜}Q)5ߤAM:8Q,q#{w2lϠ07,TbŻJ(}G7cfo"?o#uBP˧Y>tY4}g"C\}ysز*x6|2>j>nX/'.X8#;}n j[<~/FMJH;1?52+UWO%ll>x@^Q1h\kbaTN=r`}W&CkpDDDDDDnaC[7BL6uEh~^e9)6yg _Tzݕ} ~l}O܂ A[jm.jƨ%}[ijH戈Ƚ+;p ro3{ە>eߑY9u˷F{2sv'PCA/nґƳN^k.MBV{ɓchJQ%)ˏt4}`:3}W:ujjۏؒf?`g}F` e'ɾ.LaoʧѯQbVkJk |"J`N5ɗl<Ȉi6Z=t<gMG3y3XXJnkHT/7;5UG1Su+/^o2.mٖQȘ/ױф3S?"(?!/Qok<.t8[Q#""""""Q>>ٿ5bWTCٝ0:VcZ]gB,\Z2Rbm#iȘH`##U4ՇφfYNaK{|V/n96=1VocTv1Cէvxy%CH۲"/e;6}ְU<3/Co+]ݛT:c0?a/1lg: ] wCÉY؃I_2›#NqR'["ϛ&f{kEZ>fe߂002RX>~9qF?+n51ӿ8y2 !כJw2ja< G>($,V$o#!ig+`PvRWC疗]fHzdg琝C(ޖV?@DDDDD>`ˢq;ŖUSyZxes5ZeW)M䇓m{ĴY\j4Kt# c:-*}oU:_+?E7 '|Dq`[@]ύaXm ʪ8ͧOP;VZts <؊Gm\N=r`u_ڮ$.ػ7SEl[HK[e22 H!6lhKU2BՈH戈ijH戈ijH戈$Ww綟O›lJwࠜbNNQbv2r"+O_^.،|ڦ-!{D*[#鲕#SN̛^AedD_{݁{Zyn?ú[bɸ'~jDX|QtFN󊠼0,?Pӿ*]y\莱q,&S6۹/؄&jE{%nȦ O;gsXj6|r'3֒1:4kUaK91 sl3xq< kKx1L\[@\3wu15t}f)qYH`##U4ՇφfYNaKR)("-mii+_osm{bXnq6%AFNKTLGrNNrp周9""""""r!jc*ݺNfVKQ_v2y+C{@U'bFdz`9J^>L_Uftc`тå6KuDudOWνz g 5:=K+K_p i@<͘-)y#&dXbc+$y R>Es`Σ-DږЋV*=.&"""""rea9Y|ROZqca]gC {*ƓzӾZqڢ*^W$oqORIJ.$rϰzWJΕC(=׷WTpH89Mwc\L`bxp2 e8[`#?<O &f{9򠒝ԕЪ'ɺyA%mfgAvv9 ,Ķ87=3a} k#v \W汎ZmXhӍf%{`+rov*Oow.F1{ %\Vk'vXĚh¿ߩ~^:dfb;5]s^l5m?bKqY|*0o؈ȷ8vv?M!Yqx`Sؒ~zZƁVCؼ+؆9.Q <2u*A#;9)"FF3h?ѫ{xiMc 9#""""""#CX wL8޳c[WɌj)9J+^^J97-81l;j1Eژ`V.>އQJڌbl,ZpG ,t3 'fa&}ɜPD=ɅXp i@<̑g؀!uST;_< fh`<ڒAmˉ\+]ݛT:c0?a/4',*ȽgK=yjō-u eHiXRrǝzu{p}jm^8ǿ\.G3LU'{7xJݿT*{)%c&rBCI(,u|:Z'w*r$Ŧ;_F~x\郧KyQfVLȴAx3Sٸ#So:Sb.$';w_5eaw.Sqķ#c?;"tA4=7U|L00(ɻ L7'h( c噊Z Mq3O|*[Nʝs*kůll~k=ny!sfaDŽ XTAX j8_78sX BkzR̳$Ж·In:ن96NG=ʹ8ˮ.G9V8sc&ygNaC[&HacώQL݂BQVn=Xj#*J """""RBΕx<1OFa;֭Q, 3ɛHH=G,áXr  ^ʟOq|v%q^CF-Pr2ߙ{է:i} &>Ha(`D㟃d ɤ~_=yNwhdN}~͉yIO.|Pa5GDDDDDD ևhTL୞ch0ZVL6VFs Up(dc~2?ߝ'\-L g_k!d_j*aȳ_ >a4CVjv:60L}1 |ߧj> fIۥT*rznG;ޡX,Xur[-u⦴})=&S%D'8 iy,6TvZy}PJ"bߒ1"RR$#!;8 "%k&HJ$ӏQƶAE|<&PqMAȁ=7Lt- )`5HXFkVIENDB`PK4;MH3qq&fityk-latest/_images/add_peak_icon.pngPNG  IHDRשsRGB pHYsttfxtIME 7#amEPLTE1NkXtˤԫ&1=QTXfuw؋ܗޜ9ntRNS@fbKGD|ѨIDAT(}I0 C-[0CK*$ޗ-'ߧ r8>9|tkYqK)xG3 WgpdAU^X*9"HR)2"B5H&~gT`l@K63[|UۑJM+$גΎ#IENDB`PK4;M%tii!fityk-latest/_images/fit_icon.pngPNG  IHDRשsRGB pHYsttfxtIME 7)PLTE ! ('$640@?:@?;BA#|!` &OFrBI ;C!! 5oM*[ 'Gndo"qp&1hl $y W}Y~/HSOb0 KfjR hI7k GBgh1[©%U*w.=ǥuyd9@=IV`YF)J2P!IENDB`PK4;Molh"&fityk-latest/_images/mode_add_icon.pngPNG  IHDRשsRGB pHYsttfxtIME 78uPLTE1Nk555D-FFFXXXXt^DcccdT5g^Fnnlnnnxwuyyy{{{}Z"`X_i~6iǯẕv‘‹ōʖ̙HtRNS@fbKGD70GIDAT(m0rй@;TŲV}`m'< wل.a߇mnTaR86 LXnwa9GaA$_W aQF r%IpM,l ,PQFB$120BIP&R>'PҙY_Ewp$IENDB`PK4;M)"fityk-latest/_images/mode_zoom.pngPNG  IHDRJ~sgAMA a cHRMz&u0`:pQ<bKGD̿IDAT8˵ӱkA]. jPI   #hc#Mk)#,A.j%`)0 Z5 &gq%10MsYFYJ_Ҏ]ɘ`]/AB MǂFoDSuȷD VQDc3X1G8WϘ$zِɜrh᜖譓8f׳{(%MEu]JP*:r!^)TW-V!ylԐ* [,+kvߌVEHU ++ئ$hdZB!%k竾 eK4%IB/7=a׈YeU@Sd;k |ǜ5Ҡ뾩jS>n75SčQGLF#{*/r%tEXtdate:create2011-11-01T00:33:07+00:00 %tEXtdate:modify2011-11-01T00:33:07+00:00JIENDB`PK4;M$Ffityk-latest/_images/math/82b6c33a7f25815eb39004272639a0eeb3107ee4.pngPNG  IHDR Rio-PLTE:tRNSt2H`7$b pHYs+ZIDATc``2a 400Q]I+3ac [(^xu"qcgX'WW,Fcd:Q tEXtDepth*IENDB`PK4;M''Ffityk-latest/_images/math/46e88bfbaa4ddb7c5020c72087f89755701a084e.pngPNG  IHDRmT-{0PLTE/ݠ{tRNSHt`2iF pHYs+IDATh[ULwnLx, ` Q!5mKB}' dF%f1]jP Υ3iMI83g͙I\m~'4On1O@Ÿ>]_q/.[I-Ovt2Վdh=Ώo/⿆(A8jc9._^a_FU4!^~zˆ #C^p#ANOq(rnށOdiLT<<wG27q$?}j(=½ ITry!`{xO.w|Nf#h=jܸ~4KJFv@κPJn o!AP 7V,I=j-eF5& c$MIB2ѓyy r"퀅1b$H67zeG~8Vm+Anhȋrg.D,Ff+r/ا׌j$gH-KXy~ȡr#ƒ7O|&fD1d FirgrDm n~z=0v>h(8 r_?Gz^έHT.w 舞f>έGg5 ,o_+ ulB_GPeJQ.-? eܐmﭏm`Mjzʲ]kܨwlֹ GYN6&LmdW9󭫋}傁{f;nn#vٛw:7n:w(f)#r/u؅[7:ڊ`ʻpSp/}\BmCOLg9]:p DN?:\nܛGw$č=t od#LJͱI̽ոCxey ? qKW "\MY[)FRE?<+B*QdiD,'wq]*g[Pa}/[m.Yf'q̤s*5۟xa]NHk6.m=OV&&{p{kH lr&.e|g \Gwi>l{+7-Y~<N=eyY?z\Ȓl}ܕWRsYF0[E\,G""^B/b8jG\q=k*򘀋wS2'bԬmoɓg,G8 7Av #8߬7d.~G38O9w ZVDEYoٸ@ibtgLܬNhfj'Tpy̔-ev+b#hU;h qd punR;z*hٞŨ#øWo6q3TNHxfNcAID 7ehRdXR;-s|(2򘹝 *MA/Z[Z,H{+{Aq,Zvt- [XP!}S1W "܈=C͛[Ri!KbA%n̺Aj2` 3h.Vhy+bf U, 7L~\4ES\}`hsNjg aOq^5 OHy=ӚF3pg=ofA5Ӡ+_(QQ}脰p7O*(g+orF9:AǒЭp ڮ9#ᬱ.՗d+" 2 7Mă1uNB|@&6;#ԱMZs ft)'Ǎ8 p l1j<W6]L`Fipr: ^O$Nipi̛.W NKR7 3!Xk'Z0"ڟQ-U L ӂ[ZVB^m]hGTA{o xp&8qA%;\dHR :,C]hFt̙jgęU8h8JBWx}@9·Tvz.T4H%Y"}`+!uf=Ij-Qabnbinfx^%EF9m)]1(ů gWĢǕfYg+!ـlRN40IqEs#Cb8YQ0(8t?kʻLtBǒINpe0bllp }N5G,e/0C;#48?Mß fLtk?}&Z4qveL  e稍}koc,kM\Oa,WEh},_Q<<]^fێk;=)^g(c2#pKs\Vo&k$ ŲnM8NЫ1U?w+-.ObD>H Ŵ[a͒p}zZܕef^/YVۤq}ZZNVh{֝z<υو^ѵ>sCtS3z&iM =?W=ʮM _tZ>>M#47dY_fmD4y^ R]e^~P~6~BׯODNOuԧiDWZAc<9}SkU=)  R-4+Ϊc,Nl@{)¾ Ĉ;qӈ ʼn}Q͢9z%w9K|e ٥fu痘x.˜Gz ^1_7K\Ls`yo-@ g(~2gAc\SzH{ޟ-t߂1&Kq. S”jC gzD]&b1} S=M%` h UWVH jOWGq{XcIZ_ӂ5tr;TT#<_uڅOʭz8Ms<ݗܪ?+)&]1xE+*]YcHCCϪ諙DlkKommm/qxĴƾ tEXtDepthP$њIENDB`PK4;M{хuuFfityk-latest/_images/math/198cb72d7f33a94ffdf903e3efab9f5ae1872d54.pngPNG  IHDRF{0PLTE/ݠ{tRNSHt`2iF pHYs+IDATXõ_hE{w{ݮ RWb yP6#MSMݞRQ|/w1IZhNbP`i$ AH/; | t(VOa84!jB~~\"J(ϫg1Ȕ "mr|]>;fW\r9} ^1 </ x)-+5f"|V h»0{VeȯD 6%q|Ѳ>m \QkWD6iƷ;0|0C[K<3ytJ# Q"K#9iC"{ L1*Q"oWXb -!ԉ)uۍaLf'nU8E;=._,{$jnA峩'i3q1 n º2QW*T3{yUS=") ƙfoD:wIZ!G^W>G%N/N]7 SG=UFޡ C"ikbUFUcb|=r9}GNo-~{z {e ӨV'lFwȊ2o}K0_|)專!Y/2Nb E*CԴ,OAx8eֱ<<r;Sڼ[*Pfp"|Fg;3h,FxZ"wv5B rgC/6  wv0X wvW@-xA PL{MP;ͺ%Pn֍!@C |PŮRa@=C1 oD<@c$9:66 tEXtDepth'# IENDB`PK4;M;3Ffityk-latest/_images/math/2e5678c68430827a99a39791cf03ddef7ab1962a.pngPNG  IHDR ? 0PLTE/ݠ{tRNSt`H2O pHYs+^IDATc```2b 0eMp', X " pHYs+_IDAT8c` 8c 2@+9n;J7g SD\`+@Lb -vH\0`2q(nbo2!! CY!گYzE$ó 148b00hV.ܿ\U.c+Z~djr+Y䀪/IH1 up9 x6g` XsՅL?Z :}ЅP`CO5@*[$]`da Y(r2}]5w<0N@kj]aM~Lyr tEXtDepth*IENDB`PK4;MFfityk-latest/_images/math/0dd803736af6a091acbded8c97404622acc0c6f9.pngPNG  IHDRM~0PLTE/ݠ{tRNS`H2t@; pHYs+!IDAT(c` \L* QXT_j2eA2EALz#Nx΄$w\3a``+ XXD@Ӂ5@ q : \ ,Xf``M`xǰ?Z^DU1fw"/#Xx0;PadMvh[}0R-"̠J2 (`6RZp&>׉D 4oQCߒ tEXtDepthWIIENDB`PK4;MTFfityk-latest/_images/math/7fb9030145cae5a860f1fd289a8dc6aecc2b76fa.pngPNG  IHDR 2g0PLTE/ݠ{tRNSHt`2iF pHYs+/IDATXXoEd7dsoz )TyT8?HĶZ9h@8Qkk RP *mAEPYz)Q8(R88Tӫ֠ƝdvgsX߇۽ɛμ7c뙵8uLҿC>I !e}'8\ZDuI[HZWnX:!+ S~W_# 0pq;;m" bR> ux綥- r'S 0p/zRwA=@乫{U'~A?;Ws*0|@]xe_!XGEXPַ\0K7Ϫ>\1H:+pCCSÏϺ&!8j 1fsN5U(F3B>.ppN?86bg_מc#ͩ I@ȾX޺,Vׇ#t0 8}]<5oߒI7/ +cRV!Fƣ[XQ*>rMS{ ћ6Pj ʗRO8" 5

n}ik?Jc*Ba^֕'a{݈1,> nosLN%,3h׮ݽ1]|N'z`# ߀} XUU#s3q3^',cy]| f }^nq F|fIe,KGfjFHa .O}&˯] !Vp5d rSGILxĶP@QF3tA;|[VO\T)BЈ+7*0Zdn_N0BƋOFrV8*,' VRH$Vm N~>t `a35eophK(I2&ώCPo;qأ־@K 7 Jji5R{hx\"t&l$<adklIm8kƑJȫ襣?OZZL,UcpX0zEnwᥓ9O  ӨRY9D<]+cZ_ ◒RKkti==u=DQ<Ěg[S/dԊ`;=NvKYWt2$,L>aRyB`эpS;*{,]F}F7c`p,y`)iZbwM sSqcN/8~\^A}]q-H/?S|{[ttd+k؊l!YjWR_э16*=]t{^m"܎o)yTÐ\R~Ml5#E5̹Xi( r<2(հrbYfȖ0KFSaBISFer4@5l[DiFyީz{ F,ljYSi !V6:a& ^K&Gx}O @H|^EW 7CđrpH/`_@ My@ tEXtDepth 8IENDB`PK4;M%%Ffityk-latest/_images/math/a459e4be901c41204a7f52eed29f7cb8467f4e98.pngPNG  IHDR In0PLTE/ݠ{tRNSϿݯ`Ht2LN pHYs+jIDATc``\*lYppe8ƌ1ab`9LC:s[my V?k pS \&9؁&% tEXtDepthWIIENDB`PK4;MIyyFfityk-latest/_images/math/fb46e498855f75c46a7d116199b21f6f23c87f69.pngPNG  IHDR570PLTE/ݠ{tRNSHt`2iF pHYs+IDATh_hE{w{ &!rAZJ6k0!'R}lkA|pRZm^M >T{OҷbԻ؄\f6{+y/n~; @3ͥ\EM$,l-(W;ff+c:q?:l!m>b -^/XQ*)x&'#a%]L܍6mߦ9n>Ѩ M9jJNp;S9!V-j[I9VrU),sl>.xe4{92nϘ&[C\]Id -c獆gSu.tPYFQ?Al^*2-քI$|K9_ >Q^)e|õ-a+p J8}"0_&V/6I}A)Y{`u @^HO6@E﹆*@w=j ?{ WA7|=>ْ$Z@^Æ0Pba'[@ 1jZm6Y6!#DCK佳$)EfcWbp9LN.:O\麡#M:ޏ<+mw"57ݲO}<³\6we)\}saFM4wH1T沅󴆾s-e4h}v9-V%)Pr蔃9lHm,V=+7pM6?eo,2V­ya 4 POm.N=ZԂ-EF.<_Wr:BG(6iHf"Ye j660 h) [v<ȸ߆l2޸X (iMl* ʀ'3db+|;d6[sYDtHlJfy`ljbKm-J_!%B"fj- "Ѝ|-S,B)`@Rۘb6t@ĵXTM zZHHvx_;6!9!/7N3/o^5gMX{4A[{Fi<&{"Cma|u&T6Y7V*gUEa8RzQ5RƩؓWٯ~Cmc"sU(jcKԞH]kqZ[Uܢ\x%-J p["kaڙz?8lg۷îv>s l_bvl+ە&nPVWO zTr)W_6YcJ85&k!e wiZr܆-L :^;9%c8eӾN,_gys7[ut%@*/Zh7`j7nqzʕxDl?i)[ tEXtDepth'# IENDB`PK4;M}8Ffityk-latest/_images/math/18c71f4fd10bc96c41977ae3f6aab95b52845f8e.pngPNG  IHDR7#_0PLTE/ݠ{tRNSHt`2iF pHYs+IDAThݚoheǿw%t ["nnbab^s&e.Ζf B;u0܋"S|on+CE h}'wܵŤ y 's(}ٌZ+uoלj)ߪAjNOJIw\UFͰ./VNy߉R^7&}PQϬ4q6]ur쮘^{հοw:JIdu]uTyȣOYE[AP0KLQ3, D2]iH]WݵO)(I| K.Z]vХ3Z/ ]~Mkbi{oYEJ%vف4wP 1d%-3*.>g*^= -eA%7˱@%) x i1Tf6qǘ:tz|$U1Nj i1Tj6 3iXJ!ՓY@W3iqT:M($-N`)OH"LRZ[ftS($-]F5I YHY$`&-#FmA&MW^R4aGm*LZF]&Bܩa5I,X"0I!WD[z(U;i5bYR+IC)[ک
n9^JZZLuy.t;PWEV܏ʫ!SW%ֵmmV*),nt)mŶCjr[5kǺ5ɸCJ [r[5kǺ5ɸu7݅-mխI@Ln+qx~u&կY65Ʌn+&' [TE2n+dG66Tsw[K^ZPke}$I֜$L՞g+,gke tEXtDepth'# IENDB`PK4;M Ffityk-latest/_images/math/03b14ec17e8b0627411861fb0b3d88d197e7aed0.pngPNG  IHDR.40PLTE/ݠ{tRNSt`H2à pHYs+>IDATHŕMHa;5;Hi҃%Zje`TEQC H!v )%` D'7-(RV bzXgP/;<< DKd2V.n-iS|]{1u ?]g毦Lu n݄x޼oR5e39goOS3yi. X>iHɕc6ؒ_V搂$P*PE0@d>Q5nr8Z"M:SkurF3E<{S܇`D3-q0.8}^q'cD&UPוu:f*ih{< "M"g΅5'&oM`MR_4܏`%E_ y|Wr's)L.K/cPw}%}-h:+\55$M"G%S4;ɹ tEXtDepth@D9IENDB`PK4;M9ΒFfityk-latest/_images/math/fb89856ac17a1bef2bdf0aa95664e66388ccd336.pngPNG  IHDR.Q0PLTE/ݠ{tRNSHt`2iF pHYs+IDATXŘoheǿw]KL+iRahICXDQQF;KU&ñ *23U2?R <']i?/"g3NX܅%RDc{]VkU`B b1:fAb SHcek(1^uG7!(ٺD|רt^ DOVv>lW*\D`zz:[8qt ۫%iVRxl\d}܌R 's|WQIA$BJ6!ai"17;'c?Q{u<{n-92u濹 !𛛹!v2@)' )湢DVE6_%^bBӔ!]X TBGXA>ue/! Q2>c4s4 :F蒧ɪB(*U '&V9&!u*Lw r U 2>#$K@M$vv\A2?q@‚h\Q~ 0Da ;FLM?2`eB\wcA W V5 V/kE|}twPW*Ԁx*t^YShWti Ubi3 qIjNW2)uBks; jŗuw= Pʔ0,̲j64 x46Y 4HGa{)5gˮQ+G"n++$-_:!aw[@"TSqb9Atͮr,yg5 j˶mn7 !OG ט#cÄ#f:ӆ tEXtDepthIENDB`PK4;Md **Ffityk-latest/_images/math/5c3cf831f25b3db3261bfc14656c8f00fa52d670.pngPNG  IHDRz-PLTE:tRNStH`28Q pHYs+sIDATc`Uwfe,n8 `k0LL0\Qف5ݻ  L P5"0`0w8e=Bmd`hfJwP-a tEXtDepth N%IENDB`PK4;MB8Ffityk-latest/_images/math/7abc1f2f38653a0c98c707f88719f9d2d48c8fd1.pngPNG  IHDR0PLTE/ݠ{tRNS`H2t@; pHYs+IDATHVOhPYҿA8:/zpacӃ Vx^0>w!˜5IY0""j > ~NlÏ?w㜷dyA@PM?ݩ| Z}) Wf4Lݼd:@~{z%0ꃥ鷗mmAN P}C`bz(,xvgQ mK'{;60zx*ߛ2vd]̆0|o }"9.)I'lgOlÃR ԰zr,WC= 0fw[.|(i nY֙B6p7p Hά =UW`~. q$_X"6 {WL;k%Ӥ?'gT0΢/lMVȣw-?wC Pdž'/8&`:2*c'"aaiT8sk60؛5ZS>vgU7`Nz>2>4 UސcT8c-iwge6Pu*r0FSGuگ{Z^6`\yQTW?;RkETmr{&,8:T 4aUNs)be/wÕ %j8f"[ژT~@:BcV9F!}}(0TLTiab8ڪ,8u5LL9RۨS$UNHω3~$)cl"WU^hSX a6-UNmOڥlҵ21|7Xl*Z0Xl+ob4^PCr3IameI|x $ZͷGIbIr> 0? *ʾ J:/E#$Y,ZN/0{oEtZrL0lye a]}xlZ<=dma\{VԼO9UN4&yxGX fnkx]Љ_} 0CIӓJTW>Ͳ_rY%z|{Y*ŝY oεTmq'00G"W+8 +Jі!Pha١\n118I(i-" pHYs+XIDATc``2a 40`,PUȘa [(030pH&Ixvi3{}|8#RC62}RCO~wgC64~WuK]eκ*:?_{7c?9H5- 3Q1^>>#բYVΨzOJ?ʞw0OC'6Wк2VqT~wdx4$!y1ץΞԟ*"mOrX466doT[Ϩ-t[;:5lU6wUZ♊zߙ AЧ<*Mok r/(mbZfkT_N)bL̼s\ͫoC`$Ȥ0Ap/RkGh ݪmE|%${:3 "3:#̬5sl'fIDl{ Kz스O(vl[ YYF ^ސQ#Iw|"gvkAl71W'?BT -GB7+)M'sk΀_ +[8sw-^IRVߌhQJI(M̚sΛY~ʚ5ܔ[Ѭ whxE9L\׋CVKfRW"nk| ?O$w:ꎟZ3;u74wcY\?9FVjdd3 FQҒ/o.q۔ |'[YTBA %\b)kʾqRB~"e*k4P|{G֓b}KXUN>#ҸBYT;U.7Qsm KY;qm*[߸̟8vHJe-|]i*~S\S|WeI6a |N᪬ M]5ڡ$P){ NPI6tS[x֓_nֺCl=)+g݂.Za(kC@kMYwlSu8k$0J53cǫ[=.ϓ?xKZW\ZK ^ n. WfQc4cZkZ\lR$qi?c]g<a1%jZ~gQ4« o!-kDU tEXtDepth'# IENDB`PK4;MgFfityk-latest/_images/math/131f13cda116814673ad3dcfa6cf7d9d038095f2.pngPNG  IHDR7`'/0PLTE/ݠ{tRNSHt`2iF pHYs+IDAThZ_hEvsw6P04}ҖByYĔ&,* GSB+R>L|m Ub{/"WE-h*ę{7C6t vnv|!h{)~g4:_ ?} Or)@]Z}Q?b(gMF=Q>Oq f }ɼ\ZK}rEG2rc_sīZkq0U!woܧZZMlI;#f`ܹMd0J^|v&^(4Q^ױ&J*TH F \Sq~OOU3+63c4?t TU=4` 5Li)YOIu(|@Lf +b+Ԓw Kwd9X6<ç8b(ʧd_nSDz7Z ( dX*rɢ"pJ~/|wuŴD' wЎy1eP\t@XUE8km bkt 0Ź4s%N@(u@(݁'9{V6ġ(K2@jN etn7JW󘂺$'NfRwhG<{WI '#RD$h(,k6c XSDBxjV% n I g1t-g%{9L!F=Cp IcQКAksn~ɱIx)gU9KZy@BB &cg=1&9S*n|4 L{ÔK4\PŠadF2һOoٷ'%Dz `rzrF;1p?_L$,YWK vq!7Xc8dFU&}0^ HFH/CnĘϚ^EF„2$/gGGj!/̦hJ\9y! tVo8Rò}3QgA>@ 1e+HJ/>M>MHy)+#垑~RNJ|c tEXtDepthIENDB`PK4;M .Ffityk-latest/_images/math/5f4c8b2f96825eaa8e2bba571715ca6fcffb49ca.pngPNG  IHDR72*0PLTE/ݠ{tRNSHt`2iF pHYs+\IDATHc` e 8'X jB&<Pk&< ƭ &$Pr`jk)s ߈5y`Xp;ry uvyn@53."M,5 QsHЄ_0PBj\_] UIz*EmxD*VS  g'xXKz *06A^LV!zKcI-uX5 ls3 tEXtDepthP$њIENDB`PK4;MnGGFfityk-latest/_images/math/212f21807677b160aafa886ec83e5e8ce9c2ba50.pngPNG  IHDR7&0PLTE/ݠ{tRNSHt`2iF pHYs+IDAThZ]UfڙvRq%FֈJY1&ꋫ"! D0q <h4J&@wcƒ&Ƭ !ZP;3)ҩݗ=7ssk|=i.-;l7^&[dOUsMO:QiZo/{-'Z,ӱ[sV`NG߾ -_|~R+ ǰ* a8W#8C, XCݠ Sbr qTrdWY 8`cSA+㡬ʉy &n0Rn#CdeZհjgĞ8} cv' jXxG D7Ax̵ڌʍfRyu0hڏX<0%waMoB ' 3) Qs1v a,b'RCc103v01Vuk ЕiQ6E^0q}0Ulʹϰ5ж5 `q!@h p(g|nMn_KqD`b Xwll,lNAڡY/XP:ݶ;Odo@4BYp+9 m5A)8A-O>a(\ג1V `CӞ v~us=Gw⾮_&ahųveNh[C#^Hv[P@8)`0p6}|lwpã,КQɐ1ٽcOROyxK‘Q3ykQM9͊ڙ*C #7 ^@n M e6.@+hZ'/M;`]TK+8__Ʈ3B/]meu:.ߩ4'A5x8MKڑ6RVJlD$3@~ؔ^/wvr%\tt]T ZB[:h"Ba æ939 (upu*%\tlTJx-yGZj#R'Pݑsj`5 ?7LIqgA0EY;>PjfcReM)cK5 `y^KY2bkFJ([nݠ:df\v8ⲶC{ֆcyy=.奼}8.X\l1',ԲbueHfyϙްuL|$peiQeM^^;R.}z*apIرhN@M.+ik{w+..}xmʃ{2MT+`ny<;8*+j'bV!:@2tWBYxI^e+V U)V!^Od %TNy  fGG( tEXtDepth'# IENDB`PK4;MFfityk-latest/_images/math/2cca042255a53886c917ad9e79fb3b757d0f3023.pngPNG  IHDR6V0PLTE/ݠ{tRNStH`29Sj pHYs+IIDATh]hUf7T)+- ŗn`4ZBjӵEZ|A!`+>I*fP mеҮC+V($մٙ<${=%xpbl7 I/7 I f0i>x8`&}A^¿>IEq=dʞ~<-$=OL ?kыd汷U9x_$Q%QDuP`kS'LѪ$|@ *d"g 7r($&HeJ8X"9fѾ6EK&jR($%g5w]$n~nBLdDqEQzJ4PՖ㇤`TTgeAH:@ M~ H,c˺y0 zFrz $h}qTr'Y eu2Ϩ"ZH8Th5>t>y*x>eU,-S[HFRk5o3.ߛ,H>d/Vl+կb*80Eĝ22jѪ$olZX}FB5.UYcE\/Sm%9i9|E"P~÷*^vǼH~'Oι .X6/OU.쓾Zc`Xc<ح}9`g/<:n-ɏWrmi/rc#lWҞV) PcnĺF>PH9ح9czPŔvgB2\Q)}Xv;tK̜cpύwC >V2:=ڗY^+}z{ʻ73!v*ӈ+r<9{Z њ'QDZ6BE&<G*l#lTK eD ^EH)漄.w'XcA'ad3FPбE= <ֲvUGx e2籄(r-7a"VEf΅u/g Ӆq̲:]2x{|6T7t/cbҷyؐ-*lو>ˎ8-W?ѼNf힡U1瘔҃񊙺F=>^7-ŎxHs_nP Ĭ|/'z- I\f$1QgzuN(ءtuNMx]hqf~?̪Y&d+UUb*dcֲ8Kr vYs9v'jt( tEXtDepth'# IENDB`PK4;M㜆Ffityk-latest/_images/math/9982c7d3f088162768cf621b5f5fa8a000107ffd.pngPNG  IHDR-ƱC0PLTE/ݠ{tRNSHt`2iF pHYs+ IDATXc` D|7d""ɼhbGb 44hX;Ml"4˴ XBhc(r (i`h y rL 4J M(^ @W@=&oPmmE#P㪀FV V:4jzv. 4yT}`&.W\@ɞ?Uvp*k` W_^0f 6'FcCU )PP{tD ftL3%렔OAn\&~ n Ld%S@D0C3A{o 7lR1j0-`+qE>^8/ q`;R+h k~UXe0)=f(q.=t5aN69T+LmmFFCb K@<%/UyZ2`~Nr.h\ِJb>Ua}6P񌣝n``r6Za'CtqwH XJJJ Zby.p,_ ` 7 ;xx`OL,8WJPu \a/"o '4╔Atf$6 ZD::JxVX;FYaaf|O^M&C1e0$%b’.qPE b -N2C`q tEXtDepthP$њIENDB`PK4;MFfityk-latest/_images/math/04f1eb15dcae195a93de08668772bedd7ce66147.pngPNG  IHDR_Ϥt0PLTE/ݠ{tRNSt`H2O pHYs+VIDAT(c`2 JC)X0r D0~` "X0!B~΂L+knDhPkeo iAm>V+~8V A.\g b l@ @7i``__aB 9`$HN Y.3pmB!? 1E'ܻFz#(G@oLkd2a\R'qk|G&.C^VX2;}Hm[Q%Ft'&h*yM:QC)h!Ps-4Z .D UB1T P%}քi u68 ^soPv &slp4*Ig\%LH{"@[YKO;0QŊڡԮiB)cV^"xjko,OmDD/Sy15QA.+L3+6h\#*) "shX'6S+j*hqxZE~_k@js\rP+j' j=GmYQ#ZTͿGWź"E׵6e ҨqMmÜֻ VQ=q 5#_s,JL;_@=؂Ts=NG A[: c tEXtDepthP$њIENDB`PK4;M\+sFfityk-latest/_images/math/7848814fe80b7b9d7192270de2733668dec05e75.pngPNG  IHDR Ol0PLTE/ݠ{tRNSt2H`@/y pHYs+LIDATc``2a 40PsȘ`߰u"qu`K?A- tEXtDepth N%IENDB`PK4;Mܯ((Ffityk-latest/_images/math/3c7c74b573165c8bc22f1fd9062095ea21051ee1.pngPNG  IHDR/]W3PLTEL tRNSHt`2Fuc pHYs+iIDATx\*DPꞙ%J,i_mu7oL?\Γu~:Q>؂{ˈչI"t)Bʋ_]NJN AAQ穳f(@GPJI/@_S:-m b*S7+(sbT5aVvLd{sN] : bk#sSfr}.{\CnWF~Dᤕ#Xh|xt7UF|] tqaׇ=XR>Y]l}taVWWҩ.PStw* b a Ӏ8/~[%P= @q夐1UDHU+@ELT5i@vBs_%T*X+ gϵ9рMW}Ԥ9)B:D$Tۙ//7fT- TH']e}Nќ^bst' گ7 ԓFLj 9i{I#(L=t931N6q3P"|CT*t蔱ŠJӈ}mY8O$7o2sbct~JrF{Tx@e˖eAOPB版 #;1Zu(OLNLtxRYNYV7_-߀y#R jJπOilrJ'Mg9 Yb{Y8oΗGtDwYe2ĤWGL@MTI(0t2TD T:w; *NgeDӹI7:Ӧ[_\:؞lpLl;Bh V'Ϸ? DO:y~6M^% Z GPF<u#oTYڷuke.T̹/R?8FTNDp>T-@Ə4OyeƏBmX z2S4B J8ykI Rk2ăyX y"SW93I! ʤk8URߨϴq%e^OkOFݠIwS7鵩>폿"t*S% iŏ?SW \G8^Ko=:oS1/~Ĭ]^_]k^ K᝖'8tS1/~Ĭq0Щ#ZVU_}/F鴦b ;E@{R7ʬq0uyI5f{}SNk*@8'}C:S;gZcf{{} ]:S1J՞׃KS3WZc@qXj阊PN&?.V:Mto@y0֘~(ŻhO'eꏋNS&]k\| =:rW{m$0|VYۖ4B0S|m#j돏wɆ|Ee:C(=6b־~5o:4x:C(}7?^LN?}m0B x1: z˸̗Yy *ZiԗkUYg4 tEXtDepthP$њIENDB`PK4;MMFfityk-latest/_images/math/aa7365275ca60c6b07f4781ccdf3880ea610cccd.pngPNG  IHDR.C?0PLTE/ݠ{tRNStH`鋝2_9 pHYs+AIDATHǵkA&n~mmEs  xb)"F**ZmCFxQ\.M\zn &g+P "%:fcbvwM^|3?޼vw. V>9o'Yϲk`< R$m~ z 6'wlWznjoW`UX76[i^5&-6M\˫i@7 {<л+K⺡vr3e;{PLض!Q3dh|2POM2gsw_*D-+M\ҩ ;`߇p='ٷ7/9p.v?|e> ~םg/j<=#xg&#N4I_mzER=|r. o'?6SsI0≵f%9Mj_u~g? Rv$ Xܩk,ր3i{a_2[=V^=%+j~Ѻɘ;`3KB`x(ouݱGͪ9ގѳ;'{W]ak@H 7m~[z XxĒ}Н jEQ^+'!h^0Ԣ &$}epޛ8MO0!X";TݛzLEvB W0 Ijɹ.\ܡW8X";N[`xrCmLCn I! &b;yu]&ӅB70!m ta,{ DGL%05=m,5Tm zԴ4]=춯!0 t'j tEXtDepth'# IENDB`PK4;Mf22Ffityk-latest/_images/math/c95854c1466eef53fd2baed899c9ccefe47784c5.pngPNG  IHDR72#d0PLTE/ݠ{tRNSHt`2iF pHYs+wIDAThZmhE~wslrGhKP|IdCq#{CSx%8Vt06#j̓L[摚b`4Il)w_PC#}$^N|_r7@OmO-y'ftY:Az$^\L05`pMGT38ktih(c=&7=<6i[9%nEa1Mvn[@ IvN1MRvnf#S`QCєurR4ZOES8=6IȭI G`ZQ4 V41R4lxEIBnQBh=M4<ӼYW1 rk" k# M%K;˜ hۙu/BZ@J_pvXIhdLe| tEXtDepth'# IENDB`PK4;M9dFfityk-latest/_images/math/87a1d98503353faeca87b651ae6d3782a6518682.pngPNG  IHDR Rio0PLTE/ݠ{tRNSt2H`c>" pHYs+YIDATc``2a 40`x][CgP|>c P`k`:l! bx,MD tEXtDepth*IENDB`PK4;M YFfityk-latest/_images/math/9d33fe97b94f8f2955811197bfdbd51ae012d5f2.pngPNG  IHDR ^ql-PLTE:tRNS`2tH酯U pHYs+DIDATc``Tf ```0 @X̅CE}f `0 g uw: tEXtDepth*IENDB`PK4;M ?Ffityk-latest/_images/math/8bbf652a5cdd05041ad34447067b9b904d3fb206.pngPNG  IHDR 0PLTE/ݠ{tRNS`ݯt2H&u˭ pHYs+AIDATc``TV c``/`;O 00`f |N; tEXtDepth'# IENDB`PK4;M9EsFfityk-latest/_images/math/85827da1cb22771cd4522cafd76cf964779a46d9.pngPNG  IHDRO#VM90PLTE/ݠ{tRNSݝt`H2Cn pHYs+IDAT(c`|\\\7` 8>H_ŒʟTOSA0V!=, v p1LDuN7C} a DlͶD/S`z9TC; [8>0L0Y<_L X\ b5S!b0"[ˀ@`pbvRf|oLpӖ װ   @X 6cLR ; t AG$9C!]i tEXtDepthWIIENDB`PK4;MN  Ffityk-latest/_images/math/22462de98084da3d16db65c30b66b9239f9a8658.pngPNG  IHDR3C6PLTEG/tRNSHt`2h] pHYs+IIDATxٖ(Yd)eč(tcf"$1"_/]5@= +c+fJ[udH:Aک] c&XdN=F{|6k8A8*8EiPO0o߱,LjVgߏpV 3)$ q|#?aZ F>Lu/0#)3R盘djƤk"c/x =v 737t^AI#dvR$? ҜEeAx#efrf|V t$\Z蜙&%gC9]b O e͙a'k^tA g4|Z2k3 2,\2cџx8YfdZ茙3'%51SfxWft8NR蛙g,Y? ;71HHշveD鼕e~6z4)39-N_)AH4S.kL >KY ثsѥrY,2fkYH:,? 0Up-1:lv>тtMӖ)?;l)3~,.s@PFGm[dH!)0<mE'pM+]:<88!H2 E9p2 )[,apN6p%!|5ty*$ 'Ы@$,Z pިASRMcYՁ$ e5.c,xT׻XjgBsfv2RfVof,r=ofuydV7Y7.fJT ]wۼnf7fv3;?(~l,LߞFO$shUY%oK䂽p햷MCyq>7f}oˬVwwx?4DW tEXtDepthP$њIENDB`PK4;M,Ffityk-latest/_images/math/1542ddf21b6bec2d88db585b2b076385359acd25.pngPNG  IHDR|(/l0PLTE/ݠ{tRNSϿݯ`Ht2LN pHYs+IDATHc` x&2"|, Ϊ@ `7@~^Tk+ u4Xe 8CvK0\ xhg`K;G #i$>[xηڛ60ph~&d yo R{p(W[`L| " \*HHharr>w@3o`8],?(y.30Dxf @|Hp.[< N $y08*'0o' }I{XmjIѮ&2~  >*؛ӍKï%QBEQ(; U`+[ l,6#)85[CT9y# l@B8>a` !yO`"P/@ < (7C$ĭAa5 CQE")͹> S]T1 tEXtDepth'# IENDB`PK4;M Ffityk-latest/_images/math/2a5449c37d8b909cf1bafee0025397efa1612d5e.pngPNG  IHDR  0PLTE/ݠ{tRNSt2H`@/y pHYs+YIDATc``2a 40İU]mCg/Pj>cS PӖd:l!4`} 0}iR tEXtDepth*IENDB`PK4;Mh'Ffityk-latest/_images/math/f21f868daf370c2e49bd9c31548a416b4ed0f521.pngPNG  IHDR&0PLTE/ݠ{tRNSݝt`H2Cn pHYs+"IDATXVOHQ̎Mx(tѢR^NyCI{KBPviХRpRRl%LQ Mi$R4ޛyoWBf {{oXUj?t4mA[Tk2S 9F{ך{sh9H̚dӵځmono͖0ٺB?mAُ{95eW7c'},MԖF錄'VJ3=~LJahGk1Qs._gR*#p׎hy[\<4~udl Źuc%Ԏ?*w H)?Vא/w$xqk tEXtDepthyIENDB`PK4;M(?OFfityk-latest/_images/math/44555257c1202bc9b5d4a27aec7cf0cb01aad73b.pngPNG  IHDRT0PLTE/ݠ{tRNS`Ht2կc pHYs+IDAT8c` EiQp9?@Ů ٨\0E.p I&4r0Ō"]W'U I (\Ov]00@ LJpP =l@ۓ@jboȜlp)J85as ~g QH f-]0; 4! O 4w@"&񗁧$`dj$2`F68uPՅHaW K"'bJbf`8 h? `8@Dhi p*}NY8O /f{!q!.A9pm1yJa$uݐh)'t~]찠ĕ! c6 tY@tH.G V?fflZ`:rĕ{"TE$ӭ{\ tEXtDepthWIIENDB`PK4;Mu*,Ffityk-latest/_images/math/50177a0a8a3c51f049392edfe4f30cf7cf0d37b4.pngPNG  IHDR VR-PLTE:tRNSt2H`HNos pHYs+LIDATc``2a 4|]$>1`-x70pHm}?) tEXtDepth*IENDB`PK4;MhĐ@@ fityk-latest/_static/fitheme.css/* based on Sphinx basic.css and alabaster.css */ div.clearer { clear: both; } /* -- sidebar --------------------------------------------------------------- */ div.sphinxsidebar form { margin-top: 10px; } 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; } /* -- 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; } /* -- 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: Helvetica,Arial,sans-serif; font-size: 90%; } .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 --------------------------------------------------- */ /************ end of basic.css ***********/ /* -- page layout ----------------------------------------------------------- */ body { font-family: Georgia,serif; font-size: 16px; background-color: white; color: #000; margin: 0; padding: 0; } div.document { width: 940px; margin: 30px auto 0 auto; } div.documentwrapper { float: left; width: 100%; } div.bodywrapper { margin: 0 0 0 220px; } hr { border: 1px solid #B1B4B6; } div.body { background-color: #ffffff; color: #303338; padding: 0 30px 0 30px; } div.footer { width: 940px; margin: 20px auto 30px auto; font-size: 14px; color: #888; text-align: right; } div.footer a { color: #888; } div.related { width: 940px; margin: 15px auto 0; padding-left: 220px; text-align: center; } div.sphinxsidebar { float: left; margin-left: -100%; width: 220px; font-size: 14px; line-height: 1.5; } div.sphinxsidebar a { color: #555; text-decoration: none; border-bottom: 1px dotted #999; } div.sphinxsidebar a:hover { border-bottom: 1px solid #999; } div.sphinxsidebarwrapper { padding: 18px 10px; } div.sphinxsidebarwrapper p.logo { padding: 0; margin: 0; font-style: italic; } div.sphinxsidebarwrapper h1.logo { margin-top: -10px; text-align: center; margin-bottom: 5px; text-align: left; } div.sphinxsidebarwrapper h1.logo-name { margin-top: 0px; } div.sphinxsidebar h3, div.sphinxsidebar h4 { font-family: 'Garamond', 'Georgia', serif; color: #555; font-size: 24px; font-weight: normal; margin: 0 0 5px 0; padding: 0; } div.sphinxsidebar h3 { margin-top: 15px; } div.sphinxsidebar h4 { font-size: 20px; } div.sphinxsidebar h3 a { color: #555; } div.sphinxsidebar p.logo a, div.sphinxsidebar p.logo a:hover, div.sphinxsidebar h3 a, div.sphinxsidebar h3 a:hover { border: none; } div.sphinxsidebar p { color: #555; margin: 10px 0; } div.sphinxsidebar ul { list-style: none; margin: 10px 0; padding: 0; color: #000; } div.sphinxsidebar ul ul { list-style: square; margin: 0 0 0 20px; } div.sphinxsidebar ul li.toctree-l1 > a { font-size: 120%; } div.sphinxsidebar ul li.toctree-l2 > a { font-size: 110%; } input, textarea { color: #000; background-color: #fff; } div.sphinxsidebar input { border: 1px solid #CCC; font-family: sans-serif; } div.sphinxsidebar hr { border: none; height: 1px; color: #999; background: #999; text-align: left; margin-left: 0; width: 50%; } #searchbox { margin-top: 25px; } /* -- body styles ----------------------------------------------------------- */ a { color: #004B6B; text-decoration: underline; } a:hover { color: #6D4100; text-decoration: underline; } div.body h1, div.body h2, div.body h3, div.body h4, div.body h5, div.body h6, span.h1 { font-family: 'Garamond', 'Georgia', serif; font-weight: normal; margin: 30px 0px 10px 0px; padding: 0; } div.body h1, span.h1 { margin-top: 0; padding-top: 0; font-size: 220%; } div.body h2 { font-size: 180%; } div.body h3 { font-size: 150%; } div.body h4 { font-size: 130%; } div.body h5 { font-size: 100%; } div.body h6 { font-size: 100%; } a.headerlink { color: #DDD; padding: 0 4px; text-decoration: none; } a.headerlink:hover { color: #444; background: #EAEAEA; } div.body p, div.body dd, div.body li, div.body blockquote { line-height: 1.4em; } div.admonition { margin: 10px 0px; padding: 10px 20px; background-color: #fcfce0; border: 1px solid #ff9; } div.admonition dt { font-weight: bold; } div.admonition dl { margin-bottom: 0; } div.body p.centered { text-align: center; margin-top: 25px; } div.admonition tt.xref, div.admonition a tt { border-bottom: 1px solid #fafafa; } dd div.admonition { margin-left: -60px; padding-left: 60px; } div.admonition p.admonition-title { font-weight: bold; margin: 0 0 10px 0; padding: 0; line-height: 1; } div.admonition p.last { margin-top: 5px; margin-bottom: 0; } div.highlight { background-color: white; } dt:target, .highlight { background: #FAF3E8; } div.seealso { background-color: #EEE; border: 1px solid #CCC; } div.topic { background-color: #eee; } p.admonition-title { display: inline; } /*p.admonition-title:after { content: ":"; }*/ pre, tt, code, div.admonition-cli p.last { font-family: 'Consolas', 'Menlo', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace; font-size: 0.9em; } tt.descname, tt.descclassname, code.descname, code.descclassname { font-size: 0.95em; } tt.descname, code.descname { padding-right: 0.08em; } img.screenshot { -moz-box-shadow: 2px 2px 4px #eee; -webkit-box-shadow: 2px 2px 4px #eee; box-shadow: 2px 2px 4px #eee; } table.docutils { border: 1px solid #888; -moz-box-shadow: 2px 2px 4px #eee; -webkit-box-shadow: 2px 2px 4px #eee; box-shadow: 2px 2px 4px #eee; } table.docutils td, table.docutils th { border: 1px solid #888; padding: 0.25em 0.7em; } table.field-list, table.footnote { border: none; -moz-box-shadow: none; -webkit-box-shadow: none; box-shadow: none; } table.footnote { margin: 15px 0; width: 100%; border: 1px solid #EEE; background: #FDFDFD; font-size: 0.9em; } table.footnote + table.footnote { margin-top: -15px; border-top: none; } table.field-list th { padding: 0 0.8em 0 0; } table.field-list td { padding: 0; } table.footnote td.label { width: 0px; padding: 0.3em 0 0.3em 0.5em; } table.footnote td { padding: 0.3em 0.5em; } dl { margin: 0; padding: 0; } dl dd { margin-left: 30px; } blockquote { margin: 0 0 0 30px; padding: 0; } ul, ol { margin: 10px 0 10px 30px; padding: 0; } pre { background: #f0f0f0; padding: 7px 30px; margin: 15px 0px; line-height: 1.3em; } dl dl pre { margin-left: -90px; padding-left: 90px; } tt, code { background-color: #ecf0f3; color: #222; } a.reference { text-decoration: none; border-bottom: 1px dotted #004B6B; } a.reference:hover { border-bottom: 1px solid #6D4100; } a.footnote-reference { text-decoration: none; font-size: 0.7em; vertical-align: top; border-bottom: 1px dotted #004B6B; } a.footnote-reference:hover { border-bottom: 1px solid #6D4100; } a:hover tt, a:hover code { background: #EEE; } /* public domain icon from wikipedia */ div.sphinxsidebar a.external { background-position: right center; background-repeat: no-repeat; background-image: linear-gradient(transparent, transparent), url("data:image/svg+xml,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2210%22%20height%3D%2210%22%3E%3Cg%20transform%3D%22translate%28-826.429%20-698.791%29%22%3E%3Crect%20width%3D%225.982%22%20height%3D%225.982%22%20x%3D%22826.929%22%20y%3D%22702.309%22%20fill%3D%22%23fff%22%20stroke%3D%22%2306c%22%2F%3E%3Cg%3E%3Cpath%20d%3D%22M831.194%20698.791h5.234v5.391l-1.571%201.545-1.31-1.31-2.725%202.725-2.689-2.689%202.808-2.808-1.311-1.311z%22%20fill%3D%22%2306f%22%2F%3E%3Cpath%20d%3D%22M835.424%20699.795l.022%204.885-1.817-1.817-2.881%202.881-1.228-1.228%202.881-2.881-1.851-1.851z%22%20fill%3D%22%23fff%22%2F%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E"); padding-right: 13px; } /* div.sphinxsidebar a.current { font-weight: bold; } */ /* for math symbols in the text use Century Schoolbook * that is more like LaTeX Computer Modern font. .math { font-family: "Century Schoolbook", "New Century Schoolbook", times, serif; } */ img.icon { vertical-align: text-bottom; } div#download img { margin-bottom: -1px; } div.admonition-in-the-gui p.admonition-title { padding-left: 36px; background: url('mouse16.png') no-repeat 10px 0; } div.admonition-cli { display: inline-block; border-width: 0; padding: 2px 3px; //background-color: transparent; background-color: #999; border-radius: 6px 6px 6px 6px; margin-top: 0; } div.admonition-cli p.admonition-title { vertical-align: middle; color: #f0f0f0; background-color: transparent; padding: 1px 8px 1px 10px; font-size: 0.8em; display: inline; } div.admonition-cli p.last { vertical-align: middle; background: #f0f0f0; color: #222; display: inline; padding: 3px 8px 2px 10px; border-radius: 5px 5px 5px 5px; } span.cli-title { display: inline-block; border-radius: 5px; background-color: #999; color: #f0f0f0; font-size: 0.8em; font-weight: bold; padding: 1px 5px; } .quote { font-size: 0.9em; } .quote-author, div.body span.quote-author a { color: #888; } div.screenshot { clear: right; float: right; margin-left: 1em; } div.screenshot p.caption { text-align: center; font-size: 0.9em; } .smallfont { font-size: 0.9em; } div.subscr, div.subscr span.pre { background-color: #EEEEEE; } div.subscr ul.simple { padding-top: 0; padding-bottom: 0; margin-top: 0; } div.subscr { padding: 0px 12px; border: 1px solid #CCC; border-width: 1px 0; } .FlattrButton { text-align: center; float: right; } #contents { text-align: center; display: none; } #expand_features a { text-decoration: none; } #expand_features span.h1 { color: #303338; } img.banner { margin-top: 10px; margin-bottom: 10px; } @media print { div.document, div.documentwrapper, div.bodywrapper { margin: 0 !important; width: 100%; } div.sphinxsidebar, div.related, div.footer, #top-link { display: none; } } @media screen and (max-width: 870px) { div.sphinxsidebar { display: none; } div.documentwrapper { margin: 0; } ul { margin-left: 0; } } @media screen and (max-width: 875px) { body { margin: 0; padding: 20px 10px; } div.documentwrapper { float: none; background: white; } div.sphinxsidebar { display: block; float: none; width: 100%; margin: 0; } div.sphinxsidebar p.logo { display: none; } div.document { width: 100%; margin: 0; } div.related { width: 100%; margin: 0; padding: 10px 0 20px 0; } div.related ul, div.related ul li { margin: 0; padding: 0; } div.footer { display: none; } div.bodywrapper { margin: 0; } div.body { min-height: 0; padding: 0; } .rtd_doc_footer { display: none; } .document { width: auto; } .footer { width: auto; } pre { padding: 7px 5px; } div.admonition { padding: 10px 5px; border-width: 1px 0; } div.screenshot { margin-left: 0; } } PK4;MFo, c c"fityk-latest/_static/websupport.js/* * websupport.js * ~~~~~~~~~~~~~ * * sphinx.websupport utilities for all documentation. * * :copyright: Copyright 2007-2018 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ (function($) { $.fn.autogrow = function() { return this.each(function() { var textarea = this; $.fn.autogrow.resize(textarea); $(textarea) .focus(function() { textarea.interval = setInterval(function() { $.fn.autogrow.resize(textarea); }, 500); }) .blur(function() { clearInterval(textarea.interval); }); }); }; $.fn.autogrow.resize = function(textarea) { var lineHeight = parseInt($(textarea).css('line-height'), 10); var lines = textarea.value.split('\n'); var columns = textarea.cols; var lineCount = 0; $.each(lines, function() { lineCount += Math.ceil(this.length / columns) || 1; }); var height = lineHeight * (lineCount + 1); $(textarea).css('height', height); }; })(jQuery); (function($) { var comp, by; function init() { initEvents(); initComparator(); } function initEvents() { $(document).on("click", 'a.comment-close', function(event) { event.preventDefault(); hide($(this).attr('id').substring(2)); }); $(document).on("click", 'a.vote', function(event) { event.preventDefault(); handleVote($(this)); }); $(document).on("click", 'a.reply', function(event) { event.preventDefault(); openReply($(this).attr('id').substring(2)); }); $(document).on("click", 'a.close-reply', function(event) { event.preventDefault(); closeReply($(this).attr('id').substring(2)); }); $(document).on("click", 'a.sort-option', function(event) { event.preventDefault(); handleReSort($(this)); }); $(document).on("click", 'a.show-proposal', function(event) { event.preventDefault(); showProposal($(this).attr('id').substring(2)); }); $(document).on("click", 'a.hide-proposal', function(event) { event.preventDefault(); hideProposal($(this).attr('id').substring(2)); }); $(document).on("click", 'a.show-propose-change', function(event) { event.preventDefault(); showProposeChange($(this).attr('id').substring(2)); }); $(document).on("click", 'a.hide-propose-change', function(event) { event.preventDefault(); hideProposeChange($(this).attr('id').substring(2)); }); $(document).on("click", 'a.accept-comment', function(event) { event.preventDefault(); acceptComment($(this).attr('id').substring(2)); }); $(document).on("click", 'a.delete-comment', function(event) { event.preventDefault(); deleteComment($(this).attr('id').substring(2)); }); $(document).on("click", 'a.comment-markup', function(event) { event.preventDefault(); toggleCommentMarkupBox($(this).attr('id').substring(2)); }); } /** * Set comp, which is a comparator function used for sorting and * inserting comments into the list. */ function setComparator() { // If the first three letters are "asc", sort in ascending order // and remove the prefix. if (by.substring(0,3) == 'asc') { var i = by.substring(3); comp = function(a, b) { return a[i] - b[i]; }; } else { // Otherwise sort in descending order. comp = function(a, b) { return b[by] - a[by]; }; } // Reset link styles and format the selected sort option. $('a.sel').attr('href', '#').removeClass('sel'); $('a.by' + by).removeAttr('href').addClass('sel'); } /** * Create a comp function. If the user has preferences stored in * the sortBy cookie, use those, otherwise use the default. */ function initComparator() { by = 'rating'; // Default to sort by rating. // If the sortBy cookie is set, use that instead. if (document.cookie.length > 0) { var start = document.cookie.indexOf('sortBy='); if (start != -1) { start = start + 7; var end = document.cookie.indexOf(";", start); if (end == -1) { end = document.cookie.length; by = unescape(document.cookie.substring(start, end)); } } } setComparator(); } /** * Show a comment div. */ function show(id) { $('#ao' + id).hide(); $('#ah' + id).show(); var context = $.extend({id: id}, opts); var popup = $(renderTemplate(popupTemplate, context)).hide(); popup.find('textarea[name="proposal"]').hide(); popup.find('a.by' + by).addClass('sel'); var form = popup.find('#cf' + id); form.submit(function(event) { event.preventDefault(); addComment(form); }); $('#s' + id).after(popup); popup.slideDown('fast', function() { getComments(id); }); } /** * Hide a comment div. */ function hide(id) { $('#ah' + id).hide(); $('#ao' + id).show(); var div = $('#sc' + id); div.slideUp('fast', function() { div.remove(); }); } /** * Perform an ajax request to get comments for a node * and insert the comments into the comments tree. */ function getComments(id) { $.ajax({ type: 'GET', url: opts.getCommentsURL, data: {node: id}, success: function(data, textStatus, request) { var ul = $('#cl' + id); var speed = 100; $('#cf' + id) .find('textarea[name="proposal"]') .data('source', data.source); if (data.comments.length === 0) { ul.html('

  • No comments yet.
  • '); ul.data('empty', true); } else { // If there are comments, sort them and put them in the list. var comments = sortComments(data.comments); speed = data.comments.length * 100; appendComments(comments, ul); ul.data('empty', false); } $('#cn' + id).slideUp(speed + 200); ul.slideDown(speed); }, error: function(request, textStatus, error) { showError('Oops, there was a problem retrieving the comments.'); }, dataType: 'json' }); } /** * Add a comment via ajax and insert the comment into the comment tree. */ function addComment(form) { var node_id = form.find('input[name="node"]').val(); var parent_id = form.find('input[name="parent"]').val(); var text = form.find('textarea[name="comment"]').val(); var proposal = form.find('textarea[name="proposal"]').val(); if (text == '') { showError('Please enter a comment.'); return; } // Disable the form that is being submitted. form.find('textarea,input').attr('disabled', 'disabled'); // Send the comment to the server. $.ajax({ type: "POST", url: opts.addCommentURL, dataType: 'json', data: { node: node_id, parent: parent_id, text: text, proposal: proposal }, success: function(data, textStatus, error) { // Reset the form. if (node_id) { hideProposeChange(node_id); } form.find('textarea') .val('') .add(form.find('input')) .removeAttr('disabled'); var ul = $('#cl' + (node_id || parent_id)); if (ul.data('empty')) { $(ul).empty(); ul.data('empty', false); } insertComment(data.comment); var ao = $('#ao' + node_id); ao.find('img').attr({'src': opts.commentBrightImage}); if (node_id) { // if this was a "root" comment, remove the commenting box // (the user can get it back by reopening the comment popup) $('#ca' + node_id).slideUp(); } }, error: function(request, textStatus, error) { form.find('textarea,input').removeAttr('disabled'); showError('Oops, there was a problem adding the comment.'); } }); } /** * Recursively append comments to the main comment list and children * lists, creating the comment tree. */ function appendComments(comments, ul) { $.each(comments, function() { var div = createCommentDiv(this); ul.append($(document.createElement('li')).html(div)); appendComments(this.children, div.find('ul.comment-children')); // To avoid stagnating data, don't store the comments children in data. this.children = null; div.data('comment', this); }); } /** * After adding a new comment, it must be inserted in the correct * location in the comment tree. */ function insertComment(comment) { var div = createCommentDiv(comment); // To avoid stagnating data, don't store the comments children in data. comment.children = null; div.data('comment', comment); var ul = $('#cl' + (comment.node || comment.parent)); var siblings = getChildren(ul); var li = $(document.createElement('li')); li.hide(); // Determine where in the parents children list to insert this comment. for(var i=0; i < siblings.length; i++) { if (comp(comment, siblings[i]) <= 0) { $('#cd' + siblings[i].id) .parent() .before(li.html(div)); li.slideDown('fast'); return; } } // If we get here, this comment rates lower than all the others, // or it is the only comment in the list. ul.append(li.html(div)); li.slideDown('fast'); } function acceptComment(id) { $.ajax({ type: 'POST', url: opts.acceptCommentURL, data: {id: id}, success: function(data, textStatus, request) { $('#cm' + id).fadeOut('fast'); $('#cd' + id).removeClass('moderate'); }, error: function(request, textStatus, error) { showError('Oops, there was a problem accepting the comment.'); } }); } function deleteComment(id) { $.ajax({ type: 'POST', url: opts.deleteCommentURL, data: {id: id}, success: function(data, textStatus, request) { var div = $('#cd' + id); if (data == 'delete') { // Moderator mode: remove the comment and all children immediately div.slideUp('fast', function() { div.remove(); }); return; } // User mode: only mark the comment as deleted div .find('span.user-id:first') .text('[deleted]').end() .find('div.comment-text:first') .text('[deleted]').end() .find('#cm' + id + ', #dc' + id + ', #ac' + id + ', #rc' + id + ', #sp' + id + ', #hp' + id + ', #cr' + id + ', #rl' + id) .remove(); var comment = div.data('comment'); comment.username = '[deleted]'; comment.text = '[deleted]'; div.data('comment', comment); }, error: function(request, textStatus, error) { showError('Oops, there was a problem deleting the comment.'); } }); } function showProposal(id) { $('#sp' + id).hide(); $('#hp' + id).show(); $('#pr' + id).slideDown('fast'); } function hideProposal(id) { $('#hp' + id).hide(); $('#sp' + id).show(); $('#pr' + id).slideUp('fast'); } function showProposeChange(id) { $('#pc' + id).hide(); $('#hc' + id).show(); var textarea = $('#pt' + id); textarea.val(textarea.data('source')); $.fn.autogrow.resize(textarea[0]); textarea.slideDown('fast'); } function hideProposeChange(id) { $('#hc' + id).hide(); $('#pc' + id).show(); var textarea = $('#pt' + id); textarea.val('').removeAttr('disabled'); textarea.slideUp('fast'); } function toggleCommentMarkupBox(id) { $('#mb' + id).toggle(); } /** Handle when the user clicks on a sort by link. */ function handleReSort(link) { var classes = link.attr('class').split(/\s+/); for (var i=0; iThank you! Your comment will show up ' + 'once it is has been approved by a moderator.'); } // Prettify the comment rating. comment.pretty_rating = comment.rating + ' point' + (comment.rating == 1 ? '' : 's'); // Make a class (for displaying not yet moderated comments differently) comment.css_class = comment.displayed ? '' : ' moderate'; // Create a div for this comment. var context = $.extend({}, opts, comment); var div = $(renderTemplate(commentTemplate, context)); // If the user has voted on this comment, highlight the correct arrow. if (comment.vote) { var direction = (comment.vote == 1) ? 'u' : 'd'; div.find('#' + direction + 'v' + comment.id).hide(); div.find('#' + direction + 'u' + comment.id).show(); } if (opts.moderator || comment.text != '[deleted]') { div.find('a.reply').show(); if (comment.proposal_diff) div.find('#sp' + comment.id).show(); if (opts.moderator && !comment.displayed) div.find('#cm' + comment.id).show(); if (opts.moderator || (opts.username == comment.username)) div.find('#dc' + comment.id).show(); } return div; } /** * A simple template renderer. Placeholders such as <%id%> are replaced * by context['id'] with items being escaped. Placeholders such as <#id#> * are not escaped. */ function renderTemplate(template, context) { var esc = $(document.createElement('div')); function handle(ph, escape) { var cur = context; $.each(ph.split('.'), function() { cur = cur[this]; }); return escape ? esc.text(cur || "").html() : cur; } return template.replace(/<([%#])([\w\.]*)\1>/g, function() { return handle(arguments[2], arguments[1] == '%' ? true : false); }); } /** Flash an error message briefly. */ function showError(message) { $(document.createElement('div')).attr({'class': 'popup-error'}) .append($(document.createElement('div')) .attr({'class': 'error-message'}).text(message)) .appendTo('body') .fadeIn("slow") .delay(2000) .fadeOut("slow"); } /** Add a link the user uses to open the comments popup. */ $.fn.comment = function() { return this.each(function() { var id = $(this).attr('id').substring(1); var count = COMMENT_METADATA[id]; var title = count + ' comment' + (count == 1 ? '' : 's'); var image = count > 0 ? opts.commentBrightImage : opts.commentImage; var addcls = count == 0 ? ' nocomment' : ''; $(this) .append( $(document.createElement('a')).attr({ href: '#', 'class': 'sphinx-comment-open' + addcls, id: 'ao' + id }) .append($(document.createElement('img')).attr({ src: image, alt: 'comment', title: title })) .click(function(event) { event.preventDefault(); show($(this).attr('id').substring(2)); }) ) .append( $(document.createElement('a')).attr({ href: '#', 'class': 'sphinx-comment-close hidden', id: 'ah' + id }) .append($(document.createElement('img')).attr({ src: opts.closeCommentImage, alt: 'close', title: 'close' })) .click(function(event) { event.preventDefault(); hide($(this).attr('id').substring(2)); }) ); }); }; var opts = { processVoteURL: '/_process_vote', addCommentURL: '/_add_comment', getCommentsURL: '/_get_comments', acceptCommentURL: '/_accept_comment', deleteCommentURL: '/_delete_comment', commentImage: '/static/_static/comment.png', closeCommentImage: '/static/_static/comment-close.png', loadingImage: '/static/_static/ajax-loader.gif', commentBrightImage: '/static/_static/comment-bright.png', upArrow: '/static/_static/up.png', downArrow: '/static/_static/down.png', upArrowPressed: '/static/_static/up-pressed.png', downArrowPressed: '/static/_static/down-pressed.png', voting: false, moderator: false }; if (typeof COMMENT_OPTIONS != "undefined") { opts = jQuery.extend(opts, COMMENT_OPTIONS); } var popupTemplate = '\
    \

    \ Sort by:\ best rated\ newest\ oldest\

    \
    Comments
    \
    \ loading comments...
    \
      \
      \

      Add a comment\ (markup):

      \
      \ reStructured text markup: *emph*, **strong**, \ ``code``, \ code blocks: :: and an indented block after blank line
      \
      \ \

      \ \ Propose a change ▹\ \ \ Propose a change ▿\ \

      \ \ \ \ \
      \
      \
      '; var commentTemplate = '\
      \
      \
      \ \ \ \ \ \ \
      \
      \ \ \ \ \ \ \
      \
      \
      \

      \ <%username%>\ <%pretty_rating%>\ <%time.delta%>\

      \
      <#text#>
      \

      \ \ reply ▿\ proposal ▹\ proposal ▿\ \ \

      \
      \
      <#proposal_diff#>\
              
      \
        \
        \
        \
        \ '; var replyTemplate = '\
      • \
        \
        \ \ \ \ \ \
        \
        \
      • '; $(document).ready(function() { init(); }); })(jQuery); $(document).ready(function() { // add comment anchors for all paragraphs that are commentable $('.sphinx-has-comment').comment(); // highlight search words in search results $("div.context").each(function() { var params = $.getQueryParameters(); var terms = (params.q) ? params.q[0].split(/\s+/) : []; var result = $(this); $.each(terms, function() { result.highlightText(this.toLowerCase(), 'highlighted'); }); }); // directly open comment window if requested var anchor = document.location.hash; if (anchor.substring(0, 9) == '#comment-') { $('#ao' + anchor.substring(9)).click(); document.location.hash = '#s' + anchor.substring(9); } }); PK4;MS[Sfityk-latest/_static/file.pngPNG  IHDRaIDATxR){l ۶f=@ :3~箄rX$AX-D ~ lj(P%8<<9:: PO&$ l~X&EW^4wQ}^ͣ i0/H/@F)Dzq+j[SU5h/oY G&Lfs|{3%U+S`AFIENDB`PK4;M>ufityk-latest/_static/up.pngPNG  IHDR7IDATx@ez $& 8:& :Kpwn}O<:!!{G@Dz?"̧ S{g<ݢ lMQwy|? 0 pq8q` pL-'SBNAwTń|U VIENDB`PK4;M)RRfityk-latest/_static/jquery.js/*! jQuery v3.2.1 | (c) JS Foundation and other contributors | jquery.org/license */ !function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.2.1",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null==a?f.call(this):a<0?this[a+this.length]:this[a]},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext;function B(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()}var C=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,D=/^.[^:#\[\.,]*$/;function E(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):D.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(E(this,a||[],!1))},not:function(a){return this.pushStack(E(this,a||[],!0))},is:function(a){return!!E(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var F,G=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,H=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||F,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:G.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),C.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};H.prototype=r.fn,F=r(d);var I=/^(?:parents|prev(?:Until|All))/,J={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function K(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return K(a,"nextSibling")},prev:function(a){return K(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return B(a,"iframe")?a.contentDocument:(B(a,"template")&&(a=a.content||a),r.merge([],a.childNodes))}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(J[a]||r.uniqueSort(e),I.test(a)&&e.reverse()),this.pushStack(e)}});var L=/[^\x20\t\r\n\f]+/g;function M(a){var b={};return r.each(a.match(L)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?M(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=e||a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function N(a){return a}function O(a){throw a}function P(a,b,c,d){var e;try{a&&r.isFunction(e=a.promise)?e.call(a).done(b).fail(c):a&&r.isFunction(e=a.then)?e.call(a,b,c):b.apply(void 0,[a].slice(d))}catch(a){c.apply(void 0,[a])}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b=f&&(d!==O&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:N,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:N)),c[2][3].add(g(0,a,r.isFunction(d)?d:O))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(P(a,g.done(h(c)).resolve,g.reject,!b),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)P(e[c],h(c),g.reject);return g.promise()}});var Q=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&Q.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var R=r.Deferred();r.fn.ready=function(a){return R.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||R.resolveWith(d,[r]))}}),r.ready.then=R.then;function S(){d.removeEventListener("DOMContentLoaded",S), a.removeEventListener("load",S),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",S),a.addEventListener("load",S));var T=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)T(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h1,null,!0)},removeData:function(a){return this.each(function(){X.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=W.get(a,b),c&&(!d||Array.isArray(c)?d=W.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return W.get(a,c)||W.access(a,c,{empty:r.Callbacks("once memory").add(function(){W.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length\x20\t\r\n\f]+)/i,la=/^$|\/(?:java|ecma)script/i,ma={option:[1,""],thead:[1,"","
        "],col:[2,"","
        "],tr:[2,"","
        "],td:[3,"","
        "],_default:[0,"",""]};ma.optgroup=ma.option,ma.tbody=ma.tfoot=ma.colgroup=ma.caption=ma.thead,ma.th=ma.td;function na(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&B(a,b)?r.merge([a],c):c}function oa(a,b){for(var c=0,d=a.length;c-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=na(l.appendChild(f),"script"),j&&oa(g),c){k=0;while(f=g[k++])la.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var ra=d.documentElement,sa=/^key/,ta=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ua=/^([^.]*)(?:\.(.+)|)/;function va(){return!0}function wa(){return!1}function xa(){try{return d.activeElement}catch(a){}}function ya(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ya(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=wa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(ra,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(L)||[""],j=b.length;while(j--)h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.hasData(a)&&W.get(a);if(q&&(i=q.events)){b=(b||"").match(L)||[""],j=b.length;while(j--)if(h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&W.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(W.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i\x20\t\r\n\f]*)[^>]*)\/>/gi,Aa=/\s*$/g;function Ea(a,b){return B(a,"table")&&B(11!==b.nodeType?b:b.firstChild,"tr")?r(">tbody",a)[0]||a:a}function Fa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Ga(a){var b=Ca.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ha(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(W.hasData(a)&&(f=W.access(a),g=W.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c1&&"string"==typeof q&&!o.checkClone&&Ba.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ja(f,b,c,d)});if(m&&(e=qa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(na(e,"script"),Fa),i=h.length;l")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=na(h),f=na(a),d=0,e=f.length;d0&&oa(g,!i&&na(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(U(c)){if(b=c[W.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[W.expando]=void 0}c[X.expando]&&(c[X.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ka(this,a,!0)},remove:function(a){return Ka(this,a)},text:function(a){return T(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.appendChild(a)}})},prepend:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(na(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return T(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!Aa.test(a)&&!ma[(ka.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c1)}});function _a(a,b,c,d,e){return new _a.prototype.init(a,b,c,d,e)}r.Tween=_a,_a.prototype={constructor:_a,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?"":"px")},cur:function(){var a=_a.propHooks[this.prop];return a&&a.get?a.get(this):_a.propHooks._default.get(this)},run:function(a){var b,c=_a.propHooks[this.prop];return this.options.duration?this.pos=b=r.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):_a.propHooks._default.set(this),this}},_a.prototype.init.prototype=_a.prototype,_a.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},_a.propHooks.scrollTop=_a.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},r.fx=_a.prototype.init,r.fx.step={};var ab,bb,cb=/^(?:toggle|show|hide)$/,db=/queueHooks$/;function eb(){bb&&(d.hidden===!1&&a.requestAnimationFrame?a.requestAnimationFrame(eb):a.setTimeout(eb,r.fx.interval),r.fx.tick())}function fb(){return a.setTimeout(function(){ab=void 0}),ab=r.now()}function gb(a,b){var c,d=0,e={height:a};for(b=b?1:0;d<4;d+=2-b)c=ca[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function hb(a,b,c){for(var d,e=(kb.tweeners[b]||[]).concat(kb.tweeners["*"]),f=0,g=e.length;f1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?lb:void 0)),void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b), null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&B(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(L);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),lb={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=mb[b]||r.find.attr;mb[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=mb[g],mb[g]=e,e=null!=c(a,b,d)?g:null,mb[g]=f),e}});var nb=/^(?:input|select|textarea|button)$/i,ob=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return T(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):nb.test(a.nodeName)||ob.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});function pb(a){var b=a.match(L)||[];return b.join(" ")}function qb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,qb(this)))});if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,qb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,qb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(L)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=qb(this),b&&W.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":W.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+pb(qb(c))+" ").indexOf(b)>-1)return!0;return!1}});var rb=/\r/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":Array.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(rb,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:pb(r.text(a))}},select:{get:function(a){var b,c,d,e=a.options,f=a.selectedIndex,g="select-one"===a.type,h=g?null:[],i=g?f+1:e.length;for(d=f<0?i:g?f:0;d-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(Array.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var sb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!sb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,sb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(W.get(h,"events")||{})[b.type]&&W.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&U(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!U(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=W.access(d,b);e||d.addEventListener(a,c,!0),W.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=W.access(d,b)-1;e?W.access(d,b,e):(d.removeEventListener(a,c,!0),W.remove(d,b))}}});var tb=a.location,ub=r.now(),vb=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var wb=/\[\]$/,xb=/\r?\n/g,yb=/^(?:submit|button|image|reset|file)$/i,zb=/^(?:input|select|textarea|keygen)/i;function Ab(a,b,c,d){var e;if(Array.isArray(b))r.each(b,function(b,e){c||wb.test(a)?d(a,e):Ab(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)Ab(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(Array.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)Ab(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&zb.test(this.nodeName)&&!yb.test(a)&&(this.checked||!ja.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:Array.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(xb,"\r\n")}}):{name:b.name,value:c.replace(xb,"\r\n")}}).get()}});var Bb=/%20/g,Cb=/#.*$/,Db=/([?&])_=[^&]*/,Eb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Fb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Gb=/^(?:GET|HEAD)$/,Hb=/^\/\//,Ib={},Jb={},Kb="*/".concat("*"),Lb=d.createElement("a");Lb.href=tb.href;function Mb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(L)||[];if(r.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Nb(a,b,c,d){var e={},f=a===Jb;function g(h){var i;return e[h]=!0,r.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Ob(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function Pb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}if(f)return f!==i[0]&&i.unshift(f),c[f]}function Qb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:tb.href,type:"GET",isLocal:Fb.test(tb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Kb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Ob(Ob(a,r.ajaxSettings),b):Ob(r.ajaxSettings,a)},ajaxPrefilter:Mb(Ib),ajaxTransport:Mb(Jb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Eb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||tb.href)+"").replace(Hb,tb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(L)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Lb.protocol+"//"+Lb.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Nb(Ib,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Gb.test(o.type),f=o.url.replace(Cb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(Bb,"+")):(n=o.url.slice(f.length),o.data&&(f+=(vb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Db,"$1"),n=(vb.test(f)?"&":"?")+"_="+ub++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Kb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=Nb(Jb,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&b<300||304===b,d&&(v=Pb(o,y,d)),v=Qb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",b<0&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Rb={0:200,1223:204},Sb=r.ajaxSettings.xhr();o.cors=!!Sb&&"withCredentials"in Sb,o.ajax=Sb=!!Sb,r.ajaxTransport(function(b){var c,d;if(o.cors||Sb&&!b.crossDomain)return{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Rb[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r("