From 25c79dfebcd730ca526d5b99883c3067be894c1e Mon Sep 17 00:00:00 2001 From: Dimitri Fontaine Date: Thu, 21 Dec 2017 17:43:27 +0100 Subject: [PATCH] Switch the documentation to using Sphinx. The website is moving to pgloader.org and readthedocs.io is going to be integrated. Let's see what happens. The docs build fine locally with the sphinx tools and the docs/Makefile. Having separate files for the documentation should help ease the maintenance and add new topics, such as support for Common Lisp Hackers level docs, which are currently missing. --- docs/Makefile | 20 + docs/_build/doctrees/bugreport.doctree | Bin 0 -> 6347 bytes docs/_build/doctrees/environment.pickle | Bin 0 -> 63837 bytes docs/_build/doctrees/index.doctree | Bin 0 -> 5040 bytes docs/_build/doctrees/intro.doctree | Bin 0 -> 12594 bytes .../doctrees/pgloader-usage-examples.doctree | Bin 0 -> 24826 bytes docs/_build/doctrees/pgloader.doctree | Bin 0 -> 132486 bytes docs/_build/doctrees/ref/archive.doctree | Bin 0 -> 14701 bytes docs/_build/doctrees/ref/copy.doctree | Bin 0 -> 19507 bytes docs/_build/doctrees/ref/csv.doctree | Bin 0 -> 45609 bytes docs/_build/doctrees/ref/dbf.doctree | Bin 0 -> 10989 bytes docs/_build/doctrees/ref/fixed.doctree | Bin 0 -> 31189 bytes docs/_build/doctrees/ref/ixf.doctree | Bin 0 -> 12946 bytes docs/_build/doctrees/ref/mssql.doctree | Bin 0 -> 20336 bytes docs/_build/doctrees/ref/mysql.doctree | Bin 0 -> 106338 bytes docs/_build/doctrees/ref/sqlite.doctree | Bin 0 -> 33708 bytes docs/_build/doctrees/ref/transforms.doctree | Bin 0 -> 23080 bytes docs/_build/doctrees/tutorial/csv.doctree | Bin 0 -> 10505 bytes docs/_build/doctrees/tutorial/dBase.doctree | Bin 0 -> 10669 bytes docs/_build/doctrees/tutorial/fixed.doctree | Bin 0 -> 14316 bytes docs/_build/doctrees/tutorial/geolite.doctree | Bin 0 -> 19279 bytes docs/_build/doctrees/tutorial/mysql.doctree | Bin 0 -> 28429 bytes .../doctrees/tutorial/quickstart.doctree | Bin 0 -> 22100 bytes docs/_build/doctrees/tutorial/sqlite.doctree | Bin 0 -> 21186 bytes .../_build/doctrees/tutorial/tutorial.doctree | Bin 0 -> 119280 bytes docs/_build/html/.buildinfo | 4 + docs/_build/html/.nojekyll | 0 docs/_build/html/_sources/bugreport.rst.txt | 49 + docs/_build/html/_sources/index.rst.txt | 33 + docs/_build/html/_sources/intro.rst.txt | 63 + .../_sources/pgloader-usage-examples.rst.txt | 163 + docs/_build/html/_sources/pgloader.rst.txt | 713 ++ docs/_build/html/_sources/ref/archive.rst.txt | 104 + docs/_build/html/_sources/ref/copy.rst.txt | 115 + docs/_build/html/_sources/ref/csv.rst.txt | 237 + docs/_build/html/_sources/ref/dbf.rst.txt | 53 + docs/_build/html/_sources/ref/fixed.rst.txt | 182 + docs/_build/html/_sources/ref/ixf.rst.txt | 66 + docs/_build/html/_sources/ref/mssql.rst.txt | 159 + docs/_build/html/_sources/ref/mysql.rst.txt | 623 + docs/_build/html/_sources/ref/sqlite.rst.txt | 207 + .../html/_sources/ref/transforms.rst.txt | 134 + .../html/_sources/tutorial/csv.rst.txt} | 27 +- .../html/_sources/tutorial/dBase.rst.txt} | 23 +- .../html/_sources/tutorial/fixed.rst.txt} | 26 +- .../html/_sources/tutorial/geolite.rst.txt} | 32 +- .../html/_sources/tutorial/mysql.rst.txt} | 48 +- .../_sources/tutorial/quickstart.rst.txt} | 42 +- .../html/_sources/tutorial/sqlite.rst.txt} | 28 +- .../html/_sources/tutorial/tutorial.rst.txt | 10 + docs/_build/html/_static/ajax-loader.gif | Bin 0 -> 673 bytes docs/_build/html/_static/alabaster.css | 689 ++ docs/_build/html/_static/basic.css | 643 + docs/_build/html/_static/comment-bright.png | Bin 0 -> 756 bytes docs/_build/html/_static/comment-close.png | Bin 0 -> 829 bytes docs/_build/html/_static/comment.png | Bin 0 -> 641 bytes docs/_build/html/_static/custom.css | 1 + docs/_build/html/_static/doctools.js | 311 + docs/_build/html/_static/down-pressed.png | Bin 0 -> 222 bytes docs/_build/html/_static/down.png | Bin 0 -> 202 bytes docs/_build/html/_static/file.png | Bin 0 -> 286 bytes docs/_build/html/_static/jquery-3.1.0.js | 10074 ++++++++++++++++ docs/_build/html/_static/jquery.js | 4 + docs/_build/html/_static/minus.png | Bin 0 -> 90 bytes docs/_build/html/_static/plus.png | Bin 0 -> 90 bytes docs/_build/html/_static/pygments.css | 69 + docs/_build/html/_static/searchtools.js | 761 ++ docs/_build/html/_static/underscore-1.3.1.js | 999 ++ docs/_build/html/_static/underscore.js | 31 + docs/_build/html/_static/up-pressed.png | Bin 0 -> 214 bytes docs/_build/html/_static/up.png | Bin 0 -> 203 bytes docs/_build/html/_static/websupport.js | 808 ++ docs/_build/html/bugreport.html | 136 + docs/_build/html/genindex.html | 88 + docs/_build/html/index.html | 198 + docs/_build/html/intro.html | 151 + docs/_build/html/objects.inv | Bin 0 -> 663 bytes docs/_build/html/pgloader-usage-examples.html | 237 + docs/_build/html/ref/archive.html | 191 + docs/_build/html/ref/copy.html | 196 + docs/_build/html/ref/csv.html | 310 + docs/_build/html/ref/dbf.html | 138 + docs/_build/html/ref/fixed.html | 270 + docs/_build/html/ref/ixf.html | 149 + docs/_build/html/ref/mssql.html | 236 + docs/_build/html/ref/mysql.html | 639 + docs/_build/html/ref/sqlite.html | 268 + docs/_build/html/ref/transforms.html | 214 + docs/_build/html/search.html | 101 + docs/_build/html/searchindex.js | 1 + docs/_build/html/tutorial/csv.html | 169 + docs/_build/html/tutorial/dBase.html | 134 + docs/_build/html/tutorial/fixed.html | 176 + docs/_build/html/tutorial/geolite.html | 239 + docs/_build/html/tutorial/mysql.html | 246 + docs/_build/html/tutorial/quickstart.html | 218 + docs/_build/html/tutorial/sqlite.html | 208 + docs/_build/html/tutorial/tutorial.html | 893 ++ docs/bugreport.rst | 49 + docs/conf.py | 177 + docs/dist/carousel.css | 164 - docs/dist/css/bootstrap-theme.css | 397 - docs/dist/css/bootstrap-theme.min.css | 7 - docs/dist/css/bootstrap.css | 7118 ----------- docs/dist/css/bootstrap.min.css | 7 - .../fonts/glyphicons-halflings-regular.eot | Bin 20290 -> 0 bytes .../fonts/glyphicons-halflings-regular.svg | 229 - .../fonts/glyphicons-halflings-regular.ttf | Bin 41236 -> 0 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 23292 -> 0 bytes docs/dist/js/bootstrap.js | 2006 --- docs/dist/js/bootstrap.min.js | 7 - docs/download.html | 157 - docs/howto/csv.html | 163 - docs/howto/dBase.html | 134 - docs/howto/fixed.html | 171 - docs/howto/footer.html | 32 - docs/howto/geolite.html | 228 - docs/howto/header.html | 84 - docs/howto/mysql.html | 208 - docs/howto/pgloader.1.html | 412 - docs/howto/quickstart.html | 152 - docs/howto/sqlite.html | 191 - docs/img/2ndquadrant_logo_full_color.640.jpg | Bin 31574 -> 0 bytes docs/img/2ndquadrant_logo_full_color.800.jpg | Bin 41974 -> 0 bytes docs/img/2ndquadrant_logo_full_color.jpg | Bin 64242 -> 0 bytes docs/img/bsd.svg | 171 - docs/img/csv_text.png | Bin 34700 -> 0 bytes docs/img/enterprise-metasearch-sources.jpg | Bin 37836 -> 0 bytes docs/img/fb-logo-4d-1000x168.COLOR.png | Bin 27983 -> 0 bytes docs/img/huge-full-outer-join.gif | Bin 1959 -> 0 bytes docs/img/iwoca.png | Bin 29784 -> 0 bytes docs/img/redpill-linpro.jpg | Bin 44816 -> 0 bytes docs/img/sqlite.gif | Bin 5452 -> 0 bytes docs/img/toy-loader.140.jpg | Bin 11647 -> 0 bytes docs/img/toy-loader.320.jpg | Bin 28972 -> 0 bytes docs/img/toy-loader.640.jpg | Bin 82128 -> 0 bytes docs/img/type-casting-machine.320.jpg | Bin 25453 -> 0 bytes docs/img/type-casting-machine.500.jpg | Bin 57019 -> 0 bytes docs/img/type-casting-machine.640.jpg | Bin 87209 -> 0 bytes docs/index.html | 213 - docs/index.rst | 33 + docs/intro.rst | 63 + docs/pgloader-moral-license.html | 165 - docs/pgloader-usage-examples.rst | 163 + docs/pgloader.rst | 713 ++ docs/ref/archive.rst | 104 + docs/ref/copy.rst | 115 + docs/ref/csv.rst | 237 + docs/ref/dbf.rst | 53 + docs/ref/fixed.rst | 182 + docs/ref/ixf.rst | 66 + docs/ref/mssql.rst | 159 + docs/ref/mysql.rst | 623 + docs/ref/sqlite.rst | 207 + docs/ref/transforms.rst | 134 + docs/sponsors.html | 246 - docs/src/docs.lisp | 47 - docs/tutorial/csv.rst | 85 + docs/tutorial/dBase.rst | 56 + docs/tutorial/fixed.rst | 96 + docs/tutorial/geolite.rst | 159 + docs/tutorial/mysql.rst | 177 + docs/tutorial/quickstart.rst | 142 + docs/tutorial/sqlite.rst | 129 + docs/tutorial/tutorial.rst | 10 + pgloader.asd | 11 +- 166 files changed, 27181 insertions(+), 12828 deletions(-) create mode 100644 docs/Makefile create mode 100644 docs/_build/doctrees/bugreport.doctree create mode 100644 docs/_build/doctrees/environment.pickle create mode 100644 docs/_build/doctrees/index.doctree create mode 100644 docs/_build/doctrees/intro.doctree create mode 100644 docs/_build/doctrees/pgloader-usage-examples.doctree create mode 100644 docs/_build/doctrees/pgloader.doctree create mode 100644 docs/_build/doctrees/ref/archive.doctree create mode 100644 docs/_build/doctrees/ref/copy.doctree create mode 100644 docs/_build/doctrees/ref/csv.doctree create mode 100644 docs/_build/doctrees/ref/dbf.doctree create mode 100644 docs/_build/doctrees/ref/fixed.doctree create mode 100644 docs/_build/doctrees/ref/ixf.doctree create mode 100644 docs/_build/doctrees/ref/mssql.doctree create mode 100644 docs/_build/doctrees/ref/mysql.doctree create mode 100644 docs/_build/doctrees/ref/sqlite.doctree create mode 100644 docs/_build/doctrees/ref/transforms.doctree create mode 100644 docs/_build/doctrees/tutorial/csv.doctree create mode 100644 docs/_build/doctrees/tutorial/dBase.doctree create mode 100644 docs/_build/doctrees/tutorial/fixed.doctree create mode 100644 docs/_build/doctrees/tutorial/geolite.doctree create mode 100644 docs/_build/doctrees/tutorial/mysql.doctree create mode 100644 docs/_build/doctrees/tutorial/quickstart.doctree create mode 100644 docs/_build/doctrees/tutorial/sqlite.doctree create mode 100644 docs/_build/doctrees/tutorial/tutorial.doctree create mode 100644 docs/_build/html/.buildinfo create mode 100644 docs/_build/html/.nojekyll create mode 100644 docs/_build/html/_sources/bugreport.rst.txt create mode 100644 docs/_build/html/_sources/index.rst.txt create mode 100644 docs/_build/html/_sources/intro.rst.txt create mode 100644 docs/_build/html/_sources/pgloader-usage-examples.rst.txt create mode 100644 docs/_build/html/_sources/pgloader.rst.txt create mode 100644 docs/_build/html/_sources/ref/archive.rst.txt create mode 100644 docs/_build/html/_sources/ref/copy.rst.txt create mode 100644 docs/_build/html/_sources/ref/csv.rst.txt create mode 100644 docs/_build/html/_sources/ref/dbf.rst.txt create mode 100644 docs/_build/html/_sources/ref/fixed.rst.txt create mode 100644 docs/_build/html/_sources/ref/ixf.rst.txt create mode 100644 docs/_build/html/_sources/ref/mssql.rst.txt create mode 100644 docs/_build/html/_sources/ref/mysql.rst.txt create mode 100644 docs/_build/html/_sources/ref/sqlite.rst.txt create mode 100644 docs/_build/html/_sources/ref/transforms.rst.txt rename docs/{src/csv.md => _build/html/_sources/tutorial/csv.rst.txt} (87%) rename docs/{src/dBase.md => _build/html/_sources/tutorial/dBase.rst.txt} (82%) rename docs/{src/fixed.md => _build/html/_sources/tutorial/fixed.rst.txt} (90%) rename docs/{src/geolite.md => _build/html/_sources/tutorial/geolite.rst.txt} (88%) rename docs/{src/mysql.md => _build/html/_sources/tutorial/mysql.rst.txt} (90%) rename docs/{src/quickstart.md => _build/html/_sources/tutorial/quickstart.rst.txt} (87%) rename docs/{src/sqlite.md => _build/html/_sources/tutorial/sqlite.rst.txt} (93%) create mode 100644 docs/_build/html/_sources/tutorial/tutorial.rst.txt create mode 100644 docs/_build/html/_static/ajax-loader.gif create mode 100644 docs/_build/html/_static/alabaster.css create mode 100644 docs/_build/html/_static/basic.css create mode 100644 docs/_build/html/_static/comment-bright.png create mode 100644 docs/_build/html/_static/comment-close.png create mode 100644 docs/_build/html/_static/comment.png create mode 100644 docs/_build/html/_static/custom.css create mode 100644 docs/_build/html/_static/doctools.js create mode 100644 docs/_build/html/_static/down-pressed.png create mode 100644 docs/_build/html/_static/down.png create mode 100644 docs/_build/html/_static/file.png create mode 100644 docs/_build/html/_static/jquery-3.1.0.js create mode 100644 docs/_build/html/_static/jquery.js create mode 100644 docs/_build/html/_static/minus.png create mode 100644 docs/_build/html/_static/plus.png create mode 100644 docs/_build/html/_static/pygments.css create mode 100644 docs/_build/html/_static/searchtools.js create mode 100644 docs/_build/html/_static/underscore-1.3.1.js create mode 100644 docs/_build/html/_static/underscore.js create mode 100644 docs/_build/html/_static/up-pressed.png create mode 100644 docs/_build/html/_static/up.png create mode 100644 docs/_build/html/_static/websupport.js create mode 100644 docs/_build/html/bugreport.html create mode 100644 docs/_build/html/genindex.html create mode 100644 docs/_build/html/index.html create mode 100644 docs/_build/html/intro.html create mode 100644 docs/_build/html/objects.inv create mode 100644 docs/_build/html/pgloader-usage-examples.html create mode 100644 docs/_build/html/ref/archive.html create mode 100644 docs/_build/html/ref/copy.html create mode 100644 docs/_build/html/ref/csv.html create mode 100644 docs/_build/html/ref/dbf.html create mode 100644 docs/_build/html/ref/fixed.html create mode 100644 docs/_build/html/ref/ixf.html create mode 100644 docs/_build/html/ref/mssql.html create mode 100644 docs/_build/html/ref/mysql.html create mode 100644 docs/_build/html/ref/sqlite.html create mode 100644 docs/_build/html/ref/transforms.html create mode 100644 docs/_build/html/search.html create mode 100644 docs/_build/html/searchindex.js create mode 100644 docs/_build/html/tutorial/csv.html create mode 100644 docs/_build/html/tutorial/dBase.html create mode 100644 docs/_build/html/tutorial/fixed.html create mode 100644 docs/_build/html/tutorial/geolite.html create mode 100644 docs/_build/html/tutorial/mysql.html create mode 100644 docs/_build/html/tutorial/quickstart.html create mode 100644 docs/_build/html/tutorial/sqlite.html create mode 100644 docs/_build/html/tutorial/tutorial.html create mode 100644 docs/bugreport.rst create mode 100644 docs/conf.py delete mode 100644 docs/dist/carousel.css delete mode 100644 docs/dist/css/bootstrap-theme.css delete mode 100644 docs/dist/css/bootstrap-theme.min.css delete mode 100644 docs/dist/css/bootstrap.css delete mode 100644 docs/dist/css/bootstrap.min.css delete mode 100644 docs/dist/fonts/glyphicons-halflings-regular.eot delete mode 100644 docs/dist/fonts/glyphicons-halflings-regular.svg delete mode 100644 docs/dist/fonts/glyphicons-halflings-regular.ttf delete mode 100644 docs/dist/fonts/glyphicons-halflings-regular.woff delete mode 100644 docs/dist/js/bootstrap.js delete mode 100644 docs/dist/js/bootstrap.min.js delete mode 100644 docs/download.html delete mode 100644 docs/howto/csv.html delete mode 100644 docs/howto/dBase.html delete mode 100644 docs/howto/fixed.html delete mode 100644 docs/howto/footer.html delete mode 100644 docs/howto/geolite.html delete mode 100644 docs/howto/header.html delete mode 100644 docs/howto/mysql.html delete mode 100644 docs/howto/pgloader.1.html delete mode 100644 docs/howto/quickstart.html delete mode 100644 docs/howto/sqlite.html delete mode 100644 docs/img/2ndquadrant_logo_full_color.640.jpg delete mode 100644 docs/img/2ndquadrant_logo_full_color.800.jpg delete mode 100644 docs/img/2ndquadrant_logo_full_color.jpg delete mode 100644 docs/img/bsd.svg delete mode 100644 docs/img/csv_text.png delete mode 100644 docs/img/enterprise-metasearch-sources.jpg delete mode 100644 docs/img/fb-logo-4d-1000x168.COLOR.png delete mode 100644 docs/img/huge-full-outer-join.gif delete mode 100644 docs/img/iwoca.png delete mode 100644 docs/img/redpill-linpro.jpg delete mode 100644 docs/img/sqlite.gif delete mode 100644 docs/img/toy-loader.140.jpg delete mode 100644 docs/img/toy-loader.320.jpg delete mode 100644 docs/img/toy-loader.640.jpg delete mode 100644 docs/img/type-casting-machine.320.jpg delete mode 100644 docs/img/type-casting-machine.500.jpg delete mode 100644 docs/img/type-casting-machine.640.jpg delete mode 100644 docs/index.html create mode 100644 docs/index.rst create mode 100644 docs/intro.rst delete mode 100644 docs/pgloader-moral-license.html create mode 100644 docs/pgloader-usage-examples.rst create mode 100644 docs/pgloader.rst create mode 100644 docs/ref/archive.rst create mode 100644 docs/ref/copy.rst create mode 100644 docs/ref/csv.rst create mode 100644 docs/ref/dbf.rst create mode 100644 docs/ref/fixed.rst create mode 100644 docs/ref/ixf.rst create mode 100644 docs/ref/mssql.rst create mode 100644 docs/ref/mysql.rst create mode 100644 docs/ref/sqlite.rst create mode 100644 docs/ref/transforms.rst delete mode 100644 docs/sponsors.html delete mode 100644 docs/src/docs.lisp create mode 100644 docs/tutorial/csv.rst create mode 100644 docs/tutorial/dBase.rst create mode 100644 docs/tutorial/fixed.rst create mode 100644 docs/tutorial/geolite.rst create mode 100644 docs/tutorial/mysql.rst create mode 100644 docs/tutorial/quickstart.rst create mode 100644 docs/tutorial/sqlite.rst create mode 100644 docs/tutorial/tutorial.rst diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..c64111d --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +SPHINXPROJ = pgloader +SOURCEDIR = . +BUILDDIR = _build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) \ No newline at end of file diff --git a/docs/_build/doctrees/bugreport.doctree b/docs/_build/doctrees/bugreport.doctree new file mode 100644 index 0000000000000000000000000000000000000000..18b937b7cc61df2c982b09f6126943de9bef71bc GIT binary patch literal 6347 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 NxYaBJif@ec{6GF&m~;RD literal 0 HcmV?d00001 diff --git a/docs/_build/doctrees/index.doctree b/docs/_build/doctrees/index.doctree new file mode 100644 index 0000000000000000000000000000000000000000..98788c19c242ebebe030530870b22694431ca53c GIT binary patch literal 5040 zcmds5ZEIvn6;3A8o$gN3$z;s3=tS@0OeQ;Qr*~!**MJC)EJ&b5oN-xXxKn*^byp?# zZEn>~x<3dzu(~r+-@JkfDxwQ2sGs#8i24IW1kum_2cJ{--hRuNiC-Pa&~@t6sj73H zbLu(w{j1;q==zfVXWD-3Wm*R6Ac}pia?>C|$RnM9FMs`M{;ho9G*fn_;w<%eZkC|o z2^sh)kMc+PzF0D=UL4LX5H<6cWEjNE=c!YfV_L?M6EdYC9LRvb;dm)$n)^6G)wjxSU0X?e;IadBBu{5Wi~?3yWV3KTD>AKJ!jeKCn8?Q5YPmgb{=qNy-&ZPkEl1Rn3O9 zA{R}uBUZ$+STXeqYkS>?&{JJshFzbZb}LMEfhpCMku0;VPtk$&D0iT&NH{ay}V8aP8)dsiKJZxVp0I+5DUZDKX_kVa!ed^G=xK@|0 zC2sY^?H+t8UV$UUs{qu;@pl7%pTwW@D9^-A(SiD%LS5{M+efSRN)5twoJIc3!HYYY z%_4ISnD3VfyjlYIobG?!SnQaZ^(Nwq(5KQybH7JYoyPfh@}9Y-GaaXr1>Ne06*nrE z+0iP(-SyO|9W-e$kR$FFnszQu##2qdKbQ{Ws2Hq~9!pVU01(>Q+6l+%NnnR9n#Vxu z*=bcxw`p3ZEK-9w4OL;GpAA!<#Hq%Rn{^p^LFRKRLIloz@ip;v@ld=g-V@&xkAy3j z@B|k_A;k$djgXCeo@kLDT>j50wZR$#n0?Z@+GsLaNIQ-x+APU zudrn5GO|T&<{-t|Ez_v>%BLQv!vnut1jxR*YR#J!rG4Z!{_oIsd=VzU!RlWxuAWsg zl-YWmpn9*61)G$99OC87#UBjiEFUF-^rQxkDP!@54>?Nn^suH5F~F6Jo;7#I(kOpM zDF0;%k5AzkA6;||QvUgj@=sr;{9{=B(KOP)zxc@nZe`@c7=gf3Qbz6<)x7wdjn%If z#=l({BOaB7g?RjH@pSv*_m>LAKNc5WIu!q22!;6L%<06RL{I#A&f^aJ^Y@E(oAo#; z|Mg|c7kYf7$Q8w@zAyUwcx`!UY2M{i(ZuUh(H4k;H8k(`y^aT%ARQ` zt~JUk`j~69u13UZ3|cTi6A{Il&rBXIn++nRc=_EC(UKgJwgS;g+_HC4 zF!_l>!UIm-lyc9c7H-9}v17TQB;L4u!D-xppYnjnNlUN*?^iLbnQMF`;VaE_rl!)G z&q0TZ8+H@gcn3nq>ON~U&UcY21}!w2tl-p2m(6AO#Y7TrO? zQ35UsY}2t3uxOaEA&19(JY!eD&dhZ*cya2xpm%tVu?;cbo~ffL9N?Ppi1b}_D`2rX zTB9}t2X?0-b43DF8-5lh?gV&ntQCMd^E6@s8Qipz8CF_}62&t=cF`O`YYR_kthhV7 z(xSxE?x|F=fas>{OGVrW7b#D=e8=4OXhkVRVIf)T;X;NxiRc+$D` z=4arRb~^ADwjs%Mn;X?OI*#%AL2^B?+Xx*7*rJK*f)wzHcQ?!~02R8E+?pKUEqco5 z<`sJy8KGe$eh%D{k9+`m4Xk=HMB;6!FuquL20k)!jI9I*fqHIsJbXzxaXH9V;G)e#^GuERGqb{@Qyga#JWJ!d1eFpr*czOw zZyH5yKr#YXRI}+*hFg#_+mK(w-oOc(Ir0{oA?okV_MEh6YbT?gn_I1uy}q zkWlJXdc_51C50ZoMIg9gKMp2Hv8o?i5Kgq4a~7M`u6EJ(oPGOEipuuRqOEdf$uv+H mCTeZ4f8-Osizw8b!r&zT=frChu?<$sr;=1=FEQ7wfAAkf%!V}p literal 0 HcmV?d00001 diff --git a/docs/_build/doctrees/intro.doctree b/docs/_build/doctrees/intro.doctree new file mode 100644 index 0000000000000000000000000000000000000000..4e007ec1836d78ce0fe7a7cfcb37b178acf50277 GIT binary patch literal 12594 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 literal 0 HcmV?d00001 diff --git a/docs/_build/doctrees/pgloader.doctree b/docs/_build/doctrees/pgloader.doctree new file mode 100644 index 0000000000000000000000000000000000000000..e40b92ae1224af29ccb699ae1104ea3991d63c09 GIT binary patch literal 132486 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 PETnSHA^WZ~J@S76v>$I+ literal 0 HcmV?d00001 diff --git a/docs/_build/doctrees/ref/archive.doctree b/docs/_build/doctrees/ref/archive.doctree new file mode 100644 index 0000000000000000000000000000000000000000..bf65935d10a8db2da5954b763f24a8234df48673 GIT binary patch literal 14701 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 literal 0 HcmV?d00001 diff --git a/docs/_build/doctrees/ref/csv.doctree b/docs/_build/doctrees/ref/csv.doctree new file mode 100644 index 0000000000000000000000000000000000000000..e67f2b5283212e3b2b5f867780d31cbf8da067c1 GIT binary patch literal 45609 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 W$Gi1oo@|^mhDnp!PoB0{o%#Qw@?3-f literal 0 HcmV?d00001 diff --git a/docs/_build/doctrees/ref/dbf.doctree b/docs/_build/doctrees/ref/dbf.doctree new file mode 100644 index 0000000000000000000000000000000000000000..59b7d5ba4c0a916194d2d134b52e9471f11fc7e0 GIT binary patch literal 10989 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 literal 0 HcmV?d00001 diff --git a/docs/_build/doctrees/ref/fixed.doctree b/docs/_build/doctrees/ref/fixed.doctree new file mode 100644 index 0000000000000000000000000000000000000000..b9c3e9575f881b173c75fd44e6755b936fe3a7e0 GIT binary patch literal 31189 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 D;U*pn literal 0 HcmV?d00001 diff --git a/docs/_build/doctrees/ref/mssql.doctree b/docs/_build/doctrees/ref/mssql.doctree new file mode 100644 index 0000000000000000000000000000000000000000..e661d1a51394a694dafbcebe7ff95170abcf159f GIT binary patch literal 20336 zcmeHPU5p&ZaVACH-;zB3NR%ClgvPeyBhR;cwrs}=6gKF+dRHEy!2Z z(>*O;df2yjhs;jE2`{wR%i;Fw>UpC(goiy?MxE6#h5f8FiD(HzI z8T{tp#IFoq9vsi+B6}?k)5sBnYzJyMuIINR5e!}&xI40$SU8Cn2D-jG zn{j+Qj!}r;Q-R%+zh+x$zj$fd&b3IisZN^BBzA{B4cvM6h`WbIbRWnTm!FMA6fd{D z-f~M^U+#DO&~Axn8N`m4(RjHR$1nM{C9fiGu&QwHnu2ojjBsHvd5?5HU zzz`w8~} zcM)^DTd@V^cu5MFJC)u0jEKZS4EkB(hTZG?;^aw1uKVcQyEk7ieH~~(vO^o&4lu}L zlfyP^z_ugX=X;5WY`@X;L+6^ogU{{WxnqasF=D8SMgN%Dn2}E|FQ;JmFSroqY})>cWq@oX+Oq4m&1 zRx1kos(Y`EIq_o17{;+2J9Z$tkD=CM`3(J(9*Q2CDX{_^anFyEiEQph&p#RWZCX`k z`;h>@To)`VUxb)c6f2V0ltkt8t58x`na!?hJ!m_Q=wpURfwe>557$UnL3x7>Np7IA z`m{*pO6a(I7|ROk8e$~hG3-}N!GRv$&udr%S{iZ)CNd-;o5=xDvO2|Z6}>VYI-}@7 zxD$3bQ~mau52Gx`(qs3j2?E>|rN`95zh4z(i^EI&6*eTSD}CX3ZO_3P z6b2`)r!HT-plCQr6OFq23gG#MIdh}cF|E!wWp!4|A1d+K|C|bgK$eBMrOSCTL1JtY)WA%2@ zh>R5|z`ob%tdngKTVX(qU3n@JV)gVDC?^jK_7Z{QxOUKi-2_&qrCP7yBukNnWrVCM zaf826rK@Ov>Eh+ps}&Jk_o6T$OV7G)M;@tLxk8h0{No3e0EK9NfN=zGzh;Vp+t%_p zr#V20+f2?91!Y)i{mwW_>orzd_iw>WS~#<}Xpo)g#Z{OTRV9*D zY3EmCQ`1z*Mj6=3K+6_;Fmqq>*;r-|L^iTYjZU&t5@R5o&N@SPkZ0 z5G4DeT$oN;Upl+`jGC0O>uVaje*%cUZ_fJm3h-@10X|q#fPeTUR|ISjk+RFZh^rEb ztD0I+LC`5NtUI;5T6S!$nN97=)eGxz=88rZys^Tys9Be!lH%o+R2p^3O`ucRv8-9E zP=3X#p0DKGkKJmCmb8>fZQZvS*ac&6@g0Qwp-DJHTxJ!{YGS4(4T?TlSpIGtVfi5o zOKmdh6$53Hwj6=hOgOg;_nJV1N_|^4Qt(fV-}P0kV~}i&;*kcMsbnhMk-St%|fQls!Z71ag!}=FlJh zBXMkrww?M(t-}0r-0)iu48tWkYDYFJdVSZ9z1YB_doTP(4(c4v=F9k$S+DycRNRL9 zx`(N=Bi)1BSJl4v!>GTH>l-Mom z#UE{gd{^;I5aurS*zAl&f?`SFU5aZl3(@*y2kWXQ1oAA~_m`~oFtvJVoDc&es1n2} zmK`?FiK7!c>L6T@$GTdf^zb)f@Ow7_mS?YfzkyTtG@(o3%EQ^goU;q;hM4;)rpd_F zSuyvM+gH`hy@;9lJl8jv`<1bn`%aTpvHM*DO(6g;(6k-tK0g7Omo%9t5P+?#X46ex z5C+-KDg{5f(*%+X6_UEzwLNIvos5NCgxm*YFtQji`}nY7+>;UbFsSCHRCUcuT*E3} z7`BRa3uWh>wDKk+Ok%PqN0`LNhE3vAwsfs8r#`~$xioE4tC-4LOoZ+?=?@3p#|g?J z3ef$AZo!89Cr3lQ`_#&nRRx@UDPVYA!th(V$8lj8=oSparvXC|8-5k$FNGbGJf21R zEnLIO4E4#r&AR14(UC&TDHst2mn?xwMeQjSA>WyF0JjG!i=MEpm#c29^C)RZ8847w&ZZKNsg zxSgg2I&VsJ-ncDv9xb6`=z`tEB8H@^_p%rd%LMq*=;PS1KFQgx%4}zJj*4aHy2PKO z{poGQ@WZ+CxMW9(2maLVv?Bi26$%pny(ID9PDEl-89&l3SX>_)tuh`wTR(OF+0$q1 zPg@u3=byJ$SDrk7#;UJeICI51fA-uN1@gA_3dsLmLjJEBj&XRMAb(f4V91{+@%kHQ zgCq)DsUxsu$UBU1!D$l`TY&6ZaClMg%UFGEnj)wfTL`j4X<*;c>v?Q&Re1M?Rg_#h zcx%^&+utM?rDk2A{T5hb0b-jJ4RBl~Nj-brY6|X>!wc(`HP82{2r>S&m--A%62g3g za?`^0zJ$G)(EpYb`d@l_#+gv1yjF~fElud$nc=;}SyfWlq*+mhes7JN~ z6G*vyT(@B5^2HJ_{=s`yF5(954-2VU@{M731Ieb*25KI-XnQ_XlO(j=@B1Eh0rS`* zb{Y}OfGT5SXi+QYMN2l4Dutqn-?=+MHbnPsg%Hf}In4}Gm6iPEY>z>ACF65?Dhdo) zTEBpQTYI^9Gw^oI=q(F4>cJ3iS#ZBljRd zwiH4X3+F>;>*NJRg7?^qMwQ9-{5E7WmE2_muMJA>h{kP{ek*Ei$lcghwLw)B^v^z= z8<;RX$hfO&;Wo4>>acB@*C`ahhOtW9G~1YJ%GGMh2h=QWQ%lc6 z_iH2rN4j67KNI<+Yq|w%(q~6&{*SJlUp;f#x^n87GZ$8@g<7q)U|l{#2Bx)oQNAnC z7fV&&z4_bk-uykJ78%ubSs{eoZ%I6UT|+gFbwVq`E!~3gc&@Y}{Pl|VW3lB;n@BJa zCE@d+bldkjZn9*>v@3+b9(h?RLQPJpWV9H2Lx^NkLJ*bZU2swml_3xqp$AG|EOsf_ zrlbg9Zk|$Wxjs}>`##yK4(A!kp*Uiwb{D04%;EPu7q3Xz`iDD;7$yjLNHl4;j~x1t z=;hsvhhV`G**kX>#UKCNAz`ljx@OjK*jt&tUpCmhv?4rgvk9WuiE`AeoX^2&3psl! z!5p);)-9~ze;*K!S{O|Y|4Rm(8#Mg=3~N=wT9r^%lhDw&A1!0UI>x|;-ZyC8?vNTI z@gHHp)}(GSjn@k+tEZkJ#~J-wXX_;urzrQxh-T1kMzhUS+Ye~ck97ZZqPZv4_I=%g zRhwN>ZU1ydkbA2(vXOw}+W{{ktiz<*;N&#RZX!4b;6bG$UAzvCs7WL!6+pLd1sZJ7G)e_o3%x85KOt=x%HA*`0XXR z&e+x|Bz$8=&UKEAc+ zQtwU&O7T31dk(mL)D(Ba- z=0%JsLgj6k0#NMe{>>3G)YVosz~7c8m0WC$ zgtR$L5;b`k8M;7<(>0btXIB$SJJq^D!WSo96etLH!z8sxBWxhQ((&T z_w$p^-_Dao4;fxIfveC@qcm)QmP%N`8AXii=U%|EH5|ctkn&_6v-$D3^|{(- zxYR+Y6|#rC^oY*mJZ?R^`c(B%h4XvpL2DqU&a>N4$Mk$61D_3^kEJ#R^ zs#-@Dsv33We&&|?bYzM!X}l5c&(YH|%T6idQ=6qjjIN|<)a{c7InoX2&qP}Knr^{b zdab0TPjfcWrfvwk4n>Y`33$#4?MLBtPbcd_L;nACR-pWKiSpMp0+Sf(>mZgwy@c{y zJ?%BY`ez^>Rmb&K>>0@`qTygrBi!ywcWICD?|*8y~F$$%zwvYiQlGWfFr~a zPM2aJ^>dpRE%XemCTIbFNZ_2{*ds8}#&4ACte?`K;tj-L!<;leDJADkN`Ecdtnpum zRE@G{OpX7tAxl!@8|hRtbe!Cf=V|$FNV6(IFWxIbCB4H0uDcPnDj&0>#jp#>L+PV%7V)96v!=u*j_a*FQ9{QsRc<5DQ4ma@7 z?2}%ALWzw8vq+O+$l0j5o(MbF<@CFH9ez<5k<9WZ z$yH#6ycM`%yC!Ple@vs5r|NGen5x$dI&GM$>C;FUDkf@*UyW(X3(&>C+}0$Koo!eS zdfm>R;7Nj0DiRNSTlhy3h@UuN(d#E)l{2EgKeFMwBL92tr%c%YoPe<3F>u>J*x8E+ zDVv7TOkQ9RR~Mn9|Gh2pzHWd}l7VmKGQf6EGYoNxERZCHqaTrGT=zIB&0znI2>Ct@ zwi=A`H1J+Z1+3E`!I@;4GMlDoE^Q+^RVdH*R)=end{Ip`S$7#!<*DDdd;BHzy9V9m z)ECZUb~KNNRCDKPs{~M0PdQE#tt|C0TRY`;$V|J!QGHs&VzckSCz=?X0lm0nRJF6 zm+c(Xx9=d6i7u&V4YKK9wEYwb@ap;&E2QFc*H*QeQ!vH1o;k zw8M?2F}i#}mI%3#5I1Pwsi7{(!H9W-{MH;G9|<~q-tZB8^9Sed$to`5uIhCvJBX__ zk_NCz(zqy{YKdmr!Ep0yb`*eCr~!wihmtu&NF6~)4Q^%gUeHgIhW6F7Iga>MW3MyF zj+Q?*L==Tl139NHUqqlYf$AiKY=4+0T^C$~u@Ae1oz(6KP`rirdvM26b}xLcFlsgAmJWtNE*t1DEn}BN z5wF#NW7hU=4BY8#-p18FjiM;K2ihsy*GhZ+hGskvmJ8rQ@~s5a;eIaB@#mtbAB(gV zHee;9)&WFZ5fN>eEtyN4q;Vatp=8nh4O}ZkX;46fBCKdQqXfcT%=Q8qI_tsvQ24el zuhyWjD&Ms<-xvMj#tnjHFO|>{?FR97X1Phyk8yv@+S*#Jzm70%Pz$4uyj@B3XW#Y0C(XT%I$WuQ(D8ycW?G5=AyNp)*)G>RAP^C0K_b^Nl#B2;dOPgE zL%i0&#ZjK$z!o%Z69SG~*)H5O0dV#s*M>YDQYE1~6}F!}aC*{^ zyUol62QfDIB*6t`pcWP#x|}OJR4V0MTPj9xZT&J$@_;M6P(DM2^7rxXaY$_UVLaTo z+&8;75nAcKOpm{!$6wOp&*||4dL-C!>%K&fkI}=ThffcW9(!TVbm!>tHod+@kKOdT zlO8TT1U)Po@faRyHb;<<*}`{>F)VfWtvZ8IXAtTa560be(o9<0U%6(g6L1Kw?DcyAmVH+mIMh0++;y z@*N~b6dPuY*zQfUeI~~<$@e*)++!x$k|m^-R6RMjW{IqaJJ!JWy=LfZA>yj{4HfFz zbEO{V)TrF(P^o_`Fi}D)+Tr28@-H~C44tW~%_FZ6ss_e-40S9!)T*&myhj%^A6F2^ R3h913T!>dEBO-0q{tt-e$y5LU literal 0 HcmV?d00001 diff --git a/docs/_build/doctrees/ref/mysql.doctree b/docs/_build/doctrees/ref/mysql.doctree new file mode 100644 index 0000000000000000000000000000000000000000..c511810a819bf2326fc4474231e7eb77fa8deaf7 GIT binary patch literal 106338 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 literal 0 HcmV?d00001 diff --git a/docs/_build/doctrees/ref/transforms.doctree b/docs/_build/doctrees/ref/transforms.doctree new file mode 100644 index 0000000000000000000000000000000000000000..959692eb54a66774c3e7af5b89078367a07cd391 GIT binary patch literal 23080 zcmds9Yiu0Xb*3JCEk)|(6%^UBr*s@qTkdj6i55jSfNe>BL=x>& zJNM3=J3CzN&RV2x#efp-opbL!_nh;cd+zJJcJNE5e`0|D$0n*yCGf4fSFoL`;kDQZ z6*LUnZ+)?K_UBu#wx-yqt8aKt;8u(l8vsScwCYvYuv?#PnFDOtGb+C2*b%)sXbzdf zpKVRy=j%OygqPsf3SkFj)Hl8)zzD3Ttt6l%7(6=<-)O}6QMEwaF*FqUM>KSq`@l_3D+iCd8(% z8U?P^DKpFNd{hS2imc}pJ3FRW?Fd;m5J+c?ajQ-b-BmVrHqM{|&kw`oQoC(FiS z>QbWw7*ClCfPr}$wr@TJko^e$J&b>k;NKb8wRzTjlsG`YS$1+KMXM&e&}r=% zbhe|VNal}sFeB9?AH>!4gBVo?sMH-ROtNWo70!>E_nSF@_8_Wp&_htua$KJo-#0KI zjN7Q`LEYCP93;?3FmAfex>W^wHZ0%N19%!p z;Q(q*U{|L#7v83^Vz{Do74CpHPriUREk;0m)|`6X*|6+Y{N*+l7bDEy+!L`Vt6+Q7 z0n}V=L!&a{5vdeux5Mwf_C->J;)>g9BaN+AIpBWl9@DQHDZA%bPii(D?nh#{A7JBk z%QsxTURtR;m0NMQJUM0A`Ecgb9$u8Ni%pDYrP-t*jXW2(s5{*(ij8hI>Wd!wMvOMn zbPWU~>jwAipNHcbmjfV27I$7Ow+sMBPH6|v#Ul^_YfKRRR8d2C8!WsT2UYj^NV?p^ zl5=o9z{a@9OSc2ZkI#pYkBA+|R)Tun@Jnz~Dt?W}qoeet1pPJQdfUjoVz^Eo5trfR zeJ5|Dm0TwCqKPnw9Gqo01D^si{0Ujq>l)D;9yv)raBZz@TlMm^wqaToQ(HBBkNakL zc^%}L=N->qb&VT8eoZSc-Mn_KtgY+yz$j!wM;T2e?7mKn2$LCLBSxcX>YnArSU2C{ zBhRv9+ee^q%I)V5yV(zg0Dk~c|6VU5sh6W5{_QqPD(|(pLTSMO)Ayug&{r)C?p+K{ zx&1+|VF}&?P`7HCOZOjo3626RYBS3|p2kpA^C{`Ku{@P zt6E@Dk?1;|D?JWk*iCoh?||srkkxl(jK%&kN9fB_(3H2Gyl2qD$#-0!^oeG(Zefws z2|9#cKv=H6IG9(hb(9G(Q*fm7s73cPeC-s&>V^fN>lHr$;J3&}(!yzRF_Y24|DLrM zHEnXPSUf*lEY8i&&t06Kn~c6b7x;_fYkszvFV1PR^NVvA7l|aaWQF^aI}J~0?|V`X zYex`khKN7WSt3e7q~f(>sL)Hx0RGxU3Ob4X6QIv5MJB70UtkClPf zM+C2t6uY_E6rOagkU~}@)3DzxyRip$7#r-KG#~Nb9jekMPAZ%DMQN?9*cl-^BSSi? z{wu0LgRK7P9vU*gY<`8NJc^C(k2vo>((O*^YdKm;b#zM09b66(Bb11_9GC@GWIMT> z%#JRnxG;BacK*>~(%BRj7U#|_&dwL;QwJxr1G`BlqeFVq$#kxwjE_5+N)K^|(ZyOR z1)Vgg2cedq^QNo7I;jd9bFVo5{V zj=R@;a2Lnj!x4A=;_f@ZoxKGlQLMh=ICVp}DG>0q>su6L*Rl7AxSOWzCiX8v3ci;* zt;xDM3gw*|?Q~+lrHWmSOti(yahcp7jiLxoD;LYOD^fmF)9apbMr@7h_LgsA6C`7x zOnmm;z$l;T80U8wK@x_)0%6MNeml9cG7iCC?IC#y!LOyDlMws_H1rmyk3sOQkF1!v z{AjEB6X{q~5=>nK0{I;w5EV>}MiwP;GaPD5b--2hM=3;4VMEwMmOXYCCaU_ryJi$W zYB6*G_Ake}uc&(Bqx?aNQDQBmMtP91q8ef1x1vz}jz)l!y^p>3+M67M@4fbxYJ&6e zFa7dyf^Vg6L$PX>?L^Uu*WvORj(*80wh7;)0@WPn@_+l~@*qZ9P>rztXK=(KrPUUckCL{q}(8o!pA$^Bt1Dz3!9GE^qg^>QIX>zPfna**tpI=-)a{8yy$tR<6^C z9C0mj!5IfjK36POxfAxwg$@q*=(dpvMMbb)yMKS=eGex_t;ElDcp8*xmRKK4K__)I z4IO1Uea!WKGo4?{eWtU-9RwW;lOtzx?elwE1NGiu&yCV;;cG2)vsd1nja3>zBrq7YMiurzM#pSExtaOT{wSk{=%cPd^bz15M~Q= z^Mwlwh1m-iIxH^7Vr(Q`=~p1mFpwRMm`#ZMtrQ|Bcz!7bofPUE=)b_}V@~vwcO@d} zU>4thD{A2EZd$?EezOl*oL90?YeB7D*W2|hhufR5eI59{9-PJ3f#hI>mijgQujZ^~ z9vdyIhO&HG_f?z#cV)1+lNj(cvFWSh_6jZn*{hyJ1+UF1;}D?zU9n7_eRN@N{@nTV zliDQzbN=GR-nYwHy+0v560=Fw5)qRuJ4sQ%rm?a z0WaL8!Kx26;)kQ{b5mkQntcAbXP1_z&My?^=V#B&FI?0v6dt`e2Yg;QDD&88AmLUN!BrHWW#RWK$}Z8lvCFF;4veu(QOh?hRV@W>!Ar56s)A6leYK_ zH1<=RKIU#-k9@#~DR*hmpZoB+QHo$61#Y0Ttv+=8DWzlOZ?eMQgvKm9OL0=le21^? zp5aap9^#(idc;G&p5d2rHC(vlhd-VCLfi*%!gdd!?d$2Mb7M*PJcyBn@VT#3?@Ij~ zL0S(%NCZ8Qf=(i+1c9C8^f3fY_8zlTWg5~*oon+n;8Sbo`e0Cx80=T0b2-;qHQ{_+ zs{x<;g3)l+@#4-&*pC0HKc<6(5hj0@e6nQA#MpAv(X*6^fKFczytAx^?OEFg3 zYrmR;PAaVe`lmU4Olc3N7@*WzDq5wsDh>41+DacR8WD^As%|*xWNxqpL6r=e!0nZv>Vkb+kqhBuDgLtMOu*}yVGyq zocXid$`-EUi@O;779M`;fP=b7scRm;Plw0LA~w_l+p|_}oIz4u{@9R$!&nqa<+}Ea zv6;c!L_7~y5vVw<#PN-MoK8<`{EX@Q&Bd9Sjg5^$Q@pXk?sUO%SH;Wgi-mJDw1q-w z#ijolT$tDCK{f7@*z^F}^c(f<*JMw09$ONMe+{L|iL#S0l(x7H{A~&wARzuA1)bF2 zEzti3r;h>gyZ4+5A~#@vu&gT$u@AauDDK~c;*bNN;|uRgyI|YWCGARE(bUV$`M-LY zDI3D50@rG-{WnpXXV?A{{~ryzyT6h4-H7bFJNk9eq5x_i&4Ibz1WroF_LCq|tkA+&{zZGJd-kmy4@G z#mGdB;&nEE7K(#YPct@~xTnT_UChJL1vj|03PK6oVB10>1ZLm7Ndz=0&6+49UR280zKbxTV&D%%50p}+hI3~G0SHIhn<3cJM4k~*jd+{0 z!80+~$eIEyV|iT(?^n@E+tzO0eD<Ys)T2uHpr^wM z;E_}VOyc)R(t%hGJe)#62^3#Wp*jjl9#26hQM>{AALH~f6#x1?q85qNdxl?y#+S$v zPOZJzhpM(BRrQO;w{yVGrkYOM=2rg|;4roaNu-*ZB&V=JOi4v(hr-_jg^-kX2K9JkiVB(BPC+N} z@Hx=G&FN!!cqhWcy{U#QEA~4ACF=K47c%@^Aw#vFHWo8Y3G>lN$ErIX{Qq$ZjnUp( z*h`juCcU-eaZ?}mt{7vVPTxmAh@xx!;W*S&lZSfXOiJ){S2!x>xm5oug;WVIkyJ+_ zI7e=gsj`T&yR(zX`UTJnWOb(xSK2!hu_2Lxr^WW=dG?{-2ves~zL;zQF=|>)5KP!U2U|6Mm34aD|9lyqXr&6K}mGl+e4f1)V#g5?+-M5h> zDfaQ|J~mFNIuU@CHYr|ep=5$4t7Zua6K`9DakyU=rODiCeB=9 zhj44xaglP#SU2jetNU5T)a%jDL3Y&Gv>+?&yat{m8f1f2V?F6?1MMG6hU+?R$wa2Sy5U03#A?NFvBOT_ zV<8r6WstYhVy6>d5>2d~9U2&56QW(k!{E*3r}7Kvzx_j^GCM+J@E|A?BEp+=Wab*L zxXpZArWw zqLLLIU6XAyjW$3%xx0_2^^Pre_9?-t(e!3oEK4=0MXFK479OOGykN+GW;FAU6wgB} z6K<`N=!QyEHxI~eeB=@E3YOv5csF!5fG$Q6gaHCo-)vnSVW;WbwiID2+PE!=#A|P` z6Pz2%#!dw#X@td*jH)o?G33yVegb$$ye+)J+ANtk53bXha0>}*9UE4C$ZP1p6Tf%r zq2_V^Tl_2`5fp|$0`uHg|1A)@X=bff@t$r$!O?Sy`)!>{+B1ty~7R|_Bz-(jI3uAz>+IL z7COI$baiY*_y&Lxc4gUB3zqJeeBGrKX_R#LDEfw-_{cyEX;mrB?yK-#ZKWa=FN)Dx zE&4(G%ap|z<-=4c{$4u(z^)D8e>^ry#XNs5i1>#k&wL1f(r0tbW8-l}@|MOcxE#z` zLF=M~z$WPg%kdI2EnW(BHddT^WE;HjzC>X}J=)gdsO*(jI@Z=c{HE)Zqs}JV3cnyN s99%&}Hi5iYKoB;)J$M<>V1)R#;<2chtB0>bFabdittFZpgO$Sn13_-jDF6Tf literal 0 HcmV?d00001 diff --git a/docs/_build/doctrees/tutorial/csv.doctree b/docs/_build/doctrees/tutorial/csv.doctree new file mode 100644 index 0000000000000000000000000000000000000000..094551b4fcd4a01348295313d08fede10b323080 GIT binary patch literal 10505 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 HwA21CX;~#X literal 0 HcmV?d00001 diff --git a/docs/_build/doctrees/tutorial/dBase.doctree b/docs/_build/doctrees/tutorial/dBase.doctree new file mode 100644 index 0000000000000000000000000000000000000000..0c5ba5dee2547ea205c85f6db272c4c1c6488496 GIT binary patch literal 10669 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 literal 0 HcmV?d00001 diff --git a/docs/_build/doctrees/tutorial/geolite.doctree b/docs/_build/doctrees/tutorial/geolite.doctree new file mode 100644 index 0000000000000000000000000000000000000000..c4d3e694e62fa5c0b2da16e9569984086e3acf09 GIT binary patch literal 19279 zcmeHP&2Jn>cGnk4u_aNmymA14#1+{Nr3q(-6eWw2*ABE2B@2=$S)v@}!x;5U*GxCn z)7|b5es~#UbJ&F(bh1D)yNlcc1ldKfm)!CP1jsG7AUOoNeZ`Puikt0-mCh-k)PbSbAW%+Da&sqvExQH&$ndMOOH}PS9)>pFMH?z zr1!_YbLnJgu0?(lwq!3ofEq2^ajj5#z0Z2~fpj90t=REBUEdzF$L)#Fdgt(QEOug7 zmOiDGyS`~TUPs(B*Y7!=C2mRIbz&)Qn6W9=oY)pY$3-0(_6Q1q99fp@gwCGY{;t&?A3be|AoN!qOsp_PJCssbpmHQ*(e^`wI`dm5P2P-Hvz?YLoJf40&};;L zkho@86OSXBEQPMv@DtH8Jz@E49?g=7ZE1i)AX_X}F+u_`v8z3nzPlUJWZZQooyf`9D>!Bx6E_d0u-^hF*l&Xge+&QL!T&N896>Xd zOW;H!lktVjKB)@QW6QK|{caZvR4taiGEHDx0%EI-$o5Nz5Fx?%G^@@C89-!4_xtC| zekKn{R`qKH7C)Yp5IerGWE;{Oasslg0(nPxR#>w5fecx!MFze`eix!c#wKYw@iD~3 zbR@H%Eyznwu}EOU%ca^wF+p`JX@dt36P&z$X1FO|7R)Ee7zs_c(S&Y%R-*Bfo5q0y^@<@XLYXkE%1rSGw;u?l%t(8gjz_Gd zRbEZdN@^#rD_BjE{%lGDWcgrVws{g(v&4N0Qrl0U7|odKEY1DKTGtFB3S)V^>604Mm@s3%h28^U!ucAqAXZ5Rc-6v=MD^A?B& zo#=D77Mp>eNW12Toq7x|t+#!jI^hKdv!eBk#}C@n&}rQ;?%uz4LtJ}!{o~u8E*e6J zn-A~b`#Q%e#O<`IxD!gC45O*;1Q$btdjHIf?R*BeY=DV_Fxs+yP1$K#CqkT455N)M z9E-6fn@M(L2#xM^O-$x9xsl_=-&l>uwiSKVSBh_viXvXPZyVvCq7d?ZDuqEyI#fRd;0KB#%T?-aQK-*N)bvFcdd#)eB25fGK>9f;Y z*Oyo;K~~4|6A0Go=ZPN=&Ug+S3Ll$hEX54w%rvd9YfCpWU9jgR_B||!XVFVsU=Xrl zd^=c5y4X~ER{q4xZad2E#8Lf{F{>9DP zOV{q+{e3ZP3uNMcK)4I2PqkjNPdUXpuoKSZlsr$;`-9v@-?u3DEy{h1vfmEfw6p4Iw6MwGpAG}&Q*BJP?<3**u_-NlM_Fbi~!<& z6(?A|m_b1_QUXlY0ed9_e+}_9S3ISih{18P2+lj~)$OFo!On-aZ#hYK88JzA=~3|W zLFVXt^vPYZSh(*z1S?HT#SqV=-`Q$dB}etv-$A8c^m*pLuLBs9nkL#ApA)Ho%Fg(| zA2m(N8UG7*#=o-*@)pq3T~!}3go%8r)BwhK=86s&{eRp&`iEwWqH#)ZBRU^r_E23P z2Co!tx#NG`ea9yUxU7Jb4t*Md(s;(53a2B)s|6@V>c4i6)Z09n+jDsVIo+}95YiVk zA6ECYT1sQP7#0}t*#39a*iBz)!g!2<_qT`k(n90AYP)^F}0D70)%cd9u!8M_NWJw-DWfGWbEO$r(zfx?S2 zPaL`D^MKQkWaV55M3oSTqF@b0m8=bIe5XHQA1F`mq#ClXgH-$naT5-V4&+z)HlSB99OfS7La zaWsy{Dg`GgJSTNg0hw{VzgJu*HFFk_(o*4Q+>DCmXocEQRZ_rX%$j?}?5&Y&q=268 zP;sjf6k6?*m%i8(A;x$W7kDxik{zg^v|rvB>hESL1ML4H1(b$VTv{l}+b>PfWFyyl zG#^8uNOi%GCjB9irO>1b$usF+d<#XF);-@!?6zR{-PsMDLKhYd(qm9aRh9fxOeGaV z%4OMHrb=X_DVzkDJWW++V~t1)JEgK;2p}mBwS0y@Xu7Zb66}I;{vG|nROTn7-B^1fjS7i4(lexmR2hp@ElL2X zZMGcb0g-wnh1d-JHO|lRJxUnPbHZRaZ4d&S0rjg!p^#GP+BZZ6Y~fb^K~K+KjJTjQ zv6#@GD)axzFOM8J@NQwJ=BZG~elabhR;wW%drLf`U}!lfc?MJ75zz*=^<6Ug5PY{b zYP$Xd6G_QP$I5v>Pe7(zWN~)8q-;u$s+W5|tHIrrG18U+Z~ALX%9_@l!E3>`BDyOj zPpb^E>3SVD+$y-VzG{ZZwsH|dkLqie>sP#m)rDZ~(#3eL<8|8Y_N==y_x|j~S^RXo z`f`ze-j^E!Lm@G**OiODX~?MEMPPQ@&1;N zWxxP&C3-2eP~m00!J)n{UY?y_xXf6T9{Ih5#pT-Ni}Oqi1tgDAqvG6^+4;Fkm#9hU zks*iz#N7L}`FYSn&!BqPaVAR@1|}6;o#k|7oe={1sr*=AF+W#(pC(mxuK$)g+3_*M zV%bOTTF%FU_?5c8Fn@Xe(!~n{j~P-Li@EMXZT`w^lxx0yvBkNh`(jHo%P_AYNXa_F5iq17hKS)f zNY_KIB|FLn{h6pmCV6G9c13jI%7QPf!hX8QpfhB7Hgo3P6lBH0Xk$;j;1slqK(er1 zv_jSv8w2VrDY~jG2^93xJES(FMf95R2krArc zMH;^{8cU}@7G89aC5!#VVSxPqGGKC-oMR{Y2&wjE$4b;Kkl?BRj~%97Im)O{c9bER z8&SOxvr}}C?p$~DXpWa>S`Ega$V)c+MOQqQ|K96Zj+MBlfR*+YkH&CPGo3}9L;3zU zh(w9+zELzVNgrZTckdcgES#36x6Hy%9zYsWJoY0INf(Ev>6};o!$CxTR$DVsv8`#r*R#=AW z$zWI+cAMhDg?XF-*9Vn0#p6d{Fnu~{(ZwF{Rn8OAbpg;&Ka_Rg0@S8w8acuT!m<>vbVZ$iK}lqT8i`Zd7xt}zc_r)CBTUBv7fn`AI78*E*%}^ zPO5aKv#LV2rDOW46|76Xr$Mc*EDGCy`^6A4hco%Wj&R%zv3=s+n+9M%!>f_MCZUVB6S3cF(2W`N72S;iuW+N6p2lg>7zZn5 z>EoS)=?S`C#7nx3bxMQ4#Rch9go`?Y2KjT*Gy=#svJwb7E@==Q8|vN;^q4ouFY;JQ zk0a|0&dY`?SEbv#b0{@z)77tI=_@$K2U@}ZpG2zCSUP6OX3{}-Q)^~OCwx%@zUD4U zCdscTX;8iA=@iG$8#tzfj5M#)ODB`KU0tX~4xZoa|JY#9X~Raofr|@IFmV`LEAFKy z{Uk=5q6B4(q4d(X2EGh{Sot$7opdULTi`JEc=={^0sZ%X7-*cHqA^4ulnoNOoFRAu zNAo&~*^!{Qg^a;NxcDV~HB9fS$;!HQ4h`*S|~!GHB>aGzgdD zR6@tC8^qfwpIxTJC%TCx*obZ4%aT9n!WS7t^%KsQuUbn~XluZn#iR~k4nZgV%3JAy7I;j+gPuwuJ+=VUQYfGcw$Pz%m zN?&7aV5muiReTQ|M>Mj)$j5N+kAB6%I~8rfq+4&;I3mu+#BmP_r8V@@;}MP<#|=JW z7op{={GPowNGs#w7m(|%mW`WiT1bG&Ruv|U#7_f_pCv)>E5410Zw$&;`&Zx**co0M zGp&~YX%Yxg((JEyN_Lyl!iwBLSGJTfpq;@vLGxJyr?4Hjk=vcX<9Ujd!d0Mi5*M)0 zIcO3k$cBx3&y!|)G?NWjjNmJnxP0YIBfG7IF9CW5eS=SMWe-scmr&4sLFwtfQVN%F zF`%{e3th-Uw+f;91Qlk_=TW~`jyhJ2G#u| z{7TYEfy4<~dFKcXk< zf%is9dZNrbjQj~$V7y9*OS2MM->P0lrE*DD4=V^9)NT5%W=F32oqrvPg&UQyXfa6<1X~7B3z@#+W4f3*!mwzolZyya$H+eZ EKQ)Xd`~Uy| literal 0 HcmV?d00001 diff --git a/docs/_build/doctrees/tutorial/mysql.doctree b/docs/_build/doctrees/tutorial/mysql.doctree new file mode 100644 index 0000000000000000000000000000000000000000..65b4322ac662fa7186b681f312539bc8e0ffd40c GIT binary patch literal 28429 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 Q4f;qE7+> z9`<8rmrw#Zuwv3~84ff)7)TCwl6!yvKIGsWlT&~M0g@mI5E#fI2#}MVtMmPTbv=4^ zIXk;tQWQc$nw{yc`m5@%|NZ|}9~}6>#dr7czhd5tJ9!p_X(Ng~k&cQ(^q?=IZ1nNy z>^DchH#$?yCGIed^Q0q2#U8Zi_(A9;A{xCn^7j<8spw=u9O?G{jDOIdeQ$IIFK4nK z3x)NnIPrGxt=RQM;(R?1IxEiQ%uTWpwMX*C;COLx;9?5sdCcGI z?=KFP6I?0|gh3=mOL^NZYHpS#K|9Z|Fj~m|z)LadVzv{yX^MyVJ`=fp`R$OG56q9Y z+gV9Om)hjTZ07dp)ySXsPx^;xME{B6OUO3Q2{DJJ~nrG0rDi=D#?++N}id>cQFi;rNIsc`6zba|^|GyBSnAv7)+M(USip;mv;v$nu}Yj{GYA{~Z4RJpMloMEGa@FZfUR z=dgwY3K3XKO%jUP_@nAUvH!Kp@2WZScQf$Ifbg5s4@{VUQ8woZ%wph0J~sU5F^GUG*BK9se`5Ug9rdTr@ii+UOauu z?r!yKG$9tUCXr0D?`9BcQLlc!vH5zfeuFs8dWlG1Xf`#+e}(CZB*aS!R7pvXaJri~ z)%*kvbJBlrlB_D`*81TK>A)qebqLH4QN1cyg#9kW*I~sHB+hI}a%~Yz02!S5Zsv$J zmnCuL3uoxZ5E&%lNq|5Wdr7b=A}MaDK_~9_-N=0L{#9VGj-oN3{a`1y$OaCG^z2T(z)A2ZNX%(^SJOCzX)p&EI6RN< z?tC8pcgiW6acT9;S!!5XJv|s3^-rcBwPrD?mYjwCbQ}+2D%0;cy0Il@%gy3@7a-o0 z^B|><+m7>$C6l}A1|i#AQml!Tr6CDEjc?kkn!C`~ni#8MwXDFoswvp55WR4BmGR0*Lxag#*lfPfurmJQxgMd*mwEDSla*MdX{B3o9FuSN_ zE$N@-XTg$_RFJ>ohvXiR`+v&f>+uLc@wZnXGd(x;oijJ;H_kd8AA#Bq8JQ5At|Nsl zMF0?h^~fUa3&`DbRVjOp#B423b2lVmdo>Eyw9iiNcG_?*W^m?emNv}RnUC=^(eb0;W{z-!ao%~PK`>C!OtOJ%W<{3RwVwhXZ;VMu z-x#a=fd{4Z_SOvu#{1G1crRTthR@pn%(N&q0~OQv*=!}hP;$FCHoi@2S@YHHGeh$l z-6_@x^Tw?4ThnYm2PEzz0hmP;e=yB_?k_pQ%G*F=#%@yv+h)0jbLgpzB3la=ul4fi z7Svn4Q*vdacguO-*hN+hyU}Pkb-YQXVv%iF>a8^R)Y}ObFIkimEZ)_-~?+p(gbK~J@DHveAx3xLyl&0^LqO^r<&Sk}iwV^LS8S(%`;&8Ii7?*_@w zvH=WbmTQg79mKit8*$P@a;raRPO^a+qBW;!O}3KjAMG7wIXC1RH*<|1qP^1+n5`OO zziBPzFIzmk!D9Z!YR%z{naylgw|M?$5Duy2SnUpqjcgh?<2QGg&T|bl_T2>iB2iC!Fm$({Hzwm zSiF>l!UP=TSKh%~>wQ7+9vM2`z( z5VqnfmxbcrAKdcUWPGp)uoTX}KDdQG@O>up^rvI$&2oXJj@K{$%@$mx{2>|)+Hj$G zd?RIPKHco)CKENb;v_rzC5wkEhSUGN(gO#|B=XxPnq3C3!Jv_>@gfhE3`5Q*mwe0o zW5tPUQUY-14b?ST5Wuj?As=+qyaX;QakwxC5&#BQ-(81X;K+K7iZdF{n=hKwaTX^>fFF~ zb>Iua7m<9kAuL)uV=A#Io~&$-47DMP<`qYo%Xee1IP_e;Y6m?iL#v;RNXxeyUsBMT zW77^2!8rxB5Xb5SDGY)QFl4(4%~W`s2HUb3V#1p=tDSvOS*wpQw_zW2+Tbpj(>jQ4 z#eMsxw-vu?(eDOZ@f&24p@NAFG@}hFUi&bBSvHK56~`sLME*Ox@B}4#tB8rB29_ww ziMw3G#64M2sCdME96{q``8e=_WgeqHQ%5jVTIsTdpuBB_LUFpRFOz{DWHReI^inTF zFLiSHtmu#GBBM1_zNotZy)s%;c9{?oqCm=okWlk7ho(vQQ?$gYvyEg_#EMyyQLnaQ z+x-lJzaSBOc3TLh^y#nZ9vmY2or>=fJ4z9DqREmXbxfig zpk&+W3NCeH)u1Bs6dPmu1-E1-0d5R@Aoxcdd199b4NKhiB*yM5TWhmH-D8MIowk*FF$f6?k(-s{U7N?0VqgaCK zFg;Xfb}}c;2SiC+)kKD7P3^R-#dJ^`1;ZBGtKdkYAcnH(0!bZEAqWnY7_vg0%~n)_ zt_DdQ(YcI8wr%_5=4uNUNe#*zovTnNp1ItL!?;04+rVK=6~UB_uCe#ErR~QkJx(URI1nr7tUH|2$5R;aP`Kg>f2>XpOmhg=aaYzx0 zlFtVv;h0s+j2<9NiVKkk%h@h&2ch$ayFqv?t?r5R%rc5^?Z%9tAnt8Go9u>B_LDsI z_o@QQcmQXB@=l(F&dvkBlq0)dd*3m+GcvJv@Q;9KO}W$Py%m9WoLvmu8()XOZnqRh zVqJB!&@f$RXy)TIJsyOH`wG*h~zTa`~eqM6KyP}T&!Ei{3h!R}ZxYlGMKr%Pm0 zzykj5%MQDDnY%(J7G(@%7FKE^GKk3dZRcGa5ujgfkqrfmVCo#pbQ*p zQM3`hflW}@d-38SV8%7e{838rQ!!U#2@kPHKz&Ysw(W_A)}~cF(Wb^(o!n5unRH6s zh&|A{@%WG*fyZY`ZcSG{Jy>xTNo`RCR~0ywT_<>^!~ zR9ktMw+4CNm&p6xwvb0&=67`u_A+nUZbb3RDWg9229Lyruy*dB3y~I zgE9r2WyoMm(`kvc=80|);m8=J)MQ~f@k9`LVht8I@c|qR5%eNwMXVzm2EPEPO17f; zTQ0y4A6i5hL03G)lLVptu_iR>;acYWoZd}E@3ZChn$@uw|8u~Y#-OLMK*$Tlb*9k! zL>^{x_j#O6us5CgomvbId}#B#cuhv%y*5>jKn(|Kr&8oHoseQ8w$=Aq#S{uC`-Bd zgjC4d{H0#~^1l$5oLv4V`ZKi>Bsu<%x(Cbg_bYPz&TmoiSebEgwWy}>9i=j3xQBR8 zHU&>sS{5XfEy2q|nyMiTv2b7o^%7EZA(Ran&QTp?FIC-vPIFQ{gsC;V{jki)V&aEq zPT0@?)cd)efZ*?2lu%*#OPb+vst`vQ%_jEOWhp6wg2~GqlObf}CL6}$mQ8TaIRRO)> zaM(b~Q;0@4Y2v@WfGLmDq|FF937jl-GgQ%}O(cy_;u+!q2puq`yZ{$_HUX)Lqak$l z&`qlTY*2Z8)d;a_-XF4AX)a`0b`Co*tt`WNdX4uDv4=mR0wS63qvXn6NxqjO$;Q00 z0tbuY5^Mmg^FEZVYYP%kJ-YZ~5m}-VsG#heiz*|qGUbSf2T?Xij@6Bd9xo3@o65mk z<xl?AVL@1;{~VYdDNS7XgCB?GFfG7d!OvRx6Nwl6I+Dem7Tpg=Z!z2q z=9R3EisO*185I#&FE8yaj?hIFQQmK@LC5w-c!INLNib+pSO{HHfP6wefk5XcElM@C z)Gc)wvFuP@Tenm^mIz8Ww?eTh!qKIDMa_3Z{d1;x90irYRR(Q=6SK0>Ofln$cHYBq z^Fud@fGf11yfL24Az9oJw5ZYTVxG^5x1erfItMf==JKptf3BVe`2J+|WlJPUoV0vc zCZR}xXPRm!8x==!_Xkd!TTo^g%BXm1?9CX6<&VIs#k_=T<}h>h%7yxK7{B^rtaEXU z){p{GK2Q|$?N3Kgm)6U1DF`s`;Wns!xVo_T3>97^Udt1R$9Whg0C6l82T|YA#WI1B zz-u8&*$vi4{=s72#dUry^QhPtfT)gmd4JH-ga^d(15{Rt1Z5@!@F+h4cB7QG-#i+m zBKP7JZmB}6V<-nez^-NYWGd-otyL7zNfJHUf|*BgK`f-4<*Z@||6K7H7DK^3KAr@i zN6Ka`k_3F&;ru`h%;h^Ym&fP{-6qf?+Adg7(A8#Sh78tWdPIDhgs(RggS0s+7N`e7 zq#i9gWdT1Q2+cFzXY_*C*982F!aO>^CX3VX_zdIarI;%vMvwfXZ;XE&=nJ4 z0S}koTsl-d1%m3gG;is*JB}o`-vN!p9lDasu>Wxq2x;D~wmT;JZGrO1Y#l@SLS%rp(1BO5(t*^l|i63x>CZ5mIL;3y8at|E4?9s;w6woX`P9Go9$9L%C zb8t$R9s0OUA0N`k-_yt6(Z?)xJ3t>T`nZmdyqF{CWIyr6oeY18VJ|VT+*yP9S zKhg;xT?v7}iF`sLLba2Kwx7s$xN#Ij*l)+7rf6<@V(g)AJy(G^r$*&Y$1Cuq&IOe( wjKeD5;F1>zFx_k(_m6__afl{`Y?J`CoT@xNtRFK`At?dTSxOnw=y|*Ge{-oI{{R30 literal 0 HcmV?d00001 diff --git a/docs/_build/doctrees/tutorial/sqlite.doctree b/docs/_build/doctrees/tutorial/sqlite.doctree new file mode 100644 index 0000000000000000000000000000000000000000..258a0e180236cb96e5197de57122f85f83821721 GIT binary patch literal 21186 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 literal 0 HcmV?d00001 diff --git a/docs/_build/doctrees/tutorial/tutorial.doctree b/docs/_build/doctrees/tutorial/tutorial.doctree new file mode 100644 index 0000000000000000000000000000000000000000..40878d476b996795db25090e61d93905d9c2248c GIT binary patch literal 119280 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 literal 0 HcmV?d00001 diff --git a/docs/_build/html/.buildinfo b/docs/_build/html/.buildinfo new file mode 100644 index 0000000..6cd40d1 --- /dev/null +++ b/docs/_build/html/.buildinfo @@ -0,0 +1,4 @@ +# 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: 59392f424cbb8621f1b34cf4df7fbec1 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/_build/html/.nojekyll b/docs/_build/html/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/docs/_build/html/_sources/bugreport.rst.txt b/docs/_build/html/_sources/bugreport.rst.txt new file mode 100644 index 0000000..84726b5 --- /dev/null +++ b/docs/_build/html/_sources/bugreport.rst.txt @@ -0,0 +1,49 @@ +Reporting Bugs +============== + +pgloader is a software and as such contains bugs. Most bugs are easy to +solve and taken care of in a short delay. For this to be possible though, +bug reports need to follow those recommandations: + + - include pgloader version, + - include problematic input and output, + - include a description of the output you expected, + - explain the difference between the ouput you have and the one you expected, + - include a self-reproducing test-case + +Test Cases to Reproduce Bugs +---------------------------- + +Use the *inline* source type to help reproduce a bug, as in the pgloader tests:: + + LOAD CSV + FROM INLINE + INTO postgresql://dim@localhost/pgloader?public."HS" + + WITH truncate, + fields terminated by '\t', + fields not enclosed, + fields escaped by backslash-quote, + quote identifiers + + SET work_mem to '128MB', + standard_conforming_strings to 'on', + application_name to 'my app name' + + BEFORE LOAD DO + $$ create extension if not exists hstore; $$, + $$ drop table if exists "HS"; $$, + $$ CREATE TABLE "HS" + ( + id serial primary key, + kv hstore + ) + $$; + + + 1 email=>foo@example.com,a=>b + 2 test=>value + 3 a=>b,c=>"quoted hstore value",d=>other + 4 baddata + + diff --git a/docs/_build/html/_sources/index.rst.txt b/docs/_build/html/_sources/index.rst.txt new file mode 100644 index 0000000..d69915e --- /dev/null +++ b/docs/_build/html/_sources/index.rst.txt @@ -0,0 +1,33 @@ +.. pgloader documentation master file, created by + sphinx-quickstart on Tue Dec 5 19:23:32 2017. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to pgloader's documentation! +==================================== + +.. toctree:: + :maxdepth: 2 + :caption: Table Of Contents: + + intro + tutorial/tutorial + pgloader + ref/csv + ref/fixed + ref/copy + ref/dbf + ref/ixf + ref/archive + ref/mysql + ref/sqlite + ref/mssql + ref/transforms + bugreport + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/docs/_build/html/_sources/intro.rst.txt b/docs/_build/html/_sources/intro.rst.txt new file mode 100644 index 0000000..0dc75e2 --- /dev/null +++ b/docs/_build/html/_sources/intro.rst.txt @@ -0,0 +1,63 @@ +Introduction +============ + +pgloader loads data from various sources into PostgreSQL. It can +transform the data it reads on the fly and submit raw SQL before and +after the loading. It uses the `COPY` PostgreSQL protocol to stream +the data into the server, and manages errors by filling a pair of +*reject.dat* and *reject.log* files. + +pgloader knows how to read data from different kind of sources: + + * Files + * CSV + * Fixed Format + * DBF + * Databases + * SQLite + * MySQL + * MS SQL Server + +The level of automation provided by pgloader depends on the data source +type. In the case of CSV and Fixed Format files, a full description of the +expected input properties must be given to pgloader. In the case of a +database, pgloader connects to the live service and knows how to fetch the +metadata it needs directly from it. + +Continuous Migration +-------------------- + +pgloader is meant to migrate a whole database in a single command line and +without any manual intervention. The goal is to be able to setup a +*Continuous Integration* environment as described in the `Project +Methodology `_ document of the `MySQL to +PostgreSQL `_ webpage. + + 1. Setup your target PostgreSQL Architecture + 2. Fork a Continuous Integration environment that uses PostgreSQL + 3. Migrate the data over and over again every night, from production + 4. As soon as the CI is all green using PostgreSQL, schedule the D-Day + 5. Migrate without suprise and enjoy! + +In order to be able to follow this great methodology, you need tooling to +implement the third step in a fully automated way. That's pgloader. + +Commands +-------- + +pgloader implements its own *Command Language*, a DSL that allows to specify +every aspect of the data load and migration to implement. Some of the +features provided in the language are only available for a specific source +type. + +Command Line +------------ + +The pgloader command line accepts those two variants:: + + pgloader [] []... + pgloader [] SOURCE TARGET + +Either you have a *command-file* containing migration specifications in the +pgloader *Command Language*, or you can give a *Source* for the data and a +PostgreSQL database connection *Target* where to load the data into. diff --git a/docs/_build/html/_sources/pgloader-usage-examples.rst.txt b/docs/_build/html/_sources/pgloader-usage-examples.rst.txt new file mode 100644 index 0000000..72223b9 --- /dev/null +++ b/docs/_build/html/_sources/pgloader-usage-examples.rst.txt @@ -0,0 +1,163 @@ +Pgloader Usage Examples +======================= + +Currently not included, because redundant with the tutorial. + +Usage Examples +-------------- + +Review the command line options and pgloader's version:: + + pgloader --help + pgloader --version + +Loading from a complex command +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Use the command file as the pgloader command argument, pgloader will parse +that file and execute the commands found in it:: + + pgloader --verbose ./test/csv-districts.load + +CSV +^^^ + +Load data from a CSV file into a pre-existing table in your database, having +pgloader guess the CSV properties (separator, quote and escape character):: + + pgloader ./test/data/matching-1.csv pgsql:///pgloader?tablename=matching + +Load data from a CSV file into a pre-existing table in your database, with +expanded options:: + + pgloader --type csv \ + --field id --field field \ + --with truncate \ + --with "fields terminated by ','" \ + ./test/data/matching-1.csv \ + postgres:///pgloader?tablename=matching + +In that example the whole loading is driven from the command line, bypassing +the need for writing a command in the pgloader command syntax entirely. As +there's no command though, the extra inforamtion needed must be provided on +the command line using the `--type` and `--field` and `--with` switches. + +For documentation about the available syntaxes for the `--field` and +`--with` switches, please refer to the CSV section later in the man page. + +Note also that the PostgreSQL URI includes the target *tablename*. + +Reading from STDIN +^^^^^^^^^^^^^^^^^^ + +File based pgloader sources can be loaded from the standard input, as in the +following example:: + + pgloader --type csv \ + --field "usps,geoid,aland,awater,aland_sqmi,awater_sqmi,intptlat,intptlong" \ + --with "skip header = 1" \ + --with "fields terminated by '\t'" \ + - \ + postgresql:///pgloader?districts_longlat \ + < test/data/2013_Gaz_113CDs_national.txt + +The dash (`-`) character as a source is used to mean *standard input*, as +usual in Unix command lines. It's possible to stream compressed content to +pgloader with this technique, using the Unix pipe: + + gunzip -c source.gz | pgloader --type csv ... - pgsql:///target?foo + +Loading from CSV available through HTTP +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The same command as just above can also be run if the CSV file happens to be +found on a remote HTTP location:: + + pgloader --type csv \ + --field "usps,geoid,aland,awater,aland_sqmi,awater_sqmi,intptlat,intptlong" \ + --with "skip header = 1" \ + --with "fields terminated by '\t'" \ + http://pgsql.tapoueh.org/temp/2013_Gaz_113CDs_national.txt \ + postgresql:///pgloader?districts_longlat + +Some more options have to be used in that case, as the file contains a +one-line header (most commonly that's column names, could be a copyright +notice). Also, in that case, we specify all the fields right into a single +`--field` option argument. + +Again, the PostgreSQL target connection string must contain the *tablename* +option and you have to ensure that the target table exists and may fit the +data. Here's the SQL command used in that example in case you want to try it +yourself:: + + create table districts_longlat + ( + usps text, + geoid text, + aland bigint, + awater bigint, + aland_sqmi double precision, + awater_sqmi double precision, + intptlat double precision, + intptlong double precision + ); + +Also notice that the same command will work against an archived version of +the same data, e.g. +http://pgsql.tapoueh.org/temp/2013_Gaz_113CDs_national.txt.gz. + +Finally, it's important to note that pgloader first fetches the content from +the HTTP URL it to a local file, then expand the archive when it's +recognized to be one, and only then processes the locally expanded file. + +In some cases, either because pgloader has no direct support for your +archive format or maybe because expanding the archive is not feasible in +your environment, you might want to *stream* the content straight from its +remote location into PostgreSQL. Here's how to do that, using the old battle +tested Unix Pipes trick:: + + curl http://pgsql.tapoueh.org/temp/2013_Gaz_113CDs_national.txt.gz \ + | gunzip -c \ + | pgloader --type csv \ + --field "usps,geoid,aland,awater,aland_sqmi,awater_sqmi,intptlat,intptlong" + --with "skip header = 1" \ + --with "fields terminated by '\t'" \ + - \ + postgresql:///pgloader?districts_longlat + +Now the OS will take care of the streaming and buffering between the network +and the commands and pgloader will take care of streaming the data down to +PostgreSQL. + +Migrating from SQLite +^^^^^^^^^^^^^^^^^^^^^ + +The following command will open the SQLite database, discover its tables +definitions including indexes and foreign keys, migrate those definitions +while *casting* the data type specifications to their PostgreSQL equivalent +and then migrate the data over:: + + createdb newdb + pgloader ./test/sqlite/sqlite.db postgresql:///newdb + +Migrating from MySQL +^^^^^^^^^^^^^^^^^^^^ + +Just create a database where to host the MySQL data and definitions and have +pgloader do the migration for you in a single command line:: + + createdb pagila + pgloader mysql://user@localhost/sakila postgresql:///pagila + +Fetching an archived DBF file from a HTTP remote location +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +It's possible for pgloader to download a file from HTTP, unarchive it, and +only then open it to discover the schema then load the data:: + + createdb foo + pgloader --type dbf http://www.insee.fr/fr/methodes/nomenclatures/cog/telechargement/2013/dbf/historiq2013.zip postgresql:///foo + +Here it's not possible for pgloader to guess the kind of data source it's +being given, so it's necessary to use the `--type` command line switch. + diff --git a/docs/_build/html/_sources/pgloader.rst.txt b/docs/_build/html/_sources/pgloader.rst.txt new file mode 100644 index 0000000..fb51bdf --- /dev/null +++ b/docs/_build/html/_sources/pgloader.rst.txt @@ -0,0 +1,713 @@ +PgLoader Reference Manual +========================= + +pgloader loads data from various sources into PostgreSQL. It can +transform the data it reads on the fly and submit raw SQL before and +after the loading. It uses the `COPY` PostgreSQL protocol to stream +the data into the server, and manages errors by filling a pair of +*reject.dat* and *reject.log* files. + +pgloader operates either using commands which are read from files:: + + pgloader commands.load + +or by using arguments and options all provided on the command line:: + + pgloader SOURCE TARGET + +Arguments +--------- + +The pgloader arguments can be as many load files as needed, or a couple of +connection strings to a specific input file. + +Source Connection String +^^^^^^^^^^^^^^^^^^^^^^^^ + +The source connection string format is as follows:: + + format:///absolute/path/to/file.ext + format://./relative/path/to/file.ext + +Where format might be one of `csv`, `fixed`, `copy`, `dbf`, `db3` or `ixf`.:: + + db://user:pass@host:port/dbname + +Where db might be of `sqlite`, `mysql` or `mssql`. + +When using a file based source format, pgloader also support natively +fetching the file from an http location and decompressing an archive if +needed. In that case it's necessary to use the `--type` option to specify +the expected format of the file. See the examples below. + +Also note that some file formats require describing some implementation +details such as columns to be read and delimiters and quoting when loading +from csv. + +For more complex loading scenarios, you will need to write a full fledge +load command in the syntax described later in this document. + +Target Connection String +^^^^^^^^^^^^^^^^^^^^^^^^ + +The target connection string format is described in details later in this +document, see Section Connection String. + +Options +------- + +Inquiry Options +^^^^^^^^^^^^^^^ + +Use these options when you want to know more about how to use `pgloader`, as +those options will cause `pgloader` not to load any data. + + * `-h`, `--help` + + Show command usage summary and exit. + + * `-V`, `--version` + + Show pgloader version string and exit. + + * `-E`, `--list-encodings` + + List known encodings in this version of pgloader. + + * `-U`, `--upgrade-config` + + Parse given files in the command line as `pgloader.conf` files with the + `INI` syntax that was in use in pgloader versions 2.x, and output the + new command syntax for pgloader on standard output. + + +General Options +^^^^^^^^^^^^^^^ + +Those options are meant to tweak `pgloader` behavior when loading data. + + * `-v`, `--verbose` + + Be verbose. + + * `-q`, `--quiet` + + Be quiet. + + * `-d`, `--debug` + + Show debug level information messages. + + * `-D`, `--root-dir` + + Set the root working directory (default to "/tmp/pgloader"). + + * `-L`, `--logfile` + + Set the pgloader log file (default to "/tmp/pgloader.log"). + + * `--log-min-messages` + + Minimum level of verbosity needed for log message to make it to the + logfile. One of critical, log, error, warning, notice, info or debug. + + * `--client-min-messages` + + Minimum level of verbosity needed for log message to make it to the + console. One of critical, log, error, warning, notice, info or debug. + + * `-S`, `--summary` + + A filename where to copy the summary output. When relative, the filename + is expanded into `*root-dir*`. + + The format of the filename defaults to being *human readable*. It is + possible to have the output in machine friendly formats such as *CSV*, + *COPY* (PostgreSQL's own COPY format) or *JSON* by specifying a filename + with the extension resp. `.csv`, `.copy` or `.json`. + + * `-l `, `--load-lisp-file ` + + Specify a lisp to compile and load into the pgloader image before + reading the commands, allowing to define extra transformation function. + Those functions should be defined in the `pgloader.transforms` package. + This option can appear more than once in the command line. + + * `--dry-run` + + Allow testing a `.load` file without actually trying to load any data. + It's useful to debug it until it's ok, in particular to fix connection + strings. + + * `--on-error-stop` + + Alter pgloader behavior: rather than trying to be smart about error + handling and continue loading good data, separating away the bad one, + just stop as soon as PostgreSQL refuses anything sent to it. Useful to + debug data processing, transformation function and specific type + casting. + + * `--self-upgrade ` + + Specify a where to find pgloader sources so that one of the + very first things it does is dynamically loading-in (and compiling to + machine code) another version of itself, usually a newer one like a very + recent git checkout. + +Command Line Only Operations +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Those options are meant to be used when using `pgloader` from the command +line only, rather than using a command file and the rich command clauses and +parser. In simple cases, it can be much easier to use the *SOURCE* and +*TARGET* directly on the command line, then tweak the loading with those +options: + + * `--with "option"` + + Allows setting options from the command line. You can use that option as + many times as you want. The option arguments must follow the *WITH* + clause for the source type of the `SOURCE` specification, as described + later in this document. + + * `--set "guc_name='value'"` + + Allows setting PostgreSQL configuration from the command line. Note that + the option parsing is the same as when used from the *SET* command + clause, in particular you must enclose the guc value with single-quotes. + + * `--field "..."` + + Allows setting a source field definition. Fields are accumulated in the + order given on the command line. It's possible to either use a `--field` + option per field in the source file, or to separate field definitions by + a comma, as you would do in the *HAVING FIELDS* clause. + + * `--cast "..."` + + Allows setting a specific casting rule for loading the data. + + * `--type csv|fixed|db3|ixf|sqlite|mysql|mssql` + + Allows forcing the source type, in case when the *SOURCE* parsing isn't + satisfying. + + * `--encoding ` + + Set the encoding of the source file to load data from. + + * `--before ` + + Parse given filename for SQL queries and run them against the target + database before loading the data from the source. The queries are parsed + by pgloader itself: they need to be terminated by a semi-colon (;) and + the file may include `\i` or `\ir` commands to *include* another file. + + * `--after ` + + Parse given filename for SQL queries and run them against the target + database after having loaded the data from the source. The queries are + parsed in the same way as with the `--before` option, see above. + +More Debug Information +^^^^^^^^^^^^^^^^^^^^^^ + +To get the maximum amount of debug information, you can use both the +`--verbose` and the `--debug` switches at the same time, which is equivalent +to saying `--client-min-messages data`. Then the log messages will show the +data being processed, in the cases where the code has explicit support for +it. + +Batches And Retry Behaviour +--------------------------- + +To load data to PostgreSQL, pgloader uses the `COPY` streaming protocol. +While this is the faster way to load data, `COPY` has an important drawback: +as soon as PostgreSQL emits an error with any bit of data sent to it, +whatever the problem is, the whole data set is rejected by PostgreSQL. + +To work around that, pgloader cuts the data into *batches* of 25000 rows +each, so that when a problem occurs it's only impacting that many rows of +data. Each batch is kept in memory while the `COPY` streaming happens, in +order to be able to handle errors should some happen. + +When PostgreSQL rejects the whole batch, pgloader logs the error message +then isolates the bad row(s) from the accepted ones by retrying the batched +rows in smaller batches. To do that, pgloader parses the *CONTEXT* error +message from the failed COPY, as the message contains the line number where +the error was found in the batch, as in the following example:: + + CONTEXT: COPY errors, line 3, column b: "2006-13-11" + +Using that information, pgloader will reload all rows in the batch before +the erroneous one, log the erroneous one as rejected, then try loading the +remaining of the batch in a single attempt, which may or may not contain +other erroneous data. + +At the end of a load containing rejected rows, you will find two files in +the *root-dir* location, under a directory named the same as the target +database of your setup. The filenames are the target table, and their +extensions are `.dat` for the rejected data and `.log` for the file +containing the full PostgreSQL client side logs about the rejected data. + +The `.dat` file is formatted in PostgreSQL the text COPY format as documented +in `http://www.postgresql.org/docs/9.2/static/sql-copy.html#AEN66609`. + +A Note About Performance +------------------------ + +pgloader has been developed with performance in mind, to be able to cope +with ever growing needs in loading large amounts of data into PostgreSQL. + +The basic architecture it uses is the old Unix pipe model, where a thread is +responsible for loading the data (reading a CSV file, querying MySQL, etc) +and fills pre-processed data into a queue. Another threads feeds from the +queue, apply some more *transformations* to the input data and stream the +end result to PostgreSQL using the COPY protocol. + +When given a file that the PostgreSQL `COPY` command knows how to parse, and +if the file contains no erroneous data, then pgloader will never be as fast +as just using the PostgreSQL `COPY` command. + +Note that while the `COPY` command is restricted to read either from its +standard input or from a local file on the server's file system, the command +line tool `psql` implements a `\copy` command that knows how to stream a +file local to the client over the network and into the PostgreSQL server, +using the same protocol as pgloader uses. + +A Note About Parallelism +------------------------ + +pgloader uses several concurrent tasks to process the data being loaded: + + - a reader task reads the data in and pushes it to a queue, + + - at last one write task feeds from the queue and formats the raw into the + PostgreSQL COPY format in batches (so that it's possible to then retry a + failed batch without reading the data from source again), and then sends + the data to PostgreSQL using the COPY protocol. + +The parameter *workers* allows to control how many worker threads are +allowed to be active at any time (that's the parallelism level); and the +parameter *concurrency* allows to control how many tasks are started to +handle the data (they may not all run at the same time, depending on the +*workers* setting). + +We allow *workers* simultaneous workers to be active at the same time in the +context of a single table. A single unit of work consist of several kinds of +workers: + + - a reader getting raw data from the source, + - N writers preparing and sending the data down to PostgreSQL. + +The N here is setup to the *concurrency* parameter: with a *CONCURRENCY* of +2, we start (+ 1 2) = 3 concurrent tasks, with a *concurrency* of 4 we start +(+ 1 4) = 9 concurrent tasks, of which only *workers* may be active +simultaneously. + +The defaults are `workers = 4, concurrency = 1` when loading from a database +source, and `workers = 8, concurrency = 2` when loading from something else +(currently, a file). Those defaults are arbitrary and waiting for feedback +from users, so please consider providing feedback if you play with the +settings. + +As the `CREATE INDEX` threads started by pgloader are only waiting until +PostgreSQL is done with the real work, those threads are *NOT* counted into +the concurrency levels as detailed here. + +By default, as many `CREATE INDEX` threads as the maximum number of indexes +per table are found in your source schema. It is possible to set the `max +parallel create index` *WITH* option to another number in case there's just +too many of them to create. + +Source Formats +-------------- + +pgloader supports the following input formats: + + - csv, which includes also tsv and other common variants where you can + change the *separator* and the *quoting* rules and how to *escape* the + *quotes* themselves; + + - fixed columns file, where pgloader is flexible enough to accomodate with + source files missing columns (*ragged fixed length column files* do + exist); + + - PostgreSLQ COPY formatted files, following the COPY TEXT documentation + of PostgreSQL, such as the reject files prepared by pgloader; + + - dbase files known as db3 or dbf file; + + - ixf formated files, ixf being a binary storage format from IBM; + + - sqlite databases with fully automated discovery of the schema and + advanced cast rules; + + - mysql databases with fully automated discovery of the schema and + advanced cast rules; + + - MS SQL databases with fully automated discovery of the schema and + advanced cast rules. + +Pgloader Commands Syntax +------------------------ + +pgloader implements a Domain Specific Language allowing to setup complex +data loading scripts handling computed columns and on-the-fly sanitization +of the input data. For more complex data loading scenarios, you will be +required to learn that DSL's syntax. It's meant to look familiar to DBA by +being inspired by SQL where it makes sense, which is not that much after +all. + +The pgloader commands follow the same global grammar rules. Each of them +might support only a subset of the general options and provide specific +options. + +:: + + LOAD + FROM + [ HAVING FIELDS ] + INTO + [ TARGET TABLE [ "" ]."" ] + [ TARGET COLUMNS ] + + [ WITH ] + + [ SET ] + + [ BEFORE LOAD [ DO | EXECUTE ] ... ] + [ AFTER LOAD [ DO | EXECUTE ] ... ] + ; + +The main clauses are the `LOAD`, `FROM`, `INTO` and `WITH` clauses that each +command implements. Some command then implement the `SET` command, or some +specific clauses such as the `CAST` clause. + +Templating with Mustache +------------------------ + +pgloader implements the https://mustache.github.io/ templating system so +that you may have dynamic parts of your commands. See the documentation for +this template system online. + +A specific feature of pgloader is the ability to fetch a variable from the +OS environment of the pgloader process, making it possible to run pgloader +as in the following example:: + + $ DBPATH=sqlite/sqlite.db pgloader ./test/sqlite-env.load + +or in several steps:: + + $ export DBPATH=sqlite/sqlite.db + $ pgloader ./test/sqlite-env.load + +The variable can then be used in a typical mustache fashion:: + + load database + from '{{DBPATH}}' + into postgresql:///pgloader; + +It's also possible to prepare a INI file such as the following:: + + [pgloader] + + DBPATH = sqlite/sqlite.db + +And run the following command, feeding the INI values as a *context* for +pgloader templating system:: + + $ pgloader --context ./test/sqlite.ini ./test/sqlite-ini.load + +The mustache templates implementation with OS environment support replaces +former `GETENV` implementation, which didn't work anyway. + +Common Clauses +-------------- + +Some clauses are common to all commands: + +FROM +^^^^ + +The *FROM* clause specifies where to read the data from, and each command +introduces its own variant of sources. For instance, the *CSV* source +supports `inline`, `stdin`, a filename, a quoted filename, and a *FILENAME +MATCHING* clause (see above); whereas the *MySQL* source only supports a +MySQL database URI specification. + +INTO +^^^^ + +The PostgreSQL connection URI must contains the name of the target table +where to load the data into. That table must have already been created in +PostgreSQL, and the name might be schema qualified. + +Then *INTO* option also supports an optional comma separated list of target +columns, which are either the name of an input *field* or the white space +separated list of the target column name, its PostgreSQL data type and a +*USING* expression. + +The *USING* expression can be any valid Common Lisp form and will be read +with the current package set to `pgloader.transforms`, so that you can use +functions defined in that package, such as functions loaded dynamically with +the `--load` command line parameter. + +Each *USING* expression is compiled at runtime to native code. + +This feature allows pgloader to load any number of fields in a CSV file into +a possibly different number of columns in the database, using custom code +for that projection. + +WITH +^^^^ + +Set of options to apply to the command, using a global syntax of either: + + - *key = value* + - *use option* + - *do not use option* + +See each specific command for details. + +All data sources specific commands support the following options: + + - *on error stop* + - *batch rows = R* + - *batch size = ... MB* + - *prefetch rows = ...* + +See the section BATCH BEHAVIOUR OPTIONS for more details. + +In addition, the following settings are available: + + - *workers = W* + - *concurrency = C* + - *max parallel create index = I* + +See section A NOTE ABOUT PARALLELISM for more details. + +SET +^^^ + +This clause allows to specify session parameters to be set for all the +sessions opened by pgloader. It expects a list of parameter name, the equal +sign, then the single-quoted value as a comma separated list. + +The names and values of the parameters are not validated by pgloader, they +are given as-is to PostgreSQL. + +BEFORE LOAD DO +^^^^^^^^^^^^^^ + +You can run SQL queries against the database before loading the data from +the `CSV` file. Most common SQL queries are `CREATE TABLE IF NOT EXISTS` so +that the data can be loaded. + +Each command must be *dollar-quoted*: it must begin and end with a double +dollar sign, `$$`. Dollar-quoted queries are then comma separated. No extra +punctuation is expected after the last SQL query. + +BEFORE LOAD EXECUTE +^^^^^^^^^^^^^^^^^^^ + +Same behaviour as in the *BEFORE LOAD DO* clause. Allows you to read the SQL +queries from a SQL file. Implements support for PostgreSQL dollar-quoting +and the `\i` and `\ir` include facilities as in `psql` batch mode (where +they are the same thing). + +AFTER LOAD DO +^^^^^^^^^^^^^ + +Same format as *BEFORE LOAD DO*, the dollar-quoted queries found in that +section are executed once the load is done. That's the right time to create +indexes and constraints, or re-enable triggers. + +AFTER LOAD EXECUTE +^^^^^^^^^^^^^^^^^^ + +Same behaviour as in the *AFTER LOAD DO* clause. Allows you to read the SQL +queries from a SQL file. Implements support for PostgreSQL dollar-quoting +and the `\i` and `\ir` include facilities as in `psql` batch mode (where +they are the same thing). + +Connection String +^^^^^^^^^^^^^^^^^ + +The `` parameter is expected to be given as a *Connection URI* +as documented in the PostgreSQL documentation at +http://www.postgresql.org/docs/9.3/static/libpq-connect.html#LIBPQ-CONNSTRING. + +:: + + postgresql://[user[:password]@][netloc][:port][/dbname][?option=value&...] + +Where: + + - *user* + + Can contain any character, including colon (`:`) which must then be + doubled (`::`) and at-sign (`@`) which must then be doubled (`@@`). + + When omitted, the *user* name defaults to the value of the `PGUSER` + environment variable, and if it is unset, the value of the `USER` + environment variable. + + - *password* + + Can contain any character, including the at sign (`@`) which must then + be doubled (`@@`). To leave the password empty, when the *user* name + ends with at at sign, you then have to use the syntax user:@. + + When omitted, the *password* defaults to the value of the `PGPASSWORD` + environment variable if it is set, otherwise the password is left + unset. + + When no *password* is found either in the connection URI nor in the + environment, then pgloader looks for a `.pgpass` file as documented at + https://www.postgresql.org/docs/current/static/libpq-pgpass.html. The + implementation is not that of `libpq` though. As with `libpq` you can + set the environment variable `PGPASSFILE` to point to a `.pgpass` file, + and pgloader defaults to `~/.pgpass` on unix like systems and + `%APPDATA%\postgresql\pgpass.conf` on windows. Matching rules and syntax + are the same as with `libpq`, refer to its documentation. + + - *netloc* + + Can be either a hostname in dotted notation, or an ipv4, or an Unix + domain socket path. Empty is the default network location, under a + system providing *unix domain socket* that method is preferred, otherwise + the *netloc* default to `localhost`. + + It's possible to force the *unix domain socket* path by using the syntax + `unix:/path/to/where/the/socket/file/is`, so to force a non default + socket path and a non default port, you would have: + + postgresql://unix:/tmp:54321/dbname + + The *netloc* defaults to the value of the `PGHOST` environment + variable, and if it is unset, to either the default `unix` socket path + when running on a Unix system, and `localhost` otherwise. + + Socket path containing colons are supported by doubling the colons + within the path, as in the following example: + + postgresql://unix:/tmp/project::region::instance:5432/dbname + + - *dbname* + + Should be a proper identifier (letter followed by a mix of letters, + digits and the punctuation signs comma (`,`), dash (`-`) and underscore + (`_`). + + When omitted, the *dbname* defaults to the value of the environment + variable `PGDATABASE`, and if that is unset, to the *user* value as + determined above. + + - *options* + + The optional parameters must be supplied with the form `name=value`, and + you may use several parameters by separating them away using an + ampersand (`&`) character. + + Only some options are supported here, *tablename* (which might be + qualified with a schema name) *sslmode*, *host*, *port*, *dbname*, + *user* and *password*. + + The *sslmode* parameter values can be one of `disable`, `allow`, + `prefer` or `require`. + + For backward compatibility reasons, it's possible to specify the + *tablename* option directly, without spelling out the `tablename=` + parts. + + The options override the main URI components when both are given, and + using the percent-encoded option parameters allow using passwords + starting with a colon and bypassing other URI components parsing + limitations. + +Regular Expressions +^^^^^^^^^^^^^^^^^^^ + +Several clauses listed in the following accept *regular expressions* with +the following input rules: + + - A regular expression begins with a tilde sign (`~`), + + - is then followed with an opening sign, + + - then any character is allowed and considered part of the regular + expression, except for the closing sign, + + - then a closing sign is expected. + +The opening and closing sign are allowed by pair, here's the complete list +of allowed delimiters:: + + ~// + ~[] + ~{} + ~() + ~<> + ~"" + ~'' + ~|| + ~## + +Pick the set of delimiters that don't collide with the *regular expression* +you're trying to input. If your expression is such that none of the +solutions allow you to enter it, the places where such expressions are +allowed should allow for a list of expressions. + +Comments +^^^^^^^^ + +Any command may contain comments, following those input rules: + + - the `--` delimiter begins a comment that ends with the end of the + current line, + + - the delimiters `/*` and `*/` respectively start and end a comment, which + can be found in the middle of a command or span several lines. + +Any place where you could enter a *whitespace* will accept a comment too. + +Batch behaviour options +^^^^^^^^^^^^^^^^^^^^^^^ + +All pgloader commands have support for a *WITH* clause that allows for +specifying options. Some options are generic and accepted by all commands, +such as the *batch behaviour options*, and some options are specific to a +data source kind, such as the CSV *skip header* option. + +The global batch behaviour options are: + + - *batch rows* + + Takes a numeric value as argument, used as the maximum number of rows + allowed in a batch. The default is `25 000` and can be changed to try + having better performance characteristics or to control pgloader memory + usage; + + - *batch size* + + Takes a memory unit as argument, such as *20 MB*, its default value. + Accepted multipliers are *kB*, *MB*, *GB*, *TB* and *PB*. The case is + important so as not to be confused about bits versus bytes, we're only + talking bytes here. + + - *prefetch rows* + + Takes a numeric value as argument, defaults to `100000`. That's the + number of rows that pgloader is allowed to read in memory in each reader + thread. See the *workers* setting for how many reader threads are + allowed to run at the same time. + +Other options are specific to each input source, please refer to specific +parts of the documentation for their listing and covering. + +A batch is then closed as soon as either the *batch rows* or the *batch +size* threshold is crossed, whichever comes first. In cases when a batch has +to be closed because of the *batch size* setting, a *debug* level log +message is printed with how many rows did fit in the *oversized* batch. + diff --git a/docs/_build/html/_sources/ref/archive.rst.txt b/docs/_build/html/_sources/ref/archive.rst.txt new file mode 100644 index 0000000..1cb95c2 --- /dev/null +++ b/docs/_build/html/_sources/ref/archive.rst.txt @@ -0,0 +1,104 @@ +Loading From an Archive +======================= + +This command instructs pgloader to load data from one or more files contained +in an archive. Currently the only supported archive format is *ZIP*, and the +archive might be downloaded from an *HTTP* URL. + +Here's an example:: + + LOAD ARCHIVE + FROM /Users/dim/Downloads/GeoLiteCity-latest.zip + INTO postgresql:///ip4r + + BEFORE LOAD + DO $$ create extension if not exists ip4r; $$, + $$ create schema if not exists geolite; $$, + + EXECUTE 'geolite.sql' + + LOAD CSV + FROM FILENAME MATCHING ~/GeoLiteCity-Location.csv/ + WITH ENCODING iso-8859-1 + ( + locId, + country, + region null if blanks, + city null if blanks, + postalCode null if blanks, + latitude, + longitude, + metroCode null if blanks, + areaCode null if blanks + ) + INTO postgresql:///ip4r?geolite.location + ( + locid,country,region,city,postalCode, + location point using (format nil "(~a,~a)" longitude latitude), + metroCode,areaCode + ) + WITH skip header = 2, + fields optionally enclosed by '"', + fields escaped by double-quote, + fields terminated by ',' + + AND LOAD CSV + FROM FILENAME MATCHING ~/GeoLiteCity-Blocks.csv/ + WITH ENCODING iso-8859-1 + ( + startIpNum, endIpNum, locId + ) + INTO postgresql:///ip4r?geolite.blocks + ( + iprange ip4r using (ip-range startIpNum endIpNum), + locId + ) + WITH skip header = 2, + fields optionally enclosed by '"', + fields escaped by double-quote, + fields terminated by ',' + + FINALLY DO + $$ create index blocks_ip4r_idx on geolite.blocks using gist(iprange); $$; + +The `archive` command accepts the following clauses and options. + +Archive Source Specification: FROM +---------------------------------- + +Filename or HTTP URI where to load the data from. When given an HTTP URL the +linked file will get downloaded locally before processing. + +If the file is a `zip` file, the command line utility `unzip` is used to +expand the archive into files in `$TMPDIR`, or `/tmp` if `$TMPDIR` is unset +or set to a non-existing directory. + +Then the following commands are used from the top level directory where the +archive has been expanded. + +Archive Sub Commands +-------------------- + + - command [ *AND* command ... ] + + A series of commands against the contents of the archive, at the moment + only `CSV`,`'FIXED` and `DBF` commands are supported. + + Note that commands are supporting the clause *FROM FILENAME MATCHING* + which allows the pgloader command not to depend on the exact names of + the archive directories. + + The same clause can also be applied to several files with using the + spelling *FROM ALL FILENAMES MATCHING* and a regular expression. + + The whole *matching* clause must follow the following rule:: + + FROM [ ALL FILENAMES | [ FIRST ] FILENAME ] MATCHING + +Archive Final SQL Commands +-------------------------- + + - *FINALLY DO* + + SQL Queries to run once the data is loaded, such as `CREATE INDEX`. + diff --git a/docs/_build/html/_sources/ref/copy.rst.txt b/docs/_build/html/_sources/ref/copy.rst.txt new file mode 100644 index 0000000..e8b156d --- /dev/null +++ b/docs/_build/html/_sources/ref/copy.rst.txt @@ -0,0 +1,115 @@ +Loading COPY Formatted Files +============================ + +This commands instructs pgloader to load from a file containing COPY TEXT +data as described in the PostgreSQL documentation. Here's an example:: + + LOAD COPY + FROM copy://./data/track.copy + ( + trackid, track, album, media, genre, composer, + milliseconds, bytes, unitprice + ) + INTO postgresql:///pgloader + TARGET TABLE track_full + + WITH truncate + + SET work_mem to '14MB', + standard_conforming_strings to 'on' + + BEFORE LOAD DO + $$ drop table if exists track_full; $$, + $$ create table track_full ( + trackid bigserial, + track text, + album text, + media text, + genre text, + composer text, + milliseconds bigint, + bytes bigint, + unitprice numeric + ); + $$; + +The `COPY` format command accepts the following clauses and options. + +COPY Formatted Files Source Specification: FROM +----------------------------------------------- + +Filename where to load the data from. This support local files, HTTP URLs +and zip files containing a single dbf file of the same name. Fetch such a +zip file from an HTTP address is of course supported. + + - *inline* + + The data is found after the end of the parsed commands. Any number of + empty lines between the end of the commands and the beginning of the + data is accepted. + + - *stdin* + + Reads the data from the standard input stream. + + - *FILENAMES MATCHING* + + The whole *matching* clause must follow the following rule:: + + [ ALL FILENAMES | [ FIRST ] FILENAME ] + MATCHING regexp + [ IN DIRECTORY '...' ] + + The *matching* clause applies given *regular expression* (see above for + exact syntax, several options can be used here) to filenames. It's then + possible to load data from only the first match of all of them. + + The optional *IN DIRECTORY* clause allows specifying which directory to + walk for finding the data files, and can be either relative to where the + command file is read from, or absolute. The given directory must exists. + +COPY Formatted File Options: WITH +--------------------------------- + + +When loading from a `COPY` file, the following options are supported: + + - *delimiter* + + Takes a single character as argument, which must be found inside single + quotes, and might be given as the printable character itself, the + special value \t to denote a tabulation character, or `0x` then an + hexadecimal value read as the ASCII code for the character. + + This character is used as the *delimiter* when reading the data, in a + similar way to the PostgreSQL `COPY` option. + + - *null* + + Takes a quoted string as an argument (quotes can be either double quotes + or single quotes) and uses that string as the `NULL` representation in + the data. + + This is similar to the *null* `COPY` option in PostgreSQL. + + - *truncate* + + When this option is listed, pgloader issues a `TRUNCATE` command against + the PostgreSQL target table before reading the data file. + + - *disable triggers* + + When this option is listed, pgloader issues an `ALTER TABLE ... DISABLE + TRIGGER ALL` command against the PostgreSQL target table before copying + the data, then the command `ALTER TABLE ... ENABLE TRIGGER ALL` once the + `COPY` is done. + + This option allows loading data into a pre-existing table ignoring the + *foreign key constraints* and user defined triggers and may result in + invalid *foreign key constraints* once the data is loaded. Use with + care. + + - *skip header* + + Takes a numeric value as argument. Instruct pgloader to skip that many + lines at the beginning of the input file. diff --git a/docs/_build/html/_sources/ref/csv.rst.txt b/docs/_build/html/_sources/ref/csv.rst.txt new file mode 100644 index 0000000..243e8e6 --- /dev/null +++ b/docs/_build/html/_sources/ref/csv.rst.txt @@ -0,0 +1,237 @@ +Loading CSV data +================ + +This command instructs pgloader to load data from a `CSV` file. Here's an +example:: + + LOAD CSV + FROM 'GeoLiteCity-Blocks.csv' WITH ENCODING iso-646-us + HAVING FIELDS + ( + startIpNum, endIpNum, locId + ) + INTO postgresql://user@localhost:54393/dbname + TARGET TABLE geolite.blocks + TARGET COLUMNS + ( + iprange ip4r using (ip-range startIpNum endIpNum), + locId + ) + WITH truncate, + skip header = 2, + fields optionally enclosed by '"', + fields escaped by backslash-quote, + fields terminated by '\t' + + SET work_mem to '32 MB', maintenance_work_mem to '64 MB'; + +The `csv` format command accepts the following clauses and options. + +CSV Source Specification: FROM +------------------------------ + +Filename where to load the data from. Accepts an *ENCODING* option. Use the +`--list-encodings` option to know which encoding names are supported. + +The filename may be enclosed by single quotes, and could be one of the +following special values: + + - *inline* + + The data is found after the end of the parsed commands. Any number + of empty lines between the end of the commands and the beginning of + the data is accepted. + + - *stdin* + + Reads the data from the standard input stream. + + - *FILENAMES MATCHING* + + The whole *matching* clause must follow the following rule:: + + [ ALL FILENAMES | [ FIRST ] FILENAME ] + MATCHING regexp + [ IN DIRECTORY '...' ] + + The *matching* clause applies given *regular expression* (see above + for exact syntax, several options can be used here) to filenames. + It's then possible to load data from only the first match of all of + them. + + The optional *IN DIRECTORY* clause allows specifying which directory + to walk for finding the data files, and can be either relative to + where the command file is read from, or absolute. The given + directory must exists. + +Fields Specifications +--------------------- + +The *FROM* option also supports an optional comma separated list of *field* +names describing what is expected in the `CSV` data file, optionally +introduced by the clause `HAVING FIELDS`. + +Each field name can be either only one name or a name following with +specific reader options for that field, enclosed in square brackets and +comma-separated. Supported per-field reader options are: + + - *terminated by* + + See the description of *field terminated by* below. + + The processing of this option is not currently implemented. + + - *date format* + + When the field is expected of the date type, then this option allows + to specify the date format used in the file. + + Date format string are template strings modeled against the + PostgreSQL `to_char` template strings support, limited to the + following patterns: + + - YYYY, YYY, YY for the year part + - MM for the numeric month part + - DD for the numeric day part + - HH, HH12, HH24 for the hour part + - am, AM, a.m., A.M. + - pm, PM, p.m., P.M. + - MI for the minutes part + - SS for the seconds part + - MS for the milliseconds part (4 digits) + - US for the microseconds part (6 digits) + - unparsed punctuation signs: - . * # @ T / \ and space + + Here's an example of a *date format* specification:: + + column-name [date format 'YYYY-MM-DD HH24-MI-SS.US'] + + - *null if* + + This option takes an argument which is either the keyword *blanks* + or a double-quoted string. + + When *blanks* is used and the field value that is read contains + only space characters, then it's automatically converted to an SQL + `NULL` value. + + When a double-quoted string is used and that string is read as the + field value, then the field value is automatically converted to an + SQL `NULL` value. + + - *trim both whitespace*, *trim left whitespace*, *trim right whitespace* + + This option allows to trim whitespaces in the read data, either from + both sides of the data, or only the whitespace characters found on + the left of the streaing, or only those on the right of the string. + +CSV Loading Options: WITH +------------------------- + +When loading from a `CSV` file, the following options are supported: + + - *truncate* + + When this option is listed, pgloader issues a `TRUNCATE` command + against the PostgreSQL target table before reading the data file. + + - *drop indexes* + + When this option is listed, pgloader issues `DROP INDEX` commands + against all the indexes defined on the target table before copying + the data, then `CREATE INDEX` commands once the `COPY` is done. + + In order to get the best performance possible, all the indexes are + created in parallel and when done the primary keys are built again + from the unique indexes just created. This two step process allows + creating the primary key index in parallel with the other indexes, + as only the `ALTER TABLE` command needs an *access exclusive lock* + on the target table. + + - *disable triggers* + + When this option is listed, pgloader issues an `ALTER TABLE ... + DISABLE TRIGGER ALL` command against the PostgreSQL target table + before copying the data, then the command `ALTER TABLE ... ENABLE + TRIGGER ALL` once the `COPY` is done. + + This option allows loading data into a pre-existing table ignoring + the *foreign key constraints* and user defined triggers and may + result in invalid *foreign key constraints* once the data is loaded. + Use with care. + + - *skip header* + + Takes a numeric value as argument. Instruct pgloader to skip that + many lines at the beginning of the input file. + + - *csv header* + + Use the first line read after *skip header* as the list of csv field + names to be found in the CSV file, using the same CSV parameters as + for the CSV data. + + - *trim unquoted blanks* + + When reading unquoted values in the `CSV` file, remove the blanks + found in between the separator and the value. That behaviour is the + default. + + - *keep unquoted blanks* + + When reading unquoted values in the `CSV` file, keep blanks found in + between the separator and the value. + + - *fields optionally enclosed by* + + Takes a single character as argument, which must be found inside + single quotes, and might be given as the printable character itself, + the special value \t to denote a tabulation character, or `0x` then + an hexadecimal value read as the ASCII code for the character. + + This character is used as the quoting character in the `CSV` file, + and defaults to double-quote. + + - *fields not enclosed* + + By default, pgloader will use the double-quote character as the + enclosing character. If you have a CSV file where fields are not + enclosed and are using double-quote as an expected ordinary + character, then use the option *fields not enclosed* for the CSV + parser to accept those values. + + - *fields escaped by* + + Takes either the special value *backslash-quote* or *double-quote*, + or any value supported by the *fields terminated by* option (see + below). This value is used to recognize escaped field separators + when they are to be found within the data fields themselves. + Defaults to *double-quote*. + + - *csv escape mode* + + Takes either the special value *quote* (the default) or *following* + and allows the CSV parser to parse either only escaped field + separator or any character (including CSV data) when using the + *following* value. + + - *fields terminated by* + + Takes a single character as argument, which must be found inside + single quotes, and might be given as the printable character itself, + the special value \t to denote a tabulation character, or `0x` then + an hexadecimal value read as the ASCII code for the character. + + This character is used as the *field separator* when reading the + `CSV` data. + + - *lines terminated by* + + Takes a single character as argument, which must be found inside + single quotes, and might be given as the printable character itself, + the special value \t to denote a tabulation character, or `0x` then + an hexadecimal value read as the ASCII code for the character. + + This character is used to recognize *end-of-line* condition when + reading the `CSV` data. + diff --git a/docs/_build/html/_sources/ref/dbf.rst.txt b/docs/_build/html/_sources/ref/dbf.rst.txt new file mode 100644 index 0000000..28269f3 --- /dev/null +++ b/docs/_build/html/_sources/ref/dbf.rst.txt @@ -0,0 +1,53 @@ +Loading DBF data +================= + +This command instructs pgloader to load data from a `DBF` file. Here's an +example:: + + LOAD DBF + FROM http://www.insee.fr/fr/methodes/nomenclatures/cog/telechargement/2013/dbf/reg2013.dbf + INTO postgresql://user@localhost/dbname + WITH truncate, create table; + +The `dbf` format command accepts the following clauses and options. + +DBF Source Specification: FROM +------------------------------ + +Filename where to load the data from. This support local files, HTTP URLs +and zip files containing a single dbf file of the same name. Fetch such a +zip file from an HTTP address is of course supported. + +DBF Loading Options: WITH +------------------------- + +When loading from a `DBF` file, the following options are supported: + + - *truncate* + + When this option is listed, pgloader issues a `TRUNCATE` command against + the PostgreSQL target table before reading the data file. + + - *disable triggers* + + When this option is listed, pgloader issues an `ALTER TABLE ... DISABLE + TRIGGER ALL` command against the PostgreSQL target table before copying + the data, then the command `ALTER TABLE ... ENABLE TRIGGER ALL` once the + `COPY` is done. + + This option allows loading data into a pre-existing table ignoring the + *foreign key constraints* and user defined triggers and may result in + invalid *foreign key constraints* once the data is loaded. Use with + care. + + - *create table* + + When this option is listed, pgloader creates the table using the meta + data found in the `DBF` file, which must contain a list of fields with + their data type. A standard data type conversion from DBF to PostgreSQL + is done. + + - *table name* + + This options expects as its value the possibly qualified name of the + table to create. diff --git a/docs/_build/html/_sources/ref/fixed.rst.txt b/docs/_build/html/_sources/ref/fixed.rst.txt new file mode 100644 index 0000000..dd567da --- /dev/null +++ b/docs/_build/html/_sources/ref/fixed.rst.txt @@ -0,0 +1,182 @@ +Loading Fixed Cols File Formats +=============================== + +This command instructs pgloader to load data from a text file containing +columns arranged in a *fixed size* manner. Here's an example:: + + LOAD FIXED + FROM inline + ( + a from 0 for 10, + b from 10 for 8, + c from 18 for 8, + d from 26 for 17 [null if blanks, trim right whitespace] + ) + INTO postgresql:///pgloader + TARGET TABLE fixed + ( + a, b, + c time using (time-with-no-separator c), + d + ) + + WITH truncate + + SET work_mem to '14MB', + standard_conforming_strings to 'on' + + BEFORE LOAD DO + $$ drop table if exists fixed; $$, + $$ create table fixed ( + a integer, + b date, + c time, + d text + ); + $$; + + 01234567892008052011431250firstline + 01234562008052115182300left blank-padded + 12345678902008052208231560another line + 2345609872014092914371500 + 2345678902014092914371520 + +The `fixed` format command accepts the following clauses and options. + +Fixed File Format Source Specification: FROM +-------------------------------------------- + +Filename where to load the data from. Accepts an *ENCODING* option. Use the +`--list-encodings` option to know which encoding names are supported. + +The filename may be enclosed by single quotes, and could be one of the +following special values: + + - *inline* + + The data is found after the end of the parsed commands. Any number + of empty lines between the end of the commands and the beginning of + the data is accepted. + + - *stdin* + + Reads the data from the standard input stream. + + - *FILENAMES MATCHING* + + The whole *matching* clause must follow the following rule:: + + [ ALL FILENAMES | [ FIRST ] FILENAME ] + MATCHING regexp + [ IN DIRECTORY '...' ] + + The *matching* clause applies given *regular expression* (see above + for exact syntax, several options can be used here) to filenames. + It's then possible to load data from only the first match of all of + them. + + The optional *IN DIRECTORY* clause allows specifying which directory + to walk for finding the data files, and can be either relative to + where the command file is read from, or absolute. The given + directory must exists. + +Fields Specifications +--------------------- + +The *FROM* option also supports an optional comma separated list of *field* +names describing what is expected in the `FIXED` data file. + +Each field name is composed of the field name followed with specific reader +options for that field. Supported per-field reader options are the +following, where only *start* and *length* are required. + + - *start* + + Position in the line where to start reading that field's value. Can + be entered with decimal digits or `0x` then hexadecimal digits. + + - *length* + + How many bytes to read from the *start* position to read that + field's value. Same format as *start*. + +Those optional parameters must be enclosed in square brackets and +comma-separated: + + - *terminated by* + + See the description of *field terminated by* below. + + The processing of this option is not currently implemented. + + - *date format* + + When the field is expected of the date type, then this option allows + to specify the date format used in the file. + + Date format string are template strings modeled against the + PostgreSQL `to_char` template strings support, limited to the + following patterns: + + - YYYY, YYY, YY for the year part + - MM for the numeric month part + - DD for the numeric day part + - HH, HH12, HH24 for the hour part + - am, AM, a.m., A.M. + - pm, PM, p.m., P.M. + - MI for the minutes part + - SS for the seconds part + - MS for the milliseconds part (4 digits) + - US for the microseconds part (6 digits) + - unparsed punctuation signs: - . * # @ T / \ and space + + Here's an example of a *date format* specification:: + + column-name [date format 'YYYY-MM-DD HH24-MI-SS.US'] + + - *null if* + + This option takes an argument which is either the keyword *blanks* + or a double-quoted string. + + When *blanks* is used and the field value that is read contains only + space characters, then it's automatically converted to an SQL `NULL` + value. + + When a double-quoted string is used and that string is read as the + field value, then the field value is automatically converted to an + SQL `NULL` value. + + - *trim both whitespace*, *trim left whitespace*, *trim right whitespace* + + This option allows to trim whitespaces in the read data, either from + both sides of the data, or only the whitespace characters found on + the left of the streaing, or only those on the right of the string. + +Fixed File Format Loading Options: WITH +--------------------------------------- + +When loading from a `FIXED` file, the following options are supported: + + - *truncate* + + When this option is listed, pgloader issues a `TRUNCATE` command + against the PostgreSQL target table before reading the data file. + + - *disable triggers* + + When this option is listed, pgloader issues an `ALTER TABLE ... + DISABLE TRIGGER ALL` command against the PostgreSQL target table + before copying the data, then the command `ALTER TABLE ... ENABLE + TRIGGER ALL` once the `COPY` is done. + + This option allows loading data into a pre-existing table ignoring + the *foreign key constraints* and user defined triggers and may + result in invalid *foreign key constraints* once the data is loaded. + Use with care. + + - *skip header* + + Takes a numeric value as argument. Instruct pgloader to skip that + many lines at the beginning of the input file. + diff --git a/docs/_build/html/_sources/ref/ixf.rst.txt b/docs/_build/html/_sources/ref/ixf.rst.txt new file mode 100644 index 0000000..3f698fa --- /dev/null +++ b/docs/_build/html/_sources/ref/ixf.rst.txt @@ -0,0 +1,66 @@ +Loading IXF Data +================ + +This command instructs pgloader to load data from an IBM `IXF` file. Here's +an example:: + + LOAD IXF + FROM data/nsitra.test1.ixf + INTO postgresql:///pgloader + TARGET TABLE nsitra.test1 + WITH truncate, create table, timezone UTC + + BEFORE LOAD DO + $$ create schema if not exists nsitra; $$, + $$ drop table if exists nsitra.test1; $$; + +The `ixf` format command accepts the following clauses and options. + +IXF Source Specification: FROM +------------------------------ + +Filename where to load the data from. This support local files, HTTP URLs +and zip files containing a single ixf file of the same name. Fetch such a +zip file from an HTTP address is of course supported. + +IXF Loading Options: WITH +------------------------- + +When loading from a `IXF` file, the following options are supported: + + - *truncate* + + When this option is listed, pgloader issues a `TRUNCATE` command against + the PostgreSQL target table before reading the data file. + + - *disable triggers* + + When this option is listed, pgloader issues an `ALTER TABLE ... DISABLE + TRIGGER ALL` command against the PostgreSQL target table before copying + the data, then the command `ALTER TABLE ... ENABLE TRIGGER ALL` once the + `COPY` is done. + + This option allows loading data into a pre-existing table ignoring the + *foreign key constraints* and user defined triggers and may result in + invalid *foreign key constraints* once the data is loaded. Use with + care. + + - *create table* + + When this option is listed, pgloader creates the table using the meta + data found in the `DBF` file, which must contain a list of fields with + their data type. A standard data type conversion from DBF to PostgreSQL + is done. + + - *table name* + + This options expects as its value the possibly qualified name of the + table to create. + + - *timezone* + + This options allows to specify which timezone is used when parsing + timestamps from an IXF file, and defaults to *UTC*. Expected values are + either `UTC`, `GMT` or a single quoted location name such as + `'Universal'` or `'Europe/Paris'`. + diff --git a/docs/_build/html/_sources/ref/mssql.rst.txt b/docs/_build/html/_sources/ref/mssql.rst.txt new file mode 100644 index 0000000..89ff6f3 --- /dev/null +++ b/docs/_build/html/_sources/ref/mssql.rst.txt @@ -0,0 +1,159 @@ +Migrating a MS SQL Database to PostgreSQL +========================================= + +This command instructs pgloader to load data from a MS SQL database. +Automatic discovery of the schema is supported, including build of the +indexes, primary and foreign keys constraints. + +Here's an example:: + + load database + from mssql://user@host/dbname + into postgresql:///dbname + + including only table names like 'GlobalAccount' in schema 'dbo' + + set work_mem to '16MB', maintenance_work_mem to '512 MB' + + before load do $$ drop schema if exists dbo cascade; $$; + +The `mssql` command accepts the following clauses and options. + +MS SQL Database Source Specification: FROM +------------------------------------------ + +Connection string to an existing MS SQL database server that listens and +welcome external TCP/IP connection. As pgloader currently piggybacks on the +FreeTDS driver, to change the port of the server please export the `TDSPORT` +environment variable. + +MS SQL Database Migration Options: WITH +--------------------------------------- + +When loading from a `MS SQL` database, the same options as when loading a +`MySQL` database are supported. Please refer to the MySQL section. The +following options are added: + + - *create schemas* + + When this option is listed, pgloader creates the same schemas as found + on the MS SQL instance. This is the default. + + - *create no schemas* + + When this option is listed, pgloader refrains from creating any schemas + at all, you must then ensure that the target schema do exist. + +MS SQL Database Casting Rules +----------------------------- + +CAST +^^^^ + +The cast clause allows to specify custom casting rules, either to overload +the default casting rules or to amend them with special cases. + +Please refer to the MySQL CAST clause for details. + +MS SQL Partial Migration +------------------------ + + +INCLUDING ONLY TABLE NAMES LIKE +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Introduce a comma separated list of table name patterns used to limit the +tables to migrate to a sublist. More than one such clause may be used, they +will be accumulated together. + +Example:: + + including only table names lile 'GlobalAccount' in schema 'dbo' + +EXCLUDING TABLE NAMES LIKE +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Introduce a comma separated list of table name patterns used to exclude +table names from the migration. This filter only applies to the result of +the *INCLUDING* filter. + +:: + + excluding table names matching 'LocalAccount' in schema 'dbo' + +MS SQL Schema Transformations +----------------------------- + +ALTER SCHEMA '...' RENAME TO '...' +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Allows to rename a schema on the flight, so that for instance the tables +found in the schema 'dbo' in your source database will get migrated into the +schema 'public' in the target database with this command:: + + alter schema 'dbo' rename to 'public' + +ALTER TABLE NAMES MATCHING ... IN SCHEMA '...' +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +See the MySQL explanation for this clause above. It works the same in the +context of migrating from MS SQL, only with the added option to specify the +name of the schema where to find the definition of the target tables. + +The matching is done in pgloader itself, with a Common Lisp regular +expression lib, so doesn't depend on the *LIKE* implementation of MS SQL, +nor on the lack of support for regular expressions in the engine. + +MS SQL Driver setup and encoding +-------------------------------- + +pgloader is using the `FreeTDS` driver, and internally expects the data to +be sent in utf-8. To achieve that, you can configure the FreeTDS driver with +those defaults, in the file `~/.freetds.conf`:: + + [global] + tds version = 7.4 + client charset = UTF-8 + +Default MS SQL Casting Rules +---------------------------- + +When migrating from MS SQL the following Casting Rules are provided: + +Numbers:: + + type tinyint to smallint + + type float to float using float-to-string + type real to real using float-to-string + type double to double precision using float-to-string + type numeric to numeric using float-to-string + type decimal to numeric using float-to-string + type money to numeric using float-to-string + type smallmoney to numeric using float-to-string + +Texts:: + + type char to text drop typemod + type nchat to text drop typemod + type varchar to text drop typemod + type nvarchar to text drop typemod + type xml to text drop typemod + +Binary:: + + type binary to bytea using byte-vector-to-bytea + type varbinary to bytea using byte-vector-to-bytea + +Date:: + + type datetime to timestamptz + type datetime2 to timestamptz + +Others:: + + type bit to boolean + type hierarchyid to bytea + type geography to bytea + type uniqueidentifier to uuid using sql-server-uniqueidentifier-to-uuid + diff --git a/docs/_build/html/_sources/ref/mysql.rst.txt b/docs/_build/html/_sources/ref/mysql.rst.txt new file mode 100644 index 0000000..b484d5b --- /dev/null +++ b/docs/_build/html/_sources/ref/mysql.rst.txt @@ -0,0 +1,623 @@ +Migrating a MySQL Database to PostgreSQL +======================================== + +This command instructs pgloader to load data from a database connection. The +only supported database source is currently *MySQL*, and pgloader supports +dynamically converting the schema of the source database and the indexes +building. + +A default set of casting rules are provided and might be overloaded and +appended to by the command. + +Here's an example using as many options as possible, some of them even being +defaults. Chances are you don't need that complex a setup, don't copy and +paste it, use it only as a reference! + +:: + + LOAD DATABASE + FROM mysql://root@localhost/sakila + INTO postgresql://localhost:54393/sakila + + WITH include drop, create tables, create indexes, reset sequences, + workers = 8, concurrency = 1, + multiple readers per thread, rows per range = 50000 + + SET PostgreSQL PARAMETERS + maintenance_work_mem to '128MB', + work_mem to '12MB', + search_path to 'sakila, public, "$user"' + + SET MySQL PARAMETERS + net_read_timeout = '120', + net_write_timeout = '120' + + CAST type bigint when (= precision 20) to bigserial drop typemod, + type date drop not null drop default using zero-dates-to-null, + -- type tinyint to boolean using tinyint-to-boolean, + type year to integer + + MATERIALIZE VIEWS film_list, staff_list + + -- INCLUDING ONLY TABLE NAMES MATCHING ~/film/, 'actor' + -- EXCLUDING TABLE NAMES MATCHING ~ + -- DECODING TABLE NAMES MATCHING ~/messed/, ~/encoding/ AS utf8 + -- ALTER TABLE NAMES MATCHING 'film' RENAME TO 'films' + -- ALTER TABLE NAMES MATCHING ~/_list$/ SET SCHEMA 'mv' + + ALTER TABLE NAMES MATCHING ~/_list$/, 'sales_by_store', ~/sales_by/ + SET SCHEMA 'mv' + + ALTER TABLE NAMES MATCHING 'film' RENAME TO 'films' + ALTER TABLE NAMES MATCHING ~/./ SET (fillfactor='40') + + ALTER SCHEMA 'sakila' RENAME TO 'pagila' + + BEFORE LOAD DO + $$ create schema if not exists pagila; $$, + $$ create schema if not exists mv; $$, + $$ alter database sakila set search_path to pagila, mv, public; $$; + + +The `database` command accepts the following clauses and options. + +MySQL Database Source Specification: FROM +----------------------------------------- + +Must be a connection URL pointing to a MySQL database. + +If the connection URI contains a table name, then only this table is +migrated from MySQL to PostgreSQL. + +See the `SOURCE CONNECTION STRING` section above for details on how to write +the connection string. The MySQL connection string accepts the same +parameter *sslmode* as the PostgreSQL connection string, but the *verify* +mode is not implemented (yet). + +Environment variables described in + can be +used as default values too. If the user is not provided, then it defaults to +`USER` environment variable value. The password can be provided with the +environment variable `MYSQL_PWD`. The host can be provided with the +environment variable `MYSQL_HOST` and otherwise defaults to `localhost`. The +port can be provided with the environment variable `MYSQL_TCP_PORT` and +otherwise defaults to `3306`. + +MySQL Database Migration Options: WITH +-------------------------------------- + +When loading from a `MySQL` database, the following options are supported, +and the default *WITH* clause is: *no truncate*, *create schema*, *create +tables*, *include drop*, *create indexes*, *reset sequences*, *foreign +keys*, *downcase identifiers*, *uniquify index names*. + + - *include drop* + + When this option is listed, pgloader drops all the tables in the target + PostgreSQL database whose names appear in the MySQL database. This + option allows for using the same command several times in a row until + you figure out all the options, starting automatically from a clean + environment. Please note that `CASCADE` is used to ensure that tables + are dropped even if there are foreign keys pointing to them. This is + precisely what `include drop` is intended to do: drop all target tables + and recreate them. + + Great care needs to be taken when using `include drop`, as it will + cascade to *all* objects referencing the target tables, possibly + including other tables that are not being loaded from the source DB. + + - *include no drop* + + When this option is listed, pgloader will not include any `DROP` + statement when loading the data. + + - *truncate* + + When this option is listed, pgloader issue the `TRUNCATE` command + against each PostgreSQL table just before loading data into it. + + - *no truncate* + + When this option is listed, pgloader issues no `TRUNCATE` command. + + - *disable triggers* + + When this option is listed, pgloader issues an `ALTER TABLE ... DISABLE + TRIGGER ALL` command against the PostgreSQL target table before copying + the data, then the command `ALTER TABLE ... ENABLE TRIGGER ALL` once the + `COPY` is done. + + This option allows loading data into a pre-existing table ignoring the + *foreign key constraints* and user defined triggers and may result in + invalid *foreign key constraints* once the data is loaded. Use with + care. + + - *create tables* + + When this option is listed, pgloader creates the table using the meta + data found in the `MySQL` file, which must contain a list of fields with + their data type. A standard data type conversion from DBF to PostgreSQL + is done. + + - *create no tables* + + When this option is listed, pgloader skips the creation of table before + loading data, target tables must then already exist. + + Also, when using *create no tables* pgloader fetches the metadata from + the current target database and checks type casting, then will remove + constraints and indexes prior to loading the data and install them back + again once the loading is done. + + - *create indexes* + + When this option is listed, pgloader gets the definitions of all the + indexes found in the MySQL database and create the same set of index + definitions against the PostgreSQL database. + + - *create no indexes* + + When this option is listed, pgloader skips the creating indexes. + + - *drop indexes* + + When this option is listed, pgloader drops the indexes in the target + database before loading the data, and creates them again at the end + of the data copy. + + - *uniquify index names*, *preserve index names* + + MySQL index names are unique per-table whereas in PostgreSQL index names + have to be unique per-schema. The default for pgloader is to change the + index name by prefixing it with `idx_OID` where `OID` is the internal + numeric identifier of the table the index is built against. + + In somes cases like when the DDL are entirely left to a framework it + might be sensible for pgloader to refrain from handling index unique + names, that is achieved by using the *preserve index names* option. + + The default is to *uniquify index names*. + + Even when using the option *preserve index names*, MySQL primary key + indexes named "PRIMARY" will get their names uniquified. Failing to do + so would prevent the primary keys to be created again in PostgreSQL + where the index names must be unique per schema. + + - *drop schema* + + When this option is listed, pgloader drops the target schema in the + target PostgreSQL database before creating it again and all the objects + it contains. The default behavior doesn't drop the target schemas. + + - *foreign keys* + + When this option is listed, pgloader gets the definitions of all the + foreign keys found in the MySQL database and create the same set of + foreign key definitions against the PostgreSQL database. + + - *no foreign keys* + + When this option is listed, pgloader skips creating foreign keys. + + - *reset sequences* + + When this option is listed, at the end of the data loading and after the + indexes have all been created, pgloader resets all the PostgreSQL + sequences created to the current maximum value of the column they are + attached to. + + The options *schema only* and *data only* have no effects on this + option. + + - *reset no sequences* + + When this option is listed, pgloader skips resetting sequences after the + load. + + The options *schema only* and *data only* have no effects on this + option. + + - *downcase identifiers* + + When this option is listed, pgloader converts all MySQL identifiers + (table names, index names, column names) to *downcase*, except for + PostgreSQL *reserved* keywords. + + The PostgreSQL *reserved* keywords are determined dynamically by using + the system function `pg_get_keywords()`. + + - *quote identifiers* + + When this option is listed, pgloader quotes all MySQL identifiers so + that their case is respected. Note that you will then have to do the + same thing in your application code queries. + + - *schema only* + + When this option is listed pgloader refrains from migrating the data + over. Note that the schema in this context includes the indexes when the + option *create indexes* has been listed. + + - *data only* + + When this option is listed pgloader only issues the `COPY` statements, + without doing any other processing. + + - *single reader per thread*, *multiple readers per thread* + + The default is *single reader per thread* and it means that each + MySQL table is read by a single thread as a whole, with a single + `SELECT` statement using no `WHERE` clause. + + When using *multiple readers per thread* pgloader may be able to + divide the reading work into several threads, as many as the + *concurrency* setting, which needs to be greater than 1 for this + option to kick be activated. + + For each source table, pgloader searches for a primary key over a + single numeric column, or a multiple-column primary key index for + which the first column is of a numeric data type (one of `integer` + or `bigint`). When such an index exists, pgloader runs a query to + find the *min* and *max* values on this column, and then split that + range into many ranges containing a maximum of *rows per range*. + + When the range list we then obtain contains at least as many ranges + than our concurrency setting, then we distribute those ranges to + each reader thread. + + So when all the conditions are met, pgloader then starts as many + reader thread as the *concurrency* setting, and each reader thread + issues several queries with a `WHERE id >= x AND id < y`, where `y - + x = rows per range` or less (for the last range, depending on the + max value just obtained. + + - *rows per range* + + How many rows are fetched per `SELECT` query when using *multiple + readers per thread*, see above for details. + + - *SET MySQL PARAMETERS* + + The *SET MySQL PARAMETERS* allows setting MySQL parameters using the + MySQL `SET` command each time pgloader connects to it. + +MySQL Database Casting Rules +---------------------------- + +The command *CAST* introduces user-defined casting rules. + +The cast clause allows to specify custom casting rules, either to overload +the default casting rules or to amend them with special cases. + +A casting rule is expected to follow one of the forms:: + + type [ ... ] to [ or other required elements. + thead: [ 1, "
", "
" ], + col: [ 2, "", "
" ], + tr: [ 2, "", "
" ], + td: [ 3, "", "
" ], + + _default: [ 0, "", "" ] +}; + +// Support: IE <=9 only +wrapMap.optgroup = wrapMap.option; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + + +function getAll( context, tag ) { + + // Support: IE <=9 - 11 only + // Use typeof to avoid zero-argument method invocation on host objects (#15151) + var ret = typeof context.getElementsByTagName !== "undefined" ? + context.getElementsByTagName( tag || "*" ) : + typeof context.querySelectorAll !== "undefined" ? + context.querySelectorAll( tag || "*" ) : + []; + + return tag === undefined || tag && jQuery.nodeName( context, tag ) ? + jQuery.merge( [ context ], ret ) : + ret; +} + + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + dataPriv.set( + elems[ i ], + "globalEval", + !refElements || dataPriv.get( refElements[ i ], "globalEval" ) + ); + } +} + + +var rhtml = /<|&#?\w+;/; + +function buildFragment( elems, context, scripts, selection, ignored ) { + var elem, tmp, tag, wrap, contains, j, + fragment = context.createDocumentFragment(), + nodes = [], + i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( jQuery.type( elem ) === "object" ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); + + // Deserialize a standard representation + tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; + + // Descend through wrappers to the right content + j = wrap[ 0 ]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, tmp.childNodes ); + + // Remember the top-level container + tmp = fragment.firstChild; + + // Ensure the created nodes are orphaned (#12392) + tmp.textContent = ""; + } + } + } + + // Remove wrapper from fragment + fragment.textContent = ""; + + i = 0; + while ( ( elem = nodes[ i++ ] ) ) { + + // Skip elements already in the context collection (trac-4087) + if ( selection && jQuery.inArray( elem, selection ) > -1 ) { + if ( ignored ) { + ignored.push( elem ); + } + continue; + } + + contains = jQuery.contains( elem.ownerDocument, elem ); + + // Append to fragment + tmp = getAll( fragment.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( contains ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( ( elem = tmp[ j++ ] ) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + return fragment; +} + + +( function() { + var fragment = document.createDocumentFragment(), + div = fragment.appendChild( document.createElement( "div" ) ), + input = document.createElement( "input" ); + + // Support: Android 4.0 - 4.3 only + // Check state lost if the name is set (#11217) + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Android <=4.1 only + // Older WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE <=11 only + // Make sure textarea (and checkbox) defaultValue is properly cloned + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; +} )(); +var documentElement = document.documentElement; + + + +var + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +// Support: IE <=9 only +// See #13393 for more info +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +function on( elem, types, selector, data, fn, one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + on( elem, type, selector, data, types[ type ], one ); + } + return elem; + } + + if ( data == null && fn == null ) { + + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return elem; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return elem.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + } ); +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + + var handleObjIn, eventHandle, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.get( elem ); + + // Don't attach events to noData or text/comment nodes (but allow plain objects) + if ( !elemData ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Ensure that invalid selectors throw exceptions at attach time + // Evaluate against documentElement in case elem is a non-element node (e.g., document) + if ( selector ) { + jQuery.find.matchesSelector( documentElement, selector ); + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !( events = elemData.events ) ) { + events = elemData.events = {}; + } + if ( !( eventHandle = elemData.handle ) ) { + eventHandle = elemData.handle = function( e ) { + + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? + jQuery.event.dispatch.apply( elem, arguments ) : undefined; + }; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend( { + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join( "." ) + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !( handlers = events[ type ] ) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener if the special events handler returns false + if ( !special.setup || + special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var j, origCount, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); + + if ( !elemData || !( events = elemData.events ) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[ 2 ] && + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || + selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || + special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove data and the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + dataPriv.remove( elem, "handle events" ); + } + }, + + dispatch: function( nativeEvent ) { + + // Make a writable jQuery.Event from the native event object + var event = jQuery.event.fix( nativeEvent ); + + var i, j, ret, matched, handleObj, handlerQueue, + args = new Array( arguments.length ), + handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[ 0 ] = event; + + for ( i = 1; i < arguments.length; i++ ) { + args[ i ] = arguments[ i ]; + } + + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( ( handleObj = matched.handlers[ j++ ] ) && + !event.isImmediatePropagationStopped() ) { + + // Triggered event must either 1) have no namespace, or 2) have namespace(s) + // a subset or equal to those in the bound event (both can have no namespace). + if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || + handleObj.handler ).apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( ( event.result = ret ) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var i, matches, sel, handleObj, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Support: IE <=9 + // Find delegate handlers + // Black-hole SVG instance trees (#13180) + // + // Support: Firefox <=42 + // Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343) + if ( delegateCount && cur.nodeType && + ( event.type !== "click" || isNaN( event.button ) || event.button < 1 ) ) { + + for ( ; cur !== this; cur = cur.parentNode || this ) { + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && ( cur.disabled !== true || event.type !== "click" ) ) { + matches = []; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matches[ sel ] === undefined ) { + matches[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) > -1 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matches[ sel ] ) { + matches.push( handleObj ); + } + } + if ( matches.length ) { + handlerQueue.push( { elem: cur, handlers: matches } ); + } + } + } + } + + // Add the remaining (directly-bound) handlers + if ( delegateCount < handlers.length ) { + handlerQueue.push( { elem: this, handlers: handlers.slice( delegateCount ) } ); + } + + return handlerQueue; + }, + + addProp: function( name, hook ) { + Object.defineProperty( jQuery.Event.prototype, name, { + enumerable: true, + configurable: true, + + get: jQuery.isFunction( hook ) ? + function() { + if ( this.originalEvent ) { + return hook( this.originalEvent ); + } + } : + function() { + if ( this.originalEvent ) { + return this.originalEvent[ name ]; + } + }, + + set: function( value ) { + Object.defineProperty( this, name, { + enumerable: true, + configurable: true, + writable: true, + value: value + } ); + } + } ); + }, + + fix: function( originalEvent ) { + return originalEvent[ jQuery.expando ] ? + originalEvent : + new jQuery.Event( originalEvent ); + }, + + special: { + load: { + + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + focus: { + + // Fire native event if possible so blur/focus sequence is correct + trigger: function() { + if ( this !== safeActiveElement() && this.focus ) { + this.focus(); + return false; + } + }, + delegateType: "focusin" + }, + blur: { + trigger: function() { + if ( this === safeActiveElement() && this.blur ) { + this.blur(); + return false; + } + }, + delegateType: "focusout" + }, + click: { + + // For checkbox, fire native event so checked state will be right + trigger: function() { + if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) { + this.click(); + return false; + } + }, + + // For cross-browser consistency, don't fire native .click() on links + _default: function( event ) { + return jQuery.nodeName( event.target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + } +}; + +jQuery.removeEvent = function( elem, type, handle ) { + + // This "if" is needed for plain objects + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle ); + } +}; + +jQuery.Event = function( src, props ) { + + // Allow instantiation without the 'new' keyword + if ( !( this instanceof jQuery.Event ) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + + // Support: Android <=2.3 only + src.returnValue === false ? + returnTrue : + returnFalse; + + // Create target properties + // Support: Safari <=6 - 7 only + // Target should not be a text node (#504, #13143) + this.target = ( src.target && src.target.nodeType === 3 ) ? + src.target.parentNode : + src.target; + + this.currentTarget = src.currentTarget; + this.relatedTarget = src.relatedTarget; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + constructor: jQuery.Event, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + isSimulated: false, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + + if ( e && !this.isSimulated ) { + e.preventDefault(); + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopPropagation(); + } + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Includes all common event props including KeyEvent and MouseEvent specific props +jQuery.each( { + altKey: true, + bubbles: true, + cancelable: true, + changedTouches: true, + ctrlKey: true, + detail: true, + eventPhase: true, + metaKey: true, + pageX: true, + pageY: true, + shiftKey: true, + view: true, + "char": true, + charCode: true, + key: true, + keyCode: true, + button: true, + buttons: true, + clientX: true, + clientY: true, + offsetX: true, + offsetY: true, + pointerId: true, + pointerType: true, + screenX: true, + screenY: true, + targetTouches: true, + toElement: true, + touches: true, + + which: function( event ) { + var button = event.button; + + // Add which for key events + if ( event.which == null && rkeyEvent.test( event.type ) ) { + return event.charCode != null ? event.charCode : event.keyCode; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { + return ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); + } + + return event.which; + } +}, jQuery.event.addProp ); + +// Create mouseenter/leave events using mouseover/out and event-time checks +// so that event delegation works in jQuery. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +// +// Support: Safari 7 only +// Safari sends mouseenter too often; see: +// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 +// for the description of the bug (it existed in older Chrome versions as well). +jQuery.each( { + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mouseenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +} ); + +jQuery.fn.extend( { + + on: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn ); + }, + one: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? + handleObj.origType + "." + handleObj.namespace : + handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each( function() { + jQuery.event.remove( this, types, fn, selector ); + } ); + } +} ); + + +var + + /* eslint-disable max-len */ + + // See https://github.com/eslint/eslint/issues/3229 + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi, + + /* eslint-enable */ + + // Support: IE <=10 - 11, Edge 12 - 13 + // In IE/Edge using regex groups here causes severe slowdowns. + // See https://connect.microsoft.com/IE/feedback/details/1736512/ + rnoInnerhtml = /\s*$/g; + +function manipulationTarget( elem, content ) { + if ( jQuery.nodeName( elem, "table" ) && + jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { + + return elem.getElementsByTagName( "tbody" )[ 0 ] || elem; + } + + return elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + var match = rscriptTypeMasked.exec( elem.type ); + + if ( match ) { + elem.type = match[ 1 ]; + } else { + elem.removeAttribute( "type" ); + } + + return elem; +} + +function cloneCopyEvent( src, dest ) { + var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; + + if ( dest.nodeType !== 1 ) { + return; + } + + // 1. Copy private data: events, handlers, etc. + if ( dataPriv.hasData( src ) ) { + pdataOld = dataPriv.access( src ); + pdataCur = dataPriv.set( dest, pdataOld ); + events = pdataOld.events; + + if ( events ) { + delete pdataCur.handle; + pdataCur.events = {}; + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + } + + // 2. Copy user data + if ( dataUser.hasData( src ) ) { + udataOld = dataUser.access( src ); + udataCur = jQuery.extend( {}, udataOld ); + + dataUser.set( dest, udataCur ); + } +} + +// Fix IE bugs, see support tests +function fixInput( src, dest ) { + var nodeName = dest.nodeName.toLowerCase(); + + // Fails to persist the checked state of a cloned checkbox or radio button. + if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + dest.checked = src.checked; + + // Fails to return the selected option to the default selected state when cloning options + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +function domManip( collection, args, callback, ignored ) { + + // Flatten any nested arrays + args = concat.apply( [], args ); + + var fragment, first, scripts, hasScripts, node, doc, + i = 0, + l = collection.length, + iNoClone = l - 1, + value = args[ 0 ], + isFunction = jQuery.isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( isFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return collection.each( function( index ) { + var self = collection.eq( index ); + if ( isFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + domManip( self, args, callback, ignored ); + } ); + } + + if ( l ) { + fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + // Require either new content or an interest in ignored elements to invoke the callback + if ( first || ignored ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item + // instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( collection[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !dataPriv.access( node, "globalEval" ) && + jQuery.contains( doc, node ) ) { + + if ( node.src ) { + + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl ) { + jQuery._evalUrl( node.src ); + } + } else { + DOMEval( node.textContent.replace( rcleanScript, "" ), doc ); + } + } + } + } + } + } + + return collection; +} + +function remove( elem, selector, keepData ) { + var node, + nodes = selector ? jQuery.filter( selector, elem ) : elem, + i = 0; + + for ( ; ( node = nodes[ i ] ) != null; i++ ) { + if ( !keepData && node.nodeType === 1 ) { + jQuery.cleanData( getAll( node ) ); + } + + if ( node.parentNode ) { + if ( keepData && jQuery.contains( node.ownerDocument, node ) ) { + setGlobalEval( getAll( node, "script" ) ); + } + node.parentNode.removeChild( node ); + } + } + + return elem; +} + +jQuery.extend( { + htmlPrefilter: function( html ) { + return html.replace( rxhtmlTag, "<$1>" ); + }, + + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var i, l, srcElements, destElements, + clone = elem.cloneNode( true ), + inPage = jQuery.contains( elem.ownerDocument, elem ); + + // Fix IE cloning issues + if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && + !jQuery.isXMLDoc( elem ) ) { + + // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + fixInput( srcElements[ i ], destElements[ i ] ); + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + cloneCopyEvent( srcElements[ i ], destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + // Return the cloned set + return clone; + }, + + cleanData: function( elems ) { + var data, elem, type, + special = jQuery.event.special, + i = 0; + + for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { + if ( acceptData( elem ) ) { + if ( ( data = elem[ dataPriv.expando ] ) ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataPriv.expando ] = undefined; + } + if ( elem[ dataUser.expando ] ) { + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataUser.expando ] = undefined; + } + } + } + } +} ); + +jQuery.fn.extend( { + detach: function( selector ) { + return remove( this, selector, true ); + }, + + remove: function( selector ) { + return remove( this, selector ); + }, + + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().each( function() { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + this.textContent = value; + } + } ); + }, null, value, arguments.length ); + }, + + append: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + } ); + }, + + prepend: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + } ); + }, + + before: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + } ); + }, + + after: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + } ); + }, + + empty: function() { + var elem, + i = 0; + + for ( ; ( elem = this[ i ] ) != null; i++ ) { + if ( elem.nodeType === 1 ) { + + // Prevent memory leaks + jQuery.cleanData( getAll( elem, false ) ); + + // Remove any remaining nodes + elem.textContent = ""; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + } ); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined && elem.nodeType === 1 ) { + return elem.innerHTML; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = jQuery.htmlPrefilter( value ); + + try { + for ( ; i < l; i++ ) { + elem = this[ i ] || {}; + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch ( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var ignored = []; + + // Make the changes, replacing each non-ignored context element with the new content + return domManip( this, arguments, function( elem ) { + var parent = this.parentNode; + + if ( jQuery.inArray( this, ignored ) < 0 ) { + jQuery.cleanData( getAll( this ) ); + if ( parent ) { + parent.replaceChild( elem, this ); + } + } + + // Force callback invocation + }, ignored ); + } +} ); + +jQuery.each( { + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1, + i = 0; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Support: Android <=4.0 only, PhantomJS 1 only + // .get() because push.apply(_, arraylike) throws on ancient WebKit + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +} ); +var rmargin = ( /^margin/ ); + +var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); + +var getStyles = function( elem ) { + + // Support: IE <=11 only, Firefox <=30 (#15098, #14150) + // IE throws on elements created in popups + // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" + var view = elem.ownerDocument.defaultView; + + if ( !view || !view.opener ) { + view = window; + } + + return view.getComputedStyle( elem ); + }; + + + +( function() { + + // Executing both pixelPosition & boxSizingReliable tests require only one layout + // so they're executed at the same time to save the second computation. + function computeStyleTests() { + + // This is a singleton, we need to execute it only once + if ( !div ) { + return; + } + + div.style.cssText = + "box-sizing:border-box;" + + "position:relative;display:block;" + + "margin:auto;border:1px;padding:1px;" + + "top:1%;width:50%"; + div.innerHTML = ""; + documentElement.appendChild( container ); + + var divStyle = window.getComputedStyle( div ); + pixelPositionVal = divStyle.top !== "1%"; + + // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 + reliableMarginLeftVal = divStyle.marginLeft === "2px"; + boxSizingReliableVal = divStyle.width === "4px"; + + // Support: Android 4.0 - 4.3 only + // Some styles come back with percentage values, even though they shouldn't + div.style.marginRight = "50%"; + pixelMarginRightVal = divStyle.marginRight === "4px"; + + documentElement.removeChild( container ); + + // Nullify the div so it wouldn't be stored in the memory and + // it will also be a sign that checks already performed + div = null; + } + + var pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal, + container = document.createElement( "div" ), + div = document.createElement( "div" ); + + // Finish early in limited (non-browser) environments + if ( !div.style ) { + return; + } + + // Support: IE <=9 - 11 only + // Style of cloned element affects source element cloned (#8908) + div.style.backgroundClip = "content-box"; + div.cloneNode( true ).style.backgroundClip = ""; + support.clearCloneStyle = div.style.backgroundClip === "content-box"; + + container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" + + "padding:0;margin-top:1px;position:absolute"; + container.appendChild( div ); + + jQuery.extend( support, { + pixelPosition: function() { + computeStyleTests(); + return pixelPositionVal; + }, + boxSizingReliable: function() { + computeStyleTests(); + return boxSizingReliableVal; + }, + pixelMarginRight: function() { + computeStyleTests(); + return pixelMarginRightVal; + }, + reliableMarginLeft: function() { + computeStyleTests(); + return reliableMarginLeftVal; + } + } ); +} )(); + + +function curCSS( elem, name, computed ) { + var width, minWidth, maxWidth, ret, + style = elem.style; + + computed = computed || getStyles( elem ); + + // Support: IE <=9 only + // getPropertyValue is only needed for .css('filter') (#12537) + if ( computed ) { + ret = computed.getPropertyValue( name ) || computed[ name ]; + + if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { + ret = jQuery.style( elem, name ); + } + + // A tribute to the "awesome hack by Dean Edwards" + // Android Browser returns percentage for some values, + // but width seems to be reliably pixels. + // This is against the CSSOM draft spec: + // https://drafts.csswg.org/cssom/#resolved-values + if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) { + + // Remember the original values + width = style.width; + minWidth = style.minWidth; + maxWidth = style.maxWidth; + + // Put in the new values to get a computed value out + style.minWidth = style.maxWidth = style.width = ret; + ret = computed.width; + + // Revert the changed values + style.width = width; + style.minWidth = minWidth; + style.maxWidth = maxWidth; + } + } + + return ret !== undefined ? + + // Support: IE <=9 - 11 only + // IE returns zIndex value as an integer. + ret + "" : + ret; +} + + +function addGetHookIf( conditionFn, hookFn ) { + + // Define the hook, we'll check on the first run if it's really needed. + return { + get: function() { + if ( conditionFn() ) { + + // Hook not needed (or it's not possible to use it due + // to missing dependency), remove it. + delete this.get; + return; + } + + // Hook needed; redefine it so that the support test is not executed again. + return ( this.get = hookFn ).apply( this, arguments ); + } + }; +} + + +var + + // Swappable if display is none or starts with table + // except "table", "table-cell", or "table-caption" + // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display + rdisplayswap = /^(none|table(?!-c[ea]).+)/, + cssShow = { position: "absolute", visibility: "hidden", display: "block" }, + cssNormalTransform = { + letterSpacing: "0", + fontWeight: "400" + }, + + cssPrefixes = [ "Webkit", "Moz", "ms" ], + emptyStyle = document.createElement( "div" ).style; + +// Return a css property mapped to a potentially vendor prefixed property +function vendorPropName( name ) { + + // Shortcut for names that are not vendor prefixed + if ( name in emptyStyle ) { + return name; + } + + // Check for vendor prefixed names + var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), + i = cssPrefixes.length; + + while ( i-- ) { + name = cssPrefixes[ i ] + capName; + if ( name in emptyStyle ) { + return name; + } + } +} + +function setPositiveNumber( elem, value, subtract ) { + + // Any relative (+/-) values have already been + // normalized at this point + var matches = rcssNum.exec( value ); + return matches ? + + // Guard against undefined "subtract", e.g., when used as in cssHooks + Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : + value; +} + +function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) { + var i = extra === ( isBorderBox ? "border" : "content" ) ? + + // If we already have the right measurement, avoid augmentation + 4 : + + // Otherwise initialize for horizontal or vertical properties + name === "width" ? 1 : 0, + + val = 0; + + for ( ; i < 4; i += 2 ) { + + // Both box models exclude margin, so add it if we want it + if ( extra === "margin" ) { + val += jQuery.css( elem, extra + cssExpand[ i ], true, styles ); + } + + if ( isBorderBox ) { + + // border-box includes padding, so remove it if we want content + if ( extra === "content" ) { + val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + } + + // At this point, extra isn't border nor margin, so remove border + if ( extra !== "margin" ) { + val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } else { + + // At this point, extra isn't content, so add padding + val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + + // At this point, extra isn't content nor padding, so add border + if ( extra !== "padding" ) { + val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } + } + + return val; +} + +function getWidthOrHeight( elem, name, extra ) { + + // Start with offset property, which is equivalent to the border-box value + var val, + valueIsBorderBox = true, + styles = getStyles( elem ), + isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; + + // Support: IE <=11 only + // Running getBoundingClientRect on a disconnected node + // in IE throws an error. + if ( elem.getClientRects().length ) { + val = elem.getBoundingClientRect()[ name ]; + } + + // Some non-html elements return undefined for offsetWidth, so check for null/undefined + // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285 + // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668 + if ( val <= 0 || val == null ) { + + // Fall back to computed then uncomputed css if necessary + val = curCSS( elem, name, styles ); + if ( val < 0 || val == null ) { + val = elem.style[ name ]; + } + + // Computed unit is not pixels. Stop here and return. + if ( rnumnonpx.test( val ) ) { + return val; + } + + // Check for style in case a browser which returns unreliable values + // for getComputedStyle silently falls back to the reliable elem.style + valueIsBorderBox = isBorderBox && + ( support.boxSizingReliable() || val === elem.style[ name ] ); + + // Normalize "", auto, and prepare for extra + val = parseFloat( val ) || 0; + } + + // Use the active box-sizing model to add/subtract irrelevant styles + return ( val + + augmentWidthOrHeight( + elem, + name, + extra || ( isBorderBox ? "border" : "content" ), + valueIsBorderBox, + styles + ) + ) + "px"; +} + +jQuery.extend( { + + // Add in style property hooks for overriding the default + // behavior of getting and setting a style property + cssHooks: { + opacity: { + get: function( elem, computed ) { + if ( computed ) { + + // We should always get a number back from opacity + var ret = curCSS( elem, "opacity" ); + return ret === "" ? "1" : ret; + } + } + } + }, + + // Don't automatically add "px" to these possibly-unitless properties + cssNumber: { + "animationIterationCount": true, + "columnCount": true, + "fillOpacity": true, + "flexGrow": true, + "flexShrink": true, + "fontWeight": true, + "lineHeight": true, + "opacity": true, + "order": true, + "orphans": true, + "widows": true, + "zIndex": true, + "zoom": true + }, + + // Add in properties whose names you wish to fix before + // setting or getting the value + cssProps: { + "float": "cssFloat" + }, + + // Get and set the style property on a DOM Node + style: function( elem, name, value, extra ) { + + // Don't set styles on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { + return; + } + + // Make sure that we're working with the right name + var ret, type, hooks, + origName = jQuery.camelCase( name ), + style = elem.style; + + name = jQuery.cssProps[ origName ] || + ( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName ); + + // Gets hook for the prefixed version, then unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // Check if we're setting a value + if ( value !== undefined ) { + type = typeof value; + + // Convert "+=" or "-=" to relative numbers (#7345) + if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { + value = adjustCSS( elem, name, ret ); + + // Fixes bug #9237 + type = "number"; + } + + // Make sure that null and NaN values aren't set (#7116) + if ( value == null || value !== value ) { + return; + } + + // If a number was passed in, add the unit (except for certain CSS properties) + if ( type === "number" ) { + value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); + } + + // background-* props affect original clone's values + if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { + style[ name ] = "inherit"; + } + + // If a hook was provided, use that value, otherwise just set the specified value + if ( !hooks || !( "set" in hooks ) || + ( value = hooks.set( elem, value, extra ) ) !== undefined ) { + + style[ name ] = value; + } + + } else { + + // If a hook was provided get the non-computed value from there + if ( hooks && "get" in hooks && + ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { + + return ret; + } + + // Otherwise just get the value from the style object + return style[ name ]; + } + }, + + css: function( elem, name, extra, styles ) { + var val, num, hooks, + origName = jQuery.camelCase( name ); + + // Make sure that we're working with the right name + name = jQuery.cssProps[ origName ] || + ( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName ); + + // Try prefixed name followed by the unprefixed name + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // If a hook was provided get the computed value from there + if ( hooks && "get" in hooks ) { + val = hooks.get( elem, true, extra ); + } + + // Otherwise, if a way to get the computed value exists, use that + if ( val === undefined ) { + val = curCSS( elem, name, styles ); + } + + // Convert "normal" to computed value + if ( val === "normal" && name in cssNormalTransform ) { + val = cssNormalTransform[ name ]; + } + + // Make numeric if forced or a qualifier was provided and val looks numeric + if ( extra === "" || extra ) { + num = parseFloat( val ); + return extra === true || isFinite( num ) ? num || 0 : val; + } + return val; + } +} ); + +jQuery.each( [ "height", "width" ], function( i, name ) { + jQuery.cssHooks[ name ] = { + get: function( elem, computed, extra ) { + if ( computed ) { + + // Certain elements can have dimension info if we invisibly show them + // but it must have a current display style that would benefit + return rdisplayswap.test( jQuery.css( elem, "display" ) ) && + + // Support: Safari 8+ + // Table columns in Safari have non-zero offsetWidth & zero + // getBoundingClientRect().width unless display is changed. + // Support: IE <=11 only + // Running getBoundingClientRect on a disconnected node + // in IE throws an error. + ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? + swap( elem, cssShow, function() { + return getWidthOrHeight( elem, name, extra ); + } ) : + getWidthOrHeight( elem, name, extra ); + } + }, + + set: function( elem, value, extra ) { + var matches, + styles = extra && getStyles( elem ), + subtract = extra && augmentWidthOrHeight( + elem, + name, + extra, + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + styles + ); + + // Convert to pixels if value adjustment is needed + if ( subtract && ( matches = rcssNum.exec( value ) ) && + ( matches[ 3 ] || "px" ) !== "px" ) { + + elem.style[ name ] = value; + value = jQuery.css( elem, name ); + } + + return setPositiveNumber( elem, value, subtract ); + } + }; +} ); + +jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, + function( elem, computed ) { + if ( computed ) { + return ( parseFloat( curCSS( elem, "marginLeft" ) ) || + elem.getBoundingClientRect().left - + swap( elem, { marginLeft: 0 }, function() { + return elem.getBoundingClientRect().left; + } ) + ) + "px"; + } + } +); + +// These hooks are used by animate to expand properties +jQuery.each( { + margin: "", + padding: "", + border: "Width" +}, function( prefix, suffix ) { + jQuery.cssHooks[ prefix + suffix ] = { + expand: function( value ) { + var i = 0, + expanded = {}, + + // Assumes a single number if not a string + parts = typeof value === "string" ? value.split( " " ) : [ value ]; + + for ( ; i < 4; i++ ) { + expanded[ prefix + cssExpand[ i ] + suffix ] = + parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; + } + + return expanded; + } + }; + + if ( !rmargin.test( prefix ) ) { + jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; + } +} ); + +jQuery.fn.extend( { + css: function( name, value ) { + return access( this, function( elem, name, value ) { + var styles, len, + map = {}, + i = 0; + + if ( jQuery.isArray( name ) ) { + styles = getStyles( elem ); + len = name.length; + + for ( ; i < len; i++ ) { + map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); + } + + return map; + } + + return value !== undefined ? + jQuery.style( elem, name, value ) : + jQuery.css( elem, name ); + }, name, value, arguments.length > 1 ); + } +} ); + + +function Tween( elem, options, prop, end, easing ) { + return new Tween.prototype.init( elem, options, prop, end, easing ); +} +jQuery.Tween = Tween; + +Tween.prototype = { + constructor: Tween, + init: function( elem, options, prop, end, easing, unit ) { + this.elem = elem; + this.prop = prop; + this.easing = easing || jQuery.easing._default; + this.options = options; + this.start = this.now = this.cur(); + this.end = end; + this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); + }, + cur: function() { + var hooks = Tween.propHooks[ this.prop ]; + + return hooks && hooks.get ? + hooks.get( this ) : + Tween.propHooks._default.get( this ); + }, + run: function( percent ) { + var eased, + hooks = Tween.propHooks[ this.prop ]; + + if ( this.options.duration ) { + this.pos = eased = jQuery.easing[ this.easing ]( + percent, this.options.duration * percent, 0, 1, this.options.duration + ); + } else { + this.pos = eased = percent; + } + this.now = ( this.end - this.start ) * eased + this.start; + + if ( this.options.step ) { + this.options.step.call( this.elem, this.now, this ); + } + + if ( hooks && hooks.set ) { + hooks.set( this ); + } else { + Tween.propHooks._default.set( this ); + } + return this; + } +}; + +Tween.prototype.init.prototype = Tween.prototype; + +Tween.propHooks = { + _default: { + get: function( tween ) { + var result; + + // Use a property on the element directly when it is not a DOM element, + // or when there is no matching style property that exists. + if ( tween.elem.nodeType !== 1 || + tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { + return tween.elem[ tween.prop ]; + } + + // Passing an empty string as a 3rd parameter to .css will automatically + // attempt a parseFloat and fallback to a string if the parse fails. + // Simple values such as "10px" are parsed to Float; + // complex values such as "rotate(1rad)" are returned as-is. + result = jQuery.css( tween.elem, tween.prop, "" ); + + // Empty strings, null, undefined and "auto" are converted to 0. + return !result || result === "auto" ? 0 : result; + }, + set: function( tween ) { + + // Use step hook for back compat. + // Use cssHook if its there. + // Use .style if available and use plain properties where available. + if ( jQuery.fx.step[ tween.prop ] ) { + jQuery.fx.step[ tween.prop ]( tween ); + } else if ( tween.elem.nodeType === 1 && + ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || + jQuery.cssHooks[ tween.prop ] ) ) { + jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); + } else { + tween.elem[ tween.prop ] = tween.now; + } + } + } +}; + +// Support: IE <=9 only +// Panic based approach to setting things on disconnected nodes +Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { + set: function( tween ) { + if ( tween.elem.nodeType && tween.elem.parentNode ) { + tween.elem[ tween.prop ] = tween.now; + } + } +}; + +jQuery.easing = { + linear: function( p ) { + return p; + }, + swing: function( p ) { + return 0.5 - Math.cos( p * Math.PI ) / 2; + }, + _default: "swing" +}; + +jQuery.fx = Tween.prototype.init; + +// Back compat <1.8 extension point +jQuery.fx.step = {}; + + + + +var + fxNow, timerId, + rfxtypes = /^(?:toggle|show|hide)$/, + rrun = /queueHooks$/; + +function raf() { + if ( timerId ) { + window.requestAnimationFrame( raf ); + jQuery.fx.tick(); + } +} + +// Animations created synchronously will run synchronously +function createFxNow() { + window.setTimeout( function() { + fxNow = undefined; + } ); + return ( fxNow = jQuery.now() ); +} + +// Generate parameters to create a standard animation +function genFx( type, includeWidth ) { + var which, + i = 0, + attrs = { height: type }; + + // If we include width, step value is 1 to do all cssExpand values, + // otherwise step value is 2 to skip over Left and Right + includeWidth = includeWidth ? 1 : 0; + for ( ; i < 4; i += 2 - includeWidth ) { + which = cssExpand[ i ]; + attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; + } + + if ( includeWidth ) { + attrs.opacity = attrs.width = type; + } + + return attrs; +} + +function createTween( value, prop, animation ) { + var tween, + collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), + index = 0, + length = collection.length; + for ( ; index < length; index++ ) { + if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { + + // We're done with this property + return tween; + } + } +} + +function defaultPrefilter( elem, props, opts ) { + var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, + isBox = "width" in props || "height" in props, + anim = this, + orig = {}, + style = elem.style, + hidden = elem.nodeType && isHiddenWithinTree( elem ), + dataShow = dataPriv.get( elem, "fxshow" ); + + // Queue-skipping animations hijack the fx hooks + if ( !opts.queue ) { + hooks = jQuery._queueHooks( elem, "fx" ); + if ( hooks.unqueued == null ) { + hooks.unqueued = 0; + oldfire = hooks.empty.fire; + hooks.empty.fire = function() { + if ( !hooks.unqueued ) { + oldfire(); + } + }; + } + hooks.unqueued++; + + anim.always( function() { + + // Ensure the complete handler is called before this completes + anim.always( function() { + hooks.unqueued--; + if ( !jQuery.queue( elem, "fx" ).length ) { + hooks.empty.fire(); + } + } ); + } ); + } + + // Detect show/hide animations + for ( prop in props ) { + value = props[ prop ]; + if ( rfxtypes.test( value ) ) { + delete props[ prop ]; + toggle = toggle || value === "toggle"; + if ( value === ( hidden ? "hide" : "show" ) ) { + + // Pretend to be hidden if this is a "show" and + // there is still data from a stopped show/hide + if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { + hidden = true; + + // Ignore all other no-op show/hide data + } else { + continue; + } + } + orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); + } + } + + // Bail out if this is a no-op like .hide().hide() + propTween = !jQuery.isEmptyObject( props ); + if ( !propTween && jQuery.isEmptyObject( orig ) ) { + return; + } + + // Restrict "overflow" and "display" styles during box animations + if ( isBox && elem.nodeType === 1 ) { + + // Support: IE <=9 - 11, Edge 12 - 13 + // Record all 3 overflow attributes because IE does not infer the shorthand + // from identically-valued overflowX and overflowY + opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; + + // Identify a display type, preferring old show/hide data over the CSS cascade + restoreDisplay = dataShow && dataShow.display; + if ( restoreDisplay == null ) { + restoreDisplay = dataPriv.get( elem, "display" ); + } + display = jQuery.css( elem, "display" ); + if ( display === "none" ) { + if ( restoreDisplay ) { + display = restoreDisplay; + } else { + + // Get nonempty value(s) by temporarily forcing visibility + showHide( [ elem ], true ); + restoreDisplay = elem.style.display || restoreDisplay; + display = jQuery.css( elem, "display" ); + showHide( [ elem ] ); + } + } + + // Animate inline elements as inline-block + if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { + if ( jQuery.css( elem, "float" ) === "none" ) { + + // Restore the original display value at the end of pure show/hide animations + if ( !propTween ) { + anim.done( function() { + style.display = restoreDisplay; + } ); + if ( restoreDisplay == null ) { + display = style.display; + restoreDisplay = display === "none" ? "" : display; + } + } + style.display = "inline-block"; + } + } + } + + if ( opts.overflow ) { + style.overflow = "hidden"; + anim.always( function() { + style.overflow = opts.overflow[ 0 ]; + style.overflowX = opts.overflow[ 1 ]; + style.overflowY = opts.overflow[ 2 ]; + } ); + } + + // Implement show/hide animations + propTween = false; + for ( prop in orig ) { + + // General show/hide setup for this element animation + if ( !propTween ) { + if ( dataShow ) { + if ( "hidden" in dataShow ) { + hidden = dataShow.hidden; + } + } else { + dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); + } + + // Store hidden/visible for toggle so `.stop().toggle()` "reverses" + if ( toggle ) { + dataShow.hidden = !hidden; + } + + // Show elements before animating them + if ( hidden ) { + showHide( [ elem ], true ); + } + + /* eslint-disable no-loop-func */ + + anim.done( function() { + + /* eslint-enable no-loop-func */ + + // The final step of a "hide" animation is actually hiding the element + if ( !hidden ) { + showHide( [ elem ] ); + } + dataPriv.remove( elem, "fxshow" ); + for ( prop in orig ) { + jQuery.style( elem, prop, orig[ prop ] ); + } + } ); + } + + // Per-property setup + propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); + if ( !( prop in dataShow ) ) { + dataShow[ prop ] = propTween.start; + if ( hidden ) { + propTween.end = propTween.start; + propTween.start = 0; + } + } + } +} + +function propFilter( props, specialEasing ) { + var index, name, easing, value, hooks; + + // camelCase, specialEasing and expand cssHook pass + for ( index in props ) { + name = jQuery.camelCase( index ); + easing = specialEasing[ name ]; + value = props[ index ]; + if ( jQuery.isArray( value ) ) { + easing = value[ 1 ]; + value = props[ index ] = value[ 0 ]; + } + + if ( index !== name ) { + props[ name ] = value; + delete props[ index ]; + } + + hooks = jQuery.cssHooks[ name ]; + if ( hooks && "expand" in hooks ) { + value = hooks.expand( value ); + delete props[ name ]; + + // Not quite $.extend, this won't overwrite existing keys. + // Reusing 'index' because we have the correct "name" + for ( index in value ) { + if ( !( index in props ) ) { + props[ index ] = value[ index ]; + specialEasing[ index ] = easing; + } + } + } else { + specialEasing[ name ] = easing; + } + } +} + +function Animation( elem, properties, options ) { + var result, + stopped, + index = 0, + length = Animation.prefilters.length, + deferred = jQuery.Deferred().always( function() { + + // Don't match elem in the :animated selector + delete tick.elem; + } ), + tick = function() { + if ( stopped ) { + return false; + } + var currentTime = fxNow || createFxNow(), + remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), + + // Support: Android 2.3 only + // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) + temp = remaining / animation.duration || 0, + percent = 1 - temp, + index = 0, + length = animation.tweens.length; + + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( percent ); + } + + deferred.notifyWith( elem, [ animation, percent, remaining ] ); + + if ( percent < 1 && length ) { + return remaining; + } else { + deferred.resolveWith( elem, [ animation ] ); + return false; + } + }, + animation = deferred.promise( { + elem: elem, + props: jQuery.extend( {}, properties ), + opts: jQuery.extend( true, { + specialEasing: {}, + easing: jQuery.easing._default + }, options ), + originalProperties: properties, + originalOptions: options, + startTime: fxNow || createFxNow(), + duration: options.duration, + tweens: [], + createTween: function( prop, end ) { + var tween = jQuery.Tween( elem, animation.opts, prop, end, + animation.opts.specialEasing[ prop ] || animation.opts.easing ); + animation.tweens.push( tween ); + return tween; + }, + stop: function( gotoEnd ) { + var index = 0, + + // If we are going to the end, we want to run all the tweens + // otherwise we skip this part + length = gotoEnd ? animation.tweens.length : 0; + if ( stopped ) { + return this; + } + stopped = true; + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( 1 ); + } + + // Resolve when we played the last frame; otherwise, reject + if ( gotoEnd ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + deferred.resolveWith( elem, [ animation, gotoEnd ] ); + } else { + deferred.rejectWith( elem, [ animation, gotoEnd ] ); + } + return this; + } + } ), + props = animation.props; + + propFilter( props, animation.opts.specialEasing ); + + for ( ; index < length; index++ ) { + result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); + if ( result ) { + if ( jQuery.isFunction( result.stop ) ) { + jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = + jQuery.proxy( result.stop, result ); + } + return result; + } + } + + jQuery.map( props, createTween, animation ); + + if ( jQuery.isFunction( animation.opts.start ) ) { + animation.opts.start.call( elem, animation ); + } + + jQuery.fx.timer( + jQuery.extend( tick, { + elem: elem, + anim: animation, + queue: animation.opts.queue + } ) + ); + + // attach callbacks from options + return animation.progress( animation.opts.progress ) + .done( animation.opts.done, animation.opts.complete ) + .fail( animation.opts.fail ) + .always( animation.opts.always ); +} + +jQuery.Animation = jQuery.extend( Animation, { + + tweeners: { + "*": [ function( prop, value ) { + var tween = this.createTween( prop, value ); + adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); + return tween; + } ] + }, + + tweener: function( props, callback ) { + if ( jQuery.isFunction( props ) ) { + callback = props; + props = [ "*" ]; + } else { + props = props.match( rnotwhite ); + } + + var prop, + index = 0, + length = props.length; + + for ( ; index < length; index++ ) { + prop = props[ index ]; + Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; + Animation.tweeners[ prop ].unshift( callback ); + } + }, + + prefilters: [ defaultPrefilter ], + + prefilter: function( callback, prepend ) { + if ( prepend ) { + Animation.prefilters.unshift( callback ); + } else { + Animation.prefilters.push( callback ); + } + } +} ); + +jQuery.speed = function( speed, easing, fn ) { + var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { + complete: fn || !fn && easing || + jQuery.isFunction( speed ) && speed, + duration: speed, + easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing + }; + + // Go to the end state if fx are off or if document is hidden + if ( jQuery.fx.off || document.hidden ) { + opt.duration = 0; + + } else { + opt.duration = typeof opt.duration === "number" ? + opt.duration : opt.duration in jQuery.fx.speeds ? + jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default; + } + + // Normalize opt.queue - true/undefined/null -> "fx" + if ( opt.queue == null || opt.queue === true ) { + opt.queue = "fx"; + } + + // Queueing + opt.old = opt.complete; + + opt.complete = function() { + if ( jQuery.isFunction( opt.old ) ) { + opt.old.call( this ); + } + + if ( opt.queue ) { + jQuery.dequeue( this, opt.queue ); + } + }; + + return opt; +}; + +jQuery.fn.extend( { + fadeTo: function( speed, to, easing, callback ) { + + // Show any hidden elements after setting opacity to 0 + return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() + + // Animate to the value specified + .end().animate( { opacity: to }, speed, easing, callback ); + }, + animate: function( prop, speed, easing, callback ) { + var empty = jQuery.isEmptyObject( prop ), + optall = jQuery.speed( speed, easing, callback ), + doAnimation = function() { + + // Operate on a copy of prop so per-property easing won't be lost + var anim = Animation( this, jQuery.extend( {}, prop ), optall ); + + // Empty animations, or finishing resolves immediately + if ( empty || dataPriv.get( this, "finish" ) ) { + anim.stop( true ); + } + }; + doAnimation.finish = doAnimation; + + return empty || optall.queue === false ? + this.each( doAnimation ) : + this.queue( optall.queue, doAnimation ); + }, + stop: function( type, clearQueue, gotoEnd ) { + var stopQueue = function( hooks ) { + var stop = hooks.stop; + delete hooks.stop; + stop( gotoEnd ); + }; + + if ( typeof type !== "string" ) { + gotoEnd = clearQueue; + clearQueue = type; + type = undefined; + } + if ( clearQueue && type !== false ) { + this.queue( type || "fx", [] ); + } + + return this.each( function() { + var dequeue = true, + index = type != null && type + "queueHooks", + timers = jQuery.timers, + data = dataPriv.get( this ); + + if ( index ) { + if ( data[ index ] && data[ index ].stop ) { + stopQueue( data[ index ] ); + } + } else { + for ( index in data ) { + if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { + stopQueue( data[ index ] ); + } + } + } + + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && + ( type == null || timers[ index ].queue === type ) ) { + + timers[ index ].anim.stop( gotoEnd ); + dequeue = false; + timers.splice( index, 1 ); + } + } + + // Start the next in the queue if the last step wasn't forced. + // Timers currently will call their complete callbacks, which + // will dequeue but only if they were gotoEnd. + if ( dequeue || !gotoEnd ) { + jQuery.dequeue( this, type ); + } + } ); + }, + finish: function( type ) { + if ( type !== false ) { + type = type || "fx"; + } + return this.each( function() { + var index, + data = dataPriv.get( this ), + queue = data[ type + "queue" ], + hooks = data[ type + "queueHooks" ], + timers = jQuery.timers, + length = queue ? queue.length : 0; + + // Enable finishing flag on private data + data.finish = true; + + // Empty the queue first + jQuery.queue( this, type, [] ); + + if ( hooks && hooks.stop ) { + hooks.stop.call( this, true ); + } + + // Look for any active animations, and finish them + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && timers[ index ].queue === type ) { + timers[ index ].anim.stop( true ); + timers.splice( index, 1 ); + } + } + + // Look for any animations in the old queue and finish them + for ( index = 0; index < length; index++ ) { + if ( queue[ index ] && queue[ index ].finish ) { + queue[ index ].finish.call( this ); + } + } + + // Turn off finishing flag + delete data.finish; + } ); + } +} ); + +jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) { + var cssFn = jQuery.fn[ name ]; + jQuery.fn[ name ] = function( speed, easing, callback ) { + return speed == null || typeof speed === "boolean" ? + cssFn.apply( this, arguments ) : + this.animate( genFx( name, true ), speed, easing, callback ); + }; +} ); + +// Generate shortcuts for custom animations +jQuery.each( { + slideDown: genFx( "show" ), + slideUp: genFx( "hide" ), + slideToggle: genFx( "toggle" ), + fadeIn: { opacity: "show" }, + fadeOut: { opacity: "hide" }, + fadeToggle: { opacity: "toggle" } +}, function( name, props ) { + jQuery.fn[ name ] = function( speed, easing, callback ) { + return this.animate( props, speed, easing, callback ); + }; +} ); + +jQuery.timers = []; +jQuery.fx.tick = function() { + var timer, + i = 0, + timers = jQuery.timers; + + fxNow = jQuery.now(); + + for ( ; i < timers.length; i++ ) { + timer = timers[ i ]; + + // Checks the timer has not already been removed + if ( !timer() && timers[ i ] === timer ) { + timers.splice( i--, 1 ); + } + } + + if ( !timers.length ) { + jQuery.fx.stop(); + } + fxNow = undefined; +}; + +jQuery.fx.timer = function( timer ) { + jQuery.timers.push( timer ); + if ( timer() ) { + jQuery.fx.start(); + } else { + jQuery.timers.pop(); + } +}; + +jQuery.fx.interval = 13; +jQuery.fx.start = function() { + if ( !timerId ) { + timerId = window.requestAnimationFrame ? + window.requestAnimationFrame( raf ) : + window.setInterval( jQuery.fx.tick, jQuery.fx.interval ); + } +}; + +jQuery.fx.stop = function() { + if ( window.cancelAnimationFrame ) { + window.cancelAnimationFrame( timerId ); + } else { + window.clearInterval( timerId ); + } + + timerId = null; +}; + +jQuery.fx.speeds = { + slow: 600, + fast: 200, + + // Default speed + _default: 400 +}; + + +// Based off of the plugin by Clint Helfers, with permission. +// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ +jQuery.fn.delay = function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, hooks ) { + var timeout = window.setTimeout( next, time ); + hooks.stop = function() { + window.clearTimeout( timeout ); + }; + } ); +}; + + +( function() { + var input = document.createElement( "input" ), + select = document.createElement( "select" ), + opt = select.appendChild( document.createElement( "option" ) ); + + input.type = "checkbox"; + + // Support: Android <=4.3 only + // Default value for a checkbox should be "on" + support.checkOn = input.value !== ""; + + // Support: IE <=11 only + // Must access selectedIndex to make default options select + support.optSelected = opt.selected; + + // Support: IE <=11 only + // An input loses its value after becoming a radio + input = document.createElement( "input" ); + input.value = "t"; + input.type = "radio"; + support.radioValue = input.value === "t"; +} )(); + + +var boolHook, + attrHandle = jQuery.expr.attrHandle; + +jQuery.fn.extend( { + attr: function( name, value ) { + return access( this, jQuery.attr, name, value, arguments.length > 1 ); + }, + + removeAttr: function( name ) { + return this.each( function() { + jQuery.removeAttr( this, name ); + } ); + } +} ); + +jQuery.extend( { + attr: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set attributes on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === "undefined" ) { + return jQuery.prop( elem, name, value ); + } + + // Attribute hooks are determined by the lowercase version + // Grab necessary hook if one is defined + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + hooks = jQuery.attrHooks[ name.toLowerCase() ] || + ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); + } + + if ( value !== undefined ) { + if ( value === null ) { + jQuery.removeAttr( elem, name ); + return; + } + + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + elem.setAttribute( name, value + "" ); + return value; + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + ret = jQuery.find.attr( elem, name ); + + // Non-existent attributes return null, we normalize to undefined + return ret == null ? undefined : ret; + }, + + attrHooks: { + type: { + set: function( elem, value ) { + if ( !support.radioValue && value === "radio" && + jQuery.nodeName( elem, "input" ) ) { + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + } + }, + + removeAttr: function( elem, value ) { + var name, + i = 0, + attrNames = value && value.match( rnotwhite ); + + if ( attrNames && elem.nodeType === 1 ) { + while ( ( name = attrNames[ i++ ] ) ) { + elem.removeAttribute( name ); + } + } + } +} ); + +// Hooks for boolean attributes +boolHook = { + set: function( elem, value, name ) { + if ( value === false ) { + + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else { + elem.setAttribute( name, name ); + } + return name; + } +}; + +jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { + var getter = attrHandle[ name ] || jQuery.find.attr; + + attrHandle[ name ] = function( elem, name, isXML ) { + var ret, handle, + lowercaseName = name.toLowerCase(); + + if ( !isXML ) { + + // Avoid an infinite loop by temporarily removing this function from the getter + handle = attrHandle[ lowercaseName ]; + attrHandle[ lowercaseName ] = ret; + ret = getter( elem, name, isXML ) != null ? + lowercaseName : + null; + attrHandle[ lowercaseName ] = handle; + } + return ret; + }; +} ); + + + + +var rfocusable = /^(?:input|select|textarea|button)$/i, + rclickable = /^(?:a|area)$/i; + +jQuery.fn.extend( { + prop: function( name, value ) { + return access( this, jQuery.prop, name, value, arguments.length > 1 ); + }, + + removeProp: function( name ) { + return this.each( function() { + delete this[ jQuery.propFix[ name ] || name ]; + } ); + } +} ); + +jQuery.extend( { + prop: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set properties on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + return ( elem[ name ] = value ); + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + return elem[ name ]; + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + + // Support: IE <=9 - 11 only + // elem.tabIndex doesn't always return the + // correct value when it hasn't been explicitly set + // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + // Use proper attribute retrieval(#12072) + var tabindex = jQuery.find.attr( elem, "tabindex" ); + + return tabindex ? + parseInt( tabindex, 10 ) : + rfocusable.test( elem.nodeName ) || + rclickable.test( elem.nodeName ) && elem.href ? + 0 : + -1; + } + } + }, + + propFix: { + "for": "htmlFor", + "class": "className" + } +} ); + +// Support: IE <=11 only +// Accessing the selectedIndex property +// forces the browser to respect setting selected +// on the option +// The getter ensures a default option is selected +// when in an optgroup +if ( !support.optSelected ) { + jQuery.propHooks.selected = { + get: function( elem ) { + var parent = elem.parentNode; + if ( parent && parent.parentNode ) { + parent.parentNode.selectedIndex; + } + return null; + }, + set: function( elem ) { + var parent = elem.parentNode; + if ( parent ) { + parent.selectedIndex; + + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + } + }; +} + +jQuery.each( [ + "tabIndex", + "readOnly", + "maxLength", + "cellSpacing", + "cellPadding", + "rowSpan", + "colSpan", + "useMap", + "frameBorder", + "contentEditable" +], function() { + jQuery.propFix[ this.toLowerCase() ] = this; +} ); + + + + +var rclass = /[\t\r\n\f]/g; + +function getClass( elem ) { + return elem.getAttribute && elem.getAttribute( "class" ) || ""; +} + +jQuery.fn.extend( { + addClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( jQuery.isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + if ( typeof value === "string" && value ) { + classes = value.match( rnotwhite ) || []; + + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + cur = elem.nodeType === 1 && + ( " " + curValue + " " ).replace( rclass, " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + if ( cur.indexOf( " " + clazz + " " ) < 0 ) { + cur += clazz + " "; + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = jQuery.trim( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( jQuery.isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + if ( !arguments.length ) { + return this.attr( "class", "" ); + } + + if ( typeof value === "string" && value ) { + classes = value.match( rnotwhite ) || []; + + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + + // This expression is here for better compressibility (see addClass) + cur = elem.nodeType === 1 && + ( " " + curValue + " " ).replace( rclass, " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + + // Remove *all* instances + while ( cur.indexOf( " " + clazz + " " ) > -1 ) { + cur = cur.replace( " " + clazz + " ", " " ); + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = jQuery.trim( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value; + + if ( typeof stateVal === "boolean" && type === "string" ) { + return stateVal ? this.addClass( value ) : this.removeClass( value ); + } + + if ( jQuery.isFunction( value ) ) { + return this.each( function( i ) { + jQuery( this ).toggleClass( + value.call( this, i, getClass( this ), stateVal ), + stateVal + ); + } ); + } + + return this.each( function() { + var className, i, self, classNames; + + if ( type === "string" ) { + + // Toggle individual class names + i = 0; + self = jQuery( this ); + classNames = value.match( rnotwhite ) || []; + + while ( ( className = classNames[ i++ ] ) ) { + + // Check each className given, space separated list + if ( self.hasClass( className ) ) { + self.removeClass( className ); + } else { + self.addClass( className ); + } + } + + // Toggle whole class name + } else if ( value === undefined || type === "boolean" ) { + className = getClass( this ); + if ( className ) { + + // Store className if set + dataPriv.set( this, "__className__", className ); + } + + // If the element has a class name or if we're passed `false`, + // then remove the whole classname (if there was one, the above saved it). + // Otherwise bring back whatever was previously saved (if anything), + // falling back to the empty string if nothing was stored. + if ( this.setAttribute ) { + this.setAttribute( "class", + className || value === false ? + "" : + dataPriv.get( this, "__className__" ) || "" + ); + } + } + } ); + }, + + hasClass: function( selector ) { + var className, elem, + i = 0; + + className = " " + selector + " "; + while ( ( elem = this[ i++ ] ) ) { + if ( elem.nodeType === 1 && + ( " " + getClass( elem ) + " " ).replace( rclass, " " ) + .indexOf( className ) > -1 + ) { + return true; + } + } + + return false; + } +} ); + + + + +var rreturn = /\r/g, + rspaces = /[\x20\t\r\n\f]+/g; + +jQuery.fn.extend( { + val: function( value ) { + var hooks, ret, isFunction, + elem = this[ 0 ]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.type ] || + jQuery.valHooks[ elem.nodeName.toLowerCase() ]; + + if ( hooks && + "get" in hooks && + ( ret = hooks.get( elem, "value" ) ) !== undefined + ) { + return ret; + } + + ret = elem.value; + + return typeof ret === "string" ? + + // Handle most common string cases + ret.replace( rreturn, "" ) : + + // Handle cases where value is null/undef or number + ret == null ? "" : ret; + } + + return; + } + + isFunction = jQuery.isFunction( value ); + + return this.each( function( i ) { + var val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( isFunction ) { + val = value.call( this, i, jQuery( this ).val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + + } else if ( typeof val === "number" ) { + val += ""; + + } else if ( jQuery.isArray( val ) ) { + val = jQuery.map( val, function( value ) { + return value == null ? "" : value + ""; + } ); + } + + hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + } ); + } +} ); + +jQuery.extend( { + valHooks: { + option: { + get: function( elem ) { + + var val = jQuery.find.attr( elem, "value" ); + return val != null ? + val : + + // Support: IE <=10 - 11 only + // option.text throws exceptions (#14686, #14858) + // Strip and collapse whitespace + // https://html.spec.whatwg.org/#strip-and-collapse-whitespace + jQuery.trim( jQuery.text( elem ) ).replace( rspaces, " " ); + } + }, + select: { + get: function( elem ) { + var value, option, + options = elem.options, + index = elem.selectedIndex, + one = elem.type === "select-one", + values = one ? null : [], + max = one ? index + 1 : options.length, + i = index < 0 ? + max : + one ? index : 0; + + // Loop through all the selected options + for ( ; i < max; i++ ) { + option = options[ i ]; + + // Support: IE <=9 only + // IE8-9 doesn't update selected after form reset (#2551) + if ( ( option.selected || i === index ) && + + // Don't return options that are disabled or in a disabled optgroup + !option.disabled && + ( !option.parentNode.disabled || + !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + }, + + set: function( elem, value ) { + var optionSet, option, + options = elem.options, + values = jQuery.makeArray( value ), + i = options.length; + + while ( i-- ) { + option = options[ i ]; + + /* eslint-disable no-cond-assign */ + + if ( option.selected = + jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 + ) { + optionSet = true; + } + + /* eslint-enable no-cond-assign */ + } + + // Force browsers to behave consistently when non-matching value is set + if ( !optionSet ) { + elem.selectedIndex = -1; + } + return values; + } + } + } +} ); + +// Radios and checkboxes getter/setter +jQuery.each( [ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + set: function( elem, value ) { + if ( jQuery.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); + } + } + }; + if ( !support.checkOn ) { + jQuery.valHooks[ this ].get = function( elem ) { + return elem.getAttribute( "value" ) === null ? "on" : elem.value; + }; + } +} ); + + + + +// Return jQuery for attributes-only inclusion + + +var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/; + +jQuery.extend( jQuery.event, { + + trigger: function( event, data, elem, onlyHandlers ) { + + var i, cur, tmp, bubbleType, ontype, handle, special, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; + + cur = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "." ) > -1 ) { + + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split( "." ); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf( ":" ) < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join( "." ); + event.rnamespace = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === ( elem.ownerDocument || document ) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { + + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] && + dataPriv.get( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( ( !special._default || + special._default.apply( eventPath.pop(), data ) === false ) && + acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name as the event. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + elem[ type ](); + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + // Piggyback on a donor event to simulate a different one + // Used only for `focus(in | out)` events + simulate: function( type, elem, event ) { + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true + } + ); + + jQuery.event.trigger( e, null, elem ); + } + +} ); + +jQuery.fn.extend( { + + trigger: function( type, data ) { + return this.each( function() { + jQuery.event.trigger( type, data, this ); + } ); + }, + triggerHandler: function( type, data ) { + var elem = this[ 0 ]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +} ); + + +jQuery.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( i, name ) { + + // Handle event binding + jQuery.fn[ name ] = function( data, fn ) { + return arguments.length > 0 ? + this.on( name, null, data, fn ) : + this.trigger( name ); + }; +} ); + +jQuery.fn.extend( { + hover: function( fnOver, fnOut ) { + return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); + } +} ); + + + + +support.focusin = "onfocusin" in window; + + +// Support: Firefox <=44 +// Firefox doesn't have focus(in | out) events +// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 +// +// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 +// focus(in | out) events fire after focus & blur events, +// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order +// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 +if ( !support.focusin ) { + jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + var doc = this.ownerDocument || this, + attaches = dataPriv.access( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this, + attaches = dataPriv.access( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + dataPriv.remove( doc, fix ); + + } else { + dataPriv.access( doc, fix, attaches ); + } + } + }; + } ); +} +var location = window.location; + +var nonce = jQuery.now(); + +var rquery = ( /\?/ ); + + + +// Cross-browser xml parsing +jQuery.parseXML = function( data ) { + var xml; + if ( !data || typeof data !== "string" ) { + return null; + } + + // Support: IE 9 - 11 only + // IE throws on parseFromString with invalid input. + try { + xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); + } catch ( e ) { + xml = undefined; + } + + if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { + jQuery.error( "Invalid XML: " + data ); + } + return xml; +}; + + +var + rbracket = /\[\]$/, + rCRLF = /\r?\n/g, + rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, + rsubmittable = /^(?:input|select|textarea|keygen)/i; + +function buildParams( prefix, obj, traditional, add ) { + var name; + + if ( jQuery.isArray( obj ) ) { + + // Serialize array item. + jQuery.each( obj, function( i, v ) { + if ( traditional || rbracket.test( prefix ) ) { + + // Treat each array item as a scalar. + add( prefix, v ); + + } else { + + // Item is non-scalar (array or object), encode its numeric index. + buildParams( + prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", + v, + traditional, + add + ); + } + } ); + + } else if ( !traditional && jQuery.type( obj ) === "object" ) { + + // Serialize object item. + for ( name in obj ) { + buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); + } + + } else { + + // Serialize scalar item. + add( prefix, obj ); + } +} + +// Serialize an array of form elements or a set of +// key/values into a query string +jQuery.param = function( a, traditional ) { + var prefix, + s = [], + add = function( key, valueOrFunction ) { + + // If value is a function, invoke it and use its return value + var value = jQuery.isFunction( valueOrFunction ) ? + valueOrFunction() : + valueOrFunction; + + s[ s.length ] = encodeURIComponent( key ) + "=" + + encodeURIComponent( value == null ? "" : value ); + }; + + // If an array was passed in, assume that it is an array of form elements. + if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { + + // Serialize the form elements + jQuery.each( a, function() { + add( this.name, this.value ); + } ); + + } else { + + // If traditional, encode the "old" way (the way 1.3.2 or older + // did it), otherwise encode params recursively. + for ( prefix in a ) { + buildParams( prefix, a[ prefix ], traditional, add ); + } + } + + // Return the resulting serialization + return s.join( "&" ); +}; + +jQuery.fn.extend( { + serialize: function() { + return jQuery.param( this.serializeArray() ); + }, + serializeArray: function() { + return this.map( function() { + + // Can add propHook for "elements" to filter or add form elements + var elements = jQuery.prop( this, "elements" ); + return elements ? jQuery.makeArray( elements ) : this; + } ) + .filter( function() { + var type = this.type; + + // Use .is( ":disabled" ) so that fieldset[disabled] works + return this.name && !jQuery( this ).is( ":disabled" ) && + rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && + ( this.checked || !rcheckableType.test( type ) ); + } ) + .map( function( i, elem ) { + var val = jQuery( this ).val(); + + return val == null ? + null : + jQuery.isArray( val ) ? + jQuery.map( val, function( val ) { + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ) : + { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ).get(); + } +} ); + + +var + r20 = /%20/g, + rhash = /#.*$/, + rts = /([?&])_=[^&]*/, + rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, + + // #7653, #8125, #8152: local protocol detection + rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, + rnoContent = /^(?:GET|HEAD)$/, + rprotocol = /^\/\//, + + /* Prefilters + * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) + * 2) These are called: + * - BEFORE asking for a transport + * - AFTER param serialization (s.data is a string if s.processData is true) + * 3) key is the dataType + * 4) the catchall symbol "*" can be used + * 5) execution will start with transport dataType and THEN continue down to "*" if needed + */ + prefilters = {}, + + /* Transports bindings + * 1) key is the dataType + * 2) the catchall symbol "*" can be used + * 3) selection will start with transport dataType and THEN go to "*" if needed + */ + transports = {}, + + // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression + allTypes = "*/".concat( "*" ), + + // Anchor tag for parsing the document origin + originAnchor = document.createElement( "a" ); + originAnchor.href = location.href; + +// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport +function addToPrefiltersOrTransports( structure ) { + + // dataTypeExpression is optional and defaults to "*" + return function( dataTypeExpression, func ) { + + if ( typeof dataTypeExpression !== "string" ) { + func = dataTypeExpression; + dataTypeExpression = "*"; + } + + var dataType, + i = 0, + dataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || []; + + if ( jQuery.isFunction( func ) ) { + + // For each dataType in the dataTypeExpression + while ( ( dataType = dataTypes[ i++ ] ) ) { + + // Prepend if requested + if ( dataType[ 0 ] === "+" ) { + dataType = dataType.slice( 1 ) || "*"; + ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); + + // Otherwise append + } else { + ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); + } + } + } + }; +} + +// Base inspection function for prefilters and transports +function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { + + var inspected = {}, + seekingTransport = ( structure === transports ); + + function inspect( dataType ) { + var selected; + inspected[ dataType ] = true; + jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { + var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); + if ( typeof dataTypeOrTransport === "string" && + !seekingTransport && !inspected[ dataTypeOrTransport ] ) { + + options.dataTypes.unshift( dataTypeOrTransport ); + inspect( dataTypeOrTransport ); + return false; + } else if ( seekingTransport ) { + return !( selected = dataTypeOrTransport ); + } + } ); + return selected; + } + + return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); +} + +// A special extend for ajax options +// that takes "flat" options (not to be deep extended) +// Fixes #9887 +function ajaxExtend( target, src ) { + var key, deep, + flatOptions = jQuery.ajaxSettings.flatOptions || {}; + + for ( key in src ) { + if ( src[ key ] !== undefined ) { + ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; + } + } + if ( deep ) { + jQuery.extend( true, target, deep ); + } + + return target; +} + +/* Handles responses to an ajax request: + * - finds the right dataType (mediates between content-type and expected dataType) + * - returns the corresponding response + */ +function ajaxHandleResponses( s, jqXHR, responses ) { + + var ct, type, finalDataType, firstDataType, + contents = s.contents, + dataTypes = s.dataTypes; + + // Remove auto dataType and get content-type in the process + while ( dataTypes[ 0 ] === "*" ) { + dataTypes.shift(); + if ( ct === undefined ) { + ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); + } + } + + // Check if we're dealing with a known content-type + if ( ct ) { + for ( type in contents ) { + if ( contents[ type ] && contents[ type ].test( ct ) ) { + dataTypes.unshift( type ); + break; + } + } + } + + // Check to see if we have a response for the expected dataType + if ( dataTypes[ 0 ] in responses ) { + finalDataType = dataTypes[ 0 ]; + } else { + + // Try convertible dataTypes + for ( type in responses ) { + if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { + finalDataType = type; + break; + } + if ( !firstDataType ) { + firstDataType = type; + } + } + + // Or just use first one + finalDataType = finalDataType || firstDataType; + } + + // If we found a dataType + // We add the dataType to the list if needed + // and return the corresponding response + if ( finalDataType ) { + if ( finalDataType !== dataTypes[ 0 ] ) { + dataTypes.unshift( finalDataType ); + } + return responses[ finalDataType ]; + } +} + +/* Chain conversions given the request and the original response + * Also sets the responseXXX fields on the jqXHR instance + */ +function ajaxConvert( s, response, jqXHR, isSuccess ) { + var conv2, current, conv, tmp, prev, + converters = {}, + + // Work with a copy of dataTypes in case we need to modify it for conversion + dataTypes = s.dataTypes.slice(); + + // Create converters map with lowercased keys + if ( dataTypes[ 1 ] ) { + for ( conv in s.converters ) { + converters[ conv.toLowerCase() ] = s.converters[ conv ]; + } + } + + current = dataTypes.shift(); + + // Convert to each sequential dataType + while ( current ) { + + if ( s.responseFields[ current ] ) { + jqXHR[ s.responseFields[ current ] ] = response; + } + + // Apply the dataFilter if provided + if ( !prev && isSuccess && s.dataFilter ) { + response = s.dataFilter( response, s.dataType ); + } + + prev = current; + current = dataTypes.shift(); + + if ( current ) { + + // There's only work to do if current dataType is non-auto + if ( current === "*" ) { + + current = prev; + + // Convert response if prev dataType is non-auto and differs from current + } else if ( prev !== "*" && prev !== current ) { + + // Seek a direct converter + conv = converters[ prev + " " + current ] || converters[ "* " + current ]; + + // If none found, seek a pair + if ( !conv ) { + for ( conv2 in converters ) { + + // If conv2 outputs current + tmp = conv2.split( " " ); + if ( tmp[ 1 ] === current ) { + + // If prev can be converted to accepted input + conv = converters[ prev + " " + tmp[ 0 ] ] || + converters[ "* " + tmp[ 0 ] ]; + if ( conv ) { + + // Condense equivalence converters + if ( conv === true ) { + conv = converters[ conv2 ]; + + // Otherwise, insert the intermediate dataType + } else if ( converters[ conv2 ] !== true ) { + current = tmp[ 0 ]; + dataTypes.unshift( tmp[ 1 ] ); + } + break; + } + } + } + } + + // Apply converter (if not an equivalence) + if ( conv !== true ) { + + // Unless errors are allowed to bubble, catch and return them + if ( conv && s.throws ) { + response = conv( response ); + } else { + try { + response = conv( response ); + } catch ( e ) { + return { + state: "parsererror", + error: conv ? e : "No conversion from " + prev + " to " + current + }; + } + } + } + } + } + } + + return { state: "success", data: response }; +} + +jQuery.extend( { + + // Counter for holding the number of active queries + active: 0, + + // Last-Modified header cache for next request + lastModified: {}, + etag: {}, + + ajaxSettings: { + url: location.href, + type: "GET", + isLocal: rlocalProtocol.test( location.protocol ), + global: true, + processData: true, + async: true, + contentType: "application/x-www-form-urlencoded; charset=UTF-8", + + /* + timeout: 0, + data: null, + dataType: null, + username: null, + password: null, + cache: null, + throws: false, + traditional: false, + headers: {}, + */ + + accepts: { + "*": allTypes, + 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" + }, + + // Data converters + // Keys separate source (or catchall "*") and destination types with a single space + converters: { + + // Convert anything to text + "* text": String, + + // Text to html (true = no transformation) + "text html": true, + + // Evaluate text as a json expression + "text json": JSON.parse, + + // Parse text as xml + "text xml": jQuery.parseXML + }, + + // For options that shouldn't be deep extended: + // you can add your own custom options here if + // and when you create one that shouldn't be + // deep extended (see ajaxExtend) + flatOptions: { + url: true, + context: true + } + }, + + // Creates a full fledged settings object into target + // with both ajaxSettings and settings fields. + // If target is omitted, writes into ajaxSettings. + ajaxSetup: function( target, settings ) { + return settings ? + + // Building a settings object + ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : + + // Extending ajaxSettings + ajaxExtend( jQuery.ajaxSettings, target ); + }, + + ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), + ajaxTransport: addToPrefiltersOrTransports( transports ), + + // Main method + ajax: function( url, options ) { + + // If url is an object, simulate pre-1.5 signature + if ( typeof url === "object" ) { + options = url; + url = undefined; + } + + // Force options to be an object + options = options || {}; + + var transport, + + // URL without anti-cache param + cacheURL, + + // Response headers + responseHeadersString, + responseHeaders, + + // timeout handle + timeoutTimer, + + // Url cleanup var + urlAnchor, + + // Request state (becomes false upon send and true upon completion) + completed, + + // To know if global events are to be dispatched + fireGlobals, + + // Loop variable + i, + + // uncached part of the url + uncached, + + // Create the final options object + s = jQuery.ajaxSetup( {}, options ), + + // Callbacks context + callbackContext = s.context || s, + + // Context for global events is callbackContext if it is a DOM node or jQuery collection + globalEventContext = s.context && + ( callbackContext.nodeType || callbackContext.jquery ) ? + jQuery( callbackContext ) : + jQuery.event, + + // Deferreds + deferred = jQuery.Deferred(), + completeDeferred = jQuery.Callbacks( "once memory" ), + + // Status-dependent callbacks + statusCode = s.statusCode || {}, + + // Headers (they are sent all at once) + requestHeaders = {}, + requestHeadersNames = {}, + + // Default abort message + strAbort = "canceled", + + // Fake xhr + jqXHR = { + readyState: 0, + + // Builds headers hashtable if needed + getResponseHeader: function( key ) { + var match; + if ( completed ) { + if ( !responseHeaders ) { + responseHeaders = {}; + while ( ( match = rheaders.exec( responseHeadersString ) ) ) { + responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ]; + } + } + match = responseHeaders[ key.toLowerCase() ]; + } + return match == null ? null : match; + }, + + // Raw string + getAllResponseHeaders: function() { + return completed ? responseHeadersString : null; + }, + + // Caches the header + setRequestHeader: function( name, value ) { + if ( completed == null ) { + name = requestHeadersNames[ name.toLowerCase() ] = + requestHeadersNames[ name.toLowerCase() ] || name; + requestHeaders[ name ] = value; + } + return this; + }, + + // Overrides response content-type header + overrideMimeType: function( type ) { + if ( completed == null ) { + s.mimeType = type; + } + return this; + }, + + // Status-dependent callbacks + statusCode: function( map ) { + var code; + if ( map ) { + if ( completed ) { + + // Execute the appropriate callbacks + jqXHR.always( map[ jqXHR.status ] ); + } else { + + // Lazy-add the new callbacks in a way that preserves old ones + for ( code in map ) { + statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; + } + } + } + return this; + }, + + // Cancel the request + abort: function( statusText ) { + var finalText = statusText || strAbort; + if ( transport ) { + transport.abort( finalText ); + } + done( 0, finalText ); + return this; + } + }; + + // Attach deferreds + deferred.promise( jqXHR ); + + // Add protocol if not provided (prefilters might expect it) + // Handle falsy url in the settings object (#10093: consistency with old signature) + // We also use the url parameter if available + s.url = ( ( url || s.url || location.href ) + "" ) + .replace( rprotocol, location.protocol + "//" ); + + // Alias method option to type as per ticket #12004 + s.type = options.method || options.type || s.method || s.type; + + // Extract dataTypes list + s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnotwhite ) || [ "" ]; + + // A cross-domain request is in order when the origin doesn't match the current origin. + if ( s.crossDomain == null ) { + urlAnchor = document.createElement( "a" ); + + // Support: IE <=8 - 11, Edge 12 - 13 + // IE throws exception on accessing the href property if url is malformed, + // e.g. http://example.com:80x/ + try { + urlAnchor.href = s.url; + + // Support: IE <=8 - 11 only + // Anchor's host property isn't correctly set when s.url is relative + urlAnchor.href = urlAnchor.href; + s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== + urlAnchor.protocol + "//" + urlAnchor.host; + } catch ( e ) { + + // If there is an error parsing the URL, assume it is crossDomain, + // it can be rejected by the transport if it is invalid + s.crossDomain = true; + } + } + + // Convert data if not already a string + if ( s.data && s.processData && typeof s.data !== "string" ) { + s.data = jQuery.param( s.data, s.traditional ); + } + + // Apply prefilters + inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); + + // If request was aborted inside a prefilter, stop there + if ( completed ) { + return jqXHR; + } + + // We can fire global events as of now if asked to + // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) + fireGlobals = jQuery.event && s.global; + + // Watch for a new set of requests + if ( fireGlobals && jQuery.active++ === 0 ) { + jQuery.event.trigger( "ajaxStart" ); + } + + // Uppercase the type + s.type = s.type.toUpperCase(); + + // Determine if request has content + s.hasContent = !rnoContent.test( s.type ); + + // Save the URL in case we're toying with the If-Modified-Since + // and/or If-None-Match header later on + // Remove hash to simplify url manipulation + cacheURL = s.url.replace( rhash, "" ); + + // More options handling for requests with no content + if ( !s.hasContent ) { + + // Remember the hash so we can put it back + uncached = s.url.slice( cacheURL.length ); + + // If data is available, append data to url + if ( s.data ) { + cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; + + // #9682: remove data so that it's not used in an eventual retry + delete s.data; + } + + // Add anti-cache in uncached url if needed + if ( s.cache === false ) { + cacheURL = cacheURL.replace( rts, "" ); + uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached; + } + + // Put hash and anti-cache on the URL that will be requested (gh-1732) + s.url = cacheURL + uncached; + + // Change '%20' to '+' if this is encoded form body content (gh-2658) + } else if ( s.data && s.processData && + ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { + s.data = s.data.replace( r20, "+" ); + } + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + if ( jQuery.lastModified[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); + } + if ( jQuery.etag[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); + } + } + + // Set the correct header, if data is being sent + if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { + jqXHR.setRequestHeader( "Content-Type", s.contentType ); + } + + // Set the Accepts header for the server, depending on the dataType + jqXHR.setRequestHeader( + "Accept", + s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? + s.accepts[ s.dataTypes[ 0 ] ] + + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : + s.accepts[ "*" ] + ); + + // Check for headers option + for ( i in s.headers ) { + jqXHR.setRequestHeader( i, s.headers[ i ] ); + } + + // Allow custom headers/mimetypes and early abort + if ( s.beforeSend && + ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { + + // Abort if not done already and return + return jqXHR.abort(); + } + + // Aborting is no longer a cancellation + strAbort = "abort"; + + // Install callbacks on deferreds + completeDeferred.add( s.complete ); + jqXHR.done( s.success ); + jqXHR.fail( s.error ); + + // Get transport + transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); + + // If no transport, we auto-abort + if ( !transport ) { + done( -1, "No Transport" ); + } else { + jqXHR.readyState = 1; + + // Send global event + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); + } + + // If request was aborted inside ajaxSend, stop there + if ( completed ) { + return jqXHR; + } + + // Timeout + if ( s.async && s.timeout > 0 ) { + timeoutTimer = window.setTimeout( function() { + jqXHR.abort( "timeout" ); + }, s.timeout ); + } + + try { + completed = false; + transport.send( requestHeaders, done ); + } catch ( e ) { + + // Rethrow post-completion exceptions + if ( completed ) { + throw e; + } + + // Propagate others as results + done( -1, e ); + } + } + + // Callback for when everything is done + function done( status, nativeStatusText, responses, headers ) { + var isSuccess, success, error, response, modified, + statusText = nativeStatusText; + + // Ignore repeat invocations + if ( completed ) { + return; + } + + completed = true; + + // Clear timeout if it exists + if ( timeoutTimer ) { + window.clearTimeout( timeoutTimer ); + } + + // Dereference transport for early garbage collection + // (no matter how long the jqXHR object will be used) + transport = undefined; + + // Cache response headers + responseHeadersString = headers || ""; + + // Set readyState + jqXHR.readyState = status > 0 ? 4 : 0; + + // Determine if successful + isSuccess = status >= 200 && status < 300 || status === 304; + + // Get response data + if ( responses ) { + response = ajaxHandleResponses( s, jqXHR, responses ); + } + + // Convert no matter what (that way responseXXX fields are always set) + response = ajaxConvert( s, response, jqXHR, isSuccess ); + + // If successful, handle type chaining + if ( isSuccess ) { + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + modified = jqXHR.getResponseHeader( "Last-Modified" ); + if ( modified ) { + jQuery.lastModified[ cacheURL ] = modified; + } + modified = jqXHR.getResponseHeader( "etag" ); + if ( modified ) { + jQuery.etag[ cacheURL ] = modified; + } + } + + // if no content + if ( status === 204 || s.type === "HEAD" ) { + statusText = "nocontent"; + + // if not modified + } else if ( status === 304 ) { + statusText = "notmodified"; + + // If we have data, let's convert it + } else { + statusText = response.state; + success = response.data; + error = response.error; + isSuccess = !error; + } + } else { + + // Extract error from statusText and normalize for non-aborts + error = statusText; + if ( status || !statusText ) { + statusText = "error"; + if ( status < 0 ) { + status = 0; + } + } + } + + // Set data for the fake xhr object + jqXHR.status = status; + jqXHR.statusText = ( nativeStatusText || statusText ) + ""; + + // Success/Error + if ( isSuccess ) { + deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); + } else { + deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); + } + + // Status-dependent callbacks + jqXHR.statusCode( statusCode ); + statusCode = undefined; + + if ( fireGlobals ) { + globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", + [ jqXHR, s, isSuccess ? success : error ] ); + } + + // Complete + completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); + + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); + + // Handle the global AJAX counter + if ( !( --jQuery.active ) ) { + jQuery.event.trigger( "ajaxStop" ); + } + } + } + + return jqXHR; + }, + + getJSON: function( url, data, callback ) { + return jQuery.get( url, data, callback, "json" ); + }, + + getScript: function( url, callback ) { + return jQuery.get( url, undefined, callback, "script" ); + } +} ); + +jQuery.each( [ "get", "post" ], function( i, method ) { + jQuery[ method ] = function( url, data, callback, type ) { + + // Shift arguments if data argument was omitted + if ( jQuery.isFunction( data ) ) { + type = type || callback; + callback = data; + data = undefined; + } + + // The url can be an options object (which then must have .url) + return jQuery.ajax( jQuery.extend( { + url: url, + type: method, + dataType: type, + data: data, + success: callback + }, jQuery.isPlainObject( url ) && url ) ); + }; +} ); + + +jQuery._evalUrl = function( url ) { + return jQuery.ajax( { + url: url, + + // Make this explicit, since user can override this through ajaxSetup (#11264) + type: "GET", + dataType: "script", + cache: true, + async: false, + global: false, + "throws": true + } ); +}; + + +jQuery.fn.extend( { + wrapAll: function( html ) { + var wrap; + + if ( this[ 0 ] ) { + if ( jQuery.isFunction( html ) ) { + html = html.call( this[ 0 ] ); + } + + // The elements to wrap the target around + wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); + + if ( this[ 0 ].parentNode ) { + wrap.insertBefore( this[ 0 ] ); + } + + wrap.map( function() { + var elem = this; + + while ( elem.firstElementChild ) { + elem = elem.firstElementChild; + } + + return elem; + } ).append( this ); + } + + return this; + }, + + wrapInner: function( html ) { + if ( jQuery.isFunction( html ) ) { + return this.each( function( i ) { + jQuery( this ).wrapInner( html.call( this, i ) ); + } ); + } + + return this.each( function() { + var self = jQuery( this ), + contents = self.contents(); + + if ( contents.length ) { + contents.wrapAll( html ); + + } else { + self.append( html ); + } + } ); + }, + + wrap: function( html ) { + var isFunction = jQuery.isFunction( html ); + + return this.each( function( i ) { + jQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html ); + } ); + }, + + unwrap: function( selector ) { + this.parent( selector ).not( "body" ).each( function() { + jQuery( this ).replaceWith( this.childNodes ); + } ); + return this; + } +} ); + + +jQuery.expr.pseudos.hidden = function( elem ) { + return !jQuery.expr.pseudos.visible( elem ); +}; +jQuery.expr.pseudos.visible = function( elem ) { + return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); +}; + + + + +jQuery.ajaxSettings.xhr = function() { + try { + return new window.XMLHttpRequest(); + } catch ( e ) {} +}; + +var xhrSuccessStatus = { + + // File protocol always yields status code 0, assume 200 + 0: 200, + + // Support: IE <=9 only + // #1450: sometimes IE returns 1223 when it should be 204 + 1223: 204 + }, + xhrSupported = jQuery.ajaxSettings.xhr(); + +support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); +support.ajax = xhrSupported = !!xhrSupported; + +jQuery.ajaxTransport( function( options ) { + var callback, errorCallback; + + // Cross domain only allowed if supported through XMLHttpRequest + if ( support.cors || xhrSupported && !options.crossDomain ) { + return { + send: function( headers, complete ) { + var i, + xhr = options.xhr(); + + xhr.open( + options.type, + options.url, + options.async, + options.username, + options.password + ); + + // Apply custom fields if provided + if ( options.xhrFields ) { + for ( i in options.xhrFields ) { + xhr[ i ] = options.xhrFields[ i ]; + } + } + + // Override mime type if needed + if ( options.mimeType && xhr.overrideMimeType ) { + xhr.overrideMimeType( options.mimeType ); + } + + // X-Requested-With header + // For cross-domain requests, seeing as conditions for a preflight are + // akin to a jigsaw puzzle, we simply never set it to be sure. + // (it can always be set on a per-request basis or even using ajaxSetup) + // For same-domain requests, won't change header if already provided. + if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { + headers[ "X-Requested-With" ] = "XMLHttpRequest"; + } + + // Set headers + for ( i in headers ) { + xhr.setRequestHeader( i, headers[ i ] ); + } + + // Callback + callback = function( type ) { + return function() { + if ( callback ) { + callback = errorCallback = xhr.onload = + xhr.onerror = xhr.onabort = xhr.onreadystatechange = null; + + if ( type === "abort" ) { + xhr.abort(); + } else if ( type === "error" ) { + + // Support: IE <=9 only + // On a manual native abort, IE9 throws + // errors on any property access that is not readyState + if ( typeof xhr.status !== "number" ) { + complete( 0, "error" ); + } else { + complete( + + // File: protocol always yields status 0; see #8605, #14207 + xhr.status, + xhr.statusText + ); + } + } else { + complete( + xhrSuccessStatus[ xhr.status ] || xhr.status, + xhr.statusText, + + // Support: IE <=9 only + // IE9 has no XHR2 but throws on binary (trac-11426) + // For XHR2 non-text, let the caller handle it (gh-2498) + ( xhr.responseType || "text" ) !== "text" || + typeof xhr.responseText !== "string" ? + { binary: xhr.response } : + { text: xhr.responseText }, + xhr.getAllResponseHeaders() + ); + } + } + }; + }; + + // Listen to events + xhr.onload = callback(); + errorCallback = xhr.onerror = callback( "error" ); + + // Support: IE 9 only + // Use onreadystatechange to replace onabort + // to handle uncaught aborts + if ( xhr.onabort !== undefined ) { + xhr.onabort = errorCallback; + } else { + xhr.onreadystatechange = function() { + + // Check readyState before timeout as it changes + if ( xhr.readyState === 4 ) { + + // Allow onerror to be called first, + // but that will not handle a native abort + // Also, save errorCallback to a variable + // as xhr.onerror cannot be accessed + window.setTimeout( function() { + if ( callback ) { + errorCallback(); + } + } ); + } + }; + } + + // Create the abort callback + callback = callback( "abort" ); + + try { + + // Do send the request (this may raise an exception) + xhr.send( options.hasContent && options.data || null ); + } catch ( e ) { + + // #14683: Only rethrow if this hasn't been notified as an error yet + if ( callback ) { + throw e; + } + } + }, + + abort: function() { + if ( callback ) { + callback(); + } + } + }; + } +} ); + + + + +// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) +jQuery.ajaxPrefilter( function( s ) { + if ( s.crossDomain ) { + s.contents.script = false; + } +} ); + +// Install script dataType +jQuery.ajaxSetup( { + accepts: { + script: "text/javascript, application/javascript, " + + "application/ecmascript, application/x-ecmascript" + }, + contents: { + script: /\b(?:java|ecma)script\b/ + }, + converters: { + "text script": function( text ) { + jQuery.globalEval( text ); + return text; + } + } +} ); + +// Handle cache's special case and crossDomain +jQuery.ajaxPrefilter( "script", function( s ) { + if ( s.cache === undefined ) { + s.cache = false; + } + if ( s.crossDomain ) { + s.type = "GET"; + } +} ); + +// Bind script tag hack transport +jQuery.ajaxTransport( "script", function( s ) { + + // This transport only deals with cross domain requests + if ( s.crossDomain ) { + var script, callback; + return { + send: function( _, complete ) { + script = jQuery( " + + + + + + + + + + + + + + + + +
+
+
+
+ +
+

Reporting Bugs

+

pgloader is a software and as such contains bugs. Most bugs are easy to +solve and taken care of in a short delay. For this to be possible though, +bug reports need to follow those recommandations:

+
+
    +
  • include pgloader version,
  • +
  • include problematic input and output,
  • +
  • include a description of the output you expected,
  • +
  • explain the difference between the ouput you have and the one you expected,
  • +
  • include a self-reproducing test-case
  • +
+
+
+

Test Cases to Reproduce Bugs

+

Use the inline source type to help reproduce a bug, as in the pgloader tests:

+
LOAD CSV
+   FROM INLINE
+   INTO postgresql://dim@localhost/pgloader?public."HS"
+
+   WITH truncate,
+        fields terminated by '\t',
+        fields not enclosed,
+        fields escaped by backslash-quote,
+        quote identifiers
+
+    SET work_mem to '128MB',
+        standard_conforming_strings to 'on',
+        application_name to 'my app name'
+
+ BEFORE LOAD DO
+  $$ create extension if not exists hstore; $$,
+  $$ drop table if exists "HS"; $$,
+  $$ CREATE TABLE "HS"
+     (
+        id     serial primary key,
+        kv     hstore
+     )
+  $$;
+
+
+1     email=>foo@example.com,a=>b
+2     test=>value
+3     a=>b,c=>"quoted hstore value",d=>other
+4     baddata
+
+
+
+
+ + +
+
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/_build/html/genindex.html b/docs/_build/html/genindex.html new file mode 100644 index 0000000..9e8d443 --- /dev/null +++ b/docs/_build/html/genindex.html @@ -0,0 +1,88 @@ + + + + + + + + Index — pgloader 3.4.1 documentation + + + + + + + + + + + + + + + + + + +
+
+
+
+ + +

Index

+ +
+ +
+ + +
+
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/_build/html/index.html b/docs/_build/html/index.html new file mode 100644 index 0000000..14daa3e --- /dev/null +++ b/docs/_build/html/index.html @@ -0,0 +1,198 @@ + + + + + + + Welcome to pgloader’s documentation! — pgloader 3.4.1 documentation + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+

Welcome to pgloader’s documentation!

+
+

Table Of Contents:

+ +
+
+
+

Indices and tables

+ +
+ + +
+
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/_build/html/intro.html b/docs/_build/html/intro.html new file mode 100644 index 0000000..09b664f --- /dev/null +++ b/docs/_build/html/intro.html @@ -0,0 +1,151 @@ + + + + + + + Introduction — pgloader 3.4.1 documentation + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+

Introduction

+

pgloader loads data from various sources into PostgreSQL. It can +transform the data it reads on the fly and submit raw SQL before and +after the loading. It uses the COPY PostgreSQL protocol to stream +the data into the server, and manages errors by filling a pair of +reject.dat and reject.log files.

+

pgloader knows how to read data from different kind of sources:

+
+
    +
  • Files +* CSV +* Fixed Format +* DBF
  • +
  • Databases +* SQLite +* MySQL +* MS SQL Server
  • +
+
+

The level of automation provided by pgloader depends on the data source +type. In the case of CSV and Fixed Format files, a full description of the +expected input properties must be given to pgloader. In the case of a +database, pgloader connects to the live service and knows how to fetch the +metadata it needs directly from it.

+
+

Continuous Migration

+

pgloader is meant to migrate a whole database in a single command line and +without any manual intervention. The goal is to be able to setup a +Continuous Integration environment as described in the Project +Methodology document of the MySQL to +PostgreSQL webpage.

+
+
    +
  1. Setup your target PostgreSQL Architecture
  2. +
  3. Fork a Continuous Integration environment that uses PostgreSQL
  4. +
  5. Migrate the data over and over again every night, from production
  6. +
  7. As soon as the CI is all green using PostgreSQL, schedule the D-Day
  8. +
  9. Migrate without suprise and enjoy!
  10. +
+
+

In order to be able to follow this great methodology, you need tooling to +implement the third step in a fully automated way. That’s pgloader.

+
+
+

Commands

+

pgloader implements its own Command Language, a DSL that allows to specify +every aspect of the data load and migration to implement. Some of the +features provided in the language are only available for a specific source +type.

+
+
+

Command Line

+

The pgloader command line accepts those two variants:

+
pgloader [<options>] [<command-file>]...
+pgloader [<options>] SOURCE TARGET
+
+
+

Either you have a command-file containing migration specifications in the +pgloader Command Language, or you can give a Source for the data and a +PostgreSQL database connection Target where to load the data into.

+
+
+ + +
+
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/_build/html/objects.inv b/docs/_build/html/objects.inv new file mode 100644 index 0000000000000000000000000000000000000000..e88718732f1ee71b6d0255bb12d3023db66deca4 GIT binary patch literal 663 zcmV;I0%-jsAX9K?X>NERX>N99Zgg*Qc_4OWa&u{KZXhxWBOp+6Z)#;@bUGk#XKZg_ zWMy&+BOq2~a&u{KZaN?{E;I@wAXI2&AaZ4GVQFq;WpW^IW*~HEX>%ZEX>4U6X>%ZB zZ*6dLWpi_7WFU2OX>MmAdTeQ8E(&FN@YMB`hm&{R_|dS!M6v~a(MJ> zCK_0GjV>A#Oi=8-f|EURr-^8g+__~jmJP;}if81NY!QrvW5Xq(sQ&)`qrp~oEeb;n zlj4oFFiNHt7Klykl6IA=ELuqyraGQikqDZN6>uEpi;buL5ewzp<~~$BVvPz#g|H!_ zBmAOWb(%D|!k)B8j(W)|D~ZlS@2`%8PXk#ftltq;9oPw{UK2Rz-CXWSN+nw$0zL-P z>nnLY=VFJY%9}6SA5cow5@V1;$zuCTpJr-(%EY^GK#3tYuKjq!v|&ot&zf2&)!%(D;WjpHwSM8b#DhaLSfhxKIf2a%b`SSnyC>SG zbSt&7*TTZV?Y!i6UUobG$IPmjnVok)=XO@*s_AtN>bn#M&o+tUCS{{ZI;Zl1?%J}&?O literal 0 HcmV?d00001 diff --git a/docs/_build/html/pgloader-usage-examples.html b/docs/_build/html/pgloader-usage-examples.html new file mode 100644 index 0000000..ee73f61 --- /dev/null +++ b/docs/_build/html/pgloader-usage-examples.html @@ -0,0 +1,237 @@ + + + + + + + Pgloader Usage Examples — pgloader 3.4.1 documentation + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+

Pgloader Usage Examples

+

Currently not included, because redundant with the tutorial.

+
+

Usage Examples

+

Review the command line options and pgloader’s version:

+
pgloader --help
+pgloader --version
+
+
+
+

Loading from a complex command

+

Use the command file as the pgloader command argument, pgloader will parse +that file and execute the commands found in it:

+
pgloader --verbose ./test/csv-districts.load
+
+
+
+
+

CSV

+

Load data from a CSV file into a pre-existing table in your database, having +pgloader guess the CSV properties (separator, quote and escape character):

+
pgloader ./test/data/matching-1.csv pgsql:///pgloader?tablename=matching
+
+
+

Load data from a CSV file into a pre-existing table in your database, with +expanded options:

+
pgloader --type csv                                   \
+         --field id --field field                     \
+         --with truncate                              \
+         --with "fields terminated by ','"            \
+         ./test/data/matching-1.csv                   \
+         postgres:///pgloader?tablename=matching
+
+
+

In that example the whole loading is driven from the command line, bypassing +the need for writing a command in the pgloader command syntax entirely. As +there’s no command though, the extra inforamtion needed must be provided on +the command line using the –type and –field and –with switches.

+

For documentation about the available syntaxes for the –field and +–with switches, please refer to the CSV section later in the man page.

+

Note also that the PostgreSQL URI includes the target tablename.

+
+
+

Reading from STDIN

+

File based pgloader sources can be loaded from the standard input, as in the +following example:

+
pgloader --type csv                                         \
+         --field "usps,geoid,aland,awater,aland_sqmi,awater_sqmi,intptlat,intptlong" \
+         --with "skip header = 1"                          \
+         --with "fields terminated by '\t'"                \
+         -                                                 \
+         postgresql:///pgloader?districts_longlat          \
+         < test/data/2013_Gaz_113CDs_national.txt
+
+
+

The dash (-) character as a source is used to mean standard input, as +usual in Unix command lines. It’s possible to stream compressed content to +pgloader with this technique, using the Unix pipe:

+
+
gunzip -c source.gz | pgloader –type csv … - pgsql:///target?foo
+
+
+

Loading from CSV available through HTTP

+

The same command as just above can also be run if the CSV file happens to be +found on a remote HTTP location:

+
pgloader --type csv                                                     \
+         --field "usps,geoid,aland,awater,aland_sqmi,awater_sqmi,intptlat,intptlong" \
+         --with "skip header = 1"                                       \
+         --with "fields terminated by '\t'"                             \
+         http://pgsql.tapoueh.org/temp/2013_Gaz_113CDs_national.txt     \
+         postgresql:///pgloader?districts_longlat
+
+
+

Some more options have to be used in that case, as the file contains a +one-line header (most commonly that’s column names, could be a copyright +notice). Also, in that case, we specify all the fields right into a single +–field option argument.

+

Again, the PostgreSQL target connection string must contain the tablename +option and you have to ensure that the target table exists and may fit the +data. Here’s the SQL command used in that example in case you want to try it +yourself:

+
create table districts_longlat
+(
+         usps        text,
+         geoid       text,
+         aland       bigint,
+         awater      bigint,
+         aland_sqmi  double precision,
+         awater_sqmi double precision,
+         intptlat    double precision,
+         intptlong   double precision
+);
+
+
+

Also notice that the same command will work against an archived version of +the same data, e.g. +http://pgsql.tapoueh.org/temp/2013_Gaz_113CDs_national.txt.gz.

+

Finally, it’s important to note that pgloader first fetches the content from +the HTTP URL it to a local file, then expand the archive when it’s +recognized to be one, and only then processes the locally expanded file.

+

In some cases, either because pgloader has no direct support for your +archive format or maybe because expanding the archive is not feasible in +your environment, you might want to stream the content straight from its +remote location into PostgreSQL. Here’s how to do that, using the old battle +tested Unix Pipes trick:

+
curl http://pgsql.tapoueh.org/temp/2013_Gaz_113CDs_national.txt.gz \
+| gunzip -c                                                        \
+| pgloader --type csv                                              \
+           --field "usps,geoid,aland,awater,aland_sqmi,awater_sqmi,intptlat,intptlong"
+           --with "skip header = 1"                                \
+           --with "fields terminated by '\t'"                      \
+           -                                                       \
+           postgresql:///pgloader?districts_longlat
+
+
+

Now the OS will take care of the streaming and buffering between the network +and the commands and pgloader will take care of streaming the data down to +PostgreSQL.

+
+
+

Migrating from SQLite

+

The following command will open the SQLite database, discover its tables +definitions including indexes and foreign keys, migrate those definitions +while casting the data type specifications to their PostgreSQL equivalent +and then migrate the data over:

+
createdb newdb
+pgloader ./test/sqlite/sqlite.db postgresql:///newdb
+
+
+
+
+

Migrating from MySQL

+

Just create a database where to host the MySQL data and definitions and have +pgloader do the migration for you in a single command line:

+
createdb pagila
+pgloader mysql://user@localhost/sakila postgresql:///pagila
+
+
+
+
+

Fetching an archived DBF file from a HTTP remote location

+

It’s possible for pgloader to download a file from HTTP, unarchive it, and +only then open it to discover the schema then load the data:

+
createdb foo
+pgloader --type dbf http://www.insee.fr/fr/methodes/nomenclatures/cog/telechargement/2013/dbf/historiq2013.zip postgresql:///foo
+
+
+

Here it’s not possible for pgloader to guess the kind of data source it’s +being given, so it’s necessary to use the –type command line switch.

+
+
+
+ + +
+
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/_build/html/ref/archive.html b/docs/_build/html/ref/archive.html new file mode 100644 index 0000000..7bab0bf --- /dev/null +++ b/docs/_build/html/ref/archive.html @@ -0,0 +1,191 @@ + + + + + + + Loading From an Archive — pgloader 3.4.1 documentation + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+

Loading From an Archive

+

This command instructs pgloader to load data from one or more files contained +in an archive. Currently the only supported archive format is ZIP, and the +archive might be downloaded from an HTTP URL.

+

Here’s an example:

+
LOAD ARCHIVE
+   FROM /Users/dim/Downloads/GeoLiteCity-latest.zip
+   INTO postgresql:///ip4r
+
+   BEFORE LOAD
+     DO $$ create extension if not exists ip4r; $$,
+        $$ create schema if not exists geolite; $$,
+
+     EXECUTE 'geolite.sql'
+
+   LOAD CSV
+        FROM FILENAME MATCHING ~/GeoLiteCity-Location.csv/
+             WITH ENCODING iso-8859-1
+             (
+                locId,
+                country,
+                region     null if blanks,
+                city       null if blanks,
+                postalCode null if blanks,
+                latitude,
+                longitude,
+                metroCode  null if blanks,
+                areaCode   null if blanks
+             )
+        INTO postgresql:///ip4r?geolite.location
+             (
+                locid,country,region,city,postalCode,
+                location point using (format nil "(~a,~a)" longitude latitude),
+                metroCode,areaCode
+             )
+        WITH skip header = 2,
+             fields optionally enclosed by '"',
+             fields escaped by double-quote,
+             fields terminated by ','
+
+  AND LOAD CSV
+        FROM FILENAME MATCHING ~/GeoLiteCity-Blocks.csv/
+             WITH ENCODING iso-8859-1
+             (
+                startIpNum, endIpNum, locId
+             )
+        INTO postgresql:///ip4r?geolite.blocks
+             (
+                iprange ip4r using (ip-range startIpNum endIpNum),
+                locId
+             )
+        WITH skip header = 2,
+             fields optionally enclosed by '"',
+             fields escaped by double-quote,
+             fields terminated by ','
+
+   FINALLY DO
+     $$ create index blocks_ip4r_idx on geolite.blocks using gist(iprange); $$;
+
+
+

The archive command accepts the following clauses and options.

+
+

Archive Source Specification: FROM

+

Filename or HTTP URI where to load the data from. When given an HTTP URL the +linked file will get downloaded locally before processing.

+

If the file is a zip file, the command line utility unzip is used to +expand the archive into files in $TMPDIR, or /tmp if $TMPDIR is unset +or set to a non-existing directory.

+

Then the following commands are used from the top level directory where the +archive has been expanded.

+
+
+

Archive Sub Commands

+
+
    +
  • command [ AND command … ]

    +

    A series of commands against the contents of the archive, at the moment +only CSV,`’FIXED` and DBF commands are supported.

    +

    Note that commands are supporting the clause FROM FILENAME MATCHING +which allows the pgloader command not to depend on the exact names of +the archive directories.

    +

    The same clause can also be applied to several files with using the +spelling FROM ALL FILENAMES MATCHING and a regular expression.

    +

    The whole matching clause must follow the following rule:

    +
    FROM [ ALL FILENAMES | [ FIRST ] FILENAME ] MATCHING
    +
    +
    +
  • +
+
+
+
+

Archive Final SQL Commands

+
+
    +
  • FINALLY DO

    +

    SQL Queries to run once the data is loaded, such as CREATE INDEX.

    +
  • +
+
+
+
+ + +
+
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/_build/html/ref/copy.html b/docs/_build/html/ref/copy.html new file mode 100644 index 0000000..c03182f --- /dev/null +++ b/docs/_build/html/ref/copy.html @@ -0,0 +1,196 @@ + + + + + + + Loading COPY Formatted Files — pgloader 3.4.1 documentation + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+

Loading COPY Formatted Files

+

This commands instructs pgloader to load from a file containing COPY TEXT +data as described in the PostgreSQL documentation. Here’s an example:

+
LOAD COPY
+     FROM copy://./data/track.copy
+          (
+            trackid, track, album, media, genre, composer,
+            milliseconds, bytes, unitprice
+          )
+     INTO postgresql:///pgloader
+   TARGET TABLE track_full
+
+     WITH truncate
+
+      SET work_mem to '14MB',
+          standard_conforming_strings to 'on'
+
+BEFORE LOAD DO
+     $$ drop table if exists track_full; $$,
+     $$ create table track_full (
+          trackid      bigserial,
+          track        text,
+          album        text,
+          media        text,
+          genre        text,
+          composer     text,
+          milliseconds bigint,
+          bytes        bigint,
+          unitprice    numeric
+        );
+     $$;
+
+
+

The COPY format command accepts the following clauses and options.

+
+

COPY Formatted Files Source Specification: FROM

+

Filename where to load the data from. This support local files, HTTP URLs +and zip files containing a single dbf file of the same name. Fetch such a +zip file from an HTTP address is of course supported.

+
+
    +
  • inline

    +

    The data is found after the end of the parsed commands. Any number of +empty lines between the end of the commands and the beginning of the +data is accepted.

    +
  • +
  • stdin

    +

    Reads the data from the standard input stream.

    +
  • +
  • FILENAMES MATCHING

    +

    The whole matching clause must follow the following rule:

    +
    [ ALL FILENAMES | [ FIRST ] FILENAME ]
    +MATCHING regexp
    +[ IN DIRECTORY '...' ]
    +
    +
    +

    The matching clause applies given regular expression (see above for +exact syntax, several options can be used here) to filenames. It’s then +possible to load data from only the first match of all of them.

    +

    The optional IN DIRECTORY clause allows specifying which directory to +walk for finding the data files, and can be either relative to where the +command file is read from, or absolute. The given directory must exists.

    +
  • +
+
+
+
+

COPY Formatted File Options: WITH

+

When loading from a COPY file, the following options are supported:

+
+
    +
  • delimiter

    +

    Takes a single character as argument, which must be found inside single +quotes, and might be given as the printable character itself, the +special value t to denote a tabulation character, or 0x then an +hexadecimal value read as the ASCII code for the character.

    +

    This character is used as the delimiter when reading the data, in a +similar way to the PostgreSQL COPY option.

    +
  • +
  • null

    +

    Takes a quoted string as an argument (quotes can be either double quotes +or single quotes) and uses that string as the NULL representation in +the data.

    +

    This is similar to the null COPY option in PostgreSQL.

    +
  • +
  • truncate

    +

    When this option is listed, pgloader issues a TRUNCATE command against +the PostgreSQL target table before reading the data file.

    +
  • +
  • disable triggers

    +

    When this option is listed, pgloader issues an ALTER TABLE … DISABLE +TRIGGER ALL command against the PostgreSQL target table before copying +the data, then the command ALTER TABLE … ENABLE TRIGGER ALL once the +COPY is done.

    +

    This option allows loading data into a pre-existing table ignoring the +foreign key constraints and user defined triggers and may result in +invalid foreign key constraints once the data is loaded. Use with +care.

    +
  • +
  • skip header

    +

    Takes a numeric value as argument. Instruct pgloader to skip that many +lines at the beginning of the input file.

    +
  • +
+
+
+
+ + +
+
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/_build/html/ref/csv.html b/docs/_build/html/ref/csv.html new file mode 100644 index 0000000..7483619 --- /dev/null +++ b/docs/_build/html/ref/csv.html @@ -0,0 +1,310 @@ + + + + + + + Loading CSV data — pgloader 3.4.1 documentation + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+

Loading CSV data

+

This command instructs pgloader to load data from a CSV file. Here’s an +example:

+
LOAD CSV
+   FROM 'GeoLiteCity-Blocks.csv' WITH ENCODING iso-646-us
+        HAVING FIELDS
+        (
+           startIpNum, endIpNum, locId
+        )
+   INTO postgresql://user@localhost:54393/dbname
+        TARGET TABLE geolite.blocks
+        TARGET COLUMNS
+        (
+           iprange ip4r using (ip-range startIpNum endIpNum),
+           locId
+        )
+   WITH truncate,
+        skip header = 2,
+        fields optionally enclosed by '"',
+        fields escaped by backslash-quote,
+        fields terminated by '\t'
+
+    SET work_mem to '32 MB', maintenance_work_mem to '64 MB';
+
+
+

The csv format command accepts the following clauses and options.

+
+

CSV Source Specification: FROM

+

Filename where to load the data from. Accepts an ENCODING option. Use the +–list-encodings option to know which encoding names are supported.

+

The filename may be enclosed by single quotes, and could be one of the +following special values:

+
+
    +
  • inline

    +

    The data is found after the end of the parsed commands. Any number +of empty lines between the end of the commands and the beginning of +the data is accepted.

    +
  • +
  • stdin

    +

    Reads the data from the standard input stream.

    +
  • +
  • FILENAMES MATCHING

    +

    The whole matching clause must follow the following rule:

    +
    [ ALL FILENAMES | [ FIRST ] FILENAME ]
    +MATCHING regexp
    +[ IN DIRECTORY '...' ]
    +
    +
    +

    The matching clause applies given regular expression (see above +for exact syntax, several options can be used here) to filenames. +It’s then possible to load data from only the first match of all of +them.

    +

    The optional IN DIRECTORY clause allows specifying which directory +to walk for finding the data files, and can be either relative to +where the command file is read from, or absolute. The given +directory must exists.

    +
  • +
+
+
+
+

Fields Specifications

+

The FROM option also supports an optional comma separated list of field +names describing what is expected in the CSV data file, optionally +introduced by the clause HAVING FIELDS.

+

Each field name can be either only one name or a name following with +specific reader options for that field, enclosed in square brackets and +comma-separated. Supported per-field reader options are:

+
+
    +
  • terminated by

    +
    +

    See the description of field terminated by below.

    +

    The processing of this option is not currently implemented.

    +
    +
  • +
  • date format

    +

    When the field is expected of the date type, then this option allows +to specify the date format used in the file.

    +

    Date format string are template strings modeled against the +PostgreSQL to_char template strings support, limited to the +following patterns:

    +
    +
      +
    • YYYY, YYY, YY for the year part
    • +
    • MM for the numeric month part
    • +
    • DD for the numeric day part
    • +
    • HH, HH12, HH24 for the hour part
    • +
    • am, AM, a.m., A.M.
    • +
    • pm, PM, p.m., P.M.
    • +
    • MI for the minutes part
    • +
    • SS for the seconds part
    • +
    • MS for the milliseconds part (4 digits)
    • +
    • US for the microseconds part (6 digits)
    • +
    • unparsed punctuation signs: - . * # @ T / and space
    • +
    +
    +

    Here’s an example of a date format specification:

    +
    column-name [date format 'YYYY-MM-DD HH24-MI-SS.US']
    +
    +
    +
  • +
  • null if

    +
    +

    This option takes an argument which is either the keyword blanks +or a double-quoted string.

    +

    When blanks is used and the field value that is read contains +only space characters, then it’s automatically converted to an SQL +NULL value.

    +

    When a double-quoted string is used and that string is read as the +field value, then the field value is automatically converted to an +SQL NULL value.

    +
    +
  • +
  • trim both whitespace, trim left whitespace, trim right whitespace

    +

    This option allows to trim whitespaces in the read data, either from +both sides of the data, or only the whitespace characters found on +the left of the streaing, or only those on the right of the string.

    +
  • +
+
+
+
+

CSV Loading Options: WITH

+

When loading from a CSV file, the following options are supported:

+
+
    +
  • truncate

    +
    +

    When this option is listed, pgloader issues a TRUNCATE command +against the PostgreSQL target table before reading the data file.

    +
    +
  • +
  • drop indexes

    +

    When this option is listed, pgloader issues DROP INDEX commands +against all the indexes defined on the target table before copying +the data, then CREATE INDEX commands once the COPY is done.

    +

    In order to get the best performance possible, all the indexes are +created in parallel and when done the primary keys are built again +from the unique indexes just created. This two step process allows +creating the primary key index in parallel with the other indexes, +as only the ALTER TABLE command needs an access exclusive lock +on the target table.

    +
  • +
  • disable triggers

    +

    When this option is listed, pgloader issues an ALTER TABLE … +DISABLE TRIGGER ALL command against the PostgreSQL target table +before copying the data, then the command ALTER TABLE … ENABLE +TRIGGER ALL once the COPY is done.

    +

    This option allows loading data into a pre-existing table ignoring +the foreign key constraints and user defined triggers and may +result in invalid foreign key constraints once the data is loaded. +Use with care.

    +
  • +
  • skip header

    +

    Takes a numeric value as argument. Instruct pgloader to skip that +many lines at the beginning of the input file.

    +
  • +
  • csv header

    +

    Use the first line read after skip header as the list of csv field +names to be found in the CSV file, using the same CSV parameters as +for the CSV data.

    +
  • +
  • trim unquoted blanks

    +

    When reading unquoted values in the CSV file, remove the blanks +found in between the separator and the value. That behaviour is the +default.

    +
  • +
  • keep unquoted blanks

    +

    When reading unquoted values in the CSV file, keep blanks found in +between the separator and the value.

    +
  • +
  • fields optionally enclosed by

    +

    Takes a single character as argument, which must be found inside +single quotes, and might be given as the printable character itself, +the special value t to denote a tabulation character, or 0x then +an hexadecimal value read as the ASCII code for the character.

    +

    This character is used as the quoting character in the CSV file, +and defaults to double-quote.

    +
  • +
  • fields not enclosed

    +

    By default, pgloader will use the double-quote character as the +enclosing character. If you have a CSV file where fields are not +enclosed and are using double-quote as an expected ordinary +character, then use the option fields not enclosed for the CSV +parser to accept those values.

    +
  • +
  • fields escaped by

    +

    Takes either the special value backslash-quote or double-quote, +or any value supported by the fields terminated by option (see +below). This value is used to recognize escaped field separators +when they are to be found within the data fields themselves. +Defaults to double-quote.

    +
  • +
  • csv escape mode

    +

    Takes either the special value quote (the default) or following +and allows the CSV parser to parse either only escaped field +separator or any character (including CSV data) when using the +following value.

    +
  • +
  • fields terminated by

    +

    Takes a single character as argument, which must be found inside +single quotes, and might be given as the printable character itself, +the special value t to denote a tabulation character, or 0x then +an hexadecimal value read as the ASCII code for the character.

    +

    This character is used as the field separator when reading the +CSV data.

    +
  • +
  • lines terminated by

    +

    Takes a single character as argument, which must be found inside +single quotes, and might be given as the printable character itself, +the special value t to denote a tabulation character, or 0x then +an hexadecimal value read as the ASCII code for the character.

    +

    This character is used to recognize end-of-line condition when +reading the CSV data.

    +
  • +
+
+
+
+ + +
+
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/_build/html/ref/dbf.html b/docs/_build/html/ref/dbf.html new file mode 100644 index 0000000..7d54a68 --- /dev/null +++ b/docs/_build/html/ref/dbf.html @@ -0,0 +1,138 @@ + + + + + + + Loading DBF data — pgloader 3.4.1 documentation + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+

Loading DBF data

+

This command instructs pgloader to load data from a DBF file. Here’s an +example:

+
LOAD DBF
+        FROM http://www.insee.fr/fr/methodes/nomenclatures/cog/telechargement/2013/dbf/reg2013.dbf
+    INTO postgresql://user@localhost/dbname
+    WITH truncate, create table;
+
+
+

The dbf format command accepts the following clauses and options.

+
+

DBF Source Specification: FROM

+

Filename where to load the data from. This support local files, HTTP URLs +and zip files containing a single dbf file of the same name. Fetch such a +zip file from an HTTP address is of course supported.

+
+
+

DBF Loading Options: WITH

+

When loading from a DBF file, the following options are supported:

+
+
    +
  • truncate

    +

    When this option is listed, pgloader issues a TRUNCATE command against +the PostgreSQL target table before reading the data file.

    +
  • +
  • disable triggers

    +

    When this option is listed, pgloader issues an ALTER TABLE … DISABLE +TRIGGER ALL command against the PostgreSQL target table before copying +the data, then the command ALTER TABLE … ENABLE TRIGGER ALL once the +COPY is done.

    +

    This option allows loading data into a pre-existing table ignoring the +foreign key constraints and user defined triggers and may result in +invalid foreign key constraints once the data is loaded. Use with +care.

    +
  • +
  • create table

    +

    When this option is listed, pgloader creates the table using the meta +data found in the DBF file, which must contain a list of fields with +their data type. A standard data type conversion from DBF to PostgreSQL +is done.

    +
  • +
  • table name

    +

    This options expects as its value the possibly qualified name of the +table to create.

    +
  • +
+
+
+
+ + +
+
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/_build/html/ref/fixed.html b/docs/_build/html/ref/fixed.html new file mode 100644 index 0000000..e5b6c9a --- /dev/null +++ b/docs/_build/html/ref/fixed.html @@ -0,0 +1,270 @@ + + + + + + + Loading Fixed Cols File Formats — pgloader 3.4.1 documentation + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+

Loading Fixed Cols File Formats

+

This command instructs pgloader to load data from a text file containing +columns arranged in a fixed size manner. Here’s an example:

+
LOAD FIXED
+     FROM inline
+          (
+           a from  0 for 10,
+           b from 10 for  8,
+           c from 18 for  8,
+           d from 26 for 17 [null if blanks, trim right whitespace]
+          )
+     INTO postgresql:///pgloader
+   TARGET TABLE fixed
+          (
+             a, b,
+             c time using (time-with-no-separator c),
+             d
+          )
+
+     WITH truncate
+
+      SET work_mem to '14MB',
+          standard_conforming_strings to 'on'
+
+BEFORE LOAD DO
+     $$ drop table if exists fixed; $$,
+     $$ create table fixed (
+         a integer,
+         b date,
+         c time,
+         d text
+        );
+     $$;
+
+ 01234567892008052011431250firstline
+    01234562008052115182300left blank-padded
+ 12345678902008052208231560another line
+  2345609872014092914371500
+  2345678902014092914371520
+
+
+

The fixed format command accepts the following clauses and options.

+
+

Fixed File Format Source Specification: FROM

+

Filename where to load the data from. Accepts an ENCODING option. Use the +–list-encodings option to know which encoding names are supported.

+

The filename may be enclosed by single quotes, and could be one of the +following special values:

+
+
    +
  • inline

    +
    +

    The data is found after the end of the parsed commands. Any number +of empty lines between the end of the commands and the beginning of +the data is accepted.

    +
    +
  • +
  • stdin

    +
    +

    Reads the data from the standard input stream.

    +
    +
  • +
  • FILENAMES MATCHING

    +

    The whole matching clause must follow the following rule:

    +
    [ ALL FILENAMES | [ FIRST ] FILENAME ]
    +MATCHING regexp
    +[ IN DIRECTORY '...' ]
    +
    +
    +

    The matching clause applies given regular expression (see above +for exact syntax, several options can be used here) to filenames. +It’s then possible to load data from only the first match of all of +them.

    +

    The optional IN DIRECTORY clause allows specifying which directory +to walk for finding the data files, and can be either relative to +where the command file is read from, or absolute. The given +directory must exists.

    +
  • +
+
+
+
+

Fields Specifications

+

The FROM option also supports an optional comma separated list of field +names describing what is expected in the FIXED data file.

+

Each field name is composed of the field name followed with specific reader +options for that field. Supported per-field reader options are the +following, where only start and length are required.

+
+
    +
  • start

    +

    Position in the line where to start reading that field’s value. Can +be entered with decimal digits or 0x then hexadecimal digits.

    +
  • +
  • length

    +

    How many bytes to read from the start position to read that +field’s value. Same format as start.

    +
  • +
+
+

Those optional parameters must be enclosed in square brackets and +comma-separated:

+
+
    +
  • terminated by

    +
    +

    See the description of field terminated by below.

    +

    The processing of this option is not currently implemented.

    +
    +
  • +
  • date format

    +

    When the field is expected of the date type, then this option allows +to specify the date format used in the file.

    +

    Date format string are template strings modeled against the +PostgreSQL to_char template strings support, limited to the +following patterns:

    +
    +
      +
    • YYYY, YYY, YY for the year part
    • +
    • MM for the numeric month part
    • +
    • DD for the numeric day part
    • +
    • HH, HH12, HH24 for the hour part
    • +
    • am, AM, a.m., A.M.
    • +
    • pm, PM, p.m., P.M.
    • +
    • MI for the minutes part
    • +
    • SS for the seconds part
    • +
    • MS for the milliseconds part (4 digits)
    • +
    • US for the microseconds part (6 digits)
    • +
    • unparsed punctuation signs: - . * # @ T / and space
    • +
    +
    +

    Here’s an example of a date format specification:

    +
    column-name [date format 'YYYY-MM-DD HH24-MI-SS.US']
    +
    +
    +
  • +
  • null if

    +

    This option takes an argument which is either the keyword blanks +or a double-quoted string.

    +

    When blanks is used and the field value that is read contains only +space characters, then it’s automatically converted to an SQL NULL +value.

    +

    When a double-quoted string is used and that string is read as the +field value, then the field value is automatically converted to an +SQL NULL value.

    +
  • +
  • trim both whitespace, trim left whitespace, trim right whitespace

    +

    This option allows to trim whitespaces in the read data, either from +both sides of the data, or only the whitespace characters found on +the left of the streaing, or only those on the right of the string.

    +
  • +
+
+
+
+

Fixed File Format Loading Options: WITH

+

When loading from a FIXED file, the following options are supported:

+
+
    +
  • truncate

    +

    When this option is listed, pgloader issues a TRUNCATE command +against the PostgreSQL target table before reading the data file.

    +
  • +
  • disable triggers

    +

    When this option is listed, pgloader issues an ALTER TABLE … +DISABLE TRIGGER ALL command against the PostgreSQL target table +before copying the data, then the command ALTER TABLE … ENABLE +TRIGGER ALL once the COPY is done.

    +

    This option allows loading data into a pre-existing table ignoring +the foreign key constraints and user defined triggers and may +result in invalid foreign key constraints once the data is loaded. +Use with care.

    +
  • +
  • skip header

    +

    Takes a numeric value as argument. Instruct pgloader to skip that +many lines at the beginning of the input file.

    +
  • +
+
+
+
+ + +
+
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/_build/html/ref/ixf.html b/docs/_build/html/ref/ixf.html new file mode 100644 index 0000000..eb568f1 --- /dev/null +++ b/docs/_build/html/ref/ixf.html @@ -0,0 +1,149 @@ + + + + + + + Loading IXF Data — pgloader 3.4.1 documentation + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+

Loading IXF Data

+

This command instructs pgloader to load data from an IBM IXF file. Here’s +an example:

+
LOAD IXF
+    FROM data/nsitra.test1.ixf
+    INTO postgresql:///pgloader
+  TARGET TABLE nsitra.test1
+    WITH truncate, create table, timezone UTC
+
+  BEFORE LOAD DO
+   $$ create schema if not exists nsitra; $$,
+   $$ drop table if exists nsitra.test1; $$;
+
+
+

The ixf format command accepts the following clauses and options.

+
+

IXF Source Specification: FROM

+

Filename where to load the data from. This support local files, HTTP URLs +and zip files containing a single ixf file of the same name. Fetch such a +zip file from an HTTP address is of course supported.

+
+
+

IXF Loading Options: WITH

+

When loading from a IXF file, the following options are supported:

+
+
    +
  • truncate

    +

    When this option is listed, pgloader issues a TRUNCATE command against +the PostgreSQL target table before reading the data file.

    +
  • +
  • disable triggers

    +

    When this option is listed, pgloader issues an ALTER TABLE … DISABLE +TRIGGER ALL command against the PostgreSQL target table before copying +the data, then the command ALTER TABLE … ENABLE TRIGGER ALL once the +COPY is done.

    +

    This option allows loading data into a pre-existing table ignoring the +foreign key constraints and user defined triggers and may result in +invalid foreign key constraints once the data is loaded. Use with +care.

    +
  • +
  • create table

    +

    When this option is listed, pgloader creates the table using the meta +data found in the DBF file, which must contain a list of fields with +their data type. A standard data type conversion from DBF to PostgreSQL +is done.

    +
  • +
  • table name

    +

    This options expects as its value the possibly qualified name of the +table to create.

    +
  • +
  • timezone

    +

    This options allows to specify which timezone is used when parsing +timestamps from an IXF file, and defaults to UTC. Expected values are +either UTC, GMT or a single quoted location name such as +‘Universal’ or ‘Europe/Paris’.

    +
  • +
+
+
+
+ + +
+
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/_build/html/ref/mssql.html b/docs/_build/html/ref/mssql.html new file mode 100644 index 0000000..0dac5ad --- /dev/null +++ b/docs/_build/html/ref/mssql.html @@ -0,0 +1,236 @@ + + + + + + + Migrating a MS SQL Database to PostgreSQL — pgloader 3.4.1 documentation + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+

Migrating a MS SQL Database to PostgreSQL

+

This command instructs pgloader to load data from a MS SQL database. +Automatic discovery of the schema is supported, including build of the +indexes, primary and foreign keys constraints.

+

Here’s an example:

+
load database
+     from mssql://user@host/dbname
+     into postgresql:///dbname
+
+including only table names like 'GlobalAccount' in schema 'dbo'
+
+set work_mem to '16MB', maintenance_work_mem to '512 MB'
+
+before load do $$ drop schema if exists dbo cascade; $$;
+
+
+

The mssql command accepts the following clauses and options.

+
+

MS SQL Database Source Specification: FROM

+

Connection string to an existing MS SQL database server that listens and +welcome external TCP/IP connection. As pgloader currently piggybacks on the +FreeTDS driver, to change the port of the server please export the TDSPORT +environment variable.

+
+
+

MS SQL Database Migration Options: WITH

+

When loading from a MS SQL database, the same options as when loading a +MySQL database are supported. Please refer to the MySQL section. The +following options are added:

+
+
    +
  • create schemas

    +

    When this option is listed, pgloader creates the same schemas as found +on the MS SQL instance. This is the default.

    +
  • +
  • create no schemas

    +

    When this option is listed, pgloader refrains from creating any schemas +at all, you must then ensure that the target schema do exist.

    +
  • +
+
+
+
+

MS SQL Database Casting Rules

+
+

CAST

+

The cast clause allows to specify custom casting rules, either to overload +the default casting rules or to amend them with special cases.

+

Please refer to the MySQL CAST clause for details.

+
+
+
+

MS SQL Partial Migration

+
+

INCLUDING ONLY TABLE NAMES LIKE

+

Introduce a comma separated list of table name patterns used to limit the +tables to migrate to a sublist. More than one such clause may be used, they +will be accumulated together.

+

Example:

+
including only table names lile 'GlobalAccount' in schema 'dbo'
+
+
+
+
+

EXCLUDING TABLE NAMES LIKE

+

Introduce a comma separated list of table name patterns used to exclude +table names from the migration. This filter only applies to the result of +the INCLUDING filter.

+
excluding table names matching 'LocalAccount' in schema 'dbo'
+
+
+
+
+
+

MS SQL Schema Transformations

+
+

ALTER SCHEMA ‘…’ RENAME TO ‘…’

+

Allows to rename a schema on the flight, so that for instance the tables +found in the schema ‘dbo’ in your source database will get migrated into the +schema ‘public’ in the target database with this command:

+
alter schema 'dbo' rename to 'public'
+
+
+
+
+

ALTER TABLE NAMES MATCHING … IN SCHEMA ‘…’

+

See the MySQL explanation for this clause above. It works the same in the +context of migrating from MS SQL, only with the added option to specify the +name of the schema where to find the definition of the target tables.

+

The matching is done in pgloader itself, with a Common Lisp regular +expression lib, so doesn’t depend on the LIKE implementation of MS SQL, +nor on the lack of support for regular expressions in the engine.

+
+
+
+

MS SQL Driver setup and encoding

+

pgloader is using the FreeTDS driver, and internally expects the data to +be sent in utf-8. To achieve that, you can configure the FreeTDS driver with +those defaults, in the file ~/.freetds.conf:

+
[global]
+    tds version = 7.4
+    client charset = UTF-8
+
+
+
+
+

Default MS SQL Casting Rules

+

When migrating from MS SQL the following Casting Rules are provided:

+

Numbers:

+
type tinyint to smallint
+
+type float to float   using float-to-string
+type real to real     using float-to-string
+type double to double precision     using float-to-string
+type numeric to numeric     using float-to-string
+type decimal to numeric     using float-to-string
+type money to numeric     using float-to-string
+type smallmoney to numeric     using float-to-string
+
+
+

Texts:

+
type char      to text drop typemod
+type nchat     to text drop typemod
+type varchar   to text drop typemod
+type nvarchar  to text drop typemod
+type xml       to text drop typemod
+
+
+

Binary:

+
type binary    to bytea using byte-vector-to-bytea
+type varbinary to bytea using byte-vector-to-bytea
+
+
+

Date:

+
type datetime    to timestamptz
+type datetime2   to timestamptz
+
+
+

Others:

+
type bit to boolean
+type hierarchyid to bytea
+type geography to bytea
+type uniqueidentifier to uuid using sql-server-uniqueidentifier-to-uuid
+
+
+
+
+ + +
+
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/_build/html/ref/mysql.html b/docs/_build/html/ref/mysql.html new file mode 100644 index 0000000..9e7c2cc --- /dev/null +++ b/docs/_build/html/ref/mysql.html @@ -0,0 +1,639 @@ + + + + + + + Migrating a MySQL Database to PostgreSQL — pgloader 3.4.1 documentation + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+

Migrating a MySQL Database to PostgreSQL

+

This command instructs pgloader to load data from a database connection. The +only supported database source is currently MySQL, and pgloader supports +dynamically converting the schema of the source database and the indexes +building.

+

A default set of casting rules are provided and might be overloaded and +appended to by the command.

+

Here’s an example using as many options as possible, some of them even being +defaults. Chances are you don’t need that complex a setup, don’t copy and +paste it, use it only as a reference!

+
LOAD DATABASE
+     FROM      mysql://root@localhost/sakila
+     INTO postgresql://localhost:54393/sakila
+
+ WITH include drop, create tables, create indexes, reset sequences,
+      workers = 8, concurrency = 1,
+      multiple readers per thread, rows per range = 50000
+
+  SET PostgreSQL PARAMETERS
+      maintenance_work_mem to '128MB',
+      work_mem to '12MB',
+      search_path to 'sakila, public, "$user"'
+
+  SET MySQL PARAMETERS
+      net_read_timeout  = '120',
+      net_write_timeout = '120'
+
+ CAST type bigint when (= precision 20) to bigserial drop typemod,
+      type date drop not null drop default using zero-dates-to-null,
+      -- type tinyint to boolean using tinyint-to-boolean,
+      type year to integer
+
+ MATERIALIZE VIEWS film_list, staff_list
+
+ -- INCLUDING ONLY TABLE NAMES MATCHING ~/film/, 'actor'
+ -- EXCLUDING TABLE NAMES MATCHING ~<ory>
+ -- DECODING TABLE NAMES MATCHING ~/messed/, ~/encoding/ AS utf8
+ -- ALTER TABLE NAMES MATCHING 'film' RENAME TO 'films'
+ -- ALTER TABLE NAMES MATCHING ~/_list$/ SET SCHEMA 'mv'
+
+ ALTER TABLE NAMES MATCHING ~/_list$/, 'sales_by_store', ~/sales_by/
+  SET SCHEMA 'mv'
+
+ ALTER TABLE NAMES MATCHING 'film' RENAME TO 'films'
+ ALTER TABLE NAMES MATCHING ~/./ SET (fillfactor='40')
+
+ ALTER SCHEMA 'sakila' RENAME TO 'pagila'
+
+ BEFORE LOAD DO
+   $$ create schema if not exists pagila; $$,
+   $$ create schema if not exists mv;     $$,
+   $$ alter database sakila set search_path to pagila, mv, public; $$;
+
+
+

The database command accepts the following clauses and options.

+
+

MySQL Database Source Specification: FROM

+

Must be a connection URL pointing to a MySQL database.

+

If the connection URI contains a table name, then only this table is +migrated from MySQL to PostgreSQL.

+

See the SOURCE CONNECTION STRING section above for details on how to write +the connection string. The MySQL connection string accepts the same +parameter sslmode as the PostgreSQL connection string, but the verify +mode is not implemented (yet).

+

Environment variables described in +<http://dev.mysql.com/doc/refman/5.0/en/environment-variables.html> can be +used as default values too. If the user is not provided, then it defaults to +USER environment variable value. The password can be provided with the +environment variable MYSQL_PWD. The host can be provided with the +environment variable MYSQL_HOST and otherwise defaults to localhost. The +port can be provided with the environment variable MYSQL_TCP_PORT and +otherwise defaults to 3306.

+
+
+

MySQL Database Migration Options: WITH

+

When loading from a MySQL database, the following options are supported, +and the default WITH clause is: no truncate, create schema, create +tables, include drop, create indexes, reset sequences, foreign +keys, downcase identifiers, uniquify index names.

+
+
    +
  • include drop

    +

    When this option is listed, pgloader drops all the tables in the target +PostgreSQL database whose names appear in the MySQL database. This +option allows for using the same command several times in a row until +you figure out all the options, starting automatically from a clean +environment. Please note that CASCADE is used to ensure that tables +are dropped even if there are foreign keys pointing to them. This is +precisely what include drop is intended to do: drop all target tables +and recreate them.

    +

    Great care needs to be taken when using include drop, as it will +cascade to all objects referencing the target tables, possibly +including other tables that are not being loaded from the source DB.

    +
  • +
  • include no drop

    +

    When this option is listed, pgloader will not include any DROP +statement when loading the data.

    +
  • +
  • truncate

    +

    When this option is listed, pgloader issue the TRUNCATE command +against each PostgreSQL table just before loading data into it.

    +
  • +
  • no truncate

    +

    When this option is listed, pgloader issues no TRUNCATE command.

    +
  • +
  • disable triggers

    +

    When this option is listed, pgloader issues an ALTER TABLE … DISABLE +TRIGGER ALL command against the PostgreSQL target table before copying +the data, then the command ALTER TABLE … ENABLE TRIGGER ALL once the +COPY is done.

    +

    This option allows loading data into a pre-existing table ignoring the +foreign key constraints and user defined triggers and may result in +invalid foreign key constraints once the data is loaded. Use with +care.

    +
  • +
  • create tables

    +

    When this option is listed, pgloader creates the table using the meta +data found in the MySQL file, which must contain a list of fields with +their data type. A standard data type conversion from DBF to PostgreSQL +is done.

    +
  • +
  • create no tables

    +

    When this option is listed, pgloader skips the creation of table before +loading data, target tables must then already exist.

    +

    Also, when using create no tables pgloader fetches the metadata from +the current target database and checks type casting, then will remove +constraints and indexes prior to loading the data and install them back +again once the loading is done.

    +
  • +
  • create indexes

    +

    When this option is listed, pgloader gets the definitions of all the +indexes found in the MySQL database and create the same set of index +definitions against the PostgreSQL database.

    +
  • +
  • create no indexes

    +

    When this option is listed, pgloader skips the creating indexes.

    +
  • +
  • drop indexes

    +

    When this option is listed, pgloader drops the indexes in the target +database before loading the data, and creates them again at the end +of the data copy.

    +
  • +
  • uniquify index names, preserve index names

    +

    MySQL index names are unique per-table whereas in PostgreSQL index names +have to be unique per-schema. The default for pgloader is to change the +index name by prefixing it with idx_OID where OID is the internal +numeric identifier of the table the index is built against.

    +

    In somes cases like when the DDL are entirely left to a framework it +might be sensible for pgloader to refrain from handling index unique +names, that is achieved by using the preserve index names option.

    +

    The default is to uniquify index names.

    +

    Even when using the option preserve index names, MySQL primary key +indexes named “PRIMARY” will get their names uniquified. Failing to do +so would prevent the primary keys to be created again in PostgreSQL +where the index names must be unique per schema.

    +
  • +
  • drop schema

    +

    When this option is listed, pgloader drops the target schema in the +target PostgreSQL database before creating it again and all the objects +it contains. The default behavior doesn’t drop the target schemas.

    +
  • +
  • foreign keys

    +

    When this option is listed, pgloader gets the definitions of all the +foreign keys found in the MySQL database and create the same set of +foreign key definitions against the PostgreSQL database.

    +
  • +
  • no foreign keys

    +

    When this option is listed, pgloader skips creating foreign keys.

    +
  • +
  • reset sequences

    +

    When this option is listed, at the end of the data loading and after the +indexes have all been created, pgloader resets all the PostgreSQL +sequences created to the current maximum value of the column they are +attached to.

    +

    The options schema only and data only have no effects on this +option.

    +
  • +
  • reset no sequences

    +

    When this option is listed, pgloader skips resetting sequences after the +load.

    +

    The options schema only and data only have no effects on this +option.

    +
  • +
  • downcase identifiers

    +

    When this option is listed, pgloader converts all MySQL identifiers +(table names, index names, column names) to downcase, except for +PostgreSQL reserved keywords.

    +

    The PostgreSQL reserved keywords are determined dynamically by using +the system function pg_get_keywords().

    +
  • +
  • quote identifiers

    +

    When this option is listed, pgloader quotes all MySQL identifiers so +that their case is respected. Note that you will then have to do the +same thing in your application code queries.

    +
  • +
  • schema only

    +

    When this option is listed pgloader refrains from migrating the data +over. Note that the schema in this context includes the indexes when the +option create indexes has been listed.

    +
  • +
  • data only

    +

    When this option is listed pgloader only issues the COPY statements, +without doing any other processing.

    +
  • +
  • single reader per thread, multiple readers per thread

    +

    The default is single reader per thread and it means that each +MySQL table is read by a single thread as a whole, with a single +SELECT statement using no WHERE clause.

    +

    When using multiple readers per thread pgloader may be able to +divide the reading work into several threads, as many as the +concurrency setting, which needs to be greater than 1 for this +option to kick be activated.

    +

    For each source table, pgloader searches for a primary key over a +single numeric column, or a multiple-column primary key index for +which the first column is of a numeric data type (one of integer +or bigint). When such an index exists, pgloader runs a query to +find the min and max values on this column, and then split that +range into many ranges containing a maximum of rows per range.

    +

    When the range list we then obtain contains at least as many ranges +than our concurrency setting, then we distribute those ranges to +each reader thread.

    +

    So when all the conditions are met, pgloader then starts as many +reader thread as the concurrency setting, and each reader thread +issues several queries with a WHERE id >= x AND id < y, where y - +x = rows per range or less (for the last range, depending on the +max value just obtained.

    +
  • +
  • rows per range

    +

    How many rows are fetched per SELECT query when using multiple +readers per thread, see above for details.

    +
  • +
  • SET MySQL PARAMETERS

    +

    The SET MySQL PARAMETERS allows setting MySQL parameters using the +MySQL SET command each time pgloader connects to it.

    +
  • +
+
+
+
+

MySQL Database Casting Rules

+

The command CAST introduces user-defined casting rules.

+

The cast clause allows to specify custom casting rules, either to overload +the default casting rules or to amend them with special cases.

+

A casting rule is expected to follow one of the forms:

+
type <mysql-type-name> [ <guard> ... ] to <pgsql-type-name> [ <option> ... ]
+column <table-name>.<column-name> [ <guards> ] to ...
+
+
+

It’s possible for a casting rule to either match against a MySQL data type +or against a given column name in a given table name. That flexibility +allows to cope with cases where the type tinyint might have been used as a +boolean in some cases but as a smallint in others.

+

The casting rules are applied in order, the first match prevents following +rules to be applied, and user defined rules are evaluated first.

+

The supported guards are:

+
+
    +
  • when unsigned

    +

    The casting rule is only applied against MySQL columns of the source +type that have the keyword unsigned in their data type definition.

    +

    Example of a casting rule using a unsigned guard:

    +
    type smallint when unsigned to integer drop typemod
    +
    +
    +
  • +
  • when default ‘value’

    +

    The casting rule is only applied against MySQL columns of the source +type that have given value, which must be a single-quoted or a +double-quoted string.

    +
  • +
  • when typemod expression

    +

    The casting rule is only applied against MySQL columns of the source +type that have a typemod value matching the given typemod +expression. The typemod is separated into its precision and scale +components.

    +

    Example of a cast rule using a typemod guard:

    +
    type char when (= precision 1) to char keep typemod
    +
    +
    +

    This expression casts MySQL char(1) column to a PostgreSQL column of +type char(1) while allowing for the general case char(N) will be +converted by the default cast rule into a PostgreSQL type varchar(N).

    +
  • +
  • with extra auto_increment

    +

    The casting rule is only applied against MySQL columns having the +extra column auto_increment option set, so that it’s possible to +target e.g. serial rather than integer.

    +

    The default matching behavior, when this option isn’t set, is to match +both columns with the extra definition and without.

    +

    This means that if you want to implement a casting rule that target +either serial or integer from a smallint definition depending on +the auto_increment extra bit of information from MySQL, then you need +to spell out two casting rules as following:

    +
    type smallint  with extra auto_increment
    +  to serial drop typemod keep default keep not null,
    +
    +type smallint
    +  to integer drop typemod keep default keep not null
    +
    +
    +
  • +
+
+

The supported casting options are:

+
+
    +
  • drop default, keep default

    +

    When the option drop default is listed, pgloader drops any +existing default expression in the MySQL database for columns of the +source type from the CREATE TABLE statement it generates.

    +

    The spelling keep default explicitly prevents that behaviour and +can be used to overload the default casting rules.

    +
  • +
  • drop not null, keep not null, set not null

    +

    When the option drop not null is listed, pgloader drops any +existing NOT NULL constraint associated with the given source +MySQL datatype when it creates the tables in the PostgreSQL +database.

    +

    The spelling keep not null explicitly prevents that behaviour and +can be used to overload the default casting rules.

    +

    When the option set not null is listed, pgloader sets a NOT NULL +constraint on the target column regardless whether it has been set +in the source MySQL column.

    +
  • +
  • drop typemod, keep typemod

    +

    When the option drop typemod is listed, pgloader drops any +existing typemod definition (e.g. precision and scale) from +the datatype definition found in the MySQL columns of the source +type when it created the tables in the PostgreSQL database.

    +

    The spelling keep typemod explicitly prevents that behaviour and +can be used to overload the default casting rules.

    +
  • +
  • using

    +

    This option takes as its single argument the name of a function to +be found in the pgloader.transforms Common Lisp package. See above +for details.

    +

    It’s possible to augment a default cast rule (such as one that +applies against ENUM data type for example) with a transformation +function by omitting entirely the type parts of the casting rule, +as in the following example:

    +
    column enumerate.foo using empty-string-to-null
    +
    +
    +
  • +
+
+
+
+

MySQL Views Support

+

MySQL views support allows pgloader to migrate view as if they were base +tables. This feature then allows for on-the-fly transformation from MySQL to +PostgreSQL, as the view definition is used rather than the base data.

+
+

MATERIALIZE VIEWS

+

This clause allows you to implement custom data processing at the data +source by providing a view definition against which pgloader will query +the data. It’s not possible to just allow for plain SQL because we want to +know a lot about the exact data types of each column involved in the query +output.

+

This clause expect a comma separated list of view definitions, each one +being either the name of an existing view in your database or the following +expression:

+
*name* `AS` `$$` *sql query* `$$`
+
+
+

The name and the sql query will be used in a CREATE VIEW statement at +the beginning of the data loading, and the resulting view will then be +dropped at the end of the data loading.

+
+
+

MATERIALIZE ALL VIEWS

+

Same behaviour as MATERIALIZE VIEWS using the dynamic list of views as +returned by MySQL rather than asking the user to specify the list.

+
+
+
+

MySQL Partial Migration

+
+

INCLUDING ONLY TABLE NAMES MATCHING

+

Introduce a comma separated list of table names or regular expression used +to limit the tables to migrate to a sublist.

+

Example:

+
including only table names matching ~/film/, 'actor'
+
+
+
+
+

EXCLUDING TABLE NAMES MATCHING

+

Introduce a comma separated list of table names or regular expression used +to exclude table names from the migration. This filter only applies to the +result of the INCLUDING filter.

+
excluding table names matching ~<ory>
+
+
+
+
+
+

MySQL Encoding Support

+
+

DECODING TABLE NAMES MATCHING

+

Introduce a comma separated list of table names or regular expressions +used to force the encoding to use when processing data from MySQL. If the +data encoding known to you is different from MySQL’s idea about it, this is +the option to use.

+
decoding table names matching ~/messed/, ~/encoding/ AS utf8
+
+
+

You can use as many such rules as you need, all with possibly different +encodings.

+
+
+
+

MySQL Schema Transformations

+
+

ALTER TABLE NAMES MATCHING

+

Introduce a comma separated list of table names or regular expressions +that you want to target in the pgloader ALTER TABLE command. The only two +available actions are SET SCHEMA and RENAME TO, both take a quoted +string as parameter:

+
ALTER TABLE NAMES MATCHING ~/_list$/, 'sales_by_store', ~/sales_by/
+ SET SCHEMA 'mv'
+
+ALTER TABLE NAMES MATCHING 'film' RENAME TO 'films'
+
+ALTER TABLE NAMES MATCHING ~/./ SET (fillfactor='40')
+
+
+

You can use as many such rules as you need. The list of tables to be +migrated is searched in pgloader memory against the ALTER TABLE matching +rules, and for each command pgloader stops at the first matching criteria +(regexp or string).

+

No ALTER TABLE command is sent to PostgreSQL, the modification happens at +the level of the pgloader in-memory representation of your source database +schema. In case of a name change, the mapping is kept and reused in the +foreign key and index support.

+

The SET () action takes effect as a WITH clause for the CREATE TABLE +command that pgloader will run when it has to create a table.

+
+
+
+

MySQL Migration: limitations

+

The database command currently only supports MySQL source database and has +the following limitations:

+
+
    +
  • Views are not migrated,

    +

    Supporting views might require implementing a full SQL parser for the +MySQL dialect with a porting engine to rewrite the SQL against +PostgreSQL, including renaming functions and changing some constructs.

    +

    While it’s not theoretically impossible, don’t hold your breath.

    +
  • +
  • Triggers are not migrated

    +

    The difficulty of doing so is not yet assessed.

    +
  • +
  • Of the geometric datatypes, only the POINT database has been covered. +The other ones should be easy enough to implement now, it’s just not +done yet.

    +
  • +
+
+
+
+

Default MySQL Casting Rules

+

When migrating from MySQL the following Casting Rules are provided:

+

Numbers:

+
type int with extra auto_increment to serial when (< precision 10)
+type int with extra auto_increment to bigserial when (<= 10 precision)
+type int to int       when  (< precision 10)
+type int to bigint    when  (<= 10 precision)
+type tinyint   with extra auto_increment to serial
+type smallint  with extra auto_increment to serial
+type mediumint with extra auto_increment to serial
+type bigint    with extra auto_increment to bigserial
+
+type tinyint to boolean when (= 1 precision) using tinyint-to-boolean
+
+type tinyint when unsigned to smallint   drop typemod
+type smallint when unsigned to integer  drop typemod
+type mediumint when unsigned to integer  drop typemod
+type integer when unsigned to bigint    drop typemod
+
+type tinyint to smallint   drop typemod
+type smallint to smallint  drop typemod
+type mediumint to integer  drop typemod
+type integer to integer    drop typemod
+type bigint to bigint      drop typemod
+
+type float to float        drop typemod
+type double to double precision drop typemod
+
+type numeric to numeric keep typemod
+type decimal to decimal keep typemod
+
+
+

Texts:

+
type char       to char keep typemod using remove-null-characters
+type varchar    to varchar keep typemod using remove-null-characters
+type tinytext   to text using remove-null-characters
+type text       to text using remove-null-characters
+type mediumtext to text using remove-null-characters
+type longtext   to text using remove-null-characters
+
+
+

Binary:

+
+
type binary to bytea +type varbinary to bytea +type tinyblob to bytea +type blob to bytea +type mediumblob to bytea +type longblob to bytea
+

Date:

+
type datetime when default "0000-00-00 00:00:00" and not null
+  to timestamptz drop not null drop default
+      using zero-dates-to-null
+
+type datetime when default "0000-00-00 00:00:00"
+  to timestamptz drop default
+      using zero-dates-to-null
+
+type timestamp when default "0000-00-00 00:00:00" and not null
+  to timestamptz drop not null drop default
+      using zero-dates-to-null
+
+type timestamp when default "0000-00-00 00:00:00"
+  to timestamptz drop default
+      using zero-dates-to-null
+
+type date when default "0000-00-00" to date drop default
+      using zero-dates-to-null
+
+type date to date
+type datetime to timestamptz
+type timestamp to timestamptz
+type year to integer drop typemod
+
+
+

Geometric:

+
type point to point using pgloader.transforms::convert-mysql-point
+
+
+

Enum types are declared inline in MySQL and separately with a CREATE TYPE +command in PostgreSQL, so each column of Enum Type is converted to a type +named after the table and column names defined with the same labels in the +same order.

+

When the source type definition is not matched in the default casting rules +nor in the casting rules provided in the command, then the type name with +the typemod is used.

+
+
+ + +
+
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/_build/html/ref/sqlite.html b/docs/_build/html/ref/sqlite.html new file mode 100644 index 0000000..4da185d --- /dev/null +++ b/docs/_build/html/ref/sqlite.html @@ -0,0 +1,268 @@ + + + + + + + Migrating a SQLite database to PostgreSQL — pgloader 3.4.1 documentation + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+

Migrating a SQLite database to PostgreSQL

+

This command instructs pgloader to load data from a SQLite file. Automatic +discovery of the schema is supported, including build of the indexes.

+

Here’s an example:

+
load database
+     from sqlite:///Users/dim/Downloads/lastfm_tags.db
+     into postgresql:///tags
+
+ with include drop, create tables, create indexes, reset sequences
+
+  set work_mem to '16MB', maintenance_work_mem to '512 MB';
+
+
+

The sqlite command accepts the following clauses and options.

+
+

SQLite Database Source Specification: FROM

+

Path or HTTP URL to a SQLite file, might be a .zip file.

+
+
+

SQLite Database Migration Options: WITH

+

When loading from a SQLite database, the following options are +supported:

+

When loading from a SQLite database, the following options are +supported, and the default WITH clause is: no truncate, create +tables, include drop, create indexes, reset sequences, downcase +identifiers, encoding ‘utf-8’.

+
+
    +
  • include drop

    +

    When this option is listed, pgloader drops all the tables in the target +PostgreSQL database whose names appear in the SQLite database. This +option allows for using the same command several times in a row until +you figure out all the options, starting automatically from a clean +environment. Please note that CASCADE is used to ensure that tables +are dropped even if there are foreign keys pointing to them. This is +precisely what include drop is intended to do: drop all target tables +and recreate them.

    +

    Great care needs to be taken when using include drop, as it will +cascade to all objects referencing the target tables, possibly +including other tables that are not being loaded from the source DB.

    +
  • +
  • include no drop

    +

    When this option is listed, pgloader will not include any DROP +statement when loading the data.

    +
  • +
  • truncate

    +

    When this option is listed, pgloader issue the TRUNCATE command +against each PostgreSQL table just before loading data into it.

    +
  • +
  • no truncate

    +

    When this option is listed, pgloader issues no TRUNCATE command.

    +
  • +
  • disable triggers

    +

    When this option is listed, pgloader issues an ALTER TABLE … DISABLE +TRIGGER ALL command against the PostgreSQL target table before copying +the data, then the command ALTER TABLE … ENABLE TRIGGER ALL once the +COPY is done.

    +

    This option allows loading data into a pre-existing table ignoring +the foreign key constraints and user defined triggers and may +result in invalid foreign key constraints once the data is loaded. +Use with care.

    +
  • +
  • create tables

    +

    When this option is listed, pgloader creates the table using the meta +data found in the SQLite file, which must contain a list of fields +with their data type. A standard data type conversion from SQLite to +PostgreSQL is done.

    +
  • +
  • create no tables

    +

    When this option is listed, pgloader skips the creation of table before +loading data, target tables must then already exist.

    +

    Also, when using create no tables pgloader fetches the metadata +from the current target database and checks type casting, then will +remove constraints and indexes prior to loading the data and install +them back again once the loading is done.

    +
  • +
  • create indexes

    +

    When this option is listed, pgloader gets the definitions of all the +indexes found in the SQLite database and create the same set of index +definitions against the PostgreSQL database.

    +
  • +
  • create no indexes

    +

    When this option is listed, pgloader skips the creating indexes.

    +
  • +
  • drop indexes

    +

    When this option is listed, pgloader drops the indexes in the target +database before loading the data, and creates them again at the end +of the data copy.

    +
  • +
  • reset sequences

    +

    When this option is listed, at the end of the data loading and after +the indexes have all been created, pgloader resets all the +PostgreSQL sequences created to the current maximum value of the +column they are attached to.

    +
  • +
  • reset no sequences

    +

    When this option is listed, pgloader skips resetting sequences after the +load.

    +

    The options schema only and data only have no effects on this +option.

    +
  • +
  • schema only

    +

    When this option is listed pgloader will refrain from migrating the data +over. Note that the schema in this context includes the indexes when the +option create indexes has been listed.

    +
  • +
  • data only

    +

    When this option is listed pgloader only issues the COPY statements, +without doing any other processing.

    +
  • +
  • encoding

    +

    This option allows to control which encoding to parse the SQLite text +data with. Defaults to UTF-8.

    +
  • +
+
+
+
+

SQLite Database Casting Rules

+

The command CAST introduces user-defined casting rules.

+

The cast clause allows to specify custom casting rules, either to overload +the default casting rules or to amend them with special cases.

+
+
+

SQlite Database Partial Migrations

+
+

INCLUDING ONLY TABLE NAMES LIKE

+

Introduce a comma separated list of table name patterns used to limit the +tables to migrate to a sublist.

+

Example:

+
including only table names like 'Invoice%'
+
+
+
+
+

EXCLUDING TABLE NAMES LIKE

+

Introduce a comma separated list of table name patterns used to exclude +table names from the migration. This filter only applies to the result of +the INCLUDING filter.

+
excluding table names like 'appointments'
+
+
+
+
+
+

Default SQLite Casting Rules

+

When migrating from SQLite the following Casting Rules are provided:

+

Numbers:

+
type tinyint to smallint using integer-to-string
+type integer to bigint   using integer-to-string
+
+type float to float   using float-to-string
+type real to real     using float-to-string
+type double to double precision     using float-to-string
+type numeric to numeric     using float-to-string
+
+
+

Texts:

+
type character  to text drop typemod
+type varchar    to text drop typemod
+type nvarchar   to text drop typemod
+type char       to text drop typemod
+type nchar      to text drop typemod
+type nvarchar   to text drop typemod
+type clob       to text drop typemod
+
+
+

Binary:

+
type blob       to bytea
+
+
+

Date:

+
type datetime    to timestamptz using sqlite-timestamp-to-timestamp
+type timestamp   to timestamptz using sqlite-timestamp-to-timestamp
+type timestamptz to timestamptz using sqlite-timestamp-to-timestamp
+
+
+
+
+ + +
+
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/_build/html/ref/transforms.html b/docs/_build/html/ref/transforms.html new file mode 100644 index 0000000..e3cffd8 --- /dev/null +++ b/docs/_build/html/ref/transforms.html @@ -0,0 +1,214 @@ + + + + + + + Transformation Functions — pgloader 3.4.1 documentation + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+

Transformation Functions

+

Some data types are implemented in a different enough way that a +transformation function is necessary. This function must be written in +Common lisp and is searched in the pgloader.transforms package.

+

Some default transformation function are provided with pgloader, and you can +use the –load command line option to load and compile your own lisp file +into pgloader at runtime. For your functions to be found, remember to begin +your lisp file with the following form:

+
(in-package #:pgloader.transforms)
+
+
+

The provided transformation functions are:

+
+
    +
  • zero-dates-to-null

    +

    When the input date is all zeroes, return nil, which gets loaded as a +PostgreSQL NULL value.

    +
  • +
  • date-with-no-separator

    +

    Applies zero-dates-to-null then transform the given date into a format +that PostgreSQL will actually process:

    +
    In:  "20041002152952"
    +Out: "2004-10-02 15:29:52"
    +
    +
    +
  • +
  • time-with-no-separator

    +

    Transform the given time into a format that PostgreSQL will actually +process:

    +
    In:  "08231560"
    +Out: "08:23:15.60"
    +
    +
    +
  • +
  • tinyint-to-boolean

    +

    As MySQL lacks a proper boolean type, tinyint is often used to +implement that. This function transforms 0 to ‘false’ and anything +else to ‘true’.

    +
  • +
  • bits-to-boolean

    +

    As MySQL lacks a proper boolean type, BIT is often used to implement +that. This function transforms 1-bit bit vectors from 0 to f and any +other value to t..

    +
  • +
  • int-to-ip

    +

    Convert an integer into a dotted representation of an ip4.

    +
    In:  18435761
    +Out: "1.25.78.177"
    +
    +
    +
  • +
  • ip-range

    +

    Converts a couple of integers given as strings into a range of ip4.

    +
    In:  "16825344" "16825599"
    +Out: "1.0.188.0-1.0.188.255"
    +
    +
    +
  • +
  • convert-mysql-point

    +

    Converts from the astext representation of points in MySQL to the +PostgreSQL representation.

    +
    In:  "POINT(48.5513589 7.6926827)"
    +Out: "(48.5513589,7.6926827)"
    +
    +
    +
  • +
  • integer-to-string

    +

    Converts a integer string or a Common Lisp integer into a string +suitable for a PostgreSQL integer. Takes care of quoted integers.

    +
    In:  "\"0\""
    +Out: "0"
    +
    +
    +
  • +
  • float-to-string

    +

    Converts a Common Lisp float into a string suitable for a PostgreSQL float:

    +
    In:  100.0d0
    +Out: "100.0"
    +
    +
    +
  • +
  • set-to-enum-array

    +

    Converts a string representing a MySQL SET into a PostgreSQL Array of +Enum values from the set.

    +
    In: "foo,bar"
    +Out: "{foo,bar}"
    +
    +
    +
  • +
  • empty-string-to-null

    +

    Convert an empty string to a null.

    +
  • +
  • right-trim

    +

    Remove whitespace at end of string.

    +
  • +
  • remove-null-characters

    +

    Remove NUL characters (0x0) from given strings.

    +
  • +
  • byte-vector-to-bytea

    +

    Transform a simple array of unsigned bytes to the PostgreSQL bytea Hex +Format representation as documented at +http://www.postgresql.org/docs/9.3/interactive/datatype-binary.html

    +
  • +
  • sqlite-timestamp-to-timestamp

    +

    SQLite type system is quite interesting, so cope with it here to produce +timestamp literals as expected by PostgreSQL. That covers year only on 4 +digits, 0 dates to null, and proper date strings.

    +
  • +
  • sql-server-uniqueidentifier-to-uuid

    +

    The SQL Server driver receives data fo type uniqueidentifier as byte +vector that we then need to convert to an UUID string for PostgreSQL +COPY input format to process.

    +
  • +
  • unix-timestamp-to-timestamptz

    +

    Converts a unix timestamp (number of seconds elapsed since beginning of +1970) into a proper PostgreSQL timestamp format.

    +
  • +
  • varbinary-to-string

    +

    Converts binary encoded string (such as a MySQL varbinary entry) to a +decoded text, using the table’s encoding that may be overloaded with the +DECODING TABLE NAMES MATCHING clause.

    +
  • +
+
+
+ + +
+
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/_build/html/search.html b/docs/_build/html/search.html new file mode 100644 index 0000000..35dce69 --- /dev/null +++ b/docs/_build/html/search.html @@ -0,0 +1,101 @@ + + + + + + + Search — pgloader 3.4.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +

Search

+
+ +

+ Please activate JavaScript to enable the search + functionality. +

+
+

+ From here you can search these documents. Enter your search + words into the box below and click "search". Note that the search + function will automatically search for all of the words. Pages + containing fewer words won't appear in the result list. +

+
+ + + +
+ +
+ +
+ +
+
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/_build/html/searchindex.js b/docs/_build/html/searchindex.js new file mode 100644 index 0000000..67dc5a1 --- /dev/null +++ b/docs/_build/html/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({docnames:["bugreport","index","intro","pgloader","pgloader-usage-examples","ref/archive","ref/copy","ref/csv","ref/dbf","ref/fixed","ref/ixf","ref/mssql","ref/mysql","ref/sqlite","ref/transforms","tutorial/csv","tutorial/dBase","tutorial/fixed","tutorial/geolite","tutorial/mysql","tutorial/quickstart","tutorial/sqlite","tutorial/tutorial"],envversion:53,filenames:["bugreport.rst","index.rst","intro.rst","pgloader.rst","pgloader-usage-examples.rst","ref/archive.rst","ref/copy.rst","ref/csv.rst","ref/dbf.rst","ref/fixed.rst","ref/ixf.rst","ref/mssql.rst","ref/mysql.rst","ref/sqlite.rst","ref/transforms.rst","tutorial/csv.rst","tutorial/dBase.rst","tutorial/fixed.rst","tutorial/geolite.rst","tutorial/mysql.rst","tutorial/quickstart.rst","tutorial/sqlite.rst","tutorial/tutorial.rst"],objects:{},objnames:{},objtypes:{},terms:{"000s":[19,21,22],"001s":[19,22],"003s":[21,22],"006s":[19,21,22],"007s":[19,22],"008s":[21,22],"010s":[16,22],"01234562008052115182300left":9,"01234567892008052011431250firstlin":9,"012s":[18,19,21,22],"013s":[17,21,22],"014s":[21,22],"016s":[21,22],"017s":[21,22],"018s":[19,21,22],"019s":[15,17,18,22],"021s":[21,22],"023s":[19,21,22],"025s":[21,22],"027s":[21,22],"031s":[21,22],"032s":[21,22],"033s":[21,22],"034s":[21,22],"035s":[19,22],"036s":[19,22],"037s":[19,22],"039s":[15,22],"040s":[21,22],"041s":[19,22],"043s":[21,22],"052s":[21,22],"058s":[15,19,22],"059s":[19,22],"068s":[19,22],"070s":[19,21,22],"071s":[16,19,21,22],"073s":[19,22],"077s":[21,22],"080s":[19,22],"0d0":14,"0x0":14,"105s":[21,22],"111s":[21,22],"12345678902008052208231560anoth":9,"128mb":[0,12,19,22],"12mb":[12,15,19,22],"130s":[19,22],"135s":[19,22],"136s":[19,22],"14mb":[6,9],"150s":[19,22],"154s":[19,22],"160s":[21,22],"167s":[16,22],"16mb":[11,13,21,22],"16t08":[19,22],"1m8":[18,22],"2013_gaz_113cds_nat":[4,20,22],"205s":[19,22],"208s":[19,22],"20t16":[21,22],"214s":[19,22],"227s":[19,22],"228s":[19,22],"236s":[19,22],"247s":[19,22],"254s":[19,22],"268s":[19,22],"279s":[21,22],"303s":[19,22],"313s":[21,22],"332s":[18,22],"365s":[19,22],"390s":[18,22],"402s":[19,22],"42p16":[21,22],"476s":[21,22],"494s":[17,22],"497s":[19,22],"499s":[17,22],"502s":[19,22],"527s":[19,22],"539s":[19,22],"547s":[19,22],"583s":[19,22],"592s":[18,22],"648s":[19,22],"658s":[16,19,22],"669s":[21,22],"692s":[18,22],"743s":[18,22],"877s":[21,22],"892s":[19,22],"906s":[16,22],"964s":[19,22],"9n8v8pw54t1gngfff0lj16040000gn":[16,17,18,22],"boolean":[11,12,14,19,22],"byte":[3,6,9,11,14],"case":[1,2,3,4,11,12,13,19,20,21,22],"char":[11,12,13,15,17,22],"default":[1,3,7,10,14,19,22],"enum":[12,14],"export":[3,11],"final":[1,4,18,20,22],"float":[11,12,13,14,18,22],"function":[1,3,12],"import":[3,4,15,16,17,18,19,20,21,22],"int":[12,14],"long":[17,22],"new":3,"null":[5,6,7,9,12,14,17,18,19,22],"public":[0,11,12],"return":[12,14],"short":0,"static":3,"switch":[3,4,20,22],"true":14,"try":[3,4,20,22],"var":[16,17,18,22],"while":[3,4,12,18,19,20,22],AND:[5,12,18,22],And:[1,18,22],For:[0,3,4,12,14,20,22],INTO:[0,5,6,7,8,9,10,12,15,16,17,18,22],Its:[21,22],NOT:[3,12],One:3,That:[2,3,7,12,14,18,22],The:[2,3,4,5,6,7,8,9,10,11,12,13,14,20],Then:[3,5],USING:[3,18,21,22],Use:[0,3,4,6,7,8,9,10,12,13],Useful:3,Using:[3,18,22],WITH:[0,1,5,15,16,17,18,19,22],_list:12,abil:3,abl:[2,3,12],about:[1,4,12,20,22],abov:[3,4,6,7,9,11,12,15,20,22],absolut:[3,6,7,9],accept:[2,3,5,6,7,8,9,10,11,12,13,21,22],access:7,accomod:3,accumul:[3,11],achiev:[11,12],action:12,activ:[3,12],actor:[12,19,22],actual:[3,14,18,22],add:[19,21,22],added:11,addit:3,address:[6,8,10,18,19,22],administr:[16,22],advanc:[3,19,21,22],aen66609:3,after:[2,6,7,9,12,13],again:[2,3,4,7,12,13,19,20,22],against:[3,4,5,6,7,8,9,10,12,13,20,21,22],al0100124abbevil:[17,22],al0100460adamsvil:[17,22],al0100484addison:[17,22],al0100676akron:[17,22],al0100820alabast:[17,22],al0100988albertvil:[17,22],al0101132alexand:[17,22],aland:[4,20,22],aland_sqmi:[4,20,22],album:[6,21,22],all:[2,3,4,5,6,7,8,9,10,11,13,14,19,20,21,22],allow:[2,3,5,6,7,8,9,10,11,12,13,15,17,19,21,22],alon:[19,22],alreadi:[3,12,13],also:[3,4,5,7,9,12,13,18,20,21,22],alter:[3,6,7,8,9,10,13,21,22],amend:[11,12,13],amount:3,ampersand:3,ani:[2,3,6,7,9,11,12,13,14],anoth:3,anyth:[3,14],anywai:3,api:[19,22],app:0,appdata:3,appear:[3,12,13],append:12,appli:[3,5,6,7,9,11,12,13,14],applic:12,application_nam:0,appoint:13,appropri:[18,22],arbitrari:3,architectur:[2,3],archiv:[1,3,16,17,18],areacod:[5,18,22],argument:[1,4,6,7,9,12,20,22],around:[3,19,22],arrai:14,arrang:9,artist:[21,22],ascii:[6,7],ask:12,aspect:2,assess:12,associ:12,astext:14,attach:[12,13],attempt:3,augment:12,auto_incr:[12,19,22],autom:[2,3],automat:[7,9,11,12,13,19,22],avail:[2,3,12],awai:[3,19,22],awat:[4,20,22],awater_sqmi:[4,20,22],back:[12,13],backslash:[0,7],backward:3,bad:3,baddata:0,bar:14,base:[3,4,12,20,22],basic:3,batch:1,battl:[4,20,22],becaus:[3,4,12,20,22],been:[3,5,12,13,15,16,17,18,19,21,22],befor:[0,2,5,6,7,8,9,10,11,12,13,15,16,17,18,19,21,22],begin:[3,6,7,9,12,14],behavior:[3,12],behaviour:[1,7,12],being:[3,4,12,13,20,22],below:[3,7,9],benefit:[16,19,21,22],best:7,better:3,between:[0,4,6,7,9,20,22],bigint:[4,6,12,13,15,20,22],bigseri:[6,12,19,22],binari:[3,11,12,13,14],bit:[3,11,12,14],blank:[5,7,9,17,18,22],blob:[12,13],block:[5,7,18,22],blocks_ip4r_idx:[5,18,22],both:[3,7,9,12,19,22],bracket:[7,9],breath:12,brows:[15,16,17,18,19,21,22],buffer:[4,20,22],bug:1,build:[11,12,13,19,21,22],built:[7,12],bypass:[3,4,20,22],bytea:[11,12,13,14],calendar:[19,22],can:[2,3,4,5,6,7,9,11,12,14,15,16,17,18,19,20,21,22],canada:[15,22],capabl:[16,19,21,22],care:[0,4,6,7,8,9,10,12,13,14,19,20,21,22],cascad:[11,12,13,18,22],cast:[1,3,4,19,20,22],categori:[19,22],caus:3,censu:[17,22],chanc:12,chang:[3,11,12],charact:[3,4,6,7,9,12,13,14,20,22],characterist:3,charset:11,check:[12,13],checkout:3,chinook:[21,22],chinook_sqlite_autoincrementpk:[21,22],chinookdatabas:[21,22],choic:[19,22],circuit:[19,22],citi:[5,17,18,19,22],claus:[1,5,6,7,8,9,10,11,12,13,14,19,22],clean:[12,13],client:[3,11],client_encod:[15,16,22],clob:13,close:3,code:[3,6,7,12],cog:[4,8,16,20,22],col:1,collid:3,colon:3,column:[3,4,7,9,12,13,15,17,18,19,20,22],com:[0,12,18,19,21,22],come:3,comma:[3,7,9,11,12,13,15,22],command:[1,6,7,8,9,10,11,12,13,14,20],comment:[19,21,22],commerci:[19,22],common:[1,11,12,14],commonli:[4,20,22],compat:3,compil:[3,14],complet:[3,19,21,22],complex:[3,12],compon:[3,12],compos:[6,9],compress:4,comput:3,concurr:[3,12,21,22],condit:[7,12],conf:[3,11],config:3,configur:[3,11],confus:3,connect:[2,4,11,12,20,22],connstr:3,consid:3,consist:[3,18,22],consol:3,constraint:[3,6,7,8,9,10,11,12,13,19,21,22],construct:12,constructor:[19,22],constructorresult:[19,22],constructorstand:[19,22],contain:[0,2,3,4,5,6,7,8,9,10,12,13,18,20,21,22],content:[1,4,5,15,17,18,19,20,22],context:[3,11,12,13],continu:[1,3],control:[3,13],convers:[8,10,12,13],convert:[7,9,12,14],cope:[3,12,14,19,22],copi:[1,2,3,7,8,9,10,12,13,14,19,21,22],copyright:[4,20,22],could:[3,4,7,9,20,22],count:3,countri:[5,18,19,22],coupl:[3,14,17,22],cours:[6,8,10,18,22],cover:[3,12,14],creat:[0,3,4,5,6,7,8,9,10,11,12,13,15,16,17,18,19,20,21,22],createdb:[4,19,20,21,22],creation:[12,13],criteria:12,critic:3,cross:3,csv:[0,1,2,3,5,18],curl:[4,20,22],current:[3,4,5,7,9,11,12,13],current_timestamp:[19,22],custom:[3,11,12,13,19,21,22],cut:3,dai:[2,7,9],dash:[3,4,20,22],dat:[2,3],data:[1,2,3,4,5,6,9,11,12,13,14,19],databas:[1,2,3,4,15,18,19,20,21,22],dataset:[18,22],datasourc:[21,22],datatyp:[12,14,18,22],date:[7,9,11,12,13,14,19,22],datetim:[11,12,13,19,22],datetime2:11,db3:3,dba:3,dbase:[1,3],dbf:[1,2,3,5,6,10,12,16],dbname:[3,7,8,11],dbo:11,dbpath:3,ddl:12,decim:[9,11,12],declar:12,decod:14,decompress:3,defin:[3,6,7,8,9,10,12,13,15,16,17,18,19,21,22],definit:[3,4,11,12,13,19,20,21,22],delai:0,delimit:[3,6],denot:[6,7],depend:[2,3,5,11,12],describ:[2,3,6,7,9,12,15,16,19,21,22],descript:[0,2,7,9],detail:[3,11,12,15,16,17,18,19,21,22],determin:[3,12],dev:[12,15,16,17,18,19,21,22],develop:3,dialect:[12,19,22],did:[3,16,17,21,22],didn:3,differ:[0,2,3,12,14],difficulti:12,digit:[3,7,9,14],dim:[0,5,13,15,16,17,18,19,21,22],dir:3,direct:[4,20,22],directli:[2,3,18,22],directori:[3,5,6,7,9],disabl:[3,6,7,8,9,10,12,13],discov:[4,20,22],discoveri:[3,11,13],distribut:12,district:4,districts_longlat:[4,20,22],divid:12,doc:[3,12,14,17,22],document:[2,3,4,6,14,20,22],doe:[3,19,21,22],doesn:[11,12],doing:[12,13,19,22],dollar:3,domain:3,don:[3,12],done:[3,6,7,8,9,10,11,12,13,18,19,21,22],dot:[3,14],doubl:[3,4,5,6,7,9,11,12,13,15,18,20,22],down:[3,4,20,22],downcas:[12,13],download:[4,5,13,16,17,18,19,20,21,22],drawback:3,driven:[4,20,22],driver:[1,14,19,22],driverstand:[19,22],drop:[0,6,7,9,10,11,12,13,15,17,18,19,21,22],dry:3,dsl:[2,3],dynam:[3,12,18,22],each:[3,7,9,12,13,17,18,22],easi:[0,12,20,22],easier:3,edit:[15,16,17,18,19,21,22],effect:[12,13],either:[2,3,4,6,7,9,10,11,12,13,19,20,22],elaps:14,els:[3,14],email:0,embed:[21,22],emit:3,employe:[21,22],empti:[3,6,7,9,12,14,19,21,22],enabl:[3,6,7,8,9,10,12,13],enclos:[0,3,5,7,9,15,18,22],encod:[1,3,5,7,9,13,14,17,18,22],end:[3,6,7,9,12,13,14,18,19,22],endipnum:[5,7,18,22],engin:[11,12],enjoi:2,enough:[3,12,14],ensur:[4,11,12,13,20,22],enter:[3,9],entir:[4,12,20,22],entri:14,enumer:12,env:3,environ:[2,3,4,11,12,13,20,22],equal:3,equival:[3,4,20,22],ergast:[19,22],erron:3,error:[2,3,15,16,17,18,19,21,22],escap:[0,3,4,5,7,15,18,22],etc:[3,21,22],europ:10,evalu:12,even:[12,13],ever:3,everi:2,exact:[5,6,7,9,12],exampl:[0,3,5,6,7,8,9,10,11,12,13,15,16,17,18,19,20,22],excel:[16,22],except:[3,12],exclud:[19,22],exclus:7,execut:[4,5],exist:[0,3,4,5,6,7,8,9,10,11,12,13,15,17,18,19,20,21,22],exit:3,expand:[3,4,5,20,22],expect:[0,2,3,7,8,9,10,11,12,14,19,21,22],explain:0,explan:11,explicit:3,explicitli:12,express:[5,6,7,9,11,12],ext:3,extens:[0,3,5,18,22],extern:11,extra:[3,4,12,20,22],extract:[16,17,18,22],f1db:[19,22],facil:3,facilit:[15,16,17,18,19,21,22],fact:[19,22],fail:[3,12],fals:14,familiar:3,fashion:3,fast:3,faster:3,feasibl:[4,20,22],featur:[2,3,12],feed:3,feedback:3,fetch:[2,3,6,8,10,12,13,16,17,18,19,21],field:[0,1,3,4,5,8,10,12,13,15,18,20,22],figur:[12,13],file:[1,2,3,5,7,8,10,11,12,13,14,15,18,19],filemak:[16,22],filenam:[3,5,6,7,8,9,10,17,18,22],fill:[2,3],fillfactor:12,film:[12,19,22],film_actor:[19,22],film_categori:[19,22],film_list:[12,19,22],film_text:[19,22],filter:[11,12,13,15,22],finali:[19,22],find:[3,6,7,9,11,12,16,17,18,22],fip:[17,22],fips_cod:[17,22],first:[3,4,5,6,7,9,12,17,20,22],fit:[3,4,20,22],fix:[1,2,3,5],fledg:3,flexibl:[3,12],flight:11,fly:[2,3,12,18,22],folder:[16,17,18,22],follow:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,17,20,22],foo:[0,4,12,14,18,20,22],forc:[3,12],foreign:[4,6,7,8,9,10,11,12,13,19,20,21,22],fork:2,form:[3,12,14],format:[1,2,4,5,7,8,10,14,16,17,18,20,22],former:3,found:[3,4,6,7,8,9,10,11,12,13,14,15,16,18,19,20,21,22],framework:12,free:[18,22],freetd:11,french:[16,22],friendli:3,from:[0,1,2,14,15,16,17,18,21],full:[2,3,12,17,18,22],fulli:[2,3],gazett:[17,22],gazetteer2000:[17,22],gener:12,genr:[6,21,22],geo:[17,22],geographi:11,geoid:[4,20,22],geoip:[18,22],geolit:[1,5,7],geolitec:[5,7,18,22],geolitecity_csv:[18,22],geoloc:[18,22],geometr:12,get:[3,5,7,11,12,13,14,15,22],getenv:3,gist:[5,18,22],git:3,github:[3,21,22],give:[2,19,22],given:[2,3,4,5,6,7,9,12,14,17,18,19,20,21,22],global:[3,11],globalaccount:11,gmt:10,goal:2,good:[3,21,22],gov:[17,22],grammar:3,great:[2,12,13],greater:12,green:2,grow:3,guard:12,guc:3,guc_nam:3,guess:[4,20,22],gunzip:[4,20,22],had:[19,22],handl:[3,12,21,22],happen:[3,4,12,20,22],has:[3,4,5,12,13,15,16,17,18,19,20,21,22],have:[0,2,3,4,7,12,13,19,20,21,22],header:[3,4,5,6,7,9,15,18,20,22],help:[0,3,4,21,22],here:[3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22],hex:14,hexadecim:[6,7,9],hh12:[7,9],hh24:[7,9],hierarchyid:11,histor:[19,22],historiq2013:[4,16,20,22],hold:12,host:[3,4,11,12,16,19,20,21,22],hostnam:3,hour:[7,9],how:[2,3,4,9,12,15,18,20,22],hstore:0,html:[3,12,14,17,22],http:[3,5,6,8,10,12,13,14,15,16,17,18,19,21],human:3,ibm:[3,10],idea:12,identifi:[0,3,12,13],idx_66873_sqlite_autoindex_playlisttrack_1:[21,22],idx_oid:12,ignor:[6,7,8,9,10,12,13],imag:3,impact:3,implement:[2,3,7,9,11,12,14],imposs:12,includ:[0,3,4,7,18,19,20,21,22],index:[1,3,4,5,7,11,12,13,17,18,19,20,21,22],info:3,inforamt:4,inform:[12,16,19,20,21,22],ini:3,inlin:[0,3,6,7,9,12],input:[0,2,3,4,6,7,9,14,15,18,20,22],inse:[4,8,16,20,22],insid:[6,7],inspir:3,instal:[12,13,19,21,22],instanc:[3,11],instead:[18,22],instruct:[5,6,7,8,9,10,11,12,13],integ:[9,12,13,14,18,22],integr:2,intend:[12,13],interact:14,interest:14,intern:[11,12],intervent:2,intptlat:[4,20,22],intptlong:[4,20,22],introduc:[3,7,11,12,13],introduct:1,invalid:[6,7,8,9,10,12,13],inventori:[19,22],invoic:[13,21,22],invoicelin:[21,22],involv:12,ip4:14,ip4r:[5,7,18,22],iprang:[5,7,18,22],ipv4:[3,18,22],isn:[3,12],iso:[5,7,18,22],isol:3,issu:[6,7,8,9,10,12,13],its:[2,3,4,8,10,12,15,16,17,18,19,20,21,22],itself:[3,6,7,11,16,17,22],ixf:[1,3],join:[18,22],json:3,just:[3,4,7,12,13,20,22],keep:[7,12],kei:[0,3,4,6,7,8,9,10,11,12,13,18,19,20,21,22],kept:[3,12],keyword:[7,9,12],kick:12,kind:[2,3,4,20,22],kingdom:[15,22],know:[2,3,7,9,12],known:[3,12],label:12,lack:[11,14],land:[17,22],languag:[2,3,19,22],laptim:[19,22],larg:3,last:[3,12],lastest:[18,22],lastfm_tag:13,lat:[17,22],later:[3,4,20,22],latest:[5,18,22],latin1:[15,16,17,22],latitud:[5,18,22],ldm:[17,22],learn:3,least:12,leav:[3,19,22],left:[3,7,9,12],length:[3,9,17,22],lerocha:[21,22],less:12,let:[16,17,19,21,22],letter:3,level:[2,3,5,12,16,22],lib:11,libpq:3,light:[18,22],like:[3,12],lile:11,limit:[1,3,7,9,11,13],line:[1,4,5,6,7,9,14,17,20],link:5,lisp:[3,11,12,14],list:[3,6,7,8,9,10,11,12,13,16,22],listen:11,liter:14,live:2,load:[0,1,2,11,12,13,14,19],loc_nam:[17,22],local:[3,4,5,6,8,10,20,22],localaccount:11,localhost:[0,3,4,7,8,12,19,20,22],locat:[3,5,10,16,17,18,21],locationnam:[17,22],locid:[5,7,18,22],lock:7,log:[2,3,15,16,17,18,19,21,22],logfil:3,longblob:12,longitud:[5,18,22],longtext:12,look:3,lot:12,machin:3,mai:[3,4,6,7,8,9,10,11,12,13,14,19,20,21,22],main:[3,18,19,22],maintenance_work_mem:[7,11,12,13,19,21,22],make:[3,21,22],man:[4,20,22],manag:[2,3,21,22],mani:[3,6,7,9,12],manner:9,manual:[1,2],map:[12,17,22],master:[21,22],match:[3,4,5,6,7,9,14,17,18,19,20,22],materi:[19,22],max:[3,12],maximum:[3,12,13],maxmind:1,mayb:[4,20,22],mean:[4,12,15,20,22],meant:[2,3],media:6,mediatyp:[21,22],mediumblob:12,mediumint:12,mediumtext:12,memori:[3,12],mess:12,messag:[3,19,21,22],met:12,meta:[8,10,12,13,16,19,21,22],metadata:[2,12,13],method:[3,4,8,16,20,22],methodolog:2,metrocod:[5,18,22],microsecond:[7,9],middl:3,might:[3,4,5,6,7,12,13,20,22],migrat:[1,21],million:[18,22],millisecond:[6,7,9],min:[3,12],mind:3,minimum:3,minut:[7,9],miss:3,mix:3,mode:[3,7,12],model:[3,7,9],modern:[16,22],modif:12,modul:1,moment:5,monei:11,month:[7,9],more:[4,5,11,16,17,20,21,22],most:[0,3,4,19,20,22],motor:[19,22],mrd:[19,22],mssql:[3,11],much:3,multipl:[12,21,22],multipli:3,must:[2,3,4,5,6,7,8,9,10,11,12,13,14,20,22],mustach:1,mysql:[1,2,3,11,14],mysql_host:12,mysql_pwd:12,mysql_tcp_port:12,name:[0,3,4,5,6,7,8,9,10,14,15,16,17,18,19,20,21,22],nativ:3,natur:[21,22],nchar:13,nchat:11,necessari:[3,4,14,20,22],need:[0,2,3,4,7,12,13,14,15,16,17,18,19,20,21,22],net_read_timeout:12,net_write_timeout:12,netloc:3,network:[3,4,20,22],never:3,newdb:[4,20,22],newer:3,night:2,nil:[5,14,18,22],nomenclatur:[4,8,16,20,22],non:[3,5,19,22],none:3,nor:[3,11,12],notat:3,note:[1,4,5,12,13,15,16,17,18,19,20,21,22],notic:[3,4,20,22],now:[4,12,19,20,21,22],nsitra:10,nul:14,number:[3,6,7,9,11,12,13,14],numer:[3,6,7,9,11,12,13],nvarchar:[11,13],object:[12,13],obtain:12,occur:3,offer:[16,18,22],often:[14,15,22],oid:[12,19,21,22],old:[3,4,20,22],omit:[3,12],onc:[3,5,6,7,8,9,10,12,13,19,22],one:[0,3,4,5,7,9,11,12,20,22],ones:[3,12],onli:[2,4,5,6,7,9,14,15,17,19,20,22],onlin:[3,15,16,17,18,19,21,22],open:[3,4,20,22],oper:[15,16,17,18,19,21,22],option:[1,2,4,5,14,15,18,19,20,21,22],order:[2,3,7,12],ordinari:7,org:[3,4,14,18,20,21,22],ori:[12,19,22],other:[0,3,7,11,12,13,14,19,22],otherwis:[3,12],ouput:[0,15,18,22],our:[12,15,16,17,18,19,21,22],out:[3,12,13,14],output:[0,3,12,16,17,19,21,22],over:[2,3,4,12,13,19,20,22],overload:[11,12,13,14],overrid:3,overs:3,own:[2,3,14],packag:[3,12,14],pad:[9,17,22],page:[1,4,20,22],pagila:[4,12,20,22],pair:[2,3,18,22],parallel:[1,7],paramet:[3,7,9,12],pari:10,pars:[3,4,6,7,9,10,13,15,16,17,18,19,21,22],parser:[3,7,12],part:[3,7,9,12],partial:1,particular:[3,19,22],pass:3,password:[3,12],past:12,path:[3,13,15,22],pattern:[7,9,11,13],payment:[19,22],per:[3,7,9,12,19,22],percent:3,perform:[1,7],pg_get_keyword:12,pgdatabas:3,pghost:3,pgloader:[0,2,5,6,7,8,9,10,11,12,13,14,19],pgpass:3,pgpassfil:3,pgpassword:3,pgsql:[4,12,18,19,20,21,22],pguser:3,pick:3,piggyback:11,pipe:[3,4,20,22],pitstop:[19,22],place:[3,16,17,22],places2k:[17,22],plai:3,plain:12,playlist:[21,22],playlisttrack:[21,22],pleas:[3,4,11,12,13,20,22],point:[3,5,12,13,14,18,22],popular:[18,22],port:[3,11,12],posit:[9,17,22],possibl:[0,3,4,6,7,8,9,10,12,13,19,20,22],postalcod:[5,18,22],postgr:[4,20,21,22],postgreslq:3,postgresql:[0,1,2,3,4,5,6,7,8,9,10,14,15,16,17,18,20,21],postgresqlpgpass:3,pow:[18,22],pre:[3,4,6,7,8,9,10,12,13,20,22],precis:[4,11,12,13,20,22],prefer:3,prefetch:3,prefix:12,prepar:3,preserv:12,prevent:12,primari:[0,7,11,12,18,19,21,22],print:3,printabl:[6,7],prior:[12,13],privat:[16,17,18,19,21,22],problem:[3,19,22],problemat:0,process:[3,4,5,7,9,12,13,14,18,20,22],produc:14,product:2,project:[2,3,21,22],proper:[3,14],properti:[2,4],protocol:[2,3],provid:[2,3,4,11,12,13,14,16,17,18,19,20,22],psql:3,punctuat:[3,7,9],purpos:[19,22],push:3,qualifi:[3,8,10,19,22],queri:[3,5,12,18,21,22],queue:3,quick:[1,18],quiet:3,quit:[14,15,18,22],quot:[0,3,4,5,6,7,9,10,12,14,15,18,22],race:[19,22],rag:3,rang:[5,7,12,14,17,18,22],rather:[3,12],raw:[2,3,21,22],read:[2,3,6,7,8,9,10,12,15,16,17,18,19,21],readabl:3,reader:[3,7,9,12],readi:[15,16,17,18,19,21,22],real:[3,11,13],reason:3,receiv:14,recent:3,recogn:[4,7,20,22],recommand:0,record:[18,19,22],recreat:[12,13],redund:4,refer:[1,4,11,12,20,22],referenc:[12,13],refman:12,refrain:[11,12,13],refus:3,reg2013:8,regardless:12,regexp:[6,7,9,12],region:[3,5,18,22],regular:[5,6,7,9,11,12],reject:[2,3,19,22],rel:[3,6,7,9],reload:3,remain:3,rememb:14,remov:[7,12,13,14],renam:12,rental:[19,22],replac:3,report:[1,19,21,22],repres:[14,18,22],represent:[6,12,14,18,22],reproduc:1,requir:[3,9,12],reserv:[12,17,22],reset:[12,13,19,21,22],resp:3,respect:[3,12,21,22],respons:3,restrict:3,result:[3,6,7,8,9,10,11,12,13,19],retri:1,reus:12,review:4,rewrit:12,rich:3,right:[3,4,7,9,14,16,17,20,22],root:[3,12,19,22],row:[3,12,13,15,22],rule:[1,3,5,6,7,9,19,22],run:[3,4,5,12,19,20,21,22],runtim:[3,14],sai:3,sakila:[4,12,19,20,22],sales_bi:12,sales_by_stor:12,same:[3,4,5,6,7,8,9,10,11,12,13,20,21,22],sampl:[19,22],sanit:[3,19,22],satisfi:3,scale:12,scenario:3,schedul:2,schema:[1,3,4,5,10,13,18,19,20,21,22],script:3,search:[1,12,14],search_path:[12,19,22],season:[19,22],second:[7,9,14],section:[3,4,11,12,20,22],see:[3,6,7,9,11,12,15,16,17,19,21,22],select:[12,18,19,22],self:[0,3],semi:3,send:3,sens:3,sensibl:12,sent:[3,11,12],separ:[3,4,7,9,11,12,13,14,15,22],sequenc:[12,13,19,21,22],seri:5,serial:[0,12],server:[2,3,11,14],servic:2,session:3,set:[0,5,6,7,9,11,12,13,14,15,16,18,19,21,22],setup:[1,2,3,12],sever:[3,5,6,7,9,12,13,21,22],shorter:[17,22],should:[3,12],show:[3,17,22],side:[3,7,9],sign:[3,7,9,15,22],similar:6,simpl:[3,14,20,22],simultan:3,sinc:14,singl:[2,3,4,6,7,8,9,10,12,18,20],size:[3,9],skip:[3,4,5,6,7,9,12,13,15,18,19,20,21,22],smaller:3,smallint:[11,12,13,19,22],smallmonei:11,smart:3,socket:3,softwar:0,solut:[3,21,22],solv:0,some:[2,3,4,12,14,15,16,17,18,19,20,21,22],someth:3,soon:[2,3],sourc:[0,1,2,4,19,20,21,22],space:[3,7,9],span:3,speak:[16,22],spec:[15,22],special:[6,7,9,11,12,13,18,19,21,22],specif:[1,2,3,4,15,18,19,20,22],specifi:[2,3,4,6,7,9,10,11,12,13,17,20,22],speed:[18,22],spell:[3,5,12],split:12,sql:[1,2,3,4,7,9,12,14,19,20,21,22],sqlite:[1,2,3,14],squar:[7,9],sslmode:[3,12],staff:[19,22],staff_list:[12,19,22],standard:[3,4,6,7,8,9,10,12,13,20,22],standard_conforming_str:[0,6,9,15,22],start:[1,3,9,12,13,15,16,17,18,19,21],startipnum:[5,7,18,22],state:[15,22],statement:[3,12,13],statu:[19,22],stdin:[3,6,7,9],step:[2,3,7,18,22],still:[16,17,22],stop:[3,12],storag:3,store:[19,22],straight:[4,20,22],strea:[7,9],stream:[2,3,4,6,7,9,21],string:[4,6,7,9,11,12,13,14,20,22],sub:1,sublist:[11,12,13],submit:[2,3],subset:3,suitabl:14,summari:[3,19,21,22],suppli:3,support:[1,3,4,5,6,7,8,9,10,11,13,16,20,22],supris:2,syntax:[1,4,6,7,9,20,22],system:[3,12,14,15,16,17,18,19,21,22],tabl:[0,3,4,6,7,8,9,10,14,15,16,17,18,19,20,21,22],tablenam:[3,4,20,22],tabul:[6,7],tag:13,take:[3,4,6,7,9,12,14,19,20,21,22],taken:[0,12,13],talk:3,tapoueh:[4,18,20,22],target:[2,4,6,7,8,9,10,11,12,13,20,22],task:3,tcp:11,tds:11,tdsport:11,techniqu:[4,20,22],telecharg:[4,8,16,20,22],temp:[4,18,20,22],templat:[1,7,9],termin:[0,3,4,5,7,9,15,18,20,22],test1:10,test:[1,3,4,15,16,17,18,19,20,21,22],text:[3,4,6,9,11,12,13,14,15,18,20,22],than:[3,11,12,17,22],thei:[3,7,11,12,13,19,22],them:[3,6,7,9,11,12,13,16,17,22],themselv:[3,7],theoret:12,thi:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,17,18,19,20,22],thing:[3,12],third:2,tho:[19,21,22],those:[0,2,3,4,7,9,11,12,15,19,20,22],though:[0,3,4,20,22],thread:[3,12,19,21,22],threshold:3,tild:3,time:[3,9,12,13,14,15,16,17,18,19,21,22],timestamp:[10,12,13,14],timestamptz:[11,12,13,14,19,22],timezon:10,tinyblob:12,tinyint:[11,12,13,14,19,22],tinytext:12,tmp:[3,5,19,21,22],tmpdir:5,to_char:[7,9],togeth:11,too:[3,12,16,19,22],tool:[2,3,16,19,22],top:5,topic:[19,22],total:[15,16,17,18,19,21,22],town:[17,22],track:[6,21,22],track_ful:6,trackid:6,transform:[1,2,3,18,22],translat:[19,22],trick:[4,20,22],trigger:[3,6,7,8,9,10,12,13,19,21,22],trim:[7,9,14,17,22],truncat:[0,4,6,7,8,9,10,12,13,15,16,18,19,20,21,22],tsv:3,turn:[19,22],tutori:[1,4],tweak:3,two:[2,3,7,12],txt:[4,17,20,22],type:[0,2,3,4,7,8,9,10,11,12,13,14,18,19,20,21,22],typemod:[11,12,13],typic:3,unarch:[4,20,22],under:3,underscor:3,uniqu:[7,12],uniqueidentifi:[11,14],uniquifi:12,unit:[3,15,22],unitpric:6,univers:10,unix:[3,4,14,20,22],unpars:[7,9],unquot:7,unset:[3,5],unsign:[12,14],until:[3,12,13],unzip:[5,16,17,21,22],updat:[19,22],upgrad:3,uri:[3,4,5,12,20,22],url:[3,4,5,6,8,10,12,13,16,17,20,21,22],usag:3,use:[3,4,7,12,14,16,17,18,19,20,21,22],used:[3,4,5,6,7,9,10,11,12,13,14,18,20,22],useful:[3,19,22],user:[3,4,5,6,7,8,9,10,11,12,13,15,16,17,18,19,20,21,22],uses:[2,3,6,19,21,22],using:[2,3,4,5,7,8,9,10,11,12,13,14,16,17,18,19,20,21,22],usp:[4,17,20,22],usual:[3,4,17,20,22],utc:10,utf8:12,utf:[11,13],util:5,uuid:[11,14],valid:3,valu:[0,3,6,7,8,9,10,12,13,14,15,19,22],varbinari:[11,12,14],varchar:[11,12,13,17,22],vari:[15,22],variabl:[3,11,12],variant:[2,3],variou:[2,3],vector:[11,14],verbos:[3,4],veri:[3,18,20,21,22],verifi:12,version:[0,3,4,11,18,20,22],versu:3,view:[1,19,22],wai:[2,3,6,14],wait:3,walk:[6,7,9],want:[3,4,12,18,19,20,22],warn:[3,19,21,22],water:[17,22],webpag:2,websit:[16,22],welcom:11,were:12,what:[7,9,12,13,15,22],whatev:3,when:[3,4,5,6,7,8,9,10,11,12,13,14,17,19,20,21,22],where:[2,3,4,5,6,7,8,9,10,11,12,17,18,20,22],wherea:[3,12],whether:12,which:[3,5,6,7,8,9,10,12,13,14,18,19,21,22],whichev:3,white:3,whitespac:[3,7,9,14,17,22],whole:[2,3,4,5,6,7,9,12,19,20,22],whose:[12,13],width:1,window:3,within:[3,7],without:[2,3,12,13],work:[3,4,11,12,20,22],work_mem:[0,6,7,9,11,12,13,15,19,21,22],worker:[3,12],would:[3,12,19,22],write:[3,4,12,20,22],writer:3,written:14,wtm:[17,22],www:[3,4,8,14,16,17,20,21,22],xml:11,xxx:[19,22],year:[7,9,12,14],yet:12,you:[0,2,3,4,7,11,12,13,14,15,16,17,18,19,20,21,22],your:[2,3,4,11,12,14,18,19,20,21,22],yourself:[4,20,22],yyi:[7,9],yyyi:[7,9],zero:[12,14,19,22],zip:[4,5,6,8,10,13,16,17,18,20,22]},titles:["Reporting Bugs","Welcome to pgloader\u2019s documentation!","Introduction","PgLoader Reference Manual","Pgloader Usage Examples","Loading From an Archive","Loading COPY Formatted Files","Loading CSV data","Loading DBF data","Loading Fixed Cols File Formats","Loading IXF Data","Migrating a MS SQL Database to PostgreSQL","Migrating a MySQL Database to PostgreSQL","Migrating a SQLite database to PostgreSQL","Transformation Functions","Loading CSV Data with pgloader","Loading dBase files with pgloader","Loading Fixed Width Data File with pgloader","Loading MaxMind Geolite Data with pgloader","Migrating from MySQL to PostgreSQL","PgLoader Quick Start","Loading SQLite files with pgloader","PgLoader Tutorial"],titleterms:{"case":0,"default":[11,12,13],"final":5,"function":14,And:3,INTO:3,The:[15,16,17,18,19,21,22],WITH:[3,6,7,8,9,10,11,12,13],about:3,after:3,all:12,alter:[11,12],archiv:[4,5,20,22],argument:3,avail:[4,20,22],batch:3,befor:3,behaviour:3,bug:0,cast:[11,12,13],claus:3,col:9,command:[2,3,4,5,15,16,17,18,19,21,22],comment:3,common:3,complex:4,compress:[20,22],connect:3,continu:2,copi:6,csv:[4,7,15,20,22],data:[7,8,10,15,16,17,18,20,21,22],databas:[11,12,13],dbase:[16,22],dbf:[4,8,20,22],debug:3,decod:12,document:1,driver:11,encod:[11,12],exampl:4,exclud:[11,12,13],execut:3,express:3,fetch:[4,20,22],field:[7,9],file:[4,6,9,16,17,20,21,22],fix:[9,17,22],format:[3,6,9],from:[3,4,5,6,7,8,9,10,11,12,13,19,20,22],gener:3,geolit:[18,22],http:[4,20,22],includ:[11,12,13],indic:1,inform:3,inquiri:3,introduct:2,ixf:10,like:[11,13],limit:12,line:[2,3,19,21,22],load:[3,4,5,6,7,8,9,10,15,16,17,18,20,21,22],locat:[4,20,22],manual:3,match:[11,12],materi:12,maxmind:[18,22],migrat:[2,4,11,12,13,19,20,22],more:3,mustach:3,mysql:[4,12,19,20,22],name:[11,12,13],note:3,onli:[3,11,12,13],oper:3,option:[3,6,7,8,9,10,11,12,13],parallel:3,partial:[11,12,13],perform:3,pgloader:[1,3,4,15,16,17,18,20,21,22],postgresql:[11,12,13,19,22],quick:[20,22],read:[4,20,22],refer:3,regular:3,remot:[4,20,22],renam:11,report:0,reproduc:0,result:[15,22],retri:3,rule:[11,12,13],schema:[11,12],set:3,setup:11,singl:[19,21,22],sourc:[3,5,6,7,8,9,10,11,12,13],specif:[5,6,7,8,9,10,11,12,13],sql:[5,11],sqlite:[4,13,20,21,22],start:[20,22],stdin:[4,20,22],stream:[20,22],string:3,sub:5,support:12,syntax:3,tabl:[1,11,12,13],target:3,templat:3,test:0,through:[4,20,22],transform:[11,12,14],tutori:22,usag:4,view:12,welcom:1,width:[17,22]}}) \ No newline at end of file diff --git a/docs/_build/html/tutorial/csv.html b/docs/_build/html/tutorial/csv.html new file mode 100644 index 0000000..bbec8ef --- /dev/null +++ b/docs/_build/html/tutorial/csv.html @@ -0,0 +1,169 @@ + + + + + + + Loading CSV Data with pgloader — pgloader 3.4.1 documentation + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+

Loading CSV Data with pgloader

+

CSV means comma separated values and is often found with quite varying +specifications. pgloader allows you to describe those specs in its command.

+
+

The Command

+

To load data with [pgloader](http://pgloader.io/) you need to define in a +command the operations in some details. Here’s our example for loading CSV +data:

+
LOAD CSV
+     FROM 'path/to/file.csv' (x, y, a, b, c, d)
+     INTO postgresql:///pgloader?csv (a, b, d, c)
+
+     WITH truncate,
+          skip header = 1,
+          fields optionally enclosed by '"',
+          fields escaped by double-quote,
+          fields terminated by ','
+
+      SET client_encoding to 'latin1',
+          work_mem to '12MB',
+          standard_conforming_strings to 'on'
+
+   BEFORE LOAD DO
+    $$ drop table if exists csv; $$,
+    $$ create table csv (
+        a bigint,
+        b bigint,
+        c char(2),
+        d text
+       );
+  $$;
+
+
+
+
+

The Data

+

This command allows loading the following CSV file content:

+
Header, with a © sign
+"2.6.190.56","2.6.190.63","33996344","33996351","GB","United Kingdom"
+"3.0.0.0","4.17.135.31","50331648","68257567","US","United States"
+"4.17.135.32","4.17.135.63","68257568","68257599","CA","Canada"
+"4.17.135.64","4.17.142.255","68257600","68259583","US","United States"
+"4.17.143.0","4.17.143.15","68259584","68259599","CA","Canada"
+"4.17.143.16","4.18.32.71","68259600","68296775","US","United States"
+
+
+
+
+

Loading the data

+

Here’s how to start loading the data. Note that the ouput here has been +edited so as to facilitate its browsing online:

+
$ pgloader csv.load
+... LOG Starting pgloader, log system is ready.
+... LOG Parsing commands from file "/Users/dim/dev/pgloader/test/csv.load"
+
+       table name       read   imported     errors            time
+-----------------  ---------  ---------  ---------  --------------
+      before load          2          2          0          0.039s
+-----------------  ---------  ---------  ---------  --------------
+              csv          6          6          0          0.019s
+-----------------  ---------  ---------  ---------  --------------
+Total import time          6          6          0          0.058s
+
+
+
+
+

The result

+

As you can see, the command described above is filtering the input and only +importing some of the columns from the example data file. Here’s what gets +loaded in the PostgreSQL database:

+
pgloader# table csv;
+    a     |    b     | c  |       d
+----------+----------+----+----------------
+ 33996344 | 33996351 | GB | United Kingdom
+ 50331648 | 68257567 | US | United States
+ 68257568 | 68257599 | CA | Canada
+ 68257600 | 68259583 | US | United States
+ 68259584 | 68259599 | CA | Canada
+ 68259600 | 68296775 | US | United States
+(6 rows)
+
+
+
+
+ + +
+
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/_build/html/tutorial/dBase.html b/docs/_build/html/tutorial/dBase.html new file mode 100644 index 0000000..ae47be7 --- /dev/null +++ b/docs/_build/html/tutorial/dBase.html @@ -0,0 +1,134 @@ + + + + + + + Loading dBase files with pgloader — pgloader 3.4.1 documentation + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+

Loading dBase files with pgloader

+

The dBase format is still in use in some places as modern tools such as +Filemaker and Excel offer some level of support for it. Speaking of +support in modern tools, pgloader is right there on the list too!

+
+

The Command

+

To load data with [pgloader](http://pgloader.io/) you need to define in a +command the operations in some details. Here’s our example for loading a +dBase file, using a file provided by the french administration.

+

You can find more files from them at the Insee +website.

+

Here’s our command:

+
LOAD DBF
+    FROM http://www.insee.fr/fr/methodes/nomenclatures/cog/telechargement/2013/dbf/historiq2013.zip
+    INTO postgresql:///pgloader
+    WITH truncate, create table
+     SET client_encoding TO 'latin1';
+
+
+

Note that here pgloader will benefit from the meta-data information found in +the dBase file to create a PostgreSQL table capable of hosting the data as +described, then load the data.

+
+
+

Loading the data

+

Let’s start the pgloader command with our dbf-zip.load command file:

+
$ pgloader dbf-zip.load
+... LOG Starting pgloader, log system is ready.
+... LOG Parsing commands from file "/Users/dim/dev/pgloader/test/dbf-zip.load"
+... LOG Fetching 'http://www.insee.fr/fr/methodes/nomenclatures/cog/telechargement/2013/dbf/historiq2013.zip'
+... LOG Extracting files from archive '//private/var/folders/w7/9n8v8pw54t1gngfff0lj16040000gn/T/pgloader//historiq2013.zip'
+
+       table name       read   imported     errors            time
+-----------------  ---------  ---------  ---------  --------------
+         download          0          0          0          0.167s
+          extract          0          0          0          1.010s
+ create, truncate          0          0          0          0.071s
+-----------------  ---------  ---------  ---------  --------------
+     historiq2013       9181       9181          0          0.658s
+-----------------  ---------  ---------  ---------  --------------
+Total import time       9181       9181          0          1.906s
+
+
+

We can see that pgloader did download the file from +its HTTP URL location then unziped it before the loading itself.

+

Note that the output of the command has been edited to facilitate its +browsing online.

+
+
+ + +
+
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/_build/html/tutorial/fixed.html b/docs/_build/html/tutorial/fixed.html new file mode 100644 index 0000000..1a38f88 --- /dev/null +++ b/docs/_build/html/tutorial/fixed.html @@ -0,0 +1,176 @@ + + + + + + + Loading Fixed Width Data File with pgloader — pgloader 3.4.1 documentation + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+

Loading Fixed Width Data File with pgloader

+

Some data providers still use a format where each column is specified with a +starting index position and a given length. Usually the columns are +blank-padded when the data is shorter than the full reserved range.

+
+

The Command

+

To load data with [pgloader](http://pgloader.io/) you need to define in a +command the operations in some details. Here’s our example for loading +Fixed Width Data, using a file provided by the US census.

+

You can find more files from them at the +[Census 2000 Gazetteer Files](http://www.census.gov/geo/maps-data/data/gazetteer2000.html).

+

Here’s our command:

+
LOAD ARCHIVE
+   FROM http://www.census.gov/geo/maps-data/data/docs/gazetteer/places2k.zip
+   INTO postgresql:///pgloader
+
+   BEFORE LOAD DO
+     $$ drop table if exists places; $$,
+     $$ create table places
+       (
+          usps      char(2)  not null,
+          fips      char(2)  not null,
+          fips_code char(5),
+          loc_name  varchar(64)
+       );
+     $$
+
+   LOAD FIXED
+        FROM FILENAME MATCHING ~/places2k.txt/
+             WITH ENCODING latin1
+             (
+                usps           from   0 for  2,
+                fips           from   2 for  2,
+                fips_code      from   4 for  5,
+                "LocationName" from   9 for 64 [trim right whitespace],
+                p              from  73 for  9,
+                h              from  82 for  9,
+                land           from  91 for 14,
+                water          from 105 for 14,
+                ldm            from 119 for 14,
+                wtm            from 131 for 14,
+                lat            from 143 for 10,
+                long           from 153 for 11
+             )
+        INTO postgresql:///pgloader?places
+             (
+            usps, fips, fips_code, "LocationName"
+             );
+
+
+
+
+

The Data

+

This command allows loading the following file content, where we are only +showing the first couple of lines:

+
AL0100124Abbeville city                                                       2987     1353      40301945        120383   15.560669    0.046480 31.566367 -85.251300
+AL0100460Adamsville city                                                      4965     2042      50779330         14126   19.606010    0.005454 33.590411 -86.949166
+AL0100484Addison town                                                          723      339       9101325             0    3.514041    0.000000 34.200042 -87.177851
+AL0100676Akron town                                                            521      239       1436797             0    0.554750    0.000000 32.876425 -87.740978
+AL0100820Alabaster city                                                      22619     8594      53023800        141711   20.472605    0.054715 33.231162 -86.823829
+AL0100988Albertville city                                                    17247     7090      67212867        258738   25.951034    0.099899 34.265362 -86.211261
+AL0101132Alexander City city                                                 15008     6855     100534344        433413   38.816529    0.167342 32.933157 -85.936008
+
+
+
+
+

Loading the data

+

Let’s start the pgloader command with our census-places.load command file:

+
$ pgloader census-places.load
+... LOG Starting pgloader, log system is ready.
+... LOG Parsing commands from file "/Users/dim/dev/pgloader/test/census-places.load"
+... LOG Fetching 'http://www.census.gov/geo/maps-data/data/docs/gazetteer/places2k.zip'
+... LOG Extracting files from archive '//private/var/folders/w7/9n8v8pw54t1gngfff0lj16040000gn/T/pgloader//places2k.zip'
+
+       table name       read   imported     errors            time
+-----------------  ---------  ---------  ---------  --------------
+         download          0          0          0          1.494s
+          extract          0          0          0          1.013s
+      before load          2          2          0          0.013s
+-----------------  ---------  ---------  ---------  --------------
+           places      25375      25375          0          0.499s
+-----------------  ---------  ---------  ---------  --------------
+Total import time      25375      25375          0          3.019s
+
+
+

We can see that pgloader did download the file from its HTTP URL location +then unziped it before the loading itself.

+

Note that the output of the command has been edited to facilitate its +browsing online.

+
+
+ + +
+
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/_build/html/tutorial/geolite.html b/docs/_build/html/tutorial/geolite.html new file mode 100644 index 0000000..a7da1cf --- /dev/null +++ b/docs/_build/html/tutorial/geolite.html @@ -0,0 +1,239 @@ + + + + + + + Loading MaxMind Geolite Data with pgloader — pgloader 3.4.1 documentation + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+

Loading MaxMind Geolite Data with pgloader

+

MaxMind provides a free dataset for +geolocation, which is quite popular. Using pgloader you can download the +lastest version of it, extract the CSV files from the archive and load their +content into your database directly.

+
+

The Command

+

To load data with pgloader you need to define in a command the operations +in some details. Here’s our example for loading the Geolite data:

+
/*
+ * Loading from a ZIP archive containing CSV files. The full test can be
+ * done with using the archive found at
+ * http://geolite.maxmind.com/download/geoip/database/GeoLiteCity_CSV/GeoLiteCity-latest.zip
+ *
+ * And a very light version of this data set is found at
+ * http://pgsql.tapoueh.org/temp/foo.zip for quick testing.
+ */
+
+LOAD ARCHIVE
+   FROM http://geolite.maxmind.com/download/geoip/database/GeoLiteCity_CSV/GeoLiteCity-latest.zip
+   INTO postgresql:///ip4r
+
+   BEFORE LOAD DO
+     $$ create extension if not exists ip4r; $$,
+     $$ create schema if not exists geolite; $$,
+     $$ create table if not exists geolite.location
+       (
+          locid      integer primary key,
+          country    text,
+          region     text,
+          city       text,
+          postalcode text,
+          location   point,
+          metrocode  text,
+          areacode   text
+       );
+     $$,
+     $$ create table if not exists geolite.blocks
+       (
+          iprange    ip4r,
+          locid      integer
+       );
+     $$,
+     $$ drop index if exists geolite.blocks_ip4r_idx; $$,
+     $$ truncate table geolite.blocks, geolite.location cascade; $$
+
+   LOAD CSV
+        FROM FILENAME MATCHING ~/GeoLiteCity-Location.csv/
+             WITH ENCODING iso-8859-1
+             (
+                locId,
+                country,
+                region     null if blanks,
+                city       null if blanks,
+                postalCode null if blanks,
+                latitude,
+                longitude,
+                metroCode  null if blanks,
+                areaCode   null if blanks
+             )
+        INTO postgresql:///ip4r?geolite.location
+             (
+                locid,country,region,city,postalCode,
+                location point using (format nil "(~a,~a)" longitude latitude),
+                metroCode,areaCode
+             )
+        WITH skip header = 2,
+             fields optionally enclosed by '"',
+             fields escaped by double-quote,
+             fields terminated by ','
+
+  AND LOAD CSV
+        FROM FILENAME MATCHING ~/GeoLiteCity-Blocks.csv/
+             WITH ENCODING iso-8859-1
+             (
+                startIpNum, endIpNum, locId
+             )
+        INTO postgresql:///ip4r?geolite.blocks
+             (
+                iprange ip4r using (ip-range startIpNum endIpNum),
+                locId
+             )
+        WITH skip header = 2,
+             fields optionally enclosed by '"',
+             fields escaped by double-quote,
+             fields terminated by ','
+
+   FINALLY DO
+     $$ create index blocks_ip4r_idx on geolite.blocks using gist(iprange); $$;
+
+
+

Note that while the Geolite data is using a pair of integers (start, +end) to represent ipv4 data, we use the very poweful ip4r PostgreSQL Extension instead.

+

The transformation from a pair of integers into an IP is done dynamically by +the pgloader process.

+

Also, the location is given as a pair of float columns for the longitude +and the latitude where PostgreSQL offers the +point +datatype, so the pgloader command here will actually transform the data on +the fly to use the appropriate data type and its input representation.

+
+
+

Loading the data

+

Here’s how to start loading the data. Note that the ouput here has been +edited so as to facilitate its browsing online:

+
$ pgloader archive.load
+... LOG Starting pgloader, log system is ready.
+... LOG Parsing commands from file "/Users/dim/dev/pgloader/test/archive.load"
+... LOG Fetching 'http://geolite.maxmind.com/download/geoip/database/GeoLiteCity_CSV/GeoLiteCity-latest.zip'
+... LOG Extracting files from archive '//private/var/folders/w7/9n8v8pw54t1gngfff0lj16040000gn/T/pgloader//GeoLiteCity-latest.zip'
+
+       table name       read   imported     errors            time
+-----------------  ---------  ---------  ---------  --------------
+         download          0          0          0         11.592s
+          extract          0          0          0          1.012s
+      before load          6          6          0          0.019s
+-----------------  ---------  ---------  ---------  --------------
+ geolite.location     470387     470387          0          7.743s
+   geolite.blocks    1903155    1903155          0         16.332s
+-----------------  ---------  ---------  ---------  --------------
+          finally          1          1          0         31.692s
+-----------------  ---------  ---------  ---------  --------------
+Total import time    2373542    2373542          0        1m8.390s
+
+
+

The timing of course includes the transformation of the 1.9 million pairs +of integer into a single ipv4 range each. The finally step consists of +creating the GiST specialized index as given in the main command:

+
CREATE INDEX blocks_ip4r_idx ON geolite.blocks USING gist(iprange);
+
+
+

That index will then be used to speed up queries wanting to find which +recorded geolocation contains a specific IP address:

+
ip4r> select *
+        from      geolite.location l
+             join geolite.blocks b using(locid)
+       where iprange >>= '8.8.8.8';
+
+-[ RECORD 1 ]------------------
+locid      | 223
+country    | US
+region     |
+city       |
+postalcode |
+location   | (-97,38)
+metrocode  |
+areacode   |
+iprange    | 8.8.8.8-8.8.37.255
+
+Time: 0.747 ms
+
+
+
+
+ + +
+
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/_build/html/tutorial/mysql.html b/docs/_build/html/tutorial/mysql.html new file mode 100644 index 0000000..e854de6 --- /dev/null +++ b/docs/_build/html/tutorial/mysql.html @@ -0,0 +1,246 @@ + + + + + + + Migrating from MySQL to PostgreSQL — pgloader 3.4.1 documentation + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+

Migrating from MySQL to PostgreSQL

+

If you want to migrate your data over to PostgreSQL from MySQL then pgloader is the tool of +choice!

+

Most tools around are skipping the main problem with migrating from MySQL, +which is to do with the type casting and data sanitizing that needs to be +done. pgloader will not leave you alone on those topics.

+
+

In a Single Command Line

+

As an example, we will use the f1db database from <http://ergast.com/mrd/> +which which provides a historical record of motor racing data for +non-commercial purposes. You can either use their API or download the whole +database at http://ergast.com/downloads/f1db.sql.gz. Once you’ve done that load the +database in MySQL:

+
$ mysql -u root
+> create database f1db;
+> source f1db.sql
+
+
+

Now let’s migrate this database into PostgreSQL in a single command line:

+
$ createdb f1db
+$ pgloader mysql://root@localhost/f1db pgsql:///f1db
+
+
+

Done! All with schema, table definitions, constraints, indexes, primary +keys, auto_increment columns turned into bigserial , foreign keys, +comments, and if you had some MySQL default values such as ON UPDATE +CURRENT_TIMESTAMP they would have been translated to a PostgreSQL before +update trigger +automatically.

+
$ pgloader mysql://root@localhost/f1db pgsql:///f1db
+2017-06-16T08:56:14.064000+02:00 LOG Main logs in '/private/tmp/pgloader/pgloader.log'
+2017-06-16T08:56:14.068000+02:00 LOG Data errors in '/private/tmp/pgloader/'
+2017-06-16T08:56:19.542000+02:00 LOG report summary reset
+               table name       read   imported     errors      total time
+-------------------------  ---------  ---------  ---------  --------------
+          fetch meta data         33         33          0          0.365s
+           Create Schemas          0          0          0          0.007s
+         Create SQL Types          0          0          0          0.006s
+            Create tables         26         26          0          0.068s
+           Set Table OIDs         13         13          0          0.012s
+-------------------------  ---------  ---------  ---------  --------------
+  f1db.constructorresults      11011      11011          0          0.205s
+            f1db.circuits         73         73          0          0.150s
+        f1db.constructors        208        208          0          0.059s
+f1db.constructorstandings      11766      11766          0          0.365s
+             f1db.drivers        841        841          0          0.268s
+            f1db.laptimes     413578     413578          0          2.892s
+     f1db.driverstandings      31420      31420          0          0.583s
+            f1db.pitstops       5796       5796          0          2.154s
+               f1db.races        976        976          0          0.227s
+          f1db.qualifying       7257       7257          0          0.228s
+             f1db.seasons         68         68          0          0.527s
+             f1db.results      23514      23514          0          0.658s
+              f1db.status        133        133          0          0.130s
+-------------------------  ---------  ---------  ---------  --------------
+  COPY Threads Completion         39         39          0          4.303s
+           Create Indexes         20         20          0          1.497s
+   Index Build Completion         20         20          0          0.214s
+          Reset Sequences          0         10          0          0.058s
+             Primary Keys         13         13          0          0.012s
+      Create Foreign Keys          0          0          0          0.000s
+          Create Triggers          0          0          0          0.001s
+         Install Comments          0          0          0          0.000s
+-------------------------  ---------  ---------  ---------  --------------
+        Total import time     506641     506641          0          5.547s
+
+
+

You may need to have special cases to take care of tho, or views that you +want to materialize while doing the migration. In advanced case you can use +the pgloader command.

+
+
+

The Command

+

To load data with pgloader you need to define in a command the operations +in some details. Here’s our example for loading the MySQL Sakila Sample +Database.

+

Here’s our command:

+
load database
+     from      mysql://root@localhost/sakila
+     into postgresql:///sakila
+
+ WITH include drop, create tables, no truncate,
+      create indexes, reset sequences, foreign keys
+
+  SET maintenance_work_mem to '128MB', work_mem to '12MB', search_path to 'sakila'
+
+ CAST type datetime to timestamptz
+                drop default drop not null using zero-dates-to-null,
+      type date drop not null drop default using zero-dates-to-null
+
+ MATERIALIZE VIEWS film_list, staff_list
+
+ -- INCLUDING ONLY TABLE NAMES MATCHING ~/film/, 'actor'
+ -- EXCLUDING TABLE NAMES MATCHING ~<ory>
+
+ BEFORE LOAD DO
+ $$ create schema if not exists sakila; $$;
+
+
+

Note that here pgloader will benefit from the meta-data information found in +the MySQL database to create a PostgreSQL database capable of hosting the +data as described, then load the data.

+

In particular, some specific casting rules are given here, to cope with +date values such as 0000-00-00 that MySQL allows and PostgreSQL rejects +for not existing in our calendar. It’s possible to add per-column casting +rules too, which is useful is some of your tinyint are in fact smallint +while some others are in fact boolean values.

+

Finaly note that we are using the MATERIALIZE VIEWS clause of pgloader: +the selected views here will be migrated over to PostgreSQL with their +contents.

+

It’s possible to use the MATERIALIZE VIEWS clause and give both the name +and the SQL (in MySQL dialect) definition of view, then pgloader creates the +view before loading the data, then drops it again at the end.

+

## Loading the data

+

Let’s start the pgloader command with our sakila.load command file:

+
$ pgloader sakila.load
+... LOG Starting pgloader, log system is ready.
+... LOG Parsing commands from file "/Users/dim/dev/pgloader/test/sakila.load"
+   <WARNING: table "xxx" does not exists have been edited away>
+
+            table name       read   imported     errors            time
+----------------------  ---------  ---------  ---------  --------------
+           before load          1          1          0          0.007s
+       fetch meta data         45         45          0          0.402s
+          create, drop          0         36          0          0.208s
+----------------------  ---------  ---------  ---------  --------------
+                 actor        200        200          0          0.071s
+               address        603        603          0          0.035s
+              category         16         16          0          0.018s
+                  city        600        600          0          0.037s
+               country        109        109          0          0.023s
+              customer        599        599          0          0.073s
+                  film       1000       1000          0          0.135s
+            film_actor       5462       5462          0          0.236s
+         film_category       1000       1000          0          0.070s
+             film_text       1000       1000          0          0.080s
+             inventory       4581       4581          0          0.136s
+              language          6          6          0          0.036s
+               payment      16049      16049          0          0.539s
+                rental      16044      16044          0          0.648s
+                 staff          2          2          0          0.041s
+                 store          2          2          0          0.036s
+             film_list        997        997          0          0.247s
+            staff_list          2          2          0          0.135s
+Index Build Completion          0          0          0          0.000s
+----------------------  ---------  ---------  ---------  --------------
+        Create Indexes         41         41          0          0.964s
+       Reset Sequences          0          1          0          0.035s
+          Foreign Keys         22         22          0          0.254s
+----------------------  ---------  ---------  ---------  --------------
+     Total import time      48272      48272          0          3.502s
+
+
+

The WARNING messages we see here are expected as the PostgreSQL database +is empty when running the command, and pgloader is using the SQL commands +DROP TABLE IF EXISTS when the given command uses the include drop +option.

+

Note that the output of the command has been edited to facilitate its +browsing online.

+
+
+ + +
+
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/_build/html/tutorial/quickstart.html b/docs/_build/html/tutorial/quickstart.html new file mode 100644 index 0000000..3608181 --- /dev/null +++ b/docs/_build/html/tutorial/quickstart.html @@ -0,0 +1,218 @@ + + + + + + + PgLoader Quick Start — pgloader 3.4.1 documentation + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+

PgLoader Quick Start

+

In simple cases, pgloader is very easy to use.

+
+

CSV

+

Load data from a CSV file into a pre-existing table in your database:

+
pgloader --type csv                                   \
+         --field id --field field                     \
+         --with truncate                              \
+         --with "fields terminated by ','"            \
+         ./test/data/matching-1.csv                   \
+         postgres:///pgloader?tablename=matching
+
+
+

In that example the whole loading is driven from the command line, bypassing +the need for writing a command in the pgloader command syntax entirely. As +there’s no command though, the extra information needed must be provided on +the command line using the –type and –field and –with switches.

+

For documentation about the available syntaxes for the –field and +–with switches, please refer to the CSV section later in the man page.

+

Note also that the PostgreSQL URI includes the target tablename.

+
+
+

Reading from STDIN

+

File based pgloader sources can be loaded from the standard input, as in the +following example:

+
pgloader --type csv                                         \
+         --field "usps,geoid,aland,awater,aland_sqmi,awater_sqmi,intptlat,intptlong" \
+         --with "skip header = 1"                          \
+         --with "fields terminated by '\t'"                \
+         -                                                 \
+         postgresql:///pgloader?districts_longlat          \
+         < test/data/2013_Gaz_113CDs_national.txt
+
+
+

The dash (-) character as a source is used to mean standard input, as +usual in Unix command lines. It’s possible to stream compressed content to +pgloader with this technique, using the Unix pipe:

+
gunzip -c source.gz | pgloader --type csv ... - pgsql:///target?foo
+
+
+
+
+

Loading from CSV available through HTTP

+

The same command as just above can also be run if the CSV file happens to be +found on a remote HTTP location:

+
pgloader --type csv                                                     \
+         --field "usps,geoid,aland,awater,aland_sqmi,awater_sqmi,intptlat,intptlong" \
+         --with "skip header = 1"                                       \
+         --with "fields terminated by '\t'"                             \
+         http://pgsql.tapoueh.org/temp/2013_Gaz_113CDs_national.txt     \
+         postgresql:///pgloader?districts_longlat
+
+
+

Some more options have to be used in that case, as the file contains a +one-line header (most commonly that’s column names, could be a copyright +notice). Also, in that case, we specify all the fields right into a single +–field option argument.

+

Again, the PostgreSQL target connection string must contain the tablename +option and you have to ensure that the target table exists and may fit the +data. Here’s the SQL command used in that example in case you want to try it +yourself:

+
create table districts_longlat
+(
+         usps        text,
+         geoid       text,
+         aland       bigint,
+         awater      bigint,
+         aland_sqmi  double precision,
+         awater_sqmi double precision,
+         intptlat    double precision,
+         intptlong   double precision
+);
+
+
+

Also notice that the same command will work against an archived version of +the same data.

+
+
+

Streaming CSV data from an HTTP compressed file

+

Finally, it’s important to note that pgloader first fetches the content from +the HTTP URL it to a local file, then expand the archive when it’s +recognized to be one, and only then processes the locally expanded file.

+

In some cases, either because pgloader has no direct support for your +archive format or maybe because expanding the archive is not feasible in +your environment, you might want to stream the content straight from its +remote location into PostgreSQL. Here’s how to do that, using the old battle +tested Unix Pipes trick:

+
curl http://pgsql.tapoueh.org/temp/2013_Gaz_113CDs_national.txt.gz \
+| gunzip -c                                                        \
+| pgloader --type csv                                              \
+           --field "usps,geoid,aland,awater,aland_sqmi,awater_sqmi,intptlat,intptlong"
+           --with "skip header = 1"                                \
+           --with "fields terminated by '\t'"                      \
+           -                                                       \
+           postgresql:///pgloader?districts_longlat
+
+
+

Now the OS will take care of the streaming and buffering between the network +and the commands and pgloader will take care of streaming the data down to +PostgreSQL.

+
+
+

Migrating from SQLite

+

The following command will open the SQLite database, discover its tables +definitions including indexes and foreign keys, migrate those definitions +while casting the data type specifications to their PostgreSQL equivalent +and then migrate the data over:

+
createdb newdb
+pgloader ./test/sqlite/sqlite.db postgresql:///newdb
+
+
+
+
+

Migrating from MySQL

+

Just create a database where to host the MySQL data and definitions and have +pgloader do the migration for you in a single command line:

+
createdb pagila
+pgloader mysql://user@localhost/sakila postgresql:///pagila
+
+
+
+
+

Fetching an archived DBF file from a HTTP remote location

+

It’s possible for pgloader to download a file from HTTP, unarchive it, and +only then open it to discover the schema then load the data:

+
createdb foo
+pgloader --type dbf http://www.insee.fr/fr/methodes/nomenclatures/cog/telechargement/2013/dbf/historiq2013.zip postgresql:///foo
+
+
+

Here it’s not possible for pgloader to guess the kind of data source it’s +being given, so it’s necessary to use the –type command line switch.

+
+
+ + +
+
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/_build/html/tutorial/sqlite.html b/docs/_build/html/tutorial/sqlite.html new file mode 100644 index 0000000..7bcc290 --- /dev/null +++ b/docs/_build/html/tutorial/sqlite.html @@ -0,0 +1,208 @@ + + + + + + + Loading SQLite files with pgloader — pgloader 3.4.1 documentation + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+

Loading SQLite files with pgloader

+

The SQLite database is a respected solution to manage your data with. Its +embeded nature makes it a source of migrations when a projects now needs to +handle more concurrency, which [PostgreSQL](http://www.postgresql.org/) is +very good at. pgloader can help you there.

+
+

In a Single Command Line

+

You can

+
$ createdb chinook
+$ pgloader https://github.com/lerocha/chinook-database/raw/master/ChinookDatabase/DataSources/Chinook_Sqlite_AutoIncrementPKs.sqlite pgsql:///chinook
+
+
+

Done! All with the schema, data, constraints, primary keys and foreign keys, +etc. We also see an error with the Chinook schema that contains several +primary key definitions against the same table, which is not accepted by +PostgreSQL:

+
2017-06-20T16:18:59.019000+02:00 LOG Data errors in '/private/tmp/pgloader/'
+2017-06-20T16:18:59.236000+02:00 LOG Fetching 'https://github.com/lerocha/chinook-database/raw/master/ChinookDatabase/DataSources/Chinook_Sqlite_AutoIncrementPKs.sqlite'
+2017-06-20T16:19:00.664000+02:00 ERROR Database error 42P16: multiple primary keys for table "playlisttrack" are not allowed
+QUERY: ALTER TABLE playlisttrack ADD PRIMARY KEY USING INDEX idx_66873_sqlite_autoindex_playlisttrack_1;
+2017-06-20T16:19:00.665000+02:00 LOG report summary reset
+             table name       read   imported     errors      total time
+-----------------------  ---------  ---------  ---------  --------------
+                  fetch          0          0          0          0.877s
+        fetch meta data         33         33          0          0.033s
+         Create Schemas          0          0          0          0.003s
+       Create SQL Types          0          0          0          0.006s
+          Create tables         22         22          0          0.043s
+         Set Table OIDs         11         11          0          0.012s
+-----------------------  ---------  ---------  ---------  --------------
+                  album        347        347          0          0.023s
+                 artist        275        275          0          0.023s
+               customer         59         59          0          0.021s
+               employee          8          8          0          0.018s
+                invoice        412        412          0          0.031s
+                  genre         25         25          0          0.021s
+            invoiceline       2240       2240          0          0.034s
+              mediatype          5          5          0          0.025s
+          playlisttrack       8715       8715          0          0.040s
+               playlist         18         18          0          0.016s
+                  track       3503       3503          0          0.111s
+-----------------------  ---------  ---------  ---------  --------------
+COPY Threads Completion         33         33          0          0.313s
+         Create Indexes         22         22          0          0.160s
+ Index Build Completion         22         22          0          0.027s
+        Reset Sequences          0          0          0          0.017s
+           Primary Keys         12          0          1          0.013s
+    Create Foreign Keys         11         11          0          0.040s
+        Create Triggers          0          0          0          0.000s
+       Install Comments          0          0          0          0.000s
+-----------------------  ---------  ---------  ---------  --------------
+      Total import time      15607      15607          0          1.669s
+
+
+

You may need to have special cases to take care of tho. In advanced case you +can use the pgloader command.

+
+
+

The Command

+

To load data with [pgloader](http://pgloader.io/) you need to define in a +command the operations in some details. Here’s our command:

+
load database
+     from 'sqlite/Chinook_Sqlite_AutoIncrementPKs.sqlite'
+     into postgresql:///pgloader
+
+ with include drop, create tables, create indexes, reset sequences
+
+  set work_mem to '16MB', maintenance_work_mem to '512 MB';
+
+
+

Note that here pgloader will benefit from the meta-data information found in +the SQLite file to create a PostgreSQL database capable of hosting the data +as described, then load the data.

+
+
+

Loading the data

+

Let’s start the pgloader command with our sqlite.load command file:

+
$ pgloader sqlite.load
+... LOG Starting pgloader, log system is ready.
+... LOG Parsing commands from file "/Users/dim/dev/pgloader/test/sqlite.load"
+... WARNING Postgres warning: table "album" does not exist, skipping
+... WARNING Postgres warning: table "artist" does not exist, skipping
+... WARNING Postgres warning: table "customer" does not exist, skipping
+... WARNING Postgres warning: table "employee" does not exist, skipping
+... WARNING Postgres warning: table "genre" does not exist, skipping
+... WARNING Postgres warning: table "invoice" does not exist, skipping
+... WARNING Postgres warning: table "invoiceline" does not exist, skipping
+... WARNING Postgres warning: table "mediatype" does not exist, skipping
+... WARNING Postgres warning: table "playlist" does not exist, skipping
+... WARNING Postgres warning: table "playlisttrack" does not exist, skipping
+... WARNING Postgres warning: table "track" does not exist, skipping
+            table name       read   imported     errors            time
+----------------------  ---------  ---------  ---------  --------------
+      create, truncate          0          0          0          0.052s
+                 Album        347        347          0          0.070s
+                Artist        275        275          0          0.014s
+              Customer         59         59          0          0.014s
+              Employee          8          8          0          0.012s
+                 Genre         25         25          0          0.018s
+               Invoice        412        412          0          0.032s
+           InvoiceLine       2240       2240          0          0.077s
+             MediaType          5          5          0          0.012s
+              Playlist         18         18          0          0.008s
+         PlaylistTrack       8715       8715          0          0.071s
+                 Track       3503       3503          0          0.105s
+index build completion          0          0          0          0.000s
+----------------------  ---------  ---------  ---------  --------------
+        Create Indexes         20         20          0          0.279s
+       reset sequences          0          0          0          0.043s
+----------------------  ---------  ---------  ---------  --------------
+  Total streaming time      15607      15607          0          0.476s
+
+
+

We can see that pgloader did download the file from +its HTTP URL location then unziped it before loading it.

+

Also, the WARNING messages we see here are expected as the PostgreSQL +database is empty when running the command, and pgloader is using the SQL +commands DROP TABLE IF EXISTS when the given command uses the include +drop option.

+

Note that the output of the command has been edited to facilitate its +browsing online.

+
+
+ + +
+
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/_build/html/tutorial/tutorial.html b/docs/_build/html/tutorial/tutorial.html new file mode 100644 index 0000000..844d134 --- /dev/null +++ b/docs/_build/html/tutorial/tutorial.html @@ -0,0 +1,893 @@ + + + + + + + PgLoader Tutorial — pgloader 3.4.1 documentation + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+

PgLoader Tutorial

+
+

PgLoader Quick Start

+

In simple cases, pgloader is very easy to use.

+
+

CSV

+

Load data from a CSV file into a pre-existing table in your database:

+
pgloader --type csv                                   \
+         --field id --field field                     \
+         --with truncate                              \
+         --with "fields terminated by ','"            \
+         ./test/data/matching-1.csv                   \
+         postgres:///pgloader?tablename=matching
+
+
+

In that example the whole loading is driven from the command line, bypassing +the need for writing a command in the pgloader command syntax entirely. As +there’s no command though, the extra information needed must be provided on +the command line using the –type and –field and –with switches.

+

For documentation about the available syntaxes for the –field and +–with switches, please refer to the CSV section later in the man page.

+

Note also that the PostgreSQL URI includes the target tablename.

+
+
+

Reading from STDIN

+

File based pgloader sources can be loaded from the standard input, as in the +following example:

+
pgloader --type csv                                         \
+         --field "usps,geoid,aland,awater,aland_sqmi,awater_sqmi,intptlat,intptlong" \
+         --with "skip header = 1"                          \
+         --with "fields terminated by '\t'"                \
+         -                                                 \
+         postgresql:///pgloader?districts_longlat          \
+         < test/data/2013_Gaz_113CDs_national.txt
+
+
+

The dash (-) character as a source is used to mean standard input, as +usual in Unix command lines. It’s possible to stream compressed content to +pgloader with this technique, using the Unix pipe:

+
gunzip -c source.gz | pgloader --type csv ... - pgsql:///target?foo
+
+
+
+
+

Loading from CSV available through HTTP

+

The same command as just above can also be run if the CSV file happens to be +found on a remote HTTP location:

+
pgloader --type csv                                                     \
+         --field "usps,geoid,aland,awater,aland_sqmi,awater_sqmi,intptlat,intptlong" \
+         --with "skip header = 1"                                       \
+         --with "fields terminated by '\t'"                             \
+         http://pgsql.tapoueh.org/temp/2013_Gaz_113CDs_national.txt     \
+         postgresql:///pgloader?districts_longlat
+
+
+

Some more options have to be used in that case, as the file contains a +one-line header (most commonly that’s column names, could be a copyright +notice). Also, in that case, we specify all the fields right into a single +–field option argument.

+

Again, the PostgreSQL target connection string must contain the tablename +option and you have to ensure that the target table exists and may fit the +data. Here’s the SQL command used in that example in case you want to try it +yourself:

+
create table districts_longlat
+(
+         usps        text,
+         geoid       text,
+         aland       bigint,
+         awater      bigint,
+         aland_sqmi  double precision,
+         awater_sqmi double precision,
+         intptlat    double precision,
+         intptlong   double precision
+);
+
+
+

Also notice that the same command will work against an archived version of +the same data.

+
+
+

Streaming CSV data from an HTTP compressed file

+

Finally, it’s important to note that pgloader first fetches the content from +the HTTP URL it to a local file, then expand the archive when it’s +recognized to be one, and only then processes the locally expanded file.

+

In some cases, either because pgloader has no direct support for your +archive format or maybe because expanding the archive is not feasible in +your environment, you might want to stream the content straight from its +remote location into PostgreSQL. Here’s how to do that, using the old battle +tested Unix Pipes trick:

+
curl http://pgsql.tapoueh.org/temp/2013_Gaz_113CDs_national.txt.gz \
+| gunzip -c                                                        \
+| pgloader --type csv                                              \
+           --field "usps,geoid,aland,awater,aland_sqmi,awater_sqmi,intptlat,intptlong"
+           --with "skip header = 1"                                \
+           --with "fields terminated by '\t'"                      \
+           -                                                       \
+           postgresql:///pgloader?districts_longlat
+
+
+

Now the OS will take care of the streaming and buffering between the network +and the commands and pgloader will take care of streaming the data down to +PostgreSQL.

+
+
+

Migrating from SQLite

+

The following command will open the SQLite database, discover its tables +definitions including indexes and foreign keys, migrate those definitions +while casting the data type specifications to their PostgreSQL equivalent +and then migrate the data over:

+
createdb newdb
+pgloader ./test/sqlite/sqlite.db postgresql:///newdb
+
+
+
+
+

Migrating from MySQL

+

Just create a database where to host the MySQL data and definitions and have +pgloader do the migration for you in a single command line:

+
createdb pagila
+pgloader mysql://user@localhost/sakila postgresql:///pagila
+
+
+
+
+

Fetching an archived DBF file from a HTTP remote location

+

It’s possible for pgloader to download a file from HTTP, unarchive it, and +only then open it to discover the schema then load the data:

+
createdb foo
+pgloader --type dbf http://www.insee.fr/fr/methodes/nomenclatures/cog/telechargement/2013/dbf/historiq2013.zip postgresql:///foo
+
+
+

Here it’s not possible for pgloader to guess the kind of data source it’s +being given, so it’s necessary to use the –type command line switch.

+
+
+
+

Loading CSV Data with pgloader

+

CSV means comma separated values and is often found with quite varying +specifications. pgloader allows you to describe those specs in its command.

+
+

The Command

+

To load data with [pgloader](http://pgloader.io/) you need to define in a +command the operations in some details. Here’s our example for loading CSV +data:

+
LOAD CSV
+     FROM 'path/to/file.csv' (x, y, a, b, c, d)
+     INTO postgresql:///pgloader?csv (a, b, d, c)
+
+     WITH truncate,
+          skip header = 1,
+          fields optionally enclosed by '"',
+          fields escaped by double-quote,
+          fields terminated by ','
+
+      SET client_encoding to 'latin1',
+          work_mem to '12MB',
+          standard_conforming_strings to 'on'
+
+   BEFORE LOAD DO
+    $$ drop table if exists csv; $$,
+    $$ create table csv (
+        a bigint,
+        b bigint,
+        c char(2),
+        d text
+       );
+  $$;
+
+
+
+
+

The Data

+

This command allows loading the following CSV file content:

+
Header, with a © sign
+"2.6.190.56","2.6.190.63","33996344","33996351","GB","United Kingdom"
+"3.0.0.0","4.17.135.31","50331648","68257567","US","United States"
+"4.17.135.32","4.17.135.63","68257568","68257599","CA","Canada"
+"4.17.135.64","4.17.142.255","68257600","68259583","US","United States"
+"4.17.143.0","4.17.143.15","68259584","68259599","CA","Canada"
+"4.17.143.16","4.18.32.71","68259600","68296775","US","United States"
+
+
+
+
+

Loading the data

+

Here’s how to start loading the data. Note that the ouput here has been +edited so as to facilitate its browsing online:

+
$ pgloader csv.load
+... LOG Starting pgloader, log system is ready.
+... LOG Parsing commands from file "/Users/dim/dev/pgloader/test/csv.load"
+
+       table name       read   imported     errors            time
+-----------------  ---------  ---------  ---------  --------------
+      before load          2          2          0          0.039s
+-----------------  ---------  ---------  ---------  --------------
+              csv          6          6          0          0.019s
+-----------------  ---------  ---------  ---------  --------------
+Total import time          6          6          0          0.058s
+
+
+
+
+

The result

+

As you can see, the command described above is filtering the input and only +importing some of the columns from the example data file. Here’s what gets +loaded in the PostgreSQL database:

+
pgloader# table csv;
+    a     |    b     | c  |       d
+----------+----------+----+----------------
+ 33996344 | 33996351 | GB | United Kingdom
+ 50331648 | 68257567 | US | United States
+ 68257568 | 68257599 | CA | Canada
+ 68257600 | 68259583 | US | United States
+ 68259584 | 68259599 | CA | Canada
+ 68259600 | 68296775 | US | United States
+(6 rows)
+
+
+
+
+
+

Loading Fixed Width Data File with pgloader

+

Some data providers still use a format where each column is specified with a +starting index position and a given length. Usually the columns are +blank-padded when the data is shorter than the full reserved range.

+
+

The Command

+

To load data with [pgloader](http://pgloader.io/) you need to define in a +command the operations in some details. Here’s our example for loading +Fixed Width Data, using a file provided by the US census.

+

You can find more files from them at the +[Census 2000 Gazetteer Files](http://www.census.gov/geo/maps-data/data/gazetteer2000.html).

+

Here’s our command:

+
LOAD ARCHIVE
+   FROM http://www.census.gov/geo/maps-data/data/docs/gazetteer/places2k.zip
+   INTO postgresql:///pgloader
+
+   BEFORE LOAD DO
+     $$ drop table if exists places; $$,
+     $$ create table places
+       (
+          usps      char(2)  not null,
+          fips      char(2)  not null,
+          fips_code char(5),
+          loc_name  varchar(64)
+       );
+     $$
+
+   LOAD FIXED
+        FROM FILENAME MATCHING ~/places2k.txt/
+             WITH ENCODING latin1
+             (
+                usps           from   0 for  2,
+                fips           from   2 for  2,
+                fips_code      from   4 for  5,
+                "LocationName" from   9 for 64 [trim right whitespace],
+                p              from  73 for  9,
+                h              from  82 for  9,
+                land           from  91 for 14,
+                water          from 105 for 14,
+                ldm            from 119 for 14,
+                wtm            from 131 for 14,
+                lat            from 143 for 10,
+                long           from 153 for 11
+             )
+        INTO postgresql:///pgloader?places
+             (
+            usps, fips, fips_code, "LocationName"
+             );
+
+
+
+
+

The Data

+

This command allows loading the following file content, where we are only +showing the first couple of lines:

+
AL0100124Abbeville city                                                       2987     1353      40301945        120383   15.560669    0.046480 31.566367 -85.251300
+AL0100460Adamsville city                                                      4965     2042      50779330         14126   19.606010    0.005454 33.590411 -86.949166
+AL0100484Addison town                                                          723      339       9101325             0    3.514041    0.000000 34.200042 -87.177851
+AL0100676Akron town                                                            521      239       1436797             0    0.554750    0.000000 32.876425 -87.740978
+AL0100820Alabaster city                                                      22619     8594      53023800        141711   20.472605    0.054715 33.231162 -86.823829
+AL0100988Albertville city                                                    17247     7090      67212867        258738   25.951034    0.099899 34.265362 -86.211261
+AL0101132Alexander City city                                                 15008     6855     100534344        433413   38.816529    0.167342 32.933157 -85.936008
+
+
+
+
+

Loading the data

+

Let’s start the pgloader command with our census-places.load command file:

+
$ pgloader census-places.load
+... LOG Starting pgloader, log system is ready.
+... LOG Parsing commands from file "/Users/dim/dev/pgloader/test/census-places.load"
+... LOG Fetching 'http://www.census.gov/geo/maps-data/data/docs/gazetteer/places2k.zip'
+... LOG Extracting files from archive '//private/var/folders/w7/9n8v8pw54t1gngfff0lj16040000gn/T/pgloader//places2k.zip'
+
+       table name       read   imported     errors            time
+-----------------  ---------  ---------  ---------  --------------
+         download          0          0          0          1.494s
+          extract          0          0          0          1.013s
+      before load          2          2          0          0.013s
+-----------------  ---------  ---------  ---------  --------------
+           places      25375      25375          0          0.499s
+-----------------  ---------  ---------  ---------  --------------
+Total import time      25375      25375          0          3.019s
+
+
+

We can see that pgloader did download the file from its HTTP URL location +then unziped it before the loading itself.

+

Note that the output of the command has been edited to facilitate its +browsing online.

+
+
+
+

Loading MaxMind Geolite Data with pgloader

+

MaxMind provides a free dataset for +geolocation, which is quite popular. Using pgloader you can download the +lastest version of it, extract the CSV files from the archive and load their +content into your database directly.

+
+

The Command

+

To load data with pgloader you need to define in a command the operations +in some details. Here’s our example for loading the Geolite data:

+
/*
+ * Loading from a ZIP archive containing CSV files. The full test can be
+ * done with using the archive found at
+ * http://geolite.maxmind.com/download/geoip/database/GeoLiteCity_CSV/GeoLiteCity-latest.zip
+ *
+ * And a very light version of this data set is found at
+ * http://pgsql.tapoueh.org/temp/foo.zip for quick testing.
+ */
+
+LOAD ARCHIVE
+   FROM http://geolite.maxmind.com/download/geoip/database/GeoLiteCity_CSV/GeoLiteCity-latest.zip
+   INTO postgresql:///ip4r
+
+   BEFORE LOAD DO
+     $$ create extension if not exists ip4r; $$,
+     $$ create schema if not exists geolite; $$,
+     $$ create table if not exists geolite.location
+       (
+          locid      integer primary key,
+          country    text,
+          region     text,
+          city       text,
+          postalcode text,
+          location   point,
+          metrocode  text,
+          areacode   text
+       );
+     $$,
+     $$ create table if not exists geolite.blocks
+       (
+          iprange    ip4r,
+          locid      integer
+       );
+     $$,
+     $$ drop index if exists geolite.blocks_ip4r_idx; $$,
+     $$ truncate table geolite.blocks, geolite.location cascade; $$
+
+   LOAD CSV
+        FROM FILENAME MATCHING ~/GeoLiteCity-Location.csv/
+             WITH ENCODING iso-8859-1
+             (
+                locId,
+                country,
+                region     null if blanks,
+                city       null if blanks,
+                postalCode null if blanks,
+                latitude,
+                longitude,
+                metroCode  null if blanks,
+                areaCode   null if blanks
+             )
+        INTO postgresql:///ip4r?geolite.location
+             (
+                locid,country,region,city,postalCode,
+                location point using (format nil "(~a,~a)" longitude latitude),
+                metroCode,areaCode
+             )
+        WITH skip header = 2,
+             fields optionally enclosed by '"',
+             fields escaped by double-quote,
+             fields terminated by ','
+
+  AND LOAD CSV
+        FROM FILENAME MATCHING ~/GeoLiteCity-Blocks.csv/
+             WITH ENCODING iso-8859-1
+             (
+                startIpNum, endIpNum, locId
+             )
+        INTO postgresql:///ip4r?geolite.blocks
+             (
+                iprange ip4r using (ip-range startIpNum endIpNum),
+                locId
+             )
+        WITH skip header = 2,
+             fields optionally enclosed by '"',
+             fields escaped by double-quote,
+             fields terminated by ','
+
+   FINALLY DO
+     $$ create index blocks_ip4r_idx on geolite.blocks using gist(iprange); $$;
+
+
+

Note that while the Geolite data is using a pair of integers (start, +end) to represent ipv4 data, we use the very poweful ip4r PostgreSQL Extension instead.

+

The transformation from a pair of integers into an IP is done dynamically by +the pgloader process.

+

Also, the location is given as a pair of float columns for the longitude +and the latitude where PostgreSQL offers the +point +datatype, so the pgloader command here will actually transform the data on +the fly to use the appropriate data type and its input representation.

+
+
+

Loading the data

+

Here’s how to start loading the data. Note that the ouput here has been +edited so as to facilitate its browsing online:

+
$ pgloader archive.load
+... LOG Starting pgloader, log system is ready.
+... LOG Parsing commands from file "/Users/dim/dev/pgloader/test/archive.load"
+... LOG Fetching 'http://geolite.maxmind.com/download/geoip/database/GeoLiteCity_CSV/GeoLiteCity-latest.zip'
+... LOG Extracting files from archive '//private/var/folders/w7/9n8v8pw54t1gngfff0lj16040000gn/T/pgloader//GeoLiteCity-latest.zip'
+
+       table name       read   imported     errors            time
+-----------------  ---------  ---------  ---------  --------------
+         download          0          0          0         11.592s
+          extract          0          0          0          1.012s
+      before load          6          6          0          0.019s
+-----------------  ---------  ---------  ---------  --------------
+ geolite.location     470387     470387          0          7.743s
+   geolite.blocks    1903155    1903155          0         16.332s
+-----------------  ---------  ---------  ---------  --------------
+          finally          1          1          0         31.692s
+-----------------  ---------  ---------  ---------  --------------
+Total import time    2373542    2373542          0        1m8.390s
+
+
+

The timing of course includes the transformation of the 1.9 million pairs +of integer into a single ipv4 range each. The finally step consists of +creating the GiST specialized index as given in the main command:

+
CREATE INDEX blocks_ip4r_idx ON geolite.blocks USING gist(iprange);
+
+
+

That index will then be used to speed up queries wanting to find which +recorded geolocation contains a specific IP address:

+
ip4r> select *
+        from      geolite.location l
+             join geolite.blocks b using(locid)
+       where iprange >>= '8.8.8.8';
+
+-[ RECORD 1 ]------------------
+locid      | 223
+country    | US
+region     |
+city       |
+postalcode |
+location   | (-97,38)
+metrocode  |
+areacode   |
+iprange    | 8.8.8.8-8.8.37.255
+
+Time: 0.747 ms
+
+
+
+
+
+

Loading dBase files with pgloader

+

The dBase format is still in use in some places as modern tools such as +Filemaker and Excel offer some level of support for it. Speaking of +support in modern tools, pgloader is right there on the list too!

+
+

The Command

+

To load data with [pgloader](http://pgloader.io/) you need to define in a +command the operations in some details. Here’s our example for loading a +dBase file, using a file provided by the french administration.

+

You can find more files from them at the Insee +website.

+

Here’s our command:

+
LOAD DBF
+    FROM http://www.insee.fr/fr/methodes/nomenclatures/cog/telechargement/2013/dbf/historiq2013.zip
+    INTO postgresql:///pgloader
+    WITH truncate, create table
+     SET client_encoding TO 'latin1';
+
+
+

Note that here pgloader will benefit from the meta-data information found in +the dBase file to create a PostgreSQL table capable of hosting the data as +described, then load the data.

+
+
+

Loading the data

+

Let’s start the pgloader command with our dbf-zip.load command file:

+
$ pgloader dbf-zip.load
+... LOG Starting pgloader, log system is ready.
+... LOG Parsing commands from file "/Users/dim/dev/pgloader/test/dbf-zip.load"
+... LOG Fetching 'http://www.insee.fr/fr/methodes/nomenclatures/cog/telechargement/2013/dbf/historiq2013.zip'
+... LOG Extracting files from archive '//private/var/folders/w7/9n8v8pw54t1gngfff0lj16040000gn/T/pgloader//historiq2013.zip'
+
+       table name       read   imported     errors            time
+-----------------  ---------  ---------  ---------  --------------
+         download          0          0          0          0.167s
+          extract          0          0          0          1.010s
+ create, truncate          0          0          0          0.071s
+-----------------  ---------  ---------  ---------  --------------
+     historiq2013       9181       9181          0          0.658s
+-----------------  ---------  ---------  ---------  --------------
+Total import time       9181       9181          0          1.906s
+
+
+

We can see that pgloader did download the file from +its HTTP URL location then unziped it before the loading itself.

+

Note that the output of the command has been edited to facilitate its +browsing online.

+
+
+
+

Loading SQLite files with pgloader

+

The SQLite database is a respected solution to manage your data with. Its +embeded nature makes it a source of migrations when a projects now needs to +handle more concurrency, which [PostgreSQL](http://www.postgresql.org/) is +very good at. pgloader can help you there.

+
+

In a Single Command Line

+

You can

+
$ createdb chinook
+$ pgloader https://github.com/lerocha/chinook-database/raw/master/ChinookDatabase/DataSources/Chinook_Sqlite_AutoIncrementPKs.sqlite pgsql:///chinook
+
+
+

Done! All with the schema, data, constraints, primary keys and foreign keys, +etc. We also see an error with the Chinook schema that contains several +primary key definitions against the same table, which is not accepted by +PostgreSQL:

+
2017-06-20T16:18:59.019000+02:00 LOG Data errors in '/private/tmp/pgloader/'
+2017-06-20T16:18:59.236000+02:00 LOG Fetching 'https://github.com/lerocha/chinook-database/raw/master/ChinookDatabase/DataSources/Chinook_Sqlite_AutoIncrementPKs.sqlite'
+2017-06-20T16:19:00.664000+02:00 ERROR Database error 42P16: multiple primary keys for table "playlisttrack" are not allowed
+QUERY: ALTER TABLE playlisttrack ADD PRIMARY KEY USING INDEX idx_66873_sqlite_autoindex_playlisttrack_1;
+2017-06-20T16:19:00.665000+02:00 LOG report summary reset
+             table name       read   imported     errors      total time
+-----------------------  ---------  ---------  ---------  --------------
+                  fetch          0          0          0          0.877s
+        fetch meta data         33         33          0          0.033s
+         Create Schemas          0          0          0          0.003s
+       Create SQL Types          0          0          0          0.006s
+          Create tables         22         22          0          0.043s
+         Set Table OIDs         11         11          0          0.012s
+-----------------------  ---------  ---------  ---------  --------------
+                  album        347        347          0          0.023s
+                 artist        275        275          0          0.023s
+               customer         59         59          0          0.021s
+               employee          8          8          0          0.018s
+                invoice        412        412          0          0.031s
+                  genre         25         25          0          0.021s
+            invoiceline       2240       2240          0          0.034s
+              mediatype          5          5          0          0.025s
+          playlisttrack       8715       8715          0          0.040s
+               playlist         18         18          0          0.016s
+                  track       3503       3503          0          0.111s
+-----------------------  ---------  ---------  ---------  --------------
+COPY Threads Completion         33         33          0          0.313s
+         Create Indexes         22         22          0          0.160s
+ Index Build Completion         22         22          0          0.027s
+        Reset Sequences          0          0          0          0.017s
+           Primary Keys         12          0          1          0.013s
+    Create Foreign Keys         11         11          0          0.040s
+        Create Triggers          0          0          0          0.000s
+       Install Comments          0          0          0          0.000s
+-----------------------  ---------  ---------  ---------  --------------
+      Total import time      15607      15607          0          1.669s
+
+
+

You may need to have special cases to take care of tho. In advanced case you +can use the pgloader command.

+
+
+

The Command

+

To load data with [pgloader](http://pgloader.io/) you need to define in a +command the operations in some details. Here’s our command:

+
load database
+     from 'sqlite/Chinook_Sqlite_AutoIncrementPKs.sqlite'
+     into postgresql:///pgloader
+
+ with include drop, create tables, create indexes, reset sequences
+
+  set work_mem to '16MB', maintenance_work_mem to '512 MB';
+
+
+

Note that here pgloader will benefit from the meta-data information found in +the SQLite file to create a PostgreSQL database capable of hosting the data +as described, then load the data.

+
+
+

Loading the data

+

Let’s start the pgloader command with our sqlite.load command file:

+
$ pgloader sqlite.load
+... LOG Starting pgloader, log system is ready.
+... LOG Parsing commands from file "/Users/dim/dev/pgloader/test/sqlite.load"
+... WARNING Postgres warning: table "album" does not exist, skipping
+... WARNING Postgres warning: table "artist" does not exist, skipping
+... WARNING Postgres warning: table "customer" does not exist, skipping
+... WARNING Postgres warning: table "employee" does not exist, skipping
+... WARNING Postgres warning: table "genre" does not exist, skipping
+... WARNING Postgres warning: table "invoice" does not exist, skipping
+... WARNING Postgres warning: table "invoiceline" does not exist, skipping
+... WARNING Postgres warning: table "mediatype" does not exist, skipping
+... WARNING Postgres warning: table "playlist" does not exist, skipping
+... WARNING Postgres warning: table "playlisttrack" does not exist, skipping
+... WARNING Postgres warning: table "track" does not exist, skipping
+            table name       read   imported     errors            time
+----------------------  ---------  ---------  ---------  --------------
+      create, truncate          0          0          0          0.052s
+                 Album        347        347          0          0.070s
+                Artist        275        275          0          0.014s
+              Customer         59         59          0          0.014s
+              Employee          8          8          0          0.012s
+                 Genre         25         25          0          0.018s
+               Invoice        412        412          0          0.032s
+           InvoiceLine       2240       2240          0          0.077s
+             MediaType          5          5          0          0.012s
+              Playlist         18         18          0          0.008s
+         PlaylistTrack       8715       8715          0          0.071s
+                 Track       3503       3503          0          0.105s
+index build completion          0          0          0          0.000s
+----------------------  ---------  ---------  ---------  --------------
+        Create Indexes         20         20          0          0.279s
+       reset sequences          0          0          0          0.043s
+----------------------  ---------  ---------  ---------  --------------
+  Total streaming time      15607      15607          0          0.476s
+
+
+

We can see that pgloader did download the file from +its HTTP URL location then unziped it before loading it.

+

Also, the WARNING messages we see here are expected as the PostgreSQL +database is empty when running the command, and pgloader is using the SQL +commands DROP TABLE IF EXISTS when the given command uses the include +drop option.

+

Note that the output of the command has been edited to facilitate its +browsing online.

+
+
+
+

Migrating from MySQL to PostgreSQL

+

If you want to migrate your data over to PostgreSQL from MySQL then pgloader is the tool of +choice!

+

Most tools around are skipping the main problem with migrating from MySQL, +which is to do with the type casting and data sanitizing that needs to be +done. pgloader will not leave you alone on those topics.

+
+

In a Single Command Line

+

As an example, we will use the f1db database from <http://ergast.com/mrd/> +which which provides a historical record of motor racing data for +non-commercial purposes. You can either use their API or download the whole +database at http://ergast.com/downloads/f1db.sql.gz. Once you’ve done that load the +database in MySQL:

+
$ mysql -u root
+> create database f1db;
+> source f1db.sql
+
+
+

Now let’s migrate this database into PostgreSQL in a single command line:

+
$ createdb f1db
+$ pgloader mysql://root@localhost/f1db pgsql:///f1db
+
+
+

Done! All with schema, table definitions, constraints, indexes, primary +keys, auto_increment columns turned into bigserial , foreign keys, +comments, and if you had some MySQL default values such as ON UPDATE +CURRENT_TIMESTAMP they would have been translated to a PostgreSQL before +update trigger +automatically.

+
$ pgloader mysql://root@localhost/f1db pgsql:///f1db
+2017-06-16T08:56:14.064000+02:00 LOG Main logs in '/private/tmp/pgloader/pgloader.log'
+2017-06-16T08:56:14.068000+02:00 LOG Data errors in '/private/tmp/pgloader/'
+2017-06-16T08:56:19.542000+02:00 LOG report summary reset
+               table name       read   imported     errors      total time
+-------------------------  ---------  ---------  ---------  --------------
+          fetch meta data         33         33          0          0.365s
+           Create Schemas          0          0          0          0.007s
+         Create SQL Types          0          0          0          0.006s
+            Create tables         26         26          0          0.068s
+           Set Table OIDs         13         13          0          0.012s
+-------------------------  ---------  ---------  ---------  --------------
+  f1db.constructorresults      11011      11011          0          0.205s
+            f1db.circuits         73         73          0          0.150s
+        f1db.constructors        208        208          0          0.059s
+f1db.constructorstandings      11766      11766          0          0.365s
+             f1db.drivers        841        841          0          0.268s
+            f1db.laptimes     413578     413578          0          2.892s
+     f1db.driverstandings      31420      31420          0          0.583s
+            f1db.pitstops       5796       5796          0          2.154s
+               f1db.races        976        976          0          0.227s
+          f1db.qualifying       7257       7257          0          0.228s
+             f1db.seasons         68         68          0          0.527s
+             f1db.results      23514      23514          0          0.658s
+              f1db.status        133        133          0          0.130s
+-------------------------  ---------  ---------  ---------  --------------
+  COPY Threads Completion         39         39          0          4.303s
+           Create Indexes         20         20          0          1.497s
+   Index Build Completion         20         20          0          0.214s
+          Reset Sequences          0         10          0          0.058s
+             Primary Keys         13         13          0          0.012s
+      Create Foreign Keys          0          0          0          0.000s
+          Create Triggers          0          0          0          0.001s
+         Install Comments          0          0          0          0.000s
+-------------------------  ---------  ---------  ---------  --------------
+        Total import time     506641     506641          0          5.547s
+
+
+

You may need to have special cases to take care of tho, or views that you +want to materialize while doing the migration. In advanced case you can use +the pgloader command.

+
+
+

The Command

+

To load data with pgloader you need to define in a command the operations +in some details. Here’s our example for loading the MySQL Sakila Sample +Database.

+

Here’s our command:

+
load database
+     from      mysql://root@localhost/sakila
+     into postgresql:///sakila
+
+ WITH include drop, create tables, no truncate,
+      create indexes, reset sequences, foreign keys
+
+  SET maintenance_work_mem to '128MB', work_mem to '12MB', search_path to 'sakila'
+
+ CAST type datetime to timestamptz
+                drop default drop not null using zero-dates-to-null,
+      type date drop not null drop default using zero-dates-to-null
+
+ MATERIALIZE VIEWS film_list, staff_list
+
+ -- INCLUDING ONLY TABLE NAMES MATCHING ~/film/, 'actor'
+ -- EXCLUDING TABLE NAMES MATCHING ~<ory>
+
+ BEFORE LOAD DO
+ $$ create schema if not exists sakila; $$;
+
+
+

Note that here pgloader will benefit from the meta-data information found in +the MySQL database to create a PostgreSQL database capable of hosting the +data as described, then load the data.

+

In particular, some specific casting rules are given here, to cope with +date values such as 0000-00-00 that MySQL allows and PostgreSQL rejects +for not existing in our calendar. It’s possible to add per-column casting +rules too, which is useful is some of your tinyint are in fact smallint +while some others are in fact boolean values.

+

Finaly note that we are using the MATERIALIZE VIEWS clause of pgloader: +the selected views here will be migrated over to PostgreSQL with their +contents.

+

It’s possible to use the MATERIALIZE VIEWS clause and give both the name +and the SQL (in MySQL dialect) definition of view, then pgloader creates the +view before loading the data, then drops it again at the end.

+

## Loading the data

+

Let’s start the pgloader command with our sakila.load command file:

+
$ pgloader sakila.load
+... LOG Starting pgloader, log system is ready.
+... LOG Parsing commands from file "/Users/dim/dev/pgloader/test/sakila.load"
+   <WARNING: table "xxx" does not exists have been edited away>
+
+            table name       read   imported     errors            time
+----------------------  ---------  ---------  ---------  --------------
+           before load          1          1          0          0.007s
+       fetch meta data         45         45          0          0.402s
+          create, drop          0         36          0          0.208s
+----------------------  ---------  ---------  ---------  --------------
+                 actor        200        200          0          0.071s
+               address        603        603          0          0.035s
+              category         16         16          0          0.018s
+                  city        600        600          0          0.037s
+               country        109        109          0          0.023s
+              customer        599        599          0          0.073s
+                  film       1000       1000          0          0.135s
+            film_actor       5462       5462          0          0.236s
+         film_category       1000       1000          0          0.070s
+             film_text       1000       1000          0          0.080s
+             inventory       4581       4581          0          0.136s
+              language          6          6          0          0.036s
+               payment      16049      16049          0          0.539s
+                rental      16044      16044          0          0.648s
+                 staff          2          2          0          0.041s
+                 store          2          2          0          0.036s
+             film_list        997        997          0          0.247s
+            staff_list          2          2          0          0.135s
+Index Build Completion          0          0          0          0.000s
+----------------------  ---------  ---------  ---------  --------------
+        Create Indexes         41         41          0          0.964s
+       Reset Sequences          0          1          0          0.035s
+          Foreign Keys         22         22          0          0.254s
+----------------------  ---------  ---------  ---------  --------------
+     Total import time      48272      48272          0          3.502s
+
+
+

The WARNING messages we see here are expected as the PostgreSQL database +is empty when running the command, and pgloader is using the SQL commands +DROP TABLE IF EXISTS when the given command uses the include drop +option.

+

Note that the output of the command has been edited to facilitate its +browsing online.

+
+
+
+ + +
+
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/bugreport.rst b/docs/bugreport.rst new file mode 100644 index 0000000..84726b5 --- /dev/null +++ b/docs/bugreport.rst @@ -0,0 +1,49 @@ +Reporting Bugs +============== + +pgloader is a software and as such contains bugs. Most bugs are easy to +solve and taken care of in a short delay. For this to be possible though, +bug reports need to follow those recommandations: + + - include pgloader version, + - include problematic input and output, + - include a description of the output you expected, + - explain the difference between the ouput you have and the one you expected, + - include a self-reproducing test-case + +Test Cases to Reproduce Bugs +---------------------------- + +Use the *inline* source type to help reproduce a bug, as in the pgloader tests:: + + LOAD CSV + FROM INLINE + INTO postgresql://dim@localhost/pgloader?public."HS" + + WITH truncate, + fields terminated by '\t', + fields not enclosed, + fields escaped by backslash-quote, + quote identifiers + + SET work_mem to '128MB', + standard_conforming_strings to 'on', + application_name to 'my app name' + + BEFORE LOAD DO + $$ create extension if not exists hstore; $$, + $$ drop table if exists "HS"; $$, + $$ CREATE TABLE "HS" + ( + id serial primary key, + kv hstore + ) + $$; + + + 1 email=>foo@example.com,a=>b + 2 test=>value + 3 a=>b,c=>"quoted hstore value",d=>other + 4 baddata + + diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 0000000..7464272 --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,177 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# pgloader documentation build configuration file, created by +# sphinx-quickstart on Tue Dec 5 19:23:32 2017. +# +# This file is execfile()d with the current directory set to its +# containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +# import os +# import sys +# sys.path.insert(0, os.path.abspath('.')) + + +# -- General configuration ------------------------------------------------ + +# If your documentation needs a minimal Sphinx version, state it here. +# +# needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = ['sphinx.ext.githubpages'] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# +# source_suffix = '.rst' +source_suffix = ['.rst', '.md'] + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = 'pgloader' +copyright = '2017, Dimitri Fontaine' +author = 'Dimitri Fontaine' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = '3.4' +# The full version, including alpha/beta/rc tags. +release = '3.4.1' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = None + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This patterns also effect to html_static_path and html_extra_path +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# If true, `todo` and `todoList` produce output, else they produce nothing. +todo_include_todos = False + + +# -- Options for HTML output ---------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = 'alabaster' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +# +# html_theme_options = {} +html_theme_options = { + 'github_user': 'dimitri', + 'github_repo': 'pgloader', + 'description': 'your migration companion', + 'travis_button': True, + 'show_related': True, + 'sidebar_collapse': False, +} + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# Custom sidebar templates, must be a dictionary that maps document names +# to template names. +# +# This is required for the alabaster theme +# refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars +html_sidebars = { + '**': [ + 'relations.html', # needs 'show_related': True theme option to display + 'searchbox.html', + ] +} + + +# -- Options for HTMLHelp output ------------------------------------------ + +# Output file base name for HTML help builder. +htmlhelp_basename = 'pgloaderdoc' + + +# -- Options for LaTeX output --------------------------------------------- + +latex_elements = { + # The paper size ('letterpaper' or 'a4paper'). + # + # 'papersize': 'letterpaper', + + # The font size ('10pt', '11pt' or '12pt'). + # + # 'pointsize': '10pt', + + # Additional stuff for the LaTeX preamble. + # + # 'preamble': '', + + # Latex figure (float) alignment + # + # 'figure_align': 'htbp', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + (master_doc, 'pgloader.tex', 'pgloader Documentation', + 'Dimitri Fontaine', 'manual'), +] + + +# -- Options for manual page output --------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + (master_doc, 'pgloader', 'pgloader Documentation', + [author], 1) +] + + +# -- Options for Texinfo output ------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + (master_doc, 'pgloader', 'pgloader Documentation', + author, 'pgloader', 'One line description of project.', + 'Miscellaneous'), +] + + + diff --git a/docs/dist/carousel.css b/docs/dist/carousel.css deleted file mode 100644 index 094662c..0000000 --- a/docs/dist/carousel.css +++ /dev/null @@ -1,164 +0,0 @@ -/* GLOBAL STYLES --------------------------------------------------- */ -/* Padding below the footer and lighter body text */ - -body { - padding-bottom: 40px; - color: #5a5a5a; -} - - - -/* CUSTOMIZE THE NAVBAR --------------------------------------------------- */ - -/* Special class on .container surrounding .navbar, used for positioning it into place. */ -.navbar-wrapper { - position: absolute; - top: 0; - left: 0; - right: 0; - z-index: 20; -} - -/* Flip around the padding for proper display in narrow viewports */ -.navbar-wrapper .container { - padding-left: 0; - padding-right: 0; -} -.navbar-wrapper .navbar { - padding-left: 15px; - padding-right: 15px; -} - - -/* CUSTOMIZE THE CAROUSEL --------------------------------------------------- */ - -/* Carousel base class */ -.carousel { - height: 350px; - margin-bottom: 60px; -} -/* Since positioning the image, we need to help out the caption */ -.carousel-caption { - z-index: 10; -} -.carousel-caption h1 { - color: orange; -} -.carousel-caption p { - text-align: justify; -} - -/* Declare heights because of positioning of img element */ -.carousel .item { - height: 350px; - background-color: #777; -} -.carousel-inner > .item > img { - position: absolute; - top: 0; - left: 0; - min-width: 100%; - height: 350px; -} - - - -/* MARKETING CONTENT --------------------------------------------------- */ - -/* Pad the edges of the mobile views a bit */ -.marketing { - padding-left: 15px; - padding-right: 15px; -} - -/* Center align the text within the three columns below the carousel */ -.marketing .col-lg-4 { - text-align: center; - margin-bottom: 20px; -} -.marketing h2 { - font-weight: normal; -} -.marketing .col-lg-4 p { - margin-left: 10px; - margin-right: 10px; -} - - -/* Featurettes -------------------------- */ - -.featurette-divider { - margin: 80px 0; /* Space out the Bootstrap
more */ -} - -/* Thin out the marketing headings */ -.featurette-heading { - font-weight: 300; - line-height: 1; - letter-spacing: -1px; -} - - - -/* RESPONSIVE CSS --------------------------------------------------- */ - -@media (min-width: 768px) { - - /* Remove the edge padding needed for mobile */ - .marketing { - padding-left: 0; - padding-right: 0; - } - - /* Navbar positioning foo */ - .navbar-wrapper { - margin-top: 20px; - } - .navbar-wrapper .container { - padding-left: 15px; - padding-right: 15px; - } - .navbar-wrapper .navbar { - padding-left: 0; - padding-right: 0; - } - - /* The navbar becomes detached from the top, so we round the corners */ - .navbar-wrapper .navbar { - border-radius: 4px; - } - - /* Bump up size of carousel content */ - .carousel-caption p { - margin-bottom: 20px; - font-size: 21px; - line-height: 1.4; - } - - .featurette-heading { - font-size: 50px; - } - -} - -/* @media (min-width: 992px) { */ -/* .featurette-heading { */ -/* margin-top: 120px; */ -/* } */ -/* } */ - -pre { - overflow: auto; - word-wrap: normal; - white-space: pre; -} - -pre code { - white-space: pre; -} \ No newline at end of file diff --git a/docs/dist/css/bootstrap-theme.css b/docs/dist/css/bootstrap-theme.css deleted file mode 100644 index df2d3d9..0000000 --- a/docs/dist/css/bootstrap-theme.css +++ /dev/null @@ -1,397 +0,0 @@ -/*! - * Bootstrap v3.0.3 (http://getbootstrap.com) - * Copyright 2013 Twitter, Inc. - * Licensed under http://www.apache.org/licenses/LICENSE-2.0 - */ - -.btn-default, -.btn-primary, -.btn-success, -.btn-info, -.btn-warning, -.btn-danger { - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.btn-default:active, -.btn-primary:active, -.btn-success:active, -.btn-info:active, -.btn-warning:active, -.btn-danger:active, -.btn-default.active, -.btn-primary.active, -.btn-success.active, -.btn-info.active, -.btn-warning.active, -.btn-danger.active { - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); -} - -.btn:active, -.btn.active { - background-image: none; -} - -.btn-default { - text-shadow: 0 1px 0 #fff; - background-image: -webkit-linear-gradient(top, #ffffff 0%, #e0e0e0 100%); - background-image: linear-gradient(to bottom, #ffffff 0%, #e0e0e0 100%); - background-repeat: repeat-x; - border-color: #dbdbdb; - border-color: #ccc; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-default:hover, -.btn-default:focus { - background-color: #e0e0e0; - background-position: 0 -15px; -} - -.btn-default:active, -.btn-default.active { - background-color: #e0e0e0; - border-color: #dbdbdb; -} - -.btn-primary { - background-image: -webkit-linear-gradient(top, #428bca 0%, #2d6ca2 100%); - background-image: linear-gradient(to bottom, #428bca 0%, #2d6ca2 100%); - background-repeat: repeat-x; - border-color: #2b669a; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-primary:hover, -.btn-primary:focus { - background-color: #2d6ca2; - background-position: 0 -15px; -} - -.btn-primary:active, -.btn-primary.active { - background-color: #2d6ca2; - border-color: #2b669a; -} - -.btn-success { - background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%); - background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%); - background-repeat: repeat-x; - border-color: #3e8f3e; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-success:hover, -.btn-success:focus { - background-color: #419641; - background-position: 0 -15px; -} - -.btn-success:active, -.btn-success.active { - background-color: #419641; - border-color: #3e8f3e; -} - -.btn-warning { - background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); - background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%); - background-repeat: repeat-x; - border-color: #e38d13; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-warning:hover, -.btn-warning:focus { - background-color: #eb9316; - background-position: 0 -15px; -} - -.btn-warning:active, -.btn-warning.active { - background-color: #eb9316; - border-color: #e38d13; -} - -.btn-danger { - background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%); - background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%); - background-repeat: repeat-x; - border-color: #b92c28; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-danger:hover, -.btn-danger:focus { - background-color: #c12e2a; - background-position: 0 -15px; -} - -.btn-danger:active, -.btn-danger.active { - background-color: #c12e2a; - border-color: #b92c28; -} - -.btn-info { - background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); - background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%); - background-repeat: repeat-x; - border-color: #28a4c9; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-info:hover, -.btn-info:focus { - background-color: #2aabd2; - background-position: 0 -15px; -} - -.btn-info:active, -.btn-info.active { - background-color: #2aabd2; - border-color: #28a4c9; -} - -.thumbnail, -.img-thumbnail { - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); -} - -.dropdown-menu > li > a:hover, -.dropdown-menu > li > a:focus { - background-color: #e8e8e8; - background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); - background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); -} - -.dropdown-menu > .active > a, -.dropdown-menu > .active > a:hover, -.dropdown-menu > .active > a:focus { - background-color: #357ebd; - background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%); - background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); -} - -.navbar-default { - background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%); - background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%); - background-repeat: repeat-x; - border-radius: 4px; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075); -} - -.navbar-default .navbar-nav > .active > a { - background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%); - background-image: linear-gradient(to bottom, #ebebeb 0%, #f3f3f3 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0); - -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075); -} - -.navbar-brand, -.navbar-nav > li > a { - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25); -} - -.navbar-inverse { - background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222222 100%); - background-image: linear-gradient(to bottom, #3c3c3c 0%, #222222 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.navbar-inverse .navbar-nav > .active > a { - background-image: -webkit-linear-gradient(top, #222222 0%, #282828 100%); - background-image: linear-gradient(to bottom, #222222 0%, #282828 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0); - -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25); - box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25); -} - -.navbar-inverse .navbar-brand, -.navbar-inverse .navbar-nav > li > a { - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); -} - -.navbar-static-top, -.navbar-fixed-top, -.navbar-fixed-bottom { - border-radius: 0; -} - -.alert { - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2); - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.alert-success { - background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); - background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); - background-repeat: repeat-x; - border-color: #b2dba1; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); -} - -.alert-info { - background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%); - background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); - background-repeat: repeat-x; - border-color: #9acfea; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); -} - -.alert-warning { - background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); - background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); - background-repeat: repeat-x; - border-color: #f5e79e; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); -} - -.alert-danger { - background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); - background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); - background-repeat: repeat-x; - border-color: #dca7a7; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); -} - -.progress { - background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); - background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); -} - -.progress-bar { - background-image: -webkit-linear-gradient(top, #428bca 0%, #3071a9 100%); - background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0); -} - -.progress-bar-success { - background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%); - background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); -} - -.progress-bar-info { - background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); - background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); -} - -.progress-bar-warning { - background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); - background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); -} - -.progress-bar-danger { - background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%); - background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); -} - -.list-group { - border-radius: 4px; - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); -} - -.list-group-item.active, -.list-group-item.active:hover, -.list-group-item.active:focus { - text-shadow: 0 -1px 0 #3071a9; - background-image: -webkit-linear-gradient(top, #428bca 0%, #3278b3 100%); - background-image: linear-gradient(to bottom, #428bca 0%, #3278b3 100%); - background-repeat: repeat-x; - border-color: #3278b3; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0); -} - -.panel { - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.panel-default > .panel-heading { - background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); - background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); -} - -.panel-primary > .panel-heading { - background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%); - background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); -} - -.panel-success > .panel-heading { - background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); - background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); -} - -.panel-info > .panel-heading { - background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); - background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); -} - -.panel-warning > .panel-heading { - background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); - background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); -} - -.panel-danger > .panel-heading { - background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%); - background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); -} - -.well { - background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); - background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); - background-repeat: repeat-x; - border-color: #dcdcdc; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); - -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1); - box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1); -} \ No newline at end of file diff --git a/docs/dist/css/bootstrap-theme.min.css b/docs/dist/css/bootstrap-theme.min.css deleted file mode 100644 index c7b6d39..0000000 --- a/docs/dist/css/bootstrap-theme.min.css +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap v3.0.3 (http://getbootstrap.com) - * Copyright 2013 Twitter, Inc. - * Licensed under http://www.apache.org/licenses/LICENSE-2.0 - */ - -.btn-default,.btn-primary,.btn-success,.btn-info,.btn-warning,.btn-danger{text-shadow:0 -1px 0 rgba(0,0,0,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075)}.btn-default:active,.btn-primary:active,.btn-success:active,.btn-info:active,.btn-warning:active,.btn-danger:active,.btn-default.active,.btn-primary.active,.btn-success.active,.btn-info.active,.btn-warning.active,.btn-danger.active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn:active,.btn.active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe0e0e0',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-default:hover,.btn-default:focus{background-color:#e0e0e0;background-position:0 -15px}.btn-default:active,.btn-default.active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-primary{background-image:-webkit-linear-gradient(top,#428bca 0,#2d6ca2 100%);background-image:linear-gradient(to bottom,#428bca 0,#2d6ca2 100%);background-repeat:repeat-x;border-color:#2b669a;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff2d6ca2',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus{background-color:#2d6ca2;background-position:0 -15px}.btn-primary:active,.btn-primary.active{background-color:#2d6ca2;border-color:#2b669a}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);background-repeat:repeat-x;border-color:#3e8f3e;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c',endColorstr='#ff419641',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus{background-color:#419641;background-position:0 -15px}.btn-success:active,.btn-success.active{background-color:#419641;border-color:#3e8f3e}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);background-repeat:repeat-x;border-color:#e38d13;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e',endColorstr='#ffeb9316',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus{background-color:#eb9316;background-position:0 -15px}.btn-warning:active,.btn-warning.active{background-color:#eb9316;border-color:#e38d13}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);background-repeat:repeat-x;border-color:#b92c28;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f',endColorstr='#ffc12e2a',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus{background-color:#c12e2a;background-position:0 -15px}.btn-danger:active,.btn-danger.active{background-color:#c12e2a;border-color:#b92c28}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);background-repeat:repeat-x;border-color:#28a4c9;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2aabd2',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus{background-color:#2aabd2;background-position:0 -15px}.btn-info:active,.btn-info.active{background-color:#2aabd2;border-color:#28a4c9}.thumbnail,.img-thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.075);box-shadow:0 1px 2px rgba(0,0,0,0.075)}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#ffe8e8e8',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{background-color:#357ebd;background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff357ebd',GradientType=0)}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);background-repeat:repeat-x;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff8f8f8',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 5px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 5px rgba(0,0,0,0.075)}.navbar-default .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f3f3f3 100%);background-image:linear-gradient(to bottom,#ebebeb 0,#f3f3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb',endColorstr='#fff3f3f3',GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,0.075);box-shadow:inset 0 3px 9px rgba(0,0,0,0.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,0.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#222 0,#282828 100%);background-image:linear-gradient(to bottom,#222 0,#282828 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff282828',GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,0.25);box-shadow:inset 0 3px 9px rgba(0,0,0,0.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-static-top,.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}.alert{text-shadow:0 1px 0 rgba(255,255,255,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);background-repeat:repeat-x;border-color:#b2dba1;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8',endColorstr='#ffc8e5bc',GradientType=0)}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);background-repeat:repeat-x;border-color:#9acfea;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7',endColorstr='#ffb9def0',GradientType=0)}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);background-repeat:repeat-x;border-color:#f5e79e;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3',endColorstr='#fff8efc0',GradientType=0)}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);background-repeat:repeat-x;border-color:#dca7a7;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede',endColorstr='#ffe7c3c3',GradientType=0)}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb',endColorstr='#fff5f5f5',GradientType=0)}.progress-bar{background-image:-webkit-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:linear-gradient(to bottom,#428bca 0,#3071a9 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff3071a9',GradientType=0)}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c',endColorstr='#ff449d44',GradientType=0)}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff31b0d5',GradientType=0)}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e',endColorstr='#ffec971f',GradientType=0)}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f',endColorstr='#ffc9302c',GradientType=0)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.075);box-shadow:0 1px 2px rgba(0,0,0,0.075)}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{text-shadow:0 -1px 0 #3071a9;background-image:-webkit-linear-gradient(top,#428bca 0,#3278b3 100%);background-image:linear-gradient(to bottom,#428bca 0,#3278b3 100%);background-repeat:repeat-x;border-color:#3278b3;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff3278b3',GradientType=0)}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#ffe8e8e8',GradientType=0)}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff357ebd',GradientType=0)}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8',endColorstr='#ffd0e9c6',GradientType=0)}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7',endColorstr='#ffc4e3f3',GradientType=0)}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3',endColorstr='#fffaf2cc',GradientType=0)}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede',endColorstr='#ffebcccc',GradientType=0)}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);background-repeat:repeat-x;border-color:#dcdcdc;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8',endColorstr='#fff5f5f5',GradientType=0);-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,0.05),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 3px rgba(0,0,0,0.05),0 1px 0 rgba(255,255,255,0.1)} \ No newline at end of file diff --git a/docs/dist/css/bootstrap.css b/docs/dist/css/bootstrap.css deleted file mode 100644 index 377dff3..0000000 --- a/docs/dist/css/bootstrap.css +++ /dev/null @@ -1,7118 +0,0 @@ -/*! - * Bootstrap v3.0.3 (http://getbootstrap.com) - * Copyright 2013 Twitter, Inc. - * Licensed under http://www.apache.org/licenses/LICENSE-2.0 - */ - -/*! normalize.css v2.1.3 | MIT License | git.io/normalize */ - -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -main, -nav, -section, -summary { - display: block; -} - -audio, -canvas, -video { - display: inline-block; -} - -audio:not([controls]) { - display: none; - height: 0; -} - -[hidden], -template { - display: none; -} - -html { - font-family: sans-serif; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; -} - -body { - margin: 0; -} - -a { - background: transparent; -} - -a:focus { - outline: thin dotted; -} - -a:active, -a:hover { - outline: 0; -} - -h1 { - margin: 0.67em 0; - font-size: 2em; -} - -abbr[title] { - border-bottom: 1px dotted; -} - -b, -strong { - font-weight: bold; -} - -dfn { - font-style: italic; -} - -hr { - height: 0; - -moz-box-sizing: content-box; - box-sizing: content-box; -} - -mark { - color: #000; - background: #ff0; -} - -code, -kbd, -pre, -samp { - font-family: monospace, serif; - font-size: 1em; -} - -pre { - white-space: pre-wrap; -} - -q { - quotes: "\201C" "\201D" "\2018" "\2019"; -} - -small { - font-size: 80%; -} - -sub, -sup { - position: relative; - font-size: 75%; - line-height: 0; - vertical-align: baseline; -} - -sup { - top: -0.5em; -} - -sub { - bottom: -0.25em; -} - -img { - border: 0; -} - -svg:not(:root) { - overflow: hidden; -} - -figure { - margin: 0; -} - -fieldset { - padding: 0.35em 0.625em 0.75em; - margin: 0 2px; - border: 1px solid #c0c0c0; -} - -legend { - padding: 0; - border: 0; -} - -button, -input, -select, -textarea { - margin: 0; - font-family: inherit; - font-size: 100%; -} - -button, -input { - line-height: normal; -} - -button, -select { - text-transform: none; -} - -button, -html input[type="button"], -input[type="reset"], -input[type="submit"] { - cursor: pointer; - -webkit-appearance: button; -} - -button[disabled], -html input[disabled] { - cursor: default; -} - -input[type="checkbox"], -input[type="radio"] { - padding: 0; - box-sizing: border-box; -} - -input[type="search"] { - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; - -webkit-appearance: textfield; -} - -input[type="search"]::-webkit-search-cancel-button, -input[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} - -button::-moz-focus-inner, -input::-moz-focus-inner { - padding: 0; - border: 0; -} - -textarea { - overflow: auto; - vertical-align: top; -} - -table { - border-collapse: collapse; - border-spacing: 0; -} - -@media print { - * { - color: #000 !important; - text-shadow: none !important; - background: transparent !important; - box-shadow: none !important; - } - a, - a:visited { - text-decoration: underline; - } - a[href]:after { - content: " (" attr(href) ")"; - } - abbr[title]:after { - content: " (" attr(title) ")"; - } - a[href^="javascript:"]:after, - a[href^="#"]:after { - content: ""; - } - pre, - blockquote { - border: 1px solid #999; - page-break-inside: avoid; - } - thead { - display: table-header-group; - } - tr, - img { - page-break-inside: avoid; - } - img { - max-width: 100% !important; - } - @page { - margin: 2cm .5cm; - } - p, - h2, - h3 { - orphans: 3; - widows: 3; - } - h2, - h3 { - page-break-after: avoid; - } - select { - background: #fff !important; - } - .navbar { - display: none; - } - .table td, - .table th { - background-color: #fff !important; - } - .btn > .caret, - .dropup > .btn > .caret { - border-top-color: #000 !important; - } - .label { - border: 1px solid #000; - } - .table { - border-collapse: collapse !important; - } - .table-bordered th, - .table-bordered td { - border: 1px solid #ddd !important; - } -} - -*, -*:before, -*:after { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -html { - font-size: 62.5%; - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); -} - -body { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 14px; - line-height: 1.428571429; - color: #333333; - background-color: #ffffff; -} - -input, -button, -select, -textarea { - font-family: inherit; - font-size: inherit; - line-height: inherit; -} - -a { - color: #428bca; - text-decoration: none; -} - -a:hover, -a:focus { - color: #2a6496; - text-decoration: underline; -} - -a:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -img { - vertical-align: middle; -} - -.img-responsive { - display: block; - height: auto; - max-width: 100%; -} - -.img-rounded { - border-radius: 6px; -} - -.img-thumbnail { - display: inline-block; - height: auto; - max-width: 100%; - padding: 4px; - line-height: 1.428571429; - background-color: #ffffff; - border: 1px solid #dddddd; - border-radius: 4px; - -webkit-transition: all 0.2s ease-in-out; - transition: all 0.2s ease-in-out; -} - -.img-circle { - border-radius: 50%; -} - -hr { - margin-top: 20px; - margin-bottom: 20px; - border: 0; - border-top: 1px solid #eeeeee; -} - -.sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - border: 0; -} - -h1, -h2, -h3, -h4, -h5, -h6, -.h1, -.h2, -.h3, -.h4, -.h5, -.h6 { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-weight: 500; - line-height: 1.1; - color: inherit; -} - -h1 small, -h2 small, -h3 small, -h4 small, -h5 small, -h6 small, -.h1 small, -.h2 small, -.h3 small, -.h4 small, -.h5 small, -.h6 small, -h1 .small, -h2 .small, -h3 .small, -h4 .small, -h5 .small, -h6 .small, -.h1 .small, -.h2 .small, -.h3 .small, -.h4 .small, -.h5 .small, -.h6 .small { - font-weight: normal; - line-height: 1; - color: #999999; -} - -h1, -h2, -h3 { - margin-top: 20px; - margin-bottom: 10px; -} - -h1 small, -h2 small, -h3 small, -h1 .small, -h2 .small, -h3 .small { - font-size: 65%; -} - -h4, -h5, -h6 { - margin-top: 10px; - margin-bottom: 10px; -} - -h4 small, -h5 small, -h6 small, -h4 .small, -h5 .small, -h6 .small { - font-size: 75%; -} - -h1, -.h1 { - font-size: 36px; -} - -h2, -.h2 { - font-size: 30px; -} - -h3, -.h3 { - font-size: 24px; -} - -h4, -.h4 { - font-size: 18px; -} - -h5, -.h5 { - font-size: 14px; -} - -h6, -.h6 { - font-size: 12px; -} - -p { - margin: 0 0 10px; -} - -.lead { - margin-bottom: 20px; - font-size: 16px; - font-weight: 200; - line-height: 1.4; -} - -@media (min-width: 768px) { - .lead { - font-size: 21px; - } -} - -small, -.small { - font-size: 85%; -} - -cite { - font-style: normal; -} - -.text-muted { - color: #999999; -} - -.text-primary { - color: #428bca; -} - -.text-primary:hover { - color: #3071a9; -} - -.text-warning { - color: #8a6d3b; -} - -.text-warning:hover { - color: #66512c; -} - -.text-danger { - color: #a94442; -} - -.text-danger:hover { - color: #843534; -} - -.text-success { - color: #3c763d; -} - -.text-success:hover { - color: #2b542c; -} - -.text-info { - color: #31708f; -} - -.text-info:hover { - color: #245269; -} - -.text-left { - text-align: left; -} - -.text-right { - text-align: right; -} - -.text-center { - text-align: center; -} - -.page-header { - padding-bottom: 9px; - margin: 40px 0 20px; - border-bottom: 1px solid #eeeeee; -} - -ul, -ol { - margin-top: 0; - margin-bottom: 10px; -} - -ul ul, -ol ul, -ul ol, -ol ol { - margin-bottom: 0; -} - -.list-unstyled { - padding-left: 0; - list-style: none; -} - -.list-inline { - padding-left: 0; - list-style: none; -} - -.list-inline > li { - display: inline-block; - padding-right: 5px; - padding-left: 5px; -} - -.list-inline > li:first-child { - padding-left: 0; -} - -dl { - margin-top: 0; - margin-bottom: 20px; -} - -dt, -dd { - line-height: 1.428571429; -} - -dt { - font-weight: bold; -} - -dd { - margin-left: 0; -} - -@media (min-width: 768px) { - .dl-horizontal dt { - float: left; - width: 160px; - overflow: hidden; - clear: left; - text-align: right; - text-overflow: ellipsis; - white-space: nowrap; - } - .dl-horizontal dd { - margin-left: 180px; - } - .dl-horizontal dd:before, - .dl-horizontal dd:after { - display: table; - content: " "; - } - .dl-horizontal dd:after { - clear: both; - } - .dl-horizontal dd:before, - .dl-horizontal dd:after { - display: table; - content: " "; - } - .dl-horizontal dd:after { - clear: both; - } -} - -abbr[title], -abbr[data-original-title] { - cursor: help; - border-bottom: 1px dotted #999999; -} - -.initialism { - font-size: 90%; - text-transform: uppercase; -} - -blockquote { - padding: 10px 20px; - margin: 0 0 20px; - border-left: 5px solid #eeeeee; -} - -blockquote p { - font-size: 17.5px; - font-weight: 300; - line-height: 1.25; -} - -blockquote p:last-child { - margin-bottom: 0; -} - -blockquote small, -blockquote .small { - display: block; - line-height: 1.428571429; - color: #999999; -} - -blockquote small:before, -blockquote .small:before { - content: '\2014 \00A0'; -} - -blockquote.pull-right { - padding-right: 15px; - padding-left: 0; - border-right: 5px solid #eeeeee; - border-left: 0; -} - -blockquote.pull-right p, -blockquote.pull-right small, -blockquote.pull-right .small { - text-align: right; -} - -blockquote.pull-right small:before, -blockquote.pull-right .small:before { - content: ''; -} - -blockquote.pull-right small:after, -blockquote.pull-right .small:after { - content: '\00A0 \2014'; -} - -blockquote:before, -blockquote:after { - content: ""; -} - -address { - margin-bottom: 20px; - font-style: normal; - line-height: 1.428571429; -} - -code, -kbd, -pre, -samp { - font-family: Menlo, Monaco, Consolas, "Courier New", monospace; -} - -code { - padding: 2px 4px; - font-size: 90%; - color: #c7254e; - white-space: nowrap; - background-color: #f9f2f4; - border-radius: 4px; -} - -pre { - display: block; - padding: 9.5px; - margin: 0 0 10px; - font-size: 13px; - line-height: 1.428571429; - color: #333333; - word-break: break-all; - word-wrap: break-word; - background-color: #f5f5f5; - border: 1px solid #cccccc; - border-radius: 4px; -} - -pre code { - padding: 0; - font-size: inherit; - color: inherit; - white-space: pre-wrap; - background-color: transparent; - border-radius: 0; -} - -.pre-scrollable { - max-height: 340px; - overflow-y: scroll; -} - -.container { - padding-right: 15px; - padding-left: 15px; - margin-right: auto; - margin-left: auto; -} - -.container:before, -.container:after { - display: table; - content: " "; -} - -.container:after { - clear: both; -} - -.container:before, -.container:after { - display: table; - content: " "; -} - -.container:after { - clear: both; -} - -@media (min-width: 768px) { - .container { - width: 750px; - } -} - -@media (min-width: 992px) { - .container { - width: 970px; - } -} - -@media (min-width: 1200px) { - .container { - width: 1170px; - } -} - -.row { - margin-right: -15px; - margin-left: -15px; -} - -.row:before, -.row:after { - display: table; - content: " "; -} - -.row:after { - clear: both; -} - -.row:before, -.row:after { - display: table; - content: " "; -} - -.row:after { - clear: both; -} - -.col-xs-1, -.col-sm-1, -.col-md-1, -.col-lg-1, -.col-xs-2, -.col-sm-2, -.col-md-2, -.col-lg-2, -.col-xs-3, -.col-sm-3, -.col-md-3, -.col-lg-3, -.col-xs-4, -.col-sm-4, -.col-md-4, -.col-lg-4, -.col-xs-5, -.col-sm-5, -.col-md-5, -.col-lg-5, -.col-xs-6, -.col-sm-6, -.col-md-6, -.col-lg-6, -.col-xs-7, -.col-sm-7, -.col-md-7, -.col-lg-7, -.col-xs-8, -.col-sm-8, -.col-md-8, -.col-lg-8, -.col-xs-9, -.col-sm-9, -.col-md-9, -.col-lg-9, -.col-xs-10, -.col-sm-10, -.col-md-10, -.col-lg-10, -.col-xs-11, -.col-sm-11, -.col-md-11, -.col-lg-11, -.col-xs-12, -.col-sm-12, -.col-md-12, -.col-lg-12 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; -} - -.col-xs-1, -.col-xs-2, -.col-xs-3, -.col-xs-4, -.col-xs-5, -.col-xs-6, -.col-xs-7, -.col-xs-8, -.col-xs-9, -.col-xs-10, -.col-xs-11, -.col-xs-12 { - float: left; -} - -.col-xs-12 { - width: 100%; -} - -.col-xs-11 { - width: 91.66666666666666%; -} - -.col-xs-10 { - width: 83.33333333333334%; -} - -.col-xs-9 { - width: 75%; -} - -.col-xs-8 { - width: 66.66666666666666%; -} - -.col-xs-7 { - width: 58.333333333333336%; -} - -.col-xs-6 { - width: 50%; -} - -.col-xs-5 { - width: 41.66666666666667%; -} - -.col-xs-4 { - width: 33.33333333333333%; -} - -.col-xs-3 { - width: 25%; -} - -.col-xs-2 { - width: 16.666666666666664%; -} - -.col-xs-1 { - width: 8.333333333333332%; -} - -.col-xs-pull-12 { - right: 100%; -} - -.col-xs-pull-11 { - right: 91.66666666666666%; -} - -.col-xs-pull-10 { - right: 83.33333333333334%; -} - -.col-xs-pull-9 { - right: 75%; -} - -.col-xs-pull-8 { - right: 66.66666666666666%; -} - -.col-xs-pull-7 { - right: 58.333333333333336%; -} - -.col-xs-pull-6 { - right: 50%; -} - -.col-xs-pull-5 { - right: 41.66666666666667%; -} - -.col-xs-pull-4 { - right: 33.33333333333333%; -} - -.col-xs-pull-3 { - right: 25%; -} - -.col-xs-pull-2 { - right: 16.666666666666664%; -} - -.col-xs-pull-1 { - right: 8.333333333333332%; -} - -.col-xs-pull-0 { - right: 0; -} - -.col-xs-push-12 { - left: 100%; -} - -.col-xs-push-11 { - left: 91.66666666666666%; -} - -.col-xs-push-10 { - left: 83.33333333333334%; -} - -.col-xs-push-9 { - left: 75%; -} - -.col-xs-push-8 { - left: 66.66666666666666%; -} - -.col-xs-push-7 { - left: 58.333333333333336%; -} - -.col-xs-push-6 { - left: 50%; -} - -.col-xs-push-5 { - left: 41.66666666666667%; -} - -.col-xs-push-4 { - left: 33.33333333333333%; -} - -.col-xs-push-3 { - left: 25%; -} - -.col-xs-push-2 { - left: 16.666666666666664%; -} - -.col-xs-push-1 { - left: 8.333333333333332%; -} - -.col-xs-push-0 { - left: 0; -} - -.col-xs-offset-12 { - margin-left: 100%; -} - -.col-xs-offset-11 { - margin-left: 91.66666666666666%; -} - -.col-xs-offset-10 { - margin-left: 83.33333333333334%; -} - -.col-xs-offset-9 { - margin-left: 75%; -} - -.col-xs-offset-8 { - margin-left: 66.66666666666666%; -} - -.col-xs-offset-7 { - margin-left: 58.333333333333336%; -} - -.col-xs-offset-6 { - margin-left: 50%; -} - -.col-xs-offset-5 { - margin-left: 41.66666666666667%; -} - -.col-xs-offset-4 { - margin-left: 33.33333333333333%; -} - -.col-xs-offset-3 { - margin-left: 25%; -} - -.col-xs-offset-2 { - margin-left: 16.666666666666664%; -} - -.col-xs-offset-1 { - margin-left: 8.333333333333332%; -} - -.col-xs-offset-0 { - margin-left: 0; -} - -@media (min-width: 768px) { - .col-sm-1, - .col-sm-2, - .col-sm-3, - .col-sm-4, - .col-sm-5, - .col-sm-6, - .col-sm-7, - .col-sm-8, - .col-sm-9, - .col-sm-10, - .col-sm-11, - .col-sm-12 { - float: left; - } - .col-sm-12 { - width: 100%; - } - .col-sm-11 { - width: 91.66666666666666%; - } - .col-sm-10 { - width: 83.33333333333334%; - } - .col-sm-9 { - width: 75%; - } - .col-sm-8 { - width: 66.66666666666666%; - } - .col-sm-7 { - width: 58.333333333333336%; - } - .col-sm-6 { - width: 50%; - } - .col-sm-5 { - width: 41.66666666666667%; - } - .col-sm-4 { - width: 33.33333333333333%; - } - .col-sm-3 { - width: 25%; - } - .col-sm-2 { - width: 16.666666666666664%; - } - .col-sm-1 { - width: 8.333333333333332%; - } - .col-sm-pull-12 { - right: 100%; - } - .col-sm-pull-11 { - right: 91.66666666666666%; - } - .col-sm-pull-10 { - right: 83.33333333333334%; - } - .col-sm-pull-9 { - right: 75%; - } - .col-sm-pull-8 { - right: 66.66666666666666%; - } - .col-sm-pull-7 { - right: 58.333333333333336%; - } - .col-sm-pull-6 { - right: 50%; - } - .col-sm-pull-5 { - right: 41.66666666666667%; - } - .col-sm-pull-4 { - right: 33.33333333333333%; - } - .col-sm-pull-3 { - right: 25%; - } - .col-sm-pull-2 { - right: 16.666666666666664%; - } - .col-sm-pull-1 { - right: 8.333333333333332%; - } - .col-sm-pull-0 { - right: 0; - } - .col-sm-push-12 { - left: 100%; - } - .col-sm-push-11 { - left: 91.66666666666666%; - } - .col-sm-push-10 { - left: 83.33333333333334%; - } - .col-sm-push-9 { - left: 75%; - } - .col-sm-push-8 { - left: 66.66666666666666%; - } - .col-sm-push-7 { - left: 58.333333333333336%; - } - .col-sm-push-6 { - left: 50%; - } - .col-sm-push-5 { - left: 41.66666666666667%; - } - .col-sm-push-4 { - left: 33.33333333333333%; - } - .col-sm-push-3 { - left: 25%; - } - .col-sm-push-2 { - left: 16.666666666666664%; - } - .col-sm-push-1 { - left: 8.333333333333332%; - } - .col-sm-push-0 { - left: 0; - } - .col-sm-offset-12 { - margin-left: 100%; - } - .col-sm-offset-11 { - margin-left: 91.66666666666666%; - } - .col-sm-offset-10 { - margin-left: 83.33333333333334%; - } - .col-sm-offset-9 { - margin-left: 75%; - } - .col-sm-offset-8 { - margin-left: 66.66666666666666%; - } - .col-sm-offset-7 { - margin-left: 58.333333333333336%; - } - .col-sm-offset-6 { - margin-left: 50%; - } - .col-sm-offset-5 { - margin-left: 41.66666666666667%; - } - .col-sm-offset-4 { - margin-left: 33.33333333333333%; - } - .col-sm-offset-3 { - margin-left: 25%; - } - .col-sm-offset-2 { - margin-left: 16.666666666666664%; - } - .col-sm-offset-1 { - margin-left: 8.333333333333332%; - } - .col-sm-offset-0 { - margin-left: 0; - } -} - -@media (min-width: 992px) { - .col-md-1, - .col-md-2, - .col-md-3, - .col-md-4, - .col-md-5, - .col-md-6, - .col-md-7, - .col-md-8, - .col-md-9, - .col-md-10, - .col-md-11, - .col-md-12 { - float: left; - } - .col-md-12 { - width: 100%; - } - .col-md-11 { - width: 91.66666666666666%; - } - .col-md-10 { - width: 83.33333333333334%; - } - .col-md-9 { - width: 75%; - } - .col-md-8 { - width: 66.66666666666666%; - } - .col-md-7 { - width: 58.333333333333336%; - } - .col-md-6 { - width: 50%; - } - .col-md-5 { - width: 41.66666666666667%; - } - .col-md-4 { - width: 33.33333333333333%; - } - .col-md-3 { - width: 25%; - } - .col-md-2 { - width: 16.666666666666664%; - } - .col-md-1 { - width: 8.333333333333332%; - } - .col-md-pull-12 { - right: 100%; - } - .col-md-pull-11 { - right: 91.66666666666666%; - } - .col-md-pull-10 { - right: 83.33333333333334%; - } - .col-md-pull-9 { - right: 75%; - } - .col-md-pull-8 { - right: 66.66666666666666%; - } - .col-md-pull-7 { - right: 58.333333333333336%; - } - .col-md-pull-6 { - right: 50%; - } - .col-md-pull-5 { - right: 41.66666666666667%; - } - .col-md-pull-4 { - right: 33.33333333333333%; - } - .col-md-pull-3 { - right: 25%; - } - .col-md-pull-2 { - right: 16.666666666666664%; - } - .col-md-pull-1 { - right: 8.333333333333332%; - } - .col-md-pull-0 { - right: 0; - } - .col-md-push-12 { - left: 100%; - } - .col-md-push-11 { - left: 91.66666666666666%; - } - .col-md-push-10 { - left: 83.33333333333334%; - } - .col-md-push-9 { - left: 75%; - } - .col-md-push-8 { - left: 66.66666666666666%; - } - .col-md-push-7 { - left: 58.333333333333336%; - } - .col-md-push-6 { - left: 50%; - } - .col-md-push-5 { - left: 41.66666666666667%; - } - .col-md-push-4 { - left: 33.33333333333333%; - } - .col-md-push-3 { - left: 25%; - } - .col-md-push-2 { - left: 16.666666666666664%; - } - .col-md-push-1 { - left: 8.333333333333332%; - } - .col-md-push-0 { - left: 0; - } - .col-md-offset-12 { - margin-left: 100%; - } - .col-md-offset-11 { - margin-left: 91.66666666666666%; - } - .col-md-offset-10 { - margin-left: 83.33333333333334%; - } - .col-md-offset-9 { - margin-left: 75%; - } - .col-md-offset-8 { - margin-left: 66.66666666666666%; - } - .col-md-offset-7 { - margin-left: 58.333333333333336%; - } - .col-md-offset-6 { - margin-left: 50%; - } - .col-md-offset-5 { - margin-left: 41.66666666666667%; - } - .col-md-offset-4 { - margin-left: 33.33333333333333%; - } - .col-md-offset-3 { - margin-left: 25%; - } - .col-md-offset-2 { - margin-left: 16.666666666666664%; - } - .col-md-offset-1 { - margin-left: 8.333333333333332%; - } - .col-md-offset-0 { - margin-left: 0; - } -} - -@media (min-width: 1200px) { - .col-lg-1, - .col-lg-2, - .col-lg-3, - .col-lg-4, - .col-lg-5, - .col-lg-6, - .col-lg-7, - .col-lg-8, - .col-lg-9, - .col-lg-10, - .col-lg-11, - .col-lg-12 { - float: left; - } - .col-lg-12 { - width: 100%; - } - .col-lg-11 { - width: 91.66666666666666%; - } - .col-lg-10 { - width: 83.33333333333334%; - } - .col-lg-9 { - width: 75%; - } - .col-lg-8 { - width: 66.66666666666666%; - } - .col-lg-7 { - width: 58.333333333333336%; - } - .col-lg-6 { - width: 50%; - } - .col-lg-5 { - width: 41.66666666666667%; - } - .col-lg-4 { - width: 33.33333333333333%; - } - .col-lg-3 { - width: 25%; - } - .col-lg-2 { - width: 16.666666666666664%; - } - .col-lg-1 { - width: 8.333333333333332%; - } - .col-lg-pull-12 { - right: 100%; - } - .col-lg-pull-11 { - right: 91.66666666666666%; - } - .col-lg-pull-10 { - right: 83.33333333333334%; - } - .col-lg-pull-9 { - right: 75%; - } - .col-lg-pull-8 { - right: 66.66666666666666%; - } - .col-lg-pull-7 { - right: 58.333333333333336%; - } - .col-lg-pull-6 { - right: 50%; - } - .col-lg-pull-5 { - right: 41.66666666666667%; - } - .col-lg-pull-4 { - right: 33.33333333333333%; - } - .col-lg-pull-3 { - right: 25%; - } - .col-lg-pull-2 { - right: 16.666666666666664%; - } - .col-lg-pull-1 { - right: 8.333333333333332%; - } - .col-lg-pull-0 { - right: 0; - } - .col-lg-push-12 { - left: 100%; - } - .col-lg-push-11 { - left: 91.66666666666666%; - } - .col-lg-push-10 { - left: 83.33333333333334%; - } - .col-lg-push-9 { - left: 75%; - } - .col-lg-push-8 { - left: 66.66666666666666%; - } - .col-lg-push-7 { - left: 58.333333333333336%; - } - .col-lg-push-6 { - left: 50%; - } - .col-lg-push-5 { - left: 41.66666666666667%; - } - .col-lg-push-4 { - left: 33.33333333333333%; - } - .col-lg-push-3 { - left: 25%; - } - .col-lg-push-2 { - left: 16.666666666666664%; - } - .col-lg-push-1 { - left: 8.333333333333332%; - } - .col-lg-push-0 { - left: 0; - } - .col-lg-offset-12 { - margin-left: 100%; - } - .col-lg-offset-11 { - margin-left: 91.66666666666666%; - } - .col-lg-offset-10 { - margin-left: 83.33333333333334%; - } - .col-lg-offset-9 { - margin-left: 75%; - } - .col-lg-offset-8 { - margin-left: 66.66666666666666%; - } - .col-lg-offset-7 { - margin-left: 58.333333333333336%; - } - .col-lg-offset-6 { - margin-left: 50%; - } - .col-lg-offset-5 { - margin-left: 41.66666666666667%; - } - .col-lg-offset-4 { - margin-left: 33.33333333333333%; - } - .col-lg-offset-3 { - margin-left: 25%; - } - .col-lg-offset-2 { - margin-left: 16.666666666666664%; - } - .col-lg-offset-1 { - margin-left: 8.333333333333332%; - } - .col-lg-offset-0 { - margin-left: 0; - } -} - -table { - max-width: 100%; - background-color: transparent; -} - -th { - text-align: left; -} - -.table { - width: 100%; - margin-bottom: 20px; -} - -.table > thead > tr > th, -.table > tbody > tr > th, -.table > tfoot > tr > th, -.table > thead > tr > td, -.table > tbody > tr > td, -.table > tfoot > tr > td { - padding: 8px; - line-height: 1.428571429; - vertical-align: top; - border-top: 1px solid #dddddd; -} - -.table > thead > tr > th { - vertical-align: bottom; - border-bottom: 2px solid #dddddd; -} - -.table > caption + thead > tr:first-child > th, -.table > colgroup + thead > tr:first-child > th, -.table > thead:first-child > tr:first-child > th, -.table > caption + thead > tr:first-child > td, -.table > colgroup + thead > tr:first-child > td, -.table > thead:first-child > tr:first-child > td { - border-top: 0; -} - -.table > tbody + tbody { - border-top: 2px solid #dddddd; -} - -.table .table { - background-color: #ffffff; -} - -.table-condensed > thead > tr > th, -.table-condensed > tbody > tr > th, -.table-condensed > tfoot > tr > th, -.table-condensed > thead > tr > td, -.table-condensed > tbody > tr > td, -.table-condensed > tfoot > tr > td { - padding: 5px; -} - -.table-bordered { - border: 1px solid #dddddd; -} - -.table-bordered > thead > tr > th, -.table-bordered > tbody > tr > th, -.table-bordered > tfoot > tr > th, -.table-bordered > thead > tr > td, -.table-bordered > tbody > tr > td, -.table-bordered > tfoot > tr > td { - border: 1px solid #dddddd; -} - -.table-bordered > thead > tr > th, -.table-bordered > thead > tr > td { - border-bottom-width: 2px; -} - -.table-striped > tbody > tr:nth-child(odd) > td, -.table-striped > tbody > tr:nth-child(odd) > th { - background-color: #f9f9f9; -} - -.table-hover > tbody > tr:hover > td, -.table-hover > tbody > tr:hover > th { - background-color: #f5f5f5; -} - -table col[class*="col-"] { - position: static; - display: table-column; - float: none; -} - -table td[class*="col-"], -table th[class*="col-"] { - display: table-cell; - float: none; -} - -.table > thead > tr > .active, -.table > tbody > tr > .active, -.table > tfoot > tr > .active, -.table > thead > .active > td, -.table > tbody > .active > td, -.table > tfoot > .active > td, -.table > thead > .active > th, -.table > tbody > .active > th, -.table > tfoot > .active > th { - background-color: #f5f5f5; -} - -.table-hover > tbody > tr > .active:hover, -.table-hover > tbody > .active:hover > td, -.table-hover > tbody > .active:hover > th { - background-color: #e8e8e8; -} - -.table > thead > tr > .success, -.table > tbody > tr > .success, -.table > tfoot > tr > .success, -.table > thead > .success > td, -.table > tbody > .success > td, -.table > tfoot > .success > td, -.table > thead > .success > th, -.table > tbody > .success > th, -.table > tfoot > .success > th { - background-color: #dff0d8; -} - -.table-hover > tbody > tr > .success:hover, -.table-hover > tbody > .success:hover > td, -.table-hover > tbody > .success:hover > th { - background-color: #d0e9c6; -} - -.table > thead > tr > .danger, -.table > tbody > tr > .danger, -.table > tfoot > tr > .danger, -.table > thead > .danger > td, -.table > tbody > .danger > td, -.table > tfoot > .danger > td, -.table > thead > .danger > th, -.table > tbody > .danger > th, -.table > tfoot > .danger > th { - background-color: #f2dede; -} - -.table-hover > tbody > tr > .danger:hover, -.table-hover > tbody > .danger:hover > td, -.table-hover > tbody > .danger:hover > th { - background-color: #ebcccc; -} - -.table > thead > tr > .warning, -.table > tbody > tr > .warning, -.table > tfoot > tr > .warning, -.table > thead > .warning > td, -.table > tbody > .warning > td, -.table > tfoot > .warning > td, -.table > thead > .warning > th, -.table > tbody > .warning > th, -.table > tfoot > .warning > th { - background-color: #fcf8e3; -} - -.table-hover > tbody > tr > .warning:hover, -.table-hover > tbody > .warning:hover > td, -.table-hover > tbody > .warning:hover > th { - background-color: #faf2cc; -} - -@media (max-width: 767px) { - .table-responsive { - width: 100%; - margin-bottom: 15px; - overflow-x: scroll; - overflow-y: hidden; - border: 1px solid #dddddd; - -ms-overflow-style: -ms-autohiding-scrollbar; - -webkit-overflow-scrolling: touch; - } - .table-responsive > .table { - margin-bottom: 0; - } - .table-responsive > .table > thead > tr > th, - .table-responsive > .table > tbody > tr > th, - .table-responsive > .table > tfoot > tr > th, - .table-responsive > .table > thead > tr > td, - .table-responsive > .table > tbody > tr > td, - .table-responsive > .table > tfoot > tr > td { - white-space: nowrap; - } - .table-responsive > .table-bordered { - border: 0; - } - .table-responsive > .table-bordered > thead > tr > th:first-child, - .table-responsive > .table-bordered > tbody > tr > th:first-child, - .table-responsive > .table-bordered > tfoot > tr > th:first-child, - .table-responsive > .table-bordered > thead > tr > td:first-child, - .table-responsive > .table-bordered > tbody > tr > td:first-child, - .table-responsive > .table-bordered > tfoot > tr > td:first-child { - border-left: 0; - } - .table-responsive > .table-bordered > thead > tr > th:last-child, - .table-responsive > .table-bordered > tbody > tr > th:last-child, - .table-responsive > .table-bordered > tfoot > tr > th:last-child, - .table-responsive > .table-bordered > thead > tr > td:last-child, - .table-responsive > .table-bordered > tbody > tr > td:last-child, - .table-responsive > .table-bordered > tfoot > tr > td:last-child { - border-right: 0; - } - .table-responsive > .table-bordered > tbody > tr:last-child > th, - .table-responsive > .table-bordered > tfoot > tr:last-child > th, - .table-responsive > .table-bordered > tbody > tr:last-child > td, - .table-responsive > .table-bordered > tfoot > tr:last-child > td { - border-bottom: 0; - } -} - -fieldset { - padding: 0; - margin: 0; - border: 0; -} - -legend { - display: block; - width: 100%; - padding: 0; - margin-bottom: 20px; - font-size: 21px; - line-height: inherit; - color: #333333; - border: 0; - border-bottom: 1px solid #e5e5e5; -} - -label { - display: inline-block; - margin-bottom: 5px; - font-weight: bold; -} - -input[type="search"] { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -input[type="radio"], -input[type="checkbox"] { - margin: 4px 0 0; - margin-top: 1px \9; - /* IE8-9 */ - - line-height: normal; -} - -input[type="file"] { - display: block; -} - -select[multiple], -select[size] { - height: auto; -} - -select optgroup { - font-family: inherit; - font-size: inherit; - font-style: inherit; -} - -input[type="file"]:focus, -input[type="radio"]:focus, -input[type="checkbox"]:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -input[type="number"]::-webkit-outer-spin-button, -input[type="number"]::-webkit-inner-spin-button { - height: auto; -} - -output { - display: block; - padding-top: 7px; - font-size: 14px; - line-height: 1.428571429; - color: #555555; - vertical-align: middle; -} - -.form-control { - display: block; - width: 100%; - height: 34px; - padding: 6px 12px; - font-size: 14px; - line-height: 1.428571429; - color: #555555; - vertical-align: middle; - background-color: #ffffff; - background-image: none; - border: 1px solid #cccccc; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; - transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; -} - -.form-control:focus { - border-color: #66afe9; - outline: 0; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); -} - -.form-control:-moz-placeholder { - color: #999999; -} - -.form-control::-moz-placeholder { - color: #999999; - opacity: 1; -} - -.form-control:-ms-input-placeholder { - color: #999999; -} - -.form-control::-webkit-input-placeholder { - color: #999999; -} - -.form-control[disabled], -.form-control[readonly], -fieldset[disabled] .form-control { - cursor: not-allowed; - background-color: #eeeeee; -} - -textarea.form-control { - height: auto; -} - -.form-group { - margin-bottom: 15px; -} - -.radio, -.checkbox { - display: block; - min-height: 20px; - padding-left: 20px; - margin-top: 10px; - margin-bottom: 10px; - vertical-align: middle; -} - -.radio label, -.checkbox label { - display: inline; - margin-bottom: 0; - font-weight: normal; - cursor: pointer; -} - -.radio input[type="radio"], -.radio-inline input[type="radio"], -.checkbox input[type="checkbox"], -.checkbox-inline input[type="checkbox"] { - float: left; - margin-left: -20px; -} - -.radio + .radio, -.checkbox + .checkbox { - margin-top: -5px; -} - -.radio-inline, -.checkbox-inline { - display: inline-block; - padding-left: 20px; - margin-bottom: 0; - font-weight: normal; - vertical-align: middle; - cursor: pointer; -} - -.radio-inline + .radio-inline, -.checkbox-inline + .checkbox-inline { - margin-top: 0; - margin-left: 10px; -} - -input[type="radio"][disabled], -input[type="checkbox"][disabled], -.radio[disabled], -.radio-inline[disabled], -.checkbox[disabled], -.checkbox-inline[disabled], -fieldset[disabled] input[type="radio"], -fieldset[disabled] input[type="checkbox"], -fieldset[disabled] .radio, -fieldset[disabled] .radio-inline, -fieldset[disabled] .checkbox, -fieldset[disabled] .checkbox-inline { - cursor: not-allowed; -} - -.input-sm { - height: 30px; - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} - -select.input-sm { - height: 30px; - line-height: 30px; -} - -textarea.input-sm { - height: auto; -} - -.input-lg { - height: 46px; - padding: 10px 16px; - font-size: 18px; - line-height: 1.33; - border-radius: 6px; -} - -select.input-lg { - height: 46px; - line-height: 46px; -} - -textarea.input-lg { - height: auto; -} - -.has-warning .help-block, -.has-warning .control-label, -.has-warning .radio, -.has-warning .checkbox, -.has-warning .radio-inline, -.has-warning .checkbox-inline { - color: #8a6d3b; -} - -.has-warning .form-control { - border-color: #8a6d3b; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.has-warning .form-control:focus { - border-color: #66512c; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; -} - -.has-warning .input-group-addon { - color: #8a6d3b; - background-color: #fcf8e3; - border-color: #8a6d3b; -} - -.has-error .help-block, -.has-error .control-label, -.has-error .radio, -.has-error .checkbox, -.has-error .radio-inline, -.has-error .checkbox-inline { - color: #a94442; -} - -.has-error .form-control { - border-color: #a94442; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.has-error .form-control:focus { - border-color: #843534; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; -} - -.has-error .input-group-addon { - color: #a94442; - background-color: #f2dede; - border-color: #a94442; -} - -.has-success .help-block, -.has-success .control-label, -.has-success .radio, -.has-success .checkbox, -.has-success .radio-inline, -.has-success .checkbox-inline { - color: #3c763d; -} - -.has-success .form-control { - border-color: #3c763d; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.has-success .form-control:focus { - border-color: #2b542c; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; -} - -.has-success .input-group-addon { - color: #3c763d; - background-color: #dff0d8; - border-color: #3c763d; -} - -.form-control-static { - margin-bottom: 0; -} - -.help-block { - display: block; - margin-top: 5px; - margin-bottom: 10px; - color: #737373; -} - -@media (min-width: 768px) { - .form-inline .form-group { - display: inline-block; - margin-bottom: 0; - vertical-align: middle; - } - .form-inline .form-control { - display: inline-block; - } - .form-inline select.form-control { - width: auto; - } - .form-inline .radio, - .form-inline .checkbox { - display: inline-block; - padding-left: 0; - margin-top: 0; - margin-bottom: 0; - } - .form-inline .radio input[type="radio"], - .form-inline .checkbox input[type="checkbox"] { - float: none; - margin-left: 0; - } -} - -.form-horizontal .control-label, -.form-horizontal .radio, -.form-horizontal .checkbox, -.form-horizontal .radio-inline, -.form-horizontal .checkbox-inline { - padding-top: 7px; - margin-top: 0; - margin-bottom: 0; -} - -.form-horizontal .radio, -.form-horizontal .checkbox { - min-height: 27px; -} - -.form-horizontal .form-group { - margin-right: -15px; - margin-left: -15px; -} - -.form-horizontal .form-group:before, -.form-horizontal .form-group:after { - display: table; - content: " "; -} - -.form-horizontal .form-group:after { - clear: both; -} - -.form-horizontal .form-group:before, -.form-horizontal .form-group:after { - display: table; - content: " "; -} - -.form-horizontal .form-group:after { - clear: both; -} - -.form-horizontal .form-control-static { - padding-top: 7px; -} - -@media (min-width: 768px) { - .form-horizontal .control-label { - text-align: right; - } -} - -.btn { - display: inline-block; - padding: 6px 12px; - margin-bottom: 0; - font-size: 14px; - font-weight: normal; - line-height: 1.428571429; - text-align: center; - white-space: nowrap; - vertical-align: middle; - cursor: pointer; - background-image: none; - border: 1px solid transparent; - border-radius: 4px; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - -o-user-select: none; - user-select: none; -} - -.btn:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -.btn:hover, -.btn:focus { - color: #333333; - text-decoration: none; -} - -.btn:active, -.btn.active { - background-image: none; - outline: 0; - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); -} - -.btn.disabled, -.btn[disabled], -fieldset[disabled] .btn { - pointer-events: none; - cursor: not-allowed; - opacity: 0.65; - filter: alpha(opacity=65); - -webkit-box-shadow: none; - box-shadow: none; -} - -.btn-default { - color: #333333; - background-color: #ffffff; - border-color: #cccccc; -} - -.btn-default:hover, -.btn-default:focus, -.btn-default:active, -.btn-default.active, -.open .dropdown-toggle.btn-default { - color: #333333; - background-color: #ebebeb; - border-color: #adadad; -} - -.btn-default:active, -.btn-default.active, -.open .dropdown-toggle.btn-default { - background-image: none; -} - -.btn-default.disabled, -.btn-default[disabled], -fieldset[disabled] .btn-default, -.btn-default.disabled:hover, -.btn-default[disabled]:hover, -fieldset[disabled] .btn-default:hover, -.btn-default.disabled:focus, -.btn-default[disabled]:focus, -fieldset[disabled] .btn-default:focus, -.btn-default.disabled:active, -.btn-default[disabled]:active, -fieldset[disabled] .btn-default:active, -.btn-default.disabled.active, -.btn-default[disabled].active, -fieldset[disabled] .btn-default.active { - background-color: #ffffff; - border-color: #cccccc; -} - -.btn-default .badge { - color: #ffffff; - background-color: #fff; -} - -.btn-primary { - color: #ffffff; - background-color: #428bca; - border-color: #357ebd; -} - -.btn-primary:hover, -.btn-primary:focus, -.btn-primary:active, -.btn-primary.active, -.open .dropdown-toggle.btn-primary { - color: #ffffff; - background-color: #3276b1; - border-color: #285e8e; -} - -.btn-primary:active, -.btn-primary.active, -.open .dropdown-toggle.btn-primary { - background-image: none; -} - -.btn-primary.disabled, -.btn-primary[disabled], -fieldset[disabled] .btn-primary, -.btn-primary.disabled:hover, -.btn-primary[disabled]:hover, -fieldset[disabled] .btn-primary:hover, -.btn-primary.disabled:focus, -.btn-primary[disabled]:focus, -fieldset[disabled] .btn-primary:focus, -.btn-primary.disabled:active, -.btn-primary[disabled]:active, -fieldset[disabled] .btn-primary:active, -.btn-primary.disabled.active, -.btn-primary[disabled].active, -fieldset[disabled] .btn-primary.active { - background-color: #428bca; - border-color: #357ebd; -} - -.btn-primary .badge { - color: #428bca; - background-color: #fff; -} - -.btn-warning { - color: #ffffff; - background-color: #f0ad4e; - border-color: #eea236; -} - -.btn-warning:hover, -.btn-warning:focus, -.btn-warning:active, -.btn-warning.active, -.open .dropdown-toggle.btn-warning { - color: #ffffff; - background-color: #ed9c28; - border-color: #d58512; -} - -.btn-warning:active, -.btn-warning.active, -.open .dropdown-toggle.btn-warning { - background-image: none; -} - -.btn-warning.disabled, -.btn-warning[disabled], -fieldset[disabled] .btn-warning, -.btn-warning.disabled:hover, -.btn-warning[disabled]:hover, -fieldset[disabled] .btn-warning:hover, -.btn-warning.disabled:focus, -.btn-warning[disabled]:focus, -fieldset[disabled] .btn-warning:focus, -.btn-warning.disabled:active, -.btn-warning[disabled]:active, -fieldset[disabled] .btn-warning:active, -.btn-warning.disabled.active, -.btn-warning[disabled].active, -fieldset[disabled] .btn-warning.active { - background-color: #f0ad4e; - border-color: #eea236; -} - -.btn-warning .badge { - color: #f0ad4e; - background-color: #fff; -} - -.btn-danger { - color: #ffffff; - background-color: #d9534f; - border-color: #d43f3a; -} - -.btn-danger:hover, -.btn-danger:focus, -.btn-danger:active, -.btn-danger.active, -.open .dropdown-toggle.btn-danger { - color: #ffffff; - background-color: #d2322d; - border-color: #ac2925; -} - -.btn-danger:active, -.btn-danger.active, -.open .dropdown-toggle.btn-danger { - background-image: none; -} - -.btn-danger.disabled, -.btn-danger[disabled], -fieldset[disabled] .btn-danger, -.btn-danger.disabled:hover, -.btn-danger[disabled]:hover, -fieldset[disabled] .btn-danger:hover, -.btn-danger.disabled:focus, -.btn-danger[disabled]:focus, -fieldset[disabled] .btn-danger:focus, -.btn-danger.disabled:active, -.btn-danger[disabled]:active, -fieldset[disabled] .btn-danger:active, -.btn-danger.disabled.active, -.btn-danger[disabled].active, -fieldset[disabled] .btn-danger.active { - background-color: #d9534f; - border-color: #d43f3a; -} - -.btn-danger .badge { - color: #d9534f; - background-color: #fff; -} - -.btn-success { - color: #ffffff; - background-color: #5cb85c; - border-color: #4cae4c; -} - -.btn-success:hover, -.btn-success:focus, -.btn-success:active, -.btn-success.active, -.open .dropdown-toggle.btn-success { - color: #ffffff; - background-color: #47a447; - border-color: #398439; -} - -.btn-success:active, -.btn-success.active, -.open .dropdown-toggle.btn-success { - background-image: none; -} - -.btn-success.disabled, -.btn-success[disabled], -fieldset[disabled] .btn-success, -.btn-success.disabled:hover, -.btn-success[disabled]:hover, -fieldset[disabled] .btn-success:hover, -.btn-success.disabled:focus, -.btn-success[disabled]:focus, -fieldset[disabled] .btn-success:focus, -.btn-success.disabled:active, -.btn-success[disabled]:active, -fieldset[disabled] .btn-success:active, -.btn-success.disabled.active, -.btn-success[disabled].active, -fieldset[disabled] .btn-success.active { - background-color: #5cb85c; - border-color: #4cae4c; -} - -.btn-success .badge { - color: #5cb85c; - background-color: #fff; -} - -.btn-info { - color: #ffffff; - background-color: #5bc0de; - border-color: #46b8da; -} - -.btn-info:hover, -.btn-info:focus, -.btn-info:active, -.btn-info.active, -.open .dropdown-toggle.btn-info { - color: #ffffff; - background-color: #39b3d7; - border-color: #269abc; -} - -.btn-info:active, -.btn-info.active, -.open .dropdown-toggle.btn-info { - background-image: none; -} - -.btn-info.disabled, -.btn-info[disabled], -fieldset[disabled] .btn-info, -.btn-info.disabled:hover, -.btn-info[disabled]:hover, -fieldset[disabled] .btn-info:hover, -.btn-info.disabled:focus, -.btn-info[disabled]:focus, -fieldset[disabled] .btn-info:focus, -.btn-info.disabled:active, -.btn-info[disabled]:active, -fieldset[disabled] .btn-info:active, -.btn-info.disabled.active, -.btn-info[disabled].active, -fieldset[disabled] .btn-info.active { - background-color: #5bc0de; - border-color: #46b8da; -} - -.btn-info .badge { - color: #5bc0de; - background-color: #fff; -} - -.btn-link { - font-weight: normal; - color: #428bca; - cursor: pointer; - border-radius: 0; -} - -.btn-link, -.btn-link:active, -.btn-link[disabled], -fieldset[disabled] .btn-link { - background-color: transparent; - -webkit-box-shadow: none; - box-shadow: none; -} - -.btn-link, -.btn-link:hover, -.btn-link:focus, -.btn-link:active { - border-color: transparent; -} - -.btn-link:hover, -.btn-link:focus { - color: #2a6496; - text-decoration: underline; - background-color: transparent; -} - -.btn-link[disabled]:hover, -fieldset[disabled] .btn-link:hover, -.btn-link[disabled]:focus, -fieldset[disabled] .btn-link:focus { - color: #999999; - text-decoration: none; -} - -.btn-lg { - padding: 10px 16px; - font-size: 18px; - line-height: 1.33; - border-radius: 6px; -} - -.btn-sm { - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} - -.btn-xs { - padding: 1px 5px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} - -.btn-block { - display: block; - width: 100%; - padding-right: 0; - padding-left: 0; -} - -.btn-block + .btn-block { - margin-top: 5px; -} - -input[type="submit"].btn-block, -input[type="reset"].btn-block, -input[type="button"].btn-block { - width: 100%; -} - -.fade { - opacity: 0; - -webkit-transition: opacity 0.15s linear; - transition: opacity 0.15s linear; -} - -.fade.in { - opacity: 1; -} - -.collapse { - display: none; -} - -.collapse.in { - display: block; -} - -.collapsing { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition: height 0.35s ease; - transition: height 0.35s ease; -} - -@font-face { - font-family: 'Glyphicons Halflings'; - src: url('../fonts/glyphicons-halflings-regular.eot'); - src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular') format('svg'); -} - -.glyphicon { - position: relative; - top: 1px; - display: inline-block; - font-family: 'Glyphicons Halflings'; - -webkit-font-smoothing: antialiased; - font-style: normal; - font-weight: normal; - line-height: 1; - -moz-osx-font-smoothing: grayscale; -} - -.glyphicon:empty { - width: 1em; -} - -.glyphicon-asterisk:before { - content: "\2a"; -} - -.glyphicon-plus:before { - content: "\2b"; -} - -.glyphicon-euro:before { - content: "\20ac"; -} - -.glyphicon-minus:before { - content: "\2212"; -} - -.glyphicon-cloud:before { - content: "\2601"; -} - -.glyphicon-envelope:before { - content: "\2709"; -} - -.glyphicon-pencil:before { - content: "\270f"; -} - -.glyphicon-glass:before { - content: "\e001"; -} - -.glyphicon-music:before { - content: "\e002"; -} - -.glyphicon-search:before { - content: "\e003"; -} - -.glyphicon-heart:before { - content: "\e005"; -} - -.glyphicon-star:before { - content: "\e006"; -} - -.glyphicon-star-empty:before { - content: "\e007"; -} - -.glyphicon-user:before { - content: "\e008"; -} - -.glyphicon-film:before { - content: "\e009"; -} - -.glyphicon-th-large:before { - content: "\e010"; -} - -.glyphicon-th:before { - content: "\e011"; -} - -.glyphicon-th-list:before { - content: "\e012"; -} - -.glyphicon-ok:before { - content: "\e013"; -} - -.glyphicon-remove:before { - content: "\e014"; -} - -.glyphicon-zoom-in:before { - content: "\e015"; -} - -.glyphicon-zoom-out:before { - content: "\e016"; -} - -.glyphicon-off:before { - content: "\e017"; -} - -.glyphicon-signal:before { - content: "\e018"; -} - -.glyphicon-cog:before { - content: "\e019"; -} - -.glyphicon-trash:before { - content: "\e020"; -} - -.glyphicon-home:before { - content: "\e021"; -} - -.glyphicon-file:before { - content: "\e022"; -} - -.glyphicon-time:before { - content: "\e023"; -} - -.glyphicon-road:before { - content: "\e024"; -} - -.glyphicon-download-alt:before { - content: "\e025"; -} - -.glyphicon-download:before { - content: "\e026"; -} - -.glyphicon-upload:before { - content: "\e027"; -} - -.glyphicon-inbox:before { - content: "\e028"; -} - -.glyphicon-play-circle:before { - content: "\e029"; -} - -.glyphicon-repeat:before { - content: "\e030"; -} - -.glyphicon-refresh:before { - content: "\e031"; -} - -.glyphicon-list-alt:before { - content: "\e032"; -} - -.glyphicon-lock:before { - content: "\e033"; -} - -.glyphicon-flag:before { - content: "\e034"; -} - -.glyphicon-headphones:before { - content: "\e035"; -} - -.glyphicon-volume-off:before { - content: "\e036"; -} - -.glyphicon-volume-down:before { - content: "\e037"; -} - -.glyphicon-volume-up:before { - content: "\e038"; -} - -.glyphicon-qrcode:before { - content: "\e039"; -} - -.glyphicon-barcode:before { - content: "\e040"; -} - -.glyphicon-tag:before { - content: "\e041"; -} - -.glyphicon-tags:before { - content: "\e042"; -} - -.glyphicon-book:before { - content: "\e043"; -} - -.glyphicon-bookmark:before { - content: "\e044"; -} - -.glyphicon-print:before { - content: "\e045"; -} - -.glyphicon-camera:before { - content: "\e046"; -} - -.glyphicon-font:before { - content: "\e047"; -} - -.glyphicon-bold:before { - content: "\e048"; -} - -.glyphicon-italic:before { - content: "\e049"; -} - -.glyphicon-text-height:before { - content: "\e050"; -} - -.glyphicon-text-width:before { - content: "\e051"; -} - -.glyphicon-align-left:before { - content: "\e052"; -} - -.glyphicon-align-center:before { - content: "\e053"; -} - -.glyphicon-align-right:before { - content: "\e054"; -} - -.glyphicon-align-justify:before { - content: "\e055"; -} - -.glyphicon-list:before { - content: "\e056"; -} - -.glyphicon-indent-left:before { - content: "\e057"; -} - -.glyphicon-indent-right:before { - content: "\e058"; -} - -.glyphicon-facetime-video:before { - content: "\e059"; -} - -.glyphicon-picture:before { - content: "\e060"; -} - -.glyphicon-map-marker:before { - content: "\e062"; -} - -.glyphicon-adjust:before { - content: "\e063"; -} - -.glyphicon-tint:before { - content: "\e064"; -} - -.glyphicon-edit:before { - content: "\e065"; -} - -.glyphicon-share:before { - content: "\e066"; -} - -.glyphicon-check:before { - content: "\e067"; -} - -.glyphicon-move:before { - content: "\e068"; -} - -.glyphicon-step-backward:before { - content: "\e069"; -} - -.glyphicon-fast-backward:before { - content: "\e070"; -} - -.glyphicon-backward:before { - content: "\e071"; -} - -.glyphicon-play:before { - content: "\e072"; -} - -.glyphicon-pause:before { - content: "\e073"; -} - -.glyphicon-stop:before { - content: "\e074"; -} - -.glyphicon-forward:before { - content: "\e075"; -} - -.glyphicon-fast-forward:before { - content: "\e076"; -} - -.glyphicon-step-forward:before { - content: "\e077"; -} - -.glyphicon-eject:before { - content: "\e078"; -} - -.glyphicon-chevron-left:before { - content: "\e079"; -} - -.glyphicon-chevron-right:before { - content: "\e080"; -} - -.glyphicon-plus-sign:before { - content: "\e081"; -} - -.glyphicon-minus-sign:before { - content: "\e082"; -} - -.glyphicon-remove-sign:before { - content: "\e083"; -} - -.glyphicon-ok-sign:before { - content: "\e084"; -} - -.glyphicon-question-sign:before { - content: "\e085"; -} - -.glyphicon-info-sign:before { - content: "\e086"; -} - -.glyphicon-screenshot:before { - content: "\e087"; -} - -.glyphicon-remove-circle:before { - content: "\e088"; -} - -.glyphicon-ok-circle:before { - content: "\e089"; -} - -.glyphicon-ban-circle:before { - content: "\e090"; -} - -.glyphicon-arrow-left:before { - content: "\e091"; -} - -.glyphicon-arrow-right:before { - content: "\e092"; -} - -.glyphicon-arrow-up:before { - content: "\e093"; -} - -.glyphicon-arrow-down:before { - content: "\e094"; -} - -.glyphicon-share-alt:before { - content: "\e095"; -} - -.glyphicon-resize-full:before { - content: "\e096"; -} - -.glyphicon-resize-small:before { - content: "\e097"; -} - -.glyphicon-exclamation-sign:before { - content: "\e101"; -} - -.glyphicon-gift:before { - content: "\e102"; -} - -.glyphicon-leaf:before { - content: "\e103"; -} - -.glyphicon-fire:before { - content: "\e104"; -} - -.glyphicon-eye-open:before { - content: "\e105"; -} - -.glyphicon-eye-close:before { - content: "\e106"; -} - -.glyphicon-warning-sign:before { - content: "\e107"; -} - -.glyphicon-plane:before { - content: "\e108"; -} - -.glyphicon-calendar:before { - content: "\e109"; -} - -.glyphicon-random:before { - content: "\e110"; -} - -.glyphicon-comment:before { - content: "\e111"; -} - -.glyphicon-magnet:before { - content: "\e112"; -} - -.glyphicon-chevron-up:before { - content: "\e113"; -} - -.glyphicon-chevron-down:before { - content: "\e114"; -} - -.glyphicon-retweet:before { - content: "\e115"; -} - -.glyphicon-shopping-cart:before { - content: "\e116"; -} - -.glyphicon-folder-close:before { - content: "\e117"; -} - -.glyphicon-folder-open:before { - content: "\e118"; -} - -.glyphicon-resize-vertical:before { - content: "\e119"; -} - -.glyphicon-resize-horizontal:before { - content: "\e120"; -} - -.glyphicon-hdd:before { - content: "\e121"; -} - -.glyphicon-bullhorn:before { - content: "\e122"; -} - -.glyphicon-bell:before { - content: "\e123"; -} - -.glyphicon-certificate:before { - content: "\e124"; -} - -.glyphicon-thumbs-up:before { - content: "\e125"; -} - -.glyphicon-thumbs-down:before { - content: "\e126"; -} - -.glyphicon-hand-right:before { - content: "\e127"; -} - -.glyphicon-hand-left:before { - content: "\e128"; -} - -.glyphicon-hand-up:before { - content: "\e129"; -} - -.glyphicon-hand-down:before { - content: "\e130"; -} - -.glyphicon-circle-arrow-right:before { - content: "\e131"; -} - -.glyphicon-circle-arrow-left:before { - content: "\e132"; -} - -.glyphicon-circle-arrow-up:before { - content: "\e133"; -} - -.glyphicon-circle-arrow-down:before { - content: "\e134"; -} - -.glyphicon-globe:before { - content: "\e135"; -} - -.glyphicon-wrench:before { - content: "\e136"; -} - -.glyphicon-tasks:before { - content: "\e137"; -} - -.glyphicon-filter:before { - content: "\e138"; -} - -.glyphicon-briefcase:before { - content: "\e139"; -} - -.glyphicon-fullscreen:before { - content: "\e140"; -} - -.glyphicon-dashboard:before { - content: "\e141"; -} - -.glyphicon-paperclip:before { - content: "\e142"; -} - -.glyphicon-heart-empty:before { - content: "\e143"; -} - -.glyphicon-link:before { - content: "\e144"; -} - -.glyphicon-phone:before { - content: "\e145"; -} - -.glyphicon-pushpin:before { - content: "\e146"; -} - -.glyphicon-usd:before { - content: "\e148"; -} - -.glyphicon-gbp:before { - content: "\e149"; -} - -.glyphicon-sort:before { - content: "\e150"; -} - -.glyphicon-sort-by-alphabet:before { - content: "\e151"; -} - -.glyphicon-sort-by-alphabet-alt:before { - content: "\e152"; -} - -.glyphicon-sort-by-order:before { - content: "\e153"; -} - -.glyphicon-sort-by-order-alt:before { - content: "\e154"; -} - -.glyphicon-sort-by-attributes:before { - content: "\e155"; -} - -.glyphicon-sort-by-attributes-alt:before { - content: "\e156"; -} - -.glyphicon-unchecked:before { - content: "\e157"; -} - -.glyphicon-expand:before { - content: "\e158"; -} - -.glyphicon-collapse-down:before { - content: "\e159"; -} - -.glyphicon-collapse-up:before { - content: "\e160"; -} - -.glyphicon-log-in:before { - content: "\e161"; -} - -.glyphicon-flash:before { - content: "\e162"; -} - -.glyphicon-log-out:before { - content: "\e163"; -} - -.glyphicon-new-window:before { - content: "\e164"; -} - -.glyphicon-record:before { - content: "\e165"; -} - -.glyphicon-save:before { - content: "\e166"; -} - -.glyphicon-open:before { - content: "\e167"; -} - -.glyphicon-saved:before { - content: "\e168"; -} - -.glyphicon-import:before { - content: "\e169"; -} - -.glyphicon-export:before { - content: "\e170"; -} - -.glyphicon-send:before { - content: "\e171"; -} - -.glyphicon-floppy-disk:before { - content: "\e172"; -} - -.glyphicon-floppy-saved:before { - content: "\e173"; -} - -.glyphicon-floppy-remove:before { - content: "\e174"; -} - -.glyphicon-floppy-save:before { - content: "\e175"; -} - -.glyphicon-floppy-open:before { - content: "\e176"; -} - -.glyphicon-credit-card:before { - content: "\e177"; -} - -.glyphicon-transfer:before { - content: "\e178"; -} - -.glyphicon-cutlery:before { - content: "\e179"; -} - -.glyphicon-header:before { - content: "\e180"; -} - -.glyphicon-compressed:before { - content: "\e181"; -} - -.glyphicon-earphone:before { - content: "\e182"; -} - -.glyphicon-phone-alt:before { - content: "\e183"; -} - -.glyphicon-tower:before { - content: "\e184"; -} - -.glyphicon-stats:before { - content: "\e185"; -} - -.glyphicon-sd-video:before { - content: "\e186"; -} - -.glyphicon-hd-video:before { - content: "\e187"; -} - -.glyphicon-subtitles:before { - content: "\e188"; -} - -.glyphicon-sound-stereo:before { - content: "\e189"; -} - -.glyphicon-sound-dolby:before { - content: "\e190"; -} - -.glyphicon-sound-5-1:before { - content: "\e191"; -} - -.glyphicon-sound-6-1:before { - content: "\e192"; -} - -.glyphicon-sound-7-1:before { - content: "\e193"; -} - -.glyphicon-copyright-mark:before { - content: "\e194"; -} - -.glyphicon-registration-mark:before { - content: "\e195"; -} - -.glyphicon-cloud-download:before { - content: "\e197"; -} - -.glyphicon-cloud-upload:before { - content: "\e198"; -} - -.glyphicon-tree-conifer:before { - content: "\e199"; -} - -.glyphicon-tree-deciduous:before { - content: "\e200"; -} - -.caret { - display: inline-block; - width: 0; - height: 0; - margin-left: 2px; - vertical-align: middle; - border-top: 4px solid; - border-right: 4px solid transparent; - border-left: 4px solid transparent; -} - -.dropdown { - position: relative; -} - -.dropdown-toggle:focus { - outline: 0; -} - -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - display: none; - float: left; - min-width: 160px; - padding: 5px 0; - margin: 2px 0 0; - font-size: 14px; - list-style: none; - background-color: #ffffff; - border: 1px solid #cccccc; - border: 1px solid rgba(0, 0, 0, 0.15); - border-radius: 4px; - -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); - box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); - background-clip: padding-box; -} - -.dropdown-menu.pull-right { - right: 0; - left: auto; -} - -.dropdown-menu .divider { - height: 1px; - margin: 9px 0; - overflow: hidden; - background-color: #e5e5e5; -} - -.dropdown-menu > li > a { - display: block; - padding: 3px 20px; - clear: both; - font-weight: normal; - line-height: 1.428571429; - color: #333333; - white-space: nowrap; -} - -.dropdown-menu > li > a:hover, -.dropdown-menu > li > a:focus { - color: #262626; - text-decoration: none; - background-color: #f5f5f5; -} - -.dropdown-menu > .active > a, -.dropdown-menu > .active > a:hover, -.dropdown-menu > .active > a:focus { - color: #ffffff; - text-decoration: none; - background-color: #428bca; - outline: 0; -} - -.dropdown-menu > .disabled > a, -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - color: #999999; -} - -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - text-decoration: none; - cursor: not-allowed; - background-color: transparent; - background-image: none; - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.open > .dropdown-menu { - display: block; -} - -.open > a { - outline: 0; -} - -.dropdown-header { - display: block; - padding: 3px 20px; - font-size: 12px; - line-height: 1.428571429; - color: #999999; -} - -.dropdown-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 990; -} - -.pull-right > .dropdown-menu { - right: 0; - left: auto; -} - -.dropup .caret, -.navbar-fixed-bottom .dropdown .caret { - border-top: 0; - border-bottom: 4px solid; - content: ""; -} - -.dropup .dropdown-menu, -.navbar-fixed-bottom .dropdown .dropdown-menu { - top: auto; - bottom: 100%; - margin-bottom: 1px; -} - -@media (min-width: 768px) { - .navbar-right .dropdown-menu { - right: 0; - left: auto; - } -} - -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-block; - vertical-align: middle; -} - -.btn-group > .btn, -.btn-group-vertical > .btn { - position: relative; - float: left; -} - -.btn-group > .btn:hover, -.btn-group-vertical > .btn:hover, -.btn-group > .btn:focus, -.btn-group-vertical > .btn:focus, -.btn-group > .btn:active, -.btn-group-vertical > .btn:active, -.btn-group > .btn.active, -.btn-group-vertical > .btn.active { - z-index: 2; -} - -.btn-group > .btn:focus, -.btn-group-vertical > .btn:focus { - outline: none; -} - -.btn-group .btn + .btn, -.btn-group .btn + .btn-group, -.btn-group .btn-group + .btn, -.btn-group .btn-group + .btn-group { - margin-left: -1px; -} - -.btn-toolbar:before, -.btn-toolbar:after { - display: table; - content: " "; -} - -.btn-toolbar:after { - clear: both; -} - -.btn-toolbar:before, -.btn-toolbar:after { - display: table; - content: " "; -} - -.btn-toolbar:after { - clear: both; -} - -.btn-toolbar .btn-group { - float: left; -} - -.btn-toolbar > .btn + .btn, -.btn-toolbar > .btn-group + .btn, -.btn-toolbar > .btn + .btn-group, -.btn-toolbar > .btn-group + .btn-group { - margin-left: 5px; -} - -.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { - border-radius: 0; -} - -.btn-group > .btn:first-child { - margin-left: 0; -} - -.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} - -.btn-group > .btn:last-child:not(:first-child), -.btn-group > .dropdown-toggle:not(:first-child) { - border-bottom-left-radius: 0; - border-top-left-radius: 0; -} - -.btn-group > .btn-group { - float: left; -} - -.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0; -} - -.btn-group > .btn-group:first-child > .btn:last-child, -.btn-group > .btn-group:first-child > .dropdown-toggle { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} - -.btn-group > .btn-group:last-child > .btn:first-child { - border-bottom-left-radius: 0; - border-top-left-radius: 0; -} - -.btn-group .dropdown-toggle:active, -.btn-group.open .dropdown-toggle { - outline: 0; -} - -.btn-group-xs > .btn { - padding: 1px 5px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} - -.btn-group-sm > .btn { - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} - -.btn-group-lg > .btn { - padding: 10px 16px; - font-size: 18px; - line-height: 1.33; - border-radius: 6px; -} - -.btn-group > .btn + .dropdown-toggle { - padding-right: 8px; - padding-left: 8px; -} - -.btn-group > .btn-lg + .dropdown-toggle { - padding-right: 12px; - padding-left: 12px; -} - -.btn-group.open .dropdown-toggle { - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); -} - -.btn-group.open .dropdown-toggle.btn-link { - -webkit-box-shadow: none; - box-shadow: none; -} - -.btn .caret { - margin-left: 0; -} - -.btn-lg .caret { - border-width: 5px 5px 0; - border-bottom-width: 0; -} - -.dropup .btn-lg .caret { - border-width: 0 5px 5px; -} - -.btn-group-vertical > .btn, -.btn-group-vertical > .btn-group, -.btn-group-vertical > .btn-group > .btn { - display: block; - float: none; - width: 100%; - max-width: 100%; -} - -.btn-group-vertical > .btn-group:before, -.btn-group-vertical > .btn-group:after { - display: table; - content: " "; -} - -.btn-group-vertical > .btn-group:after { - clear: both; -} - -.btn-group-vertical > .btn-group:before, -.btn-group-vertical > .btn-group:after { - display: table; - content: " "; -} - -.btn-group-vertical > .btn-group:after { - clear: both; -} - -.btn-group-vertical > .btn-group > .btn { - float: none; -} - -.btn-group-vertical > .btn + .btn, -.btn-group-vertical > .btn + .btn-group, -.btn-group-vertical > .btn-group + .btn, -.btn-group-vertical > .btn-group + .btn-group { - margin-top: -1px; - margin-left: 0; -} - -.btn-group-vertical > .btn:not(:first-child):not(:last-child) { - border-radius: 0; -} - -.btn-group-vertical > .btn:first-child:not(:last-child) { - border-top-right-radius: 4px; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} - -.btn-group-vertical > .btn:last-child:not(:first-child) { - border-top-right-radius: 0; - border-bottom-left-radius: 4px; - border-top-left-radius: 0; -} - -.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0; -} - -.btn-group-vertical > .btn-group:first-child > .btn:last-child, -.btn-group-vertical > .btn-group:first-child > .dropdown-toggle { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} - -.btn-group-vertical > .btn-group:last-child > .btn:first-child { - border-top-right-radius: 0; - border-top-left-radius: 0; -} - -.btn-group-justified { - display: table; - width: 100%; - border-collapse: separate; - table-layout: fixed; -} - -.btn-group-justified > .btn, -.btn-group-justified > .btn-group { - display: table-cell; - float: none; - width: 1%; -} - -.btn-group-justified > .btn-group .btn { - width: 100%; -} - -[data-toggle="buttons"] > .btn > input[type="radio"], -[data-toggle="buttons"] > .btn > input[type="checkbox"] { - display: none; -} - -.input-group { - position: relative; - display: table; - border-collapse: separate; -} - -.input-group[class*="col-"] { - float: none; - padding-right: 0; - padding-left: 0; -} - -.input-group .form-control { - width: 100%; - margin-bottom: 0; -} - -.input-group-lg > .form-control, -.input-group-lg > .input-group-addon, -.input-group-lg > .input-group-btn > .btn { - height: 46px; - padding: 10px 16px; - font-size: 18px; - line-height: 1.33; - border-radius: 6px; -} - -select.input-group-lg > .form-control, -select.input-group-lg > .input-group-addon, -select.input-group-lg > .input-group-btn > .btn { - height: 46px; - line-height: 46px; -} - -textarea.input-group-lg > .form-control, -textarea.input-group-lg > .input-group-addon, -textarea.input-group-lg > .input-group-btn > .btn { - height: auto; -} - -.input-group-sm > .form-control, -.input-group-sm > .input-group-addon, -.input-group-sm > .input-group-btn > .btn { - height: 30px; - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} - -select.input-group-sm > .form-control, -select.input-group-sm > .input-group-addon, -select.input-group-sm > .input-group-btn > .btn { - height: 30px; - line-height: 30px; -} - -textarea.input-group-sm > .form-control, -textarea.input-group-sm > .input-group-addon, -textarea.input-group-sm > .input-group-btn > .btn { - height: auto; -} - -.input-group-addon, -.input-group-btn, -.input-group .form-control { - display: table-cell; -} - -.input-group-addon:not(:first-child):not(:last-child), -.input-group-btn:not(:first-child):not(:last-child), -.input-group .form-control:not(:first-child):not(:last-child) { - border-radius: 0; -} - -.input-group-addon, -.input-group-btn { - width: 1%; - white-space: nowrap; - vertical-align: middle; -} - -.input-group-addon { - padding: 6px 12px; - font-size: 14px; - font-weight: normal; - line-height: 1; - color: #555555; - text-align: center; - background-color: #eeeeee; - border: 1px solid #cccccc; - border-radius: 4px; -} - -.input-group-addon.input-sm { - padding: 5px 10px; - font-size: 12px; - border-radius: 3px; -} - -.input-group-addon.input-lg { - padding: 10px 16px; - font-size: 18px; - border-radius: 6px; -} - -.input-group-addon input[type="radio"], -.input-group-addon input[type="checkbox"] { - margin-top: 0; -} - -.input-group .form-control:first-child, -.input-group-addon:first-child, -.input-group-btn:first-child > .btn, -.input-group-btn:first-child > .dropdown-toggle, -.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} - -.input-group-addon:first-child { - border-right: 0; -} - -.input-group .form-control:last-child, -.input-group-addon:last-child, -.input-group-btn:last-child > .btn, -.input-group-btn:last-child > .dropdown-toggle, -.input-group-btn:first-child > .btn:not(:first-child) { - border-bottom-left-radius: 0; - border-top-left-radius: 0; -} - -.input-group-addon:last-child { - border-left: 0; -} - -.input-group-btn { - position: relative; - white-space: nowrap; -} - -.input-group-btn:first-child > .btn { - margin-right: -1px; -} - -.input-group-btn:last-child > .btn { - margin-left: -1px; -} - -.input-group-btn > .btn { - position: relative; -} - -.input-group-btn > .btn + .btn { - margin-left: -4px; -} - -.input-group-btn > .btn:hover, -.input-group-btn > .btn:active { - z-index: 2; -} - -.nav { - padding-left: 0; - margin-bottom: 0; - list-style: none; -} - -.nav:before, -.nav:after { - display: table; - content: " "; -} - -.nav:after { - clear: both; -} - -.nav:before, -.nav:after { - display: table; - content: " "; -} - -.nav:after { - clear: both; -} - -.nav > li { - position: relative; - display: block; -} - -.nav > li > a { - position: relative; - display: block; - padding: 10px 15px; -} - -.nav > li > a:hover, -.nav > li > a:focus { - text-decoration: none; - background-color: #eeeeee; -} - -.nav > li.disabled > a { - color: #999999; -} - -.nav > li.disabled > a:hover, -.nav > li.disabled > a:focus { - color: #999999; - text-decoration: none; - cursor: not-allowed; - background-color: transparent; -} - -.nav .open > a, -.nav .open > a:hover, -.nav .open > a:focus { - background-color: #eeeeee; - border-color: #428bca; -} - -.nav .nav-divider { - height: 1px; - margin: 9px 0; - overflow: hidden; - background-color: #e5e5e5; -} - -.nav > li > a > img { - max-width: none; -} - -.nav-tabs { - border-bottom: 1px solid #dddddd; -} - -.nav-tabs > li { - float: left; - margin-bottom: -1px; -} - -.nav-tabs > li > a { - margin-right: 2px; - line-height: 1.428571429; - border: 1px solid transparent; - border-radius: 4px 4px 0 0; -} - -.nav-tabs > li > a:hover { - border-color: #eeeeee #eeeeee #dddddd; -} - -.nav-tabs > li.active > a, -.nav-tabs > li.active > a:hover, -.nav-tabs > li.active > a:focus { - color: #555555; - cursor: default; - background-color: #ffffff; - border: 1px solid #dddddd; - border-bottom-color: transparent; -} - -.nav-tabs.nav-justified { - width: 100%; - border-bottom: 0; -} - -.nav-tabs.nav-justified > li { - float: none; -} - -.nav-tabs.nav-justified > li > a { - margin-bottom: 5px; - text-align: center; -} - -.nav-tabs.nav-justified > .dropdown .dropdown-menu { - top: auto; - left: auto; -} - -@media (min-width: 768px) { - .nav-tabs.nav-justified > li { - display: table-cell; - width: 1%; - } - .nav-tabs.nav-justified > li > a { - margin-bottom: 0; - } -} - -.nav-tabs.nav-justified > li > a { - margin-right: 0; - border-radius: 4px; -} - -.nav-tabs.nav-justified > .active > a, -.nav-tabs.nav-justified > .active > a:hover, -.nav-tabs.nav-justified > .active > a:focus { - border: 1px solid #dddddd; -} - -@media (min-width: 768px) { - .nav-tabs.nav-justified > li > a { - border-bottom: 1px solid #dddddd; - border-radius: 4px 4px 0 0; - } - .nav-tabs.nav-justified > .active > a, - .nav-tabs.nav-justified > .active > a:hover, - .nav-tabs.nav-justified > .active > a:focus { - border-bottom-color: #ffffff; - } -} - -.nav-pills > li { - float: left; -} - -.nav-pills > li > a { - border-radius: 4px; -} - -.nav-pills > li + li { - margin-left: 2px; -} - -.nav-pills > li.active > a, -.nav-pills > li.active > a:hover, -.nav-pills > li.active > a:focus { - color: #ffffff; - background-color: #428bca; -} - -.nav-stacked > li { - float: none; -} - -.nav-stacked > li + li { - margin-top: 2px; - margin-left: 0; -} - -.nav-justified { - width: 100%; -} - -.nav-justified > li { - float: none; -} - -.nav-justified > li > a { - margin-bottom: 5px; - text-align: center; -} - -.nav-justified > .dropdown .dropdown-menu { - top: auto; - left: auto; -} - -@media (min-width: 768px) { - .nav-justified > li { - display: table-cell; - width: 1%; - } - .nav-justified > li > a { - margin-bottom: 0; - } -} - -.nav-tabs-justified { - border-bottom: 0; -} - -.nav-tabs-justified > li > a { - margin-right: 0; - border-radius: 4px; -} - -.nav-tabs-justified > .active > a, -.nav-tabs-justified > .active > a:hover, -.nav-tabs-justified > .active > a:focus { - border: 1px solid #dddddd; -} - -@media (min-width: 768px) { - .nav-tabs-justified > li > a { - border-bottom: 1px solid #dddddd; - border-radius: 4px 4px 0 0; - } - .nav-tabs-justified > .active > a, - .nav-tabs-justified > .active > a:hover, - .nav-tabs-justified > .active > a:focus { - border-bottom-color: #ffffff; - } -} - -.tab-content > .tab-pane { - display: none; -} - -.tab-content > .active { - display: block; -} - -.nav-tabs .dropdown-menu { - margin-top: -1px; - border-top-right-radius: 0; - border-top-left-radius: 0; -} - -.navbar { - position: relative; - min-height: 50px; - margin-bottom: 20px; - border: 1px solid transparent; -} - -.navbar:before, -.navbar:after { - display: table; - content: " "; -} - -.navbar:after { - clear: both; -} - -.navbar:before, -.navbar:after { - display: table; - content: " "; -} - -.navbar:after { - clear: both; -} - -@media (min-width: 768px) { - .navbar { - border-radius: 4px; - } -} - -.navbar-header:before, -.navbar-header:after { - display: table; - content: " "; -} - -.navbar-header:after { - clear: both; -} - -.navbar-header:before, -.navbar-header:after { - display: table; - content: " "; -} - -.navbar-header:after { - clear: both; -} - -@media (min-width: 768px) { - .navbar-header { - float: left; - } -} - -.navbar-collapse { - max-height: 340px; - padding-right: 15px; - padding-left: 15px; - overflow-x: visible; - border-top: 1px solid transparent; - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); - -webkit-overflow-scrolling: touch; -} - -.navbar-collapse:before, -.navbar-collapse:after { - display: table; - content: " "; -} - -.navbar-collapse:after { - clear: both; -} - -.navbar-collapse:before, -.navbar-collapse:after { - display: table; - content: " "; -} - -.navbar-collapse:after { - clear: both; -} - -.navbar-collapse.in { - overflow-y: auto; -} - -@media (min-width: 768px) { - .navbar-collapse { - width: auto; - border-top: 0; - box-shadow: none; - } - .navbar-collapse.collapse { - display: block !important; - height: auto !important; - padding-bottom: 0; - overflow: visible !important; - } - .navbar-collapse.in { - overflow-y: visible; - } - .navbar-fixed-top .navbar-collapse, - .navbar-static-top .navbar-collapse, - .navbar-fixed-bottom .navbar-collapse { - padding-right: 0; - padding-left: 0; - } -} - -.container > .navbar-header, -.container > .navbar-collapse { - margin-right: -15px; - margin-left: -15px; -} - -@media (min-width: 768px) { - .container > .navbar-header, - .container > .navbar-collapse { - margin-right: 0; - margin-left: 0; - } -} - -.navbar-static-top { - z-index: 1000; - border-width: 0 0 1px; -} - -@media (min-width: 768px) { - .navbar-static-top { - border-radius: 0; - } -} - -.navbar-fixed-top, -.navbar-fixed-bottom { - position: fixed; - right: 0; - left: 0; - z-index: 1030; -} - -@media (min-width: 768px) { - .navbar-fixed-top, - .navbar-fixed-bottom { - border-radius: 0; - } -} - -.navbar-fixed-top { - top: 0; - border-width: 0 0 1px; -} - -.navbar-fixed-bottom { - bottom: 0; - margin-bottom: 0; - border-width: 1px 0 0; -} - -.navbar-brand { - float: left; - padding: 15px 15px; - font-size: 18px; - line-height: 20px; -} - -.navbar-brand:hover, -.navbar-brand:focus { - text-decoration: none; -} - -@media (min-width: 768px) { - .navbar > .container .navbar-brand { - margin-left: -15px; - } -} - -.navbar-toggle { - position: relative; - float: right; - padding: 9px 10px; - margin-top: 8px; - margin-right: 15px; - margin-bottom: 8px; - background-color: transparent; - background-image: none; - border: 1px solid transparent; - border-radius: 4px; -} - -.navbar-toggle .icon-bar { - display: block; - width: 22px; - height: 2px; - border-radius: 1px; -} - -.navbar-toggle .icon-bar + .icon-bar { - margin-top: 4px; -} - -@media (min-width: 768px) { - .navbar-toggle { - display: none; - } -} - -.navbar-nav { - margin: 7.5px -15px; -} - -.navbar-nav > li > a { - padding-top: 10px; - padding-bottom: 10px; - line-height: 20px; -} - -@media (max-width: 767px) { - .navbar-nav .open .dropdown-menu { - position: static; - float: none; - width: auto; - margin-top: 0; - background-color: transparent; - border: 0; - box-shadow: none; - } - .navbar-nav .open .dropdown-menu > li > a, - .navbar-nav .open .dropdown-menu .dropdown-header { - padding: 5px 15px 5px 25px; - } - .navbar-nav .open .dropdown-menu > li > a { - line-height: 20px; - } - .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-nav .open .dropdown-menu > li > a:focus { - background-image: none; - } -} - -@media (min-width: 768px) { - .navbar-nav { - float: left; - margin: 0; - } - .navbar-nav > li { - float: left; - } - .navbar-nav > li > a { - padding-top: 15px; - padding-bottom: 15px; - } - .navbar-nav.navbar-right:last-child { - margin-right: -15px; - } -} - -@media (min-width: 768px) { - .navbar-left { - float: left !important; - } - .navbar-right { - float: right !important; - } -} - -.navbar-form { - padding: 10px 15px; - margin-top: 8px; - margin-right: -15px; - margin-bottom: 8px; - margin-left: -15px; - border-top: 1px solid transparent; - border-bottom: 1px solid transparent; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); -} - -@media (min-width: 768px) { - .navbar-form .form-group { - display: inline-block; - margin-bottom: 0; - vertical-align: middle; - } - .navbar-form .form-control { - display: inline-block; - } - .navbar-form select.form-control { - width: auto; - } - .navbar-form .radio, - .navbar-form .checkbox { - display: inline-block; - padding-left: 0; - margin-top: 0; - margin-bottom: 0; - } - .navbar-form .radio input[type="radio"], - .navbar-form .checkbox input[type="checkbox"] { - float: none; - margin-left: 0; - } -} - -@media (max-width: 767px) { - .navbar-form .form-group { - margin-bottom: 5px; - } -} - -@media (min-width: 768px) { - .navbar-form { - width: auto; - padding-top: 0; - padding-bottom: 0; - margin-right: 0; - margin-left: 0; - border: 0; - -webkit-box-shadow: none; - box-shadow: none; - } - .navbar-form.navbar-right:last-child { - margin-right: -15px; - } -} - -.navbar-nav > li > .dropdown-menu { - margin-top: 0; - border-top-right-radius: 0; - border-top-left-radius: 0; -} - -.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} - -.navbar-nav.pull-right > li > .dropdown-menu, -.navbar-nav > li > .dropdown-menu.pull-right { - right: 0; - left: auto; -} - -.navbar-btn { - margin-top: 8px; - margin-bottom: 8px; -} - -.navbar-btn.btn-sm { - margin-top: 10px; - margin-bottom: 10px; -} - -.navbar-btn.btn-xs { - margin-top: 14px; - margin-bottom: 14px; -} - -.navbar-text { - margin-top: 15px; - margin-bottom: 15px; -} - -@media (min-width: 768px) { - .navbar-text { - float: left; - margin-right: 15px; - margin-left: 15px; - } - .navbar-text.navbar-right:last-child { - margin-right: 0; - } -} - -.navbar-default { - background-color: #f8f8f8; - border-color: #e7e7e7; -} - -.navbar-default .navbar-brand { - color: #777777; -} - -.navbar-default .navbar-brand:hover, -.navbar-default .navbar-brand:focus { - color: #5e5e5e; - background-color: transparent; -} - -.navbar-default .navbar-text { - color: #777777; -} - -.navbar-default .navbar-nav > li > a { - color: #777777; -} - -.navbar-default .navbar-nav > li > a:hover, -.navbar-default .navbar-nav > li > a:focus { - color: #333333; - background-color: transparent; -} - -.navbar-default .navbar-nav > .active > a, -.navbar-default .navbar-nav > .active > a:hover, -.navbar-default .navbar-nav > .active > a:focus { - color: #555555; - background-color: #e7e7e7; -} - -.navbar-default .navbar-nav > .disabled > a, -.navbar-default .navbar-nav > .disabled > a:hover, -.navbar-default .navbar-nav > .disabled > a:focus { - color: #cccccc; - background-color: transparent; -} - -.navbar-default .navbar-toggle { - border-color: #dddddd; -} - -.navbar-default .navbar-toggle:hover, -.navbar-default .navbar-toggle:focus { - background-color: #dddddd; -} - -.navbar-default .navbar-toggle .icon-bar { - background-color: #cccccc; -} - -.navbar-default .navbar-collapse, -.navbar-default .navbar-form { - border-color: #e7e7e7; -} - -.navbar-default .navbar-nav > .open > a, -.navbar-default .navbar-nav > .open > a:hover, -.navbar-default .navbar-nav > .open > a:focus { - color: #555555; - background-color: #e7e7e7; -} - -@media (max-width: 767px) { - .navbar-default .navbar-nav .open .dropdown-menu > li > a { - color: #777777; - } - .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { - color: #333333; - background-color: transparent; - } - .navbar-default .navbar-nav .open .dropdown-menu > .active > a, - .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #555555; - background-color: #e7e7e7; - } - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #cccccc; - background-color: transparent; - } -} - -.navbar-default .navbar-link { - color: #777777; -} - -.navbar-default .navbar-link:hover { - color: #333333; -} - -.navbar-inverse { - background-color: #222222; - border-color: #080808; -} - -.navbar-inverse .navbar-brand { - color: #999999; -} - -.navbar-inverse .navbar-brand:hover, -.navbar-inverse .navbar-brand:focus { - color: #ffffff; - background-color: transparent; -} - -.navbar-inverse .navbar-text { - color: #999999; -} - -.navbar-inverse .navbar-nav > li > a { - color: #999999; -} - -.navbar-inverse .navbar-nav > li > a:hover, -.navbar-inverse .navbar-nav > li > a:focus { - color: #ffffff; - background-color: transparent; -} - -.navbar-inverse .navbar-nav > .active > a, -.navbar-inverse .navbar-nav > .active > a:hover, -.navbar-inverse .navbar-nav > .active > a:focus { - color: #ffffff; - background-color: #080808; -} - -.navbar-inverse .navbar-nav > .disabled > a, -.navbar-inverse .navbar-nav > .disabled > a:hover, -.navbar-inverse .navbar-nav > .disabled > a:focus { - color: #444444; - background-color: transparent; -} - -.navbar-inverse .navbar-toggle { - border-color: #333333; -} - -.navbar-inverse .navbar-toggle:hover, -.navbar-inverse .navbar-toggle:focus { - background-color: #333333; -} - -.navbar-inverse .navbar-toggle .icon-bar { - background-color: #ffffff; -} - -.navbar-inverse .navbar-collapse, -.navbar-inverse .navbar-form { - border-color: #101010; -} - -.navbar-inverse .navbar-nav > .open > a, -.navbar-inverse .navbar-nav > .open > a:hover, -.navbar-inverse .navbar-nav > .open > a:focus { - color: #ffffff; - background-color: #080808; -} - -@media (max-width: 767px) { - .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { - border-color: #080808; - } - .navbar-inverse .navbar-nav .open .dropdown-menu .divider { - background-color: #080808; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { - color: #999999; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { - color: #ffffff; - background-color: transparent; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #ffffff; - background-color: #080808; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #444444; - background-color: transparent; - } -} - -.navbar-inverse .navbar-link { - color: #999999; -} - -.navbar-inverse .navbar-link:hover { - color: #ffffff; -} - -.breadcrumb { - padding: 8px 15px; - margin-bottom: 20px; - list-style: none; - background-color: #f5f5f5; - border-radius: 4px; -} - -.breadcrumb > li { - display: inline-block; -} - -.breadcrumb > li + li:before { - padding: 0 5px; - color: #cccccc; - content: "/\00a0"; -} - -.breadcrumb > .active { - color: #999999; -} - -.pagination { - display: inline-block; - padding-left: 0; - margin: 20px 0; - border-radius: 4px; -} - -.pagination > li { - display: inline; -} - -.pagination > li > a, -.pagination > li > span { - position: relative; - float: left; - padding: 6px 12px; - margin-left: -1px; - line-height: 1.428571429; - text-decoration: none; - background-color: #ffffff; - border: 1px solid #dddddd; -} - -.pagination > li:first-child > a, -.pagination > li:first-child > span { - margin-left: 0; - border-bottom-left-radius: 4px; - border-top-left-radius: 4px; -} - -.pagination > li:last-child > a, -.pagination > li:last-child > span { - border-top-right-radius: 4px; - border-bottom-right-radius: 4px; -} - -.pagination > li > a:hover, -.pagination > li > span:hover, -.pagination > li > a:focus, -.pagination > li > span:focus { - background-color: #eeeeee; -} - -.pagination > .active > a, -.pagination > .active > span, -.pagination > .active > a:hover, -.pagination > .active > span:hover, -.pagination > .active > a:focus, -.pagination > .active > span:focus { - z-index: 2; - color: #ffffff; - cursor: default; - background-color: #428bca; - border-color: #428bca; -} - -.pagination > .disabled > span, -.pagination > .disabled > span:hover, -.pagination > .disabled > span:focus, -.pagination > .disabled > a, -.pagination > .disabled > a:hover, -.pagination > .disabled > a:focus { - color: #999999; - cursor: not-allowed; - background-color: #ffffff; - border-color: #dddddd; -} - -.pagination-lg > li > a, -.pagination-lg > li > span { - padding: 10px 16px; - font-size: 18px; -} - -.pagination-lg > li:first-child > a, -.pagination-lg > li:first-child > span { - border-bottom-left-radius: 6px; - border-top-left-radius: 6px; -} - -.pagination-lg > li:last-child > a, -.pagination-lg > li:last-child > span { - border-top-right-radius: 6px; - border-bottom-right-radius: 6px; -} - -.pagination-sm > li > a, -.pagination-sm > li > span { - padding: 5px 10px; - font-size: 12px; -} - -.pagination-sm > li:first-child > a, -.pagination-sm > li:first-child > span { - border-bottom-left-radius: 3px; - border-top-left-radius: 3px; -} - -.pagination-sm > li:last-child > a, -.pagination-sm > li:last-child > span { - border-top-right-radius: 3px; - border-bottom-right-radius: 3px; -} - -.pager { - padding-left: 0; - margin: 20px 0; - text-align: center; - list-style: none; -} - -.pager:before, -.pager:after { - display: table; - content: " "; -} - -.pager:after { - clear: both; -} - -.pager:before, -.pager:after { - display: table; - content: " "; -} - -.pager:after { - clear: both; -} - -.pager li { - display: inline; -} - -.pager li > a, -.pager li > span { - display: inline-block; - padding: 5px 14px; - background-color: #ffffff; - border: 1px solid #dddddd; - border-radius: 15px; -} - -.pager li > a:hover, -.pager li > a:focus { - text-decoration: none; - background-color: #eeeeee; -} - -.pager .next > a, -.pager .next > span { - float: right; -} - -.pager .previous > a, -.pager .previous > span { - float: left; -} - -.pager .disabled > a, -.pager .disabled > a:hover, -.pager .disabled > a:focus, -.pager .disabled > span { - color: #999999; - cursor: not-allowed; - background-color: #ffffff; -} - -.label { - display: inline; - padding: .2em .6em .3em; - font-size: 75%; - font-weight: bold; - line-height: 1; - color: #ffffff; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - border-radius: .25em; -} - -.label[href]:hover, -.label[href]:focus { - color: #ffffff; - text-decoration: none; - cursor: pointer; -} - -.label:empty { - display: none; -} - -.btn .label { - position: relative; - top: -1px; -} - -.label-default { - background-color: #999999; -} - -.label-default[href]:hover, -.label-default[href]:focus { - background-color: #808080; -} - -.label-primary { - background-color: #428bca; -} - -.label-primary[href]:hover, -.label-primary[href]:focus { - background-color: #3071a9; -} - -.label-success { - background-color: #5cb85c; -} - -.label-success[href]:hover, -.label-success[href]:focus { - background-color: #449d44; -} - -.label-info { - background-color: #5bc0de; -} - -.label-info[href]:hover, -.label-info[href]:focus { - background-color: #31b0d5; -} - -.label-warning { - background-color: #f0ad4e; -} - -.label-warning[href]:hover, -.label-warning[href]:focus { - background-color: #ec971f; -} - -.label-danger { - background-color: #d9534f; -} - -.label-danger[href]:hover, -.label-danger[href]:focus { - background-color: #c9302c; -} - -.badge { - display: inline-block; - min-width: 10px; - padding: 3px 7px; - font-size: 12px; - font-weight: bold; - line-height: 1; - color: #ffffff; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - background-color: #999999; - border-radius: 10px; -} - -.badge:empty { - display: none; -} - -.btn .badge { - position: relative; - top: -1px; -} - -a.badge:hover, -a.badge:focus { - color: #ffffff; - text-decoration: none; - cursor: pointer; -} - -a.list-group-item.active > .badge, -.nav-pills > .active > a > .badge { - color: #428bca; - background-color: #ffffff; -} - -.nav-pills > li > a > .badge { - margin-left: 3px; -} - -.jumbotron { - padding: 30px; - margin-bottom: 30px; - font-size: 21px; - font-weight: 200; - line-height: 2.1428571435; - color: inherit; - background-color: #eeeeee; -} - -.jumbotron h1, -.jumbotron .h1 { - line-height: 1; - color: inherit; -} - -.jumbotron p { - line-height: 1.4; -} - -.container .jumbotron { - border-radius: 6px; -} - -.jumbotron .container { - max-width: 100%; -} - -@media screen and (min-width: 768px) { - .jumbotron { - padding-top: 48px; - padding-bottom: 48px; - } - .container .jumbotron { - padding-right: 60px; - padding-left: 60px; - } - .jumbotron h1, - .jumbotron .h1 { - font-size: 63px; - } -} - -.thumbnail { - display: block; - padding: 4px; - margin-bottom: 20px; - line-height: 1.428571429; - background-color: #ffffff; - border: 1px solid #dddddd; - border-radius: 4px; - -webkit-transition: all 0.2s ease-in-out; - transition: all 0.2s ease-in-out; -} - -.thumbnail > img, -.thumbnail a > img { - display: block; - height: auto; - max-width: 100%; - margin-right: auto; - margin-left: auto; -} - -a.thumbnail:hover, -a.thumbnail:focus, -a.thumbnail.active { - border-color: #428bca; -} - -.thumbnail .caption { - padding: 9px; - color: #333333; -} - -.alert { - padding: 15px; - margin-bottom: 20px; - border: 1px solid transparent; - border-radius: 4px; -} - -.alert h4 { - margin-top: 0; - color: inherit; -} - -.alert .alert-link { - font-weight: bold; -} - -.alert > p, -.alert > ul { - margin-bottom: 0; -} - -.alert > p + p { - margin-top: 5px; -} - -.alert-dismissable { - padding-right: 35px; -} - -.alert-dismissable .close { - position: relative; - top: -2px; - right: -21px; - color: inherit; -} - -.alert-success { - color: #3c763d; - background-color: #dff0d8; - border-color: #d6e9c6; -} - -.alert-success hr { - border-top-color: #c9e2b3; -} - -.alert-success .alert-link { - color: #2b542c; -} - -.alert-info { - color: #31708f; - background-color: #d9edf7; - border-color: #bce8f1; -} - -.alert-info hr { - border-top-color: #a6e1ec; -} - -.alert-info .alert-link { - color: #245269; -} - -.alert-warning { - color: #8a6d3b; - background-color: #fcf8e3; - border-color: #faebcc; -} - -.alert-warning hr { - border-top-color: #f7e1b5; -} - -.alert-warning .alert-link { - color: #66512c; -} - -.alert-danger { - color: #a94442; - background-color: #f2dede; - border-color: #ebccd1; -} - -.alert-danger hr { - border-top-color: #e4b9c0; -} - -.alert-danger .alert-link { - color: #843534; -} - -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -@keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -.progress { - height: 20px; - margin-bottom: 20px; - overflow: hidden; - background-color: #f5f5f5; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); -} - -.progress-bar { - float: left; - width: 0; - height: 100%; - font-size: 12px; - line-height: 20px; - color: #ffffff; - text-align: center; - background-color: #428bca; - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -webkit-transition: width 0.6s ease; - transition: width 0.6s ease; -} - -.progress-striped .progress-bar { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-size: 40px 40px; -} - -.progress.active .progress-bar { - -webkit-animation: progress-bar-stripes 2s linear infinite; - animation: progress-bar-stripes 2s linear infinite; -} - -.progress-bar-success { - background-color: #5cb85c; -} - -.progress-striped .progress-bar-success { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.progress-bar-info { - background-color: #5bc0de; -} - -.progress-striped .progress-bar-info { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.progress-bar-warning { - background-color: #f0ad4e; -} - -.progress-striped .progress-bar-warning { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.progress-bar-danger { - background-color: #d9534f; -} - -.progress-striped .progress-bar-danger { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.media, -.media-body { - overflow: hidden; - zoom: 1; -} - -.media, -.media .media { - margin-top: 15px; -} - -.media:first-child { - margin-top: 0; -} - -.media-object { - display: block; -} - -.media-heading { - margin: 0 0 5px; -} - -.media > .pull-left { - margin-right: 10px; -} - -.media > .pull-right { - margin-left: 10px; -} - -.media-list { - padding-left: 0; - list-style: none; -} - -.list-group { - padding-left: 0; - margin-bottom: 20px; -} - -.list-group-item { - position: relative; - display: block; - padding: 10px 15px; - margin-bottom: -1px; - background-color: #ffffff; - border: 1px solid #dddddd; -} - -.list-group-item:first-child { - border-top-right-radius: 4px; - border-top-left-radius: 4px; -} - -.list-group-item:last-child { - margin-bottom: 0; - border-bottom-right-radius: 4px; - border-bottom-left-radius: 4px; -} - -.list-group-item > .badge { - float: right; -} - -.list-group-item > .badge + .badge { - margin-right: 5px; -} - -a.list-group-item { - color: #555555; -} - -a.list-group-item .list-group-item-heading { - color: #333333; -} - -a.list-group-item:hover, -a.list-group-item:focus { - text-decoration: none; - background-color: #f5f5f5; -} - -a.list-group-item.active, -a.list-group-item.active:hover, -a.list-group-item.active:focus { - z-index: 2; - color: #ffffff; - background-color: #428bca; - border-color: #428bca; -} - -a.list-group-item.active .list-group-item-heading, -a.list-group-item.active:hover .list-group-item-heading, -a.list-group-item.active:focus .list-group-item-heading { - color: inherit; -} - -a.list-group-item.active .list-group-item-text, -a.list-group-item.active:hover .list-group-item-text, -a.list-group-item.active:focus .list-group-item-text { - color: #e1edf7; -} - -.list-group-item-heading { - margin-top: 0; - margin-bottom: 5px; -} - -.list-group-item-text { - margin-bottom: 0; - line-height: 1.3; -} - -.panel { - margin-bottom: 20px; - background-color: #ffffff; - border: 1px solid transparent; - border-radius: 4px; - -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); - box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); -} - -.panel-body { - padding: 15px; -} - -.panel-body:before, -.panel-body:after { - display: table; - content: " "; -} - -.panel-body:after { - clear: both; -} - -.panel-body:before, -.panel-body:after { - display: table; - content: " "; -} - -.panel-body:after { - clear: both; -} - -.panel > .list-group { - margin-bottom: 0; -} - -.panel > .list-group .list-group-item { - border-width: 1px 0; -} - -.panel > .list-group .list-group-item:first-child { - border-top-right-radius: 0; - border-top-left-radius: 0; -} - -.panel > .list-group .list-group-item:last-child { - border-bottom: 0; -} - -.panel-heading + .list-group .list-group-item:first-child { - border-top-width: 0; -} - -.panel > .table, -.panel > .table-responsive > .table { - margin-bottom: 0; -} - -.panel > .panel-body + .table, -.panel > .panel-body + .table-responsive { - border-top: 1px solid #dddddd; -} - -.panel > .table > tbody:first-child th, -.panel > .table > tbody:first-child td { - border-top: 0; -} - -.panel > .table-bordered, -.panel > .table-responsive > .table-bordered { - border: 0; -} - -.panel > .table-bordered > thead > tr > th:first-child, -.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, -.panel > .table-bordered > tbody > tr > th:first-child, -.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, -.panel > .table-bordered > tfoot > tr > th:first-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, -.panel > .table-bordered > thead > tr > td:first-child, -.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, -.panel > .table-bordered > tbody > tr > td:first-child, -.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, -.panel > .table-bordered > tfoot > tr > td:first-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { - border-left: 0; -} - -.panel > .table-bordered > thead > tr > th:last-child, -.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, -.panel > .table-bordered > tbody > tr > th:last-child, -.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, -.panel > .table-bordered > tfoot > tr > th:last-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, -.panel > .table-bordered > thead > tr > td:last-child, -.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, -.panel > .table-bordered > tbody > tr > td:last-child, -.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, -.panel > .table-bordered > tfoot > tr > td:last-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { - border-right: 0; -} - -.panel > .table-bordered > thead > tr:last-child > th, -.panel > .table-responsive > .table-bordered > thead > tr:last-child > th, -.panel > .table-bordered > tbody > tr:last-child > th, -.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, -.panel > .table-bordered > tfoot > tr:last-child > th, -.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th, -.panel > .table-bordered > thead > tr:last-child > td, -.panel > .table-responsive > .table-bordered > thead > tr:last-child > td, -.panel > .table-bordered > tbody > tr:last-child > td, -.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, -.panel > .table-bordered > tfoot > tr:last-child > td, -.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td { - border-bottom: 0; -} - -.panel > .table-responsive { - margin-bottom: 0; - border: 0; -} - -.panel-heading { - padding: 10px 15px; - border-bottom: 1px solid transparent; - border-top-right-radius: 3px; - border-top-left-radius: 3px; -} - -.panel-heading > .dropdown .dropdown-toggle { - color: inherit; -} - -.panel-title { - margin-top: 0; - margin-bottom: 0; - font-size: 16px; - color: inherit; -} - -.panel-title > a { - color: inherit; -} - -.panel-footer { - padding: 10px 15px; - background-color: #f5f5f5; - border-top: 1px solid #dddddd; - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; -} - -.panel-group .panel { - margin-bottom: 0; - overflow: hidden; - border-radius: 4px; -} - -.panel-group .panel + .panel { - margin-top: 5px; -} - -.panel-group .panel-heading { - border-bottom: 0; -} - -.panel-group .panel-heading + .panel-collapse .panel-body { - border-top: 1px solid #dddddd; -} - -.panel-group .panel-footer { - border-top: 0; -} - -.panel-group .panel-footer + .panel-collapse .panel-body { - border-bottom: 1px solid #dddddd; -} - -.panel-default { - border-color: #dddddd; -} - -.panel-default > .panel-heading { - color: #333333; - background-color: #f5f5f5; - border-color: #dddddd; -} - -.panel-default > .panel-heading + .panel-collapse .panel-body { - border-top-color: #dddddd; -} - -.panel-default > .panel-footer + .panel-collapse .panel-body { - border-bottom-color: #dddddd; -} - -.panel-primary { - border-color: #428bca; -} - -.panel-primary > .panel-heading { - color: #ffffff; - background-color: #428bca; - border-color: #428bca; -} - -.panel-primary > .panel-heading + .panel-collapse .panel-body { - border-top-color: #428bca; -} - -.panel-primary > .panel-footer + .panel-collapse .panel-body { - border-bottom-color: #428bca; -} - -.panel-success { - border-color: #d6e9c6; -} - -.panel-success > .panel-heading { - color: #3c763d; - background-color: #dff0d8; - border-color: #d6e9c6; -} - -.panel-success > .panel-heading + .panel-collapse .panel-body { - border-top-color: #d6e9c6; -} - -.panel-success > .panel-footer + .panel-collapse .panel-body { - border-bottom-color: #d6e9c6; -} - -.panel-warning { - border-color: #faebcc; -} - -.panel-warning > .panel-heading { - color: #8a6d3b; - background-color: #fcf8e3; - border-color: #faebcc; -} - -.panel-warning > .panel-heading + .panel-collapse .panel-body { - border-top-color: #faebcc; -} - -.panel-warning > .panel-footer + .panel-collapse .panel-body { - border-bottom-color: #faebcc; -} - -.panel-danger { - border-color: #ebccd1; -} - -.panel-danger > .panel-heading { - color: #a94442; - background-color: #f2dede; - border-color: #ebccd1; -} - -.panel-danger > .panel-heading + .panel-collapse .panel-body { - border-top-color: #ebccd1; -} - -.panel-danger > .panel-footer + .panel-collapse .panel-body { - border-bottom-color: #ebccd1; -} - -.panel-info { - border-color: #bce8f1; -} - -.panel-info > .panel-heading { - color: #31708f; - background-color: #d9edf7; - border-color: #bce8f1; -} - -.panel-info > .panel-heading + .panel-collapse .panel-body { - border-top-color: #bce8f1; -} - -.panel-info > .panel-footer + .panel-collapse .panel-body { - border-bottom-color: #bce8f1; -} - -.well { - min-height: 20px; - padding: 19px; - margin-bottom: 20px; - background-color: #f5f5f5; - border: 1px solid #e3e3e3; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); -} - -.well blockquote { - border-color: #ddd; - border-color: rgba(0, 0, 0, 0.15); -} - -.well-lg { - padding: 24px; - border-radius: 6px; -} - -.well-sm { - padding: 9px; - border-radius: 3px; -} - -.close { - float: right; - font-size: 21px; - font-weight: bold; - line-height: 1; - color: #000000; - text-shadow: 0 1px 0 #ffffff; - opacity: 0.2; - filter: alpha(opacity=20); -} - -.close:hover, -.close:focus { - color: #000000; - text-decoration: none; - cursor: pointer; - opacity: 0.5; - filter: alpha(opacity=50); -} - -button.close { - padding: 0; - cursor: pointer; - background: transparent; - border: 0; - -webkit-appearance: none; -} - -.modal-open { - overflow: hidden; -} - -.modal { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1040; - display: none; - overflow: auto; - overflow-y: scroll; -} - -.modal.fade .modal-dialog { - -webkit-transform: translate(0, -25%); - -ms-transform: translate(0, -25%); - transform: translate(0, -25%); - -webkit-transition: -webkit-transform 0.3s ease-out; - -moz-transition: -moz-transform 0.3s ease-out; - -o-transition: -o-transform 0.3s ease-out; - transition: transform 0.3s ease-out; -} - -.modal.in .modal-dialog { - -webkit-transform: translate(0, 0); - -ms-transform: translate(0, 0); - transform: translate(0, 0); -} - -.modal-dialog { - position: relative; - z-index: 1050; - width: auto; - margin: 10px; -} - -.modal-content { - position: relative; - background-color: #ffffff; - border: 1px solid #999999; - border: 1px solid rgba(0, 0, 0, 0.2); - border-radius: 6px; - outline: none; - -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); - box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); - background-clip: padding-box; -} - -.modal-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1030; - background-color: #000000; -} - -.modal-backdrop.fade { - opacity: 0; - filter: alpha(opacity=0); -} - -.modal-backdrop.in { - opacity: 0.5; - filter: alpha(opacity=50); -} - -.modal-header { - min-height: 16.428571429px; - padding: 15px; - border-bottom: 1px solid #e5e5e5; -} - -.modal-header .close { - margin-top: -2px; -} - -.modal-title { - margin: 0; - line-height: 1.428571429; -} - -.modal-body { - position: relative; - padding: 20px; -} - -.modal-footer { - padding: 19px 20px 20px; - margin-top: 15px; - text-align: right; - border-top: 1px solid #e5e5e5; -} - -.modal-footer:before, -.modal-footer:after { - display: table; - content: " "; -} - -.modal-footer:after { - clear: both; -} - -.modal-footer:before, -.modal-footer:after { - display: table; - content: " "; -} - -.modal-footer:after { - clear: both; -} - -.modal-footer .btn + .btn { - margin-bottom: 0; - margin-left: 5px; -} - -.modal-footer .btn-group .btn + .btn { - margin-left: -1px; -} - -.modal-footer .btn-block + .btn-block { - margin-left: 0; -} - -@media screen and (min-width: 768px) { - .modal-dialog { - width: 600px; - margin: 30px auto; - } - .modal-content { - -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); - box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); - } -} - -.tooltip { - position: absolute; - z-index: 1030; - display: block; - font-size: 12px; - line-height: 1.4; - opacity: 0; - filter: alpha(opacity=0); - visibility: visible; -} - -.tooltip.in { - opacity: 0.9; - filter: alpha(opacity=90); -} - -.tooltip.top { - padding: 5px 0; - margin-top: -3px; -} - -.tooltip.right { - padding: 0 5px; - margin-left: 3px; -} - -.tooltip.bottom { - padding: 5px 0; - margin-top: 3px; -} - -.tooltip.left { - padding: 0 5px; - margin-left: -3px; -} - -.tooltip-inner { - max-width: 200px; - padding: 3px 8px; - color: #ffffff; - text-align: center; - text-decoration: none; - background-color: #000000; - border-radius: 4px; -} - -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} - -.tooltip.top .tooltip-arrow { - bottom: 0; - left: 50%; - margin-left: -5px; - border-top-color: #000000; - border-width: 5px 5px 0; -} - -.tooltip.top-left .tooltip-arrow { - bottom: 0; - left: 5px; - border-top-color: #000000; - border-width: 5px 5px 0; -} - -.tooltip.top-right .tooltip-arrow { - right: 5px; - bottom: 0; - border-top-color: #000000; - border-width: 5px 5px 0; -} - -.tooltip.right .tooltip-arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-right-color: #000000; - border-width: 5px 5px 5px 0; -} - -.tooltip.left .tooltip-arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-left-color: #000000; - border-width: 5px 0 5px 5px; -} - -.tooltip.bottom .tooltip-arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-bottom-color: #000000; - border-width: 0 5px 5px; -} - -.tooltip.bottom-left .tooltip-arrow { - top: 0; - left: 5px; - border-bottom-color: #000000; - border-width: 0 5px 5px; -} - -.tooltip.bottom-right .tooltip-arrow { - top: 0; - right: 5px; - border-bottom-color: #000000; - border-width: 0 5px 5px; -} - -.popover { - position: absolute; - top: 0; - left: 0; - z-index: 1010; - display: none; - max-width: 276px; - padding: 1px; - text-align: left; - white-space: normal; - background-color: #ffffff; - border: 1px solid #cccccc; - border: 1px solid rgba(0, 0, 0, 0.2); - border-radius: 6px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - background-clip: padding-box; -} - -.popover.top { - margin-top: -10px; -} - -.popover.right { - margin-left: 10px; -} - -.popover.bottom { - margin-top: 10px; -} - -.popover.left { - margin-left: -10px; -} - -.popover-title { - padding: 8px 14px; - margin: 0; - font-size: 14px; - font-weight: normal; - line-height: 18px; - background-color: #f7f7f7; - border-bottom: 1px solid #ebebeb; - border-radius: 5px 5px 0 0; -} - -.popover-content { - padding: 9px 14px; -} - -.popover .arrow, -.popover .arrow:after { - position: absolute; - display: block; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} - -.popover .arrow { - border-width: 11px; -} - -.popover .arrow:after { - border-width: 10px; - content: ""; -} - -.popover.top .arrow { - bottom: -11px; - left: 50%; - margin-left: -11px; - border-top-color: #999999; - border-top-color: rgba(0, 0, 0, 0.25); - border-bottom-width: 0; -} - -.popover.top .arrow:after { - bottom: 1px; - margin-left: -10px; - border-top-color: #ffffff; - border-bottom-width: 0; - content: " "; -} - -.popover.right .arrow { - top: 50%; - left: -11px; - margin-top: -11px; - border-right-color: #999999; - border-right-color: rgba(0, 0, 0, 0.25); - border-left-width: 0; -} - -.popover.right .arrow:after { - bottom: -10px; - left: 1px; - border-right-color: #ffffff; - border-left-width: 0; - content: " "; -} - -.popover.bottom .arrow { - top: -11px; - left: 50%; - margin-left: -11px; - border-bottom-color: #999999; - border-bottom-color: rgba(0, 0, 0, 0.25); - border-top-width: 0; -} - -.popover.bottom .arrow:after { - top: 1px; - margin-left: -10px; - border-bottom-color: #ffffff; - border-top-width: 0; - content: " "; -} - -.popover.left .arrow { - top: 50%; - right: -11px; - margin-top: -11px; - border-left-color: #999999; - border-left-color: rgba(0, 0, 0, 0.25); - border-right-width: 0; -} - -.popover.left .arrow:after { - right: 1px; - bottom: -10px; - border-left-color: #ffffff; - border-right-width: 0; - content: " "; -} - -.carousel { - position: relative; -} - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; -} - -.carousel-inner > .item { - position: relative; - display: none; - -webkit-transition: 0.6s ease-in-out left; - transition: 0.6s ease-in-out left; -} - -.carousel-inner > .item > img, -.carousel-inner > .item > a > img { - display: block; - height: auto; - max-width: 100%; - line-height: 1; -} - -.carousel-inner > .active, -.carousel-inner > .next, -.carousel-inner > .prev { - display: block; -} - -.carousel-inner > .active { - left: 0; -} - -.carousel-inner > .next, -.carousel-inner > .prev { - position: absolute; - top: 0; - width: 100%; -} - -.carousel-inner > .next { - left: 100%; -} - -.carousel-inner > .prev { - left: -100%; -} - -.carousel-inner > .next.left, -.carousel-inner > .prev.right { - left: 0; -} - -.carousel-inner > .active.left { - left: -100%; -} - -.carousel-inner > .active.right { - left: 100%; -} - -.carousel-control { - position: absolute; - top: 0; - bottom: 0; - left: 0; - width: 15%; - font-size: 20px; - color: #ffffff; - text-align: center; - text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); - opacity: 0.5; - filter: alpha(opacity=50); -} - -.carousel-control.left { - background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.5) 0), color-stop(rgba(0, 0, 0, 0.0001) 100%)); - background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0, rgba(0, 0, 0, 0.0001) 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); -} - -.carousel-control.right { - right: 0; - left: auto; - background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.0001) 0), color-stop(rgba(0, 0, 0, 0.5) 100%)); - background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0, rgba(0, 0, 0, 0.5) 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); -} - -.carousel-control:hover, -.carousel-control:focus { - color: #ffffff; - text-decoration: none; - outline: none; - opacity: 0.9; - filter: alpha(opacity=90); -} - -.carousel-control .icon-prev, -.carousel-control .icon-next, -.carousel-control .glyphicon-chevron-left, -.carousel-control .glyphicon-chevron-right { - position: absolute; - top: 50%; - z-index: 5; - display: inline-block; -} - -.carousel-control .icon-prev, -.carousel-control .glyphicon-chevron-left { - left: 50%; -} - -.carousel-control .icon-next, -.carousel-control .glyphicon-chevron-right { - right: 50%; -} - -.carousel-control .icon-prev, -.carousel-control .icon-next { - width: 20px; - height: 20px; - margin-top: -10px; - margin-left: -10px; - font-family: serif; -} - -.carousel-control .icon-prev:before { - content: '\2039'; -} - -.carousel-control .icon-next:before { - content: '\203a'; -} - -.carousel-indicators { - position: absolute; - bottom: 10px; - left: 50%; - z-index: 15; - width: 60%; - padding-left: 0; - margin-left: -30%; - text-align: center; - list-style: none; -} - -.carousel-indicators li { - display: inline-block; - width: 10px; - height: 10px; - margin: 1px; - text-indent: -999px; - cursor: pointer; - background-color: #000 \9; - background-color: rgba(0, 0, 0, 0); - border: 1px solid #ffffff; - border-radius: 10px; -} - -.carousel-indicators .active { - width: 12px; - height: 12px; - margin: 0; - background-color: #ffffff; -} - -.carousel-caption { - position: absolute; - right: 15%; - bottom: 20px; - left: 15%; - z-index: 10; - padding-top: 20px; - padding-bottom: 20px; - color: #ffffff; - text-align: center; - text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); -} - -.carousel-caption .btn { - text-shadow: none; -} - -@media screen and (min-width: 768px) { - .carousel-control .glyphicons-chevron-left, - .carousel-control .glyphicons-chevron-right, - .carousel-control .icon-prev, - .carousel-control .icon-next { - width: 30px; - height: 30px; - margin-top: -15px; - margin-left: -15px; - font-size: 30px; - } - .carousel-caption { - right: 20%; - left: 20%; - padding-bottom: 30px; - } - .carousel-indicators { - bottom: 20px; - } -} - -.clearfix:before, -.clearfix:after { - display: table; - content: " "; -} - -.clearfix:after { - clear: both; -} - -.center-block { - display: block; - margin-right: auto; - margin-left: auto; -} - -.pull-right { - float: right !important; -} - -.pull-left { - float: left !important; -} - -.hide { - display: none !important; -} - -.show { - display: block !important; -} - -.invisible { - visibility: hidden; -} - -.text-hide { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} - -.hidden { - display: none !important; - visibility: hidden !important; -} - -.affix { - position: fixed; -} - -@-ms-viewport { - width: device-width; -} - -.visible-xs, -tr.visible-xs, -th.visible-xs, -td.visible-xs { - display: none !important; -} - -@media (max-width: 767px) { - .visible-xs { - display: block !important; - } - table.visible-xs { - display: table; - } - tr.visible-xs { - display: table-row !important; - } - th.visible-xs, - td.visible-xs { - display: table-cell !important; - } -} - -@media (min-width: 768px) and (max-width: 991px) { - .visible-xs.visible-sm { - display: block !important; - } - table.visible-xs.visible-sm { - display: table; - } - tr.visible-xs.visible-sm { - display: table-row !important; - } - th.visible-xs.visible-sm, - td.visible-xs.visible-sm { - display: table-cell !important; - } -} - -@media (min-width: 992px) and (max-width: 1199px) { - .visible-xs.visible-md { - display: block !important; - } - table.visible-xs.visible-md { - display: table; - } - tr.visible-xs.visible-md { - display: table-row !important; - } - th.visible-xs.visible-md, - td.visible-xs.visible-md { - display: table-cell !important; - } -} - -@media (min-width: 1200px) { - .visible-xs.visible-lg { - display: block !important; - } - table.visible-xs.visible-lg { - display: table; - } - tr.visible-xs.visible-lg { - display: table-row !important; - } - th.visible-xs.visible-lg, - td.visible-xs.visible-lg { - display: table-cell !important; - } -} - -.visible-sm, -tr.visible-sm, -th.visible-sm, -td.visible-sm { - display: none !important; -} - -@media (max-width: 767px) { - .visible-sm.visible-xs { - display: block !important; - } - table.visible-sm.visible-xs { - display: table; - } - tr.visible-sm.visible-xs { - display: table-row !important; - } - th.visible-sm.visible-xs, - td.visible-sm.visible-xs { - display: table-cell !important; - } -} - -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm { - display: block !important; - } - table.visible-sm { - display: table; - } - tr.visible-sm { - display: table-row !important; - } - th.visible-sm, - td.visible-sm { - display: table-cell !important; - } -} - -@media (min-width: 992px) and (max-width: 1199px) { - .visible-sm.visible-md { - display: block !important; - } - table.visible-sm.visible-md { - display: table; - } - tr.visible-sm.visible-md { - display: table-row !important; - } - th.visible-sm.visible-md, - td.visible-sm.visible-md { - display: table-cell !important; - } -} - -@media (min-width: 1200px) { - .visible-sm.visible-lg { - display: block !important; - } - table.visible-sm.visible-lg { - display: table; - } - tr.visible-sm.visible-lg { - display: table-row !important; - } - th.visible-sm.visible-lg, - td.visible-sm.visible-lg { - display: table-cell !important; - } -} - -.visible-md, -tr.visible-md, -th.visible-md, -td.visible-md { - display: none !important; -} - -@media (max-width: 767px) { - .visible-md.visible-xs { - display: block !important; - } - table.visible-md.visible-xs { - display: table; - } - tr.visible-md.visible-xs { - display: table-row !important; - } - th.visible-md.visible-xs, - td.visible-md.visible-xs { - display: table-cell !important; - } -} - -@media (min-width: 768px) and (max-width: 991px) { - .visible-md.visible-sm { - display: block !important; - } - table.visible-md.visible-sm { - display: table; - } - tr.visible-md.visible-sm { - display: table-row !important; - } - th.visible-md.visible-sm, - td.visible-md.visible-sm { - display: table-cell !important; - } -} - -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md { - display: block !important; - } - table.visible-md { - display: table; - } - tr.visible-md { - display: table-row !important; - } - th.visible-md, - td.visible-md { - display: table-cell !important; - } -} - -@media (min-width: 1200px) { - .visible-md.visible-lg { - display: block !important; - } - table.visible-md.visible-lg { - display: table; - } - tr.visible-md.visible-lg { - display: table-row !important; - } - th.visible-md.visible-lg, - td.visible-md.visible-lg { - display: table-cell !important; - } -} - -.visible-lg, -tr.visible-lg, -th.visible-lg, -td.visible-lg { - display: none !important; -} - -@media (max-width: 767px) { - .visible-lg.visible-xs { - display: block !important; - } - table.visible-lg.visible-xs { - display: table; - } - tr.visible-lg.visible-xs { - display: table-row !important; - } - th.visible-lg.visible-xs, - td.visible-lg.visible-xs { - display: table-cell !important; - } -} - -@media (min-width: 768px) and (max-width: 991px) { - .visible-lg.visible-sm { - display: block !important; - } - table.visible-lg.visible-sm { - display: table; - } - tr.visible-lg.visible-sm { - display: table-row !important; - } - th.visible-lg.visible-sm, - td.visible-lg.visible-sm { - display: table-cell !important; - } -} - -@media (min-width: 992px) and (max-width: 1199px) { - .visible-lg.visible-md { - display: block !important; - } - table.visible-lg.visible-md { - display: table; - } - tr.visible-lg.visible-md { - display: table-row !important; - } - th.visible-lg.visible-md, - td.visible-lg.visible-md { - display: table-cell !important; - } -} - -@media (min-width: 1200px) { - .visible-lg { - display: block !important; - } - table.visible-lg { - display: table; - } - tr.visible-lg { - display: table-row !important; - } - th.visible-lg, - td.visible-lg { - display: table-cell !important; - } -} - -.hidden-xs { - display: block !important; -} - -table.hidden-xs { - display: table; -} - -tr.hidden-xs { - display: table-row !important; -} - -th.hidden-xs, -td.hidden-xs { - display: table-cell !important; -} - -@media (max-width: 767px) { - .hidden-xs, - tr.hidden-xs, - th.hidden-xs, - td.hidden-xs { - display: none !important; - } -} - -@media (min-width: 768px) and (max-width: 991px) { - .hidden-xs.hidden-sm, - tr.hidden-xs.hidden-sm, - th.hidden-xs.hidden-sm, - td.hidden-xs.hidden-sm { - display: none !important; - } -} - -@media (min-width: 992px) and (max-width: 1199px) { - .hidden-xs.hidden-md, - tr.hidden-xs.hidden-md, - th.hidden-xs.hidden-md, - td.hidden-xs.hidden-md { - display: none !important; - } -} - -@media (min-width: 1200px) { - .hidden-xs.hidden-lg, - tr.hidden-xs.hidden-lg, - th.hidden-xs.hidden-lg, - td.hidden-xs.hidden-lg { - display: none !important; - } -} - -.hidden-sm { - display: block !important; -} - -table.hidden-sm { - display: table; -} - -tr.hidden-sm { - display: table-row !important; -} - -th.hidden-sm, -td.hidden-sm { - display: table-cell !important; -} - -@media (max-width: 767px) { - .hidden-sm.hidden-xs, - tr.hidden-sm.hidden-xs, - th.hidden-sm.hidden-xs, - td.hidden-sm.hidden-xs { - display: none !important; - } -} - -@media (min-width: 768px) and (max-width: 991px) { - .hidden-sm, - tr.hidden-sm, - th.hidden-sm, - td.hidden-sm { - display: none !important; - } -} - -@media (min-width: 992px) and (max-width: 1199px) { - .hidden-sm.hidden-md, - tr.hidden-sm.hidden-md, - th.hidden-sm.hidden-md, - td.hidden-sm.hidden-md { - display: none !important; - } -} - -@media (min-width: 1200px) { - .hidden-sm.hidden-lg, - tr.hidden-sm.hidden-lg, - th.hidden-sm.hidden-lg, - td.hidden-sm.hidden-lg { - display: none !important; - } -} - -.hidden-md { - display: block !important; -} - -table.hidden-md { - display: table; -} - -tr.hidden-md { - display: table-row !important; -} - -th.hidden-md, -td.hidden-md { - display: table-cell !important; -} - -@media (max-width: 767px) { - .hidden-md.hidden-xs, - tr.hidden-md.hidden-xs, - th.hidden-md.hidden-xs, - td.hidden-md.hidden-xs { - display: none !important; - } -} - -@media (min-width: 768px) and (max-width: 991px) { - .hidden-md.hidden-sm, - tr.hidden-md.hidden-sm, - th.hidden-md.hidden-sm, - td.hidden-md.hidden-sm { - display: none !important; - } -} - -@media (min-width: 992px) and (max-width: 1199px) { - .hidden-md, - tr.hidden-md, - th.hidden-md, - td.hidden-md { - display: none !important; - } -} - -@media (min-width: 1200px) { - .hidden-md.hidden-lg, - tr.hidden-md.hidden-lg, - th.hidden-md.hidden-lg, - td.hidden-md.hidden-lg { - display: none !important; - } -} - -.hidden-lg { - display: block !important; -} - -table.hidden-lg { - display: table; -} - -tr.hidden-lg { - display: table-row !important; -} - -th.hidden-lg, -td.hidden-lg { - display: table-cell !important; -} - -@media (max-width: 767px) { - .hidden-lg.hidden-xs, - tr.hidden-lg.hidden-xs, - th.hidden-lg.hidden-xs, - td.hidden-lg.hidden-xs { - display: none !important; - } -} - -@media (min-width: 768px) and (max-width: 991px) { - .hidden-lg.hidden-sm, - tr.hidden-lg.hidden-sm, - th.hidden-lg.hidden-sm, - td.hidden-lg.hidden-sm { - display: none !important; - } -} - -@media (min-width: 992px) and (max-width: 1199px) { - .hidden-lg.hidden-md, - tr.hidden-lg.hidden-md, - th.hidden-lg.hidden-md, - td.hidden-lg.hidden-md { - display: none !important; - } -} - -@media (min-width: 1200px) { - .hidden-lg, - tr.hidden-lg, - th.hidden-lg, - td.hidden-lg { - display: none !important; - } -} - -.visible-print, -tr.visible-print, -th.visible-print, -td.visible-print { - display: none !important; -} - -@media print { - .visible-print { - display: block !important; - } - table.visible-print { - display: table; - } - tr.visible-print { - display: table-row !important; - } - th.visible-print, - td.visible-print { - display: table-cell !important; - } - .hidden-print, - tr.hidden-print, - th.hidden-print, - td.hidden-print { - display: none !important; - } -} \ No newline at end of file diff --git a/docs/dist/css/bootstrap.min.css b/docs/dist/css/bootstrap.min.css deleted file mode 100644 index c547283..0000000 --- a/docs/dist/css/bootstrap.min.css +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap v3.0.3 (http://getbootstrap.com) - * Copyright 2013 Twitter, Inc. - * Licensed under http://www.apache.org/licenses/LICENSE-2.0 - */ - -/*! normalize.css v2.1.3 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}[hidden],template{display:none}html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a{background:transparent}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{margin:.67em 0;font-size:2em}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}hr{height:0;-moz-box-sizing:content-box;box-sizing:content-box}mark{color:#000;background:#ff0}code,kbd,pre,samp{font-family:monospace,serif;font-size:1em}pre{white-space:pre-wrap}q{quotes:"\201C" "\201D" "\2018" "\2019"}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:0}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid #c0c0c0}legend{padding:0;border:0}button,input,select,textarea{margin:0;font-family:inherit;font-size:100%}button,input{line-height:normal}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}button[disabled],html input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{padding:0;box-sizing:border-box}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}@page{margin:2cm .5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}*,*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:62.5%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.428571429;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}img{vertical-align:middle}.img-responsive{display:block;height:auto;max-width:100%}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;height:auto;max-width:100%;padding:4px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{margin-top:20px;margin-bottom:10px}h1 small,h2 small,h3 small,h1 .small,h2 .small,h3 .small{font-size:65%}h4,h5,h6{margin-top:10px;margin-bottom:10px}h4 small,h5 small,h6 small,h4 .small,h5 .small,h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:200;line-height:1.4}@media(min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}cite{font-style:normal}.text-muted{color:#999}.text-primary{color:#428bca}.text-primary:hover{color:#3071a9}.text-warning{color:#8a6d3b}.text-warning:hover{color:#66512c}.text-danger{color:#a94442}.text-danger:hover{color:#843534}.text-success{color:#3c763d}.text-success:hover{color:#2b542c}.text-info{color:#31708f}.text-info:hover{color:#245269}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}.list-inline>li:first-child{padding-left:0}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.428571429}dt{font-weight:bold}dd{margin-left:0}@media(min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizontal dd:after{clear:both}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizontal dd:after{clear:both}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{font-size:17.5px;font-weight:300;line-height:1.25}blockquote p:last-child{margin-bottom:0}blockquote small,blockquote .small{display:block;line-height:1.428571429;color:#999}blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small,blockquote.pull-right .small{text-align:right}blockquote.pull-right small:before,blockquote.pull-right .small:before{content:''}blockquote.pull-right small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.428571429}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;white-space:nowrap;background-color:#f9f2f4;border-radius:4px}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.428571429;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}@media(min-width:768px){.container{width:750px}}@media(min-width:992px){.container{width:970px}}@media(min-width:1200px){.container{width:1170px}}.row{margin-right:-15px;margin-left:-15px}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666666666666%}.col-xs-10{width:83.33333333333334%}.col-xs-9{width:75%}.col-xs-8{width:66.66666666666666%}.col-xs-7{width:58.333333333333336%}.col-xs-6{width:50%}.col-xs-5{width:41.66666666666667%}.col-xs-4{width:33.33333333333333%}.col-xs-3{width:25%}.col-xs-2{width:16.666666666666664%}.col-xs-1{width:8.333333333333332%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666666666666%}.col-xs-pull-10{right:83.33333333333334%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666666666666%}.col-xs-pull-7{right:58.333333333333336%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666666666667%}.col-xs-pull-4{right:33.33333333333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.666666666666664%}.col-xs-pull-1{right:8.333333333333332%}.col-xs-pull-0{right:0}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666666666666%}.col-xs-push-10{left:83.33333333333334%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666666666666%}.col-xs-push-7{left:58.333333333333336%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666666666667%}.col-xs-push-4{left:33.33333333333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.666666666666664%}.col-xs-push-1{left:8.333333333333332%}.col-xs-push-0{left:0}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666666666666%}.col-xs-offset-10{margin-left:83.33333333333334%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666666666666%}.col-xs-offset-7{margin-left:58.333333333333336%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666666666667%}.col-xs-offset-4{margin-left:33.33333333333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.666666666666664%}.col-xs-offset-1{margin-left:8.333333333333332%}.col-xs-offset-0{margin-left:0}@media(min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666666666666%}.col-sm-10{width:83.33333333333334%}.col-sm-9{width:75%}.col-sm-8{width:66.66666666666666%}.col-sm-7{width:58.333333333333336%}.col-sm-6{width:50%}.col-sm-5{width:41.66666666666667%}.col-sm-4{width:33.33333333333333%}.col-sm-3{width:25%}.col-sm-2{width:16.666666666666664%}.col-sm-1{width:8.333333333333332%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666666666666%}.col-sm-pull-10{right:83.33333333333334%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666666666666%}.col-sm-pull-7{right:58.333333333333336%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666666666667%}.col-sm-pull-4{right:33.33333333333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.666666666666664%}.col-sm-pull-1{right:8.333333333333332%}.col-sm-pull-0{right:0}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666666666666%}.col-sm-push-10{left:83.33333333333334%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666666666666%}.col-sm-push-7{left:58.333333333333336%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666666666667%}.col-sm-push-4{left:33.33333333333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.666666666666664%}.col-sm-push-1{left:8.333333333333332%}.col-sm-push-0{left:0}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666666666666%}.col-sm-offset-10{margin-left:83.33333333333334%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666666666666%}.col-sm-offset-7{margin-left:58.333333333333336%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666666666667%}.col-sm-offset-4{margin-left:33.33333333333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.666666666666664%}.col-sm-offset-1{margin-left:8.333333333333332%}.col-sm-offset-0{margin-left:0}}@media(min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666666666666%}.col-md-10{width:83.33333333333334%}.col-md-9{width:75%}.col-md-8{width:66.66666666666666%}.col-md-7{width:58.333333333333336%}.col-md-6{width:50%}.col-md-5{width:41.66666666666667%}.col-md-4{width:33.33333333333333%}.col-md-3{width:25%}.col-md-2{width:16.666666666666664%}.col-md-1{width:8.333333333333332%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666666666666%}.col-md-pull-10{right:83.33333333333334%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666666666666%}.col-md-pull-7{right:58.333333333333336%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666666666667%}.col-md-pull-4{right:33.33333333333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.666666666666664%}.col-md-pull-1{right:8.333333333333332%}.col-md-pull-0{right:0}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666666666666%}.col-md-push-10{left:83.33333333333334%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666666666666%}.col-md-push-7{left:58.333333333333336%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666666666667%}.col-md-push-4{left:33.33333333333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.666666666666664%}.col-md-push-1{left:8.333333333333332%}.col-md-push-0{left:0}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666666666666%}.col-md-offset-10{margin-left:83.33333333333334%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666666666666%}.col-md-offset-7{margin-left:58.333333333333336%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666666666667%}.col-md-offset-4{margin-left:33.33333333333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.666666666666664%}.col-md-offset-1{margin-left:8.333333333333332%}.col-md-offset-0{margin-left:0}}@media(min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666666666666%}.col-lg-10{width:83.33333333333334%}.col-lg-9{width:75%}.col-lg-8{width:66.66666666666666%}.col-lg-7{width:58.333333333333336%}.col-lg-6{width:50%}.col-lg-5{width:41.66666666666667%}.col-lg-4{width:33.33333333333333%}.col-lg-3{width:25%}.col-lg-2{width:16.666666666666664%}.col-lg-1{width:8.333333333333332%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666666666666%}.col-lg-pull-10{right:83.33333333333334%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666666666666%}.col-lg-pull-7{right:58.333333333333336%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666666666667%}.col-lg-pull-4{right:33.33333333333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.666666666666664%}.col-lg-pull-1{right:8.333333333333332%}.col-lg-pull-0{right:0}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666666666666%}.col-lg-push-10{left:83.33333333333334%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666666666666%}.col-lg-push-7{left:58.333333333333336%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666666666667%}.col-lg-push-4{left:33.33333333333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.666666666666664%}.col-lg-push-1{left:8.333333333333332%}.col-lg-push-0{left:0}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666666666666%}.col-lg-offset-10{margin-left:83.33333333333334%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666666666666%}.col-lg-offset-7{margin-left:58.333333333333336%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666666666667%}.col-lg-offset-4{margin-left:33.33333333333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.666666666666664%}.col-lg-offset-1{margin-left:8.333333333333332%}.col-lg-offset-0{margin-left:0}}table{max-width:100%;background-color:transparent}th{text-align:left}.table{width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.428571429;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*="col-"]{position:static;display:table-column;float:none}table td[class*="col-"],table th[class*="col-"]{display:table-cell;float:none}.table>thead>tr>.active,.table>tbody>tr>.active,.table>tfoot>tr>.active,.table>thead>.active>td,.table>tbody>.active>td,.table>tfoot>.active>td,.table>thead>.active>th,.table>tbody>.active>th,.table>tfoot>.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>.active:hover,.table-hover>tbody>.active:hover>td,.table-hover>tbody>.active:hover>th{background-color:#e8e8e8}.table>thead>tr>.success,.table>tbody>tr>.success,.table>tfoot>tr>.success,.table>thead>.success>td,.table>tbody>.success>td,.table>tfoot>.success>td,.table>thead>.success>th,.table>tbody>.success>th,.table>tfoot>.success>th{background-color:#dff0d8}.table-hover>tbody>tr>.success:hover,.table-hover>tbody>.success:hover>td,.table-hover>tbody>.success:hover>th{background-color:#d0e9c6}.table>thead>tr>.danger,.table>tbody>tr>.danger,.table>tfoot>tr>.danger,.table>thead>.danger>td,.table>tbody>.danger>td,.table>tfoot>.danger>td,.table>thead>.danger>th,.table>tbody>.danger>th,.table>tfoot>.danger>th{background-color:#f2dede}.table-hover>tbody>tr>.danger:hover,.table-hover>tbody>.danger:hover>td,.table-hover>tbody>.danger:hover>th{background-color:#ebcccc}.table>thead>tr>.warning,.table>tbody>tr>.warning,.table>tfoot>tr>.warning,.table>thead>.warning>td,.table>tbody>.warning>td,.table>tfoot>.warning>td,.table>thead>.warning>th,.table>tbody>.warning>th,.table>tfoot>.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>.warning:hover,.table-hover>tbody>.warning:hover>td,.table-hover>tbody>.warning:hover>th{background-color:#faf2cc}@media(max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-x:scroll;overflow-y:hidden;border:1px solid #ddd;-ms-overflow-style:-ms-autohiding-scrollbar;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}select[multiple],select[size]{height:auto}select optgroup{font-family:inherit;font-size:inherit;font-style:inherit}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}input[type="number"]::-webkit-outer-spin-button,input[type="number"]::-webkit-inner-spin-button{height:auto}output{display:block;padding-top:7px;font-size:14px;line-height:1.428571429;color:#555;vertical-align:middle}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.428571429;color:#555;vertical-align:middle;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.form-control:-moz-placeholder{color:#999}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee}textarea.form-control{height:auto}.form-group{margin-bottom:15px}.radio,.checkbox{display:block;min-height:20px;padding-left:20px;margin-top:10px;margin-bottom:10px;vertical-align:middle}.radio label,.checkbox label{display:inline;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{float:left;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;font-weight:normal;vertical-align:middle;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],.radio[disabled],.radio-inline[disabled],.checkbox[disabled],.checkbox-inline[disabled],fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"],fieldset[disabled] .radio,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm{height:auto}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg{height:auto}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.form-control-static{margin-bottom:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media(min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block}.form-inline select.form-control{width:auto}.form-inline .radio,.form-inline .checkbox{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:none;margin-left:0}}.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-control-static{padding-top:7px}@media(min-width:768px){.form-horizontal .control-label{text-align:right}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:normal;line-height:1.428571429;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#333;text-decoration:none}.btn:active,.btn.active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{color:#333;background-color:#ebebeb;border-color:#adadad}.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#fff}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{color:#fff;background-color:#3276b1;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{color:#fff;background-color:#ed9c28;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{color:#fff;background-color:#d2322d;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{color:#fff;background-color:#47a447;border-color:#398439}.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{color:#fff;background-color:#39b3d7;border-color:#269abc}.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-link{font-weight:normal;color:#428bca;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#999;text-decoration:none}.btn-lg{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';-webkit-font-smoothing:antialiased;font-style:normal;font-weight:normal;line-height:1;-moz-osx-font-smoothing:grayscale}.glyphicon:empty{width:1em}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.428571429;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#428bca;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.428571429;color:#999}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media(min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:0}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar .btn-group{float:left}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group,.btn-toolbar>.btn-group+.btn-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-right-radius:0;border-bottom-left-radius:4px;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child>.btn:last-child,.btn-group-vertical>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;border-collapse:separate;table-layout:fixed}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}[data-toggle="buttons"]>.btn>input[type="radio"],[data-toggle="buttons"]>.btn>input[type="checkbox"]{display:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-right:0;padding-left:0}.input-group .form-control{width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:normal;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;white-space:nowrap}.input-group-btn:first-child>.btn{margin-right:-1px}.input-group-btn:last-child>.btn{margin-left:-1px}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-4px}.input-group-btn>.btn:hover,.input-group-btn>.btn:active{z-index:2}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#999}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#999;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.428571429;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media(min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media(min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media(min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media(min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}@media(min-width:768px){.navbar{border-radius:4px}}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}@media(min-width:768px){.navbar-header{float:left}}.navbar-collapse{max-height:340px;padding-right:15px;padding-left:15px;overflow-x:visible;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.navbar-collapse.in{overflow-y:auto}@media(min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-right:0;padding-left:0}}.container>.navbar-header,.container>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media(min-width:768px){.container>.navbar-header,.container>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media(min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media(min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media(min-width:768px){.navbar>.container .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media(min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media(max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media(min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.navbar-nav.navbar-right:last-child{margin-right:-15px}}@media(min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}@media(min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block}.navbar-form select.form-control{width:auto}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{float:none;margin-left:0}}@media(max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media(min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-nav.pull-right>li>.dropdown-menu,.navbar-nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media(min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#ccc}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{color:#555;background-color:#e7e7e7}@media(max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#999}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .navbar-nav>li>a{color:#999}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{color:#fff;background-color:#080808}@media(max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#999}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#fff}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#999}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.428571429;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{background-color:#eee}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;cursor:default;background-color:#428bca;border-color:#428bca}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#999;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager:before,.pager:after{display:table;content:" "}.pager:after{clear:both}.pager:before,.pager:after{display:table;content:" "}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.label[href]:hover,.label[href]:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#999}.label-default[href]:hover,.label-default[href]:focus{background-color:#808080}.label-primary{background-color:#428bca}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#999;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;font-size:21px;font-weight:200;line-height:2.1428571435;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{line-height:1;color:inherit}.jumbotron p{line-height:1.4}.container .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-right:60px;padding-left:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{display:block;height:auto;max-width:100%;margin-right:auto;margin-left:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#428bca}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable{padding-right:35px}.alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-size:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;background-color:#f5f5f5}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}a.list-group-item.active .list-group-item-heading,a.list-group-item.active:hover .list-group-item-heading,a.list-group-item.active:focus .list-group-item-heading{color:inherit}a.list-group-item.active .list-group-item-text,a.list-group-item.active:hover .list-group-item-text,a.list-group-item.active:focus .list-group-item-text{color:#e1edf7}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-body:before,.panel-body:after{display:table;content:" "}.panel-body:after{clear:both}.panel-body:before,.panel-body:after{display:table;content:" "}.panel-body:after{clear:both}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0}.panel>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel>.list-group .list-group-item:last-child{border-bottom:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.panel>.table>tbody:first-child th,.panel>.table>tbody:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:last-child>th,.panel>.table-responsive>.table-bordered>thead>tr:last-child>th,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.panel>.table-bordered>thead>tr:last-child>td,.panel>.table-responsive>.table-bordered>thead>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-group .panel{margin-bottom:0;overflow:hidden;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.panel-default>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#428bca}.panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#428bca}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse .panel-body{border-top-color:#d6e9c6}.panel-success>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#d6e9c6}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse .panel-body{border-top-color:#faebcc}.panel-warning>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse .panel-body{border-top-color:#ebccd1}.panel-danger>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ebccd1}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse .panel-body{border-top-color:#bce8f1}.panel-info>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#bce8f1}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:bold;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;display:none;overflow:auto;overflow-y:scroll}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.modal-dialog{position:relative;z-index:1050;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);background-clip:padding-box}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1030;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{min-height:16.428571429px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.428571429}.modal-body{position:relative;padding:20px}.modal-footer{padding:19px 20px 20px;margin-top:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer:before,.modal-footer:after{display:table;content:" "}.modal-footer:after{clear:both}.modal-footer:before,.modal-footer:after{display:table;content:" "}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}@media screen and (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}}.tooltip{position:absolute;z-index:1030;display:block;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.top-right .tooltip-arrow{right:5px;bottom:0;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-bottom-color:#000;border-width:0 5px 5px}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0;content:" "}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0;content:" "}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0;content:" "}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0;content:" "}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;height:auto;max-width:100%;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6);opacity:.5;filter:alpha(opacity=50)}.carousel-control.left{background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,0.5) 0),color-stop(rgba(0,0,0,0.0001) 100%));background-image:linear-gradient(to right,rgba(0,0,0,0.5) 0,rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000',endColorstr='#00000000',GradientType=1)}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,0.0001) 0),color-stop(rgba(0,0,0,0.5) 100%));background-image:linear-gradient(to right,rgba(0,0,0,0.0001) 0,rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000',endColorstr='#80000000',GradientType=1)}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;outline:0;opacity:.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;margin-left:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicons-chevron-left,.carousel-control .glyphicons-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;margin-left:-15px;font-size:30px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after{display:table;content:" "}.clearfix:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important;visibility:hidden!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,tr.visible-xs,th.visible-xs,td.visible-xs{display:none!important}@media(max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}th.visible-xs,td.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-xs.visible-sm{display:block!important}table.visible-xs.visible-sm{display:table}tr.visible-xs.visible-sm{display:table-row!important}th.visible-xs.visible-sm,td.visible-xs.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-xs.visible-md{display:block!important}table.visible-xs.visible-md{display:table}tr.visible-xs.visible-md{display:table-row!important}th.visible-xs.visible-md,td.visible-xs.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-xs.visible-lg{display:block!important}table.visible-xs.visible-lg{display:table}tr.visible-xs.visible-lg{display:table-row!important}th.visible-xs.visible-lg,td.visible-xs.visible-lg{display:table-cell!important}}.visible-sm,tr.visible-sm,th.visible-sm,td.visible-sm{display:none!important}@media(max-width:767px){.visible-sm.visible-xs{display:block!important}table.visible-sm.visible-xs{display:table}tr.visible-sm.visible-xs{display:table-row!important}th.visible-sm.visible-xs,td.visible-sm.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}th.visible-sm,td.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-sm.visible-md{display:block!important}table.visible-sm.visible-md{display:table}tr.visible-sm.visible-md{display:table-row!important}th.visible-sm.visible-md,td.visible-sm.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-sm.visible-lg{display:block!important}table.visible-sm.visible-lg{display:table}tr.visible-sm.visible-lg{display:table-row!important}th.visible-sm.visible-lg,td.visible-sm.visible-lg{display:table-cell!important}}.visible-md,tr.visible-md,th.visible-md,td.visible-md{display:none!important}@media(max-width:767px){.visible-md.visible-xs{display:block!important}table.visible-md.visible-xs{display:table}tr.visible-md.visible-xs{display:table-row!important}th.visible-md.visible-xs,td.visible-md.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-md.visible-sm{display:block!important}table.visible-md.visible-sm{display:table}tr.visible-md.visible-sm{display:table-row!important}th.visible-md.visible-sm,td.visible-md.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}th.visible-md,td.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-md.visible-lg{display:block!important}table.visible-md.visible-lg{display:table}tr.visible-md.visible-lg{display:table-row!important}th.visible-md.visible-lg,td.visible-md.visible-lg{display:table-cell!important}}.visible-lg,tr.visible-lg,th.visible-lg,td.visible-lg{display:none!important}@media(max-width:767px){.visible-lg.visible-xs{display:block!important}table.visible-lg.visible-xs{display:table}tr.visible-lg.visible-xs{display:table-row!important}th.visible-lg.visible-xs,td.visible-lg.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-lg.visible-sm{display:block!important}table.visible-lg.visible-sm{display:table}tr.visible-lg.visible-sm{display:table-row!important}th.visible-lg.visible-sm,td.visible-lg.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-lg.visible-md{display:block!important}table.visible-lg.visible-md{display:table}tr.visible-lg.visible-md{display:table-row!important}th.visible-lg.visible-md,td.visible-lg.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}th.visible-lg,td.visible-lg{display:table-cell!important}}.hidden-xs{display:block!important}table.hidden-xs{display:table}tr.hidden-xs{display:table-row!important}th.hidden-xs,td.hidden-xs{display:table-cell!important}@media(max-width:767px){.hidden-xs,tr.hidden-xs,th.hidden-xs,td.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-xs.hidden-sm,tr.hidden-xs.hidden-sm,th.hidden-xs.hidden-sm,td.hidden-xs.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-xs.hidden-md,tr.hidden-xs.hidden-md,th.hidden-xs.hidden-md,td.hidden-xs.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-xs.hidden-lg,tr.hidden-xs.hidden-lg,th.hidden-xs.hidden-lg,td.hidden-xs.hidden-lg{display:none!important}}.hidden-sm{display:block!important}table.hidden-sm{display:table}tr.hidden-sm{display:table-row!important}th.hidden-sm,td.hidden-sm{display:table-cell!important}@media(max-width:767px){.hidden-sm.hidden-xs,tr.hidden-sm.hidden-xs,th.hidden-sm.hidden-xs,td.hidden-sm.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-sm,tr.hidden-sm,th.hidden-sm,td.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-sm.hidden-md,tr.hidden-sm.hidden-md,th.hidden-sm.hidden-md,td.hidden-sm.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-sm.hidden-lg,tr.hidden-sm.hidden-lg,th.hidden-sm.hidden-lg,td.hidden-sm.hidden-lg{display:none!important}}.hidden-md{display:block!important}table.hidden-md{display:table}tr.hidden-md{display:table-row!important}th.hidden-md,td.hidden-md{display:table-cell!important}@media(max-width:767px){.hidden-md.hidden-xs,tr.hidden-md.hidden-xs,th.hidden-md.hidden-xs,td.hidden-md.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-md.hidden-sm,tr.hidden-md.hidden-sm,th.hidden-md.hidden-sm,td.hidden-md.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-md,tr.hidden-md,th.hidden-md,td.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-md.hidden-lg,tr.hidden-md.hidden-lg,th.hidden-md.hidden-lg,td.hidden-md.hidden-lg{display:none!important}}.hidden-lg{display:block!important}table.hidden-lg{display:table}tr.hidden-lg{display:table-row!important}th.hidden-lg,td.hidden-lg{display:table-cell!important}@media(max-width:767px){.hidden-lg.hidden-xs,tr.hidden-lg.hidden-xs,th.hidden-lg.hidden-xs,td.hidden-lg.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-lg.hidden-sm,tr.hidden-lg.hidden-sm,th.hidden-lg.hidden-sm,td.hidden-lg.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-lg.hidden-md,tr.hidden-lg.hidden-md,th.hidden-lg.hidden-md,td.hidden-lg.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-lg,tr.hidden-lg,th.hidden-lg,td.hidden-lg{display:none!important}}.visible-print,tr.visible-print,th.visible-print,td.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}th.visible-print,td.visible-print{display:table-cell!important}.hidden-print,tr.hidden-print,th.hidden-print,td.hidden-print{display:none!important}} \ No newline at end of file diff --git a/docs/dist/fonts/glyphicons-halflings-regular.eot b/docs/dist/fonts/glyphicons-halflings-regular.eot deleted file mode 100644 index 423bd5d3a20b804f596e04e5cd02fb4f16cfcbc1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20290 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/dist/fonts/glyphicons-halflings-regular.ttf b/docs/dist/fonts/glyphicons-halflings-regular.ttf deleted file mode 100644 index a498ef4e7c8b556fc36f580c5ff524025bb11c84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41236 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 (this.$items.length - 1) || pos < 0) return - - if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) - if (activeIndex == pos) return this.pause().cycle() - - return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos])) - } - - Carousel.prototype.pause = function (e) { - e || (this.paused = true) - - if (this.$element.find('.next, .prev').length && $.support.transition.end) { - this.$element.trigger($.support.transition.end) - this.cycle(true) - } - - this.interval = clearInterval(this.interval) - - return this - } - - Carousel.prototype.next = function () { - if (this.sliding) return - return this.slide('next') - } - - Carousel.prototype.prev = function () { - if (this.sliding) return - return this.slide('prev') - } - - Carousel.prototype.slide = function (type, next) { - var $active = this.$element.find('.item.active') - var $next = next || $active[type]() - var isCycling = this.interval - var direction = type == 'next' ? 'left' : 'right' - var fallback = type == 'next' ? 'first' : 'last' - var that = this - - if (!$next.length) { - if (!this.options.wrap) return - $next = this.$element.find('.item')[fallback]() - } - - this.sliding = true - - isCycling && this.pause() - - var e = $.Event('slide.bs.carousel', { relatedTarget: $next[0], direction: direction }) - - if ($next.hasClass('active')) return - - if (this.$indicators.length) { - this.$indicators.find('.active').removeClass('active') - this.$element.one('slid.bs.carousel', function () { - var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()]) - $nextIndicator && $nextIndicator.addClass('active') - }) - } - - if ($.support.transition && this.$element.hasClass('slide')) { - this.$element.trigger(e) - if (e.isDefaultPrevented()) return - $next.addClass(type) - $next[0].offsetWidth // force reflow - $active.addClass(direction) - $next.addClass(direction) - $active - .one($.support.transition.end, function () { - $next.removeClass([type, direction].join(' ')).addClass('active') - $active.removeClass(['active', direction].join(' ')) - that.sliding = false - setTimeout(function () { that.$element.trigger('slid.bs.carousel') }, 0) - }) - .emulateTransitionEnd(600) - } else { - this.$element.trigger(e) - if (e.isDefaultPrevented()) return - $active.removeClass('active') - $next.addClass('active') - this.sliding = false - this.$element.trigger('slid.bs.carousel') - } - - isCycling && this.cycle() - - return this - } - - - // CAROUSEL PLUGIN DEFINITION - // ========================== - - var old = $.fn.carousel - - $.fn.carousel = function (option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.carousel') - var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) - var action = typeof option == 'string' ? option : options.slide - - if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) - if (typeof option == 'number') data.to(option) - else if (action) data[action]() - else if (options.interval) data.pause().cycle() - }) - } - - $.fn.carousel.Constructor = Carousel - - - // CAROUSEL NO CONFLICT - // ==================== - - $.fn.carousel.noConflict = function () { - $.fn.carousel = old - return this - } - - - // CAROUSEL DATA-API - // ================= - - $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) { - var $this = $(this), href - var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 - var options = $.extend({}, $target.data(), $this.data()) - var slideIndex = $this.attr('data-slide-to') - if (slideIndex) options.interval = false - - $target.carousel(options) - - if (slideIndex = $this.attr('data-slide-to')) { - $target.data('bs.carousel').to(slideIndex) - } - - e.preventDefault() - }) - - $(window).on('load', function () { - $('[data-ride="carousel"]').each(function () { - var $carousel = $(this) - $carousel.carousel($carousel.data()) - }) - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: collapse.js v3.0.3 - * http://getbootstrap.com/javascript/#collapse - * ======================================================================== - * Copyright 2013 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ======================================================================== */ - - -+function ($) { "use strict"; - - // COLLAPSE PUBLIC CLASS DEFINITION - // ================================ - - var Collapse = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, Collapse.DEFAULTS, options) - this.transitioning = null - - if (this.options.parent) this.$parent = $(this.options.parent) - if (this.options.toggle) this.toggle() - } - - Collapse.DEFAULTS = { - toggle: true - } - - Collapse.prototype.dimension = function () { - var hasWidth = this.$element.hasClass('width') - return hasWidth ? 'width' : 'height' - } - - Collapse.prototype.show = function () { - if (this.transitioning || this.$element.hasClass('in')) return - - var startEvent = $.Event('show.bs.collapse') - this.$element.trigger(startEvent) - if (startEvent.isDefaultPrevented()) return - - var actives = this.$parent && this.$parent.find('> .panel > .in') - - if (actives && actives.length) { - var hasData = actives.data('bs.collapse') - if (hasData && hasData.transitioning) return - actives.collapse('hide') - hasData || actives.data('bs.collapse', null) - } - - var dimension = this.dimension() - - this.$element - .removeClass('collapse') - .addClass('collapsing') - [dimension](0) - - this.transitioning = 1 - - var complete = function () { - this.$element - .removeClass('collapsing') - .addClass('in') - [dimension]('auto') - this.transitioning = 0 - this.$element.trigger('shown.bs.collapse') - } - - if (!$.support.transition) return complete.call(this) - - var scrollSize = $.camelCase(['scroll', dimension].join('-')) - - this.$element - .one($.support.transition.end, $.proxy(complete, this)) - .emulateTransitionEnd(350) - [dimension](this.$element[0][scrollSize]) - } - - Collapse.prototype.hide = function () { - if (this.transitioning || !this.$element.hasClass('in')) return - - var startEvent = $.Event('hide.bs.collapse') - this.$element.trigger(startEvent) - if (startEvent.isDefaultPrevented()) return - - var dimension = this.dimension() - - this.$element - [dimension](this.$element[dimension]()) - [0].offsetHeight - - this.$element - .addClass('collapsing') - .removeClass('collapse') - .removeClass('in') - - this.transitioning = 1 - - var complete = function () { - this.transitioning = 0 - this.$element - .trigger('hidden.bs.collapse') - .removeClass('collapsing') - .addClass('collapse') - } - - if (!$.support.transition) return complete.call(this) - - this.$element - [dimension](0) - .one($.support.transition.end, $.proxy(complete, this)) - .emulateTransitionEnd(350) - } - - Collapse.prototype.toggle = function () { - this[this.$element.hasClass('in') ? 'hide' : 'show']() - } - - - // COLLAPSE PLUGIN DEFINITION - // ========================== - - var old = $.fn.collapse - - $.fn.collapse = function (option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.collapse') - var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) - - if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.collapse.Constructor = Collapse - - - // COLLAPSE NO CONFLICT - // ==================== - - $.fn.collapse.noConflict = function () { - $.fn.collapse = old - return this - } - - - // COLLAPSE DATA-API - // ================= - - $(document).on('click.bs.collapse.data-api', '[data-toggle=collapse]', function (e) { - var $this = $(this), href - var target = $this.attr('data-target') - || e.preventDefault() - || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 - var $target = $(target) - var data = $target.data('bs.collapse') - var option = data ? 'toggle' : $this.data() - var parent = $this.attr('data-parent') - var $parent = parent && $(parent) - - if (!data || !data.transitioning) { - if ($parent) $parent.find('[data-toggle=collapse][data-parent="' + parent + '"]').not($this).addClass('collapsed') - $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed') - } - - $target.collapse(option) - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: dropdown.js v3.0.3 - * http://getbootstrap.com/javascript/#dropdowns - * ======================================================================== - * Copyright 2013 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ======================================================================== */ - - -+function ($) { "use strict"; - - // DROPDOWN CLASS DEFINITION - // ========================= - - var backdrop = '.dropdown-backdrop' - var toggle = '[data-toggle=dropdown]' - var Dropdown = function (element) { - $(element).on('click.bs.dropdown', this.toggle) - } - - Dropdown.prototype.toggle = function (e) { - var $this = $(this) - - if ($this.is('.disabled, :disabled')) return - - var $parent = getParent($this) - var isActive = $parent.hasClass('open') - - clearMenus() - - if (!isActive) { - if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { - // if mobile we use a backdrop because click events don't delegate - $(' - - - - - - - - - - - - - - - - diff --git a/docs/howto/geolite.html b/docs/howto/geolite.html deleted file mode 100644 index c39b954..0000000 --- a/docs/howto/geolite.html +++ /dev/null @@ -1,228 +0,0 @@ - - - - - - - - - - - pgloader - - - - - - - - - - - - - - -
-
-
-
-

Loading MaxMind Geolite Data with pgloader

The MaxMind provides a free dataset for geolocation, which is quite popular. Using pgloader you can download the lastest version of it, extract the CSV files from the archive and load their content into your database directly.

The Command

To load data with pgloader you need to define in a command the operations in some details. Here's our example for loading the Geolite data:

/*  
- * Loading from a ZIP archive containing CSV files. The full test can be  
- * done with using the archive found at  
- * http://geolite.maxmind.com/download/geoip/database/GeoLiteCity_CSV/GeoLiteCity-latest.zip  
- *  
- * And a very light version of this data set is found at  
- * http://pgsql.tapoueh.org/temp/foo.zip for quick testing.  
- */  
- 
-LOAD ARCHIVE  
-   FROM http://geolite.maxmind.com/download/geoip/database/GeoLiteCity_CSV/GeoLiteCity-latest.zip  
-   INTO postgresql:///ip4r  
- 
-   BEFORE LOAD DO  
-     $$ create extension if not exists ip4r; $$,  
-     $$ create schema if not exists geolite; $$,  
-     $$ create table if not exists geolite.location  
-       (  
-          locid      integer primary key,  
-          country    text,  
-          region     text,  
-          city       text,  
-          postalcode text,  
-          location   point,  
-          metrocode  text,  
-          areacode   text  
-       );  
-     $$,  
-     $$ create table if not exists geolite.blocks  
-       (  
-          iprange    ip4r,  
-          locid      integer  
-       );  
-     $$,  
-     $$ drop index if exists geolite.blocks_ip4r_idx; $$,  
-     $$ truncate table geolite.blocks, geolite.location cascade; $$  
- 
-   LOAD CSV  
-        FROM FILENAME MATCHING ~/GeoLiteCity-Location.csv/  
-             WITH ENCODING iso-8859-1  
-             (  
-                locId,  
-                country,  
-                region     null if blanks,  
-                city       null if blanks,  
-                postalCode null if blanks,  
-                latitude,  
-                longitude,  
-                metroCode  null if blanks,  
-                areaCode   null if blanks  
-             )  
-        INTO postgresql:///ip4r?geolite.location  
-             (  
-                locid,country,region,city,postalCode,  
-                location point using (format nil "(~a,~a)" longitude latitude),  
-                metroCode,areaCode  
-             )  
-        WITH skip header = 2,  
-             fields optionally enclosed by '"',  
-             fields escaped by double-quote,  
-             fields terminated by ','  
- 
-  AND LOAD CSV  
-        FROM FILENAME MATCHING ~/GeoLiteCity-Blocks.csv/  
-             WITH ENCODING iso-8859-1  
-             (  
-                startIpNum, endIpNum, locId  
-             )  
-        INTO postgresql:///ip4r?geolite.blocks  
-             (  
-                iprange ip4r using (ip-range startIpNum endIpNum),  
-                locId  
-             )  
-        WITH skip header = 2,  
-             fields optionally enclosed by '"',  
-             fields escaped by double-quote,  
-             fields terminated by ','  
- 
-   FINALLY DO  
-     $$ create index blocks_ip4r_idx on geolite.blocks using gist(iprange); $$; 

You can see the full list of options in the pgloader reference manual, with a complete description of the options you see here.

Note that while the Geolite data is using a pair of integers (start, end) to represent ipv4 data, we use the very poweful ip4r PostgreSQL Extension instead.

The transformation from a pair of integers into an IP is done dynamically by the pgloader process.

Also, the location is given as a pair of float columns for the longitude and the latitude where PostgreSQL offers the point datatype, so the pgloader command here will actually transform the data on the fly to use the appropriate data type and its input representation.

Loading the data

Here's how to start loading the data. Note that the ouput here has been edited so as to facilitate its browsing online.

$ pgloader archive.load  
-... LOG Starting pgloader, log system is ready.  
-... LOG Parsing commands from file "/Users/dim/dev/pgloader/test/archive.load"  
-... LOG Fetching 'http://geolite.maxmind.com/download/geoip/database/GeoLiteCity_CSV/GeoLiteCity-latest.zip'  
-... LOG Extracting files from archive '//private/var/folders/w7/9n8v8pw54t1gngfff0lj16040000gn/T/pgloader//GeoLiteCity-latest.zip'  
- 
-       table name       read   imported     errors            time  
------------------  ---------  ---------  ---------  --------------  
-         download          0          0          0         11.592s  
-          extract          0          0          0          1.012s  
-      before load          6          6          0          0.019s  
------------------  ---------  ---------  ---------  --------------  
- geolite.location     470387     470387          0          7.743s  
-   geolite.blocks    1903155    1903155          0         16.332s  
------------------  ---------  ---------  ---------  --------------  
-          finally          1          1          0         31.692s  
------------------  ---------  ---------  ---------  --------------  
-Total import time    2373542    2373542          0        1m8.390s 

The timing of course includes the transformation of the 1.9 million pairs of integer into a single ipv4 range each. The finally step consists of creating the GiST specialized index as given in the main command:

CREATE INDEX blocks_ip4r_idx ON geolite.blocks USING gist(iprange); 

That index will then be used to speed up queries wanting to find which recorded geolocation contains a specific IP address:

ip4r> select *  
-        from      geolite.location l  
-             join geolite.blocks b using(locid)  
-       where iprange >>= '8.8.8.8';  
- 
--[ RECORD 1 ]------------------  
-locid      | 223  
-country    | US  
-region     |  
-city       |  
-postalcode |  
-location   | (-97,38)  
-metrocode  |  
-areacode   |  
-iprange    | 8.8.8.8-8.8.37.255  
- 
-Time: 0.747 ms 
-
-
- - - - -
- - - - - - - - - - - diff --git a/docs/howto/header.html b/docs/howto/header.html deleted file mode 100644 index 2ba4094..0000000 --- a/docs/howto/header.html +++ /dev/null @@ -1,84 +0,0 @@ - - - - - - - - - - - pgloader - - - - - - - - - - - - - - -
-
-
-
diff --git a/docs/howto/mysql.html b/docs/howto/mysql.html deleted file mode 100644 index dcaea15..0000000 --- a/docs/howto/mysql.html +++ /dev/null @@ -1,208 +0,0 @@ - - - - - - - - - - - pgloader - - - - - - - - - - - - - - -
-
-
-
-

Migrating from MySQL to PostgreSQL

If you want to migrate your data over to PostgreSQL from MySQL then pgloader is the tool of choice!

Most tools around are skipping the main problem with migrating from MySQL, which is to do with the type casting and data sanitizing that needs to be done. pgloader will not leave you alone on those topics.

In a Single Command Line

As an example, we will use the f1db database from which which provides a historical record of motor racing data for non-commercial purposes. You can either use their API or download the whole database at http://ergast.com/downloads/f1db.sql.gz. Once you've done that load the database in MySQL:

$ mysql -u root  
-> create database f1db;  
-> source f1db.sql 

Now let's migrate this database into PostgreSQL in a single command line:

$ createdb f1db  
-$ pgloader mysql://root@localhost/f1db pgsql:///f1db 

Done! All with schema, table definitions, constraints, indexes, primary keys, auto_increment columns turned into bigserial , foreign keys, comments, and if you had some MySQL default values such as ON UPDATE CURRENT_TIMESTAMP they would have been translated to a PostgreSQL before update trigger automatically.

$ pgloader mysql://root@localhost/f1db pgsql:///f1db  
-2017-06-16T08:56:14.064000+02:00 LOG Main logs in '/private/tmp/pgloader/pgloader.log'  
-2017-06-16T08:56:14.068000+02:00 LOG Data errors in '/private/tmp/pgloader/'  
-2017-06-16T08:56:19.542000+02:00 LOG report summary reset  
-               table name       read   imported     errors      total time  
--------------------------  ---------  ---------  ---------  --------------  
-          fetch meta data         33         33          0          0.365s  
-           Create Schemas          0          0          0          0.007s  
-         Create SQL Types          0          0          0          0.006s  
-            Create tables         26         26          0          0.068s  
-           Set Table OIDs         13         13          0          0.012s  
--------------------------  ---------  ---------  ---------  --------------  
-  f1db.constructorresults      11011      11011          0          0.205s  
-            f1db.circuits         73         73          0          0.150s  
-        f1db.constructors        208        208          0          0.059s  
-f1db.constructorstandings      11766      11766          0          0.365s  
-             f1db.drivers        841        841          0          0.268s  
-            f1db.laptimes     413578     413578          0          2.892s  
-     f1db.driverstandings      31420      31420          0          0.583s  
-            f1db.pitstops       5796       5796          0          2.154s  
-               f1db.races        976        976          0          0.227s  
-          f1db.qualifying       7257       7257          0          0.228s  
-             f1db.seasons         68         68          0          0.527s  
-             f1db.results      23514      23514          0          0.658s  
-              f1db.status        133        133          0          0.130s  
--------------------------  ---------  ---------  ---------  --------------  
-  COPY Threads Completion         39         39          0          4.303s  
-           Create Indexes         20         20          0          1.497s  
-   Index Build Completion         20         20          0          0.214s  
-          Reset Sequences          0         10          0          0.058s  
-             Primary Keys         13         13          0          0.012s  
-      Create Foreign Keys          0          0          0          0.000s  
-          Create Triggers          0          0          0          0.001s  
-         Install Comments          0          0          0          0.000s  
--------------------------  ---------  ---------  ---------  --------------  
-        Total import time     506641     506641          0          5.547s 

You may need to have special cases to take care of tho, or views that you want to materialize while doing the migration. In advanced case you can use the pgloader command.

The Command

To load data with pgloader you need to define in a command the operations in some details. Here's our example for loading the MySQL Sakila Sample Database:

Here's our command:

load database  
-     from      mysql://root@localhost/sakila  
-     into postgresql:///sakila  
- 
- WITH include drop, create tables, no truncate,  
-      create indexes, reset sequences, foreign keys  
- 
-  SET maintenance_work_mem to '128MB', work_mem to '12MB', search_path to 'sakila'  
- 
- CAST type datetime to timestamptz  
-                drop default drop not null using zero-dates-to-null,  
-      type date drop not null drop default using zero-dates-to-null  
- 
- MATERIALIZE VIEWS film_list, staff_list  
- 
- -- INCLUDING ONLY TABLE NAMES MATCHING ~/film/, 'actor'  
- -- EXCLUDING TABLE NAMES MATCHING ~<ory>  
- 
- BEFORE LOAD DO  
- $$ create schema if not exists sakila; $$; 

You can see the full list of options in the pgloader reference manual, with a complete description of the options you see here.

Note that here pgloader will benefit from the meta-data information found in the MySQL database to create a PostgreSQL database capable of hosting the data as described, then load the data.

In particular, some specific casting rules are given here, to cope with date values such as 0000-00-00 that MySQL allows and PostgreSQL rejects for not existing in our calendar. It's possible to add per-column casting rules too, which is useful is some of your tinyint are in fact smallint while some others are in fact boolean values.

Finaly note that we are using the MATERIALIZE VIEWS clause of pgloader: the selected views here will be migrated over to PostgreSQL with their contents.

It's possible to use the MATERIALIZE VIEWS clause and give both the name and the SQL (in MySQL dialect) definition of view, then pgloader creates the view before loading the data, then drops it again at the end.

Loading the data

Let's start the pgloader command with our sakila.load command file:

$ pgloader sakila.load  
-... LOG Starting pgloader, log system is ready.  
-... LOG Parsing commands from file "/Users/dim/dev/pgloader/test/sakila.load"  
-   <WARNING: table "xxx" does not exists have been edited away>  
- 
-            table name       read   imported     errors            time  
-----------------------  ---------  ---------  ---------  --------------  
-           before load          1          1          0          0.007s  
-       fetch meta data         45         45          0          0.402s  
-          create, drop          0         36          0          0.208s  
-----------------------  ---------  ---------  ---------  --------------  
-                 actor        200        200          0          0.071s  
-               address        603        603          0          0.035s  
-              category         16         16          0          0.018s  
-                  city        600        600          0          0.037s  
-               country        109        109          0          0.023s  
-              customer        599        599          0          0.073s  
-                  film       1000       1000          0          0.135s  
-            film_actor       5462       5462          0          0.236s  
-         film_category       1000       1000          0          0.070s  
-             film_text       1000       1000          0          0.080s  
-             inventory       4581       4581          0          0.136s  
-              language          6          6          0          0.036s  
-               payment      16049      16049          0          0.539s  
-                rental      16044      16044          0          0.648s  
-                 staff          2          2          0          0.041s  
-                 store          2          2          0          0.036s  
-             film_list        997        997          0          0.247s  
-            staff_list          2          2          0          0.135s  
-Index Build Completion          0          0          0          0.000s  
-----------------------  ---------  ---------  ---------  --------------  
-        Create Indexes         41         41          0          0.964s  
-       Reset Sequences          0          1          0          0.035s  
-          Foreign Keys         22         22          0          0.254s  
-----------------------  ---------  ---------  ---------  --------------  
-     Total import time      48272      48272          0          3.502s 

The WARNING messages we see here are expected as the PostgreSQL database is empty when running the command, and pgloader is using the SQL commands DROP TABLE IF EXISTS when the given command uses the include drop option.

Note that the output of the command has been edited to facilitate its browsing online.

-
-
- - - - -
- - - - - - - - - - - diff --git a/docs/howto/pgloader.1.html b/docs/howto/pgloader.1.html deleted file mode 100644 index a4cfc21..0000000 --- a/docs/howto/pgloader.1.html +++ /dev/null @@ -1,412 +0,0 @@ - - - - - - - - - - - pgloader - - - - - - - - - - - - - - -
-
-
-
-

pgloader(1) -- PostgreSQL data loader

SYNOPSIS

pgloader [<options>] [<command-file>]...  
-pgloader [<options>] SOURCE TARGET 

DESCRIPTION

pgloader loads data from various sources into PostgreSQL. It can transform the data it reads on the fly and submit raw SQL before and after the loading. It uses the COPY PostgreSQL protocol to stream the data into the server, and manages errors by filling a pair of reject.dat and reject.log files.

pgloader operates either using commands which are read from files:

pgloader commands.load 

or by using arguments and options all provided on the command line:

pgloader SOURCE TARGET 

ARGUMENTS

The pgloader arguments can be as many load files as needed, or a couple of connection strings to a specific input file.

SOURCE CONNECTION STRING

The source connection string format is as follows:

format:///absolute/path/to/file.ext  
-format://./relative/path/to/file.ext 

Where format might be one of csv, fixed, copy, dbf, db3 or ixf.

db://user:pass@host:port/dbname 

Where db might be of sqlite, mysql or mssql.

When using a file based source format, pgloader also support natively fetching the file from an http location and decompressing an archive if needed. In that case it's necessary to use the --type option to specify the expected format of the file. See the examples below.

Also note that some file formats require describing some implementation details such as columns to be read and delimiters and quoting when loading from csv.

For more complex loading scenarios, you will need to write a full fledge load command in the syntax described later in this document.

TARGET CONNECTION STRING

The target connection string format is described in details later in this document, see Section Connection String.

OPTIONS

INQUIRY OPTIONS

Use these options when you want to know more about how to use pgloader, as those options will cause pgloader not to load any data.

  • -h, --help: Show command usage summary and exit.

  • -V, --version: Show pgloader version string and exit.

  • -E, --list-encodings: List known encodings in this version of pgloader.

  • -U, --upgrade-config: Parse given files in the command line as pgloader.conf files with the INI syntax that was in use in pgloader versions 2.x, and output the new command syntax for pgloader on standard output.

GENERAL OPTIONS

Those options are meant to tweak pgloader behavior when loading data.

  • -v, --verbose: Be verbose.

  • -q, --quiet: Be quiet.

  • -d, --debug: Show debug level information messages.

  • -D, --root-dir: Set the root working directory (default to "/tmp/pgloader").

  • -L, --logfile: Set the pgloader log file (default to "/tmp/pgloader.log").

  • --log-min-messages: Minimum level of verbosity needed for log message to make it to the logfile. One of critical, log, error, warning, notice, info or debug.

  • --client-min-messages: Minimum level of verbosity needed for log message to make it to the console. One of critical, log, error, warning, notice, info or debug.

  • -S, --summary: A filename where to copy the summary output. When relative, the filename is expanded into *root-dir*.

  • The format of the filename defaults to being human readable. It is possible to have the output in machine friendly formats such as CSV, COPY (PostgreSQL's own COPY format) or JSON by specifying a filename with the extension resp. .csv, .copy or .json.

  • -l <file>, --load-lisp-file <file>: Specify a lisp to compile and load into the pgloader image before reading the commands, allowing to define extra transformation function. Those functions should be defined in the pgloader.transforms package. This option can appear more than once in the command line.

  • --dry-run:

    Allow testing a .load file without actually trying to load any data. It's useful to debug it until it's ok, in particular to fix connection strings.

  • --on-error-stop

    Alter pgloader behavior: rather than trying to be smart about error handling and continue loading good data, separating away the bad one, just stop as soon as PostgreSQL refuses anything sent to it. Useful to debug data processing, transformation function and specific type casting.

  • --self-upgrade <directory>:

    Specify a where to find pgloader sources so that one of the very first things it does is dynamically loading-in (and compiling to machine code) another version of itself, usually a newer one like a very recent git checkout.

COMMAND LINE ONLY OPERATIONS

Those options are meant to be used when using pgloader from the command line only, rather than using a command file and the rich command clauses and parser. In simple cases, it can be much easier to use the SOURCE and TARGET directly on the command line, then tweak the loading with those options:

  • --with "option":

    Allows setting options from the command line. You can use that option as many times as you want. The option arguments must follow the WITH clause for the source type of the SOURCE specification, as described later in this document.

  • --set "guc_name='value'"

    Allows setting PostgreSQL configuration from the command line. Note that the option parsing is the same as when used from the SET command clause, in particular you must enclose the guc value with single-quotes.

  • --field "..."

    Allows setting a source field definition. Fields are accumulated in the order given on the command line. It's possible to either use a --field option per field in the source file, or to separate field definitions by a comma, as you would do in the HAVING FIELDS clause.

  • --cast "..."

    Allows setting a specific casting rule for loading the data.

  • --type csv|fixed|db3|ixf|sqlite|mysql|mssql

    Allows forcing the source type, in case when the SOURCE parsing isn't satisfying.

  • --encoding <encoding>

    Set the encoding of the source file to load data from.

  • --before <filename>

    Parse given filename for SQL queries and run them against the target database before loading the data from the source. The queries are parsed by pgloader itself: they need to be terminated by a semi-colon (;) and the file may include \i or \ir commands to include another file.

  • --after <filename>

    Parse given filename for SQL queries and run them against the target database after having loaded the data from the source. The queries are parsed in the same way as with the --before option, see above.

MORE DEBUG INFORMATION

To get the maximum amount of debug information, you can use both the --verbose and the --debug switches at the same time, which is equivalent to saying --client-min-messages data. Then the log messages will show the data being processed, in the cases where the code has explicit support for it.

USAGE EXAMPLES

Review the command line options and pgloader's version:

pgloader --help  
-pgloader --version 

Loading from a complex command

Use the command file as the pgloader command argument, pgloader will parse that file and execute the commands found in it:

pgloader --verbose ./test/csv-districts.load 

CSV

Load data from a CSV file into a pre-existing table in your database, having pgloader guess the CSV properties (separator, quote and escape character):

pgloader ./test/data/matching-1.csv pgsql:///pgloader?tablename=matching 

Load data from a CSV file into a pre-existing table in your database, with expanded options:

pgloader --type csv                                   \  
-         --field id --field field                     \  
-         --with truncate                              \  
-         --with "fields terminated by ','"            \  
-         ./test/data/matching-1.csv                   \  
-         postgres:///pgloader?tablename=matching 

In that example the whole loading is driven from the command line, bypassing the need for writing a command in the pgloader command syntax entirely. As there's no command though, the extra inforamtion needed must be provided on the command line using the --type and --field and --with switches.

For documentation about the available syntaxes for the --field and --with switches, please refer to the CSV section later in the man page.

Note also that the PostgreSQL URI includes the target tablename.

Reading from STDIN

File based pgloader sources can be loaded from the standard input, as in the following example:

pgloader --type csv                                         \  
-         --field "usps,geoid,aland,awater,aland_sqmi,awater_sqmi,intptlat,intptlong" \  
-         --with "skip header = 1"                          \  
-         --with "fields terminated by '\t'"                \  
-         -                                                 \  
-         postgresql:///pgloader?districts_longlat          \  
-         < test/data/2013_Gaz_113CDs_national.txt 

The dash (-) character as a source is used to mean standard input, as usual in Unix command lines. It's possible to stream compressed content to pgloader with this technique, using the Unix pipe:

gunzip -c source.gz | pgloader --type csv ... - pgsql:///target?foo 

Loading from CSV available through HTTP

The same command as just above can also be run if the CSV file happens to be found on a remote HTTP location:

pgloader --type csv                                                     \  
-         --field "usps,geoid,aland,awater,aland_sqmi,awater_sqmi,intptlat,intptlong" \  
-         --with "skip header = 1"                                       \  
-         --with "fields terminated by '\t'"                             \  
-         http://pgsql.tapoueh.org/temp/2013_Gaz_113CDs_national.txt     \  
-         postgresql:///pgloader?districts_longlat 

Some more options have to be used in that case, as the file contains a one-line header (most commonly that's column names, could be a copyright notice). Also, in that case, we specify all the fields right into a single --field option argument.

Again, the PostgreSQL target connection string must contain the tablename option and you have to ensure that the target table exists and may fit the data. Here's the SQL command used in that example in case you want to try it yourself:

create table districts_longlat  
-(  
-         usps        text,  
-         geoid       text,  
-         aland       bigint,  
-         awater      bigint,  
-         aland_sqmi  double precision,  
-         awater_sqmi double precision,  
-         intptlat    double precision,  
-         intptlong   double precision  
-); 

Also notice that the same command will work against an archived version of the same data, e.g. http://pgsql.tapoueh.org/temp/2013Gaz113CDs_national.txt.gz.

Finally, it's important to note that pgloader first fetches the content from the HTTP URL it to a local file, then expand the archive when it's recognized to be one, and only then processes the locally expanded file.

In some cases, either because pgloader has no direct support for your archive format or maybe because expanding the archive is not feasible in your environment, you might want to stream the content straight from its remote location into PostgreSQL. Here's how to do that, using the old battle tested Unix Pipes trick:

curl http://pgsql.tapoueh.org/temp/2013_Gaz_113CDs_national.txt.gz \  
-| gunzip -c                                                        \  
-| pgloader --type csv                                              \  
-           --field "usps,geoid,aland,awater,aland_sqmi,awater_sqmi,intptlat,intptlong"  
-           --with "skip header = 1"                                \  
-           --with "fields terminated by '\t'"                      \  
-           -                                                       \  
-           postgresql:///pgloader?districts_longlat 

Now the OS will take care of the streaming and buffering between the network and the commands and pgloader will take care of streaming the data down to PostgreSQL.

Migrating from SQLite

The following command will open the SQLite database, discover its tables definitions including indexes and foreign keys, migrate those definitions while casting the data type specifications to their PostgreSQL equivalent and then migrate the data over:

createdb newdb  
-pgloader ./test/sqlite/sqlite.db postgresql:///newdb 

Migrating from MySQL

Just create a database where to host the MySQL data and definitions and have pgloader do the migration for you in a single command line:

createdb pagila  
-pgloader mysql://user@localhost/sakila postgresql:///pagila 

Fetching an archived DBF file from a HTTP remote location

It's possible for pgloader to download a file from HTTP, unarchive it, and only then open it to discover the schema then load the data:

createdb foo  
-pgloader --type dbf http://www.insee.fr/fr/methodes/nomenclatures/cog/telechargement/2013/dbf/historiq2013.zip postgresql:///foo 

Here it's not possible for pgloader to guess the kind of data source it's being given, so it's necessary to use the --type command line switch.

BATCHES AND RETRY BEHAVIOUR

To load data to PostgreSQL, pgloader uses the COPY streaming protocol. While this is the faster way to load data, COPY has an important drawback: as soon as PostgreSQL emits an error with any bit of data sent to it, whatever the problem is, the whole data set is rejected by PostgreSQL.

To work around that, pgloader cuts the data into batches of 25000 rows each, so that when a problem occurs it's only impacting that many rows of data. Each batch is kept in memory while the COPY streaming happens, in order to be able to handle errors should some happen.

When PostgreSQL rejects the whole batch, pgloader logs the error message then isolates the bad row(s) from the accepted ones by retrying the batched rows in smaller batches. To do that, pgloader parses the CONTEXT error message from the failed COPY, as the message contains the line number where the error was found in the batch, as in the following example:

CONTEXT: COPY errors, line 3, column b: "2006-13-11" 

Using that information, pgloader will reload all rows in the batch before the erroneous one, log the erroneous one as rejected, then try loading the remaining of the batch in a single attempt, which may or may not contain other erroneous data.

At the end of a load containing rejected rows, you will find two files in the root-dir location, under a directory named the same as the target database of your setup. The filenames are the target table, and their extensions are .dat for the rejected data and .log for the file containing the full PostgreSQL client side logs about the rejected data.

The .dat file is formatted in PostgreSQL the text COPY format as documented in http://www.postgresql.org/docs/9.2/static/sql-copy.html#AEN66609.

A NOTE ABOUT PERFORMANCE

pgloader has been developed with performance in mind, to be able to cope with ever growing needs in loading large amounts of data into PostgreSQL.

The basic architecture it uses is the old Unix pipe model, where a thread is responsible for loading the data (reading a CSV file, querying MySQL, etc) and fills pre-processed data into a queue. Another threads feeds from the queue, apply some more transformations to the input data and stream the end result to PostgreSQL using the COPY protocol.

When given a file that the PostgreSQL COPY command knows how to parse, and if the file contains no erroneous data, then pgloader will never be as fast as just using the PostgreSQL COPY command.

Note that while the COPY command is restricted to read either from its standard input or from a local file on the server's file system, the command line tool psql implements a \copy command that knows how to stream a file local to the client over the network and into the PostgreSQL server, using the same protocol as pgloader uses.

A NOTE ABOUT PARALLELISM

pgloader uses several concurrent tasks to process the data being loaded:

  • a reader task reads the data in and pushes it to a queue,

  • at last one write task feeds from the queue and formats the raw into the PostgreSQL COPY format in batches (so that it's possible to then retry a failed batch without reading the data from source again), and then sends the data to PostgreSQL using the COPY protocol.

The parameter workers allows to control how many worker threads are allowed to be active at any time (that's the parallelism level); and the parameter concurrency allows to control how many tasks are started to handle the data (they may not all run at the same time, depending on the workers setting).

We allow workers simultaneous workers to be active at the same time in the context of a single table. A single unit of work consist of several kinds of workers:

  • a reader getting raw data from the source,
  • N writers preparing and sending the data down to PostgreSQL.

The N here is setup to the concurrency parameter: with a CONCURRENCY of 2, we start (+ 1 2) = 3 concurrent tasks, with a concurrency of 4 we start (+ 1 4) = 9 concurrent tasks, of which only workers may be active simultaneously.

The defaults are workers = 4, concurrency = 1 when loading from a database source, and workers = 8, concurrency = 2 when loading from something else (currently, a file). Those defaults are arbitrary and waiting for feedback from users, so please consider providing feedback if you play with the settings.

As the CREATE INDEX threads started by pgloader are only waiting until PostgreSQL is done with the real work, those threads are NOT counted into the concurrency levels as detailed here.

By default, as many CREATE INDEX threads as the maximum number of indexes per table are found in your source schema. It is possible to set the max parallel create index WITH option to another number in case there's just too many of them to create.

SOURCE FORMATS

pgloader supports the following input formats:

  • csv, which includes also tsv and other common variants where you can change the separator and the quoting rules and how to escape the quotes themselves;

  • fixed columns file, where pgloader is flexible enough to accomodate with source files missing columns (ragged fixed length column files do exist);

  • PostgreSLQ COPY formatted files, following the COPY TEXT documentation of PostgreSQL, such as the reject files prepared by pgloader;

  • dbase files known as db3 or dbf file;

  • ixf formated files, ixf being a binary storage format from IBM;

  • sqlite databases with fully automated discovery of the schema and advanced cast rules;

  • mysql databases with fully automated discovery of the schema and advanced cast rules;

  • MS SQL databases with fully automated discovery of the schema and advanced cast rules.

PGLOADER COMMANDS SYNTAX

pgloader implements a Domain Specific Language allowing to setup complex data loading scripts handling computed columns and on-the-fly sanitization of the input data. For more complex data loading scenarios, you will be required to learn that DSL's syntax. It's meant to look familiar to DBA by being inspired by SQL where it makes sense, which is not that much after all.

The pgloader commands follow the same global grammar rules. Each of them might support only a subset of the general options and provide specific options.

LOAD <source-type>  
-     FROM <source-url>     [ HAVING FIELDS <source-level-options> ]  
-	 INTO <postgresql-url> [ TARGET COLUMNS <columns-and-options> ]  
- 
-[ WITH <load-options> ]  
- 
-[ SET <postgresql-settings> ]  
- 
-[ BEFORE LOAD [ DO <sql statements> | EXECUTE <sql file> ] ... ]  
-[  AFTER LOAD [ DO <sql statements> | EXECUTE <sql file> ] ... ]  
-; 

The main clauses are the LOAD, FROM, INTO and WITH clauses that each command implements. Some command then implement the SET command, or some specific clauses such as the CAST clause.

COMMON CLAUSES

Some clauses are common to all commands:

  • FROM

    The FROM clause specifies where to read the data from, and each command introduces its own variant of sources. For instance, the CSV source supports inline, stdin, a filename, a quoted filename, and a FILENAME MATCHING clause (see above); whereas the MySQL source only supports a MySQL database URI specification.

  • In all cases, the FROM clause is able to read its value from an environment variable when using the form GETENV 'varname'.

  • INTO
  • The PostgreSQL connection URI must contains the name of the target table where to load the data into. That table must have already been created in PostgreSQL, and the name might be schema qualified.

    The INTO target database connection URI can be parsed from the value of an environment variable when using the form GETENV 'varname'.

    Then INTO option also supports an optional comma separated list of target columns, which are either the name of an input field or the white space separated list of the target column name, its PostgreSQL data type and a USING expression.

    The USING expression can be any valid Common Lisp form and will be read with the current package set to pgloader.transforms, so that you can use functions defined in that package, such as functions loaded dynamically with the --load command line parameter.

    Each USING expression is compiled at runtime to native code.

    This feature allows pgloader to load any number of fields in a CSV file into a possibly different number of columns in the database, using custom code for that projection.

  • WITH

    Set of options to apply to the command, using a global syntax of either:

    • key = value
    • use option
    • do not use option
  • See each specific command for details.

    All data sources specific commands support the following options:

    • on error stop
    • batch rows = R
    • batch size = ... MB
    • prefetch rows = ...

    See the section BATCH BEHAVIOUR OPTIONS for more details.

    In addition, the following settings are available:

    • workers = W
    • concurrency = C
    • max parallel create index = I

    See section A NOTE ABOUT PARALLELISM for more details.

  • SET

    This clause allows to specify session parameters to be set for all the sessions opened by pgloader. It expects a list of parameter name, the equal sign, then the single-quoted value as a comma separated list.

  • The names and values of the parameters are not validated by pgloader, they are given as-is to PostgreSQL.

  • BEFORE LOAD DO
  • You can run SQL queries against the database before loading the data from the CSV file. Most common SQL queries are CREATE TABLE IF NOT EXISTS so that the data can be loaded.

    Each command must be dollar-quoted: it must begin and end with a double dollar sign, $$. Dollar-quoted queries are then comma separated. No extra punctuation is expected after the last SQL query.

  • BEFORE LOAD EXECUTE

    Same behaviour as in the BEFORE LOAD DO clause. Allows you to read the SQL queries from a SQL file. Implements support for PostgreSQL dollar-quoting and the \i and \ir include facilities as in psql batch mode (where they are the same thing).

  • AFTER LOAD DO

    Same format as BEFORE LOAD DO, the dollar-quoted queries found in that section are executed once the load is done. That's the right time to create indexes and constraints, or re-enable triggers.

  • AFTER LOAD EXECUTE

    Same behaviour as in the AFTER LOAD DO clause. Allows you to read the SQL queries from a SQL file. Implements support for PostgreSQL dollar-quoting and the \i and \ir include facilities as in psql batch mode (where they are the same thing).

Connection String

The <postgresql-url> parameter is expected to be given as a Connection URI as documented in the PostgreSQL documentation at http://www.postgresql.org/docs/9.3/static/libpq-connect.html#LIBPQ-CONNSTRING.

postgresql://[user[:password]@][netloc][:port][/dbname][?option=value&...] 

Where:

  • user

    Can contain any character, including colon (:) which must then be doubled (::) and at-sign (@) which must then be doubled (@@).

  • When omitted, the user name defaults to the value of the PGUSER environment variable, and if it is unset, the value of the USER environment variable.

  • password
  • Can contain any character, including the at sign (@) which must then be doubled (@@). To leave the password empty, when the user name ends with at at sign, you then have to use the syntax user:@.

    When omitted, the password defaults to the value of the PGPASSWORD environment variable if it is set, otherwise the password is left unset.

  • netloc

    Can be either a hostname in dotted notation, or an ipv4, or an Unix domain socket path. Empty is the default network location, under a system providing unix domain socket that method is preferred, otherwise the netloc default to localhost.

  • It's possible to force the unix domain socket path by using the syntax unix:/path/to/where/the/socket/file/is, so to force a non default socket path and a non default port, you would have:

    postgresql://unix:/tmp:54321/dbname 

    The netloc defaults to the value of the PGHOST environment variable, and if it is unset, to either the default unix socket path when running on a Unix system, and localhost otherwise.

  • dbname
  • Should be a proper identifier (letter followed by a mix of letters, digits and the punctuation signs comma (,), dash (-) and underscore (_).

    When omitted, the dbname defaults to the value of the environment variable PGDATABASE, and if that is unset, to the user value as determined above.

  • options

    The optional parameters must be supplied with the form name=value, and you may use several parameters by separating them away using an ampersand (&) character.

  • Only some options are supported here, tablename (which might be qualified with a schema name) sslmode, host, port, dbname, user and password.

    The sslmode parameter values can be one of disable, allow, prefer or require.

    For backward compatibility reasons, it's possible to specify the tablename option directly, without spelling out the tablename= parts.

    The options override the main URI components when both are given, and using the percent-encoded option parameters allow using passwords starting with a colon and bypassing other URI components parsing limitations.

Regular Expressions

Several clauses listed in the following accept regular expressions with the following input rules:

  • A regular expression begins with a tilde sign (~),

  • is then followed with an opening sign,

  • then any character is allowed and considered part of the regular expression, except for the closing sign,

  • then a closing sign is expected.

The opening and closing sign are allowed by pair, here's the complete list of allowed delimiters:

~//  
-~[]  
-~{}  
-~()  
-~<>  
-~""  
-~''  
-~||  
-~## 

Pick the set of delimiters that don't collide with the regular expression you're trying to input. If your expression is such that none of the solutions allow you to enter it, the places where such expressions are allowed should allow for a list of expressions.

Comments

Any command may contain comments, following those input rules:

  • the -- delimiter begins a comment that ends with the end of the current line,

  • the delimiters /* and */ respectively start and end a comment, which can be found in the middle of a command or span several lines.

Any place where you could enter a whitespace will accept a comment too.

Batch behaviour options

All pgloader commands have support for a WITH clause that allows for specifying options. Some options are generic and accepted by all commands, such as the batch behaviour options, and some options are specific to a data source kind, such as the CSV skip header option.

The global batch behaviour options are:

  • batch rows

    Takes a numeric value as argument, used as the maximum number of rows allowed in a batch. The default is 25 000 and can be changed to try having better performance characteristics or to control pgloader memory usage;

  • batch size

    Takes a memory unit as argument, such as 20 MB, its default value. Accepted multipliers are kB, MB, GB, TB and PB. The case is important so as not to be confused about bits versus bytes, we're only talking bytes here.

  • prefetch rows

    Takes a numeric value as argument, defaults to 100000. That's the number of rows that pgloader is allowed to read in memory in each reader thread. See the workers setting for how many reader threads are allowed to run at the same time.

Other options are specific to each input source, please refer to specific parts of the documentation for their listing and covering.

A batch is then closed as soon as either the batch rows or the batch size threshold is crossed, whichever comes first. In cases when a batch has to be closed because of the batch size setting, a debug level log message is printed with how many rows did fit in the oversized batch.

LOAD CSV

This command instructs pgloader to load data from a CSV file. Here's an example:

LOAD CSV  
-   FROM 'GeoLiteCity-Blocks.csv' WITH ENCODING iso-646-us  
-        HAVING FIELDS  
-        (  
-           startIpNum, endIpNum, locId  
-        )  
-   INTO postgresql://user@localhost:54393/dbname?geolite.blocks  
-        TARGET COLUMNS  
-        (  
-           iprange ip4r using (ip-range startIpNum endIpNum),  
-           locId  
-        )  
-   WITH truncate,  
-        skip header = 2,  
-        fields optionally enclosed by '"',  
-        fields escaped by backslash-quote,  
-        fields terminated by '\t'  
- 
-    SET work_mem to '32 MB', maintenance_work_mem to '64 MB'; 

The csv format command accepts the following clauses and options:

  • FROM

    Filename where to load the data from. Accepts an ENCODING option. Use the --list-encodings option to know which encoding names are supported.

  • The filename may be enclosed by single quotes, and could be one of the following special values:

    • inline

      The data is found after the end of the parsed commands. Any number of empty lines between the end of the commands and the beginning of the data is accepted.

    • stdin

      Reads the data from the standard input stream.

    • FILENAMES MATCHING

      The whole matching clause must follow the following rule:

      [ ALL FILENAMES | [ FIRST ] FILENAME ]  
      -MATCHING regexp  
      -[ IN DIRECTORY '...' ] 
    • The matching clause applies given regular expression (see above for exact syntax, several options can be used here) to filenames. It's then possible to load data from only the first match of all of them.

      The optional IN DIRECTORY clause allows specifying which directory to walk for finding the data files, and can be either relative to where the command file is read from, or absolute. The given directory must exists.

    The FROM option also supports an optional comma separated list of field names describing what is expected in the CSV data file, optionally introduced by the clause HAVING FIELDS.

    Each field name can be either only one name or a name following with specific reader options for that field, enclosed in square brackets and comma-separated. Supported per-field reader options are:

    • terminated by

      See the description of field terminated by below.

    • The processing of this option is not currently implemented.

    • date format
    • When the field is expected of the date type, then this option allows to specify the date format used in the file.

      Date format string are template strings modeled against the PostgreSQL to_char template strings support, limited to the following patterns:

      • YYYY, YYY, YY for the year part
      • MM for the numeric month part
      • DD for the numeric day part
      • HH, HH12, HH24 for the hour part
      • am, AM, a.m., A.M.
      • pm, PM, p.m., P.M.
      • MI for the minutes part
      • SS for the seconds part
      • MS for the milliseconds part (4 digits)
      • US for the microseconds part (6 digits)
      • unparsed punctuation signs: - . * # @ T / \ and space

      Here's an example of a date format specification:

      column-name [date format 'YYYY-MM-DD HH24-MI-SS.US'] 
    • null if

      This option takes an argument which is either the keyword blanks or a double-quoted string.

    • When blanks is used and the field value that is read contains only space characters, then it's automatically converted to an SQL NULL value.

      When a double-quoted string is used and that string is read as the field value, then the field value is automatically converted to an SQL NULL value.

    • trim both whitespace, trim left whitespace, trim right whitespace

      This option allows to trim whitespaces in the read data, either from both sides of the data, or only the whitespace characters found on the left of the streaing, or only those on the right of the string.

  • WITH

    When loading from a CSV file, the following options are supported:

    • truncate

      When this option is listed, pgloader issues a TRUNCATE command against the PostgreSQL target table before reading the data file.

    • drop indexes

      When this option is listed, pgloader issues DROP INDEX commands against all the indexes defined on the target table before copying the data, then CREATE INDEX commands once the COPY is done.

    • In order to get the best performance possible, all the indexes are created in parallel and when done the primary keys are built again from the unique indexes just created. This two step process allows creating the primary key index in parallel with the other indexes, as only the ALTER TABLE command needs an access exclusive lock on the target table.

    • disable triggers
    • When this option is listed, pgloader issues an ALTER TABLE ... DISABLE TRIGGER ALL command against the PostgreSQL target table before copying the data, then the command ALTER TABLE ... ENABLE TRIGGER ALL once the COPY is done.

      This option allows loading data into a pre-existing table ignoring the foreign key constraints and user defined triggers and may result in invalid foreign key constraints once the data is loaded. Use with care.

    • skip header

      Takes a numeric value as argument. Instruct pgloader to skip that many lines at the beginning of the input file.

    • csv header

      Use the first line read after skip header as the list of csv field names to be found in the CSV file, using the same CSV parameters as for the CSV data.

    • trim unquoted blanks

      When reading unquoted values in the CSV file, remove the blanks found in between the separator and the value. That behaviour is the default.

    • keep unquoted blanks

      When reading unquoted values in the CSV file, keep blanks found in between the separator and the value.

    • fields optionally enclosed by

      Takes a single character as argument, which must be found inside single quotes, and might be given as the printable character itself, the special value \t to denote a tabulation character, or 0x then an hexadecimal value read as the ASCII code for the character.

    • This character is used as the quoting character in the CSV file, and defaults to double-quote.

    • fields not enclosed
    • By default, pgloader will use the double-quote character as the enclosing character. If you have a CSV file where fields are not enclosed and are using double-quote as an expected ordinary character, then use the option fields not enclosed for the CSV parser to accept those values.

    • fields escaped by
    • Takes either the special value backslash-quote or double-quote, or any value supported by the fields terminated by option (see below). This value is used to recognize escaped field separators when they are to be found within the data fields themselves. Defaults to double-quote.

    • csv escape mode
    • Takes either the special value quote (the default) or following and allows the CSV parser to parse either only escaped field separator or any character (including CSV data) when using the following value.

    • fields terminated by
    • Takes a single character as argument, which must be found inside single quotes, and might be given as the printable character itself, the special value \t to denote a tabulation character, or 0x then an hexadecimal value read as the ASCII code for the character.

      This character is used as the field separator when reading the CSV data.

    • lines terminated by

      Takes a single character as argument, which must be found inside single quotes, and might be given as the printable character itself, the special value \t to denote a tabulation character, or 0x then an hexadecimal value read as the ASCII code for the character.

    • This character is used to recognize end-of-line condition when reading the CSV data.

LOAD FIXED COLS

This command instructs pgloader to load data from a text file containing columns arranged in a fixed size manner. Here's an example:

LOAD FIXED  
-     FROM inline  
-          (  
-           a from  0 for 10,  
-           b from 10 for  8,  
-           c from 18 for  8,  
-           d from 26 for 17 [null if blanks, trim right whitespace]  
-          )  
-     INTO postgresql:///pgloader?fixed  
-          (  
-             a, b,  
-             c time using (time-with-no-separator c),  
-             d  
-          )  
- 
-     WITH truncate  
- 
-      SET work_mem to '14MB',  
-          standard_conforming_strings to 'on'  
- 
-BEFORE LOAD DO  
-     $$ drop table if exists fixed; $$,  
-     $$ create table fixed (  
-         a integer,  
-         b date,  
-         c time,  
-         d text  
-        );  
-     $$;  
- 
- 01234567892008052011431250firstline  
-    01234562008052115182300left blank-padded  
- 12345678902008052208231560another line  
-  2345609872014092914371500                  
-  2345678902014092914371520 

The fixed format command accepts the following clauses and options:

  • FROM

    Filename where to load the data from. Accepts an ENCODING option. Use the --list-encodings option to know which encoding names are supported.

  • The filename may be enclosed by single quotes, and could be one of the following special values:

    • inline

      The data is found after the end of the parsed commands. Any number of empty lines between the end of the commands and the beginning of the data is accepted.

    • stdin

      Reads the data from the standard input stream.

    • FILENAMES MATCHING

      The whole matching clause must follow the following rule:

      [ ALL FILENAMES | [ FIRST ] FILENAME ]  
      -MATCHING regexp  
      -[ IN DIRECTORY '...' ] 
    • The matching clause applies given regular expression (see above for exact syntax, several options can be used here) to filenames. It's then possible to load data from only the first match of all of them.

      The optional IN DIRECTORY clause allows specifying which directory to walk for finding the data files, and can be either relative to where the command file is read from, or absolute. The given directory must exists.

    The FROM option also supports an optional comma separated list of field names describing what is expected in the FIXED data file.

    Each field name is composed of the field name followed with specific reader options for that field. Supported per-field reader options are the following, where only start and length are required.

    • start

      Position in the line where to start reading that field's value. Can be entered with decimal digits or 0x then hexadecimal digits.

    • length

      How many bytes to read from the start position to read that field's value. Same format as start.

    Those optional parameters must be enclosed in square brackets and comma-separated:

    • terminated by

      See the description of field terminated by below.

    • The processing of this option is not currently implemented.

    • date format
    • When the field is expected of the date type, then this option allows to specify the date format used in the file.

      Date format string are template strings modeled against the PostgreSQL to_char template strings support, limited to the following patterns:

      • YYYY, YYY, YY for the year part
      • MM for the numeric month part
      • DD for the numeric day part
      • HH, HH12, HH24 for the hour part
      • am, AM, a.m., A.M.
      • pm, PM, p.m., P.M.
      • MI for the minutes part
      • SS for the seconds part
      • MS for the milliseconds part (4 digits)
      • US for the microseconds part (6 digits)
      • unparsed punctuation signs: - . * # @ T / \ and space

      Here's an example of a date format specification:

      column-name [date format 'YYYY-MM-DD HH24-MI-SS.US'] 
    • null if

      This option takes an argument which is either the keyword blanks or a double-quoted string.

    • When blanks is used and the field value that is read contains only space characters, then it's automatically converted to an SQL NULL value.

      When a double-quoted string is used and that string is read as the field value, then the field value is automatically converted to an SQL NULL value.

    • trim both whitespace, trim left whitespace, trim right whitespace

      This option allows to trim whitespaces in the read data, either from both sides of the data, or only the whitespace characters found on the left of the streaing, or only those on the right of the string.

  • WITH

    When loading from a FIXED file, the following options are supported:

    • truncate

      When this option is listed, pgloader issues a TRUNCATE command against the PostgreSQL target table before reading the data file.

    • disable triggers

      When this option is listed, pgloader issues an ALTER TABLE ... DISABLE TRIGGER ALL command against the PostgreSQL target table before copying the data, then the command ALTER TABLE ... ENABLE TRIGGER ALL once the COPY is done.

    • This option allows loading data into a pre-existing table ignoring the foreign key constraints and user defined triggers and may result in invalid foreign key constraints once the data is loaded. Use with care.

    • skip header
    • Takes a numeric value as argument. Instruct pgloader to skip that many lines at the beginning of the input file.

LOAD COPY FORMATTED FILES

This commands instructs pgloader to load from a file containing COPY TEXT data as described in the PostgreSQL documentation. Here's an example:

LOAD COPY  
-     FROM copy://./data/track.copy  
-          (  
-            trackid, track, album, media, genre, composer,  
-            milliseconds, bytes, unitprice  
-          )  
-     INTO postgresql:///pgloader?track_full  
- 
-     WITH truncate  
- 
-      SET work_mem to '14MB',  
-          standard_conforming_strings to 'on'  
- 
-BEFORE LOAD DO  
-     $$ drop table if exists track_full; $$,  
-     $$ create table track_full (  
-          trackid      bigserial,  
-          track        text,  
-          album        text,  
-          media        text,  
-          genre        text,  
-          composer     text,  
-          milliseconds bigint,  
-          bytes        bigint,  
-          unitprice    numeric  
-        );  
-     $$; 

The COPY format command accepts the following clauses and options:

  • FROM

    Filename where to load the data from. This support local files, HTTP URLs and zip files containing a single dbf file of the same name. Fetch such a zip file from an HTTP address is of course supported.

    • inline

      The data is found after the end of the parsed commands. Any number of empty lines between the end of the commands and the beginning of the data is accepted.

    • stdin

      Reads the data from the standard input stream.

    • FILENAMES MATCHING

      The whole matching clause must follow the following rule:

      [ ALL FILENAMES | [ FIRST ] FILENAME ]  
      -MATCHING regexp  
      -[ IN DIRECTORY '...' ] 
    • The matching clause applies given regular expression (see above for exact syntax, several options can be used here) to filenames. It's then possible to load data from only the first match of all of them.

      The optional IN DIRECTORY clause allows specifying which directory to walk for finding the data files, and can be either relative to where the command file is read from, or absolute. The given directory must exists.

  • WITH

    When loading from a COPY file, the following options are supported:

    • delimiter

      Takes a single character as argument, which must be found inside single quotes, and might be given as the printable character itself, the special value \t to denote a tabulation character, or 0x then an hexadecimal value read as the ASCII code for the character.

    • This character is used as the delimiter when reading the data, in a similar way to the PostgreSQL COPY option.

    • null
    • Takes a quoted string as an argument (quotes can be either double quotes or single quotes) and uses that string as the NULL representation in the data.

      This is similar to the null COPY option in PostgreSQL.

    • truncate

      When this option is listed, pgloader issues a TRUNCATE command against the PostgreSQL target table before reading the data file.

    • disable triggers

      When this option is listed, pgloader issues an ALTER TABLE ... DISABLE TRIGGER ALL command against the PostgreSQL target table before copying the data, then the command ALTER TABLE ... ENABLE TRIGGER ALL once the COPY is done.

    • This option allows loading data into a pre-existing table ignoring the foreign key constraints and user defined triggers and may result in invalid foreign key constraints once the data is loaded. Use with care.

    • skip header
    • Takes a numeric value as argument. Instruct pgloader to skip that many lines at the beginning of the input file.

LOAD DBF

This command instructs pgloader to load data from a DBF file. Here's an example:

LOAD DBF  
-    FROM http://www.insee.fr/fr/methodes/nomenclatures/cog/telechargement/2013/dbf/reg2013.dbf  
-    INTO postgresql://user@localhost/dbname  
-    WITH truncate, create table; 

The dbf format command accepts the following clauses and options:

  • FROM

    Filename where to load the data from. This support local files, HTTP URLs and zip files containing a single dbf file of the same name. Fetch such a zip file from an HTTP address is of course supported.

  • WITH

    When loading from a DBF file, the following options are supported:

    • truncate

      When this option is listed, pgloader issues a TRUNCATE command against the PostgreSQL target table before reading the data file.

    • disable triggers

      When this option is listed, pgloader issues an ALTER TABLE ... DISABLE TRIGGER ALL command against the PostgreSQL target table before copying the data, then the command ALTER TABLE ... ENABLE TRIGGER ALL once the COPY is done.

    • This option allows loading data into a pre-existing table ignoring the foreign key constraints and user defined triggers and may result in invalid foreign key constraints once the data is loaded. Use with care.

    • create table
    • When this option is listed, pgloader creates the table using the meta data found in the DBF file, which must contain a list of fields with their data type. A standard data type conversion from DBF to PostgreSQL is done.

    • table name
    • This options expects as its value the possibly qualified name of the table to create.

LOAD IXF

This command instructs pgloader to load data from an IBM IXF file. Here's an example:

LOAD IXF  
-    FROM data/nsitra.test1.ixf  
-    INTO postgresql:///pgloader?nsitra.test1  
-    WITH truncate, create table, timezone UTC  
- 
-  BEFORE LOAD DO  
-   $$ create schema if not exists nsitra; $$,  
-   $$ drop table if exists nsitra.test1; $$; 

The ixf format command accepts the following clauses and options:

  • FROM

    Filename where to load the data from. This support local files, HTTP URLs and zip files containing a single ixf file of the same name. Fetch such a zip file from an HTTP address is of course supported.

  • WITH

    When loading from a IXF file, the following options are supported:

    • truncate

      When this option is listed, pgloader issues a TRUNCATE command against the PostgreSQL target table before reading the data file.

    • disable triggers

      When this option is listed, pgloader issues an ALTER TABLE ... DISABLE TRIGGER ALL command against the PostgreSQL target table before copying the data, then the command ALTER TABLE ... ENABLE TRIGGER ALL once the COPY is done.

    • This option allows loading data into a pre-existing table ignoring the foreign key constraints and user defined triggers and may result in invalid foreign key constraints once the data is loaded. Use with care.

    • create table
    • When this option is listed, pgloader creates the table using the meta data found in the DBF file, which must contain a list of fields with their data type. A standard data type conversion from DBF to PostgreSQL is done.

    • table name
    • This options expects as its value the possibly qualified name of the table to create.

    • timezone
    • This options allows to specify which timezone is used when parsing timestamps from an IXF file, and defaults to UTC. Expected values are either UTC, GMT or a single quoted location name such as 'Universal' or 'Europe/Paris'.

LOAD ARCHIVE

This command instructs pgloader to load data from one or more files contained in an archive. Currently the only supported archive format is ZIP, and the archive might be downloaded from an HTTP URL.

Here's an example:

LOAD ARCHIVE  
-   FROM /Users/dim/Downloads/GeoLiteCity-latest.zip  
-   INTO postgresql:///ip4r  
- 
-   BEFORE LOAD  
-     DO $$ create extension if not exists ip4r; $$,  
-        $$ create schema if not exists geolite; $$,  
- 
-     EXECUTE 'geolite.sql'  
- 
-   LOAD CSV  
-        FROM FILENAME MATCHING ~/GeoLiteCity-Location.csv/  
-             WITH ENCODING iso-8859-1  
-             (  
-                locId,  
-                country,  
-                region     null if blanks,  
-                city       null if blanks,  
-                postalCode null if blanks,  
-                latitude,  
-                longitude,  
-                metroCode  null if blanks,  
-                areaCode   null if blanks  
-             )  
-        INTO postgresql:///ip4r?geolite.location  
-             (  
-                locid,country,region,city,postalCode,  
-                location point using (format nil "(~a,~a)" longitude latitude),  
-                metroCode,areaCode  
-             )  
-        WITH skip header = 2,  
-             fields optionally enclosed by '"',  
-             fields escaped by double-quote,  
-             fields terminated by ','  
- 
-  AND LOAD CSV  
-        FROM FILENAME MATCHING ~/GeoLiteCity-Blocks.csv/  
-             WITH ENCODING iso-8859-1  
-             (  
-                startIpNum, endIpNum, locId  
-             )  
-        INTO postgresql:///ip4r?geolite.blocks  
-             (  
-                iprange ip4r using (ip-range startIpNum endIpNum),  
-                locId  
-             )  
-        WITH skip header = 2,  
-             fields optionally enclosed by '"',  
-             fields escaped by double-quote,  
-             fields terminated by ','  
- 
-   FINALLY DO  
-     $$ create index blocks_ip4r_idx on geolite.blocks using gist(iprange); $$; 

The archive command accepts the following clauses and options:

  • FROM

    Filename or HTTP URI where to load the data from. When given an HTTP URL the linked file will get downloaded locally before processing.

  • If the file is a zip file, the command line utility unzip is used to expand the archive into files in $TMPDIR, or /tmp if $TMPDIR is unset or set to a non-existing directory.

    Then the following commands are used from the top level directory where the archive has been expanded.

  • command [ AND command ... ]

    A series of commands against the contents of the archive, at the moment only CSV,'FIXED and DBF commands are supported.

  • Note that commands are supporting the clause FROM FILENAME MATCHING which allows the pgloader command not to depend on the exact names of the archive directories.

    The same clause can also be applied to several files with using the spelling FROM ALL FILENAMES MATCHING and a regular expression.

    The whole matching clause must follow the following rule:

     FROM [ ALL FILENAMES | [ FIRST ] FILENAME ] MATCHING 
  • FINALLY DO

    SQL Queries to run once the data is loaded, such as CREATE INDEX.

LOAD MYSQL DATABASE

This command instructs pgloader to load data from a database connection. The only supported database source is currently MySQL, and pgloader supports dynamically converting the schema of the source database and the indexes building.

A default set of casting rules are provided and might be overloaded and appended to by the command.

Here's an example using as many options as possible, some of them even being defaults. Chances are you don't need that complex a setup, don't copy and paste it, use it only as a reference!

LOAD DATABASE  
-     FROM      mysql://root@localhost/sakila  
-     INTO postgresql://localhost:54393/sakila  
- 
- WITH include drop, create tables, create indexes, reset sequences,  
-      workers = 8, concurrency = 1,  
-      multiple readers per thread, rows per range = 50000  
- 
-  SET PostgreSQL PARAMETERS  
-      maintenance_work_mem to '128MB',  
-      work_mem to '12MB',  
-      search_path to 'sakila, public, "$user"'  
- 
-  SET MySQL PARAMETERS  
-      net_read_timeout  = '120',  
-      net_write_timeout = '120'  
- 
- CAST type bigint when (= precision 20) to bigserial drop typemod,  
-      type date drop not null drop default using zero-dates-to-null,  
-      -- type tinyint to boolean using tinyint-to-boolean,  
-      type year to integer  
- 
- MATERIALIZE VIEWS film_list, staff_list  
- 
- -- INCLUDING ONLY TABLE NAMES MATCHING ~/film/, 'actor'  
- -- EXCLUDING TABLE NAMES MATCHING ~<ory>  
- -- DECODING TABLE NAMES MATCHING ~/messed/, ~/encoding/ AS utf8  
- -- ALTER TABLE NAMES MATCHING 'film' RENAME TO 'films'  
- -- ALTER TABLE NAMES MATCHING ~/_list$/ SET SCHEMA 'mv'  
- 
- ALTER TABLE NAMES MATCHING ~/_list$/, 'sales_by_store', ~/sales_by/  
-  SET SCHEMA 'mv'  
- 
- ALTER TABLE NAMES MATCHING 'film' RENAME TO 'films'  
- ALTER TABLE NAMES MATCHING ~/./ SET (fillfactor='40')  
- 
- ALTER SCHEMA 'sakila' RENAME TO 'pagila'  
- 
- BEFORE LOAD DO  
-   $$ create schema if not exists pagila; $$,  
-   $$ create schema if not exists mv;     $$,  
-   $$ alter database sakila set search_path to pagila, mv, public; $$;  
-

The database command accepts the following clauses and options:

  • FROM

    Must be a connection URL pointing to a MySQL database.

  • If the connection URI contains a table name, then only this table is migrated from MySQL to PostgreSQL.

    See the SOURCE CONNECTION STRING section above for details on how to write the connection string. Environment variables described in can be used as default values too. If the user is not provided, then it defaults to USER environment variable value. The password can be provided with the environment variable MYSQL_PWD. The host can be provided with the environment variable MYSQL_HOST and otherwise defaults to localhost. The port can be provided with the environment variable MYSQL_TCP_PORT and otherwise defaults to 3306.

  • WITH

    When loading from a MySQL database, the following options are supported, and the default WITH clause is: no truncate, create schema, create tables, include drop, create indexes, reset sequences, foreign keys, downcase identifiers, uniquify index names.

  • WITH options:

    • include drop

      When this option is listed, pgloader drops all the tables in the target PostgreSQL database whose names appear in the MySQL database. This option allows for using the same command several times in a row until you figure out all the options, starting automatically from a clean environment. Please note that CASCADE is used to ensure that tables are dropped even if there are foreign keys pointing to them. This is precisely what include drop is intended to do: drop all target tables and recreate them.

    • Great care needs to be taken when using include drop, as it will cascade to all objects referencing the target tables, possibly including other tables that are not being loaded from the source DB.

    • include no drop
    • When this option is listed, pgloader will not include any DROP statement when loading the data.

    • truncate
    • When this option is listed, pgloader issue the TRUNCATE command against each PostgreSQL table just before loading data into it.

    • no truncate
    • When this option is listed, pgloader issues no TRUNCATE command.

    • disable triggers
    • When this option is listed, pgloader issues an ALTER TABLE ... DISABLE TRIGGER ALL command against the PostgreSQL target table before copying the data, then the command ALTER TABLE ... ENABLE TRIGGER ALL once the COPY is done.

      This option allows loading data into a pre-existing table ignoring the foreign key constraints and user defined triggers and may result in invalid foreign key constraints once the data is loaded. Use with care.

    • create tables

      When this option is listed, pgloader creates the table using the meta data found in the MySQL file, which must contain a list of fields with their data type. A standard data type conversion from DBF to PostgreSQL is done.

    • create no tables

      When this option is listed, pgloader skips the creation of table before loading data, target tables must then already exist.

    • Also, when using create no tables pgloader fetches the metadata from the current target database and checks type casting, then will remove constraints and indexes prior to loading the data and install them back again once the loading is done.

    • create indexes
    • When this option is listed, pgloader gets the definitions of all the indexes found in the MySQL database and create the same set of index definitions against the PostgreSQL database.

    • create no indexes
    • When this option is listed, pgloader skips the creating indexes.

    • drop indexes
    • When this option is listed, pgloader drops the indexes in the target database before loading the data, and creates them again at the end of the data copy.

    • uniquify index names, preserve index names
    • MySQL index names are unique per-table whereas in PostgreSQL index names have to be unique per-schema. The default for pgloader is to change the index name by prefixing it with idx_OID where OID is the internal numeric identifier of the table the index is built against.

      In somes cases like when the DDL are entirely left to a framework it might be sensible for pgloader to refrain from handling index unique names, that is achieved by using the preserve index names option.

      The default is to uniquify index names.

      Even when using the option preserve index names, MySQL primary key indexes named "PRIMARY" will get their names uniquified. Failing to do so would prevent the primary keys to be created again in PostgreSQL where the index names must be unique per schema.

    • drop schema

      When this option is listed, pgloader drops the target schema in the target PostgreSQL database before creating it again and all the objects it contains. The default behavior doesn't drop the target schemas.

    • foreign keys

      When this option is listed, pgloader gets the definitions of all the foreign keys found in the MySQL database and create the same set of foreign key definitions against the PostgreSQL database.

    • no foreign keys

      When this option is listed, pgloader skips creating foreign keys.

    • reset sequences

      When this option is listed, at the end of the data loading and after the indexes have all been created, pgloader resets all the PostgreSQL sequences created to the current maximum value of the column they are attached to.

    • The options schema only and data only have no effects on this option.

    • reset no sequences
    • When this option is listed, pgloader skips resetting sequences after the load.

      The options schema only and data only have no effects on this option.

    • downcase identifiers

      When this option is listed, pgloader converts all MySQL identifiers (table names, index names, column names) to downcase, except for PostgreSQL reserved keywords.

    • The PostgreSQL reserved keywords are determined dynamically by using the system function pg_get_keywords().

    • quote identifiers
    • When this option is listed, pgloader quotes all MySQL identifiers so that their case is respected. Note that you will then have to do the same thing in your application code queries.

    • schema only
    • When this option is listed pgloader refrains from migrating the data over. Note that the schema in this context includes the indexes when the option create indexes has been listed.

    • data only
    • When this option is listed pgloader only issues the COPY statements, without doing any other processing.

    • single reader per thread, multiple readers per thread
    • The default is single reader per thread and it means that each MySQL table is read by a single thread as a whole, with a single SELECT statement using no WHERE clause.

      When using multiple readers per thread pgloader may be able to divide the reading work into several threads, as many as the concurrency setting, which needs to be greater than 1 for this option to kick be activated.

      For each source table, pgloader searches for a primary key over a single numeric column, or a multiple-column primary key index for which the first column is of a numeric data type (one of integer or bigint). When such an index exists, pgloader runs a query to find the min and max values on this column, and then split that range into many ranges containing a maximum of rows per range.

      When the range list we then obtain contains at least as many ranges than our concurrency setting, then we distribute those ranges to each reader thread.

      So when all the conditions are met, pgloader then starts as many reader thread as the concurrency setting, and each reader thread issues several queries with a WHERE id >= x AND id < y, where y - x = rows per range or less (for the last range, depending on the max value just obtained.

    • rows per range

      How many rows are fetched per SELECT query when using multiple readers per thread, see above for details.

  • SET MySQL PARAMETERS

    The SET MySQL PARAMETERS allows setting MySQL parameters using the MySQL SET command each time pgloader connects to it.

  • CAST

    The cast clause allows to specify custom casting rules, either to overload the default casting rules or to amend them with special cases.

  • A casting rule is expected to follow one of the forms:

    type <mysql-type-name> [ <guard> ... ] to <pgsql-type-name> [ <option> ... ]  
    -column <table-name>.<column-name> [ <guards> ] to ... 

    It's possible for a casting rule to either match against a MySQL data type or against a given column name in a given table name. That flexibility allows to cope with cases where the type tinyint might have been used as a boolean in some cases but as a smallint in others.

    The casting rules are applied in order, the first match prevents following rules to be applied, and user defined rules are evaluated first.

    The supported guards are:

    • when default 'value'

      The casting rule is only applied against MySQL columns of the source type that have given value, which must be a single-quoted or a double-quoted string.

    • when typemod expression

      The casting rule is only applied against MySQL columns of the source type that have a typemod value matching the given typemod expression. The typemod is separated into its precision and scale components.

    • Example of a cast rule using a typemod guard:

      type char when (= precision 1) to char keep typemod 

      This expression casts MySQL char(1) column to a PostgreSQL column of type char(1) while allowing for the general case char(N) will be converted by the default cast rule into a PostgreSQL type varchar(N).

    • with extra auto_increment
    • The casting rule is only applied against MySQL columns having the extra column auto_increment option set, so that it's possible to target e.g. serial rather than integer.

      The default matching behavior, when this option isn't set, is to match both columns with the extra definition and without.

      This means that if you want to implement a casting rule that target either serial or integer from a smallint definition depending on the auto_increment extra bit of information from MySQL, then you need to spell out two casting rules as following:

      type smallint  with extra auto_increment  
      -  to serial drop typemod keep default keep not null,  
      -type smallint  
      -  to integer drop typemod keep default keep not null 

    The supported casting options are:

    • drop default, keep default

      When the option drop default is listed, pgloader drops any existing default expression in the MySQL database for columns of the source type from the CREATE TABLE statement it generates.

    • The spelling keep default explicitly prevents that behaviour and can be used to overload the default casting rules.

    • drop not null, keep not null, set not null
    • When the option drop not null is listed, pgloader drops any existing NOT NULL constraint associated with the given source MySQL datatype when it creates the tables in the PostgreSQL database.

      The spelling keep not null explicitly prevents that behaviour and can be used to overload the default casting rules.

      When the option set not null is listed, pgloader sets a NOT NULL constraint on the target column regardless whether it has been set in the source MySQL column.

    • drop typemod, keep typemod

      When the option drop typemod is listed, pgloader drops any existing typemod definition (e.g. precision and scale) from the datatype definition found in the MySQL columns of the source type when it created the tables in the PostgreSQL database.

    • The spelling keep typemod explicitly prevents that behaviour and can be used to overload the default casting rules.

    • using
    • This option takes as its single argument the name of a function to be found in the pgloader.transforms Common Lisp package. See above for details.

      It's possible to augment a default cast rule (such as one that applies against ENUM data type for example) with a transformation function by omitting entirely the type parts of the casting rule, as in the following example:

      column enumerate.foo using empty-string-to-null 
  • MATERIALIZE VIEWS

    This clause allows you to implement custom data processing at the data source by providing a view definition against which pgloader will query the data. It's not possible to just allow for plain SQL because we want to know a lot about the exact data types of each column involved in the query output.

  • This clause expect a comma separated list of view definitions, each one being either the name of an existing view in your database or the following expression:

    name AS $$ sql query $$

    The name and the sql query will be used in a CREATE VIEW statement at the beginning of the data loading, and the resulting view will then be dropped at the end of the data loading.

  • MATERIALIZE ALL VIEWS

    Same behaviour as MATERIALIZE VIEWS using the dynamic list of views as returned by MySQL rather than asking the user to specify the list.

  • INCLUDING ONLY TABLE NAMES MATCHING

    Introduce a comma separated list of table names or regular expression used to limit the tables to migrate to a sublist.

  • Example:

    INCLUDING ONLY TABLE NAMES MATCHING ~/film/, 'actor' 
  • EXCLUDING TABLE NAMES MATCHING

    Introduce a comma separated list of table names or regular expression used to exclude table names from the migration. This filter only applies to the result of the INCLUDING filter.

    EXCLUDING TABLE NAMES MATCHING ~<ory> 
  • DECODING TABLE NAMES MATCHING

    Introduce a comma separated list of table names or regular expressions used to force the encoding to use when processing data from MySQL. If the data encoding known to you is different from MySQL's idea about it, this is the option to use.

    DECODING TABLE NAMES MATCHING ~/messed/, ~/encoding/ AS utf8 
  • You can use as many such rules as you need, all with possibly different encodings.

  • ALTER TABLE NAMES MATCHING
  • Introduce a comma separated list of table names or regular expressions that you want to target in the pgloader ALTER TABLE command. The only two available actions are SET SCHEMA and RENAME TO, both take a quoted string as parameter:

    ALTER TABLE NAMES MATCHING ~/_list$/, 'sales_by_store', ~/sales_by/  
    - SET SCHEMA 'mv'  
    - 
    -ALTER TABLE NAMES MATCHING 'film' RENAME TO 'films'  
    - 
    -ALTER TABLE NAMES MATCHING ~/./ SET (fillfactor='40') 

    You can use as many such rules as you need. The list of tables to be migrated is searched in pgloader memory against the ALTER TABLE matching rules, and for each command pgloader stops at the first matching criteria (regexp or string).

    No ALTER TABLE command is sent to PostgreSQL, the modification happens at the level of the pgloader in-memory representation of your source database schema. In case of a name change, the mapping is kept and reused in the foreign key and index support.

    The SET () action takes effect as a WITH clause for the CREATE TABLE command that pgloader will run when it has to create a table.

LIMITATIONS

The database command currently only supports MySQL source database and has the following limitations:

  • Views are not migrated,

    Supporting views might require implementing a full SQL parser for the MySQL dialect with a porting engine to rewrite the SQL against PostgreSQL, including renaming functions and changing some constructs.

  • While it's not theoretically impossible, don't hold your breath.

  • Triggers are not migrated
  • The difficulty of doing so is not yet assessed.

  • ON UPDATE CURRENT_TIMESTAMP is currently not migrated
  • It's simple enough to implement, just not on the priority list yet.

  • Of the geometric datatypes, only the POINT database has been covered. The other ones should be easy enough to implement now, it's just not done yet.

DEFAULT MySQL CASTING RULES

When migrating from MySQL the following Casting Rules are provided:

Numbers:

  • type int with extra auto_increment to serial when (< precision 10)
  • type int with extra auto_increment to bigserial when (<= 10 precision)
  • type int to int when (< precision 10)
  • type int to bigint when (<= 10 precision)
  • type tinyint with extra auto_increment to serial
  • type smallint with extra auto_increment to serial
  • type mediumint with extra auto_increment to serial
  • type bigint with extra auto_increment to bigserial

  • type tinyint to boolean when (= 1 precision) using tinyint-to-boolean

  • type tinyint to smallint drop typemod

  • type smallint to smallint drop typemod
  • type mediumint to integer drop typemod
  • type integer to integer drop typemod
  • type float to float drop typemod
  • type bigint to bigint drop typemod
  • type double to double precision drop typemod

  • type numeric to numeric keep typemod

  • type decimal to decimal keep typemod

Texts:

  • type char to char keep typemod using remove-null-characters
  • type varchar to varchar keep typemod using remove-null-characters
  • type tinytext to text using remove-null-characters
  • type text to text using remove-null-characters
  • type mediumtext to text using remove-null-characters
  • type longtext to text using remove-null-characters

Binary:

  • type binary to bytea
  • type varbinary to bytea
  • type tinyblob to bytea
  • type blob to bytea
  • type mediumblob to bytea
  • type longblob to bytea

Date:

  • type datetime when default "0000-00-00 00:00:00" and not null to timestamptz drop not null drop default using zero-dates-to-null

  • type datetime when default "0000-00-00 00:00:00" to timestamptz drop default using zero-dates-to-null

  • type timestamp when default "0000-00-00 00:00:00" and not null to timestamptz drop not null drop default using zero-dates-to-null

  • type timestamp when default "0000-00-00 00:00:00" to timestamptz drop default using zero-dates-to-null

  • type date when default "0000-00-00" to date drop default using zero-dates-to-null

  • type date to date

  • type datetime to timestamptz
  • type timestamp to timestamptz
  • type year to integer drop typemod

Geometric:

  • type point to point using pgloader.transforms::convert-mysql-point

Enum types are declared inline in MySQL and separately with a CREATE TYPE command in PostgreSQL, so each column of Enum Type is converted to a type named after the table and column names defined with the same labels in the same order.

When the source type definition is not matched in the default casting rules nor in the casting rules provided in the command, then the type name with the typemod is used.

LOAD SQLite DATABASE

This command instructs pgloader to load data from a SQLite file. Automatic discovery of the schema is supported, including build of the indexes.

Here's an example:

load database  
-     from sqlite:///Users/dim/Downloads/lastfm_tags.db  
-     into postgresql:///tags  
- 
- with include drop, create tables, create indexes, reset sequences  
- 
-  set work_mem to '16MB', maintenance_work_mem to '512 MB'; 

The sqlite command accepts the following clauses and options:

  • FROM

    Path or HTTP URL to a SQLite file, might be a .zip file.

  • WITH

    When loading from a SQLite database, the following options are supported:

  • When loading from a SQLite database, the following options are supported, and the default WITH clause is: no truncate, create tables, include drop, create indexes, reset sequences, downcase identifiers, encoding 'utf-8'.

    • include drop

      When this option is listed, pgloader drops all the tables in the target PostgreSQL database whose names appear in the SQLite database. This option allows for using the same command several times in a row until you figure out all the options, starting automatically from a clean environment. Please note that CASCADE is used to ensure that tables are dropped even if there are foreign keys pointing to them. This is precisely what include drop is intended to do: drop all target tables and recreate them.

    • Great care needs to be taken when using include drop, as it will cascade to all objects referencing the target tables, possibly including other tables that are not being loaded from the source DB.

    • include no drop
    • When this option is listed, pgloader will not include any DROP statement when loading the data.

    • truncate
    • When this option is listed, pgloader issue the TRUNCATE command against each PostgreSQL table just before loading data into it.

    • no truncate
    • When this option is listed, pgloader issues no TRUNCATE command.

    • disable triggers
    • When this option is listed, pgloader issues an ALTER TABLE ... DISABLE TRIGGER ALL command against the PostgreSQL target table before copying the data, then the command ALTER TABLE ... ENABLE TRIGGER ALL once the COPY is done.

      This option allows loading data into a pre-existing table ignoring the foreign key constraints and user defined triggers and may result in invalid foreign key constraints once the data is loaded. Use with care.

    • create tables

      When this option is listed, pgloader creates the table using the meta data found in the SQLite file, which must contain a list of fields with their data type. A standard data type conversion from DBF to PostgreSQL is done.

    • create no tables

      When this option is listed, pgloader skips the creation of table before loading data, target tables must then already exist.

    • Also, when using create no tables pgloader fetches the metadata from the current target database and checks type casting, then will remove constraints and indexes prior to loading the data and install them back again once the loading is done.

    • create indexes
    • When this option is listed, pgloader gets the definitions of all the indexes found in the SQLite database and create the same set of index definitions against the PostgreSQL database.

    • create no indexes
    • When this option is listed, pgloader skips the creating indexes.

    • drop indexes
    • When this option is listed, pgloader drops the indexes in the target database before loading the data, and creates them again at the end of the data copy.

    • reset sequences
    • When this option is listed, at the end of the data loading and after the indexes have all been created, pgloader resets all the PostgreSQL sequences created to the current maximum value of the column they are attached to.

    • reset no sequences
    • When this option is listed, pgloader skips resetting sequences after the load.

      The options schema only and data only have no effects on this option.

    • schema only

      When this option is listed pgloader will refrain from migrating the data over. Note that the schema in this context includes the indexes when the option create indexes has been listed.

    • data only

      When this option is listed pgloader only issues the COPY statements, without doing any other processing.

    • encoding

      This option allows to control which encoding to parse the SQLite text data with. Defaults to UTF-8.

  • CAST

    The cast clause allows to specify custom casting rules, either to overload the default casting rules or to amend them with special cases.

  • Please refer to the MySQL CAST clause for details.

  • INCLUDING ONLY TABLE NAMES LIKE
  • Introduce a comma separated list of table name patterns used to limit the tables to migrate to a sublist.

    Example:

    INCLUDING ONLY TABLE NAMES LIKE 'Invoice%' 
  • EXCLUDING TABLE NAMES LIKE

    Introduce a comma separated list of table name patterns used to exclude table names from the migration. This filter only applies to the result of the INCLUDING filter.

    EXCLUDING TABLE NAMES LIKE 'appointments' 

DEFAULT SQLite CASTING RULES

When migrating from SQLite the following Casting Rules are provided:

Numbers:

  • type tinyint to smallint using integer-to-string
  • type integer to bigint using integer-to-string

  • type float to float using float-to-string

  • type real to real using float-to-string
  • type double to double precision using float-to-string
  • type numeric to numeric using float-to-string

Texts:

  • type character to text drop typemod
  • type varchar to text drop typemod
  • type nvarchar to text drop typemod
  • type char to text drop typemod
  • type nchar to text drop typemod
  • type nvarchar to text drop typemod
  • type clob to text drop typemod

Binary:

  • type blob to bytea

Date:

  • type datetime to timestamptz using sqlite-timestamp-to-timestamp
  • type timestamp to timestamptz using sqlite-timestamp-to-timestamp
  • type timestamptz to timestamptz using sqlite-timestamp-to-timestamp

LOAD MS SQL DATABASE

This command instructs pgloader to load data from a MS SQL database. Automatic discovery of the schema is supported, including build of the indexes, primary and foreign keys constraints.

Here's an example:

load database  
-     from mssql://user@host/dbname  
-     into postgresql:///dbname  
- 
-including only table names like 'GlobalAccount' in schema 'dbo'  
- 
-set work_mem to '16MB', maintenance_work_mem to '512 MB'  
- 
-before load do $$ drop schema if exists dbo cascade; $$; 

The mssql command accepts the following clauses and options:

  • FROM

    Connection string to an existing MS SQL database server that listens and welcome external TCP/IP connection. As pgloader currently piggybacks on the FreeTDS driver, to change the port of the server please export the TDSPORT environment variable.

  • WITH

    When loading from a MS SQL database, the same options as when loading a MySQL database are supported. Please refer to the MySQL section. The following options are added:

    • create schemas

      When this option is listed, pgloader creates the same schemas as found on the MS SQL instance. This is the default.

    • create no schemas

      When this option is listed, pgloader refrains from creating any schemas at all, you must then ensure that the target schema do exist.

  • CAST

    The cast clause allows to specify custom casting rules, either to overload the default casting rules or to amend them with special cases.

  • Please refer to the MySQL CAST clause for details.

  • INCLUDING ONLY TABLE NAMES LIKE '...' [, '...'] IN SCHEMA '...'
  • Introduce a comma separated list of table name patterns used to limit the tables to migrate to a sublist. More than one such clause may be used, they will be accumulated together.

    Example:

    including only table names lile 'GlobalAccount' in schema 'dbo' 
  • EXCLUDING TABLE NAMES LIKE '...' [, '...'] IN SCHEMA '...'

    Introduce a comma separated list of table name patterns used to exclude table names from the migration. This filter only applies to the result of the INCLUDING filter.

    EXCLUDING TABLE NAMES MATCHING 'LocalAccount' in schema 'dbo' 
  • ALTER SCHEMA '...' RENAME TO '...'

    Allows to rename a schema on the flight, so that for instance the tables found in the schema 'dbo' in your source database will get migrated into the schema 'public' in the target database with this command:

    ALTER SCHEMA 'dbo' RENAME TO 'public' 
  • ALTER TABLE NAMES MATCHING ... IN SCHEMA '...'

    See the MySQL explanation for this clause above. It works the same in the context of migrating from MS SQL, only with the added option to specify the name of the schema where to find the definition of the target tables.

  • The matching is done in pgloader itself, with a Common Lisp regular expression lib, so doesn't depend on the LIKE implementation of MS SQL, nor on the lack of support for regular expressions in the engine.

Driver setup and encoding

pgloader is using the FreeTDS driver, and internally expects the data to be sent in utf-8. To achieve that, you can configure the FreeTDS driver with those defaults, in the file ~/.freetds.conf:

[global]  
-	tds version = 7.4  
-	client charset = UTF-8 

DEFAULT MS SQL CASTING RULES

When migrating from MS SQL the following Casting Rules are provided:

Numbers:

  • type tinyint to smallint

  • type float to float using float-to-string

  • type real to real using float-to-string
  • type double to double precision using float-to-string
  • type numeric to numeric using float-to-string
  • type decimal to numeric using float-to-string
  • type money to numeric using float-to-string
  • type smallmoney to numeric using float-to-string

Texts:

  • type char to text drop typemod
  • type nchat to text drop typemod
  • type varchar to text drop typemod
  • type nvarchar to text drop typemod
  • type xml to text drop typemod

Binary:

  • type binary to bytea using byte-vector-to-bytea
  • type varbinary to bytea using byte-vector-to-bytea

Date:

  • type datetime to timestamptz
  • type datetime2 to timestamptz

Others:

  • type bit to boolean
  • type hierarchyid to bytea
  • type geography to bytea
  • type uniqueidentifier to uuid using sql-server-uniqueidentifier-to-uuid

TRANSFORMATION FUNCTIONS

Some data types are implemented in a different enough way that a transformation function is necessary. This function must be written in Common lisp and is searched in the pgloader.transforms package.

Some default transformation function are provided with pgloader, and you can use the --load command line option to load and compile your own lisp file into pgloader at runtime. For your functions to be found, remember to begin your lisp file with the following form:

(in-package #:pgloader.transforms) 

The provided transformation functions are:

  • zero-dates-to-null

    When the input date is all zeroes, return nil, which gets loaded as a PostgreSQL NULL value.

  • date-with-no-separator

    Applies zero-dates-to-null then transform the given date into a format that PostgreSQL will actually process:

    In:  "20041002152952"  
    -Out: "2004-10-02 15:29:52" 
  • time-with-no-separator

    Transform the given time into a format that PostgreSQL will actually process:

    In:  "08231560"  
    -Out: "08:23:15.60" 
  • tinyint-to-boolean

    As MySQL lacks a proper boolean type, tinyint is often used to implement that. This function transforms 0 to 'false' and anything else to 'true'.

  • bits-to-boolean

    As MySQL lacks a proper boolean type, BIT is often used to implement that. This function transforms 1-bit bit vectors from 0 to f and any other value to t..

  • int-to-ip

    Convert an integer into a dotted representation of an ip4.

    In:  18435761  
    -Out: "1.25.78.177" 
  • ip-range

    Converts a couple of integers given as strings into a range of ip4.

    In:  "16825344" "16825599"  
    -Out: "1.0.188.0-1.0.188.255" 
  • convert-mysql-point

    Converts from the astext representation of points in MySQL to the PostgreSQL representation.

    In:  "POINT(48.5513589 7.6926827)"  
    -Out: "(48.5513589,7.6926827)" 
  • integer-to-string

    Converts a integer string or a Common Lisp integer into a string suitable for a PostgreSQL integer. Takes care of quoted integers.

    In:  "\"0\""  
    -Out: "0" 
  • float-to-string

    Converts a Common Lisp float into a string suitable for a PostgreSQL float:

    In:  100.0d0  
    -Out: "100.0" 
  • set-to-enum-array

    Converts a string representing a MySQL SET into a PostgreSQL Array of Enum values from the set.

    In: "foo,bar"  
    -Out: "{foo,bar}" 
  • empty-string-to-null

    Convert an empty string to a null.

  • right-trim

    Remove whitespace at end of string.

  • remove-null-characters

    Remove NUL characters (0x0) from given strings.

  • byte-vector-to-bytea

    Transform a simple array of unsigned bytes to the PostgreSQL bytea Hex Format representation as documented at http://www.postgresql.org/docs/9.3/interactive/datatype-binary.html

  • sqlite-timestamp-to-timestamp

    SQLite type system is quite interesting, so cope with it here to produce timestamp literals as expected by PostgreSQL. That covers year only on 4 digits, 0 dates to null, and proper date strings.

  • sql-server-uniqueidentifier-to-uuid

    The SQL Server driver receives data fo type uniqueidentifier as byte vector that we then need to convert to an UUID string for PostgreSQL COPY input format to process.

  • unix-timestamp-to-timestamptz

    Converts a unix timestamp (number of seconds elapsed since beginning of 1970) into a proper PostgreSQL timestamp format.

  • varbinary-to-string

    Converts binary encoded string (such as a MySQL varbinary entry) to a decoded text, using the table's encoding that may be overloaded with the DECODING TABLE NAMES MATCHING clause.

LOAD MESSAGES

This command is still experimental and allows receiving messages via UDP using a syslog like format, and, depending on rule matching, loads named portions of the data stream into a destination table.

LOAD MESSAGES  
-    FROM syslog://localhost:10514/  
- 
- WHEN MATCHES rsyslog-msg IN apache  
-  REGISTERING timestamp, ip, rest  
-         INTO postgresql://localhost/db?logs.apache  
-          SET guc_1 = 'value', guc_2 = 'other value'  
- 
- WHEN MATCHES rsyslog-msg IN others  
-  REGISTERING timestamp, app-name, data  
-         INTO postgresql://localhost/db?logs.others  
-          SET guc_1 = 'value', guc_2 = 'other value'  
- 
-    WITH apache = rsyslog  
-         DATA   = IP REST  
-         IP     = 1*3DIGIT "." 1*3DIGIT "."1*3DIGIT "."1*3DIGIT  
-         REST   = ~/.*/  
- 
-    WITH others = rsyslog; 

As the command is still experimental the options might be changed in the future and the details are not documented.

AUTHOR

Dimitri Fontaine

SEE ALSO

PostgreSQL COPY documentation at .

The pgloader source code, binary packages, documentation and examples may be downloaded from .

-
-
- - - - -
- - - - - - - - - - - diff --git a/docs/howto/quickstart.html b/docs/howto/quickstart.html deleted file mode 100644 index 0508f8b..0000000 --- a/docs/howto/quickstart.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - - - - - pgloader - - - - - - - - - - - - - - -
-
-
-
-

pgloader: a quickstart

In simple cases, pgloader is very easy to use.

CSV

Load data from a CSV file into a pre-existing table in your database:

pgloader --type csv                                   \  
-         --field id --field field                     \  
-         --with truncate                              \  
-         --with "fields terminated by ','"            \  
-         ./test/data/matching-1.csv                   \  
-         postgres:///pgloader?tablename=matching 

In that example the whole loading is driven from the command line, bypassing the need for writing a command in the pgloader command syntax entirely. As there's no command though, the extra information needed must be provided on the command line using the --type and --field and --with switches.

For documentation about the available syntaxes for the --field and --with switches, please refer to the CSV section later in the man page.

Note also that the PostgreSQL URI includes the target tablename.

Reading from STDIN

File based pgloader sources can be loaded from the standard input, as in the following example:

pgloader --type csv                                         \  
-         --field "usps,geoid,aland,awater,aland_sqmi,awater_sqmi,intptlat,intptlong" \  
-         --with "skip header = 1"                          \  
-         --with "fields terminated by '\t'"                \  
-         -                                                 \  
-         postgresql:///pgloader?districts_longlat          \  
-         < test/data/2013_Gaz_113CDs_national.txt 

The dash (-) character as a source is used to mean standard input, as usual in Unix command lines. It's possible to stream compressed content to pgloader with this technique, using the Unix pipe:

gunzip -c source.gz | pgloader --type csv ... - pgsql:///target?foo 

Loading from CSV available through HTTP

The same command as just above can also be run if the CSV file happens to be found on a remote HTTP location:

pgloader --type csv                                                     \  
-         --field "usps,geoid,aland,awater,aland_sqmi,awater_sqmi,intptlat,intptlong" \  
-         --with "skip header = 1"                                       \  
-         --with "fields terminated by '\t'"                             \  
-         http://pgsql.tapoueh.org/temp/2013_Gaz_113CDs_national.txt     \  
-         postgresql:///pgloader?districts_longlat 

Some more options have to be used in that case, as the file contains a one-line header (most commonly that's column names, could be a copyright notice). Also, in that case, we specify all the fields right into a single --field option argument.

Again, the PostgreSQL target connection string must contain the tablename option and you have to ensure that the target table exists and may fit the data. Here's the SQL command used in that example in case you want to try it yourself:

create table districts_longlat  
-(  
-         usps        text,  
-         geoid       text,  
-         aland       bigint,  
-         awater      bigint,  
-         aland_sqmi  double precision,  
-         awater_sqmi double precision,  
-         intptlat    double precision,  
-         intptlong   double precision  
-); 

Also notice that the same command will work against an archived version of the same data.

Streaming CSV data from an HTTP compressed file

Finally, it's important to note that pgloader first fetches the content from the HTTP URL it to a local file, then expand the archive when it's recognized to be one, and only then processes the locally expanded file.

In some cases, either because pgloader has no direct support for your archive format or maybe because expanding the archive is not feasible in your environment, you might want to stream the content straight from its remote location into PostgreSQL. Here's how to do that, using the old battle tested Unix Pipes trick:

curl http://pgsql.tapoueh.org/temp/2013_Gaz_113CDs_national.txt.gz \  
-| gunzip -c                                                        \  
-| pgloader --type csv                                              \  
-           --field "usps,geoid,aland,awater,aland_sqmi,awater_sqmi,intptlat,intptlong"  
-           --with "skip header = 1"                                \  
-           --with "fields terminated by '\t'"                      \  
-           -                                                       \  
-           postgresql:///pgloader?districts_longlat 

Now the OS will take care of the streaming and buffering between the network and the commands and pgloader will take care of streaming the data down to PostgreSQL.

Migrating from SQLite

The following command will open the SQLite database, discover its tables definitions including indexes and foreign keys, migrate those definitions while casting the data type specifications to their PostgreSQL equivalent and then migrate the data over:

createdb newdb  
-pgloader ./test/sqlite/sqlite.db postgresql:///newdb 

Migrating from MySQL

Just create a database where to host the MySQL data and definitions and have pgloader do the migration for you in a single command line:

createdb pagila  
-pgloader mysql://user@localhost/sakila postgresql:///pagila 

Fetching an archived DBF file from a HTTP remote location

It's possible for pgloader to download a file from HTTP, unarchive it, and only then open it to discover the schema then load the data:

createdb foo  
-pgloader --type dbf http://www.insee.fr/fr/methodes/nomenclatures/cog/telechargement/2013/dbf/historiq2013.zip postgresql:///foo 

Here it's not possible for pgloader to guess the kind of data source it's being given, so it's necessary to use the --type command line switch.

-
-
- - - - -
- - - - - - - - - - - diff --git a/docs/howto/sqlite.html b/docs/howto/sqlite.html deleted file mode 100644 index e9ec1a9..0000000 --- a/docs/howto/sqlite.html +++ /dev/null @@ -1,191 +0,0 @@ - - - - - - - - - - - pgloader - - - - - - - - - - - - - - -
-
-
-
-

Loading SQLite files with pgloader

The SQLite database is a respected solution to manage your data with. Its embeded nature makes it a source of migrations when a projects now needs to handle more concurrency, which PostgreSQL is very good at. pgloader can help you there.

In a Single Command Line

You can

$ createdb chinook  
-$ pgloader https://github.com/lerocha/chinook-database/raw/master/ChinookDatabase/DataSources/Chinook_Sqlite_AutoIncrementPKs.sqlite pgsql:///chinook 

Done! All with the schema, data, constraints, primary keys and foreign keys, etc. We also see an error with the Chinook schema that contains several primary key definitions against the same table, which is not accepted by PostgreSQL:

2017-06-20T16:18:59.019000+02:00 LOG Data errors in '/private/tmp/pgloader/'  
-2017-06-20T16:18:59.236000+02:00 LOG Fetching 'https://github.com/lerocha/chinook-database/raw/master/ChinookDatabase/DataSources/Chinook_Sqlite_AutoIncrementPKs.sqlite'  
-2017-06-20T16:19:00.664000+02:00 ERROR Database error 42P16: multiple primary keys for table "playlisttrack" are not allowed  
-QUERY: ALTER TABLE playlisttrack ADD PRIMARY KEY USING INDEX idx_66873_sqlite_autoindex_playlisttrack_1;  
-2017-06-20T16:19:00.665000+02:00 LOG report summary reset  
-             table name       read   imported     errors      total time  
------------------------  ---------  ---------  ---------  --------------  
-                  fetch          0          0          0          0.877s  
-        fetch meta data         33         33          0          0.033s  
-         Create Schemas          0          0          0          0.003s  
-       Create SQL Types          0          0          0          0.006s  
-          Create tables         22         22          0          0.043s  
-         Set Table OIDs         11         11          0          0.012s  
------------------------  ---------  ---------  ---------  --------------  
-                  album        347        347          0          0.023s  
-                 artist        275        275          0          0.023s  
-               customer         59         59          0          0.021s  
-               employee          8          8          0          0.018s  
-                invoice        412        412          0          0.031s  
-                  genre         25         25          0          0.021s  
-            invoiceline       2240       2240          0          0.034s  
-              mediatype          5          5          0          0.025s  
-          playlisttrack       8715       8715          0          0.040s  
-               playlist         18         18          0          0.016s  
-                  track       3503       3503          0          0.111s  
------------------------  ---------  ---------  ---------  --------------  
-COPY Threads Completion         33         33          0          0.313s  
-         Create Indexes         22         22          0          0.160s  
- Index Build Completion         22         22          0          0.027s  
-        Reset Sequences          0          0          0          0.017s  
-           Primary Keys         12          0          1          0.013s  
-    Create Foreign Keys         11         11          0          0.040s  
-        Create Triggers          0          0          0          0.000s  
-       Install Comments          0          0          0          0.000s  
------------------------  ---------  ---------  ---------  --------------  
-      Total import time      15607      15607          0          1.669s 

You may need to have special cases to take care of tho. In advanced case you can use the pgloader command.

The Command

To load data with pgloader you need to define in a command the operations in some details. Here's our command:

load database  
-     from 'sqlite/Chinook_Sqlite_AutoIncrementPKs.sqlite'  
-     into postgresql:///pgloader  
- 
- with include drop, create tables, create indexes, reset sequences  
- 
-  set work_mem to '16MB', maintenance_work_mem to '512 MB'; 

You can see the full list of options in the pgloader reference manual, with a complete description of the options you see here.

Note that here pgloader will benefit from the meta-data information found in the SQLite file to create a PostgreSQL database capable of hosting the data as described, then load the data.

Loading the data

Let's start the pgloader command with our sqlite.load command file:

$ pgloader sqlite.load  
-... LOG Starting pgloader, log system is ready.  
-... LOG Parsing commands from file "/Users/dim/dev/pgloader/test/sqlite.load"  
-... WARNING Postgres warning: table "album" does not exist, skipping  
-... WARNING Postgres warning: table "artist" does not exist, skipping  
-... WARNING Postgres warning: table "customer" does not exist, skipping  
-... WARNING Postgres warning: table "employee" does not exist, skipping  
-... WARNING Postgres warning: table "genre" does not exist, skipping  
-... WARNING Postgres warning: table "invoice" does not exist, skipping  
-... WARNING Postgres warning: table "invoiceline" does not exist, skipping  
-... WARNING Postgres warning: table "mediatype" does not exist, skipping  
-... WARNING Postgres warning: table "playlist" does not exist, skipping  
-... WARNING Postgres warning: table "playlisttrack" does not exist, skipping  
-... WARNING Postgres warning: table "track" does not exist, skipping  
-            table name       read   imported     errors            time  
-----------------------  ---------  ---------  ---------  --------------  
-      create, truncate          0          0          0          0.052s  
-                 Album        347        347          0          0.070s  
-                Artist        275        275          0          0.014s  
-              Customer         59         59          0          0.014s  
-              Employee          8          8          0          0.012s  
-                 Genre         25         25          0          0.018s  
-               Invoice        412        412          0          0.032s  
-           InvoiceLine       2240       2240          0          0.077s  
-             MediaType          5          5          0          0.012s  
-              Playlist         18         18          0          0.008s  
-         PlaylistTrack       8715       8715          0          0.071s  
-                 Track       3503       3503          0          0.105s  
-index build completion          0          0          0          0.000s  
-----------------------  ---------  ---------  ---------  --------------  
-        Create Indexes         20         20          0          0.279s  
-       reset sequences          0          0          0          0.043s  
-----------------------  ---------  ---------  ---------  --------------  
-  Total streaming time      15607      15607          0          0.476s 

We can see that http://pgloader.io did download the file from its HTTP URL location then unziped it before loading it.

Also, the WARNING messages we see here are expected as the PostgreSQL database is empty when running the command, and pgloader is using the SQL commands DROP TABLE IF EXISTS when the given command uses the include drop option.

Note that the output of the command has been edited to facilitate its browsing online.

-
-
- - - - -
- - - - - - - - - - - diff --git a/docs/img/2ndquadrant_logo_full_color.640.jpg b/docs/img/2ndquadrant_logo_full_color.640.jpg deleted file mode 100644 index f9157e262226fadd1f5622ab6e2f9012ae47eeec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31574 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 diff --git a/docs/img/2ndquadrant_logo_full_color.800.jpg b/docs/img/2ndquadrant_logo_full_color.800.jpg deleted file mode 100644 index 86f4c6b4322e48994f6d5b485338d93d29bec2ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41974 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 F{{`=#MM?kw diff --git a/docs/img/2ndquadrant_logo_full_color.jpg b/docs/img/2ndquadrant_logo_full_color.jpg deleted file mode 100644 index 4d938c54ae54fce845d380681942713e335e011b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64242 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 bTw~z`+#t4+f3Lp175M+3|C2d@{WJa_KT`gZ diff --git a/docs/img/bsd.svg b/docs/img/bsd.svg deleted file mode 100644 index e47ce6d..0000000 --- a/docs/img/bsd.svg +++ /dev/null @@ -1,171 +0,0 @@ - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/img/csv_text.png b/docs/img/csv_text.png deleted file mode 100644 index cd30e9330329bc5e364a2acb7aed35708fc606db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34700 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 (_HeEW3* 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 diff --git a/docs/img/fb-logo-4d-1000x168.COLOR.png b/docs/img/fb-logo-4d-1000x168.COLOR.png deleted file mode 100644 index 4bf3bdb54eb2bee7bbcd0f1cdd825f1b418cd0c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27983 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 diff --git a/docs/img/iwoca.png b/docs/img/iwoca.png deleted file mode 100644 index c25034af31621acf7e937147b879f9b9983eb98b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29784 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

S}E`z(2B{-yCh8;kt&j&nwmerp; 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 HejoS~R2NO# diff --git a/docs/img/sqlite.gif b/docs/img/sqlite.gif deleted file mode 100644 index c63fdc4556093ceb0ba41287faeaab0e1690304e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5452 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 diff --git a/docs/img/toy-loader.320.jpg b/docs/img/toy-loader.320.jpg deleted file mode 100644 index a9ddf65d839cb93e3d7cea0c3b20c0f9565ee250..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28972 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 K|Gdioo%~-jmqk1P diff --git a/docs/img/toy-loader.640.jpg b/docs/img/toy-loader.640.jpg deleted file mode 100644 index 8d501598d677601c94fe2b2cf1537f6174b20bbd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82128 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 Tl%s!ZRr9aE;{U%-|C#!4t-3Wd diff --git a/docs/img/type-casting-machine.320.jpg b/docs/img/type-casting-machine.320.jpg deleted file mode 100644 index 0ab7ff7f3992733f54128a1cda9a7c019fb5cd79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25453 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 diff --git a/docs/img/type-casting-machine.500.jpg b/docs/img/type-casting-machine.500.jpg deleted file mode 100644 index 37288bfef69894d8659c35afe53d60d54fe8cafe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57019 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�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 diff --git a/docs/img/type-casting-machine.640.jpg b/docs/img/type-casting-machine.640.jpg deleted file mode 100644 index 56331d53ae6f5a1533129af31b57a313c40ed6ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87209 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 diff --git a/docs/index.html b/docs/index.html deleted file mode 100644 index 5cd7b96..0000000 --- a/docs/index.html +++ /dev/null @@ -1,213 +0,0 @@ - - - - - - - - - - - - pgloader - - - - - - - - - -

- - - - - - - - -
-
-
-

Why did pgloader get so much faster?

- -
-
- -
- - - - - -
-
-

Migrate from MySQL to PostgreSQL. In one command.

-

Given a MySQL connection string, pgloader query - the catalogs to list your tables, constraints and indexes and know - how to transform this schema into a PostgreSQL equivalent, - applying advanced casting rules that you can edit in the - command.

-

Migrate some tinyint to boolean and some others - to smallint all from the same tool!

-

View details »

-
-
- MySQL to PostgreSQL with Custom Type Casting -
-
- -
- -
-
- CSV data format -
-
-

Load any CSV file. Real quick.

-

The current version of pgloader is up to ten - times faster than the previous one. The new command syntax - is really powerful, and as it's different enough from the previous - version, pgloader includes a command line switch to upgrade your - setup for you.

-

View details »

-
-
- -
- -
-
-

Transform your data. While streaming.

-

pgloader includes reformating modules allowing you - to reformat your data, such as transforming a couple of integer - columns into a single ip address, or a couple of floats - into a single point. Of course, you can add any - transformation you like and easily get to use it with - pgloader loading your code!

-

View details »

-
-
- Transform Data -
-
- -
- - - - - - - -
- - - - - - - - - - - - diff --git a/docs/index.rst b/docs/index.rst new file mode 100644 index 0000000..d69915e --- /dev/null +++ b/docs/index.rst @@ -0,0 +1,33 @@ +.. pgloader documentation master file, created by + sphinx-quickstart on Tue Dec 5 19:23:32 2017. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to pgloader's documentation! +==================================== + +.. toctree:: + :maxdepth: 2 + :caption: Table Of Contents: + + intro + tutorial/tutorial + pgloader + ref/csv + ref/fixed + ref/copy + ref/dbf + ref/ixf + ref/archive + ref/mysql + ref/sqlite + ref/mssql + ref/transforms + bugreport + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/docs/intro.rst b/docs/intro.rst new file mode 100644 index 0000000..0dc75e2 --- /dev/null +++ b/docs/intro.rst @@ -0,0 +1,63 @@ +Introduction +============ + +pgloader loads data from various sources into PostgreSQL. It can +transform the data it reads on the fly and submit raw SQL before and +after the loading. It uses the `COPY` PostgreSQL protocol to stream +the data into the server, and manages errors by filling a pair of +*reject.dat* and *reject.log* files. + +pgloader knows how to read data from different kind of sources: + + * Files + * CSV + * Fixed Format + * DBF + * Databases + * SQLite + * MySQL + * MS SQL Server + +The level of automation provided by pgloader depends on the data source +type. In the case of CSV and Fixed Format files, a full description of the +expected input properties must be given to pgloader. In the case of a +database, pgloader connects to the live service and knows how to fetch the +metadata it needs directly from it. + +Continuous Migration +-------------------- + +pgloader is meant to migrate a whole database in a single command line and +without any manual intervention. The goal is to be able to setup a +*Continuous Integration* environment as described in the `Project +Methodology `_ document of the `MySQL to +PostgreSQL `_ webpage. + + 1. Setup your target PostgreSQL Architecture + 2. Fork a Continuous Integration environment that uses PostgreSQL + 3. Migrate the data over and over again every night, from production + 4. As soon as the CI is all green using PostgreSQL, schedule the D-Day + 5. Migrate without suprise and enjoy! + +In order to be able to follow this great methodology, you need tooling to +implement the third step in a fully automated way. That's pgloader. + +Commands +-------- + +pgloader implements its own *Command Language*, a DSL that allows to specify +every aspect of the data load and migration to implement. Some of the +features provided in the language are only available for a specific source +type. + +Command Line +------------ + +The pgloader command line accepts those two variants:: + + pgloader [] []... + pgloader [] SOURCE TARGET + +Either you have a *command-file* containing migration specifications in the +pgloader *Command Language*, or you can give a *Source* for the data and a +PostgreSQL database connection *Target* where to load the data into. diff --git a/docs/pgloader-moral-license.html b/docs/pgloader-moral-license.html deleted file mode 100644 index 3416f27..0000000 --- a/docs/pgloader-moral-license.html +++ /dev/null @@ -1,165 +0,0 @@ - - - - - - - - - - - - pgloader - - - - - - - - - - - - - - - -
-
-
-

- pgloader Moral License -

-

- The pgloader project is fully Open Source and released - under The - PostgreSQL License so that anyone can easily contribute to - the project. The whole project management (issue tracking, - feature proposals, etc) happens on - the pgloader - github page, in public. -

- - BSD - -
-

- Software development may be open, and the result shared with an - Open Source Software licence, but the actual hours of - programming are not gratis. -

-

- Just like everybody else, I need money for mortgage, kids and - food, money I make by doing things with computers, for people - who are willing to pay for that. - - One of the things I do for money, is develop pgloader, and the - pgloader Moral License is a good vehicle available for - the paperwork. I shamelessly stole the whole idea - from The Varnish Moral - License. See - the Varnish - Moral License FAQ and How To to see how PHK does it. -

-

Buy your license here:

-
-
- - - - -
-
-

- If you have very custom needs and require more paperwork, of - course that is still possible too, just get in touch - at dim@tapoueh.org! -

- - -
- - - - - - - - - - - - diff --git a/docs/pgloader-usage-examples.rst b/docs/pgloader-usage-examples.rst new file mode 100644 index 0000000..72223b9 --- /dev/null +++ b/docs/pgloader-usage-examples.rst @@ -0,0 +1,163 @@ +Pgloader Usage Examples +======================= + +Currently not included, because redundant with the tutorial. + +Usage Examples +-------------- + +Review the command line options and pgloader's version:: + + pgloader --help + pgloader --version + +Loading from a complex command +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Use the command file as the pgloader command argument, pgloader will parse +that file and execute the commands found in it:: + + pgloader --verbose ./test/csv-districts.load + +CSV +^^^ + +Load data from a CSV file into a pre-existing table in your database, having +pgloader guess the CSV properties (separator, quote and escape character):: + + pgloader ./test/data/matching-1.csv pgsql:///pgloader?tablename=matching + +Load data from a CSV file into a pre-existing table in your database, with +expanded options:: + + pgloader --type csv \ + --field id --field field \ + --with truncate \ + --with "fields terminated by ','" \ + ./test/data/matching-1.csv \ + postgres:///pgloader?tablename=matching + +In that example the whole loading is driven from the command line, bypassing +the need for writing a command in the pgloader command syntax entirely. As +there's no command though, the extra inforamtion needed must be provided on +the command line using the `--type` and `--field` and `--with` switches. + +For documentation about the available syntaxes for the `--field` and +`--with` switches, please refer to the CSV section later in the man page. + +Note also that the PostgreSQL URI includes the target *tablename*. + +Reading from STDIN +^^^^^^^^^^^^^^^^^^ + +File based pgloader sources can be loaded from the standard input, as in the +following example:: + + pgloader --type csv \ + --field "usps,geoid,aland,awater,aland_sqmi,awater_sqmi,intptlat,intptlong" \ + --with "skip header = 1" \ + --with "fields terminated by '\t'" \ + - \ + postgresql:///pgloader?districts_longlat \ + < test/data/2013_Gaz_113CDs_national.txt + +The dash (`-`) character as a source is used to mean *standard input*, as +usual in Unix command lines. It's possible to stream compressed content to +pgloader with this technique, using the Unix pipe: + + gunzip -c source.gz | pgloader --type csv ... - pgsql:///target?foo + +Loading from CSV available through HTTP +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The same command as just above can also be run if the CSV file happens to be +found on a remote HTTP location:: + + pgloader --type csv \ + --field "usps,geoid,aland,awater,aland_sqmi,awater_sqmi,intptlat,intptlong" \ + --with "skip header = 1" \ + --with "fields terminated by '\t'" \ + http://pgsql.tapoueh.org/temp/2013_Gaz_113CDs_national.txt \ + postgresql:///pgloader?districts_longlat + +Some more options have to be used in that case, as the file contains a +one-line header (most commonly that's column names, could be a copyright +notice). Also, in that case, we specify all the fields right into a single +`--field` option argument. + +Again, the PostgreSQL target connection string must contain the *tablename* +option and you have to ensure that the target table exists and may fit the +data. Here's the SQL command used in that example in case you want to try it +yourself:: + + create table districts_longlat + ( + usps text, + geoid text, + aland bigint, + awater bigint, + aland_sqmi double precision, + awater_sqmi double precision, + intptlat double precision, + intptlong double precision + ); + +Also notice that the same command will work against an archived version of +the same data, e.g. +http://pgsql.tapoueh.org/temp/2013_Gaz_113CDs_national.txt.gz. + +Finally, it's important to note that pgloader first fetches the content from +the HTTP URL it to a local file, then expand the archive when it's +recognized to be one, and only then processes the locally expanded file. + +In some cases, either because pgloader has no direct support for your +archive format or maybe because expanding the archive is not feasible in +your environment, you might want to *stream* the content straight from its +remote location into PostgreSQL. Here's how to do that, using the old battle +tested Unix Pipes trick:: + + curl http://pgsql.tapoueh.org/temp/2013_Gaz_113CDs_national.txt.gz \ + | gunzip -c \ + | pgloader --type csv \ + --field "usps,geoid,aland,awater,aland_sqmi,awater_sqmi,intptlat,intptlong" + --with "skip header = 1" \ + --with "fields terminated by '\t'" \ + - \ + postgresql:///pgloader?districts_longlat + +Now the OS will take care of the streaming and buffering between the network +and the commands and pgloader will take care of streaming the data down to +PostgreSQL. + +Migrating from SQLite +^^^^^^^^^^^^^^^^^^^^^ + +The following command will open the SQLite database, discover its tables +definitions including indexes and foreign keys, migrate those definitions +while *casting* the data type specifications to their PostgreSQL equivalent +and then migrate the data over:: + + createdb newdb + pgloader ./test/sqlite/sqlite.db postgresql:///newdb + +Migrating from MySQL +^^^^^^^^^^^^^^^^^^^^ + +Just create a database where to host the MySQL data and definitions and have +pgloader do the migration for you in a single command line:: + + createdb pagila + pgloader mysql://user@localhost/sakila postgresql:///pagila + +Fetching an archived DBF file from a HTTP remote location +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +It's possible for pgloader to download a file from HTTP, unarchive it, and +only then open it to discover the schema then load the data:: + + createdb foo + pgloader --type dbf http://www.insee.fr/fr/methodes/nomenclatures/cog/telechargement/2013/dbf/historiq2013.zip postgresql:///foo + +Here it's not possible for pgloader to guess the kind of data source it's +being given, so it's necessary to use the `--type` command line switch. + diff --git a/docs/pgloader.rst b/docs/pgloader.rst new file mode 100644 index 0000000..fb51bdf --- /dev/null +++ b/docs/pgloader.rst @@ -0,0 +1,713 @@ +PgLoader Reference Manual +========================= + +pgloader loads data from various sources into PostgreSQL. It can +transform the data it reads on the fly and submit raw SQL before and +after the loading. It uses the `COPY` PostgreSQL protocol to stream +the data into the server, and manages errors by filling a pair of +*reject.dat* and *reject.log* files. + +pgloader operates either using commands which are read from files:: + + pgloader commands.load + +or by using arguments and options all provided on the command line:: + + pgloader SOURCE TARGET + +Arguments +--------- + +The pgloader arguments can be as many load files as needed, or a couple of +connection strings to a specific input file. + +Source Connection String +^^^^^^^^^^^^^^^^^^^^^^^^ + +The source connection string format is as follows:: + + format:///absolute/path/to/file.ext + format://./relative/path/to/file.ext + +Where format might be one of `csv`, `fixed`, `copy`, `dbf`, `db3` or `ixf`.:: + + db://user:pass@host:port/dbname + +Where db might be of `sqlite`, `mysql` or `mssql`. + +When using a file based source format, pgloader also support natively +fetching the file from an http location and decompressing an archive if +needed. In that case it's necessary to use the `--type` option to specify +the expected format of the file. See the examples below. + +Also note that some file formats require describing some implementation +details such as columns to be read and delimiters and quoting when loading +from csv. + +For more complex loading scenarios, you will need to write a full fledge +load command in the syntax described later in this document. + +Target Connection String +^^^^^^^^^^^^^^^^^^^^^^^^ + +The target connection string format is described in details later in this +document, see Section Connection String. + +Options +------- + +Inquiry Options +^^^^^^^^^^^^^^^ + +Use these options when you want to know more about how to use `pgloader`, as +those options will cause `pgloader` not to load any data. + + * `-h`, `--help` + + Show command usage summary and exit. + + * `-V`, `--version` + + Show pgloader version string and exit. + + * `-E`, `--list-encodings` + + List known encodings in this version of pgloader. + + * `-U`, `--upgrade-config` + + Parse given files in the command line as `pgloader.conf` files with the + `INI` syntax that was in use in pgloader versions 2.x, and output the + new command syntax for pgloader on standard output. + + +General Options +^^^^^^^^^^^^^^^ + +Those options are meant to tweak `pgloader` behavior when loading data. + + * `-v`, `--verbose` + + Be verbose. + + * `-q`, `--quiet` + + Be quiet. + + * `-d`, `--debug` + + Show debug level information messages. + + * `-D`, `--root-dir` + + Set the root working directory (default to "/tmp/pgloader"). + + * `-L`, `--logfile` + + Set the pgloader log file (default to "/tmp/pgloader.log"). + + * `--log-min-messages` + + Minimum level of verbosity needed for log message to make it to the + logfile. One of critical, log, error, warning, notice, info or debug. + + * `--client-min-messages` + + Minimum level of verbosity needed for log message to make it to the + console. One of critical, log, error, warning, notice, info or debug. + + * `-S`, `--summary` + + A filename where to copy the summary output. When relative, the filename + is expanded into `*root-dir*`. + + The format of the filename defaults to being *human readable*. It is + possible to have the output in machine friendly formats such as *CSV*, + *COPY* (PostgreSQL's own COPY format) or *JSON* by specifying a filename + with the extension resp. `.csv`, `.copy` or `.json`. + + * `-l `, `--load-lisp-file ` + + Specify a lisp to compile and load into the pgloader image before + reading the commands, allowing to define extra transformation function. + Those functions should be defined in the `pgloader.transforms` package. + This option can appear more than once in the command line. + + * `--dry-run` + + Allow testing a `.load` file without actually trying to load any data. + It's useful to debug it until it's ok, in particular to fix connection + strings. + + * `--on-error-stop` + + Alter pgloader behavior: rather than trying to be smart about error + handling and continue loading good data, separating away the bad one, + just stop as soon as PostgreSQL refuses anything sent to it. Useful to + debug data processing, transformation function and specific type + casting. + + * `--self-upgrade ` + + Specify a where to find pgloader sources so that one of the + very first things it does is dynamically loading-in (and compiling to + machine code) another version of itself, usually a newer one like a very + recent git checkout. + +Command Line Only Operations +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Those options are meant to be used when using `pgloader` from the command +line only, rather than using a command file and the rich command clauses and +parser. In simple cases, it can be much easier to use the *SOURCE* and +*TARGET* directly on the command line, then tweak the loading with those +options: + + * `--with "option"` + + Allows setting options from the command line. You can use that option as + many times as you want. The option arguments must follow the *WITH* + clause for the source type of the `SOURCE` specification, as described + later in this document. + + * `--set "guc_name='value'"` + + Allows setting PostgreSQL configuration from the command line. Note that + the option parsing is the same as when used from the *SET* command + clause, in particular you must enclose the guc value with single-quotes. + + * `--field "..."` + + Allows setting a source field definition. Fields are accumulated in the + order given on the command line. It's possible to either use a `--field` + option per field in the source file, or to separate field definitions by + a comma, as you would do in the *HAVING FIELDS* clause. + + * `--cast "..."` + + Allows setting a specific casting rule for loading the data. + + * `--type csv|fixed|db3|ixf|sqlite|mysql|mssql` + + Allows forcing the source type, in case when the *SOURCE* parsing isn't + satisfying. + + * `--encoding ` + + Set the encoding of the source file to load data from. + + * `--before ` + + Parse given filename for SQL queries and run them against the target + database before loading the data from the source. The queries are parsed + by pgloader itself: they need to be terminated by a semi-colon (;) and + the file may include `\i` or `\ir` commands to *include* another file. + + * `--after ` + + Parse given filename for SQL queries and run them against the target + database after having loaded the data from the source. The queries are + parsed in the same way as with the `--before` option, see above. + +More Debug Information +^^^^^^^^^^^^^^^^^^^^^^ + +To get the maximum amount of debug information, you can use both the +`--verbose` and the `--debug` switches at the same time, which is equivalent +to saying `--client-min-messages data`. Then the log messages will show the +data being processed, in the cases where the code has explicit support for +it. + +Batches And Retry Behaviour +--------------------------- + +To load data to PostgreSQL, pgloader uses the `COPY` streaming protocol. +While this is the faster way to load data, `COPY` has an important drawback: +as soon as PostgreSQL emits an error with any bit of data sent to it, +whatever the problem is, the whole data set is rejected by PostgreSQL. + +To work around that, pgloader cuts the data into *batches* of 25000 rows +each, so that when a problem occurs it's only impacting that many rows of +data. Each batch is kept in memory while the `COPY` streaming happens, in +order to be able to handle errors should some happen. + +When PostgreSQL rejects the whole batch, pgloader logs the error message +then isolates the bad row(s) from the accepted ones by retrying the batched +rows in smaller batches. To do that, pgloader parses the *CONTEXT* error +message from the failed COPY, as the message contains the line number where +the error was found in the batch, as in the following example:: + + CONTEXT: COPY errors, line 3, column b: "2006-13-11" + +Using that information, pgloader will reload all rows in the batch before +the erroneous one, log the erroneous one as rejected, then try loading the +remaining of the batch in a single attempt, which may or may not contain +other erroneous data. + +At the end of a load containing rejected rows, you will find two files in +the *root-dir* location, under a directory named the same as the target +database of your setup. The filenames are the target table, and their +extensions are `.dat` for the rejected data and `.log` for the file +containing the full PostgreSQL client side logs about the rejected data. + +The `.dat` file is formatted in PostgreSQL the text COPY format as documented +in `http://www.postgresql.org/docs/9.2/static/sql-copy.html#AEN66609`. + +A Note About Performance +------------------------ + +pgloader has been developed with performance in mind, to be able to cope +with ever growing needs in loading large amounts of data into PostgreSQL. + +The basic architecture it uses is the old Unix pipe model, where a thread is +responsible for loading the data (reading a CSV file, querying MySQL, etc) +and fills pre-processed data into a queue. Another threads feeds from the +queue, apply some more *transformations* to the input data and stream the +end result to PostgreSQL using the COPY protocol. + +When given a file that the PostgreSQL `COPY` command knows how to parse, and +if the file contains no erroneous data, then pgloader will never be as fast +as just using the PostgreSQL `COPY` command. + +Note that while the `COPY` command is restricted to read either from its +standard input or from a local file on the server's file system, the command +line tool `psql` implements a `\copy` command that knows how to stream a +file local to the client over the network and into the PostgreSQL server, +using the same protocol as pgloader uses. + +A Note About Parallelism +------------------------ + +pgloader uses several concurrent tasks to process the data being loaded: + + - a reader task reads the data in and pushes it to a queue, + + - at last one write task feeds from the queue and formats the raw into the + PostgreSQL COPY format in batches (so that it's possible to then retry a + failed batch without reading the data from source again), and then sends + the data to PostgreSQL using the COPY protocol. + +The parameter *workers* allows to control how many worker threads are +allowed to be active at any time (that's the parallelism level); and the +parameter *concurrency* allows to control how many tasks are started to +handle the data (they may not all run at the same time, depending on the +*workers* setting). + +We allow *workers* simultaneous workers to be active at the same time in the +context of a single table. A single unit of work consist of several kinds of +workers: + + - a reader getting raw data from the source, + - N writers preparing and sending the data down to PostgreSQL. + +The N here is setup to the *concurrency* parameter: with a *CONCURRENCY* of +2, we start (+ 1 2) = 3 concurrent tasks, with a *concurrency* of 4 we start +(+ 1 4) = 9 concurrent tasks, of which only *workers* may be active +simultaneously. + +The defaults are `workers = 4, concurrency = 1` when loading from a database +source, and `workers = 8, concurrency = 2` when loading from something else +(currently, a file). Those defaults are arbitrary and waiting for feedback +from users, so please consider providing feedback if you play with the +settings. + +As the `CREATE INDEX` threads started by pgloader are only waiting until +PostgreSQL is done with the real work, those threads are *NOT* counted into +the concurrency levels as detailed here. + +By default, as many `CREATE INDEX` threads as the maximum number of indexes +per table are found in your source schema. It is possible to set the `max +parallel create index` *WITH* option to another number in case there's just +too many of them to create. + +Source Formats +-------------- + +pgloader supports the following input formats: + + - csv, which includes also tsv and other common variants where you can + change the *separator* and the *quoting* rules and how to *escape* the + *quotes* themselves; + + - fixed columns file, where pgloader is flexible enough to accomodate with + source files missing columns (*ragged fixed length column files* do + exist); + + - PostgreSLQ COPY formatted files, following the COPY TEXT documentation + of PostgreSQL, such as the reject files prepared by pgloader; + + - dbase files known as db3 or dbf file; + + - ixf formated files, ixf being a binary storage format from IBM; + + - sqlite databases with fully automated discovery of the schema and + advanced cast rules; + + - mysql databases with fully automated discovery of the schema and + advanced cast rules; + + - MS SQL databases with fully automated discovery of the schema and + advanced cast rules. + +Pgloader Commands Syntax +------------------------ + +pgloader implements a Domain Specific Language allowing to setup complex +data loading scripts handling computed columns and on-the-fly sanitization +of the input data. For more complex data loading scenarios, you will be +required to learn that DSL's syntax. It's meant to look familiar to DBA by +being inspired by SQL where it makes sense, which is not that much after +all. + +The pgloader commands follow the same global grammar rules. Each of them +might support only a subset of the general options and provide specific +options. + +:: + + LOAD + FROM + [ HAVING FIELDS ] + INTO + [ TARGET TABLE [ "" ]."" ] + [ TARGET COLUMNS ] + + [ WITH ] + + [ SET ] + + [ BEFORE LOAD [ DO | EXECUTE ] ... ] + [ AFTER LOAD [ DO | EXECUTE ] ... ] + ; + +The main clauses are the `LOAD`, `FROM`, `INTO` and `WITH` clauses that each +command implements. Some command then implement the `SET` command, or some +specific clauses such as the `CAST` clause. + +Templating with Mustache +------------------------ + +pgloader implements the https://mustache.github.io/ templating system so +that you may have dynamic parts of your commands. See the documentation for +this template system online. + +A specific feature of pgloader is the ability to fetch a variable from the +OS environment of the pgloader process, making it possible to run pgloader +as in the following example:: + + $ DBPATH=sqlite/sqlite.db pgloader ./test/sqlite-env.load + +or in several steps:: + + $ export DBPATH=sqlite/sqlite.db + $ pgloader ./test/sqlite-env.load + +The variable can then be used in a typical mustache fashion:: + + load database + from '{{DBPATH}}' + into postgresql:///pgloader; + +It's also possible to prepare a INI file such as the following:: + + [pgloader] + + DBPATH = sqlite/sqlite.db + +And run the following command, feeding the INI values as a *context* for +pgloader templating system:: + + $ pgloader --context ./test/sqlite.ini ./test/sqlite-ini.load + +The mustache templates implementation with OS environment support replaces +former `GETENV` implementation, which didn't work anyway. + +Common Clauses +-------------- + +Some clauses are common to all commands: + +FROM +^^^^ + +The *FROM* clause specifies where to read the data from, and each command +introduces its own variant of sources. For instance, the *CSV* source +supports `inline`, `stdin`, a filename, a quoted filename, and a *FILENAME +MATCHING* clause (see above); whereas the *MySQL* source only supports a +MySQL database URI specification. + +INTO +^^^^ + +The PostgreSQL connection URI must contains the name of the target table +where to load the data into. That table must have already been created in +PostgreSQL, and the name might be schema qualified. + +Then *INTO* option also supports an optional comma separated list of target +columns, which are either the name of an input *field* or the white space +separated list of the target column name, its PostgreSQL data type and a +*USING* expression. + +The *USING* expression can be any valid Common Lisp form and will be read +with the current package set to `pgloader.transforms`, so that you can use +functions defined in that package, such as functions loaded dynamically with +the `--load` command line parameter. + +Each *USING* expression is compiled at runtime to native code. + +This feature allows pgloader to load any number of fields in a CSV file into +a possibly different number of columns in the database, using custom code +for that projection. + +WITH +^^^^ + +Set of options to apply to the command, using a global syntax of either: + + - *key = value* + - *use option* + - *do not use option* + +See each specific command for details. + +All data sources specific commands support the following options: + + - *on error stop* + - *batch rows = R* + - *batch size = ... MB* + - *prefetch rows = ...* + +See the section BATCH BEHAVIOUR OPTIONS for more details. + +In addition, the following settings are available: + + - *workers = W* + - *concurrency = C* + - *max parallel create index = I* + +See section A NOTE ABOUT PARALLELISM for more details. + +SET +^^^ + +This clause allows to specify session parameters to be set for all the +sessions opened by pgloader. It expects a list of parameter name, the equal +sign, then the single-quoted value as a comma separated list. + +The names and values of the parameters are not validated by pgloader, they +are given as-is to PostgreSQL. + +BEFORE LOAD DO +^^^^^^^^^^^^^^ + +You can run SQL queries against the database before loading the data from +the `CSV` file. Most common SQL queries are `CREATE TABLE IF NOT EXISTS` so +that the data can be loaded. + +Each command must be *dollar-quoted*: it must begin and end with a double +dollar sign, `$$`. Dollar-quoted queries are then comma separated. No extra +punctuation is expected after the last SQL query. + +BEFORE LOAD EXECUTE +^^^^^^^^^^^^^^^^^^^ + +Same behaviour as in the *BEFORE LOAD DO* clause. Allows you to read the SQL +queries from a SQL file. Implements support for PostgreSQL dollar-quoting +and the `\i` and `\ir` include facilities as in `psql` batch mode (where +they are the same thing). + +AFTER LOAD DO +^^^^^^^^^^^^^ + +Same format as *BEFORE LOAD DO*, the dollar-quoted queries found in that +section are executed once the load is done. That's the right time to create +indexes and constraints, or re-enable triggers. + +AFTER LOAD EXECUTE +^^^^^^^^^^^^^^^^^^ + +Same behaviour as in the *AFTER LOAD DO* clause. Allows you to read the SQL +queries from a SQL file. Implements support for PostgreSQL dollar-quoting +and the `\i` and `\ir` include facilities as in `psql` batch mode (where +they are the same thing). + +Connection String +^^^^^^^^^^^^^^^^^ + +The `` parameter is expected to be given as a *Connection URI* +as documented in the PostgreSQL documentation at +http://www.postgresql.org/docs/9.3/static/libpq-connect.html#LIBPQ-CONNSTRING. + +:: + + postgresql://[user[:password]@][netloc][:port][/dbname][?option=value&...] + +Where: + + - *user* + + Can contain any character, including colon (`:`) which must then be + doubled (`::`) and at-sign (`@`) which must then be doubled (`@@`). + + When omitted, the *user* name defaults to the value of the `PGUSER` + environment variable, and if it is unset, the value of the `USER` + environment variable. + + - *password* + + Can contain any character, including the at sign (`@`) which must then + be doubled (`@@`). To leave the password empty, when the *user* name + ends with at at sign, you then have to use the syntax user:@. + + When omitted, the *password* defaults to the value of the `PGPASSWORD` + environment variable if it is set, otherwise the password is left + unset. + + When no *password* is found either in the connection URI nor in the + environment, then pgloader looks for a `.pgpass` file as documented at + https://www.postgresql.org/docs/current/static/libpq-pgpass.html. The + implementation is not that of `libpq` though. As with `libpq` you can + set the environment variable `PGPASSFILE` to point to a `.pgpass` file, + and pgloader defaults to `~/.pgpass` on unix like systems and + `%APPDATA%\postgresql\pgpass.conf` on windows. Matching rules and syntax + are the same as with `libpq`, refer to its documentation. + + - *netloc* + + Can be either a hostname in dotted notation, or an ipv4, or an Unix + domain socket path. Empty is the default network location, under a + system providing *unix domain socket* that method is preferred, otherwise + the *netloc* default to `localhost`. + + It's possible to force the *unix domain socket* path by using the syntax + `unix:/path/to/where/the/socket/file/is`, so to force a non default + socket path and a non default port, you would have: + + postgresql://unix:/tmp:54321/dbname + + The *netloc* defaults to the value of the `PGHOST` environment + variable, and if it is unset, to either the default `unix` socket path + when running on a Unix system, and `localhost` otherwise. + + Socket path containing colons are supported by doubling the colons + within the path, as in the following example: + + postgresql://unix:/tmp/project::region::instance:5432/dbname + + - *dbname* + + Should be a proper identifier (letter followed by a mix of letters, + digits and the punctuation signs comma (`,`), dash (`-`) and underscore + (`_`). + + When omitted, the *dbname* defaults to the value of the environment + variable `PGDATABASE`, and if that is unset, to the *user* value as + determined above. + + - *options* + + The optional parameters must be supplied with the form `name=value`, and + you may use several parameters by separating them away using an + ampersand (`&`) character. + + Only some options are supported here, *tablename* (which might be + qualified with a schema name) *sslmode*, *host*, *port*, *dbname*, + *user* and *password*. + + The *sslmode* parameter values can be one of `disable`, `allow`, + `prefer` or `require`. + + For backward compatibility reasons, it's possible to specify the + *tablename* option directly, without spelling out the `tablename=` + parts. + + The options override the main URI components when both are given, and + using the percent-encoded option parameters allow using passwords + starting with a colon and bypassing other URI components parsing + limitations. + +Regular Expressions +^^^^^^^^^^^^^^^^^^^ + +Several clauses listed in the following accept *regular expressions* with +the following input rules: + + - A regular expression begins with a tilde sign (`~`), + + - is then followed with an opening sign, + + - then any character is allowed and considered part of the regular + expression, except for the closing sign, + + - then a closing sign is expected. + +The opening and closing sign are allowed by pair, here's the complete list +of allowed delimiters:: + + ~// + ~[] + ~{} + ~() + ~<> + ~"" + ~'' + ~|| + ~## + +Pick the set of delimiters that don't collide with the *regular expression* +you're trying to input. If your expression is such that none of the +solutions allow you to enter it, the places where such expressions are +allowed should allow for a list of expressions. + +Comments +^^^^^^^^ + +Any command may contain comments, following those input rules: + + - the `--` delimiter begins a comment that ends with the end of the + current line, + + - the delimiters `/*` and `*/` respectively start and end a comment, which + can be found in the middle of a command or span several lines. + +Any place where you could enter a *whitespace* will accept a comment too. + +Batch behaviour options +^^^^^^^^^^^^^^^^^^^^^^^ + +All pgloader commands have support for a *WITH* clause that allows for +specifying options. Some options are generic and accepted by all commands, +such as the *batch behaviour options*, and some options are specific to a +data source kind, such as the CSV *skip header* option. + +The global batch behaviour options are: + + - *batch rows* + + Takes a numeric value as argument, used as the maximum number of rows + allowed in a batch. The default is `25 000` and can be changed to try + having better performance characteristics or to control pgloader memory + usage; + + - *batch size* + + Takes a memory unit as argument, such as *20 MB*, its default value. + Accepted multipliers are *kB*, *MB*, *GB*, *TB* and *PB*. The case is + important so as not to be confused about bits versus bytes, we're only + talking bytes here. + + - *prefetch rows* + + Takes a numeric value as argument, defaults to `100000`. That's the + number of rows that pgloader is allowed to read in memory in each reader + thread. See the *workers* setting for how many reader threads are + allowed to run at the same time. + +Other options are specific to each input source, please refer to specific +parts of the documentation for their listing and covering. + +A batch is then closed as soon as either the *batch rows* or the *batch +size* threshold is crossed, whichever comes first. In cases when a batch has +to be closed because of the *batch size* setting, a *debug* level log +message is printed with how many rows did fit in the *oversized* batch. + diff --git a/docs/ref/archive.rst b/docs/ref/archive.rst new file mode 100644 index 0000000..1cb95c2 --- /dev/null +++ b/docs/ref/archive.rst @@ -0,0 +1,104 @@ +Loading From an Archive +======================= + +This command instructs pgloader to load data from one or more files contained +in an archive. Currently the only supported archive format is *ZIP*, and the +archive might be downloaded from an *HTTP* URL. + +Here's an example:: + + LOAD ARCHIVE + FROM /Users/dim/Downloads/GeoLiteCity-latest.zip + INTO postgresql:///ip4r + + BEFORE LOAD + DO $$ create extension if not exists ip4r; $$, + $$ create schema if not exists geolite; $$, + + EXECUTE 'geolite.sql' + + LOAD CSV + FROM FILENAME MATCHING ~/GeoLiteCity-Location.csv/ + WITH ENCODING iso-8859-1 + ( + locId, + country, + region null if blanks, + city null if blanks, + postalCode null if blanks, + latitude, + longitude, + metroCode null if blanks, + areaCode null if blanks + ) + INTO postgresql:///ip4r?geolite.location + ( + locid,country,region,city,postalCode, + location point using (format nil "(~a,~a)" longitude latitude), + metroCode,areaCode + ) + WITH skip header = 2, + fields optionally enclosed by '"', + fields escaped by double-quote, + fields terminated by ',' + + AND LOAD CSV + FROM FILENAME MATCHING ~/GeoLiteCity-Blocks.csv/ + WITH ENCODING iso-8859-1 + ( + startIpNum, endIpNum, locId + ) + INTO postgresql:///ip4r?geolite.blocks + ( + iprange ip4r using (ip-range startIpNum endIpNum), + locId + ) + WITH skip header = 2, + fields optionally enclosed by '"', + fields escaped by double-quote, + fields terminated by ',' + + FINALLY DO + $$ create index blocks_ip4r_idx on geolite.blocks using gist(iprange); $$; + +The `archive` command accepts the following clauses and options. + +Archive Source Specification: FROM +---------------------------------- + +Filename or HTTP URI where to load the data from. When given an HTTP URL the +linked file will get downloaded locally before processing. + +If the file is a `zip` file, the command line utility `unzip` is used to +expand the archive into files in `$TMPDIR`, or `/tmp` if `$TMPDIR` is unset +or set to a non-existing directory. + +Then the following commands are used from the top level directory where the +archive has been expanded. + +Archive Sub Commands +-------------------- + + - command [ *AND* command ... ] + + A series of commands against the contents of the archive, at the moment + only `CSV`,`'FIXED` and `DBF` commands are supported. + + Note that commands are supporting the clause *FROM FILENAME MATCHING* + which allows the pgloader command not to depend on the exact names of + the archive directories. + + The same clause can also be applied to several files with using the + spelling *FROM ALL FILENAMES MATCHING* and a regular expression. + + The whole *matching* clause must follow the following rule:: + + FROM [ ALL FILENAMES | [ FIRST ] FILENAME ] MATCHING + +Archive Final SQL Commands +-------------------------- + + - *FINALLY DO* + + SQL Queries to run once the data is loaded, such as `CREATE INDEX`. + diff --git a/docs/ref/copy.rst b/docs/ref/copy.rst new file mode 100644 index 0000000..e8b156d --- /dev/null +++ b/docs/ref/copy.rst @@ -0,0 +1,115 @@ +Loading COPY Formatted Files +============================ + +This commands instructs pgloader to load from a file containing COPY TEXT +data as described in the PostgreSQL documentation. Here's an example:: + + LOAD COPY + FROM copy://./data/track.copy + ( + trackid, track, album, media, genre, composer, + milliseconds, bytes, unitprice + ) + INTO postgresql:///pgloader + TARGET TABLE track_full + + WITH truncate + + SET work_mem to '14MB', + standard_conforming_strings to 'on' + + BEFORE LOAD DO + $$ drop table if exists track_full; $$, + $$ create table track_full ( + trackid bigserial, + track text, + album text, + media text, + genre text, + composer text, + milliseconds bigint, + bytes bigint, + unitprice numeric + ); + $$; + +The `COPY` format command accepts the following clauses and options. + +COPY Formatted Files Source Specification: FROM +----------------------------------------------- + +Filename where to load the data from. This support local files, HTTP URLs +and zip files containing a single dbf file of the same name. Fetch such a +zip file from an HTTP address is of course supported. + + - *inline* + + The data is found after the end of the parsed commands. Any number of + empty lines between the end of the commands and the beginning of the + data is accepted. + + - *stdin* + + Reads the data from the standard input stream. + + - *FILENAMES MATCHING* + + The whole *matching* clause must follow the following rule:: + + [ ALL FILENAMES | [ FIRST ] FILENAME ] + MATCHING regexp + [ IN DIRECTORY '...' ] + + The *matching* clause applies given *regular expression* (see above for + exact syntax, several options can be used here) to filenames. It's then + possible to load data from only the first match of all of them. + + The optional *IN DIRECTORY* clause allows specifying which directory to + walk for finding the data files, and can be either relative to where the + command file is read from, or absolute. The given directory must exists. + +COPY Formatted File Options: WITH +--------------------------------- + + +When loading from a `COPY` file, the following options are supported: + + - *delimiter* + + Takes a single character as argument, which must be found inside single + quotes, and might be given as the printable character itself, the + special value \t to denote a tabulation character, or `0x` then an + hexadecimal value read as the ASCII code for the character. + + This character is used as the *delimiter* when reading the data, in a + similar way to the PostgreSQL `COPY` option. + + - *null* + + Takes a quoted string as an argument (quotes can be either double quotes + or single quotes) and uses that string as the `NULL` representation in + the data. + + This is similar to the *null* `COPY` option in PostgreSQL. + + - *truncate* + + When this option is listed, pgloader issues a `TRUNCATE` command against + the PostgreSQL target table before reading the data file. + + - *disable triggers* + + When this option is listed, pgloader issues an `ALTER TABLE ... DISABLE + TRIGGER ALL` command against the PostgreSQL target table before copying + the data, then the command `ALTER TABLE ... ENABLE TRIGGER ALL` once the + `COPY` is done. + + This option allows loading data into a pre-existing table ignoring the + *foreign key constraints* and user defined triggers and may result in + invalid *foreign key constraints* once the data is loaded. Use with + care. + + - *skip header* + + Takes a numeric value as argument. Instruct pgloader to skip that many + lines at the beginning of the input file. diff --git a/docs/ref/csv.rst b/docs/ref/csv.rst new file mode 100644 index 0000000..243e8e6 --- /dev/null +++ b/docs/ref/csv.rst @@ -0,0 +1,237 @@ +Loading CSV data +================ + +This command instructs pgloader to load data from a `CSV` file. Here's an +example:: + + LOAD CSV + FROM 'GeoLiteCity-Blocks.csv' WITH ENCODING iso-646-us + HAVING FIELDS + ( + startIpNum, endIpNum, locId + ) + INTO postgresql://user@localhost:54393/dbname + TARGET TABLE geolite.blocks + TARGET COLUMNS + ( + iprange ip4r using (ip-range startIpNum endIpNum), + locId + ) + WITH truncate, + skip header = 2, + fields optionally enclosed by '"', + fields escaped by backslash-quote, + fields terminated by '\t' + + SET work_mem to '32 MB', maintenance_work_mem to '64 MB'; + +The `csv` format command accepts the following clauses and options. + +CSV Source Specification: FROM +------------------------------ + +Filename where to load the data from. Accepts an *ENCODING* option. Use the +`--list-encodings` option to know which encoding names are supported. + +The filename may be enclosed by single quotes, and could be one of the +following special values: + + - *inline* + + The data is found after the end of the parsed commands. Any number + of empty lines between the end of the commands and the beginning of + the data is accepted. + + - *stdin* + + Reads the data from the standard input stream. + + - *FILENAMES MATCHING* + + The whole *matching* clause must follow the following rule:: + + [ ALL FILENAMES | [ FIRST ] FILENAME ] + MATCHING regexp + [ IN DIRECTORY '...' ] + + The *matching* clause applies given *regular expression* (see above + for exact syntax, several options can be used here) to filenames. + It's then possible to load data from only the first match of all of + them. + + The optional *IN DIRECTORY* clause allows specifying which directory + to walk for finding the data files, and can be either relative to + where the command file is read from, or absolute. The given + directory must exists. + +Fields Specifications +--------------------- + +The *FROM* option also supports an optional comma separated list of *field* +names describing what is expected in the `CSV` data file, optionally +introduced by the clause `HAVING FIELDS`. + +Each field name can be either only one name or a name following with +specific reader options for that field, enclosed in square brackets and +comma-separated. Supported per-field reader options are: + + - *terminated by* + + See the description of *field terminated by* below. + + The processing of this option is not currently implemented. + + - *date format* + + When the field is expected of the date type, then this option allows + to specify the date format used in the file. + + Date format string are template strings modeled against the + PostgreSQL `to_char` template strings support, limited to the + following patterns: + + - YYYY, YYY, YY for the year part + - MM for the numeric month part + - DD for the numeric day part + - HH, HH12, HH24 for the hour part + - am, AM, a.m., A.M. + - pm, PM, p.m., P.M. + - MI for the minutes part + - SS for the seconds part + - MS for the milliseconds part (4 digits) + - US for the microseconds part (6 digits) + - unparsed punctuation signs: - . * # @ T / \ and space + + Here's an example of a *date format* specification:: + + column-name [date format 'YYYY-MM-DD HH24-MI-SS.US'] + + - *null if* + + This option takes an argument which is either the keyword *blanks* + or a double-quoted string. + + When *blanks* is used and the field value that is read contains + only space characters, then it's automatically converted to an SQL + `NULL` value. + + When a double-quoted string is used and that string is read as the + field value, then the field value is automatically converted to an + SQL `NULL` value. + + - *trim both whitespace*, *trim left whitespace*, *trim right whitespace* + + This option allows to trim whitespaces in the read data, either from + both sides of the data, or only the whitespace characters found on + the left of the streaing, or only those on the right of the string. + +CSV Loading Options: WITH +------------------------- + +When loading from a `CSV` file, the following options are supported: + + - *truncate* + + When this option is listed, pgloader issues a `TRUNCATE` command + against the PostgreSQL target table before reading the data file. + + - *drop indexes* + + When this option is listed, pgloader issues `DROP INDEX` commands + against all the indexes defined on the target table before copying + the data, then `CREATE INDEX` commands once the `COPY` is done. + + In order to get the best performance possible, all the indexes are + created in parallel and when done the primary keys are built again + from the unique indexes just created. This two step process allows + creating the primary key index in parallel with the other indexes, + as only the `ALTER TABLE` command needs an *access exclusive lock* + on the target table. + + - *disable triggers* + + When this option is listed, pgloader issues an `ALTER TABLE ... + DISABLE TRIGGER ALL` command against the PostgreSQL target table + before copying the data, then the command `ALTER TABLE ... ENABLE + TRIGGER ALL` once the `COPY` is done. + + This option allows loading data into a pre-existing table ignoring + the *foreign key constraints* and user defined triggers and may + result in invalid *foreign key constraints* once the data is loaded. + Use with care. + + - *skip header* + + Takes a numeric value as argument. Instruct pgloader to skip that + many lines at the beginning of the input file. + + - *csv header* + + Use the first line read after *skip header* as the list of csv field + names to be found in the CSV file, using the same CSV parameters as + for the CSV data. + + - *trim unquoted blanks* + + When reading unquoted values in the `CSV` file, remove the blanks + found in between the separator and the value. That behaviour is the + default. + + - *keep unquoted blanks* + + When reading unquoted values in the `CSV` file, keep blanks found in + between the separator and the value. + + - *fields optionally enclosed by* + + Takes a single character as argument, which must be found inside + single quotes, and might be given as the printable character itself, + the special value \t to denote a tabulation character, or `0x` then + an hexadecimal value read as the ASCII code for the character. + + This character is used as the quoting character in the `CSV` file, + and defaults to double-quote. + + - *fields not enclosed* + + By default, pgloader will use the double-quote character as the + enclosing character. If you have a CSV file where fields are not + enclosed and are using double-quote as an expected ordinary + character, then use the option *fields not enclosed* for the CSV + parser to accept those values. + + - *fields escaped by* + + Takes either the special value *backslash-quote* or *double-quote*, + or any value supported by the *fields terminated by* option (see + below). This value is used to recognize escaped field separators + when they are to be found within the data fields themselves. + Defaults to *double-quote*. + + - *csv escape mode* + + Takes either the special value *quote* (the default) or *following* + and allows the CSV parser to parse either only escaped field + separator or any character (including CSV data) when using the + *following* value. + + - *fields terminated by* + + Takes a single character as argument, which must be found inside + single quotes, and might be given as the printable character itself, + the special value \t to denote a tabulation character, or `0x` then + an hexadecimal value read as the ASCII code for the character. + + This character is used as the *field separator* when reading the + `CSV` data. + + - *lines terminated by* + + Takes a single character as argument, which must be found inside + single quotes, and might be given as the printable character itself, + the special value \t to denote a tabulation character, or `0x` then + an hexadecimal value read as the ASCII code for the character. + + This character is used to recognize *end-of-line* condition when + reading the `CSV` data. + diff --git a/docs/ref/dbf.rst b/docs/ref/dbf.rst new file mode 100644 index 0000000..28269f3 --- /dev/null +++ b/docs/ref/dbf.rst @@ -0,0 +1,53 @@ +Loading DBF data +================= + +This command instructs pgloader to load data from a `DBF` file. Here's an +example:: + + LOAD DBF + FROM http://www.insee.fr/fr/methodes/nomenclatures/cog/telechargement/2013/dbf/reg2013.dbf + INTO postgresql://user@localhost/dbname + WITH truncate, create table; + +The `dbf` format command accepts the following clauses and options. + +DBF Source Specification: FROM +------------------------------ + +Filename where to load the data from. This support local files, HTTP URLs +and zip files containing a single dbf file of the same name. Fetch such a +zip file from an HTTP address is of course supported. + +DBF Loading Options: WITH +------------------------- + +When loading from a `DBF` file, the following options are supported: + + - *truncate* + + When this option is listed, pgloader issues a `TRUNCATE` command against + the PostgreSQL target table before reading the data file. + + - *disable triggers* + + When this option is listed, pgloader issues an `ALTER TABLE ... DISABLE + TRIGGER ALL` command against the PostgreSQL target table before copying + the data, then the command `ALTER TABLE ... ENABLE TRIGGER ALL` once the + `COPY` is done. + + This option allows loading data into a pre-existing table ignoring the + *foreign key constraints* and user defined triggers and may result in + invalid *foreign key constraints* once the data is loaded. Use with + care. + + - *create table* + + When this option is listed, pgloader creates the table using the meta + data found in the `DBF` file, which must contain a list of fields with + their data type. A standard data type conversion from DBF to PostgreSQL + is done. + + - *table name* + + This options expects as its value the possibly qualified name of the + table to create. diff --git a/docs/ref/fixed.rst b/docs/ref/fixed.rst new file mode 100644 index 0000000..dd567da --- /dev/null +++ b/docs/ref/fixed.rst @@ -0,0 +1,182 @@ +Loading Fixed Cols File Formats +=============================== + +This command instructs pgloader to load data from a text file containing +columns arranged in a *fixed size* manner. Here's an example:: + + LOAD FIXED + FROM inline + ( + a from 0 for 10, + b from 10 for 8, + c from 18 for 8, + d from 26 for 17 [null if blanks, trim right whitespace] + ) + INTO postgresql:///pgloader + TARGET TABLE fixed + ( + a, b, + c time using (time-with-no-separator c), + d + ) + + WITH truncate + + SET work_mem to '14MB', + standard_conforming_strings to 'on' + + BEFORE LOAD DO + $$ drop table if exists fixed; $$, + $$ create table fixed ( + a integer, + b date, + c time, + d text + ); + $$; + + 01234567892008052011431250firstline + 01234562008052115182300left blank-padded + 12345678902008052208231560another line + 2345609872014092914371500 + 2345678902014092914371520 + +The `fixed` format command accepts the following clauses and options. + +Fixed File Format Source Specification: FROM +-------------------------------------------- + +Filename where to load the data from. Accepts an *ENCODING* option. Use the +`--list-encodings` option to know which encoding names are supported. + +The filename may be enclosed by single quotes, and could be one of the +following special values: + + - *inline* + + The data is found after the end of the parsed commands. Any number + of empty lines between the end of the commands and the beginning of + the data is accepted. + + - *stdin* + + Reads the data from the standard input stream. + + - *FILENAMES MATCHING* + + The whole *matching* clause must follow the following rule:: + + [ ALL FILENAMES | [ FIRST ] FILENAME ] + MATCHING regexp + [ IN DIRECTORY '...' ] + + The *matching* clause applies given *regular expression* (see above + for exact syntax, several options can be used here) to filenames. + It's then possible to load data from only the first match of all of + them. + + The optional *IN DIRECTORY* clause allows specifying which directory + to walk for finding the data files, and can be either relative to + where the command file is read from, or absolute. The given + directory must exists. + +Fields Specifications +--------------------- + +The *FROM* option also supports an optional comma separated list of *field* +names describing what is expected in the `FIXED` data file. + +Each field name is composed of the field name followed with specific reader +options for that field. Supported per-field reader options are the +following, where only *start* and *length* are required. + + - *start* + + Position in the line where to start reading that field's value. Can + be entered with decimal digits or `0x` then hexadecimal digits. + + - *length* + + How many bytes to read from the *start* position to read that + field's value. Same format as *start*. + +Those optional parameters must be enclosed in square brackets and +comma-separated: + + - *terminated by* + + See the description of *field terminated by* below. + + The processing of this option is not currently implemented. + + - *date format* + + When the field is expected of the date type, then this option allows + to specify the date format used in the file. + + Date format string are template strings modeled against the + PostgreSQL `to_char` template strings support, limited to the + following patterns: + + - YYYY, YYY, YY for the year part + - MM for the numeric month part + - DD for the numeric day part + - HH, HH12, HH24 for the hour part + - am, AM, a.m., A.M. + - pm, PM, p.m., P.M. + - MI for the minutes part + - SS for the seconds part + - MS for the milliseconds part (4 digits) + - US for the microseconds part (6 digits) + - unparsed punctuation signs: - . * # @ T / \ and space + + Here's an example of a *date format* specification:: + + column-name [date format 'YYYY-MM-DD HH24-MI-SS.US'] + + - *null if* + + This option takes an argument which is either the keyword *blanks* + or a double-quoted string. + + When *blanks* is used and the field value that is read contains only + space characters, then it's automatically converted to an SQL `NULL` + value. + + When a double-quoted string is used and that string is read as the + field value, then the field value is automatically converted to an + SQL `NULL` value. + + - *trim both whitespace*, *trim left whitespace*, *trim right whitespace* + + This option allows to trim whitespaces in the read data, either from + both sides of the data, or only the whitespace characters found on + the left of the streaing, or only those on the right of the string. + +Fixed File Format Loading Options: WITH +--------------------------------------- + +When loading from a `FIXED` file, the following options are supported: + + - *truncate* + + When this option is listed, pgloader issues a `TRUNCATE` command + against the PostgreSQL target table before reading the data file. + + - *disable triggers* + + When this option is listed, pgloader issues an `ALTER TABLE ... + DISABLE TRIGGER ALL` command against the PostgreSQL target table + before copying the data, then the command `ALTER TABLE ... ENABLE + TRIGGER ALL` once the `COPY` is done. + + This option allows loading data into a pre-existing table ignoring + the *foreign key constraints* and user defined triggers and may + result in invalid *foreign key constraints* once the data is loaded. + Use with care. + + - *skip header* + + Takes a numeric value as argument. Instruct pgloader to skip that + many lines at the beginning of the input file. + diff --git a/docs/ref/ixf.rst b/docs/ref/ixf.rst new file mode 100644 index 0000000..3f698fa --- /dev/null +++ b/docs/ref/ixf.rst @@ -0,0 +1,66 @@ +Loading IXF Data +================ + +This command instructs pgloader to load data from an IBM `IXF` file. Here's +an example:: + + LOAD IXF + FROM data/nsitra.test1.ixf + INTO postgresql:///pgloader + TARGET TABLE nsitra.test1 + WITH truncate, create table, timezone UTC + + BEFORE LOAD DO + $$ create schema if not exists nsitra; $$, + $$ drop table if exists nsitra.test1; $$; + +The `ixf` format command accepts the following clauses and options. + +IXF Source Specification: FROM +------------------------------ + +Filename where to load the data from. This support local files, HTTP URLs +and zip files containing a single ixf file of the same name. Fetch such a +zip file from an HTTP address is of course supported. + +IXF Loading Options: WITH +------------------------- + +When loading from a `IXF` file, the following options are supported: + + - *truncate* + + When this option is listed, pgloader issues a `TRUNCATE` command against + the PostgreSQL target table before reading the data file. + + - *disable triggers* + + When this option is listed, pgloader issues an `ALTER TABLE ... DISABLE + TRIGGER ALL` command against the PostgreSQL target table before copying + the data, then the command `ALTER TABLE ... ENABLE TRIGGER ALL` once the + `COPY` is done. + + This option allows loading data into a pre-existing table ignoring the + *foreign key constraints* and user defined triggers and may result in + invalid *foreign key constraints* once the data is loaded. Use with + care. + + - *create table* + + When this option is listed, pgloader creates the table using the meta + data found in the `DBF` file, which must contain a list of fields with + their data type. A standard data type conversion from DBF to PostgreSQL + is done. + + - *table name* + + This options expects as its value the possibly qualified name of the + table to create. + + - *timezone* + + This options allows to specify which timezone is used when parsing + timestamps from an IXF file, and defaults to *UTC*. Expected values are + either `UTC`, `GMT` or a single quoted location name such as + `'Universal'` or `'Europe/Paris'`. + diff --git a/docs/ref/mssql.rst b/docs/ref/mssql.rst new file mode 100644 index 0000000..89ff6f3 --- /dev/null +++ b/docs/ref/mssql.rst @@ -0,0 +1,159 @@ +Migrating a MS SQL Database to PostgreSQL +========================================= + +This command instructs pgloader to load data from a MS SQL database. +Automatic discovery of the schema is supported, including build of the +indexes, primary and foreign keys constraints. + +Here's an example:: + + load database + from mssql://user@host/dbname + into postgresql:///dbname + + including only table names like 'GlobalAccount' in schema 'dbo' + + set work_mem to '16MB', maintenance_work_mem to '512 MB' + + before load do $$ drop schema if exists dbo cascade; $$; + +The `mssql` command accepts the following clauses and options. + +MS SQL Database Source Specification: FROM +------------------------------------------ + +Connection string to an existing MS SQL database server that listens and +welcome external TCP/IP connection. As pgloader currently piggybacks on the +FreeTDS driver, to change the port of the server please export the `TDSPORT` +environment variable. + +MS SQL Database Migration Options: WITH +--------------------------------------- + +When loading from a `MS SQL` database, the same options as when loading a +`MySQL` database are supported. Please refer to the MySQL section. The +following options are added: + + - *create schemas* + + When this option is listed, pgloader creates the same schemas as found + on the MS SQL instance. This is the default. + + - *create no schemas* + + When this option is listed, pgloader refrains from creating any schemas + at all, you must then ensure that the target schema do exist. + +MS SQL Database Casting Rules +----------------------------- + +CAST +^^^^ + +The cast clause allows to specify custom casting rules, either to overload +the default casting rules or to amend them with special cases. + +Please refer to the MySQL CAST clause for details. + +MS SQL Partial Migration +------------------------ + + +INCLUDING ONLY TABLE NAMES LIKE +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Introduce a comma separated list of table name patterns used to limit the +tables to migrate to a sublist. More than one such clause may be used, they +will be accumulated together. + +Example:: + + including only table names lile 'GlobalAccount' in schema 'dbo' + +EXCLUDING TABLE NAMES LIKE +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Introduce a comma separated list of table name patterns used to exclude +table names from the migration. This filter only applies to the result of +the *INCLUDING* filter. + +:: + + excluding table names matching 'LocalAccount' in schema 'dbo' + +MS SQL Schema Transformations +----------------------------- + +ALTER SCHEMA '...' RENAME TO '...' +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Allows to rename a schema on the flight, so that for instance the tables +found in the schema 'dbo' in your source database will get migrated into the +schema 'public' in the target database with this command:: + + alter schema 'dbo' rename to 'public' + +ALTER TABLE NAMES MATCHING ... IN SCHEMA '...' +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +See the MySQL explanation for this clause above. It works the same in the +context of migrating from MS SQL, only with the added option to specify the +name of the schema where to find the definition of the target tables. + +The matching is done in pgloader itself, with a Common Lisp regular +expression lib, so doesn't depend on the *LIKE* implementation of MS SQL, +nor on the lack of support for regular expressions in the engine. + +MS SQL Driver setup and encoding +-------------------------------- + +pgloader is using the `FreeTDS` driver, and internally expects the data to +be sent in utf-8. To achieve that, you can configure the FreeTDS driver with +those defaults, in the file `~/.freetds.conf`:: + + [global] + tds version = 7.4 + client charset = UTF-8 + +Default MS SQL Casting Rules +---------------------------- + +When migrating from MS SQL the following Casting Rules are provided: + +Numbers:: + + type tinyint to smallint + + type float to float using float-to-string + type real to real using float-to-string + type double to double precision using float-to-string + type numeric to numeric using float-to-string + type decimal to numeric using float-to-string + type money to numeric using float-to-string + type smallmoney to numeric using float-to-string + +Texts:: + + type char to text drop typemod + type nchat to text drop typemod + type varchar to text drop typemod + type nvarchar to text drop typemod + type xml to text drop typemod + +Binary:: + + type binary to bytea using byte-vector-to-bytea + type varbinary to bytea using byte-vector-to-bytea + +Date:: + + type datetime to timestamptz + type datetime2 to timestamptz + +Others:: + + type bit to boolean + type hierarchyid to bytea + type geography to bytea + type uniqueidentifier to uuid using sql-server-uniqueidentifier-to-uuid + diff --git a/docs/ref/mysql.rst b/docs/ref/mysql.rst new file mode 100644 index 0000000..b484d5b --- /dev/null +++ b/docs/ref/mysql.rst @@ -0,0 +1,623 @@ +Migrating a MySQL Database to PostgreSQL +======================================== + +This command instructs pgloader to load data from a database connection. The +only supported database source is currently *MySQL*, and pgloader supports +dynamically converting the schema of the source database and the indexes +building. + +A default set of casting rules are provided and might be overloaded and +appended to by the command. + +Here's an example using as many options as possible, some of them even being +defaults. Chances are you don't need that complex a setup, don't copy and +paste it, use it only as a reference! + +:: + + LOAD DATABASE + FROM mysql://root@localhost/sakila + INTO postgresql://localhost:54393/sakila + + WITH include drop, create tables, create indexes, reset sequences, + workers = 8, concurrency = 1, + multiple readers per thread, rows per range = 50000 + + SET PostgreSQL PARAMETERS + maintenance_work_mem to '128MB', + work_mem to '12MB', + search_path to 'sakila, public, "$user"' + + SET MySQL PARAMETERS + net_read_timeout = '120', + net_write_timeout = '120' + + CAST type bigint when (= precision 20) to bigserial drop typemod, + type date drop not null drop default using zero-dates-to-null, + -- type tinyint to boolean using tinyint-to-boolean, + type year to integer + + MATERIALIZE VIEWS film_list, staff_list + + -- INCLUDING ONLY TABLE NAMES MATCHING ~/film/, 'actor' + -- EXCLUDING TABLE NAMES MATCHING ~ + -- DECODING TABLE NAMES MATCHING ~/messed/, ~/encoding/ AS utf8 + -- ALTER TABLE NAMES MATCHING 'film' RENAME TO 'films' + -- ALTER TABLE NAMES MATCHING ~/_list$/ SET SCHEMA 'mv' + + ALTER TABLE NAMES MATCHING ~/_list$/, 'sales_by_store', ~/sales_by/ + SET SCHEMA 'mv' + + ALTER TABLE NAMES MATCHING 'film' RENAME TO 'films' + ALTER TABLE NAMES MATCHING ~/./ SET (fillfactor='40') + + ALTER SCHEMA 'sakila' RENAME TO 'pagila' + + BEFORE LOAD DO + $$ create schema if not exists pagila; $$, + $$ create schema if not exists mv; $$, + $$ alter database sakila set search_path to pagila, mv, public; $$; + + +The `database` command accepts the following clauses and options. + +MySQL Database Source Specification: FROM +----------------------------------------- + +Must be a connection URL pointing to a MySQL database. + +If the connection URI contains a table name, then only this table is +migrated from MySQL to PostgreSQL. + +See the `SOURCE CONNECTION STRING` section above for details on how to write +the connection string. The MySQL connection string accepts the same +parameter *sslmode* as the PostgreSQL connection string, but the *verify* +mode is not implemented (yet). + +Environment variables described in + can be +used as default values too. If the user is not provided, then it defaults to +`USER` environment variable value. The password can be provided with the +environment variable `MYSQL_PWD`. The host can be provided with the +environment variable `MYSQL_HOST` and otherwise defaults to `localhost`. The +port can be provided with the environment variable `MYSQL_TCP_PORT` and +otherwise defaults to `3306`. + +MySQL Database Migration Options: WITH +-------------------------------------- + +When loading from a `MySQL` database, the following options are supported, +and the default *WITH* clause is: *no truncate*, *create schema*, *create +tables*, *include drop*, *create indexes*, *reset sequences*, *foreign +keys*, *downcase identifiers*, *uniquify index names*. + + - *include drop* + + When this option is listed, pgloader drops all the tables in the target + PostgreSQL database whose names appear in the MySQL database. This + option allows for using the same command several times in a row until + you figure out all the options, starting automatically from a clean + environment. Please note that `CASCADE` is used to ensure that tables + are dropped even if there are foreign keys pointing to them. This is + precisely what `include drop` is intended to do: drop all target tables + and recreate them. + + Great care needs to be taken when using `include drop`, as it will + cascade to *all* objects referencing the target tables, possibly + including other tables that are not being loaded from the source DB. + + - *include no drop* + + When this option is listed, pgloader will not include any `DROP` + statement when loading the data. + + - *truncate* + + When this option is listed, pgloader issue the `TRUNCATE` command + against each PostgreSQL table just before loading data into it. + + - *no truncate* + + When this option is listed, pgloader issues no `TRUNCATE` command. + + - *disable triggers* + + When this option is listed, pgloader issues an `ALTER TABLE ... DISABLE + TRIGGER ALL` command against the PostgreSQL target table before copying + the data, then the command `ALTER TABLE ... ENABLE TRIGGER ALL` once the + `COPY` is done. + + This option allows loading data into a pre-existing table ignoring the + *foreign key constraints* and user defined triggers and may result in + invalid *foreign key constraints* once the data is loaded. Use with + care. + + - *create tables* + + When this option is listed, pgloader creates the table using the meta + data found in the `MySQL` file, which must contain a list of fields with + their data type. A standard data type conversion from DBF to PostgreSQL + is done. + + - *create no tables* + + When this option is listed, pgloader skips the creation of table before + loading data, target tables must then already exist. + + Also, when using *create no tables* pgloader fetches the metadata from + the current target database and checks type casting, then will remove + constraints and indexes prior to loading the data and install them back + again once the loading is done. + + - *create indexes* + + When this option is listed, pgloader gets the definitions of all the + indexes found in the MySQL database and create the same set of index + definitions against the PostgreSQL database. + + - *create no indexes* + + When this option is listed, pgloader skips the creating indexes. + + - *drop indexes* + + When this option is listed, pgloader drops the indexes in the target + database before loading the data, and creates them again at the end + of the data copy. + + - *uniquify index names*, *preserve index names* + + MySQL index names are unique per-table whereas in PostgreSQL index names + have to be unique per-schema. The default for pgloader is to change the + index name by prefixing it with `idx_OID` where `OID` is the internal + numeric identifier of the table the index is built against. + + In somes cases like when the DDL are entirely left to a framework it + might be sensible for pgloader to refrain from handling index unique + names, that is achieved by using the *preserve index names* option. + + The default is to *uniquify index names*. + + Even when using the option *preserve index names*, MySQL primary key + indexes named "PRIMARY" will get their names uniquified. Failing to do + so would prevent the primary keys to be created again in PostgreSQL + where the index names must be unique per schema. + + - *drop schema* + + When this option is listed, pgloader drops the target schema in the + target PostgreSQL database before creating it again and all the objects + it contains. The default behavior doesn't drop the target schemas. + + - *foreign keys* + + When this option is listed, pgloader gets the definitions of all the + foreign keys found in the MySQL database and create the same set of + foreign key definitions against the PostgreSQL database. + + - *no foreign keys* + + When this option is listed, pgloader skips creating foreign keys. + + - *reset sequences* + + When this option is listed, at the end of the data loading and after the + indexes have all been created, pgloader resets all the PostgreSQL + sequences created to the current maximum value of the column they are + attached to. + + The options *schema only* and *data only* have no effects on this + option. + + - *reset no sequences* + + When this option is listed, pgloader skips resetting sequences after the + load. + + The options *schema only* and *data only* have no effects on this + option. + + - *downcase identifiers* + + When this option is listed, pgloader converts all MySQL identifiers + (table names, index names, column names) to *downcase*, except for + PostgreSQL *reserved* keywords. + + The PostgreSQL *reserved* keywords are determined dynamically by using + the system function `pg_get_keywords()`. + + - *quote identifiers* + + When this option is listed, pgloader quotes all MySQL identifiers so + that their case is respected. Note that you will then have to do the + same thing in your application code queries. + + - *schema only* + + When this option is listed pgloader refrains from migrating the data + over. Note that the schema in this context includes the indexes when the + option *create indexes* has been listed. + + - *data only* + + When this option is listed pgloader only issues the `COPY` statements, + without doing any other processing. + + - *single reader per thread*, *multiple readers per thread* + + The default is *single reader per thread* and it means that each + MySQL table is read by a single thread as a whole, with a single + `SELECT` statement using no `WHERE` clause. + + When using *multiple readers per thread* pgloader may be able to + divide the reading work into several threads, as many as the + *concurrency* setting, which needs to be greater than 1 for this + option to kick be activated. + + For each source table, pgloader searches for a primary key over a + single numeric column, or a multiple-column primary key index for + which the first column is of a numeric data type (one of `integer` + or `bigint`). When such an index exists, pgloader runs a query to + find the *min* and *max* values on this column, and then split that + range into many ranges containing a maximum of *rows per range*. + + When the range list we then obtain contains at least as many ranges + than our concurrency setting, then we distribute those ranges to + each reader thread. + + So when all the conditions are met, pgloader then starts as many + reader thread as the *concurrency* setting, and each reader thread + issues several queries with a `WHERE id >= x AND id < y`, where `y - + x = rows per range` or less (for the last range, depending on the + max value just obtained. + + - *rows per range* + + How many rows are fetched per `SELECT` query when using *multiple + readers per thread*, see above for details. + + - *SET MySQL PARAMETERS* + + The *SET MySQL PARAMETERS* allows setting MySQL parameters using the + MySQL `SET` command each time pgloader connects to it. + +MySQL Database Casting Rules +---------------------------- + +The command *CAST* introduces user-defined casting rules. + +The cast clause allows to specify custom casting rules, either to overload +the default casting rules or to amend them with special cases. + +A casting rule is expected to follow one of the forms:: + + type [ ... ] to [