pax_global_header00006660000000000000000000000064135450771310014520gustar00rootroot0000000000000052 comment=767b4f3b3ed9567c13568b9eff1b302638abedd9 syntastic-3.10.0/000077500000000000000000000000001354507713100136225ustar00rootroot00000000000000syntastic-3.10.0/.gitignore000066400000000000000000000000301354507713100156030ustar00rootroot00000000000000*~ *.swp tags .DS_Store syntastic-3.10.0/CONTRIBUTING.md000066400000000000000000000067671354507713100160730ustar00rootroot00000000000000# CONTRIBUTING - - - 1\. [Bug reports / GitHub issues](#bugreps) 2\. [Submitting a patch](#patches) 3\. [General style notes](#generalstyle) 4\. [Syntax checker notes](#checkerstyle) - - - ## 1. Bug reports / GitHub issues Please note that the preferred channel for posting bug reports is the [issue tracker at GitHub][bug_tracker]. Reports posted elsewhere are less likely to be seen by the core team. When reporting a bug make sure you search the existing GitHub issues for the same/similar issues. If you find one, feel free to add a `+1` comment with any additional information that may help us solve the issue. When creating a new issue be sure to state the following: * steps to reproduce the bug; * the version of Vim you are using (run `:ver` to find out); * the version of syntastic you are using (see `:SyntasticInfo`). For syntax checker bugs also state the version of the checker executable that you are using. Adding debugging information is typically useful too: * open a file handled by your checker; * set `g:syntastic_debug` to 1 or 3; * run the checker; * copy the output of `:mes`. ## 2. Submitting a patch Before you consider adding features to syntastic, _please_ spend a few minutes (re-)reading the latest version of the [manual][manual]. Syntastic is changing rapidly at times, and it's possible that some features you want to add exist already. To submit a patch: * fork the [repo][github] on GitHub; * make a [topic branch][branches] and start hacking; * submit a pull request based off your topic branch. Small, focused patches are preferred. Large changes to the code should be discussed with the core team first. Create an issue and explain your plan and see what we say. Also, make sure to update the manual whenever applicable. Nobody can use features that aren't documented. ## 3. General style notes Follow the coding conventions/styles used in the syntastic core: * use 4 space indents; * don't use abbreviated keywords - e.g. use `endfunction`, not `endfun` (there's always room for more fun!); * don't use `l:` prefixes for variables unless actually required (i.e. almost never); * code for maintainability; we would rather a function be a couple of lines longer and have (for example) some [explaining variables][variables] to aid readability. ## 4. Syntax checker notes Make sure to read the [guide][guide] if you plan to add new syntax checkers. Use the existing checkers as templates, rather than writing everything from scratch. The preferred style for error format strings is one "clause" per line. E.g. (from the `coffee` checker): ```vim let errorformat = \ '%E%f:%l:%c: %trror: %m,' . \ 'Syntax%trror: In %f\, %m on line %l,' . \ '%EError: In %f\, Parse error on line %l: %m,' . \ '%EError: In %f\, %m on line %l,' . \ '%W%f(%l): lint warning: %m,' . \ '%W%f(%l): warning: %m,' . \ '%E%f(%l): SyntaxError: %m,' . \ '%-Z%p^,' . \ '%-G%.%#' ``` [bug_tracker]: https://github.com/vim-syntastic/syntastic/issues [manual]: https://github.com/vim-syntastic/syntastic/blob/master/doc/syntastic.txt [github]: https://github.com/vim-syntastic/syntastic [branches]: https://github.com/dchelimsky/rspec/wiki/Topic-Branches#using-topic-branches-when-contributing-patches [variables]: http://www.refactoring.com/catalog/extractVariable.html [guide]: https://github.com/vim-syntastic/syntastic/wiki/Syntax-Checker-Guide syntastic-3.10.0/LICENCE000066400000000000000000000007321354507713100146110ustar00rootroot00000000000000 DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE Version 2, December 2004 Copyright (C) 2004 Sam Hocevar Everyone is permitted to copy and distribute verbatim or modified copies of this license document, and changing it is allowed as long as the name is changed. DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. You just DO WHAT THE FUCK YOU WANT TO. syntastic-3.10.0/README.markdown000066400000000000000000000571311354507713100163320ustar00rootroot00000000000000 , / \,,_ .'| ,{{| /}}}}/_.' _____________________________________________ }}}}` '{{' '. / \ {{{{{ _ ;, \ / Ladies and Gentlemen, \ ,}}}}}} /o`\ ` ;) | | {{{{{{ / ( | this is ... | }}}}}} | \ | | {{{{{{{{ \ \ | | }}}}}}}}} '.__ _ | | _____ __ __ _ | {{{{{{{{ /`._ (_\ / | / ___/__ ______ / /_____ ______/ /_(_)____ | }}}}}}' | //___/ --=: \__ \/ / / / __ \/ __/ __ `/ ___/ __/ / ___/ | jgs `{{{{` | '--' | ___/ / /_/ / / / / /_/ /_/ (__ ) /_/ / /__ | }}}` | /____/\__, /_/ /_/\__/\__,_/____/\__/_/\___/ | | /____/ | | / \_____________________________________________/ - - - 1. [Introduction](#introduction) 2. [Installation](#installation) 2.1. [Requirements](#requirements) 2.2. [Installing syntastic with Pathogen](#installpathogen) 3. [Recommended settings](#settings) 4. [FAQ](#faq) 4.1. [I installed syntastic but it isn't reporting any errors...](#faqinfo) 4.2. [Syntastic supports several checkers for my filetype, how do I tell it which one(s) to use?](#faqcheckers) 4.3. [How can I run checkers for "foreign" filetypes against the current file?](#faqforeign) 4.4. [I have enabled multiple checkers for the current filetype. How can I display all errors from all checkers together?](#faqaggregate) 4.5. [How can I pass additional arguments to a checker?](#faqargs) 4.6. [I run a checker and the location list is not updated...](#faqloclist) 4.6. [I run`:lopen` or `:lwindow` and the error window is empty...](#faqloclist) 4.7. [How can I jump between the different errors without using the location list at the bottom of the window?](#faqlnext) 4.8. [The error window is closed automatically when I `:quit` the current buffer but not when I `:bdelete` it?](#faqbdelete) 4.9. [My favourite checker needs to load a configuration file from the project's root rather than the current directory...](#faqconfig) 4.10. [What is the difference between syntax checkers and style checkers?](#faqstyle) 4.11. [How can I check scripts written for different versions of Python?](#faqpython) 4.12. [How can I check scripts written for different versions of Ruby?](#faqruby) 4.13. [The `perl` checker has stopped working...](#faqperl) 4.14. [What happened to the `rustc` checker?](#faqrust) 4.15. [What happened to the `tsc` checker?](#faqtsc) 4.16. [What happened to the `xcrun` checker?](#faqxcrun) 5. [Resources](#otherresources) - - - ## 1\. Introduction Syntastic is a syntax checking plugin for [Vim][vim] created by [Martin Grenfell][scrooloose]. It runs files through external syntax checkers and displays any resulting errors to the user. This can be done on demand, or automatically as files are saved. If syntax errors are detected, the user is notified and is happy because they didn't have to compile their code or execute their script to find them. At the time of this writing, syntastic has checking plugins for ACPI Source Language, ActionScript, Ada, Ansible configurations, API Blueprint, AppleScript, AsciiDoc, Assembly languages, BEMHTML, Bro, Bourne shell, C, C++, C#, Cabal, Chef, CMake, CoffeeScript, Coco, Coq, CSS, Cucumber, CUDA, D, Dart, DocBook, Dockerfile, Dust, Elixir, Erlang, eRuby, Fortran, Gentoo metadata, GLSL, Go, Haml, Haskell, Haxe, Handlebars, HSS, HTML, Java, JavaScript, JSON, JSX, Julia, LESS, Lex, Limbo, LISP, LLVM intermediate language, Lua, Markdown, MATLAB, Mercury, NASM, Nix, Objective-C, Objective-C++, OCaml, Perl, Perl 6, Perl POD, PHP, gettext Portable Object, OS X and iOS property lists, Pug (formerly Jade), Puppet, Python, QML, R, Racket, RDF TriG, RDF Turtle, Relax NG, reStructuredText, RPM spec, Ruby, SASS/SCSS, Scala, Slim, SML, Solidity, Sphinx, SQL, Stylus, Tcl, TeX, Texinfo, Twig, TypeScript, Vala, Verilog, VHDL, Vim help, VimL, Vue.js, xHtml, XML, XSLT, XQuery, YACC, YAML, YANG data models, YARA rules, z80, Zope page templates, and Zsh. See the [manual][checkers] for details about the corresponding supported checkers (`:help syntastic-checkers` in Vim). A number of third-party Vim plugins also provide checkers for syntastic, for example: [merlin][merlin], [omnisharp-vim][omnisharp], [rust.vim][rust], [syntastic-extras][myint], [syntastic-more][roktas], [tsuquyomi][tsuquyomi], [vim-crystal][crystal], [vim-eastwood][eastwood], and [vim-swift][swift]. Below is a screenshot showing the methods that Syntastic uses to display syntax errors. Note that, in practise, you will only have a subset of these methods enabled. ![Screenshot 1][screenshot] 1. Errors are loaded into the location list for the corresponding window. 2. When the cursor is on a line containing an error, the error message is echoed in the command window. 3. Signs are placed beside lines with errors - note that warnings are displayed in a different color. 4. There is a configurable statusline flag you can include in your statusline config. 5. Hover the mouse over a line containing an error and the error message is displayed as a balloon. 6. (not shown) Highlighting errors with syntax highlighting. Erroneous parts of lines can be highlighted. ## 2\. Installation ### 2.1\. Requirements Syntastic itself has rather relaxed requirements: it doesn't have any external dependencies, and it needs a version of [Vim][vim] compiled with a few common features: `autocmd`, `eval`, `file_in_path`, `modify_fname`, `quickfix`, `reltime`, `statusline`, and `user_commands`. Not all possible combinations of features that include the ones above make equal sense on all operating systems, but Vim version 7 or later with the "normal", "big", or "huge" feature sets should be fine. Syntastic should work with any modern plugin managers for Vim, such as [NeoBundle][neobundle], [Pathogen][pathogen], [Vim-Addon-Manager][vam], [Vim-Plug][plug], or [Vundle][vundle]. Instructions for installing syntastic with [Pathogen][pathogen] are included below for completeness. Starting with Vim version 7.4.1486 you can also load syntastic using the standard mechanism of packages, without the help of third-party plugin managers (see `:help packages` in Vim for details). Beware however that, while support for packages has been added in Vim 7.4.1384, the functionality needed by syntastic is present only in versions 7.4.1486 and later. Last but not least: syntastic doesn't know how to do any syntax checks by itself. In order to get meaningful results you need to install external checkers corresponding to the types of files you use. Please consult the [manual][checkers] (`:help syntastic-checkers` in Vim) for a list of supported checkers. ### 2.2\. Installing syntastic with Pathogen If you already have [Pathogen][pathogen] working then skip [Step 1](#step1) and go to [Step 2](#step2). #### 2.2.1\. Step 1: Install pathogen.vim First I'll show you how to install Tim Pope's [Pathogen][pathogen] so that it's easy to install syntastic. Do this in your terminal so that you get the `pathogen.vim` file and the directories it needs: ```sh mkdir -p ~/.vim/autoload ~/.vim/bundle && \ curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim ``` Next you *need* to add this to your `~/.vimrc`: ```vim execute pathogen#infect() ``` #### 2.2.2\. Step 2: Install syntastic as a Pathogen bundle You now have pathogen installed and can put syntastic into `~/.vim/bundle` like this: ```sh cd ~/.vim/bundle && \ git clone --depth=1 https://github.com/vim-syntastic/syntastic.git ``` Quit vim and start it back up to reload it, then type: ```vim :Helptags ``` If you get an error when you do this, then you probably didn't install [Pathogen][pathogen] right. Go back to [Step 1](#step1) and make sure you did the following: 1. Created both the `~/.vim/autoload` and `~/.vim/bundle` directories. 2. Added the `execute pathogen#infect()` line to your `~/.vimrc` file 3. Did the `git clone` of syntastic inside `~/.vim/bundle` 4. Have permissions to access all of these directories. ## 3\. Recommended settings Syntastic has numerous options that can be configured, and the defaults are not particularly well suitable for new users. It is recommended that you start by adding the following lines to your `vimrc` file, and return to them after reading the manual (see `:help syntastic` in Vim): ```vim set statusline+=%#warningmsg# set statusline+=%{SyntasticStatuslineFlag()} set statusline+=%* let g:syntastic_always_populate_loc_list = 1 let g:syntastic_auto_loc_list = 1 let g:syntastic_check_on_open = 1 let g:syntastic_check_on_wq = 0 ``` ## 4\. FAQ __4.1. Q. I installed syntastic but it isn't reporting any errors...__ A. The most likely reason is that none of the syntax checkers that it requires are installed. For example: by default, python requires either `flake8` or `pylint` to be installed and in your `$PATH`. Read the [manual][checkers] (`:help syntastic-checkers` in Vim) to find out what executables are supported. Note that aliases do not work; the actual executables must be available in your `$PATH`. Symbolic links are okay though. You can see syntastic's idea of available checkers by running `:SyntasticInfo`. A second probable reason is that none of the available checkers are enabled. Syntastic comes preconfigured with a default list of enabled checkers per filetype, but this list is kept short in order to prevent slowing down Vim or trying to run conflicting checks. The command `:SyntasticInfo` will show you which checkers are enabled. You can tell syntastic which checkers (among the available ones) you want to run by setting `g:syntastic__checkers` in your `vimrc` (see [below](#faqcheckers)). A third possible reason is that the `$PATH` seen by syntastic might not be same as the `$PATH` in your login shell. Syntastic runs checkers using the shell pointed to by Vim's `shell` (or by `g:syntastic_shell`, if set), and that's the shell you need to configure to set the proper `$PATH` and environment variables for your checkers. You can see syntastic's idea of `$PATH` by running ```vim :echo syntastic#util#system('echo "$PATH"') ``` on UNIX and Mac OS-X systems, or ```vim :echo syntastic#util#system('echo %PATH%') ``` on Windows. Finally, another reason it could fail is that either the command line options or the error output for a syntax checker may have changed. In this case, make sure you have the latest version of the syntax checker installed. If it still fails then post an [issue][bug_tracker] - or better yet, create a pull request. __4.2. Q. Syntastic supports several checkers for my filetype, how do I tell it which one(s) to use?__ A. Add a line like this to your `vimrc`: ```vim let g:syntastic__checkers = [''] ``` To see the list of supported checkers for your filetype read the [manual][checkers] (`:help syntastic-checkers` in Vim). For example, Python has the following checkers, among others: `flake8`, `pyflakes`, `pylint` and a native `python` checker. To tell syntastic to use `pylint`, you would use this setting: ```vim let g:syntastic_python_checkers = ['pylint'] ``` Checkers can be chained together like this: ```vim let g:syntastic_php_checkers = ['php', 'phpcs', 'phpmd'] ``` This is telling syntastic to run the `php` checker first, and if no errors are found, run `phpcs`, and then `phpmd`. You can also run checkers explicitly by calling `:SyntasticCheck `. For example to run `phpcs` and `phpmd`: ```vim :SyntasticCheck phpcs phpmd ``` This works for any checkers available for the current filetype, even if they aren't listed in `g:syntastic__checkers`. __4.3. Q. How can I run checkers for "foreign" filetypes against the current file?__ A. You need to qualify the name of the "foreign" checker with the name of its filetype. For example to check `tex` files with the checker `language_check` (which normally acts only on files of type `text`), you can add `text/language_check` to the list fo checkers for `tex`: ```vim let g:syntastic_tex_checkers = ['lacheck', 'text/language_check'] ``` This also works with `:SyntasticCheck`, e.g. the following command runs `text/language_check` against the current file regardless of the current filetype: ```vim :SyntasticCheck text/language_check ``` Of course, the checkers specified this way need to be known to syntastic, and they need to be shown as available when you run `:SyntasticInfo`. You can't just make up a combination of a filetype and a program name and expect it to work as a checker. __4.4. Q. I have enabled multiple checkers for the current filetype. How can I display all errors from all checkers together?__ A. Set `g:syntastic_aggregate_errors` to 1 in your `vimrc`: ```vim let g:syntastic_aggregate_errors = 1 ``` See `:help syntastic-aggregating-errors` for more details. __4.5. Q. How can I pass additional arguments to a checker?__ A. In most cases a command line is constructed using an internal function named `makeprgBuild()`, which provides a number of options that allow you to customise every part of the command that gets run. You can set these options using global variables. The general form of the global `args` variable is `syntastic___args`. Thus if you wanted to pass `--my --args --here` to the Ruby `mri` checker you would add this line to your `vimrc`: ```vim let g:syntastic_ruby_mri_args = "--my --args --here" ``` See `:help syntastic-checker-options` for more information. A number of checkers don't use the `makeprgBuild()` function mentioned above, or have additional options that can be configured. For these checkers the exact list of options should be included in the [manual][checkers] (`:help syntastic-checkers` in Vim). __4.6. Q. I run a checker and the location list is not updated...__ __4.6. Q. I run`:lopen` or `:lwindow` and the error window is empty...__ A. By default the location list is changed only when you run the `:Errors` command, in order to minimise conflicts with other plugins. If you want the location list to always be updated when you run the checkers, add this line to your `vimrc`: ```vim let g:syntastic_always_populate_loc_list = 1 ``` __4.7. Q. How can I jump between the different errors without using the location list at the bottom of the window?__ A. Vim provides several built-in commands for this. See `:help :lnext` and `:help :lprevious`. If you use these commands a lot then you may want to add shortcut mappings to your `vimrc`, or install something like [unimpaired][unimpaired], which provides such mappings (among other things). __4.8. Q. The error window is closed automatically when I `:quit` the current buffer but not when I `:bdelete` it?__ A. There is no safe way to handle that situation automatically, but you can work around it: ```vim nnoremap :lclose:bdelete cabbrev bd =(getcmdtype()==#':' && getcmdpos()==1 ? 'lclose\|bdelete' : 'bd') ``` __4.9. My favourite checker needs to load a configuration file from the project's root rather than the current directory...__ A. You can set up an `autocmd` to search for the configuration file in the current directory and upwards, and add it to the checker's options when found. For example for `jscs`: ```vim function! FindConfig(prefix, what, where) let cfg = findfile(a:what, escape(a:where, ' ') . ';') return cfg !=# '' ? ' ' . a:prefix . ' ' . shellescape(cfg) : '' endfunction autocmd FileType javascript let b:syntastic_javascript_jscs_args = \ get(g:, 'syntastic_javascript_jscs_args', '') . \ FindConfig('-c', '.jscsrc', expand(':p:h', 1)) ``` __4.10. Q. What is the difference between syntax checkers and style checkers?__ A. The errors and warnings they produce are highlighted differently and can be filtered by different rules, but otherwise the distinction is pretty much arbitrary. There is an ongoing effort to keep things consistent, so you can _generally_ expect messages produced by syntax checkers to be _mostly_ related to syntax, and messages produced by style checkers to be _mostly_ about style. But there can be no formal guarantee that, say, a style checker that runs into a syntax error wouldn't die with a fatal message, nor that a syntax checker wouldn't give you warnings against using some constructs as being bad practice. There is also no guarantee that messages marked as `style` are less severe than the ones marked as `syntax` (whatever that might mean). And there are even a few Frankenstein checkers (for example `flake8` and `pylama`) that, by their nature, produce both kinds of messages. Syntastic is not smart enough to be able to sort out these things by itself. Generally it's more useful to look at this from the perspective of filtering unwanted messages, rather than as an indicator of severity levels. The distinction between syntax and style is orthogonal to the distinction between errors and warnings, and thus you can turn off messages based on level, on type, or both. e.g. To disable all style messages: ```vim let g:syntastic_quiet_messages = { "type": "style" } ``` See `:help syntastic_quiet_messages` for more information. __4.11. Q. How can I check scripts written for different versions of Python?__ A. Install a Python version manager such as [virtualenv][virtualenv] or [pyenv][pyenv], activate the environment for the relevant version of Python, and install in it the checkers you want to use. Set `g:syntastic_python_checkers` accordingly in your `vimrc`, and run [Vim][vim] from the virtual environment. If you're starting Vim from a desktop manager rather than from a terminal you might need to write wrapper scripts around your checkers, to activate the virtual environment before running the actual checks. Then you'll need to point the relevant `g:syntastic_python__exec` variables to the wrapper scripts. __4.12. Q. How can I check scripts written for different versions of Ruby?__ A. Install a Ruby version manager such as [rvm][rvm] or [rbenv][rbenv], activate the relevant version of Ruby, and install in it the checkers you want to use. Set `g:syntastic_ruby_checkers` accordingly in your `vimrc`, and run [Vim][vim] under the relevant Ruby version. If you're starting Vim from a desktop manager rather than from a terminal and depending on the version manager you use you might need to write wrapper scripts around your checkers, to activate the relevant version of Ruby before running the actual checks. Then you'll need to point the relevant `g:syntastic_ruby__exec` variables to the wrapper scripts. __4.13. Q. The `perl` checker has stopped working...__ A. The `perl` checker runs `perl -c` against your file, which in turn __executes__ any `BEGIN`, `UNITCHECK`, and `CHECK` blocks, and any `use` statements in your file (cf. [perlrun][perlrun]). This is probably fine if you wrote the file yourself, but it's a security problem if you're checking third-party files. Since there is currently no way to disable this behaviour while still producing useful results, the checker is now disabled by default. To (re-)enable it, make sure the `g:syntastic_perl_checkers` list includes `perl`, and set `g:syntastic_enable_perl_checker` to 1 in your `vimrc`: ```vim let g:syntastic_enable_perl_checker = 1 ``` __4.14. Q. What happened to the `rustc` checker?__ A. It is now part of the [rust.vim][rust] plugin. If you install this plugin the checker should be picked up automatically by syntastic. __4.15. Q. What happened to the `tsc` checker?__ A. It didn't meet people's expectations and it has been removed. The plugin [tsuquyomi][tsuquyomi] comes packaged with a checker for TypeScript. If you install this plugin the checker should be picked up automatically by syntastic. __4.16. Q. What happened to the `xcrun` checker?__ A. The `xcrun` checker used to have a security problem and it has been removed. A better checker for __Swift__ is part of the [vim-swift][swift] plugin. If you install this plugin the checker should be picked up automatically by syntastic. ## 5\. Resources The preferred place for posting suggestions, reporting bugs, and general discussions related to syntastic is the [issue tracker at GitHub][bug_tracker]. A guide for writing syntax checkers can be found in the [wiki][guide]. There are also a dedicated [google group][google_group], and a [syntastic tag at StackOverflow][stack_overflow]. Syntastic aims to provide a common interface to syntax checkers for as many languages as possible. For particular languages, there are, of course, other plugins that provide more functionality than syntastic. You might want to take a look at [ghcmod-vim][ghcmod], [jedi-vim][jedi], [python-mode][python_mode], [vim-go][vimgo], or [YouCompleteMe][ycm]. [scrooloose]: https://github.com/scrooloose [screenshot]: https://github.com/vim-syntastic/syntastic/raw/master/_assets/screenshot_1.png [bug_tracker]: https://github.com/vim-syntastic/syntastic/issues [checkers]: https://github.com/vim-syntastic/syntastic/blob/master/doc/syntastic-checkers.txt [crystal]: https://github.com/rhysd/vim-crystal [eastwood]: https://github.com/venantius/vim-eastwood [ghcmod]: https://github.com/eagletmt/ghcmod-vim [google_group]: https://groups.google.com/group/vim-syntastic [guide]: https://github.com/vim-syntastic/syntastic/wiki/Syntax-Checker-Guide [jedi]: https://github.com/davidhalter/jedi-vim [merlin]: https://github.com/the-lambda-church/merlin [myint]: https://github.com/myint/syntastic-extras [neobundle]: https://github.com/Shougo/neobundle.vim [omnisharp]: https://github.com/OmniSharp/omnisharp-vim [pathogen]: https://github.com/tpope/vim-pathogen [perlrun]: http://perldoc.perl.org/perlrun.html#*-c* [plug]: https://github.com/junegunn/vim-plug/ [pyenv]: https://github.com/yyuu/pyenv [python_mode]: https://github.com/klen/python-mode [rbenv]: https://github.com/rbenv/rbenv [roktas]: https://github.com/roktas/syntastic-more [rust]: https://github.com/rust-lang/rust.vim [rvm]: https://rvm.io/ [stack_overflow]: http://stackoverflow.com/questions/tagged/syntastic [swift]: https://github.com/kballard/vim-swift [tsuquyomi]: https://github.com/Quramy/tsuquyomi/ [unimpaired]: https://github.com/tpope/vim-unimpaired [vam]: https://github.com/MarcWeber/vim-addon-manager [vim]: http://www.vim.org/ [vimgo]: https://github.com/fatih/vim-go [virtualenv]: https://virtualenv.pypa.io/en/stable/ [vundle]: https://github.com/gmarik/Vundle.vim [ycm]: https://github.com/ycm-core/YouCompleteMe syntastic-3.10.0/_assets/000077500000000000000000000000001354507713100152635ustar00rootroot00000000000000syntastic-3.10.0/_assets/screenshot_1.png000066400000000000000000002644111354507713100203760ustar00rootroot00000000000000PNG  IHDRm`aUsRGBbKGD pHYs  tIME  / IDATxw|]ҽ[J) {)lϭ"7FQD*2d^eݦI~ I[A#h%}ٓ;/// B!B!>V?1(Ɣ)Shժ(B!BqinJ޽+-2L;w#Gsadʔ)r-Wu]΀B!B@QVkmF{gO>j)`B!BQl6WzkEH 0:&MH͚B!B3hX,UŬz}||E4m!B!(GV5mJ-B!BT 6#:"B!B?h*F@F !3gS6JfG员D͚BQTUu~{ ]Ž_ !ĿbՉJŬ_rС7py 3fw_!*(hмysZl}ZlI~^ӴA%/yɫr^gϝc-aX}ڹk: Co߾E-&0 [x 6bO.y ^v ڨsqC>8x.Tʱ{{xYWL&vf-Ǫhfsdff2ka護˯ɛoZF^򒗼e ڊ[n6s5lؐhذ=X3nao)erҿ x{{wEӚ빮WO? lC:_]Khh(eiK ^ێ^ݺXV0y4QIF\Ӵ)ko,w:'NW&P#"ÉðҪeKYi}\o/tlJƪixxxϥժo~vMPKe",ӺBqղق/W, ˗/gРA 7n𻠱l21n(_B L8ujs Fݻve'$0x~;S>gdPV-Fx|}}Is F#s=w#++syEo\nb\FDp>` fр(XVlJ|1|QVVii4n{~Yuеs'mȌPvc6٣mضAݺu䃏>V͚L.?)S?擩8KrJ oZ4'1/yۨ2/:vhSϽ3OFD HKK3ybZhArJ L"P32.:uv[z^,sn;ŭ[\$&&^rrJ1hF4b%E g.##k &QU$%X\כ a& 昭оm[`ѱ ro⥿Sn]vgĈGG#!ĕ{VzuQ%~ٞ !>pu,تe Ǝd2rj222BQ hUоWG4]yl(@'IcxYlAA~0ԩ-lB+>`sWLttt:wÇIMM-9h'WB:߃b2}}UEA-(4jz~4))Ͽřg"##OO/mti*Ly {32BP`X0*:ӏe4P< S޽QUшb!'']vs˰ (V+4.DWEQx`0B+)p+bZl{vɒ% 0C<7d !(.:{^f̞C`@ժ9.Ob0x̚O?"AA #۵`5͚n؞5b=`8[nV͚ԫ[שp]6~b3͓>O x'߬i4ƌ%ǪFZh > 2/n:tr֮[Ϙѣhڤ v7< lٺq<;\vnnnyPzu7jȌYs3j$j,v-11NPRiRS\ۿ&+߭K,]\ D듨a K.YvC ,U ȯrjE)boEuÉ(!_5EZ:8mc޼yBN@@Eբko<==1.AVVK3%%KD7iBVV}liѱׅNnn.gϝc\.+\ _2,\왟;ŋi;tО[nΝ?v͑qL&Ns/ׅvFh'[ڮҰX,4m7cX,xyy p:miϥ9nl6;U,Q}||0 usrr4-j{=q.ѼKkӦBSR躎sa6l9^W^^^xxx!P~*#w˄⟖΁-voC BQHFF˿UU-R(.\ul嘎4F#j$;;;1 K` @ϸZVXX~*:?)|uฤm>6WU1w)(3+|%۲GwEq Lz m4a᯿Bv˫oinvyyyE*2!Tf-.6 ؄栲y{h߮-N쬪ˀ2 yAaJUߥ*G4ii!gk5Thʼy~0<B+j%=#zu뒞^e.uMʺ jJ0*]!Dٝ8q"*FMG !LUUHOO/=nYqJjV헕W}׿AԲ !D UIm4B;\~'BⅆC\\>+5hd!B!(ujRA)ԡ5fQ{si\Ը/_MH0'jyoҐ A7HٶG((QFib4ڽ3~M( ;ڏE!}kZ4E"inF+hoZQpg X@_E5Po}5!"ԗӗ2p~KGGEs}(kN0jHSұq+)4(6}!B! ?D\ptQQcx~2#'HXӟ}gZ}T& r쓧ֻ}$k[ܱ)qvw\\;ޑewhG` ~XvMG| j[;g4.+maӶq/Ǣi߯r5y˝>i1{Ssc 1<&Z50sˊ~I间.}!B!z]ߗFж}G22҉=[A蚆w>߯-! k^U>gɛbNMC3Hݵaڮ-I\L&I5q5F$oފ%#kF&I:ЪIk7_v[(L#j\t XO|bYyYv-j8ń3BR6Y~Z5훿]mf.=ĥlr4jzܥ_+K!B!vիGУwt [^KdZxzyYRGF=1MQT: d'F` 9gΗ*Kz@lF1^Mc?yAZ%Nesھ%=ݡ1eO!ܱ"Po>Q|jsMV=/M\q)9ewf*~I#B!ծFd͂9 UU36hd6-Y-5yM$oN 6Gh0x U\oo GqfgcCKN-X<#:[Iw)9gfn#-+e S\j{)#? 'B!(mixՈ %PU_vgT!ߓ߬oŻX@R!B 2Vv^5#HݱᘓSΣ F zba%WWgni,U(]?4ݞAUXS >Gcp;j@I9~pڥM8N]B!B-F?FC/ydʯiCs?@HI5jyRh,%_d t,W׫(p {;[$q 9xɞ^IQiw)mB!B5Gq7ւ54M'ϬV-?kCn(UܞcH'<*;$0{aaB!]WP\ VMGӴur,hr9mp }{.\ H&B!UL65nmnQDUiWվc0|I%`B!B6"ICTo/? JwgWTNUɹ8K!BQuAwn-4ult*SUlB!B\Aghł%3 .IN_a$`B!PԩIR{>OZPNE# ]M5n$Wҥ=ƀ)$@^|}& l tm8ptsYi{@h5i(k? hۋ쓧IZ-/\yuFҧm-FeoT&40jP3q\zF5y4m$6.֜`8tڅ]v]+1)t]GU݀փ| Y'Qu$kL_Nჟs1)۞h8߶&N3wQǜ'nE9O|jܡB!BL,Eb?Mx>䜿@֡c}^͔iN @qNDUoҐK.ǚKPTݍ ? Nе-hy I6aJHKpVA[iarx/C[<t ؆j[;ּ<ºu"K{6Pڙ}<">jQ?"at]g+И`oLی[ZpoF3ᾶ|o/FA3M]*cloR"#'g6_6BaXmKsvmfĠh׈/O+Уe$&>5aİ4w'Z޿8ï12|MVZn=ìӫU >{;3XǑmU!BHVQzDquje{~$RY򦭘SHݵע( ж%+֒{:Dª J 6o˱ddq+QZ5#~ ̩ie;5F\nM -By$NX"NGH^r i9:\z7eG@E|bŦWl 6¤+\b&/au8ou(>ޕKۏ{܂M~]CC)X,LbѨ c9Ei(FrM8t:&^b!B!AQODuU+'Fp IDAT` 9gΗ*Kz@lF1^Mc?yAZ% ~~N۷;Dcjw=cTP+(πqXjA^ĥ9.)@oW֞3jW#d_n2e,C`g{:zQ F &NyZv3ϬكE~*utX5@gB!BHVAƿe3| {Z3)^2x0bR֍}m$ݚ\B&k^m9B!Rk^5".*a!+u=֧'5kxv}"91PhRd۴BOhΎ]:rn0b%{'Q@Q^op9NzVK/3-\H!͜<)q<< aބx1jPS6ud=a@U<r-EIJϥcp `,kNPTU!N06HjFYy3kTK6zH3Ss[OT'B!AxUǜfv@"jHPUFjba%WW ͘_ǠV"A=yyRd՞?W*Y0wr2íz(J̙jN_phT6?.ZS$hp{c?ߧ~oj~[]1 {ۍTKyյCKnߕڑkYqw(iy|c?Z`O_.OoHOmxmF<2r;V܂ ؓڑx/0[_$su&׍,Z-Jwo3Ŝ@rZγ\׵5_TSvJ~]o8KVv.g3c"ǃu~a' 'ॵu#G5#GI7e!][̱g%QXu;Sk@QP.훳uׁ 415 ׭BO !BˊԴBpT.ܛ˜7 GU_^c2/kE9+b^ PAH $/$&krMyxyz|jZ&!d_,{U?=K )@]hH񉗗':CC8s>) V@M&i:z6f|h |0z߳i%`=}.L5s*!$8Դ27q1bvn[\ !BTUp1%GRv$<=,伸_.-eVxu*wۊLgsi/VvNĞ'Q]%_>S=,3I)iԊ sU2E\V C~{PU߿?Vә?{GĸHA뫼  ]¶]+5(iڨ'OrLKrj)B!*HI;+aٮxW婛MکR+_wM%Xkg.RH$5#՟F4t ê=sg*}Z4nP3*w0Nk VD^!"y&i,E"M׋]>lV@u 5+ M946:!L H(IlCU4]ǧZּߞt(=}wigҥ _}?<cPXR7~`▇^)2sx]>=4B!Q^ᖡȱ`t4M+W'7ςE b۶z "w vrDgS6^N<`SPtU@u^($&9} VK*\Z^g~YEq`̟4y0v-,X nr;vjjlǜpr麎ksbl6ݻ3f s~]wͮ]bZ]w䯻`Fu^6E6oO]BMFl{PJqB!=cUoD'S6>jV d$k|EGmK0-ErM fL| VinT3^ m}2+ق͛7kdB@l97^SEW!O +pOu._{*ZhYQ*`uzfTZ"smop f"y2ePO^/u[{[\KA*T̙:o?%QR R 4KN W剟?u98ҶAF)wyb1埓s8{Nm>f_>pؙ 'iyyyXV~WիW[hٲ٦U/~+B!*ݦMm6=y>O%37PA=PRj!VVJ掇/5ܟo:-;j[P]LmPא%.oGO7}-y}Z-;]lغ}TU͟y_F nF~7;|AzCi6[QU' {?$V!DyH&6F> $#7PKD]#K:%ڼ{q-WU^Wz%iT6?.Z2hީw|=Â9z,.RB}ٯ/пO'ߢb3c4ٹ%* ;8uյCKnߕڑkYq@|Ө璲1VLsindbd0t)jXV-bbbf|7<3WPQU͖8BQh*)"6-ɐʐt< F]Ȓ`-fFtZ>m!A$\ֹ57Sا kTUxydf0vĭ,^]6'#›_`Xy kDNHXH oƚM+e4CˮW6 cϩ +952?CqDTU峯;HS111,[v2rH>3f͚gMcذP!Xao!*6[&lB=xY*[B)Y.B\3y<0um;|O|b*tnwsuY 8r ˌy<JNnwx{mu)Q3vr;f2Ctghnٴ\ۙ?&Mz:ujn|̚5ѣGSЏB!*?hUW ! wVU0Z$\զ PV%^qIhH@ԋ'c'/`dU|}|^JH󖅆xyY|bSP=43㜂^2jVWҘFW8y)i{!e9 1bv"#g쫯oCBB2'OdĈ$&&~wZdxq~X,scԪ1uByickq`Zufyƿ.ls3BaOo^ ధˇI-f'^d@v>W6'bݨnƞ~.:ؗr#x`.k RRөlZXS$Q+2Or_g._v/sƴ':2>ΟS5mTSګ,&e /3ut<=QUC/?s5װgBk?꺹WE oS?ͩLFciv[WYz%4vaYwkE*wiwYU\+UQ~z}Wnmq!0цO8F6M+4py>\m !=Z~h.@+)CN]*uS/u9@Wv(Y7G%O% lhjQ;2O.d}WyؽX_B\OǓX{-CG/ss\\ދ#ނOFw/C0"iܠ6[w,wtZ^l6)Vt~e199f<<<)˨˗ ѰF [5滯ȈoYpn֎;ڏ9yu #?{;Hո} =kVp?;#мnOXГZ9E5Q7ԛFnJ/DbtIaOn}FޤeT 4_oѲA$ge˫۶(7O~ "ϞJr*5 r:SYݹ*Chu_YQXq4'rr-{ޚ2f^ds/Njݔ]۷?[ܕu%ݟ-ҴvJ&wLIrUs/{;ywkc1wNsvO)Ęq>n{U f _;#|ǿ֝vy( ]g?y~L;QNae~CEt|~5mvϬ/kA߻?b1{;?1 +u .b01 g1YLx=:Ͽd߮u' }fS0a2/>6ᅧh݌=O;N^{)mӖ-MLzYfCi;>/%5v IDAT4\6=NG$7'[SxuWi|{T|)\?.#$$ҏi}+˵a_?%{?,Οߨ%tw8*뽪 l(=z]/?f-)ZsUx{+TN=4T_L%4zfY2ᰇWGS|3[Yt)w-V~_򅮪}p}*똿o}M4+׿3SiW#fZmO7ӽuVj?N&fc4iUuZxum_;V-$kξc0 ЙX,4ĥ F#Ea_U '-% "-q&<ǎ&dBQ{N{%Z=xm^/ VHuB }ߨp?x\:Fm^;/,m@Rұeʒ/%O oG.v\όϾDkea>6OhZ/#gJ[w[p>_{N{ۭM3?{>Wwh,#pقS Ytm~]1\ץ5ټp*^t|UoCU ce~ !>{['#ǂU/[gA"xm[ SjlGt9@IȒ'])|Rd3;OlV-^Ӽ;|w4lGNf쵸ebMv*P~|v~ ]8}|O;όϽ8{H#PUU4Iq 8rw%^+%gEwʒ/%OIII(|_W.neߛ6:( 5ku*'''Q3v ۲gSIByUJgsUXq9-+[- Ե:uCv4:tBW(y*-( [!V+$]pyn^+UU5QTT J;c jjۧgGrC#iզ-}{t*s9 b6WhT@=xWױsWf}6bإ1ߩK7f|2MA!;+@4t>~-ԙ9¨9c֋bsf}:Ĵ.ܙX7h7?+}*C2+WtcGQVڗ8+u:~(m;v,uwߺz*P{ϦO3㓩tվ3ǹ*+K 4>ߵG/ޜ"/Mz EUF&<$N~\Wq/^ oEe$N)](rdIg(?kI.\Ho"A!4J`o_+""j@EP%H5s%+K&_{rSwv>;<#γdiEE <^Ed`E/NĄ1hۤ6sXfV >X0އ!v_)5k`KpatnGy}?{ѹuS\mxnT}=طg:ntXw}&hn[\+?<< ºYܥ+G Gy=X4ܚ;kӾΟaHڌړ7*6s.}#)=SuIݹ4t p?p @nn.?ػD<_2=j҇(vk'oǖ [ۿrY״9As21\q[%Aa#VlêE&F2(ݛzG(AvVAu_򥐝8fJ_Py A~ }a}Io5Oq&tMcÖzbLvbȲ-Teݍ2Xl71z,FCGQxhH}*52dAӓ6{Cu ,gU*s,7M.\_.`+}2ܓ߯?jq-E]J~~AlаѲ\=j5=18;sѲ~ Ol M{O'WTc, :. /Ü+~g/SrwPҴQ=LMO!ǍwaAĞ8Lx ^q(I%2n c㎿9h|Xys1rP4W90lLW-(mz4ė;.إ t,qz4ľ#XwCиN ׭ݼ!ڡydm{ϒ*ш9)P*7sbݖ?ٷ "›Lj=p0L9j䑮з V nAZa{b'0~ Qፅ+ 2auB\,˟'+--t A?]񲀣6 *vP]>-ci"(?Ce q#Vӽ#4N_.盧~ :5Ŝ#'WC[mK4p4_`6Tee=}iHw̚2FY<5{Kغ0c=7 z3& ;y#¥``ѹ{㴵_X1t6?q|W'htۧ63> (, .| EȠOrqPq CJzHspu i/̱Mqnkw၎>tCm+76Wo6Yぶxojk?o8k~ã]ڳѺyc:s[v.`0Z7vwFYzZʛ Y߯F;oBrtA ՜אw23sI[&6-;}1t +盧 Nv(m=Z?)w3rrlWקi,Mcu=y' ߭يĤ40ư(zt_L0ư&f7E;t<s^@m?{6 iQ #PPYw&X)CVry]# 4gI c h(ϒ-]{dž:acU:XL)Bw3WΎQ"2ů,Y&.Dw7; F.N4{@-^8s)I ATB~+1E#OqY6lCTHE|3=y_VZ(E@RzU;'e<Y?ÔpoP\7F[dX`fs! $KNʹ&J^G`"Cހ[w=NVgD,#>|"cQʐ㜊ߕû7oaYT-SLW3S J(G%7Opm` DZf4 55˭5r 6@k7۸}'?iL?{ &F~rO<:y?;m3;;X<3mZ5k LzuB1sp;#'bR@29kv3 B`<1q9˟۷"CvN.8w?o.w3ģx/-aڀ!D~ph$ R2[ Qh`d*wkkwҵBT~P1KCngcX& T*A:*LxRKogΘxbq\>ǣsn`Xlt:= ww zRGzu2?߼{E H2}{tB@o&]{ѾHuaqúǽuIpo@]tVDZڨ/>ryGN-jk1{C*a LxyגԼ"ZZ']wܿZ6 \ T?Rii GFj7  4č:VB8{ O`9Xǣ{D[xbnṡ)\ Nj09`񝧸k).Eaя3;2qY@L=K{ُ@KWoᓯי6FaunL4 o6miu?% ظ/tY.|cW2G$BœA!fbu^<9q0>88qmk}cxfHDԴ,qzvi_,~gɩظ 6%1_3|2+dH;v:}C5ŒV 0 8x`D R [['nrH D4 ⇗T"23P0}HH@6@x| q.v6e6ocN)h/_̚:hs9k৐yeh;Ignf#D5EH9_2)v鬈fڂ mo$6oڷ\.SC[#$P}gO琖`mϓw2ѯsC4ш[)Zl;roPexjI>͠ 8W)Ikc@|Bbϥpҿ KARp6ԛI]qe? L @J,:v'`5ssڠ^%>xF 艑qxoiT !8hrp8.G̳.%"95  [v]) 8v4>)7(`L翻P6CRf~w {|w9;qF?W(3(.**͝(%'4.9x%˱s|pe؍cw^!Id <<;hg>\ [ 6:JUMh۬ic̔h.'Z^Ld3wy/"xC: /EÂ'1_2KK ߇Q,ھw Taԑ_&ݼ,~{Y]|"cv[3<[[)>sOD۲ݭ_Z+iv] lo$~g//u3[Ϟs^i mqрsл@}n#)@_8ϷBəɢo91M7"[|P 869Κΐ@9>S?ow%ڵ;V⽷f7x|۰jPw|i̓T/ۿxvu0s̏:Y,L}cF BvFٚG(ѣ~/:(@Rn$ElY+#Ohjl3جyZBwyyZ޸2gQ~"`Vqrӧ)&iM »|0 fLfc8EŸ2PAatn6^դPES脄 agIQ;ɸ m{BGo[TJLک5Ğ:NޒAD"I*sČg }tZ1hIA _3mnT;y6R+YgWΊy/:wlq#jcFp|;E108i_NGDV$L 7FX BumhyYRGFD tʧd yyB^P#y|f+/̈D~EmfM\/(2nHmGFV6k6+&h/w\ƱKX2h})]L@(܍AQqK*> :(!p1Sī!ƙ >LOBGֿks/.>hģnVq_{5 EAvͰjv뺳 3a܌LE$HLMpJ^dhY?.lNY#A۵ֹYTI9Ah6z8/!f3/S=sPҿwg|z+$!+[5ANm :,.3&ӏ+7 G[h^aEӆNnpx J?ZӃQs2rTH_ Ř'ߩ+APbs 'K*FU%AT}$T&,o^JEo]."f*ш9)PrjQ+T/(=5,\rɩY8e#3+!@ɷ]3"_ ]l1(eS"3K3/DA5IZRAJ VΝ+ϒrQ442zLI܏VA-ً?8CϮבn +oeFfw t &YM$;qN@kլ1&mBAK* OOh,`Z|F)ԛ8n-un~1VLy(/YADMb3;:7FܞlDA:(qOO(eMAATUh#n HyAwaHn8m*_BkzriM FAhG^%+cܰ},&ׂ/n3/<0= t  eP,TF< Fp A*%MnmGQ+# ejh=d8Of#nZFDmّxlgkꩍF|L  j$7A$ܐA[C"4ACϒJQtM:4 sPBѢOC6%:di# ;%΍ +F ߶gzaui;eP,r6$ n%Eqd|~JDz3,Q7A$ڪ#®}G_nq.<r?TPK# 3GfR0(?f4fSaER]3&<49 NԪ_m2!9qtAD)s{%+r! RƬor2K`0AW<`"mHhbß18IS9)qDI\- x^|Fq29).HXHAQXֹ x4'(2diLNI΢y^ddfU4oH*[chFk1ORA茻PؔL cdF4בh# rnTx+$GZSs<^a'ߎԳ NJ =ci¦o2,4:.ΧiTGsAA2d!!HnXi2l6ivz%^BƜe~h/@(ڨGkcuZ|%JZMAAT_hc1 ѮsɂUa]Ez8S)uЩVC khGuP  j ʹ~Q꺈[ H`rqY">ڭ*)/Х@ -lHyL*\xo0%6faN:͵MQ:-nC9$RlTd+ )$ܸ`޸Qr<&m5\΢ >6G*?RTz">'ROe;WDJcR9KP6AD>!Aj&Ќ)c`.TGLF~Q(+S &ѷ sr2DAAA$3phb#3hzp0p326TV}>pE K0GA(.Q#D[9h-X4H3r4x)MKS^9FnHA/ g Sr21\|"r9W2*?ge mheq\HqHᏽ~JܑHkT㉓)GAQϞ[HPೠ0$ViI9c"]-x0?^':caF2,ihh4`&0vCuϵ C# YuJ _zҖ׼dc4bVQ1nX9rJj޶@u!^щdGLɴ m:,IKBcsqTՁ>:-"k7m4薟iX 1ë!uiS3& LYix)/my=bdF"M:ӘamZCaSuSCzr18Ahs#\'FAՇcr?QG'^adzƹ!up>Ι-;u68?k㧔,"ēx&r?(s|h{ K$"(/iJ\n奮BbmM st@$As2\.Qam믡4j=?\~u7dEy$HGG  *!4Æ7>[d~%:P,,"l=xQ4lof1a6 # H4{f48 濴e{+ی/cAx,梓o"p]";ן%*XRZUE3ǘ 0a<}BE#ZZZ >WbIp݄DʼnZ9[<}Cl|L5(zN&̜p@"*fv=<]>5 j$ tB]I"C{9pp~em$1G|%.v+ PFu_NI,kܔieSdh#hhQ+\܍NwoYUΔ`+-ZLLyEFc$Iu~}EDL"Spz"vjh j;ױ)@ \x ?ғl,{%^HƫR9Z1?0|dfv_4Mfz|Gc}LGymHJ@2G~%BqvN^%h ̼֣yFfor t>`ݾ3:DPܱ%WIͽѱ9zvQiG;!NAp=,je0aXn6uzle"ݽYr?`vGJm#T("uNUэITh{uZ{7N܉$x{ZZ_CR捙cF0)7m?7nņ{ cB^۵C1+GB bˮCv዆r>[FP5n%&7ZB"Dѻ[{aL0gѬS8r,:}GѬio7]c v F`\r_ڈ)Qѻ0zH/cZ zGIxw+n:-? ͚4M6W_wtXz _Jc@f Qxer}`yb"I2 *6HsD?8/c *vu_`nf tEd< D+^Եq]"5oG >WZh(2sP`@ ZePL{o_5ncjMpC!qA*h#*hد^^׮Ν8gr5[D[I/֡ܣXO|m4D&1b`9yٯ0sum;ykD!G#ua0ܮ7yvm?_MI+DFza{Bo0bƤagx޿N}G'hj;Gb`[D|Zgb#1kp,ZQdy[㍅@42̜2cºz4kIxW{Rς:HL W_ws9th nGv8rKF*icM&sZip%6'{z*lPlfhU!.]9_B*txey9:/S m U]?{O^j}аnRCTs[녜9lEbRcXYTqq"?)` ؼo:v~GG|/HNc kbv[Dx pB FB*kKYg=͌]HMc Qǜ` w]I*Šv^~ϡdwpwnb4]qo   6DBqpx=#rӬ鼀DARVt5F 쉧{AWPކynJ|KԴLx@.Z! $^;95kz4gA8 q=L;6ieBcAbn+m5 11ȰF; qT=h&=㸿]se<T<]mF:0P#bO #jBl ''`2n;Huޓ}Qq.{D;~G@;ţ"7x-:4ꘕ a",#AAQ)6Ӷd$0>xsٱ7#CA'_+ѻ1}09[<7~~S s1kDM,_Sī&"-S{V IDATOv\v- ĝE̶^6W=4o!6 ? ^忴sE I^We6njAظ3M^M# pQQQlE#2k8$99YmGrgg``"+6x; G܅-oJL<^w|1ya".Y 0 z!܅w,5XM=UzZ?mنUR R/~ 6c|3ikH=}f0ؽpW<;\zAADg;3b 0OdE]Ȋ(ѣ~evEhyf/caAddfcp^wG21V*G{,8vk<]=wQ|f,"}!`uNAt>gMcmr6 6  JDBj&2(y|m8NBEW>{^D/cu6f ۍÝ J'+gF; P6RҊ 65σ"^_//  a?J4GnYs̘KDz6*؛r>駝0nM ~6]$  etR+u1 1~p6'4T,HiL?==EAAT=8Vgs˩   C   DAAAA   DAAAA    FAAA    FAAA    FAAAh#   FAAAh#   VUxy{>Ol´ry+ 퍷_%YW499/LF>บY5=AA$ʉ<Q4:=ީtD}󜡐0|@ QdԒ, UEݡjdAAh+' u$%(JtZLLqzNeuU=oVb \ODNK,^G __vyz,AAS#Eѵ=^ROL&@d ᅧXܹ7p pB.^P:@^:ܼ}yؾ'[41]HMBZF^]j푻7"F,DMߍEDGRr:l74nVINCVk~ۃN{wѻLDEr,f=@*b^y7cÏ7ńap!BT <ԩ60—6AAP̬{'Ͽc0 7cQw:ۦ7]ÔpoPL-lɩցxrjW=i]~2k/ZÃx~뫃UHI_JCm,-a`ZaX_ͤ[cÁ+K'  HU8WFfp;)n&}K^}z":Ͼ6W?-sBpN ׮{?00pe0&Gkb'#KnI9LЪYc\MziVQ[N;߮2n;핣 W=224ԡNwF&RTq03 CTne!q=.٣=I-rh:zviظxP`0abm&Wc6SWk6AA6;;bР^-ܸ._Sī&"-SOv\v- ĝE̶^6W=VGIl8z⁲G,^ajܾ ;z,dswmjyx|b^mHшx9O mg? VM}  wpQQQlEܣ {94 +Ox^(#Ba}ѪYC[sgdq6Z3ߵc^ .~G+\#e'Gy6k[`\7L<U\z [X8Jgy0KcDmg? c E/OAA2^F:B&|YxHܱ2|diTbqX3- "3J%\$~g͓2m\U-^ЙL 1Vˋ#_Nx-OAAZV LǕ p_Xu*  DQZ;`D!MEYnnvbH  ST-\ .f׎>{Bh5gy37~iutǡ>0Cx:AAA) ˍkr51ݜ0*f\F  DQS3jеS\K)Ŏp0uEXl7:o%DtԚf  H5a5oܱ%;hZIq   ?Ĭ\#'ϢCpw͚6@y10`0a +7媍n  :P{l|ri4;@֩-&~Bո~܄k H4wwy {E@S횭˷lEˤL7viq_fM`ݦ}r_?4Йxb"o<ϓ  jʹ@y{:Ÿ}}O,/[Quh\'^\Sg`֔V8Ѿu8X ^5jc^yUføBO:”4ww|XnͽX$ FzMxWujxmh۲ Gu}GU;I&DI[PtPT]]u oa˂ $`D t%&3d10L23!z0w;gιͿʘo೭'|s r0s -]MZzy&.\/VW>;4yydf璔h.=;u'246qlyRCN)tB!D##/k?6 @fL37&4$ ?.3s陹.7ߛ{g).DO^n(.WWp2qFQZqmVu׈ذ4b[ #7TT)B!Ag`ɘ,d.tZFpr e]u{s|̭W=#+o,&|b9 @Lt^8r [6̹,k3|Kcx{+Z kӲGOd1m!BNG^f`{:*7a #ÉelqOAu{s||tle!XJF۾qK*&AlҲ<;^a=0"Ø8ѵ}7z=2)(n*TB!ş0)q<4|>kn5b+:SfOA[u{s|zp{,EQ|BXU"hul܆<Fq&-U_l:;cMLJĜ1T>Y ]UzݶԽLNL8NI_E^7ҝ5e>>Z4fn!A̬<B!$}ƌhƢEo/khʔh4Uu7+b>MuTEqnWIzLtqiOw: -9=ߛqwƛehU}iӲ [pCǑ7d-y9i[HuX/>5GO}0?3goGOK&Bqקة3FO3RwH[msw9pl]/*Du{s^WM>W[f{U#UulUrf}Z˃y˰W}ӕEȱ3 !B! &WL!tكCkKP!HӬB!B6qwlܴզַiե{J:~<u_!B6qTx?.ϼ6Z5`0j2nL>8Nv7ʜ${~.6{Fށe OוEEo}Y6f[9wmo}Of#<4q#thۂg_gHF uRog4_rٹDU9XW"JB!$hbW+g[KΥga*ٺi4qۯgg_\sYe4V>W͔[, L,[ ]ځA7׉@`$( SD;1grN9O_mm(Ndf呕GҊ/ɧLW>[qԷGU;ue!BQUO[fV>!Kq rtT9@&=3_o)(| ))*&_ڗWHtTEiZK`Z4g☁ؼ1!A`Ɲ>/EEgȔH!B i$'71<@lLD@e/4]xR"bZwZlʙsY>%#y|澛BHpK=Ne=''Ч9:El8z YHB!uN[fDʄku[R6q8 bPͯz/uAztm 3r ":2ȈP&V7ɧKV[{vȓ)eSB!®^9gs6v \Ic(f3 ]9sЗ ~k6nCb b8/xbZڷ-u/8>gҽ>o/Ixd'_s{.9|s_y ]ٞ5| ڪߛ,Mc(S^M-3w  B5df8B!5@IJJg̘i,Z=#] M2dSulUt\9UQOQ4yn-y*7+euݧR KMx}24r=vW(׭Z*^B/+Ou4u(Л{>z!x8=~;zZ7!B}:`44+ qWi4abǦb-0vD?~CEQAZE_ڷrfGV,wݕm]/*QGu{s=oN}>]Y;#B!5O=2Ǯ=4eO5>_w%^\uRxR_!$hM~tK߁ٮ##$6MeB!Vf.[)k11 7sϟW¢} p.E$*sa. #)[UUttDB!0] ts@t0FFoʠM\YCleK 9B ڪ4M(U50M16M.m:܍10\ޟ?FuF}];q䏀|EYo0ک-9]!D\aKThrٹ!$aRTj!\('sԯ,$ !AοIاGyI76~|z{^޿VsON=8Ŝ/I.]lfRX>9WxaP8EeK縟?U(ic̅ ]ck@ s2>nL40JE?>սnqMy\l40> 5mrb3 TZLQ P .W/kke^6"tT#rܗ+ JXX=Օ pG۲1?86+3 ݖ*;PvrUQp0^IAa,y g#EBqn% -.b`uzl_ɪPڗmU3j,io-afA ڄ݄6~n/GUK! mlVژx<-( (τYtVH uL[4s5Ȫ+ )8|/;h&yGdWyܬCw) mi YY~َ9y?(AE$Xia+52Q^ lQne)!BԞ'cVbSi 4e`Ϋ~0 8ULKX4d`8FʽIh)z[)PG0b>Օ a`(4r`Aa7(erâ1b6+NrϟOC(0kaѬ7s[4C'GQ9@ zNJ xܔHek6;|EtkϘ1MXm{2e:L,Rbܴuv奪Ye:Ϩa}h{S3f[]x Vc6ۿ-JY8 wb8}6w|ʱg?? OZ q-O{') g}>:movƴjфVmd?::2ndDr)Z 3_L/V1Iѵ-( ;vc/x=e,s$XOro :}WkM% +.bV6%:'B\nJGQcHԮөݍ2'Ǟf㞑we8RU^ xx(eC8>?.ϼ6Z5')?=[T?oүo}Y6f[P޵o<9{R+Xw'6:g_Y_1$QwOUUC<|8?D2jXorQdWYêNUU..xڔ !BHV s -]MZzy&.\\KΥga*ٺi4qmޯgg_\sYeƦilZlUW7d$( SD;1grN9O_mm(e[/74yyde/qK{Gi;df呕GҊ/ЩRVZTa{_K>:^:5h !OGֲ(| ))*yfVcc>:*G~XK`Z4g☁ؼ1!AAmĨ_02r/oFQF}MU]gETj%L(R'B!mW\fB"u/sriɳD '<kn%{kчkx|({EqϾf!( }V>vkOiÜUxS~usJ0r]٪b9EQ퇪UUQtt4MV}WIzst KMx}22^|j"&y&Aې *>QZƎO?pLxS~uϻ{l[[T]urfJAyӕEȱ3]%\\.~zUҎ OSQ?#Ml-!FhkfeĿ#)oH!WmW=2Ǯ=4eM9煹ݹUUӬ^֢~:OR{.b6;e~B6ʒSYUM{)TU/"WwU'7)Opi+1V=!=6/D!ٴg6o]6Px7mf]r2w)ƭ C=y0gж˅َ-ҩT[cJ{k1y8ˇ*ŊBR+/T[|E!K[Ť=)JZFJP(;9mê(؜|R>B!$h+$ĺwԹъɏnb;4׎և75cv{ꃔ7mf1o8xTY1vD?"CI|%Y2`+04ciP bqU+n1eeBCd->K!f_߫PyNSHȀ3+S]ڎ+ki ] QPXBQS.=b΂XݍF ɲ r$bV$gj\F~]q,5FWGDx,؀\E{@ ᱈ y) /01AS ` & eloDH(ND簘jh6gE5⽠0`*eUTvsX4C"kOBw#m6{#"<R_Fj"K;Hٌ:y܍9:9~.mټmwF"#$6 qiddrY`yscP) ?!> j6_Q]9_UwF~-[^[D%:[0sH1 ܝ#ʽ*Wyގ-[5:BU+T?5m,C~???T``HD@_ڹMnqQU$B:yz:7 $,s÷ `aSj`#e&cSZs '7[7AVaglޘ~S)hSUC{3wWBCI}wlgk{^hC$hE)i=o]{8wky(?e,s$XO^qqm9C&%G׶(ع%˿R\(dݟ(NM%rYt~B~ OL@U^xrw%x5S?t#c: *vjKNnBQd-Kّ'TN%fVD*$ ]AEUUm;wc˿դgW`bʯHα¼Rxpp|o.\Es<3Ox*`iz2#iŗNRݦilZYdlf,N[ofi2_sY,|{7wOa~>oa0(b÷s:I)];qc끕)쑞ֶԽLNL8NIw t'& 63ib#xz06ouv3ashگ_hb=CQ&:j|N1{HYRж4ySs(J%G>k?_Y.I@.%o}|7h+jL$;'Z{Ymʧ]-ڔbbCptos"b9W@)$\F݄($%%3fF4-z>-Lx$2&3}57ٞB\BלQb4E(n۫+_U r}iӲ=Ө(*Tr.kzOW-~i/9F9F>./G2ۜ|jRwVAsExᣧI^Arݿ'2"_,'N4`}p^'$&>'2TQo\^xOӱSgFf##mz~TB*t{6e6ETWs+np&p-kzo{ 2*Ûwm* ݔa IDAT9BkB?cn l.JwzaӴkb+]׽^_L\>_~n5 McXQV,BRJ !EʦP')4 Ks'ey!Am3 !.hg-(A񛌴 !AJ^ǁ#$*B"e,_W+12tE]7jX^|jb̘/<1nſkh@Q!jXMQX+ H׸<݈Vw;jf7ıVWt9O{'v7Jȸiɡ#xk'v9+72CCӯ|NW('_|tU1Iѵ-( ;vc/0'y9]aF1i3_{S~x㭏e=xh^W)UUԾ%Id汩Ya+3zx_E+ u6qK7$ٟp}e;IKS6ôk՜3i.ͭZ;ط ?XñiD3|m|.teka2dRͯA=پk/=_.*"*ۙ[@txX偽:}6=68L.* JFe#eǨڐ0EE W l@[xojҳ+0lW$ti<%+\z" M׶zvI%;'e)\ SW_UW7)):s"s1kFVQ*\ݿl52+չIO,M@fvٹ$%w韞؞+-Qi{Ss~h,OM*ܦ;9ϓa{2{8" 'Ϥ3?SӫФQ,dd{O;@*:QS"?)_"FF !׼MTR<$*ղ(|  kHn). =3g2ՕM.e[4g☁ؼ1!A`OhR3.MZTd8Y'#ǥ"*m;tAU tlPf >' 8yK YЫjkZʝn庆XJJX~ܼB(Js?m6*2_sMTd!$8%\~S5stZ&1ѮWXi{^~!:`+v.QTL,JKKkr>>ߎ]JV1PLTAΪl:yS@Ϡ㖛ý^l=_3nٔ3֥Mf=q 6BԾD%L.e^z9QLu|P6nIe4BUTZ6g[il޶IDx(Fմ/e,V-~ʴ99t S`{оvу #*2ɉ]g}7zёDEطص*uAƍ??vrb5#iӲ0mG:Lj= 4t~d~&~?Ef#t/ =rmۧVo?YM!.-o(OT"HFjٚЁ矘@(Τe-^+nfAc#( LBv w}m<%X QQO忽&%♇ƓG|=:{ݿɫ71)qsfN`Pdw)g_3etv>Ͽv$Aٵ M;grdWkF~) FqRV[Go'3+?ۺu/]CzcRRb,w$I/-u/8>g]]M-3w jPʓq8dm6!G$Q$}ƌhƢEo/khʔ.\(g;.n Z)Z?@Td(=?GinrNMyL$\FUWm]\J쯪cꦎ^2+˛ָ.^>]]#oˍޗ6-e.}S9|4ɫ7 چO{k>ppk&NMQ{;AWH!.RkS&*+C"X.^tԙL#K]\W|Xv 9я~>)xW]9ޖ6[{88 V`^ⱼ鿋9:TޜV݌TN2{2}9ӕEȱ3|&k !ĕ!JD}#AUhϾko,MYjr^ܝ=s4{ȆY} f&W$*Kj֟ټmw6F)㯄nhD}^M[Pf"qʕsxU}$ )لvԭ5Raj۫sgM̩B\}Gݞ')4ª~G%6V3|/ /*fjKe;=YKI)1ƀk㏨S6(8$B\y+"4aUhŊKa10O1=O7!A}Uq[qWj ٵf]"HVTPyMPH|IҎc'8u6Ҷg38r, ]^3m>4{&]xNoެVhSbWVWzM_H6JTWS $#JWoUZVZoB>_nܚVlfkt܆-w}B/JڔnYBkpO7d&y|.t]';dXK7tBŵ c"Ё{v晙TZgizs;Ql1o^4]Q 2x_4oϘ>7Ьa(EV~_t ]6o tkBx?0Y} `\¦iVcAU#9=?,0CҫC#sk`..uh̉IorϤ7(*'rgҲǯ4;?gPypXkwEQ#<4 C|a^VYO|L˩2rho;uZm-Tc[v&3+eۼן䍷>tѭy/fݟ(NM%rYWBGƍOH9[?|Fƛϗo :}Zu~JhH0՘Ŏ]\e1q zuk|w(5򠼟[Y!*oBc ۍ4b>6~w'6:g_Y<)&X|@~I1AF-2UǵْV[r:--~a[0Z5LZK]nnՂ=XWB^2 L ؓ΋[X{vGde2<4q+ Mӽ|%;7vdVtjw#ITdf؁3|=/ x:L8Fm,7!ΣnM2Bzk*9똊,Oq~[o-%3;]yŗ$EIg3|Mؽ7>__FiͱX(=jgs(4[ǻ9 0]Kݻ9o,'rk)`nʯnXLəL{`Ƿf=Hz]w)t݈Q"#^ymʭ,Zwqp.]x{ <esǸߍ^?kc^z?e[Ank5S9ko&+^hRBXh0f!e?{cGБS#_mIicu04c֟_ /Y%:|{Fr_"-= ]Y+XKG[]ޑ[;cړ- gra.#L|)OT22eRHV4s.բ"ulO!*2}jPUњn_R~{ѕriw+r64j0t{7H!}R]l Bz!H @z t0qIֽd*mrcft9s̜3gi:; 4j~Hp%N;F^gDA0-ZoV2k 4a橂\­SkJ*Jy38^ (F[c@n^͢"8sńr)# Fӓ2~2d*OCߞ2f O=|{cǞ9~n;\$mWBtbt#/hɴ|+Wxhj4"}H*!r⩟8;_ "|H.2_[ثҭj d J#}f[PN_RyUԖuS([t:5hmޥckL݇5#I9Oڥ+@^d\ɥҡ)X?_BIi9~>|W/gS/ӡmK.gZI\Vpgϳud3띯),.1FT^A%V:F(h(EVp[ Tޡt3~[D\V@f?2aބ6[eZع@rێdzqq8zm˃" %啄y͝yg m` >j!><6!,<:>`xdl|/p>V_W՞FySD|/i o5c-7>c;_vs2EƳe{Iؾvbʤ;|a"r A<4u_:Ik4̾'nu[2D "mc1s]ׄpm  $X7V# p+p+P8@%`HY1>ʮ7Bis3VIaq MKt&z_7Д1 :ɏ+6]ܾ~%?p3LNn?,_O],?xd 8L%[e6k]3mOφKCd̓7wdS)(N\gA8mOE^'MC}xEΚ@aL?mb<9)Aވ`=4:٪֝ q|`׉,毳,W,9̣{[P7kO3{Iۺpװd͚S I2u#pwn45π DRW#I8BJQI:|ﶆGN}ٵ,q?r^}GG_Ȣܷeoܱ~y=d `a08_SzU`53lZ^~d9:j>ї]UIG诉ϟϨ;zTqN:*dLaW0'$mQU?[^=͚n~}ڶ-0a콜>w%+7_wdV7fXNg]R 7 )*6P,JHH슗Z픧=;fe.`k I` mZ);*MҫPպێ'W3ۣC#CRq[gZ|6;X W 5sS;v(5un Q6yun6dӬꗟWmA8m!g{ֿe;Y6bP7Ξl 4b8|b*5n j hS@iIxz$U'yGP^bl5-H"+O h,3eʮhSPHMh4k䋟@14"ݝK:tGfSׂ(`uۥ«Tjz\^'V*cqIʒ/^^f>%ڡqE\o7{^#]I|1QZ,ϖZ+OícB57_K|NʟT>[6$l'ƕ!Vwl (PƆ!P3aQcy ⡡@_h'?Vb~,X t K2ad_^.c򄡼OkEQZ[ͦ@ 䣠0l?t5E%A( IDATw( S5*u:RN'(fsfǬ6Hމ2(islQԐ KٜMM'{Zpt×"+hVVy](P@_x{/(5(R5@^FFz=vϽGavQըv=JqfEQ+-on@ fu[DɼT#lSaܰHһ[Gv8FeΩgcs; A)Pw>h n7/ ̣6E E=XyC+UAtMz(uSmc/-6Q4v 7 쁿/{+)+iQ+dGZ͇_-5YՅGyT$%e,Y tS/0Zn;{2hZc(T"KcYCi)^7y4}{tA`c|+4l SnFDXҳ_8!ݡgSmT*^/R}H?V")P@fT2Zyy_Ѷu<rݮc­t[Kn)|":7N[̦8;9֭,K|p{|3:Yj͑cۍ`o/S^O,/{@ j~oCb6|JJ˸L4oFeZ|e2sΧFm$F͗ |Za!?G/"]:f"d;[ _7!2wN ,rwNmfh|k;q'#<4$ѨW>K֒[@n^ZD/$I C_tU߫`o z?ȹZ@i }{v6;[Okʥ_Wo'eƕ#3k'q7qF&(*Ib\iEz(G1(P@ ֬ik7~KiYS4%?.Aޞ%,2:DNr()b,M-ۢbBC(0_DX̵R`f_+'@_  ;פ3RLwN Aԅm+YTg_'ÑC]9b0[  RFaAX)p~qm[qZaAQ *UĢn*-z7*% (P͸!#EQD%Z_vy&Q&(9}?Pӗ<4R|#=i$fXDW{$}{t[u/Odx 63ge;8ȟf7x`hM2[D\V="48 c49bq~+/ Qk1M_~HPOёݙ}O굲,#RF7U|$VF*n6 (P@qHb|ZG;~x)e4A!j8<ÎʎMoѣ MiIwE#-??Ϡg/A4FWع7'yTǐ.x{ rF6~j4.{[v之ȲĖxqb$IfԱ4kAIY9KWn2Rg|/)co-#w'"zitI(CSk3w$?`$8RfQkݜ?DҥSkE)pɲݶ{)w)P@ aYo!I_}mxh%_FqI~-{k5%r񐙄 fFe4V(Z׶ooٹ3AU$ʲlR,c-?o/o0y?]%* e ` FriC 2*Qpefm.dZm[FilЗ+Ĭ,ƗGoS( R@ H]眊zsx( 3hɒ>L*]2ɗ!EQD^[8y"SOd*SnRP{|5}Bޝ`f-omgcŀ܋J(P@TxO`O]c曗C>+?}7jZа`0$IBӡDr(+-8{M$ of݁xxxPZZŋYu|6˕zWꊾ^TU~pU EN"1hPZGMYKٶ0n :-=3,9 3E{nڑGP/EEe}O[{͚3thW.܀,f#JEaa ǎ{qJZx4 Aѱ}8^ xbbMaa);vpyfμnBXO7Ngaxx 2c$˜ۿszn} uQz!Mwzv.Crq?ovolb"'OC>xy{s53Ckײi*JKr<SR&k@V~o7Pgi_S@α݁JJʍ,tЂ~efrSS.5}?zNHCN4Y,ˌӛӧ/lv^jF|{())',,jRB  ͹`5r{X eUXl޽(|2Oйs ݺر4LÃ9ujQ7Ώ;6EOT*6l8@^^ kZ'[iРY:ӧ/!2V(IWuME I >>8~6BW{QAxc^Eeݴ͛$5qbߞj57ޝ:MNW_eڴ)WΟ_ɓ NJŻiv=я>JhӦ99sȽt A[QҷB$n~~0kbx?ײWQ$M_P)[oS^\l=5?v KJز`~zԉ՟~j>>,wˬ7YWcz܁si.tʕۗ`cZAA;v`M7YξP^̙S{u6LЇ2 _~; yp *`۶#4k!ݽ[L-F@Çw7{t^ݻ:֯o`P1fL/}~@w{Xh#Gry)LԻ~U.ر(  ȳsΤI[󧘘sfQts>HJٵzѷo6?8w*mz[CYI4`O(/OOJEQg5r$)[r̙U7=Gg\0I6o_x]嗍 ΥCR C0lq}?12Z?pTO>ɛ&dc!TsE\߾=s栫U=#"(ζp8Rڬ|sdgr_ԩw~ھhQ=6;lO]|JYvm>HG@ߝ*[eeEo-@wH].h=/ tsy t2ggDHu޽; "6짠ʍ#B,Kу(|^~]ĉTViP+EElxc5k`a%QQu0~a#e.T7]4Ԩ;NZ|?Loxz#;;;R[߫YVohF*Pp@_hExM6㾾jڶu(FcisY֗˯I^߿3(yc4QPZZ~C?!!Q8v,8'$?S໗_fw3iCNz:׮eSQVƾիRC1cؿfѴz2,i|wq8v`/c2[/f/+*b?( /PVP`Qr*GʳU7/@ŋȲ}3}NJ7DPx8SO~?)ɩ394QNKiӜ }ziFȑ7vޝ7(ZF$ɔiغ0 ILlA},?v: |Dd@+FZ(O@1Xx6+6ʂA(#j:1*XuB_Nٳ٪s8pu]^: ;w;S;^:X %$[U*6(3] nTThUy+0{9j4ꪣCL؏3]ƉFS{={Nп4Ο4뫦@oH󃲢"~9|(Ҵm[O]ow/Hyq1G7oqtٳ eexe1hѩ~AAڎÇKOGR:O@!?l{k5o_9raNXOTFE1nLc?jgUxxx>੧f޼O;xxxXRټAi(+^jFyS/?2vx]C{_RZEES/|Sk^M P2J DDxGNNA2*]k] ]S(ɸsg 6٨T"c4>TVqM` nh+ (/uIE9˴(QOVM'#*deuXnyO.X'&.\99hi_Z&.dKLLS>wy>i6^,IUå'XcJne˸kJJ8s11~ȲlXؼp! wJ  FA6jWvh+*T-lr5#O}⼼Zm{}R#M3:s~ұc&&}BFq%5|Uδ&&rq }0xT59}iʔ6oo*b8~<"+"DʞQ#ghuuKuٶA<As6E6؃sO483(z[޽eûLصȖSSXg/0 o@RR.dqRzWsE~q +)TI3$'O鄷}#DnXN*jr0r(`߳g|}ٳ=ҥK,eu)z}8qb'СsjOz_k?m~ IM(<f„n;U8z4Y6?xOzMFG$4*3fpQѣhc޸VSAVGUmMGqn.%%EF2o3;?Ϗ΢ٳYnr2_smNs8 \Ů˹ k QE|<̝kq DMл7i< hz>ЙŔmH>ܢnNΝHJȭ#"EElv]9vu6K~7m ƖQ$5\*N&pkW?d!T+9 L)!, J{uΠIՁGOYYbMCС/e! ᷗ_[lpnw t'#FtÃG!"%1|x,lQY\eۺvaqiAJZгg{JJٽ8۶Kgi}"T,W^6o/ﴩ8zKYnp^: xĈHNرYܹ9|j'=z_xJJIN>֭?k߿3GϛX_92T߿3_>F`|y'<<=)Ď,?|2>˩Zۇr̙?&QWb>o=Ǎ3>wK/߹p,o*&͜_6ss5s:{6(ҙ,{ڬYl DMq sDƒy [ ̞YYlʷ&W_U @ii)>VfkZxĐ#̟?_5-$IUƇ <${q X'* IDATpנ4+v kIP[oP+ect2!L㮙Sηs^\%f=Ъ U H|^FbrU> HU|՝ss"cbSٱ|D \&k,&5@᳣}۔5[X_[-Bo6ٱ <{$IӥKk-fU{'{4:RN2[H?!@M3+Y-u=csϙ*a-M4˒ |QQD W:Sm`e|Cʑ[5Q$$#ţG㫯935lHۯG=8xlO%***}:yx6s/;#Ԥ$)'/;]V6 wd #pRUFY9{ a .mUp}J>ate賤ն|nn2]G\qSK͢PMs (P̞pVT􋗒NiOvd&oŋؿ,;.F=i;C|rg&ƆJc?DWe6 }ePnm^euj.J]]GؑT?Zعz2%owQP^ɧSj箲TjgauJgK18OC-iNMlF}l!tR TWigK?4ڱu"ƨj# ܇ RٽkC #6 *xOFR[Y)Q\TDVV;w( j|G':aɝ |65//u-_ ^xxE6Зh]#W̫_/ㇽ`e2WTJ;ͭ]Xm]Yw2ʚwJ5:ty5f|u~Í>*:,4D=R7Oq %IBӡDrT*M4e˖l޸Ih+XWK4<!]'fQ\c1?f+C ہXHKAtrEmku$ jxlqW?xV!>D@Mu RÁK5ؓJ`VJW:6YwDߖWH/(e)n"^I{=F/[ kI4E@z۰#HF˰P-NI^b[QPվeDcKh._?5?hˠ6a$I2[^tv ܣe0 H rڣBԵ~/zcY$B ^f}"&jE(xjک 6Ơ)V/5b '5WKДmHϊ#hhI-2>o_Ňx_+~=-Qj݂V>W`oZ>NdQX;7PA_]Ys, 2ۻF!o+Qr8_O:D EE҃X,CA-6E]A2`o'x|` >z: M0-Ql:Cq]rS\lɇU),;<$ G@: b~e[JFGt7c:Eҽe>,X6RR#Y wlI"I,;A|td %WꛦO2|o5xRر9`?q}t^[tF9O$X]lqh}PƏ yܜ`y檾b?OjWhydYí<47;G6UGTMA,vNӟH_s٫<,CϖA-/Ѹlo|pE?Է|ك=sT>k+ *ЛrurZA=sLK>w7x{|"چ! b!ϓMr!O E>S,L'_Ax{D6]mRN~EeZ֟ȦPc'Qao:]aB|GQy:MJ:RO߂v4[FM8%x{fHp]bh9]L|TqUۖ|(%K׻.2".|*_keYP7C%ӭ҄GD%…;MA9R3Uu_z0_d0[3uWU)Ydixud;8֕k;i=:"_VEΟmGjB]wռޙԑ?ƴgxVGؽвK Ng#_y$é+%t4.ْٜ o|ܚ(PYX2ʵm#x|5mgsg3"=%!Z6}!BP_/nt]i_wߖ~_{Vtι!XCH쵏`7YsXOtc\CNJkqu|WW緻V<9H'Sb$owq=na?տOwkGWc/{'-4ț̢r2 +$IY2 F `;rWsi!?wdɱ6U`>WV2 j),C}=SDu|+DK o3%S]L|/:o _LP:4i {i 3++j:Gugis5]?OG%go_FNG:VWBȇʴ;X֝}dVҳZ{hINk2 C>lտygj=Oz,lP˕^GyeDy\lj|o+BEUJ`h3^P%O{6((F#1˗=ؓ?G.QbT7eIcW(,'*HmGC_+8r y 6I݌z>V11mB ~yoK|Tiul)XWޞhj[;`t7n$M+`lw mRiwȇy{W/R»jgeAŖ~_{ 9'(P!8/!B}8SBnuW7[?MMdz??SBy?^sD_]՟AN,_m˟Y0(VoP_O**uMcP0vJVGWVC_+lBnH:,RVK|eޞx{/tfX E?C8\Lv J ~Hlڷ`Z +P=[Ub/>SljkbG,?N~2-Keеef!@AiiFQW?K?kN!ː, ],Mތow_dH<#W_(Dx1M(ڄ9ă.Y|UL@Ƽ+5S~>ο;s$/aY{,yRRĆh#}GW붦Sic:51"K>j¸x}__s:FbgssSɤ(/8N=ڂ߅,TUwy{iuZu^ pham]XʴH#^{ @faqWzǕ}:̂rHnk{~i|uU?DA{`uuWySQ)(D ѽ4^ϗgz IX:p0d f82tL˴VdAIhi? nH [FWS^;G[ɇ;˔e]wMhga޾z ng/ #Z~m_G//>-Dn9J-)fu=99m$epoCVogGi>k= gK18Sx2/hK0]m{Ç[˸x/Fӟ7kO{+Se35wWC?;3oVgd!GS:wd?r/*,#I$!UɲDEEŵ&y .i-wLgJ&5wO{1(?;^p/?qCϦ&Ԫ>zf}cMg4x(,*}ccSxNstS-Qڿ~_(im9 @^b yJ5R&ž^TpFq?ޝCvnvM#UboL$۬|[ R+A `p30ح,P^Ȳ^UW (P@ CP!ƏtwAd4ZNY K=;όwtni;Zsj99}6:I7du爢>L…ӐsGGC`BNvZ;W-~9Qԇ̸Y5.rjl5 s[y6ls}b?CrWC_Q]n۩.wm(pm# "E$62J$IH PguY_ "4 EPzG=}M<>X;C_c u2^c#ESw?ΩK|U"9 rw݆"(r磳&^ ׿Ze 4Dݙ6ݍzao7]At8?0JKg]՝M;ҡp"#ۣRyRRÅ {9~| Zm$$Lfh4ŤС_(++TzQ}0S=hɱStɟgL[Ͷ]10)Js?Y\띆ο#VupU>VyPCuuYc-ݬ-ӹxvW/Ғ}B)!-m 7sܟ?e?,֯BqOcÆ;7*|TV,}Qa6HF W?kR uwpEmދQTҋZKN*7zV@A1.z?RǩH@5w2%ZSt7*>MH+4>/ڼeo-v.zgPy3c93b)z3ڶ?< \< $S8=]u'#Wo+2Lڵ<,dfeo?8jڪUO:vE``Zm)GȲneŋٿ' ĺu΢,[omؾ **(._4a<@ҤIu+?6߼̪>bf<6/X`V}a#6(-[;`_~sx%Lea!\JotdןWpd:mMϵ HJIÈ ً|rd_u }^{( ,}{ͣ<*2ĆmeoMMAؽ [#"䦁=e|`%eefِF>İN<ٍw=G"MHd@y(ܲ~2ڏw:ee23¡;tF.9xg~e&6Ffv2֬y_tki*:3YYt ]/QTA8u*{'IUV2k(TtۗϟzMH>}*?G i҄&M9mS廂;ijQԅ77ɇN0F?NƈzvffmҧG'h>R_{6~M"Bg0{bZP;<?\|ڷni >y0C6 &Oj俫S;+:i8Hbx=?sT9OofpD#jm?$}.c56l;/ CX~'ooFpjp 'Imؓ[7@\m6ߺ柫TWC]{Q*r;]GM[Etl? qsU=qUC+PpCmWwYLfS؋Ÿތ<" CӫɵRk<  5~qmP .~0п{O&bNj IDAT3ypwH/FYJȿ)Lw>TTwz TTwxTUǿL&2$[舀Hi ]Aw]wAb4i{W+5@ڤd=?fr3)Nf& ~'ýsyyiY7nG,;a2鑛{G,Gi'WH>'OvdkJ:HN'W1ǎ-Ej`Ȑ0z< 1eMCȽsE9"v•[p;#Ebۼ$wtl8p-d sYԛw7Ch`=QIHX Y9yŢ>u^g/^C7nfE?.훉gǕ[й]s>io@zF6 d/ng"']$?q]=j%!T?/K_|)?okf<'GnŸ7ùqJ*biaC}'YKXrL;zO8!!JO@0uP/8e+â[Эc+|mT'?j n6dLinj`jk+(x{׹S*4J[jCuIW1@WTZiBXt,bb1ĉ٦Fl.|xx,n:u?k4E[f!,,:<@VO^ػKݲcy0EӦ}ѩӳػ+-6) ^З%f u<ݏV 9⽜[9`+luJ݆lFقiwgM¸z8@%1Zdf状#!67nvYYLtK1ёNcjq1iM湓s[~vQ#1&__q*P("HG{?ȱo0U?nxNd6<"Gw,uzoo+P?ASA7? {7AІ )nay !ez5 g;F8Y>. p1JL|uj#+Fc>4XbnFBܑе$Ll. <1HLJjufdM[&~m5m9P9]%t??;щȸv œW8NM&ű3ʋ#~̝"}14Xk.ifJX#>V,@\lO5[I4 +tI?/ЧЛ}2s1/,*}F橃z+_Ja8x쬬_ _e'R`Omc`nGm`/I^mcT3!KʷKb|l3ퟵ9퟿Hk[}}@WAe_h%1t,G*2*p(c@, cD0QNk@&At).DÐ J5Dp.Y ;б3HHh2Zm":t#Fݸqm EXX44(iN:]4"M ;_ב~w!)휜hr0 Ǣe!ɹ.+kbث"fM j7kgg<;1`D%$@Ӧ];Х}s:~ƩG܂M„Q׿z=!G~ǘa}H<3OS6n?<;օ:D8L;Ps3/byzM}qL7 19 F˞ߟA捠QyT* Ų@L*[>)B.m[>Rm`/I+X_:2)[FGE`~8xw_5?ATu|iGg=G(zSqҳsL{e_E.<>; \Q_MO1 |5D}Ӛ7RqymׯZӦٳ?_`4 9y$08sfSiPrzGqu4N^? :=G8,]:Y֚.]+Ѣ@h1^J480Z=}g@X8p;Y]` Al͚ȸv ;~!`Ao,[pn>lr+rvڍtX N^債?/^ya$s|t%mĔ Cm9NAJ 1~D_y%(a5wKoYʗĩU iz=["gғ+~x))@*G[{oIb͂w.Ry֭ya͂w0b`2eR_@ )'A`U` [;]l@H59_zHXF3pw_r$})[Oޟ~yh3]29-\ygw]A >W9R|#['>r@珟Y%׃ʓgfc){}'l20_sQcAkä꿔.Ry}wZSHq$xnti*?AA*"l6;R䮯sWss1~Ǩa'Hj|<T魻;L&`@/ [OΒ޶T4&\pY3Xn\zL{wSY>u׉Uggc=c~c5pU/>j,Y,x l6Z5osgH7z=\]ZQ~ׯMukRnJlݸ^[~8iGw.ΗztNJeueG˃U_q\"87W%ReG݌z>_])ԫ]Ϗe8@T^6=F$H%flOx?X>`۱s`[G"QIK-r>[Fgm mʭ@TZTrvIMн>35|-[JU:uRhVxx, /ƌ_a^ ~mD䨛_EUupH=/&A&lgBh?NJK`-bziBwt{}뗿qS?OHLjٶկ*;ʦ^zh}Bjo,uXjB^K}-rf 7 *@ݯyW-[ƕ+qJ FfOkسK0&8?<oG۶#˗ADEO?VЄa褄8wOκ5).;v=RO 1RڙvwfjWԪTt~sa9qm kџBg\K?jT$s ,"3@ȹ,(L~~ )@ R3y3C?>GԷQp%F<k7ap&Y+TTNS L,t3vμim7TQ_d?> 8o3XdG+6@TOe"P׿e~RT<򦷃~8Q_w@#ł <C~SӪՓ0qvm;ܧuۡIj`6p~0ƠTѦpԩ!5$N\ 9p0 AxgqGE޽X(.,cǰ/%KD{`> ]X?w.zd )oS0GQ-.i2Ÿp-0ϗ=R[!"!..kq'3'`[c$W>)( {/yٸ>8FLzCy)W͟_F?{rxmY8|Z6i;aZxAm,][wqҿzwKFDxvl`<cR:GC&ȉsXb &[YJd(:I314_P5nܼ5Љ`I'Dĸ}pxk<O{vxz3qMfY)W?oeޥ} PXd@ʆ]ر郎K+U*}B-нKkW^/#m#r9pfkgZWYy<'6Cؖkb0nPP5;"Ԛ3XC+Fs͠{Gn 㚢ptcļu!aM Gf?d52R̵#0d=89out\3PܥE3#wZļw%hq(ՇTRcPRO >ÀWfYzFYꂼF$~&?+9x_Cߺi'E(9ouFm$_%w[0 63Yf0rRKMRFsdd!-qRsԯ [2b%C=Fzeɹ4n._>E-1cDZhb NZCFHH¥K^^Q`0`ԩX7gW(PΘ7e [سt(^x1dx0AS3i6~d@jy<ܱt 0OL3|0A|ӓ;%9$/#;'{u O:D\|jidGP+);f B[})yG E(,2aö`Inر;UE(0nx c>;6#=X--A1'Ƙ[yFa];/E@z51o>yIןaz Z -&ֵJO~~r0o X&tDz;͛>=:`ҍz#q1Z ;oJկhB)wnڵqr_)HP菎z,vJ8Y|OF]7Bu5`@„.]{*'P ~wZ< @` LʋagzЫN(ȨP] Y317G1܍$}ǎ ak˘PzF?Bu-0覷GvyX/cP*1d|џ9+_,[>SwO"<%׿}ߝ$뷟WdCĿ4`[ח_kK/G:HN;+kIFС0|ίq8x{de]c &G, iݻ?CQɓ)c*NZ@ZtYGll}n$kM?|'RS_|i?s:Iy:c7ePO[Ӧ!m0ưa\L3l //rF)܂0ۼCuR;J֟oVʦ_a؀xjPJ,[SY٥5>|2rÒU)Oe$Gl`᝹DD/݀j8.^jA\}/#=Öտ+Srǝ.O#+'1r ox,ol8CȬ[wp85SKQE)[Ѿuc#}r/Nيl{+>)o~xO|\|1͢d }Wۇu$4[?aXm9?L,k./3!E緣`b3^s}-8!lUmIfi@qHLӛ!h.Kp.J;Y >RX Y2Ƀ,5‘mXi\(sIo"G˱Μ_yՇ <(vWAY?1*eZ}i&hV~r!oz;ZSnO7z8iN ~Z=z:b/wKs]>˗ ;<<yy7~`?k4Ŵ 0:uwA>ٟ%uMJ«WtʒsTGwQժ!'=]s>LsE+6QUu0>x^-Dk Ӄ8`ź>xOlL2tbedT'S?KgBp@|޴&xs2GHdf'S OcP߮8?j$ƣdK7b3:1Z#}r%cJ#7o;}WᅥKկ` _ L 0#Yፐ0ldh U+GINTlo9hz섰3y8/zz_V`Cx[Q-k3ZBx?Wd`M mZ#I""$ ^W\z9M*cn$A꾌;'е.>jWBuE9|üor}á0іȗYOD~E 6i\oUhǼ;zXjF@fߚdC~"#kI0 ز]zhbCc̘t$:^:o4Cٜ.yC[MP(TX]`Zd^x:u.rR?gg#:1׮Q#Gb;/Ebi\g2R*a|c`6[fހO#!.7ne|\=u@7Q`U\L8̏ W;?%7ZgB^~amz+_Ja8x,/܂M„Q*Am|NS}Q\l J{gFC|\4;˫yzt&Th<7q۾8&jbK?(0fX_FkgFÑ:i%xJP2yρ#c̰DLM~wWr,m>Q7-=@?牍/AuQ!)1]oPP=0q'#ύHϡf%f!/sNh@Nsȟ_= PD]G$w]wjρ)4W`Fb:쏺Afg04)3 D; }zNYz\++~}4 /e%wLɨ%{}YOZ5zZೊ:J6$¶\O`>GcнY_9;|q3!'w{EO6][=OMWoȝ8D}+uϓI/e?ۥy%Z4Z))`4byy8@ <fr7$xHN :L&=ΜT^x7qn:ӧ׻-Ǐ/CNϡ}8KN4^r-[Btt-0& ??/ǟ]` Al͚ȸv ;~!`Ao,[pn>l[q`xr_ Ϗ/kqrZ0ٹXvwn"6bʄ4fOya(<>)=Kzgڸʮr/o-ހ<;tGVv];6u,cp3=k~s?[F>88EXC܈&? _ Ɍ?WOIٰGŜ7_Bc}-c#KWn`/ ?5ퟔJ'Uv~9"L5WC6k`rl3rv^e_;-Zf|_Pߧ.!;ܯE`l_%_*{v/}{IΑK5s~;/琇(#C%ۉK/Wr"+weoTQV1(U91Jo[>9כ$w@C&'PGsyx?)'þkf:-V{=D$qo>mo{#9uq zwwp(tuKq87L N͏}Ec. Oϯ5]kJ]c w8^zޱNH=ۇ8lS|x>Η|`Lt}m22cN9<_}v'cIco|os8kl\yc G<}ϋiOBۛJ'WE[Wv `U`P˚6뱑j9re@ '@G#rFk/U/{19p#w_Nd_JW2y(?r?_o17gv7D~uL=^n /w*3|_|} Фg^.oLj/?gkr;:ZRϻ{Zz! >Cf^r 0|`OZr[T֎uG* }X [Ƃ— e6y_r3)O]@כ>T.#Fnrf+Uft: LSLn!sq?! hڎ]VWށʿ+xBTb6*O`뻹M,o(ŋ_  %mIJO{G^x4ӻeݔ?A{a t WG}y1E=GUn?A{qo/[?+J\   BAAAAmAAAmAAAAAA&)[GV}T?߶h,DOb%AAADEme/DD`w 4!C^8}zY   iǏÉ"AA"3&Խ B65 i`1Qbj&`JQ(XpS"M$~pcSoʾV `HLuRGҐ(XqWC|-@?Bq5Unr}'P:7lns2m_  -*?UsA$<)`ؑa gaQt= x\mc6MiN~6؟`VY1ClFD,Nmu"$o8JUjڛP0vn𶀧%chgdt),|ԙ (h# /']:AV6+ࢼ;j7YJ,9v>ݰKFxWZauq233zu\μ!~%> :1!:c`!pvGbB{<{`\Vf(NeS:mAA 5cx7?_gAk~&GUCvi; ?w2Iye:д^+Ň9b6" n76a1H왻K ,.BEmPŽrNXә (h# g.'c]W(TL"`j$v>8(jm8lѶ63g5nCڨP-k,2m%=!BmR #=/n;Lyt+T%   D 1'MvۨC$eZu?۽N*[jjt3&4[J@$aښxt݊*~\PbYc ml*v\ yGj:bc%@^w/eb`v:8V1    *5mjAAAU,h# TZhCf#:CBQ tЦTRFAD%b}F桖Ռ`8`Nt 6  F#hj6 }z .0P3&qmd  %jO Pjemq?mu@gAQqZhXC˄bGx"XSDA֨M #Q%~[vv/H'=cH?\Af͘1grS 'Xk7ϣ>3-g55jxw!0q1A b.8g?/#y][={=xE5 rT+.£Y#:z( P ؚ_W"b`PȘA5< ?L;ݳlQ%%Gelr|FkAD"jF |OCH2`u8Vj/hQ q_F$%BZU#Y pܣj A7hBRG[㡇jpRv<,~I:С108p N"5mZ?ay36Ann!Z<9M+Y%KJ3Fb֭‘͛휀GJht 5j!$$8t.^Ƥ' &j:̺N97f5zNju32CɘAܓlذ;wFttx-//@޽uZm8~qcׯ=vmݻc Mض!2R+b=TkGAAD߾rn0ƜkJJ璒y4iR)){C;K" %С`߱~!cѾ}c\ @Z `"X8WâfAl۶ ͞U))AnnFƍc?hkܸ6V܃"ΝbسW0o6n<7hG~: Kҥ)8ζcpn͝T"%u :mdȑ ر +BNN2)CJ hh $Ao̝;SNE}ѧOolݺ mLЂP1 BDDhGE#33)Hs=[#))!n|"%&*UGbc0ض.\:C *w a4 RO?SN_ÇcGBT ؂Ն!;;ՆC/ŭ[Yn2+؄PMVaJ+}k(j# *U#lֹS' <JeoAxR*zh0DDhгg+\&;v?jUJDl} Q& g=y )Hg˻o K_FA4 "0\vЭ{0=u$.]>y 1 ="4=RߕoINfÒc| E G#HQuՇ 222p5tyڨBeGAȅF OzT*qAlڸ#m6]ll:wzmׯ#A=F\'i(DX<8 %6Ebc  w-իWu֕qlPkU߂眮Uߪoa͂f^Eҥ*UMZ5 N,p|ƋuUϮ%u^իrỵ~ea(Y7E- (6oX8BB1#6j;m,ҕJ=??s l{OxlXy7aѐ' p@Y{rykZ#U%z>_]T9RM5u+_}vZ:yI_|)'_3M?9w[v'x>? vPSIDATԁ[ܻ}ߛ%~JW.嵟!/007w2c>J,UyG& 0o X&OtÊuRퟔ۾wGcS1砵zj8\R02Ga4FQu/\3Q/ƺQNttl8p-d sYԛw7Ch`=p2C+)S!+'Y9Xէ}k( |'Sԥ}31u8uyT ^MܼB } '3;3?Z¢-O[ǟpP*xtn Gcgaѩ~~-H!}]'z;SE.]+o(g?ks(_?@.2ML.ic {AfҾ9?ԣ AnA &FGa¨Lz=!G~ǘa}H<3OS6n?<;օ:D8L;Ps3/byzM}qL7 19 F˞ߟA捠QyT* Ų;/T|R!\6:]>ڶ|Х~۾_rߓwSW,=`S򍎊pbo/RoiDB֪vAwn*`vArZ0ٹXvwn6bʄ4f8e/ens| crSٲo 0aTԬ^ EbڰKv`߷^'~wx]$}6n?൩cX^}wǻaˣa2Ǖ4| q)B`RIr?,Nن N+ v)Lo ?UwARퟔ۾!j zC6 [h9}q]oT<ҹqwdC}6Zmxsym8l.%`_`{-xH߫Q89qjs}.=wϖ&v d/IߕKHGRV9:ݚߛ}m?O?k!˳n͓k#f?/IO Wp{ē X G\Fڤ~ww r^^^.y77u"YP#'k ~Rx{F*=y/l,e9_vo:xoMfBKQr^07c,hmTE*@Nk )`#oP  8T6AmADSAAiH ( lAQ>pN'   &$bЦP(h#  (`d   *5V3jIENDB`syntastic-3.10.0/autoload/000077500000000000000000000000001354507713100154325ustar00rootroot00000000000000syntastic-3.10.0/autoload/syntastic/000077500000000000000000000000001354507713100174535ustar00rootroot00000000000000syntastic-3.10.0/autoload/syntastic/c.vim000066400000000000000000000302651354507713100204200ustar00rootroot00000000000000if exists('g:loaded_syntastic_c_autoload') || !exists('g:loaded_syntastic_plugin') finish endif let g:loaded_syntastic_c_autoload = 1 let s:save_cpo = &cpo set cpo&vim " Public functions {{{1 " convenience function to determine the 'null device' parameter " based on the current operating system function! syntastic#c#NullOutput() abort " {{{2 let known_os = has('unix') || has('mac') || syntastic#util#isRunningWindows() return known_os ? '-o ' . syntastic#util#DevNull() : '' endfunction " }}}2 " read additional compiler flags from the given configuration file " the file format and its parsing mechanism is inspired by clang_complete function! syntastic#c#ReadConfig(file) abort " {{{2 call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, 'ReadConfig: looking for', a:file) " search upwards from the current file's directory let config = syntastic#util#findFileInParent(a:file, expand('%:p:h', 1)) if config ==# '' call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, 'ReadConfig: file not found') return '' endif call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, 'ReadConfig: config file:', config) if !filereadable(config) call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, 'ReadConfig: file unreadable') return '' endif " convert filename into absolute path let filepath = fnamemodify(config, ':p:h') " try to read config file try let lines = readfile(config) catch /\m^Vim\%((\a\+)\)\=:E48[45]/ call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, 'ReadConfig: error reading file') return '' endtry " filter out empty lines and comments call filter(lines, 'v:val !~# ''\v^(\s*#|$)''') " remove leading and trailing spaces call map(lines, 'substitute(v:val, ''\m^\s\+'', "", "")') call map(lines, 'substitute(v:val, ''\m\s\+$'', "", "")') let parameters = [] for line in lines let matches = matchstr(line, '\m\C^\s*-I\s*\zs.\+') if matches !=# '' " this one looks like an absolute path if match(matches, '\m^\%(/\|\a:\)') != -1 call add(parameters, '-I' . matches) else call add(parameters, '-I' . filepath . syntastic#util#Slash() . matches) endif else call add(parameters, line) endif endfor return join(map(parameters, 'syntastic#util#shescape(v:val)')) endfunction " }}}2 " GetLocList() for C-like compilers function! syntastic#c#GetLocList(filetype, subchecker, options) abort " {{{2 try let flags = s:_get_cflags(a:filetype, a:subchecker, a:options) catch /\m\C^Syntastic: skip checks$/ return [] endtry let makeprg = syntastic#util#shexpand(g:syntastic_{a:filetype}_compiler) . \ ' ' . flags . ' ' . syntastic#util#shexpand('%') let errorformat = s:_get_checker_var('g', a:filetype, a:subchecker, 'errorformat', a:options['errorformat']) let postprocess = s:_get_checker_var('g', a:filetype, a:subchecker, 'remove_include_errors', 0) ? \ ['filterForeignErrors'] : [] " process makeprg return SyntasticMake({ \ 'makeprg': makeprg, \ 'errorformat': errorformat, \ 'postprocess': postprocess }) endfunction " }}}2 " }}}1 " Private functions {{{1 " initialize c/cpp syntax checker handlers function! s:_init() abort " {{{2 let s:handlers = [] let s:cflags = {} call s:_registerHandler('\m\', 's:_checkPhp', []) call s:_registerHandler('\m\', 's:_checkPython', []) call s:_registerHandler('\m\' echohl ErrorMsg echomsg 'syntastic: error: ' . a:msg echohl None endfunction " }}}2 function! syntastic#log#oneTimeWarn(msg) abort " {{{2 if index(s:one_time_notices_issued, a:msg) >= 0 return endif call add(s:one_time_notices_issued, a:msg) call syntastic#log#warn(a:msg) endfunction " }}}2 " @vimlint(EVL102, 1, l:OLD_VAR) function! syntastic#log#deprecationWarn(old, new, ...) abort " {{{2 if exists('g:syntastic_' . a:old) && !exists('g:syntastic_' . a:new) let msg = 'variable g:syntastic_' . a:old . ' is deprecated, please use ' if a:0 let OLD_VAR = g:syntastic_{a:old} try let NEW_VAR = eval(a:1) let msg .= 'in its stead: let g:syntastic_' . a:new . ' = ' . string(NEW_VAR) let g:syntastic_{a:new} = NEW_VAR catch let msg .= 'g:syntastic_' . a:new . ' instead' endtry else let msg .= 'g:syntastic_' . a:new . ' instead' let g:syntastic_{a:new} = g:syntastic_{a:old} endif call syntastic#log#oneTimeWarn(msg) endif endfunction " }}}2 " @vimlint(EVL102, 0, l:OLD_VAR) function! syntastic#log#debug(level, msg, ...) abort " {{{2 if !s:_isDebugEnabled(a:level) return endif let leader = s:_log_timestamp() call s:_logRedirect(1) if a:0 " filter out dictionary functions echomsg leader . a:msg . ' ' . \ strtrans(string(type(a:1) == type({}) || type(a:1) == type([]) ? \ filter(copy(a:1), 'type(v:val) != type(function("tr"))') : a:1)) else echomsg leader . a:msg endif call s:_logRedirect(0) endfunction " }}}2 function! syntastic#log#debugShowOptions(level, names) abort " {{{2 if !s:_isDebugEnabled(a:level) return endif let leader = s:_log_timestamp() call s:_logRedirect(1) let vlist = copy(type(a:names) == type('') ? [a:names] : a:names) let add_shell = index(vlist, 'shell') >= 0 && &shell !=# syntastic#util#var('shell') if !empty(vlist) call map(vlist, "'&' . v:val . ' = ' . strtrans(string(eval('&' . v:val))) . (s:_is_modified(v:val) ? ' (!)' : '')") if add_shell call add(vlist, 'u:shell = ' . strtrans(string(syntastic#util#var('shell'))) . ' (!)') endif echomsg leader . join(vlist, ', ') endif call s:_logRedirect(0) endfunction " }}}2 function! syntastic#log#debugShowVariables(level, names) abort " {{{2 if !s:_isDebugEnabled(a:level) return endif let leader = s:_log_timestamp() call s:_logRedirect(1) let vlist = type(a:names) == type('') ? [a:names] : a:names for name in vlist let msg = s:_format_variable(name) if msg !=# '' echomsg leader . msg endif endfor call s:_logRedirect(0) endfunction " }}}2 function! syntastic#log#debugDump(level) abort " {{{2 if !s:_isDebugEnabled(a:level) return endif call syntastic#log#debugShowVariables( a:level, sort(keys(g:_SYNTASTIC_DEFAULTS)) ) endfunction " }}}2 function! syntastic#log#ndebug(level, title, messages) abort " {{{2 if s:_isDebugEnabled(a:level) return endif call syntastic#log#error(a:title) if type(a:messages) == type([]) for msg in a:messages echomsg msg endfor else echomsg a:messages endif endfunction " }}}2 " }}}1 " Private functions {{{1 function! s:_isDebugEnabled_smart(level) abort " {{{2 return and(g:syntastic_debug, a:level) endfunction " }}}2 function! s:_isDebugEnabled_dumb(level) abort " {{{2 " poor man's bit test for bit N, assuming a:level == 2**N return (g:syntastic_debug / a:level) % 2 endfunction " }}}2 let s:_isDebugEnabled = function(exists('*and') ? 's:_isDebugEnabled_smart' : 's:_isDebugEnabled_dumb') lockvar s:_isDebugEnabled function! s:_logRedirect(on) abort " {{{2 if exists('g:syntastic_debug_file') if a:on try execute 'redir >> ' . fnameescape(expand(g:syntastic_debug_file, 1)) catch /\m^Vim\%((\a\+)\)\=:/ silent! redir END unlet g:syntastic_debug_file endtry else silent! redir END endif endif endfunction " }}}2 " }}}1 " Utilities {{{1 function! s:_log_timestamp_smart() abort " {{{2 return printf('syntastic: %f: ', reltimefloat(reltime(g:_SYNTASTIC_START))) endfunction " }}}2 function! s:_log_timestamp_dumb() abort " {{{2 return 'syntastic: ' . split(reltimestr(reltime(g:_SYNTASTIC_START)))[0] . ': ' endfunction " }}}2 let s:_log_timestamp = function(has('float') && exists('*reltimefloat') ? 's:_log_timestamp_smart' : 's:_log_timestamp_dumb') lockvar s:_log_timestamp function! s:_format_variable(name) abort " {{{2 let vals = [] if exists('g:syntastic_' . a:name) call add(vals, 'g:syntastic_' . a:name . ' = ' . strtrans(string(g:syntastic_{a:name}))) endif if exists('b:syntastic_' . a:name) call add(vals, 'b:syntastic_' . a:name . ' = ' . strtrans(string(b:syntastic_{a:name}))) endif return join(vals, ', ') endfunction " }}}2 function! s:_is_modified(name) abort " {{{2 if !exists('s:option_defaults') let s:option_defaults = {} endif if !has_key(s:option_defaults, a:name) let opt_save = eval('&' . a:name) execute 'set ' . a:name . '&' let s:option_defaults[a:name] = eval('&' . a:name) execute 'let &' . a:name . ' = ' . string(opt_save) endif return s:option_defaults[a:name] !=# eval('&' . a:name) endfunction " }}}2 " }}}1 let &cpo = s:save_cpo unlet s:save_cpo " vim: set sw=4 sts=4 et fdm=marker: syntastic-3.10.0/autoload/syntastic/postprocess.vim000066400000000000000000000046131354507713100225600ustar00rootroot00000000000000if exists('g:loaded_syntastic_postprocess_autoload') || !exists('g:loaded_syntastic_plugin') finish endif let g:loaded_syntastic_postprocess_autoload = 1 let s:save_cpo = &cpo set cpo&vim " Public functions {{{1 " merge consecutive blanks function! syntastic#postprocess#compressWhitespace(errors) abort " {{{2 for e in a:errors let e['text'] = substitute(e['text'], "\001", '', 'g') let e['text'] = substitute(e['text'], '\n', ' ', 'g') let e['text'] = substitute(e['text'], '\m\s\{2,}', ' ', 'g') let e['text'] = substitute(e['text'], '\m^\s\+', '', '') let e['text'] = substitute(e['text'], '\m\s\+$', '', '') endfor return a:errors endfunction " }}}2 " remove spurious CR under Cygwin function! syntastic#postprocess#cygwinRemoveCR(errors) abort " {{{2 if has('win32unix') for e in a:errors let e['text'] = substitute(e['text'], '\r', '', 'g') endfor endif return a:errors endfunction " }}}2 " decode XML entities function! syntastic#postprocess#decodeXMLEntities(errors) abort " {{{2 for e in a:errors let e['text'] = syntastic#util#decodeXMLEntities(e['text']) endfor return a:errors endfunction " }}}2 " filter out errors referencing other files function! syntastic#postprocess#filterForeignErrors(errors) abort " {{{2 return filter(copy(a:errors), 'get(v:val, "bufnr") == ' . bufnr('')) endfunction " }}}2 " make sure line numbers are not past end of buffers " XXX: this loads all referenced buffers in memory function! syntastic#postprocess#guards(errors) abort " {{{2 let buffers = syntastic#util#unique(map(filter(copy(a:errors), 'v:val["valid"]'), 'str2nr(v:val["bufnr"])')) let guards = {} for b in buffers let guards[b] = len(getbufline(b, 1, '$')) endfor for e in a:errors if e['valid'] && e['lnum'] > guards[e['bufnr']] let e['lnum'] = guards[e['bufnr']] endif endfor return a:errors endfunction " }}}2 " convert error messages from UTF-8 to the current encoding function! syntastic#postprocess#iconv(errors) abort " {{{2 if has('iconv') && &encoding !=# '' && &encoding !=# 'utf-8' for e in a:errors let e['text'] = iconv(e['text'], "utf-8", &encoding) endfor endif return a:errors endfunction " }}}2 " }}}1 let &cpo = s:save_cpo unlet s:save_cpo " vim: set sw=4 sts=4 et fdm=marker: syntastic-3.10.0/autoload/syntastic/preprocess.vim000066400000000000000000000676721354507713100223770ustar00rootroot00000000000000if exists('g:loaded_syntastic_preprocess_autoload') || !exists('g:loaded_syntastic_plugin') finish endif let g:loaded_syntastic_preprocess_autoload = 1 let s:save_cpo = &cpo set cpo&vim " Public functions {{{1 function! syntastic#preprocess#bandit(errors) abort " {{{2 let out = [] let json = s:_decode_JSON(join(a:errors, '')) if type(json) == type({}) && has_key(json, 'results') && type(json['results']) == type([]) for issue in json['results'] if type(issue) == type({}) try call add(out, \ issue['filename'] . ':' . \ issue['line_number'] . ':' . \ { 'LOW': 'I', 'MEDIUM': 'W', 'HIGH': 'E' }[issue['issue_severity']] . ':' . \ issue['test_id'][1:] . ':' . \ issue['issue_text'] . \ ' [' . issue['test_name'] . '] (confidence: ' . issue['issue_confidence'] . ')') catch /\m^Vim\%((\a\+)\)\=:E716/ call syntastic#log#warn('checker python/bandit: unrecognized error item ' . string(issue)) let out = [] break endtry else call syntastic#log#warn('checker python/bandit: unrecognized error item ' . string(issue)) endif endfor else call syntastic#log#warn('checker python/bandit: unrecognized error format (crashed checker?)') endif return out endfunction " }}}2 function! syntastic#preprocess#cabal(errors) abort " {{{2 let out = [] let star = 0 for err in a:errors if star if err ==# '' let star = 0 else let out[-1] .= ' ' . err endif else call add(out, err) if err =~# '\m^*\s' let star = 1 endif endif endfor return out endfunction " }}}2 function! syntastic#preprocess#checkstyle(errors) abort " {{{2 let out = [] let fname = expand('%', 1) for err in a:errors if match(err, '\m') > -1 let line = str2nr(matchstr(err, '\m\ \[[^]]+\])+\ze:'', "", "")') endfunction " }}}2 function! syntastic#preprocess#dockerfile_lint(errors) abort " {{{2 let out = [] let json = s:_decode_JSON(join(a:errors, '')) if type(json) == type({}) try let data = json['error']['data'] + json['warn']['data'] + json['info']['data'] for e in data let type = toupper(e['level'][0]) if type ==# 'I' let type = 'W' let style = 1 else let style = 0 endif let line = get(e, 'line', 1) let message = e['message'] if has_key(e, 'description') && e['description'] !=# 'None' let message = message . '. ' . e['description'] endif let msg = \ type . ':' . \ style . ':' . \ line . ':' . \ message call add(out, msg) endfor catch /\m^Vim\%((\a\+)\)\=:E716/ call syntastic#log#warn('checker dockerfile/dockerfile_lint: unrecognized error format (crashed checker?)') let out = [] endtry else call syntastic#log#warn('checker dockerfile/dockerfile_lint: unrecognized error format (crashed checker?)') endif return out endfunction " }}}2 function! syntastic#preprocess#dscanner(errors) abort " {{{2 let idx = 0 while idx < len(a:errors) && a:errors[idx][0] !=# '{' let idx += 1 endwhile let errs = s:_decode_JSON(join(a:errors[idx :], '')) let out = [] if type(errs) == type({}) && has_key(errs, 'issues') && type(errs['issues']) == type([]) for issue in errs['issues'] try call add(out, \ issue['fileName'] . ':' . \ issue['line'] . ':' . \ issue['column'] . ':' . \ issue['message'] . ' [' . issue['key'] . ']') catch /\m^Vim\%((\a\+)\)\=:E716/ call syntastic#log#warn('checker d/dscanner: unrecognized error item ' . string(issue)) let out = [] break endtry endfor else call syntastic#log#warn('checker d/dscanner: unrecognized error format (crashed checker?)') endif return out endfunction " }}}2 function! syntastic#preprocess#flow(errors) abort " {{{2 let idx = 0 while idx < len(a:errors) && a:errors[idx][0] !=# '{' let idx += 1 endwhile let errs = s:_decode_JSON(join(a:errors[idx :], '')) let out = [] if type(errs) == type({}) && has_key(errs, 'errors') && type(errs['errors']) == type([]) for e in errs['errors'] if type(e) == type({}) && has_key(e, 'message') && type(e['message']) == type([]) && len(e['message']) let m = e['message'][0] let t = e['message'][1:] try let msg = \ m['path'] . ':' . \ m['line'] . ':' . \ m['start'] . ':' . \ (m['line'] ==# m['endline'] && str2nr(m['end']) > 0 ? m['end'] . ':' : '') . \ ' ' . m['descr'] if len(t) let msg .= ' ' . join(map(t, \ 'v:val["descr"] . " (" . v:val["path"] . ":" . v:val["line"] . ":" . v:val["start"] . ' . \ '"," . (v:val["line"] !=# v:val["endline"] ? v:val["endline"] . ":" : "") . ' . \ 'v:val["end"] . ")"')) endif let msg = substitute(msg, '\r', '', 'g') let msg = substitute(msg, '\n', ' ', 'g') call add(out, msg) catch /\m^Vim\%((\a\+)\)\=:E716/ call syntastic#log#warn('checker javascript/flow: unrecognized error format (crashed checker?)') let out = [] break endtry else call syntastic#log#warn('checker javascript/flow: unrecognized error format (crashed checker?)') let out = [] break endif endfor else call syntastic#log#warn('checker javascript/flow: unrecognized error format (crashed checker?)') endif return out endfunction " }}}2 function! syntastic#preprocess#iconv(errors) abort " {{{2 return \ has('iconv') && &encoding !=# '' && &encoding !=# 'utf-8' ? \ map(a:errors, 'iconv(v:val, "utf-8", &encoding)') : \ a:errors endfunction " }}}2 function! syntastic#preprocess#jscs(errors) abort " {{{2 let errs = join(a:errors, '') if errs ==# '' return [] endif let json = s:_decode_JSON(errs) let out = [] if type(json) == type({}) for fname in keys(json) if type(json[fname]) == type([]) for e in json[fname] try let e['message'] = substitute(e['message'], "\n", ' ', 'g') cal add(out, fname . ':' . e['line'] . ':' . e['column'] . ':' . e['message']) catch /\m^Vim\%((\a\+)\)\=:E716/ call syntastic#log#warn('checker javascript/jscs: unrecognized error item ' . string(e)) let out = [] endtry endfor else call syntastic#log#warn('checker javascript/jscs: unrecognized error format (crashed checker?)') endif endfor else call syntastic#log#warn('checker javascript/jscs: unrecognized error format (crashed checker?)') endif return out endfunction " }}}2 function! syntastic#preprocess#killEmpty(errors) abort " {{{2 return filter(copy(a:errors), 'v:val !=# ""') endfunction " }}}2 function! syntastic#preprocess#lynt(errors) abort " {{{2 let errs = join(a:errors, '') if errs ==# '' return [] endif let json = s:_decode_JSON(errs) let out = [] if type(json) == type([]) for err in json if type(err) == type({}) && type(get(err, 'filePath')) == type('') && type(get(err, 'errors')) == type([]) let fname = get(err, 'filePath') for e in get(err, 'errors') if type(e) == type({}) try let line = e['line'] let col = e['column'] let ecol = line == get(e, 'endLine') ? get(e, 'endColumn') : 0 let msg = e['message'] . ' [' . e['ruleName'] . ']' cal add(out, join([fname, line, col, ecol, msg], ':')) catch /\m^Vim\%((\a\+)\)\=:E716/ call syntastic#log#warn('checker javascript/lynt: unrecognized error item ' . string(e)) endtry else call syntastic#log#warn('checker javascript/lynt unrecognized error item ' . string(e)) endif endfor endif endfor else call syntastic#log#warn('checker javascript/lynt unrecognized error format (crashed checker?)') endif return out endfunction " }}}2 function! syntastic#preprocess#perl(errors) abort " {{{2 let out = [] for e in a:errors let parts = matchlist(e, '\v^(.*)\sat\s(.{-})\sline\s(\d+)(.*)$') if !empty(parts) call add(out, parts[2] . ':' . parts[3] . ':' . parts[1] . parts[4]) endif endfor return syntastic#util#unique(out) endfunction " }}}2 function! syntastic#preprocess#perl6(errors) abort " {{{2 if a:errors[0] ==# 'Syntax OK' return [] endif let errs = s:_decode_JSON(join(a:errors, '')) let out = [] if type(errs) == type({}) try for val in values(errs) let line = get(val, 'line', 0) let pos = get(val, 'pos', 0) if pos && has('byte_offset') let line_pos = byte2line(pos + 1) let column = line_pos > 0 ? pos - line2byte(line_pos) + 2 : 0 else let column = 0 endif call add(out, join([ \ get(val, 'filename', ''), \ line, \ column, \ get(val, 'message', '') ], ':')) endfor catch /\m^Vim\%((\a\+)\)\=:E716/ call syntastic#log#warn('checker perl6/perl6: unrecognized error item ' . string(val)) let out = [] endtry else call syntastic#log#warn('checker perl6/perl6: unrecognized error format') endif return out endfunction " }}}2 function! syntastic#preprocess#prospector(errors) abort " {{{2 let errs = join(a:errors, '') if errs ==# '' return [] endif let json = s:_decode_JSON(errs) let out = [] if type(json) == type({}) && has_key(json, 'messages') if type(json['messages']) == type([]) for e in json['messages'] if type(e) == type({}) try if e['source'] ==# 'pylint' let e['location']['character'] += 1 endif let msg = \ e['location']['path'] . ':' . \ e['location']['line'] . ':' . \ e['location']['character'] . ': ' . \ e['code'] . ' ' . \ e['message'] . ' ' . \ '[' . e['source'] . ']' call add(out, msg) catch /\m^Vim\%((\a\+)\)\=:E716/ call syntastic#log#warn('checker python/prospector: unrecognized error item ' . string(e)) let out = [] break endtry else call syntastic#log#warn('checker python/prospector: unrecognized error item ' . string(e)) let out = [] break endif endfor else call syntastic#log#warn('checker python/prospector: unrecognized error format (crashed checker?)') endif else call syntastic#log#warn('checker python/prospector: unrecognized error format (crashed checker?)') endif return out endfunction " }}}2 function! syntastic#preprocess#rparse(errors) abort " {{{2 let errlist = copy(a:errors) " remove uninteresting lines and handle continuations let i = 0 while i < len(errlist) if i > 0 && errlist[i][:1] ==# ' ' && errlist[i] !~# '\m\s\+\^$' let errlist[i-1] .= errlist[i][1:] call remove(errlist, i) elseif errlist[i] !~# '\m^\(Lint:\|Lint checking:\|Error in\) ' call remove(errlist, i) else let i += 1 endif endwhile let out = [] let fname = '' for e in errlist if match(e, '\m^Lint: ') == 0 let parts = matchlist(e, '\m^Lint: \(.*\): found on lines \([0-9, ]\+\)\(+\(\d\+\) more\)\=') if len(parts) >= 3 for line in split(parts[2], '\m,\s*') call add(out, 'E:' . fname . ':' . line . ': ' . parts[1]) endfor endif if len(parts) >= 5 && parts[4] !=# '' call add(out, 'E:' . fname . ':0: ' . parts[1] . ' - ' . parts[4] . ' messages not shown') endif elseif match(e, '\m^Lint checking: ') == 0 let fname = matchstr(e, '\m^Lint checking: \zs.*') elseif match(e, '\m^Error in ') == 0 call add(out, substitute(e, '\m^Error in .\+ : .\+\ze:\d\+:\d\+: ', 'E:' . fname, '')) endif endfor return out endfunction " }}}2 function! syntastic#preprocess#remark_lint(errors) abort " {{{2 let out = [] let fname = expand('%', 1) for err in a:errors if err =~# '\m^\f\+$' let fname = err elseif err =~# '\v^\s+\d+:\d+\s+%(warning|error)\s.*remark-lint$' let parts = matchlist(err, '\v^\s+(\d+):(\d+)\s+([ew])\S+\s+(.{-})\s+(\S+)\s+remark-lint$') if len(parts) >6 let line = str2nr(parts[1]) let col = str2nr(parts[2]) let type = parts[3] let message = parts[4] . ' [' . parts[5] . ']' call add(out, join([fname, type, line, col, message], ':')) else call syntastic#log#warn('checker markdown/remark_lint: unrecognized error item ' . string(err)) endif elseif err =~# '\v^\s+\d+:\d+-\d+:\d+\s+%(warning|error)\s.*remark-lint$' let parts = matchlist(err, '\v^\s+(\d+):(\d+)-(\d+):(\d+)\s+([ew])\S+\s+(.{-})\s+(\S+)\s+remark-lint$') if len(parts) >8 let line1 = str2nr(parts[1]) let col1 = str2nr(parts[2]) let line2 = str2nr(parts[3]) let col2 = str2nr(parts[4]) - 1 let type = parts[5] let message = parts[6] . ' [' . parts[7] . ']' if line1 == line2 call add(out, join([fname, type, line1, col1, col2, message], ':')) else call add(out, join([fname, type, line1, col1, message], ':')) endif else call syntastic#log#warn('checker markdown/remark_lint: unrecognized error item ' . string(err)) endif endif endfor return out endfunction " }}}2 function! syntastic#preprocess#scss_lint(errors) abort " {{{2 let errs = join(a:errors, '') if errs ==# '' return [] endif let json = s:_decode_JSON(errs) let out = [] if type(json) == type({}) for fname in keys(json) if type(json[fname]) == type([]) for e in json[fname] try cal add(out, fname . ':' . \ e['severity'][0] . ':' . \ e['line'] . ':' . \ e['column'] . ':' . \ e['length'] . ':' . \ ( has_key(e, 'linter') ? e['linter'] . ': ' : '' ) . \ e['reason']) catch /\m^Vim\%((\a\+)\)\=:E716/ call syntastic#log#warn('checker scss/scss_lint: unrecognized error item ' . string(e)) let out = [] endtry endfor else call syntastic#log#warn('checker scss/scss_lint: unrecognized error format (crashed checker?)') endif endfor else call syntastic#log#warn('checker scss/scss_lint: unrecognized error format (crashed checker?)') endif return out endfunction " }}}2 function! syntastic#preprocess#stylelint(errors) abort " {{{2 let out = [] " CssSyntaxError: /path/to/file.css:2:11: Missed semicolon let parts = matchlist(a:errors[0], '\v^CssSyntaxError: (.{-1,}):(\d+):(\d+): (.+)') if len(parts) > 4 call add(out, 'E:' . join(parts[1:4], ':')) else let errs = s:_decode_JSON(join(a:errors, '')) let out = [] if type(errs) == type([]) && len(errs) == 1 && type(errs[0]) == type({}) && \ has_key(errs[0], 'source') && has_key(errs[0], 'warnings') && type(errs[0]['warnings']) == type([]) for e in errs[0]['warnings'] try let severity = type(e['severity']) == type(0) ? ['W', 'E'][e['severity']-1] : e['severity'][0] let msg = \ severity . ':' . \ errs[0]['source'] . ':' . \ e['line'] . ':' . \ e['column'] . ':' . \ e['text'] call add(out, msg) catch /\m^Vim\%((\a\+)\)\=:E716/ call syntastic#log#warn('checker css/stylelint: unrecognized error item ' . string(e)) let out = [] break endtry endfor else call syntastic#log#warn('checker css/stylelint: unrecognized error format (crashed checker?)') endif endif return out endfunction " }}}2 function! syntastic#preprocess#tern_lint(errors) abort " {{{2 let errs = join(a:errors, '') let json = s:_decode_JSON(errs) echomsg string(json) let out = [] if type(json) == type({}) && has_key(json, 'messages') && type(json['messages']) == type([]) for e in json['messages'] try let line_from = byte2line(e['from'] + 1) if line_from > 0 let line = line_from let column = e['from'] - line2byte(line_from) + 2 let line_to = byte2line(e['from'] + 1) let hl = line_to == line ? e['to'] - line2byte(line_to) + 1 : 0 else let line = 0 let column = 0 let hl = 0 endif if column < 0 let column = 0 endif if hl < 0 let hl = 0 endif call add(out, \ e['file'] . ':' . \ e['severity'][0] . ':' . \ line . ':' . \ column . ':' . \ hl . ':' . \ e['message']) catch /\m^Vim\%((\a\+)\)\=:E716/ call syntastic#log#warn('checker javascript/tern_lint: unrecognized error item ' . string(e)) let out = [] endtry endfor else call syntastic#log#warn('checker javascript/tern_lint: unrecognized error format (crashed checker?)') endif echomsg string(out) return out endfunction " }}}2 function! syntastic#preprocess#tslint(errors) abort " {{{2 return map(copy(a:errors), 'substitute(v:val, ''\v^((ERROR|WARNING): )?\zs(\([^)]+\))\s(.+)$'', ''\4 \3'', "")') endfunction " }}}2 function! syntastic#preprocess#validator(errors) abort " {{{2 let out = [] for e in a:errors let parts = matchlist(e, '\v^"([^"]+)"(.+)') if len(parts) >= 3 " URL decode, except leave alone any "+" let parts[1] = substitute(parts[1], '\m%\(\x\x\)', '\=nr2char("0x".submatch(1))', 'g') let parts[1] = substitute(parts[1], '\m\\"', '"', 'g') let parts[1] = substitute(parts[1], '\m\\\\', '\\', 'g') call add(out, '"' . parts[1] . '"' . parts[2]) endif endfor return out endfunction " }}}2 function! syntastic#preprocess#vint(errors) abort " {{{2 let errs = s:_decode_JSON(join(a:errors, '')) let out = [] if type(errs) == type([]) for e in errs if type(e) == type({}) try let msg = \ e['file_path'] . ':' . \ e['line_number'] . ':' . \ e['column_number'] . ':' . \ e['severity'][0] . ': ' . \ e['description'] . ' (' . \ e['policy_name'] . ')' call add(out, msg) catch /\m^Vim\%((\a\+)\)\=:E716/ call syntastic#log#warn('checker vim/vint: unrecognized error item ' . string(e)) let out = [] break endtry else call syntastic#log#warn('checker vim/vint: unrecognized error item ' . string(e)) let out = [] break endif endfor else call syntastic#log#warn('checker vim/vint: unrecognized error format (crashed checker?)') endif return out endfunction " }}}2 " }}}1 " Workarounds {{{1 " In errorformat, \ or % following %f make it depend on isfname. The default " setting of isfname is crafted to work with completion, rather than general " filename matching. The result for syntastic is that filenames containing " spaces (or a few other special characters) can't be matched. " " Fixing isfname to address this problem would depend on the set of legal " characters for filenames on the filesystem the project's files lives on. " Inferring the kind of filesystem a file lives on, in advance to parsing the " file's name, is an interesting problem (think f.i. a file loaded from a VFAT " partition, mounted on Linux). A problem syntastic is not prepared to solve. " " As a result, the functions below exist for the only reason to avoid using " things like %f\, in errorformat. " " References: " https://groups.google.com/forum/#!topic/vim_dev/pTKmZmouhio " https://vimhelp.appspot.com/quickfix.txt.html#error-file-format function! syntastic#preprocess#basex(errors) abort " {{{2 let out = [] let idx = 0 while idx < len(a:errors) let parts = matchlist(a:errors[idx], '\v^\[\S+\] Stopped at (.+), (\d+)/(\d+):') if len(parts) > 3 let err = parts[1] . ':' . parts[2] . ':' . parts[3] . ':' let parts = matchlist(a:errors[idx+1], '\v^\[(.)\D+(\d+)\] (.+)') if len(parts) > 3 let err .= (parts[1] ==? 'W' || parts[1] ==? 'E' ? parts[1] : 'E') . ':' . parts[2] . ':' . parts[3] call add(out, err) let idx +=1 endif elseif a:errors[idx] =~# '\m^\[' " unparseable errors call add(out, a:errors[idx]) endif let idx +=1 endwhile return out endfunction " }}}2 function! syntastic#preprocess#bro(errors) abort " {{{2 let out = [] for e in a:errors let parts = matchlist(e, '\v^%(fatal )?(error|warning) in (.{-1,}), line (\d+): (.+)') if len(parts) > 4 let parts[1] = parts[1][0] call add(out, join(parts[1:4], ':')) endif endfor return out endfunction " }}}2 function! syntastic#preprocess#coffeelint(errors) abort " {{{2 let out = [] for e in a:errors let parts = matchlist(e, '\v^(.{-1,}),(\d+)%(,\d*)?,(error|warn),(.+)') if len(parts) > 4 let parts[3] = parts[3][0] call add(out, join(parts[1:4], ':')) endif endfor return out endfunction " }}}2 function! syntastic#preprocess#mypy(errors) abort " {{{2 let out = [] for e in a:errors " column numbers let parts = matchlist(e, '\v^(.{-1,}):(\d+):(\d+): ([ew])%(rror|arning): (.+)') if len(parts) > 5 let parts[3] += 1 call add(out, join(parts[1:5], ':')) continue endif " no column numbers let parts = matchlist(e, '\v^(.{-1,}):(\d+): ([ew])%(rror|arning): (.+)') if len(parts) > 4 call add(out, join(parts[1:4], ':')) continue endif " obsolete format let parts = matchlist(e, '\v^(.{-1,}), line (\d+): (.+)') if len(parts) > 3 let parts[4] = parts[3] let parts[3] = 'e' call add(out, join(parts[1:4], ':')) endif endfor return out endfunction " }}}2 function! syntastic#preprocess#nix(errors) abort " {{{2 let out = [] for e in a:errors let parts = matchlist(e, '\v^(.{-1,}), at (.{-1,}):(\d+):(\d+)$') if len(parts) > 4 call add(out, join(parts[2:4], ':') . ':' . parts[1]) continue endif let parts = matchlist(e, '\v^(.{-1,}) at (.{-1,}), line (\d+):') if len(parts) > 3 call add(out, parts[2] . ':' . parts[3] . ':' . parts[1]) continue endif let parts = matchlist(e, '\v^error: (.{-1,}), in (.{-1,})$') if len(parts) > 2 call add(out, parts[2] . ':' . parts[1]) endif endfor return out endfunction " }}}2 " }}}1 " Private functions {{{1 " @vimlint(EVL102, 1, l:true) " @vimlint(EVL102, 1, l:false) " @vimlint(EVL102, 1, l:null) function! s:_decode_JSON(json) abort " {{{2 if a:json ==# '' return [] endif " The following is inspired by https://github.com/MarcWeber/vim-addon-manager and " http://stackoverflow.com/questions/17751186/iterating-over-a-string-in-vimscript-or-parse-a-json-file/19105763#19105763 " A hat tip to Marc Weber for this trick if substitute(a:json, '\v\"%(\\.|[^"\\])*\"|true|false|null|[+-]?\d+%(\.\d+%([Ee][+-]?\d+)?)?', '', 'g') !~# "[^,:{}[\\] \t]" " JSON artifacts let true = 1 let false = 0 let null = '' try let object = eval(a:json) catch " malformed JSON let object = '' endtry else let object = '' endif return object endfunction " }}}2 " @vimlint(EVL102, 0, l:true) " @vimlint(EVL102, 0, l:false) " @vimlint(EVL102, 0, l:null) " }}}1 let &cpo = s:save_cpo unlet s:save_cpo " vim: set sw=4 sts=4 et fdm=marker: syntastic-3.10.0/autoload/syntastic/util.vim000066400000000000000000000500541354507713100211510ustar00rootroot00000000000000if exists('g:loaded_syntastic_util_autoload') || !exists('g:loaded_syntastic_plugin') finish endif let g:loaded_syntastic_util_autoload = 1 let s:save_cpo = &cpo set cpo&vim " Public functions {{{1 function! syntastic#util#isRunningWindows() abort " {{{2 return has('win16') || has('win32') || has('win64') endfunction " }}}2 function! syntastic#util#DevNull() abort " {{{2 if syntastic#util#isRunningWindows() return 'NUL' endif return '/dev/null' endfunction " }}}2 " Get directory separator function! syntastic#util#Slash() abort " {{{2 return (!exists('+shellslash') || &shellslash) ? '/' : '\' endfunction " }}}2 function! syntastic#util#CygwinPath(path) abort " {{{2 return substitute(syntastic#util#system('cygpath -m ' . syntastic#util#shescape(a:path)), "\n", '', 'g') endfunction " }}}2 function! syntastic#util#system(command) abort " {{{2 let old_shell = &shell let old_lc_messages = $LC_MESSAGES let old_lc_all = $LC_ALL let &shell = syntastic#util#var('shell') let $LC_MESSAGES = 'C' let $LC_ALL = '' let crashed = 0 let cmd_start = reltime() try let out = system(a:command) catch let crashed = 1 call syntastic#log#error('exception running system(' . string(a:command) . '): ' . v:exception) if syntastic#util#isRunningWindows() call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, '$TMP = ' . string($TMP) . ', $TEMP = ' . string($TEMP)) else call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, '$TERM = ' . string($TERM)) call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, '$TMPDIR = ' . string($TMPDIR)) endif call syntastic#log#debug(g:_SYNTASTIC_DEBUG_TRACE, '$PATH = ' . string($PATH)) call syntastic#log#debug(g:_SYNTASTIC_DEBUG_TRACE, 'getcwd() = ' . string(getcwd())) call syntastic#log#debugShowOptions(g:_SYNTASTIC_DEBUG_TRACE, g:_SYNTASTIC_SHELL_OPTIONS) let out = '' endtry let cmd_time = split(reltimestr(reltime(cmd_start)))[0] let $LC_ALL = old_lc_all let $LC_MESSAGES = old_lc_messages let &shell = old_shell if !crashed && exists('g:_SYNTASTIC_DEBUG_TRACE') call syntastic#log#debug(g:_SYNTASTIC_DEBUG_TRACE, 'system: command run in ' . cmd_time . 's') endif return out endfunction " }}}2 " Create a temporary directory function! syntastic#util#tmpdir() abort " {{{2 let tempdir = '' if (has('unix') || has('mac')) && executable('mktemp') && !has('win32unix') " TODO: option "-t" to mktemp(1) is not portable let tmp = $TMPDIR !=# '' ? $TMPDIR : $TMP !=# '' ? $TMP : '/tmp' let out = split(syntastic#util#system('mktemp -q -d ' . tmp . '/vim-syntastic-' . s:_fuzz() . '-XXXXXXXX'), "\n") if v:shell_error == 0 && len(out) == 1 let tempdir = out[0] endif endif if tempdir ==# '' if has('win32') || has('win64') let tempdir = $TEMP . syntastic#util#Slash() . 'vim-syntastic-' . s:_fuzz() elseif has('win32unix') let tempdir = syntastic#util#CygwinPath('/tmp/vim-syntastic-' . s:_fuzz()) elseif $TMPDIR !=# '' let tempdir = $TMPDIR . '/vim-syntastic-' . s:_fuzz() else let tempdir = '/tmp/vim-syntastic-' . s:_fuzz() endif try call mkdir(tempdir, 'p', 0700) catch /\m^Vim\%((\a\+)\)\=:E739/ call syntastic#log#error(v:exception) let tempdir = '.' endtry endif return tempdir endfunction " }}}2 " Recursively remove a directory function! syntastic#util#rmrf(what) abort " {{{2 " try to make sure we don't delete directories we didn't create if a:what !~? 'vim-syntastic-' return endif if getftype(a:what) ==# 'dir' call s:_delete(a:what, 'rf') else silent! call delete(a:what) endif endfunction " }}}2 function! syntastic#util#getbufvar(buf, name, ...) abort " {{{2 return a:0 ? s:_getbufvar(a:buf, a:name, a:1) : getbufvar(a:buf, a:name) endfunction " }}}2 " Search the first 5 lines of the file for a magic number and return a map " containing the args and the executable " " e.g. " " #!/usr/bin/perl -f -bar " " returns " " {'exe': '/usr/bin/perl', 'args': ['-f', '-bar']} function! syntastic#util#parseShebang(buf) abort " {{{2 for lnum in range(1, 5) let line = get(getbufline(a:buf, lnum), 0, '') if line =~# '^#!' let line = substitute(line, '\v^#!\s*(\S+/env(\s+-\S+)*\s+)?', '', '') let exe = matchstr(line, '\m^\S*\ze') let args = split(matchstr(line, '\m^\S*\zs.*')) return { 'exe': exe, 'args': args } endif endfor return { 'exe': '', 'args': [] } endfunction " }}}2 " Get the value of a Vim variable. Allow buffer variables to override global ones. function! syntastic#util#bufRawVar(buf, name, ...) abort " {{{2 return s:_getbufvar(a:buf, a:name, get(g:, a:name, a:0 ? a:1 : '')) endfunction "}}}2 " Get the value of a syntastic variable. Allow buffer variables to override global ones. function! syntastic#util#bufVar(buf, name, ...) abort " {{{2 return call('syntastic#util#bufRawVar', [a:buf, 'syntastic_' . a:name] + a:000) endfunction "}}}2 " Get the value of a Vim variable. Allow local variables to override global ones. function! syntastic#util#rawVar(name, ...) abort " {{{2 return get(b:, a:name, get(g:, a:name, a:0 ? a:1 : '')) endfunction " }}}2 " Get the value of a syntastic variable. Allow local variables to override global ones. function! syntastic#util#var(name, ...) abort " {{{2 return call('syntastic#util#rawVar', ['syntastic_' . a:name] + a:000) endfunction " }}}2 " Parse a version string. Return an array of version components. function! syntastic#util#parseVersion(version, ...) abort " {{{2 return map(split(matchstr( a:version, a:0 ? a:1 : '\v^\D*\zs\d+(\.\d+)+\ze' ), '\m\.'), 'str2nr(v:val)') endfunction " }}}2 " Verify that the 'installed' version is at least the 'required' version. " " 'installed' and 'required' must be arrays. If they have different lengths, " the "missing" elements will be assumed to be 0 for the purposes of checking. " " See http://semver.org for info about version numbers. function! syntastic#util#versionIsAtLeast(installed, required) abort " {{{2 return syntastic#util#compareLexi(a:installed, a:required) >= 0 endfunction " }}}2 " Almost lexicographic comparison of two lists of integers. :) If lists " have different lengths, the "missing" elements are assumed to be 0. function! syntastic#util#compareLexi(a, b) abort " {{{2 for idx in range(max([len(a:a), len(a:b)])) let a_element = str2nr(get(a:a, idx, 0)) let b_element = str2nr(get(a:b, idx, 0)) if a_element != b_element return a_element > b_element ? 1 : -1 endif endfor " still here, thus everything matched return 0 endfunction " }}}2 function! syntastic#util#screenWidth(str, tabstop) abort " {{{2 let chunks = split(a:str, "\t", 1) let width = s:_width(chunks[-1]) for c in chunks[:-2] let cwidth = s:_width(c) let width += cwidth + a:tabstop - cwidth % a:tabstop endfor return width endfunction " }}}2 " Print as much of a:msg as possible without "Press Enter" prompt appearing function! syntastic#util#wideMsg(msg) abort " {{{2 let old_ruler = &ruler let old_showcmd = &showcmd "This is here because it is possible for some error messages to "begin with \n which will cause a "press enter" prompt. let msg = substitute(a:msg, "\n", '', 'g') "convert tabs to spaces so that the tabs count towards the window "width as the proper amount of characters let chunks = split(msg, "\t", 1) let msg = join(map(chunks[:-2], 'v:val . repeat(" ", &tabstop - s:_width(v:val) % &tabstop)'), '') . chunks[-1] let msg = strpart(msg, 0, &columns - 1) set noruler noshowcmd call syntastic#util#redraw(0) echo msg let &ruler = old_ruler let &showcmd = old_showcmd endfunction " }}}2 " Check whether a buffer is loaded, listed, and not hidden function! syntastic#util#bufIsActive(buffer) abort " {{{2 " convert to number, or hell breaks loose let buf = str2nr(a:buffer) if !bufloaded(buf) || !buflisted(buf) return 0 endif " get rid of hidden buffers for tab in range(1, tabpagenr('$')) if index(tabpagebuflist(tab), buf) >= 0 return 1 endif endfor return 0 endfunction " }}}2 " Start in directory a:where and walk up the parent folders until it finds a " file named a:what; return path to that file function! syntastic#util#findFileInParent(what, where) abort " {{{2 let old_suffixesadd = &suffixesadd let &suffixesadd = '' let file = findfile(a:what, escape(a:where, ' ,') . ';') let &suffixesadd = old_suffixesadd return file endfunction " }}}2 " Start in directory a:where and walk up the parent folders until it finds a " file matching a:what; return path to that file function! syntastic#util#findGlobInParent(what, where) abort " {{{2 let here = fnamemodify(a:where, ':p') let root = syntastic#util#Slash() if syntastic#util#isRunningWindows() && here[1] ==# ':' " The drive letter is an ever-green source of fun. That's because " we don't care about running syntastic on Amiga these days. ;) let root = fnamemodify(root, ':p') let root = here[0] . root[1:] endif let old = '' while here !=# '' try " Vim 7.4.279 and later let p = globpath(here, a:what, 1, 1) catch /\m^Vim\%((\a\+)\)\=:E118/ let p = split(globpath(here, a:what, 1), "\n") endtry if !empty(p) return fnamemodify(p[0], ':p') elseif here ==? root || here ==? old break endif let old = here " we use ':h:h' rather than ':h' since ':p' adds a trailing '/' " if 'here' is a directory let here = fnamemodify(here, ':p:h:h') endwhile return '' endfunction " }}}2 " Returns the buffer number of a filename " @vimlint(EVL104, 1, l:old_shellslash) function! syntastic#util#fname2buf(fname) abort " {{{2 if exists('+shellslash') " bufnr() can't cope with backslashes let old_shellslash = &shellslash let &shellslash = 1 endif " this is a best-effort attempt to escape file patterns (cf. :h file-pattern) " XXX it fails for filenames containing something like \{2,3} let buf = -1 for md in [':~:.', ':~', ':p'] try " Older versions of Vim can throw E94 here let buf = bufnr('^' . escape(fnamemodify(a:fname, md), '\*?,{}[') . '$') catch " catch everything endtry if buf != -1 break endif endfor if buf == -1 " XXX definitely wrong, but hope is the last thing to die :) let buf = bufnr(fnamemodify(a:fname, ':p')) endif if exists('+shellslash') let &shellslash = old_shellslash endif return buf endfunction " }}}2 " @vimlint(EVL104, 0, l:old_shellslash) " Returns unique elements in a list function! syntastic#util#unique(list) abort " {{{2 let seen = {} let uniques = [] for e in a:list let k = string(e) if !has_key(seen, k) let seen[k] = 1 call add(uniques, e) endif endfor return uniques endfunction " }}}2 " A less noisy shellescape() function! syntastic#util#shescape(string) abort " {{{2 return a:string =~# '\m^[A-Za-z0-9_/.-]\+$' ? a:string : shellescape(a:string) endfunction " }}}2 " A less noisy shellescape(expand()) function! syntastic#util#shexpand(string, ...) abort " {{{2 return syntastic#util#shescape(a:0 ? expand(a:string, a:1) : expand(a:string, 1)) endfunction " }}}2 " Escape arguments function! syntastic#util#argsescape(opt) abort " {{{2 if type(a:opt) == type('') && a:opt !=# '' return [a:opt] elseif type(a:opt) == type([]) return map(copy(a:opt), 'syntastic#util#shescape(v:val)') endif return [] endfunction " }}}2 " Decode XML entities function! syntastic#util#decodeXMLEntities(string) abort " {{{2 let str = a:string let str = substitute(str, '\m<', '<', 'g') let str = substitute(str, '\m>', '>', 'g') let str = substitute(str, '\m"', '"', 'g') let str = substitute(str, '\m'', "'", 'g') let str = substitute(str, '\m&', '\&', 'g') return str endfunction " }}}2 function! syntastic#util#redraw(full) abort " {{{2 if a:full redraw! else redraw endif endfunction " }}}2 function! syntastic#util#dictFilter(errors, filter) abort " {{{2 let rules = s:_translateFilter(a:filter) " call syntastic#log#debug(g:_SYNTASTIC_DEBUG_TRACE, "applying filter:", rules) try call filter(a:errors, rules) catch /\m^Vim\%((\a\+)\)\=:E/ let msg = matchstr(v:exception, '\m^Vim\%((\a\+)\)\=:\zs.*') call syntastic#log#error('quiet_messages: ' . msg) endtry endfunction " }}}2 " Return a [seconds, fractions] list of strings, representing the " (hopefully high resolution) time since program start function! syntastic#util#stamp() abort " {{{2 return split( split(reltimestr(reltime(g:_SYNTASTIC_START)))[0], '\.' ) endfunction " }}}2 function! syntastic#util#setLastTick(buf) abort " {{{2 call setbufvar(a:buf, 'syntastic_lasttick', getbufvar(a:buf, 'changedtick')) endfunction " }}}2 " Add unique IDs to windows function! syntastic#util#setWids() abort " {{{2 for tab in range(1, tabpagenr('$')) for win in range(1, tabpagewinnr(tab, '$')) if gettabwinvar(tab, win, 'syntastic_wid') ==# '' call settabwinvar(tab, win, 'syntastic_wid', s:_wid_base . s:_wid_pool) let s:_wid_pool += 1 endif endfor endfor endfunction " }}}2 function! syntastic#util#str2float(val) abort " {{{2 return s:_str2float(a:val) endfunction " }}}2 function! syntastic#util#float2str(val) abort " {{{2 return s:_float2str(a:val) endfunction " }}}2 " Crude printf()-like width formatter. Handles wide characters. function! syntastic#util#wformat(format, str) abort " {{{2 if a:format ==# '' return a:str endif echomsg string(a:format) . ', ' . string(a:str) let specs = matchlist(a:format, '\v^(-?)(0?)(%([1-9]\d*))?%(\.(\d+))?$') if len(specs) < 5 return a:str endif let flushleft = specs[1] ==# '-' let lpad = specs[2] ==# '0' ? '0' : ' ' let minlen = str2nr(specs[3]) let maxlen = str2nr(specs[4]) let out = substitute(a:str, "\t", ' ', 'g') if maxlen && s:_width(out) > maxlen let chars = filter(split(out, '\zs\ze', 1), 'v:val !=# ""') let out = '' if flushleft for c in chars if s:_width(out . c) < maxlen let out .= c else let out .= &encoding ==# 'utf-8' && &termencoding ==# 'utf-8' ? "\u2026" : '>' break endif endfor else call reverse(chars) for c in chars if s:_width(c . out) < maxlen let out = c . out else let out = (&encoding ==# 'utf-8' && &termencoding ==# 'utf-8' ? "\u2026" : '<') . out break endif endfor endif endif if minlen && s:_width(out) < minlen if flushleft let out .= repeat(' ', minlen - s:_width(out)) else let out = repeat(lpad, minlen - s:_width(out)) . out endif endif return out endfunction " }}}2 " }}}1 " Private functions {{{1 function! s:_translateFilter(filters) abort " {{{2 let conditions = [] for k in keys(a:filters) if type(a:filters[k]) == type([]) call extend(conditions, map(copy(a:filters[k]), 's:_translateElement(k, v:val)')) else call add(conditions, s:_translateElement(k, a:filters[k])) endif endfor if conditions == [] let conditions = ['1'] endif return len(conditions) == 1 ? conditions[0] : join(map(conditions, '"(" . v:val . ")"'), ' && ') endfunction " }}}2 function! s:_translateElement(key, term) abort " {{{2 let fkey = a:key if fkey[0] ==# '!' let fkey = fkey[1:] let not = 1 else let not = 0 endif if fkey ==? 'level' let op = not ? ' ==? ' : ' !=? ' let ret = 'v:val["type"]' . op . string(a:term[0]) elseif fkey ==? 'type' if a:term ==? 'style' let op = not ? ' ==? ' : ' !=? ' let ret = 'get(v:val, "subtype", "")' . op . '"style"' else let op = not ? '!' : '' let ret = op . 'has_key(v:val, "subtype")' endif elseif fkey ==? 'regex' let op = not ? ' =~? ' : ' !~? ' let ret = 'v:val["text"]' . op . string(a:term) elseif fkey ==? 'file' || fkey[:4] ==? 'file:' let op = not ? ' =~# ' : ' !~# ' let ret = 'bufname(str2nr(v:val["bufnr"]))' let mod = fkey[4:] if mod !=# '' let ret = 'fnamemodify(' . ret . ', ' . string(mod) . ')' endif let ret .= op . string(a:term) else call syntastic#log#warn('quiet_messages: ignoring invalid key ' . strtrans(string(fkey))) let ret = '1' endif return ret endfunction " }}}2 " strwidth() was added in Vim 7.3; if it doesn't exist, we use strlen() " and hope for the best :) let s:_width = function(exists('*strwidth') ? 'strwidth' : 'strlen') lockvar s:_width " @vimlint(EVL103, 1, a:flags) function! s:_delete_dumb(what, flags) abort " {{{2 if !exists('s:rmrf') let s:rmrf = \ has('unix') || has('mac') ? 'rm -rf' : \ has('win32') || has('win64') ? 'rmdir /S /Q' : \ has('win16') || has('win95') || has('dos16') || has('dos32') ? 'deltree /Y' : '' endif if s:rmrf !=# '' silent! call syntastic#util#system(s:rmrf . ' ' . syntastic#util#shescape(a:what)) else call s:_rmrf(a:what) endif endfunction " }}}2 " @vimlint(EVL103, 0, a:flags) " delete(dir, 'rf') was added in Vim 7.4.1107, but it didn't become usable until 7.4.1128 let s:_delete = function(v:version > 704 || (v:version == 704 && has('patch1128')) ? 'delete' : 's:_delete_dumb') lockvar s:_delete function! s:_rmrf(what) abort " {{{2 if !exists('s:rmdir') let s:rmdir = syntastic#util#shescape(get(g:, 'netrw_localrmdir', 'rmdir')) endif if getftype(a:what) ==# 'dir' if filewritable(a:what) != 2 return endif try " Vim 7.4.279 and later let entries = globpath(a:what, '*', 1, 1) catch /\m^Vim\%((\a\+)\)\=:E118/ let entries = split(globpath(a:what, '*', 1), "\n") endtry for f in entries call s:_rmrf(f) endfor silent! call syntastic#util#system(s:rmdir . ' ' . syntastic#util#shescape(a:what)) else silent! call delete(a:what) endif endfunction " }}}2 let s:_str2float = function(exists('*str2float') ? 'str2float' : 'str2nr') lockvar s:_str2float function! s:_float2str_smart(val) abort " {{{2 return printf('%.1f', a:val) endfunction " }}}2 function! s:_float2str_dumb(val) abort " {{{2 return a:val endfunction " }}}2 let s:_float2str = function(has('float') ? 's:_float2str_smart' : 's:_float2str_dumb') lockvar s:_float2str function! s:_getbufvar_dumb(buf, name, ...) abort " {{{2 let ret = getbufvar(a:buf, a:name) if a:0 && type(ret) == type('') && ret ==# '' unlet! ret let ret = a:1 endif return ret endfunction "}}}2 let s:_getbufvar = function(v:version > 703 || (v:version == 703 && has('patch831')) ? 'getbufvar' : 's:_getbufvar_dumb') lockvar s:_getbufvar function! s:_fuzz_dumb() abort " {{{2 return 'tmp' endfunction " }}}2 let s:_fuzz = function(exists('*getpid') ? 'getpid' : 's:_fuzz_dumb') lockvar s:_fuzz " }}}1 let s:_wid_base = 'syntastic_' . s:_fuzz() . '_' . reltimestr(g:_SYNTASTIC_START) . '_' let s:_wid_pool = 0 let &cpo = s:save_cpo unlet s:save_cpo " vim: set sw=4 sts=4 et fdm=marker: syntastic-3.10.0/doc/000077500000000000000000000000001354507713100143675ustar00rootroot00000000000000syntastic-3.10.0/doc/syntastic-checkers.txt000066400000000000000000011033621354507713100207440ustar00rootroot00000000000000*syntastic-checkers.txt* Syntastic checkers *syntastic-checkers* ============================================================================== SYNTAX CHECKERS BY LANGUAGE *syntastic-checkers-lang* |syntastic| comes with checkers for the following languages: ACPI Source Language.....................|syntastic-checkers-asl| ActionScript.............................|syntastic-checkers-actionscript| Ada......................................|syntastic-checkers-ada| Ansible..................................|syntastic-checkers-ansible| API Blueprint............................|syntastic-checkers-apiblueprint| AppleScript..............................|syntastic-checkers-applescript| AsciiDoc.................................|syntastic-checkers-asciidoc| Assembly Languages.......................|syntastic-checkers-asm| BEMHTML..................................|syntastic-checkers-bemhtml| Bro......................................|syntastic-checkers-bro| C........................................|syntastic-checkers-c| C#.......................................|syntastic-checkers-cs| C++......................................|syntastic-checkers-cpp| Cabal....................................|syntastic-checkers-cabal| Chef.....................................|syntastic-checkers-chef| CMake....................................|syntastic-checkers-cmake| COBOL....................................|syntastic-checkers-cobol| Coco.....................................|syntastic-checkers-co| CoffeeScript.............................|syntastic-checkers-coffee| Coq......................................|syntastic-checkers-coq| CSS......................................|syntastic-checkers-css| Cucumber.................................|syntastic-checkers-cucumber| CUDA.....................................|syntastic-checkers-cuda| D........................................|syntastic-checkers-d| Dart.....................................|syntastic-checkers-dart| DocBook..................................|syntastic-checkers-docbk| Dockerfile...............................|syntastic-checkers-dockerfile| Dust.....................................|syntastic-checkers-dustjs| Elixir...................................|syntastic-checkers-elixir| Erlang...................................|syntastic-checkers-erlang| eRuby....................................|syntastic-checkers-eruby| Fortran..................................|syntastic-checkers-fortran| Gentoo Metadata..........................|syntastic-checkers-gentoo| Gettext PO...............................|syntastic-checkers-po| GLSL.....................................|syntastic-checkers-glsl| Go.......................................|syntastic-checkers-go| Haml.....................................|syntastic-checkers-haml| Handlebars...............................|syntastic-checkers-handlebars| Haskell..................................|syntastic-checkers-haskell| Haxe.....................................|syntastic-checkers-haxe| HSS......................................|syntastic-checkers-hss| HTML.....................................|syntastic-checkers-html| Java.....................................|syntastic-checkers-java| JavaScript...............................|syntastic-checkers-javascript| JSON.....................................|syntastic-checkers-json| Julia....................................|syntastic-checkers-julia| LESS.....................................|syntastic-checkers-less| Lex......................................|syntastic-checkers-lex| Limbo....................................|syntastic-checkers-limbo| LISP.....................................|syntastic-checkers-lisp| LLVM.....................................|syntastic-checkers-llvm| Lua......................................|syntastic-checkers-lua| Markdown.................................|syntastic-checkers-markdown| MATLAB...................................|syntastic-checkers-matlab| Mercury..................................|syntastic-checkers-mercury| NASM.....................................|syntastic-checkers-nasm| Nix......................................|syntastic-checkers-nix| nroff....................................|syntastic-checkers-nroff| Objective-C..............................|syntastic-checkers-objc| Objective-C++............................|syntastic-checkers-objcpp| OCaml....................................|syntastic-checkers-ocaml| Perl.....................................|syntastic-checkers-perl| Perl 6...................................|syntastic-checkers-perl6| PHP......................................|syntastic-checkers-php| POD......................................|syntastic-checkers-pod| Pug (formerly Jade)......................|syntastic-checkers-pug| Puppet...................................|syntastic-checkers-puppet| Python...................................|syntastic-checkers-python| QML......................................|syntastic-checkers-qml| R........................................|syntastic-checkers-r| R Markdown...............................|syntastic-checkers-rmd| Racket...................................|syntastic-checkers-racket| Relax NG.................................|syntastic-checkers-rnc| reStructuredText.........................|syntastic-checkers-rst| RPM spec.................................|syntastic-checkers-spec| Ruby.....................................|syntastic-checkers-ruby| SASS.....................................|syntastic-checkers-sass| Scala....................................|syntastic-checkers-scala| SCSS.....................................|syntastic-checkers-scss| Sh.......................................|syntastic-checkers-sh| Slim.....................................|syntastic-checkers-slim| SML......................................|syntastic-checkers-sml| Solidity.................................|syntastic-checkers-solidity| SQL......................................|syntastic-checkers-sql| Stylus...................................|syntastic-checkers-stylus| SVG......................................|syntastic-checkers-svg| Tcl......................................|syntastic-checkers-tcl| TeX......................................|syntastic-checkers-tex| Texinfo..................................|syntastic-checkers-texinfo| Text.....................................|syntastic-checkers-text| Turtle...................................|syntastic-checkers-turtle| TriG.....................................|syntastic-checkers-trig| Twig.....................................|syntastic-checkers-twig| TypeScript...............................|syntastic-checkers-typescript| Vala.....................................|syntastic-checkers-vala| Verilog..................................|syntastic-checkers-verilog| VHDL.....................................|syntastic-checkers-vhdl| Vim help.................................|syntastic-checkers-help| VimL.....................................|syntastic-checkers-vim| Vue.js...................................|syntastic-checkers-vue| xHTML....................................|syntastic-checkers-xhtml| XML......................................|syntastic-checkers-xml| XQuery...................................|syntastic-checkers-xquery| XSLT.....................................|syntastic-checkers-xslt| YACC.....................................|syntastic-checkers-yacc| YAML.....................................|syntastic-checkers-yaml| YANG.....................................|syntastic-checkers-yang| YARA.....................................|syntastic-checkers-yara| Z80......................................|syntastic-checkers-z80| Zope Page Templates......................|syntastic-checkers-zpt| Zsh......................................|syntastic-checkers-zsh| Third-party checkers are available for additional languages. ============================================================================== SYNTAX CHECKERS FOR ACPI SOURCE LANGUAGE *syntastic-checkers-asl* The following checkers are available for the ACPI Source Language (filetype "asl"): 1. iasl.....................|syntastic-asl-iasl| ------------------------------------------------------------------------------ 1. iasl *syntastic-asl-iasl* Name: iasl Maintainer: Peter Wu "iasl" is a compiler/decompiler for ACPI Source Language (ASL) and ACPI Machine Language (AML). See the project's page for details: https://acpica.org/ Checker options~ This checker is initialised using the "makeprgBuild()" function and thus it accepts the standard options described at |syntastic-config-makeprg|. Note~ You probably also need a plugin to set |filetype| for ASL files, such as "vim-acpi-asl": https://github.com/martinlroth/vim-acpi-asl ============================================================================== SYNTAX CHECKERS FOR ACTIONSCRIPT *syntastic-checkers-actionscript* The following checkers are available for ActionScript (filetype "actionscript"): 1. mxmlc....................|syntastic-actionscript-mxmlc| ------------------------------------------------------------------------------ 1. mxmlc *syntastic-actionscript-mxmlc* Name: mxmlc Maintainer: Andy Earnshaw "mxmlc" is a compiler for ActionScript. See Apache Flex for details: http://flex.apache.org/ Checker options~ This checker is initialised using the "makeprgBuild()" function and thus it accepts the standard options described at |syntastic-config-makeprg|. ============================================================================== SYNTAX CHECKERS FOR ADA *syntastic-checkers-ada* The following checkers are available for Ada (filetype "ada"): 1. GCC......................|syntastic-ada-gcc| ------------------------------------------------------------------------------ 1. GCC *syntastic-ada-gcc* Name: gcc Maintainer: Alfredo Di Napoli Checker options~ *'g:syntastic_ada_compiler'* Type: string Default: "gcc" Compiler executable. *'g:syntastic_ada_errorformat'* Type: string Default: unset Override for the default |'errorformat'|. *'g:syntastic_ada_remove_include_errors'* Type: boolean Default: 0 By default, errors in files included from the file being checked are shown. Set this variable to 1 to remove messages about errors in included files. Please note that this means syntastic will silently abort checks if there are fatal errors in one of the included files. *'g:syntastic_ada_compiler_options'* Type: string Default: unset Compilation flags (such as defines or include directories) to be passed to the linter. *'g:syntastic_ada_config_file'* Type: string Default: unset File containing additional compilation flags to be passed to the linter, one option per line (cf. |syntastic-config-files|). *'g:syntastic_ada_include_dirs'* Type: array of strings Default: [] Include directories to be passed to the linter, in addition to the above compilation flags. You can set it like this: > let g:syntastic_ada_include_dirs = ["includes", "headers"] < and the corresponding "-Iincludes -Iheaders" will be added to the compilation flags. *'b:syntastic_ada_cflags'* Type: string Default: unset Buffer-local variable. Additional compilation flags specific to the current buffer. *'g:syntastic_ada_check_header'* Type: boolean Default: 0 If the current file is a header (namely if its extension is "ads"), all checks are silently skipped. You can force syntastic to check header files by setting the above variable to 1. Note~ This checker doesn't call the "makeprgBuild()" function, and thus it ignores the usual 'g:syntastic_ada_gcc_