Dancer-1.3522000755001750001750 015135765170 12715 5ustar00davidpdavidp000000000000README100644001750001750 12726015135765170 13726 0ustar00davidpdavidp000000000000Dancer-1.3522NAME Dancer - lightweight yet powerful web application framework VERSION version 1.3522 SYNOPSIS #!/usr/bin/perl use Dancer; get '/hello/:name' => sub { return "Why, hello there " . param('name'); }; dance; The above is a basic but functional web app created with Dancer. If you want to see more examples and get up and running quickly, check out the Dancer::Introduction and the Dancer::Cookbook. For examples on deploying your Dancer applications, see Dancer::Deployment. DESCRIPTION Dancer is a web application framework designed to be as effortless as possible for the developer, taking care of the boring bits as easily as possible, yet staying out of your way and letting you get on with writing your code. Dancer aims to provide the simplest way for writing web applications, and offers the flexibility to scale between a very simple lightweight web service consisting of a few lines of code in a single file, all the way up to a more complex fully-fledged web application with session support, templates for views and layouts, etc. If you don't want to write CGI scripts by hand, and find Catalyst too big or cumbersome for your project, Dancer is what you need. Dancer has few pre-requisites, so your Dancer webapps will be easy to deploy. Dancer apps can be used with an embedded web server (great for easy testing), and can run under PSGI/Plack for easy deployment in a variety of webserver environments. MORE DOCUMENTATION This documentation describes all the exported symbols of Dancer. If you want a quick start guide to discover the framework, you should look at Dancer::Introduction, or Dancer::Tutorial to learn by example. If you want to have specific examples of code for real-life problems, see the Dancer::Cookbook. If you want to see configuration examples of different deployment solutions involving Dancer and Plack, see Dancer::Deployment. You can find out more about the many useful plugins available for Dancer in Dancer::Plugins. DANCER 2 This is the original version of Dancer, which is now in maintenance mode. This means that it will not receive significant new features, but will continue to receive bugfixes and security fixes. However, no "end of life" date has been set, and it is expected that this version of Dancer will continue to receive bugfixes and security fixes for quite some time yet. However, you should consider migrating to Dancer2 instead when you can, and are advised to use Dancer2 for newly-started apps. Dancer2 is mostly backwards compatible, but has been re-written from the ground up to be more maintainable and extensible, and is the future of Dancer. Dancer2::Manual::Migration covers the changes you should be aware of when migrating an existing Dancer 1 powered app to Dancer 2. EXPORTS By default, use Dancer exports all the functions below plus sets up your app. You can control the exporting through the normal Exporter mechanism. For example: # Just export the route controllers use Dancer qw(get post put patch del); # Export everything but pass to avoid clashing with Test::More use Test::More; use Dancer qw(!pass); Please note that the utf8 and strict pragmas are exported by this module. By default, the warnings pragma will also be exported, meaning your app/script will be running under use warnings. If you do not want this, set the global_warnings setting to a false value. There are also some special tags to control exports and behaviour. :moose This will export everything except functions which clash with Moose. Currently these are after and before. :syntax This tells Dancer to just export symbols and not set up your app. This is most useful for writing Dancer code outside of your main route handler. :tests This will export everything except functions which clash with commonly used testing modules. Currently these are pass. It can be combined with other export pragmas. For example, while testing... use Test::More; use Dancer qw(:syntax :tests); # Test::Most also exports "set" and "any" use Test::Most; use Dancer qw(:syntax :tests !set !any); # Alternatively, if you want to use Dancer's set and any... use Test::Most qw(!set !any); use Dancer qw(:syntax :tests); :script This will export all the keywords, load the configuration, and will not try to parse command-line arguments via Dancer::GetOpt. This is useful when you want to use your Dancer application from a script. use MyApp; use Dancer ':script'; MyApp::schema('DBSchema')->deploy(); Note that using :script will disable command-line parsing for all subsequent invocations of use Dancer (such that you don't have to use :script for each and every module to make sure the command-line arguments don't get stolen by Dancer). !keyword If you want to simply prevent Dancer from exporting specific keywords (perhaps you plan to implement them yourself in a different way, or you don't plan to use them and they clash with another module you're loading), you can simply exclude them: use Dancer qw(!session); The above would import all keywords as normal, with the exception of session. FUNCTIONS after Deprecated - see the after hook. any Defines a route for multiple HTTP methods at once: any ['get', 'post'] => '/myaction' => sub { # code }; Or even, a route handler that would match any HTTP methods: any '/myaction' => sub { # code }; before Deprecated - see the before hook. before_template Deprecated - see the before_template hook. cookies Accesses cookies values, it returns a HashRef of Dancer::Cookie objects: get '/some_action' => sub { my $cookie = cookies->{name}; return $cookie->value; }; In the case you have stored something other than a Scalar in your cookie: get '/some_action' => sub { my $cookie = cookies->{oauth}; my %values = $cookie->value; return ($values{token}, $values{token_secret}); }; cookie Accesses a cookie value (or sets it). Note that this method will eventually be preferred over set_cookie. cookie lang => "fr-FR"; # set a cookie and return its value cookie lang => "fr-FR", expires => "2 hours"; # extra cookie info cookie "lang" # return a cookie value If your cookie value is a key/value URI string, like token=ABC&user=foo cookie will only return the first part (token=ABC) if called in scalar context. Use list context to fetch them all: my @values = cookie "name"; Note that if the client has sent more than one cookie with the same value, the one returned will be the last one seen. This should only happen if you have set multiple cookies with the same name but different paths. So, don't do that. config Accesses the configuration of the application: get '/appname' => sub { return "This is " . config->{appname}; }; content_type Sets the content-type rendered, for the current route handler: get '/cat/:txtfile' => sub { content_type 'text/plain'; # here we can dump the contents of param('txtfile') }; You can use abbreviations for content types. For instance: get '/svg/:id' => sub { content_type 'svg'; # here we can dump the image with id param('id') }; Note that if you want to change the default content-type for every route, you have to change the content_type setting instead. dance Alias for the start keyword. dancer_version Returns the version of Dancer. If you need the major version, do something like: int(dancer_version); debug Logs a message of debug level: debug "This is a debug message"; See Dancer::Logger for details on how to configure where log messages go. dirname Returns the dirname of the path given: my $dir = dirname($some_path); engine Given a namespace, returns the current engine object my $template_engine = engine 'template'; my $html = $template_engine->apply_renderer(...); $template_engine->apply_layout($html); error Logs a message of error level: error "This is an error message"; See Dancer::Logger for details on how to configure where log messages go. false Constant that returns a false value (0). forward Runs an internal redirect of the current request to another request. This helps you avoid having to redirect the user using HTTP and set another request to your application. It effectively lets you chain routes together in a clean manner. get '/demo/articles/:article_id' => sub { # you'll have to implement this next sub yourself :) change_the_main_database_to_demo(); forward "/articles/" . params->{article_id}; }; In the above example, the users that reach /demo/articles/30 will actually reach /articles/30 but we've changed the database to demo before. This is pretty cool because it lets us retain our paths and offer a demo database by merely going to /demo/.... You'll notice that in the example we didn't indicate whether it was GET or POST. That is because forward chains the same type of route the user reached. If it was a GET, it will remain a GET (but if you do need to change the method, you can do so; read on below for details.) WARNING : using forward will not preserve session data set on the forwarding rule. WARNING : Issuing a forward immediately exits the current route, and perform the forward. Thus, any code after a forward is ignored, until the end of the route. e.g. get '/foo/:article_id' => sub { if ($condition) { forward "/articles/" . params->{article_id}; # The following code is never executed do_stuff(); } more_stuff(); }; So it's not necessary anymore to use return with forward. Note that forward doesn't parse GET arguments. So, you can't use something like: return forward '/home?authorized=1'; But forward supports an optional HashRef with parameters to be added to the actual parameters: return forward '/home', { authorized => 1 }; Finally, you can add some more options to the forward method, in a third argument, also as a HashRef. That option is currently only used to change the method of your request. Use with caution. return forward '/home', { auth => 1 }, { method => 'POST' }; from_dumper ($structure) Deserializes a Data::Dumper structure. from_json ($structure, \%options) Deserializes a JSON structure. Can receive optional arguments. Those arguments are valid JSON arguments to change the behaviour of the default JSON::from_json function. Compatibility notice: from_json changed in 1.3002 to take a hashref as options, instead of a hash. from_yaml ($structure) Deserializes a YAML structure. from_xml ($structure, %options) Deserializes a XML structure. Can receive optional arguments. These arguments are valid XML::Simple arguments to change the behaviour of the default XML::Simple::XMLin function. get Defines a route for HTTP GET requests to the given path: get '/' => sub { return "Hello world"; } Note that a route to match HEAD requests is automatically created as well. halt Sets a response object with the content given. When used as a return value from a filter, this breaks the execution flow and renders the response immediately: hook before sub { if ($some_condition) { halt("Unauthorized"); # This code is not executed : do_stuff(); } }; get '/' => sub { "hello there"; }; WARNING : Issuing a halt immediately exits the current route, and perform the halt. Thus, any code after a halt is ignored, until the end of the route. So it's not necessary anymore to use return with halt. headers Adds custom headers to responses: get '/send/headers', sub { headers 'X-Foo' => 'bar', X-Bar => 'foo'; } header adds a custom header to response: get '/send/header', sub { header 'x-my-header' => 'shazam!'; } Note that it will overwrite the old value of the header, if any. To avoid that, see "push_header". push_header Do the same as header, but allow for multiple headers with the same name. get '/send/header', sub { push_header 'x-my-header' => '1'; push_header 'x-my-header' => '2'; will result in two headers "x-my-header" in the response } hook Adds a hook at some position. For example : hook before_serializer => sub { my $response = shift; $response->content->{generated_at} = localtime(); }; There can be multiple hooks assigned to a given position, and each will be executed in order. Note that all hooks are always called, even if they are defined in a different package loaded via load_app. (For details on how to register new hooks from within plugins, see Dancer::Hook.) Supported before hooks (in order of execution): before_deserializer This hook receives no arguments. hook before_deserializer => sub { ... }; before_file_render This hook receives as argument the path of the file to render. hook before_file_render => sub { my $path = shift; ... }; before_error_init This hook receives as argument a Dancer::Error object. hook before_error_init => sub { my $error = shift; ... }; before_error_render This hook receives as argument a Dancer::Error object. hook before_error_render => sub { my $error = shift; }; before This hook receives one argument, the route being executed (a Dancer::Route object). hook before => sub { my $route_handler = shift; ... }; it is equivalent to the deprecated before sub { ... }; before_template_render This is an alias to 'before_template'. This hook receives as argument a HashRef containing the tokens that will be passed to the template. You can use it to add more tokens, or delete some specific token. hook before_template_render => sub { my $tokens = shift; delete $tokens->{user}; $tokens->{time} = localtime; }; is equivalent to hook before_template => sub { my $tokens = shift; delete $tokens->{user}; $tokens->{time} = localtime; }; before_layout_render This hook receives two arguments. The first one is a HashRef containing the tokens. The second is a ScalarRef representing the content of the template. hook before_layout_render => sub { my ($tokens, $html_ref) = @_; ... }; before_serializer This hook receives as argument a Dancer::Response object. hook before_serializer => sub { my $response = shift; $response->content->{start_time} = time(); }; Supported after hooks (in order of execution): after_deserializer This hook receives no arguments. hook after_deserializer => sub { ... }; after_file_render This hook receives as argument a Dancer::Response object. hook after_file_render => sub { my $response = shift; }; after_template_render This hook receives as argument a ScalarRef representing the content generated by the template. hook after_template_render => sub { my $html_ref = shift; }; after_layout_render This hook receives as argument a ScalarRef representing the content generated by the layout hook after_layout_render => sub { my $html_ref = shift; }; after This is an alias for after. This hook runs after a request has been processed, but before the response is sent. It receives a Dancer::Response object, which it can modify if it needs to make changes to the response which is about to be sent. hook after => sub { my $response = shift; }; This is equivalent to the deprecated after sub { my $response = shift; }; after_error_render This hook receives as argument a Dancer::Response object. hook after_error_render => sub { my $response = shift; }; on_handler_exception This hook is called when an exception has been caught, at the handler level, just before creating and rendering Dancer::Error. This hook receives as argument a Dancer::Exception object. hook on_handler_exception => sub { my $exception = shift; }; on_reset_state This hook is called when global state is reset to process a new request. It receives a boolean value that indicates whether the reset was called as part of a forwarded request. hook on_reset_state => sub { my $is_forward = shift; }; on_route_exception This hook is called when an exception has been caught, at the route level, just before rethrowing it higher. This hook receives the exception as argument. It can be a Dancer::Exception, or a string, or whatever was used to die. hook on_route_exception => sub { my $exception = shift; }; info Logs a message of info level: info "This is a info message"; See Dancer::Logger for details on how to configure where log messages go. layout This method is deprecated. Use set: set layout => 'user'; logger Deprecated. Use 'console'> to change current logger engine. load Loads one or more perl scripts in the current application's namespace. Syntactic sugar around Perl's require: load 'UserActions.pl', 'AdminActions.pl'; load_app Loads a Dancer package. This method sets the libdir to the current ./lib directory: # if we have lib/Webapp.pm, we can load it like: load_app 'Webapp'; # or with options load_app 'Forum', prefix => '/forum', settings => {foo => 'bar'}; Note that the package loaded using load_app must import Dancer with the :syntax option. To load multiple apps repeat load_app: load_app 'one'; load_app 'two'; The old way of loading multiple apps in one go (load_app 'one', 'two';) is deprecated. mime Shortcut to access the instance object of Dancer::MIME. You should read the Dancer::MIME documentation for full details, but the most commonly-used methods are summarized below: # set a new mime type mime->add_type( foo => 'text/foo' ); # set a mime type alias mime->add_alias( f => 'foo' ); # get mime type for an alias my $m = mime->for_name( 'f' ); # get mime type for a file (based on extension) my $m = mime->for_file( "foo.bar" ); # get current defined default mime type my $d = mime->default; # set the default mime type using config.yml # or using the set keyword set default_mime_type => 'text/plain'; params This method should be called from a route handler. It's an alias for the Dancer::Request params accessor. In list context it returns a list of key/value pair of all defined parameters. In scalar context it returns a hash reference instead. Check param below to access quickly to a single parameter value. param This method should be called from a route handler. This method is an accessor to the parameters hash table. post '/login' => sub { my $username = param "user"; my $password = param "pass"; # ... } param_array This method should be called from a route handler. Like param, but always returns the parameter value or values as a list. Returns the number of values in scalar context. # if request is '/tickets?tag=open&tag=closed&order=desc'... get '/tickets' => sub { my @tags = param_array 'tag'; # ( 'open', 'closed' ) my $tags = param 'tag'; # array ref my @order = param_array 'order'; # ( 'desc' ) my $order = param 'order'; # 'desc' }; pass This method should be called from a route handler. Tells Dancer to pass the processing of the request to the next matching route. WARNING : Issuing a pass immediately exits the current route, and performs the pass. Thus, any code after a pass is ignored until the end of the route. So it's not necessary any more to use return with pass. get '/some/route' => sub { if (...) { # we want to let the next matching route handler process this one pass(...); # This code will be ignored do_stuff(); } }; patch Defines a route for HTTP PATCH requests to the given URL: patch '/resource' => sub { ... }; (PATCH is a relatively new and not-yet-common HTTP verb, which is intended to work as a "partial-PUT", transferring just the changes; please see http://tools.ietf.org/html/rfc5789|RFC5789 for further details.) Please be aware that, if you run your app in standalone mode, PATCH requests will not reach your app unless you have a new version of HTTP::Server::Simple which accepts PATCH as a valid verb. The current version at time of writing, 0.44, does not. A pull request has been submitted to add this support, which you can find at: https://github.com/bestpractical/http-server-simple/pull/1 path Concatenates multiple paths together, without worrying about the underlying operating system: my $path = path(dirname($0), 'lib', 'File.pm'); It also normalizes (cleans) the path aesthetically. It does not verify the path exists. post Defines a route for HTTP POST requests to the given URL: post '/' => sub { return "Hello world"; } prefix Defines a prefix for each route handler, like this: prefix '/home'; From here, any route handler is defined to /home/*: get '/page1' => sub {}; # will match '/home/page1' You can unset the prefix value: prefix undef; get '/page1' => sub {}; will match /page1 For a safer alternative you can use lexical prefix like this: prefix '/home' => sub { ## Prefix is set to '/home' here get ...; get ...; }; ## prefix reset to the previous version here This makes it possible to nest prefixes: prefix '/home' => sub { ## some routes prefix '/private' => sub { ## here we are under /home/private... ## some more routes }; ## back to /home }; ## back to the root Notice: once you have a prefix set, do not add a caret to the regex: prefix '/foo'; get qr{^/bar} => sub { ... } # BAD BAD BAD get qr{/bar} => sub { ... } # Good! del Defines a route for HTTP DELETE requests to the given URL: del '/resource' => sub { ... }; options Defines a route for HTTP OPTIONS requests to the given URL: options '/resource' => sub { ... }; put Defines a route for HTTP PUT requests to the given URL: put '/resource' => sub { ... }; redirect Generates an HTTP redirect (302). You can either redirect to a completely different site or within the application: get '/twitter', sub { redirect 'http://twitter.com/me'; }; You can also force Dancer to return a specific 300-ish HTTP response code: get '/old/:resource', sub { redirect '/new/'.params->{resource}, 301; }; It is important to note that issuing a redirect by itself does not exit and redirect immediately. Redirection is deferred until after the current route or filter has been processed. To exit and redirect immediately, use the return function, e.g. get '/restricted', sub { return redirect '/login' if accessDenied(); return 'Welcome to the restricted section'; }; render_with_layout Allows a handler to provide plain HTML (or other content), but have it rendered within the layout still. This method is DEPRECATED, and will be removed soon. Instead, you should be using the engine keyword: get '/foo' => sub { # Do something which generates HTML directly (maybe using # HTML::Table::FromDatabase or something) my $content = ...; # get the template engine my $template_engine = engine 'template'; # apply the layout (not the renderer), and return the result $template_engine->apply_layout($content) }; It works very similarly to template in that you can pass tokens to be used in the layout, and/or options to control the way the layout is rendered. For instance, to use a custom layout: render_with_layout $content, {}, { layout => 'layoutname' }; request Returns a Dancer::Request object representing the current request. See the Dancer::Request documentation for the methods you can call, for example: request->referer; # value of the HTTP referer header request->remote_address; # user's IP address request->user_agent; # User-Agent header value send_error Returns an HTTP error. By default the HTTP code returned is 500: get '/photo/:id' => sub { if (...) { send_error("Not allowed", 403); } else { # return content } } WARNING : Issuing a send_error immediately exits the current route, and perform the send_error. Thus, any code after a send_error is ignored, until the end of the route. So it's not necessary anymore to use return with send_error. get '/some/route' => sub { if (...) { # we want to let the next matching route handler process this one send_error(..); # This code will be ignored do_stuff(); } }; send_file Lets the current route handler send a file to the client. Note that the path of the file must be relative to the public directory unless you use the system_path option (see below). get '/download/:file' => sub { send_file(params->{file}); } WARNING : Issuing a send_file immediately exits the current route, and performs the send_file. Thus, any code after a send_file is ignored until the end of the route. So it's not necessary any more to use return with send_file. get '/some/route' => sub { if (...) { # we want to let the next matching route handler process this one send_file(...); # This code will be ignored do_stuff(); } }; Send file supports streaming possibility using PSGI streaming. The server should support it but normal streaming is supported on most, if not all. get '/download/:file' => sub { send_file( params->{file}, streaming => 1 ); } You can control what happens using callbacks. First, around_content allows you to get the writer object and the chunk of content read, and then decide what to do with each chunk: get '/download/:file' => sub { send_file( params->{file}, streaming => 1, callbacks => { around_content => sub { my ( $writer, $chunk ) = @_; $writer->write("* $chunk"); }, }, ); } You can use around to all get all the content (whether a filehandle if it's a regular file or a full string if it's a scalar ref) and decide what to do with it: get '/download/:file' => sub { send_file( params->{file}, streaming => 1, callbacks => { around => sub { my ( $writer, $content ) = @_; # we know it's a text file, so we'll just stream # line by line while ( my $line = <$content> ) { $writer->write($line); } }, }, ); } Or you could use override to control the entire streaming callback request: get '/download/:file' => sub { send_file( params->{file}, streaming => 1, callbacks => { override => sub { my ( $respond, $response ) = @_; my $writer = $respond->( [ $newstatus, $newheaders ] ); $writer->write("some line"); }, }, ); } You can also set the number of bytes that will be read at a time (default being 42K bytes) using bytes: get '/download/:file' => sub { send_file( params->{file}, streaming => 1, bytes => 524288, # 512K ); }; The content-type will be set depending on the current MIME types definition (see mime if you want to define your own). If your filename does not have an extension, or you need to force a specific mime type, you can pass it to send_file as follows: send_file(params->{file}, content_type => 'image/png'); Also, you can use your aliases or file extension names on content_type, like this: send_file(params->{file}, content_type => 'png'); For files outside your public folder, you can use the system_path switch. Just bear in mind that its use needs caution as it can be dangerous. send_file('/etc/passwd', system_path => 1); If you have your data in a scalar variable, send_file can be useful as well. Pass a reference to that scalar, and send_file will behave as if there were a file with that contents: send_file( \$data, content_type => 'image/png' ); Note that Dancer is unable to guess the content type from the data contents. Therefore you might need to set the content_type properly. For this kind of usage an attribute named filename can be useful. It is used as the Content-Disposition header, to hint the browser about the filename it should use. send_file( \$data, content_type => 'image/png' filename => 'onion.png' ); set Defines a setting: set something => 'value'; You can set more than one value at once: set something => 'value', otherthing => 'othervalue'; setting Returns the value of a given setting: setting('something'); # 'value' set_cookie Creates or updates cookie values: get '/some_action' => sub { set_cookie name => 'value', expires => (time + 3600), domain => '.foo.com'; }; In the example above, only 'name' and 'value' are mandatory. You can also store more complex structure in your cookies: get '/some_auth' => sub { set_cookie oauth => { token => $twitter->request_token, token_secret => $twitter->secret_token, ... }; }; You can't store more complex structure than this. All keys in the HashRef should be Scalars; storing references will not work. See Dancer::Cookie for further options when creating your cookie. Note that this method will be eventually deprecated in favor of the new cookie method. session Provides access to all data stored in the user's session (if any). It can also be used as a setter to store data in the session: # getter example get '/user' => sub { if (session('user')) { return "Hello, ".session('user')->name; } }; # setter example post '/user/login' => sub { ... if ($logged_in) { session user => $user; } ... }; You may also need to clear a session: # destroy session get '/logout' => sub { ... session->destroy; ... }; If you need to fetch the session ID being used for any reason: my $id = session->id; In order to be able to use sessions, first you need to enable session support in one of the configuration files. A quick way to do it is to add session: "YAML" to config.yml. For more details, see Dancer::Session. splat Returns the list of captures made from a route handler with a route pattern which includes wildcards: get '/file/*.*' => sub { my ($file, $extension) = splat; ... }; There is also the extensive splat (A.K.A. "megasplat"), which allows extensive greedier matching, available using two asterisks. The additional path is broken down and returned as an ArrayRef: get '/entry/*/tags/**' => sub { my ( $entry_id, $tags ) = splat; my @tags = @{$tags}; }; This helps with chained actions: get '/team/*/**' => sub { my ($team) = splat; var team => $team; pass; }; prefix '/team/*'; get '/player/*' => sub { my ($player) = splat; # etc... }; get '/score' => sub { return score_for( vars->{'team'} ); }; start Starts the application or the standalone server (depending on the deployment choices). This keyword should be called at the very end of the script, once all routes are defined. At this point, Dancer takes over control. status Changes the status code provided by an action. By default, an action will produce an HTTP 200 OK status code, meaning everything is OK: get '/download/:file' => { if (! -f params->{file}) { status 'not_found'; return "File does not exist, unable to download"; } # serving the file... }; In that example Dancer will notice that the status has changed, and will render the response accordingly. The status keyword receives either a numeric status code or its name in lower case, with underscores as a separator for blanks. See the list in "HTTP CODES" in Dancer::HTTP. template Returns the response of processing the given template with the given parameters (and optional settings), wrapping it in the default or specified layout too, if layouts are in use. An example of a route handler which returns the result of using template to build a response with the current template engine: get '/' => sub { ... return template 'some_view', { token => 'value'}; }; Note that template simply returns the content, so when you use it in a route handler, if execution of the route handler should stop at that point, make sure you use 'return' to ensure your route handler returns the content. Since template just returns the result of rendering the template, you can also use it to perform other templating tasks, e.g. generating emails: post '/some/route' => sub { if (...) { email { to => 'someone@example.com', from => 'foo@example.com', subject => 'Hello there', msg => template('emails/foo', { name => params->{name} }), }; return template 'message_sent'; } else { return template 'error'; } }; Compatibility notice: template was changed in version 1.3090 to immediately interrupt execution of a route handler and return the content, as it's typically used at the end of a route handler to return content. However, this caused issues for some people who were using template to generate emails etc, rather than accessing the template engine directly, so this change has been reverted in 1.3091. The first parameter should be a template available in the views directory, the second one (optional) is a HashRef of tokens to interpolate, and the third (again optional) is a HashRef of options. For example, to disable the layout for a specific request: get '/' => sub { template 'index', {}, { layout => undef }; }; Or to request a specific layout, of course: get '/user' => sub { template 'user', {}, { layout => 'user' }; }; Some tokens are automatically added to your template (perl_version, dancer_version, settings, request, params, vars and, if you have sessions enabled, session). Check Dancer::Template::Abstract for further details. to_dumper ($structure) Serializes a structure with Data::Dumper. to_json ($structure, \%options) Serializes a structure to JSON. Can receive optional arguments. Thoses arguments are valid JSON arguments to change the behaviour of the default JSON::to_json function. Compatibility notice: to_json changed in 1.3002 to take a hashref as options, instead of a hash. to_yaml ($structure) Serializes a structure to YAML. to_xml ($structure, %options) Serializes a structure to XML. Can receive optional arguments. Thoses arguments are valid XML::Simple arguments to change the behaviour of the default XML::Simple::XMLout function. true Constant that returns a true value (1). upload Provides access to file uploads. Any uploaded file is accessible as a Dancer::Request::Upload object. You can access all parsed uploads via: post '/some/route' => sub { my $file = upload('file_input_foo'); # file is a Dancer::Request::Upload object }; If you named multiple inputs of type "file" with the same name, the upload keyword will return an Array of Dancer::Request::Upload objects: post '/some/route' => sub { my ($file1, $file2) = upload('files_input'); # $file1 and $file2 are Dancer::Request::Upload objects }; You can also access the raw HashRef of parsed uploads via the current request object: post '/some/route' => sub { my $all_uploads = request->uploads; # $all_uploads->{'file_input_foo'} is a Dancer::Request::Upload object # $all_uploads->{'files_input'} is an ArrayRef of Dancer::Request::Upload objects }; Note that you can also access the filename of the upload received via the params keyword: post '/some/route' => sub { # params->{'files_input'} is the filename of the file uploaded }; See Dancer::Request::Upload for details about the interface provided. uri_for Returns a fully-qualified URI for the given path: get '/' => sub { redirect uri_for('/path'); # can be something like: http://localhost:3000/path }; Querystring parameters can be provided by passing a hashref as a second param, and URL-encoding can be disabled via a third parameter: uri_for('/path', { foo => 'bar' }, 1); # would return e.g. http://localhost:3000/path?foo=bar captures Returns a reference to a copy of %+, if there are named captures in the route Regexp. Named captures are a feature of Perl 5.10, and are not supported in earlier versions: get qr{ / (? user | ticket | comment ) / (? delete | find ) / (? \d+ ) /?$ }x , sub { my $value_for = captures; "i don't want to $$value_for{action} the $$value_for{object} $$value_for{id} !" }; var Provides an accessor for variables shared between filters and route handlers. Given a key/value pair, it sets a variable: hook before sub { var foo => 42; }; Later, route handlers and other filters will be able to read that variable: get '/path' => sub { my $foo = var 'foo'; ... }; vars Returns the HashRef of all shared variables set during the filter/route chain with the var keyword: get '/path' => sub { if (vars->{foo} eq 42) { ... } }; warning Logs a warning message through the current logger engine: warning "This is a warning"; See Dancer::Logger for details on how to configure where log messages go. AUTHOR This module has been written by Alexis Sukrieh and others, see the AUTHORS file that comes with this distribution for details. SOURCE CODE The source code for this module is hosted on GitHub https://github.com/PerlDancer/Dancer. Feel free to fork the repository and submit pull requests! (See Dancer::Development for details on how to contribute). Also, why not watch the repo to keep up to date with the latest upcoming changes? GETTING HELP / CONTRIBUTING The Dancer development team can be found on #dancer on irc.perl.org: irc://irc.perl.org/dancer If you don't have an IRC client installed/configured, there is a simple web chat client at http://www.perldancer.org/irc for you. There is also a Dancer users mailing list available. Subscribe at: http://lists.preshweb.co.uk/mailman/listinfo/dancer-users If you'd like to contribute to the Dancer project, please see http://www.perldancer.org/contribute for all the ways you can help! DEPENDENCIES The following modules are mandatory (Dancer cannot run without them): HTTP::Server::Simple::PSGI HTTP::Tiny MIME::Types URI The following modules are optional: JSON : needed to use JSON serializer Plack : in order to use PSGI Template : in order to use TT for rendering views XML::Simple and XML:SAX or XML:Parser for XML serialization YAML : needed for configuration file support SEE ALSO Main Dancer web site: http://perldancer.org/. The concept behind this module comes from the Sinatra ruby project, see http://www.sinatrarb.com/ for details. AUTHOR Dancer Core Developers COPYRIGHT AND LICENSE This software is copyright (c) 2010 by Alexis Sukrieh. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. Changes100644001750001750 25327115135765170 14343 0ustar00davidpdavidp000000000000Dancer-1.3522Revision history for Dancer 1.3522 2026-01-26 22:27:39+00:00 Europe/London [ENHANCEMENTS] - Remove unnecessary import from test file (avoid test failures on newer Perls) - Add security policy document 1.3521 2023-02-05 [BUG FIXES] - Fix test failures in t/14_serializer/04_request_xml.t (GH #1239, cromedome, thanks to gregoa & Debian team) 1.3520 2023-01-01 Previous trial releases promoted to stable. [BUG FIXES] - Test failures with HTTP::Message >= 6.44 (GH #1237, thanks to gregoa & Debian team) [ENHANCEMENTS] - Allow send_error from before hooks (GH #1234) - Let `before_error_render` hooks modify token values (GH #1218) 1.3514_04 2022-06-29 22:38:57+01:00 Europe/London (TRIAL RELEASE) 1.3514_03 2020-10-06 22:22:51+01:00 Europe/London (TRIAL RELEASE) 1.3514_02 2020-10-02 21:39:34+01:00 Europe/London (TRIAL RELEASE) 1.3514 2020-06-29 17:38:54+01:00 Europe/London (TRIAL RELEASE) 1.3513 2020-01-29 21:00:41+00:00 Europe/London [BUG FIXES] - Fix test failures since YAML.pm 1.30 (GH #1208) - More test failures with proxy env var set (GH #1204) - Skip tests when HTTP::Message >= 6.44 (GH #1237) [ENHANCEMENTS] - Don't show whole web page differences in Dancer::Test's response_content_like() and response_content_unlike() 1.3512 2019-03-31 20:10:08+01:00 Europe/London Promoting previous trial release 1.3511 to stable. 1.3511 2019-03-29 11:16:08+00:00 Europe/London (TRIAL RELEASE) [BUG FIXES] - More session cookie handling fun - avoid causing test failures in dependencies in some cases (e.g. RT #128911 and others) [ENHANCEMENTS] - hold session in SharedData, to avoid reading the session contents every time anything is requested, could be a performance win 1.3510 2019-03-19 14:42:26+00:00 Europe/London Promoting previous trial release 1.3501 to stable. Fix #1204 - more proxy-related test failure fun 1.3501 2019-03-14 19:19:49+00:00 Europe/London (TRIAL RELEASE) [BUG FIXES] Fix "too late to set cookie" errors if you access a session within an after hook after using send_file(). 1.3500 2018-10-12 21:31:46+01:00 Europe/London Promoting previous trial releases to stable. 1.3403 2018-10-11 23:41:11+01:00 Europe/London (TRIAL RELEASE) [ENHANCEMENTS] - request->address now respects behind_proxy - if behind_proxy is set, then request->address looks at HTTP_X_FORWARDED_FOR, so you get the user's IP, not the proxy. (PR-1199, bigpresh) - restore ability to use load_settings_from_yaml() without passing YAML parser class (PR-1198, snakpak) - Fixing some spurious cpantesters test failures by subclassing HTTP::Tiny in our tests and disabling proxying for 127.0.0.1 - otherwise smokers with HTTP proxy env vars set fail tests (PR-1197, bigpresh) - Tidied POD for Tutorial (PR-1196, manwar) 1.3402 2018-10-10 11:42:07+01:00 Europe/London (TRIAL RELEASE) 1.3401 2018-10-01 12:49:53+01:00 Europe/London (TRIAL RELEASE) [ENHANCEMENTS] - Avoid test failures on perls without '.' in @INC - censor cookie_key in dumps (PR-1193, thefatphil) - spelling fixes in POD from Debian Perl Group, PR-1191 1.3400 2018-06-15 23:08:34+01:00 Europe/London Promoting previous trial releases to stable. 1.3205 2018-06-13 22:59:32+01:00 Europe/London (TRIAL RELEASE) [ENHANCEMENTS] - require MIME::Types 2.17, as 2.16 has some funny ideas, like responding to a ZIP file with 'application/vnd.easykaraoke.cdgdownload' - Fix YAML-related test failures if YAML::XS not installed (GH 1184, PR 1189, bigpresh) [BUG FIXES] - Avoid accidental route matches if a previous successful match had left %+ populated (GH 1187, PR 1188, bigpresh, reported by skington) 1.3204 2018-05-23 14:40:33+01:00 Europe/London (TRIAL RELEASE) [ENHANCEMENTS] - Try to use 127.0.0.11 for listen tests, fall back to 127.0.0.1 on systems that don't have 127/8, e.g. FreeBSD (GH 1183, PR 1185, bigpresh) 1.3203 2018-05-20 20:44:30+01:00 Europe/London (TRIAL RELEASE) [DOCUMENTATION] - Add environment var hint to cookbook (PR 1161, castaway) [ENHANCEMENTS] - Make it possible to switch out YAML for YAML::XS for config parsing and serialisation (there was already an attempt at this in place, and it was documented as posisble, but didn't work) (PR 1164, 1nickt) - New test method response_redirect_like (PR 1159, 1nickt) - New config option raw_request_body_in_ram, which controls whether the raw request body is available via request->body or not. See Issue #1140 for the problems the previous approach, of getting it from the temp file that HTTP::Body might (or might not) have written it to. - Validate session IDs read from client - GH #1172 - potential security risk if the session provider in use passes the session ID in a way where injection is possible. 1.3301 2016-02-16 [BUG FIXES] - Reverted session ID validation (PR-1155) as it breaks Dancer::Session::Cookie (bigpresh) 1.3300 2016-02-15 [BUG FIXES] - More temp directory handling fixes (Issue #1147) - Avoid request body truncation in hand-assembled requests in tests (PR 1148, skington) - Avoid tests failing when "localhost" doesn't resolve (PR 1142, gbarco) - Avoid test failures due to race condition in selecting a port to listen on by using 127.0.0.10 instead (more of a hacky workaround than a fix, but should help (bigpresh) - Fix YAML session handler under taint mode (chrisjrob) - Make request->body work again for URL-encoded POST requests - Issue 1140 reported by miyagawa (bigpresh) - Validate session IDs read from cookies before passing to session engine, to protect against any engine that might feed that value straight to a file path for security - Issue 1118 (bigpresh) [DOCUMENTATION] - Better doc for forward_for_address (PR 1146, Relequestual) [ENHANCEMENTS] - Let Dancer::Test::dancer_response() handle supplying multiple params with the same name - Issue 1116 (bigpresh) 1.3202 2015-11-07 - Re-releasing 1.3200 again now CPAN perms should be fully sorted. 1.3201 2015-11-07 - Re-releasing 1.3200 now I should have the required permissions. (Can't re-upload as 1.3200 even though it wasn't indexed due to PAUSE restrictions) 1.3200 2015-11-06 [BUG FIXES] - Fix temporary directory handling in serialiser tests (PR 1133, nanis) [ENHANCEMENTS] - Promoting 1.3144 to stable. Only one odd, rare failure remains on CPAN Testers, which I cannot reproduce. - Bind to 127.0.0.1 in tests to avoid occasional spurious failures on busy build hosts (PR 1136, thanks to @redbaron) - More efficient handling of large requests - don't store the raw request body, but fish it out of the HTTP::Body object's temp file if required (PR 1134, David Precious (bigpresh)) [NEW FEATURES] - Allow mixd named params and splats in route definitions (PR 1086, veryrusty) 1.3144 2015-11-04 [ENHANCEMENTS] - Bind to 127.0.0.1 in tests to avoid occasional spurious failures on busy build hosts (PR 1136, thanks to @redbaron) 1.3143 2015-10-26 - Note: new release manager for Dancer1: David Precious (BIGPRESH) [BUG FIXES] - Fix temporary directory handling in serialiser tests (PR 1133, nanis) [ENHANCEMENTS] - More efficient handling of large requests - don't store the raw request body, but fish it out of the HTTP::Body object's temp file if required (PR 1134, David Precious (bigpresh)) [NEW FEATURES] - Allow mixd named params and splats in route definitions (PR 1086, veryrusty) 1.3142 2015-09-14 - Promotion to stable release. [STATISTICS] - code churn: 1 file changed, 15 insertions(+), 8 deletions(-) 1.3141 2015-09-07 [BUG FIXES] - Dancer::Logger::Abstract now always try to convert to the configured charset. (GH#1125, ironcamel) - Fix test that was failing on Windows because of platform-specific directory separators. (GH#1122, nanis) [STATISTICS] - code churn: 11 files changed, 52 insertions(+), 37 deletions(-) 1.3140 2015-07-03 - Promote 1.3139 to non-trial release. [STATISTICS] - code churn: 1 file changed, 17 insertions(+), 9 deletions(-) 1.3139 2015-06-25 [BUG FIXES] - Reverted caching of session, as it can cause problem when the user is using 'session->destroy' (GH#1120). - Reverted loading config from hash. (GH#1121) [STATISTICS] - code churn: 9 files changed, 55 insertions(+), 249 deletions(-) 1.3138 2015-06-12 - Promote 1.3137 to non-trial release. [STATISTICS] - code churn: 1 file changed, 1796 insertions(+), 1754 deletions(-) 1.3137 2015-06-05 [BUG FIXES] - Dancer::Logger->init invocation was using `setting()` instead of `settings()`. (GH#1103, jwittkoski) - Skip utf8 tests on cygwin. (GH#1046, mokko) - Dancer::Session::YAML now refuse cookies that aren't alphanumerical. (yanick) [ENHANCEMENTS] - Provide a way to load settings directly from hash. (GH#1113, fgabolde) - Remove 'auto-reload' feature. (GH#1058, alambike) - Add methods to interact with TT's wrappers. (GH#1034, David Zurborg) [STATISTICS] - code churn: 13 files changed, 277 insertions(+), 212 deletions(-) 1.3136 2015-05-24 [DOCUMENTATION] - Remove mention of format 'with_id' from Dancer::Logger::Abstract. (GH#112, Fabrice Gabolde) [ENHANCEMENTS] - Cache sessions such that they are only retrieved once per request. (GH#1105, GH#992, Yanick Champoux) [STATISTICS] - code churn: 7 files changed, 119 insertions(+), 16 deletions(-) 1.3135 2015-04-22 [DOCUMENTATION] - Document how to work with Dist::Zilla and the 'devel' branch. [ENHANCEMENTS] - Deprecate 'auto_reload' and document alternatives. (GH#1106, isync) - Change YAML tests to be in line with new specs. (GH#1108, Slaven Rezić) [STATISTICS] - code churn: 12 files changed, 150 insertions(+), 50 deletions(-) 1.3134 2015-02-22 [DOCUMENTATION] - Improve Dancer::Request documentation. (GH#1095, Gabor Szabo) - Added descriptions to a bunch of internal modules. (GH#1097, Brad Macpherson) - Correcting the documentation's grammar. (GH#1101, Jonathan Hall) - Improve Dancer.pm's documentation wrt the export of 'warnings'. (GH#1100, Brad Macpherson) - Generated development.yml was saying the logs appear on STDOUT whereas it's really STDERR. (GH#1102, Fabrice Gabolde) [ENHANCEMENTS] - Skip tests requiring 'fork' if on a perl that doesn't implement it. (GH#1094, Steve Hay) - Using ':script' disable command-line argument munging globally. (GH#1098, Brad Macpherson) [STATISTICS] - code churn: 33 files changed, 173 insertions(+), 113 deletions(-) 1.3133 2014-11-26 [BUG FIXES] - Test was failing for Perl 5.21+ (error message changed). (GH#1073, cpansprout) [DOCUMENTATION] - Mention environment variables in Dancer::Config. (GH#1085, Sniperovitch) - Replace "return send_file" with "send_file". (GH#1089, Ashley Willis) - Fix NAME section for Dancer::Plugin::Ajax. (GH#1090, Ivan Bessarabov) - Fix wrong layout directory in documentation. (GH#1091, olof) [ENHANCEMENTS] - Speedup in the upload of large files. (GH#1092, snakpak) [STATISTICS] - code churn: 6 files changed, 100 insertions(+), 35 deletions(-) 1.3132 2014-10-20 [STATISTICS] - code churn: 1 file changed, 12 insertions(+), 6 deletions(-) 1.3131_1 2014-10-13 [BUG FIXES] - One test would fail if Template::Toolkit was not installed. (GH#1083) [STATISTICS] - code churn: 2 files changed, 26 insertions(+), 10 deletions(-) 1.3131_0 2014-10-11 [BUG FIXES] - Test was failing under perl 5.8.9. (GH#1057, Tom Hukins) - Don't get tripped by YAML::XS's readonly values. (GH#1070) [DOCUMENTATION] - Minor doc update to detail how to pass protocol information in Apache (GH#1079, Andy Beverley) - Add the Dancer policy POD. [ENHANCEMENTS] - Dancer::Template::TemplateToolkit now supports DATA-embedded templates. (GH#1061, Jochen Lutz) - New function 'param_array'. (GH#1055, Yanick Champoux) - D::Serializer::YAML and Dancer::Config can now use 'YAML::XS'. [MISC] - Add 'YAML' as a recommended dependency. (GH#1080) [STATISTICS] - code churn: 14 files changed, 348 insertions(+), 30 deletions(-) 1.3130 2014-09-15 [BUG FIXES] - Bogus dependency for 'mro'. (GH#1069) [STATISTICS] - code churn: 2 files changed, 21 insertions(+), 12 deletions(-) 1.3129 2014-09-09 [BUG FIXES] - Dzil conversion left 'dancer' script behind. (GH#1066) [STATISTICS] - code churn: 17 files changed, 1425 insertions(+), 1432 deletions(-) 1.3128 2014-09-09 [BUG FIXES] - Remove test dependency for Person and Person::Child. (GH#1063) 1.3127 2014-09-08 [BUG FIXES] - Test was using deprecated 'import_warnings'. (GH#1045, mokko) - Fix default test names for headers and redirection test methods. (GH#1048, odyniec) - DANCER_SERVER_TOKENS and DANCER_SESSION_INFO are now DANCER_NO_SERVER_TOKENS and DANCER_NO_SESSION_INFO. And working. :-) (GH#1014, Yanick Champoux) - 'any' wasn't understanding 'del' (only 'delete'). (GH#1044, Yanick Champoux) [DISTRIBUTION] - Now using Dist::Zilla as package manager. [DOCUMENTATION] - Correct POD formatting for HTTP methods in introduction.pod. (GH#1047, Lx) [ENHANCEMENTS] - environment configs are now merged with the global config, versus the previous behavior that was overriding the whole config segments. (GH#1016, Yanick Champoux) - Dancer::Handler::Debug now accepts env variables from the command-line. (GH#1056, Yanick Champoux) - Accessing values abstracted as methods in Dancer::Session. (GH#1000, John Wittkoski) 1.3126 2014-07-14 [BUG FIXES] - Bunch of files were not in the MANIFEST. 1.3125 2014-07-12 [DOCUMENTATION] - Improve the wording of the params() section in Dancer. (GH#1025, Warren Young) - Explain how to access config in Dancer::Config's POD. (GH#1026, Gabor Szabo) - Cookbook typo fix. (GH#1031, Florian Sojer) [ENHANCEMENT] - Skip bad cookie definitions. (GH#1036, Manuel Weiss) - 'dancer' script warns and die if trying to create an app with the same name of an existing module. (GH#1038, Racke) - In Dancer::Logger::Abstract, default host name to '-' if not available. (GH#1029, John Wittkoski) - Add Dancer::Serializer::JSONP. (GH#1035, David Zurborg) 1.3124 2014-05-09 [BUG FIXES] - Remove print statement in Dancer::ModuleLoad::require. (GH#1021, John Wittkoski) - Test was failing if JSON module was absent. (GH#1022, Yanick Champoux) - Allow for routes evaluating to false ('0', '', etc). (GH#1020, Yanick Champoux) [DOCUMENTATION] - Specify defaults in POD. (GH#1023, isync) - Fix doc for params(). (GH#1025, reported by Warren Young) [ENHANCEMENTS] - Also check X-Forwarded-Proto. (GH#1015, Andy Jones) - Update bundle jQuery to v1.11.0. (GH#1018, Michal Wojciechowski) - Add session support to the skeleton config. (GH#1008. Gabor Szabo) [MISC] - Update mailing list url in README. (GH#1017, Racke) - Markdownify the README. (GH#986, Chris Seymour) 1.3123 2014-04-12 [BUG FIXES] - Test was skipping wrong number of tests if JSON was absent. 1.3122 2014-04-10 [BUG FIXES] - Serializer::Mutable now consider 'Accept' before 'Content-Type'. (GH#996, Bernhard Reutner-Fischer) - Serializer::Mutable now correctly deals with content-types with charsets. (GH#996, Bernhard Reutner-Fischer) - Without Clone(), Dancer::Error::dumper() could clobber values in deep structures. (GH#1006, fix by asergei) - 'session_name' in Dancer::Session::Abstract couldn't be redefined. (GH#1004, patch by Lee Carmichael) [DOCUMENTATION] - GH #995: Documentation improvements. (Colin Kuskie) [MISC] - Unused function 'path_no_verify' removed. (GH#998, reported by mjemmeson) 1.3121 2014-02-02 [DOCUMENTATION] - GH #983: Correction of various typos. (Akash Ayare) - GH #981: Add synopsis to Dancer::Request::Upload. (smashz) - GH #985: Change mentions of 'PerlHandler' to 'PerlResponseHandler' (Xaerxess) [ENHANCEMENTS] - GH #994: change heuristic so that 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' is not recognized as text. (Skeeve) - GH #987: get_current_session() now accepts option 'no_update'. (Lee Carmichael) 1.3120 2013-12-24 [DOCUMENTATION] - GH #972: Correction of a truckload of typos. (David Steinbrunner) - GH #971: Stress that the request's 'env()' method is prefered over accessing '%ENV' directly. (isync) - GH #968: Fix 'ScriptAlias' example in Deployment docs. (reported by tednolan) - GH #976: Document and trap limitation in Dancer::Test. (Tom Hukins) - GH #976: Improve references to related modules. (Tom Hukins) [ENHANCEMENTS] - GH #974: Make plugins play nicely with mro 'c3'. (Fabrice Gabolde) 1.3119 2013-10-26 [BUG FIXES] - GH #959: hash randomization could cause .pl MIME to vary and test to fail. (Olof Johansson) - GH #961: fix bug in require_environment's logic. (reported by sapphirecat) [DOCUMENTATION] - GH #962: Improvements of the Dancer::Test docs. (Tom Hukins) - GH #970: Small documentation edit. (Matthew Horsfall) [ENHANCEMENTS] - GH #965: Serializer also serialize content for DELETE. (reported by Achim Adam) 1.3118 2013-09-01 [BUG FIXES] - GH #655: clarify logger error message. (Yanick Champoux, reported by Gabor Szabo) - GH #951: fix quoting of TemplateToolkit start_tag/stop_tag. (Rick Myers) - GH #940: carry over the session when we forward(). (Yanick Champoux, reported by sciurius) - GH #954: don't die on autoflush for older perls. (Yanick Champoux, reported by metateck and David Golden) - GH #950: Dancer::Test functions now populate REQUEST_URI. (Yanick Champoux, reported by Sören Kornetzki) [DOCUMENTATION] - GH #942: simpilify the Apache deployment docs for cgi/fcgi. (bug report by Scott Penrose) [ENHANCEMENTS] - GH #946: new 'require_environment' setting. (Jesse van Herk) - GH #952: don't set defaults for Template subclasses for Dancer::Template::TemplateToolkit. (Rick Myers) - GH #945: add function 'template_or_serialize' to Dancer::Serializer::Mutable. (Yanick Champoux) [MISC] - GH #949: fixes a few errors in the serializer testsuite. (Franck Cuny) 1.3117 2013-07-31 [BUG FIXES] - GH #794: Upload data was not kept for forwarded requests. (reported by William Wolf) - GH #898: calling halt() doesn't discard set headers anymore. (Yanick Champoux, reported by Nicolas Franck) - GH #842: embedded 'prefix' now properly localized. (Yanick Champoux, reported by Jashank Jeremy) [DOCUMENTATION] - GH #938: fix doc typos in Dancer::Serializer. (Fabrice Gabolde) - GH #712: add all status codes known to Dancer to Dancer::HTTP. (Yanick Champoux, reported by Brian J Miller) - Add warning that 'forward' doesn't preserver the session. (Alberto Simões) - GH #941: minor correction to code snippets in documentation. (Grzegorz Rożniecki) - GH #929: add warning on the use of Corona as underlying web server. (issue reported by berekuk) - GH #943: remove mention to 'Dancer::Plugin::Validation', clean 'dancer -a' sample output. (Grzegorz Rożniecki) [ENHANCEMENTS] - GH #836: Provide more information when an engine fails to load. (Yanick Champoux, reported by Daniel Perrett) 1.3116 2013-07-03 [ENHANCEMENTS] - GH #767: forwarded_for_address() now looks for HTTP_X_FORWARDED_FOR if X_FORWARDED_FOR is not there. (Jakob Voss) - GH #936: Add file locking to file logger. (David Golden) - GH #937: Add details to tutorial. (Craig Treptow) 1.3115 2013-06-09 [BUG FIXES] - GH #605: pass'ed megasplat with no further routes cause 404, not 500. (vlyon) [DOCUMENTATION] - GH #934: Added example of HAProxy deployment. (Anton Gerasimov) [MISC] - Tests now require Test::TCP v1.30+ (previous version had too short a timeout and tests were failing). (Yanick Champoux) 1.3114 2013-06-02 [BUG FIXES] - GH #724: app.pl obeys --confdir. (Yanick Champoux) - GH #927: logging format using 'h' now play nicely if no header present. (ironcamel) [DOCUMENTATION] - GH #922: Add example of request parameters. (Gabor Szabo) - Add scheme line for ngnix config in D::Deployment. [ENHANCEMENTS] - GH #919: 'dancer' script exits with code 255 if application name is invalid. (ppisar) - GH #871: now recognize HTTP_X_FORWARDED_PROTO. (mlbarrow) - GH #926: make messages from fatal warnings show up in the logs. (Max Maischein) - GH #930: speed improvement. (ichesnokov) - GH #859: strip illegal characters from cookie name. (Colin Keith) - GH #924: non-'/' apps behind proxies now possible using 'request-base' header. (Mikolaj Kucharski) 1.3113 2013-05-08 [BUG FIXES] - GH #920: fix pod for Dancer::Development. (ppisar) [DOCUMENTATION] - GH #915: add warning about behaviour of hooks with multiple packages loaded by load_app (racke). - GH #918: Fix headers syntax in Dancer::Response perldoc (Vyacheslav Matyukhin). [ENHANCEMENTS] - GH #869: leave body parameters alone if deserialization failed (brianphillips). - GH #912: send_file was returning 500 instead of 404 for non-existent files. (Fabrice Gabolde) - GH #914: add link to melezhik's psgi chef cookbook. - GH #923: implement lazy session flushing. (David Golden) 1.3112 2013-04-10 [BUG FIXES] - GH #900: backport the security patch for Dancer::ModuleLoader from Dancer2 (mokko). [ENHANCEMENTS] - GH #897 dancer script diagnostic more explicit if target directory does not exist or is not writable (reported by Andrew Grangaard). - GH #907: skip tests of deprecated features (mokko). 1.3111_02 2013-04-01 [BUG FIXES] - RT #84198: silencing wide-character in-memory file handle error (Tom Wyant). - wrong number of tests to skip in t/14_serializer/01_helpers.t. 1.3111_01 2013-03-30 [BUG FIXES] - GH #891: silenced warnings from non-numeric versions in Makefile.PL (Olof Johansson). - GH #702: fix request->header call throwing exceptions inside routes of Dancer->dance($request) (Perlover). - GH #893, GH #636: handle binary files for uploads in Dancer::Test (Andrei). - GH #903: add plan for subtest (bug report by wfaulk). [DOCUMENTATION] - GH #899: mention that response_exist and response_doesnt_exist are deprecated (Fabrice Gabolde). - GH #902, #903: change example to use path_info() instead of path() (Anton Ukolov, Lee Carmichael). [ENHANCEMENTS] - GH #895: JSON serializer now uses JSON's "-support_by_pp" (Jonathan Schatz). 1.3111 2013-02-24 [BUG FIXES] - GH #877: fix Dancer Error when so that 'exception' object is not passed to serializers, because XML/JSON serializers don't understand objects (rikbrown). - GH #858: Check for definedness, not truth, when testing if we read into the buffer when parsing a request body (florolf). - GH #845: Fix uninitialized warning when loading modules (Fabrice Gabolde). - GH #851, GH #853: Atomic YAML session writing (Roman Galeev). - GH #852: Saner UTF logging (Roman Galeev). - GH #849, GH #850: Serve autopages with text/html content type. (Philippe Bruhat - BooK) - GH #848: Handle If-Modified-Since header in the request for static files. (Philippe Bruhat - BooK) - GH #848: Send a Last-Modified header for static files. (Philippe Bruhat - BooK) - GH #856: Don't export non-existing subroutine (mokko). - GH #874: Reduce dependence on %ENV for internal code (Kent Fredric). - GH #875: Don't expect specific order in cookies (Yanick Champoux). - Remove 'exception' object from message being passed to serializers. (Rik Brown) - Added .travis.yml to MANIFEST.SKIP so t/manifest.t passes (Kaitlyn Parkhurst). - GH #887, GH #890: keyword 'global_warnings' added to replace 'import_warnings' (Kaitlyn Parkhurst). - GH #892: add 'private_key' to the list of potentially sensitive keys (Tom Heady). [DOCUMENTATION] - GH #847: Fix typo (John Wittkoski). - GH #865: Correct 'before' hook documentation (David Precious, Maurice). - GH #860, GH #844, GH #760: Misleading plack middleware documentation. (Paul Fenwick) - GH #862: Fix heading level for strict_config entry in Dancer::Config. (Stefan Hornburg - Racke) - GH #863: Correct example apache config (John Wittkoski). - GH #867: correct doc for ModuleLoader::load_with_params (mokko). - Document route_cache option (David Precious). - Docs for route_cache_size_limit & route_cache_path_limit (David Precious). - Remove meaningless 'encoding' to TT config (David Precious). - Remove docs for mounting multiple apps (Naveed Massjouni). - Update doc URLs (David Precious). - Fix inconsistency in Perlbal deployment example (Slaven Rezić, Racke). - GH #894: Replace spurious character in Dancer::Session's POD (Racke). - GH #880: Add deprecation mention for 'after' (pdl and Yanick Champoux). 1.3110 2012-10-06 [BUG FIXES] - GH #817, #823, #825: Removing Clone from core. Pure-perl environments supported again (Sawyer X). - GH #755, #819, #827, #828: HTTP::Headers accepted by dancer_response (Roberto Patriarca, Dagfinn Ilmari Mannsåker, draxil, perlpong). [DOCUMENTATION] - GH #821: Pointing to new homepage (alfie). - GH #822: Typos in documentation (Stefan Hornburg - racke). - GH #824: Fix in Dancer/Session.pm (pdl). - GH #830: Fix Github links to https:// (Olivier Mengué). - GH #838: Error in Dancer::Plugin::Ajax Documentation (Lee Carmichael). - GH #839: Typo (goblin). [ENHANCEMENTS] - GH #826: The version of wallflower shipped with Dancer has been removed. It was well out of date. BooK is now maintaining it as a more general solution under the name App::Wallflower. (BooK) - GH #834: Provide empty Headers object if not defined (Yanick Champoux). - GH #840, #841: Dancer::Plugin::Ajax now has content_type (Lee Carmichael). 1.3100 2012-08-25 [BUG FIXES] - GH #816: Improve wording when failed to load engine. (Sawyer X) - GH #817: Fix CODE reference uncloned using Clone::clone. (David Previous, Sawyer X) [DOCUMENTATION] - GH #818: Use "MyWeb::App" instead of "mywebapp" in examples. (pdl) [ENHANCEMENTS] - GH #755: HTTP::Headers accepted by dancer_response. (Roberto Patriarca) 1.3099 2012-08-11 [BUG FIXES] - GH #683: Fix uninitialized warnings. (Sawyer X) - GH #700: Take into account the app name in route caching. (Perlover) - GH #775: Clone variables for templates. (Reported by Wanradt Koell, fixed by David Precious, Sawyer X) - GH #776: get should be default to get/head even it's inside any. (Fayland Lam) - GH #788: Make sure ID key in sessions are clobbered. (kocoureasy) - Fix uninitialized variables in config file path. (Sawyer X) - GH #809: Require all necessarily modules in Dancer::Config. (John Wittkoski) [DOCUMENTATION] - GH #784: Synopsis fix in Dancer::Error. (Alex C) - Document session_domain in Dancer::Config. (David Precious) - Pod fixes in abstract session. (David Precious) - Synopsis fix in Dancer::Test. (Stefan Hornburg ) [ENHANCEMENTS] - GH #799: New test function: response_redirect_location_is. (Martin Schut) - send_file now accepts an IO::Scalar. (David Precious) - Clean up $VERSION. (Damien Krotkine) 1.3098 2012-07-28 [DOCUMENTATION] - Fix escaping on some docs (Stefan Hornburg @racke). [ENHANCEMENTS] - New keyword 'plugin_args' exported by Dancer::Plugin to provide a consistent way with Dancer 2 to obtain arguments from a plugin keyword. (Alberto Simões). - Add 'execute_hook' and deprecate 'execute_hooks' for homogeneity with Dancer 2. - send_file will do the right thing if given an IO::Scalar object (David Precious, prompted by Ilya Chesnokov). 1.3097 2012-07-08 [ENHANCEMENTS] - New keywords 'register_hook' and 'execute_hooks' exported by Dancer::Plugin to provide a consistent way with Dancer 2 to declare and run hooks from within a plugin (Alexis Sukrieh, idea from David Precious). 1.3096 2012-07-06 - Codename: Chop Hooey // Neil Hooey ** [ENHANCEMENTS] - Finally released, thanks to Neil Hooey bugging my sorry ass. 1.3095_02 2012-07-03 [BUG FIXES] - fix exception tests in some cases (GH #734) (Damien Krotkine & katkad ) [DOCUMENTATION] - Clarify serialization in introduction POD (Mark A. Stratman) - Typo fix (Sam Kington) [ENHANCEMENTS] - If YAML does not load, Dancer::Config now reports why (Ovid) 1.3095_01 2012-06-22 [BUG FIXES] - Don't assume returned references are blessed when considering continuations (Neil Hooey, GH-778) - Malformed/missing cookies caused warnings (James Aitken/LoonyPandora, GH-782 and GH-783) - Avoid potential crash in t/14_serializer/06_api.t if tmp dir is replaced when %ENV gets cleared (Adam Kennedy) - Properly initialize %callbacks to default empty hashref in _send_file if not provided (Gary Mullen) [DOCUMENTATION] - Update Ubic service example (Vyacheslav Matyukhin) - Silly typo fixing (Paul Fenwick) - Typo in Dancer::Test file upload example (Jonathan "Duke" Leto) - UTF-8 fixes in POD (ambs) [ENHANCEMENTS] - Add UTC timestamp options for logger_format (Alex C - perlpong). - Tests can now run in parallel (Richard Simões). - dancer_version keyword added (Damien "dams" Krotkine). - New session_domain paramter allows you to set the domain of the default session cookie (William Wolf) 1.3095 2012-04-01 [BUG FIXES] - Small fix to skip tests when YAML is not available. (Sawyer X) [ENHANCEMENTS] - Added 'info' log level for messages that should always go to the logs but aren't really debug, warning or error messages (Ovid) 1.3094 2012-03-31 [BUG FIXES] - GH #763: Fix exceptions in ajax routes clobbering layout (ilmari) - GH #748 & GH 647: Don't force override environment from PLACK_ENV (jwittkoski) - GH #762: fix param parsing lacking limit on split (leejo) - GH #758: Fix Dancer::Test: make sure the request is properly converted to a response. (Ovid) - GH #729: Fix dancer exception composition, and message pattern application (Damien Krotkine) - GH #752: Exceptions raised in hooks were not propagated back to the route code, but instead canceleld and replaced by a Dancer halt exception. That was wrong. Now it is fixed, exceptions raised in hooks can be properly caught in route code. (Damien Krotkine) - Be more flexible in single vs. mutliple values in key hiding. (Sam Kington) - Use isa() for checking relationships instead of ref() in Dancer::Test. (Ovid) [DOCUMENTATION] - Explain in POD that if there are multiple fields with the same name, params('fieldname') returns an arrayref of them (alexrj). - GH #750: Fix in Dancer::Deployment: appdir needs to be set before calling load_app (Paul Johnson) - Update 'before' hook document (David Cantrell). [ENHANCEMENTS] - Added 'strict_config' option to have the config return an object instead of a hashref. (Ovid) - GH #708: Added support for query strings in dancer_request (Jacob Rideout) - It's possible for the user to set the environments directory using a new environment variable (DANCER_ENVDIR) or using `set envdir => $path` - Sort hash keys when serializing references in log messages (Ovid). 1.3093 2012-02-29 [BUG FIXES] - GH #738: Define exception type ::Core::Request, to avoid things blowing up when Dancer::Request raises exceptions of that type (David Precious, thanks to damog for reporting) - GH #671: Fix Dancer::Plugin::Ajax with Plack::Builders. (Activeg, Sawyer X) - Auto-page feature cleanup and fixup. (David Precious) - Remove uninitialized warnings. (Sawyer X, David Precious) [DOCUMENTATION] - Fix examples for multi-app deployment under Plack::Builder in deployment. - Deployment docs. (c0bra) - Update tutorial. (David Precious) - Clean up EXPORTS. (David Precious) - Keyword documentation fixups. (Kirk Kimmel) - Clarify forward docs with better examples. (David Precious) [ENHANCEMENTS] - Winning release race to Catalyst (nice try rafl++!) - Add exception type ::Core::Request. (David Precious) - JSON decode from UTF8. (Sam Kington) - Provide the method when a route crashes to help debug. (Sam Kington) - More helpful log messages. (David Precious) 1.3092 2012-01-27 [BUG FIXES] - Don't call isa() on unblessed refs in Dancer::Exception. (Sam Kington) - Assume UTF-8 by default when serialising JSON. (Sam Kington) - GH #725: If a cookie is set multiple times, last value wins. (David Precious) - More intuitive, backwards compatible appending of default template extension. (GH #716, David Precious) - Prevent recursion in censoring. (Yanick Champoux, Damien dams Krotkine) - GH #734: More tests flexibility (Sawyer X, reported by @birdy-) [DOCUMENTATION] - Document how to work with Dotcloud. (Oliver Gorwits) - Clean ups and fix ups. (David Precious, Sawyer X, Michal Wojciechowski) [ENHANCEMENTS] - Return the current set prefix using prefix(). (Michal Wojciechowski) - More intuitive appending of default template extension. Makes for cleaner more DWIM code. (David Precious, reported by Nick Knutov) - Allow any options to JSON serializer. (Lee Johnson) - Support complex views with multiple document roots. (Pedro Melo) 1.3091 2011-12-17 [BUG FIXES] - Reverting template() behavior by popular demand. (Damien Krotkine) - GH #714: Run post-request hooks when custom continuations were created. (Damien Krotkine) - Always call write_session_id() to update expires. (David Precious) [DOCUMENTATION] - GH #680: Document problems with multiple apps in Dancer using Plack::Handler::Apache2 and recommend a workaround. (Asaf Gordon, Pedro Melo) - RT #73258: Spelling glitches. (Damyan Ivanov) - Use ":script" instead of ":syntax" in Cookbook. (John Barrett) - Typos in Deployment doc. (David Precious) [ENHANCEMENTS] - GH #711, #652: Add server_tokens variable to allow removal of headers. (John Wittkoski) 1.3090 2011-12-13 - Codename: Hornburg of Hannover // Stefan Hornburg (racke) ** [BUG FIXES] - GH #685: Set VERSION for Dancer::Plugin::Ajax. (Sawyer X, Naveed Massjouni) [DOCUMENTATION] - GH #694: Typo fix. (Yanick Champoux) - GH #698: Document further TT init options. (Dennis Lichtenthaeler) - GH #709: Update POD documentation regarding hook. (Stefan Hornburg) 1.3089_01 2011-11-26 [BUG FIXES] - Fix bug that made system() fail with -1 under Dancer (felixdo). - Support for 'content_type' option on send_file when sending a system wide file (Emmanuel Rodriguez). - Support HTTP_X_FORWARDED_HOST in behing proxy (Ipaponov). - Deserialize PATCH requests (Sam Kington). - Encode log messages properly if charset UTF-8 is set (David Precious, thanks to Penfold for the fix & MiklerGM for reporting). [DOCUMENTATION] - Clean up "plack_middlewares" example in docs (Richard Simões). [ENHANCEMENTS] - Continuations-style exception system! (Damien Krotkine). - The ability for dancer_response to send file contents for file uploads as a scalar, instead of reading from file on disk (Squeeks). 1.3080 2011-10-25 - Codename: Sawyer's Sugar Stream // Sawyer X ** [ENHANCEMENTS] - No functional changes, just releasing as stable. 1.3079_05 2011-10-02 [API CHANGES] - Deprecation of 'before', 'before_template' and 'after' in favor of hook (Alberto Simões) [BUG FIXES] - Minor corrections (jamhed, felixdo) - Log if a view and or a layout is not found (Alberto Simões, reported by David Previous) [ENHANCEMENTS] - Add support for the HTTP 'PATCH' verb (David Precious) 1.3079_04 2011-10-02 [DOCUMENTATION] - Dancer::Plugins typos (Olof Johansson). - PSGI handler documented (chromatic). [ENHANCEMENTS] - PSGI handler code cleaned up (chromatic). - Improved warning localizations (chromatic). 1.3079_03 2011-09-10 [BUG FIXES] - Don't clobber TT INCLUDE_PATH if the user set it specifically in the config file - Issue 643 (David Precious, reported by meraxes) - Don't require a space after semi-colon delimiting multiple name=value cookie pairs - Issue 642 (David Precious, reported by travisbeck) [ENHANCEMENTS] - Support XML::Simple configuration for serializing/deserializing (Alberto Simões) - Hard deprecate lots of stuff (Alberto Simões) 1.3079_02 2011-08-28 [BUG FIXES] - Remove hard-coded version from 404.html and 500.html (Alberto Simões) - Fix logging of UTF8-encoded strings (jamhed) - Do not clean 'vars' during forward (Alberto Simões) [ENHANCEMENTS] - Add streaming support to send_file. (Sawyer X) 1.3079_01 2011-08-17 [BUG FIXES] - Fix prefix behavior with load_app (alexrj) - send_file() shouldn't clobber previously-set response status (David Precious, reported by tylerdu - thanks!) - Depend on URI 1.59 - Fixes problems when redirecting with UTF-8 strings (Alberto Simões) - Fix before_serializer POD fix (Yanick Champoux) [DOCUMENTATION] - Cookbook links to canonical documentation of keywords in Dancer.pm, so readers encountering a new keyword can easily see the docs for it (David Precious) - Docs for debug/warning/error link to Dancer::Logger for details on how to control where logs go (David Precious) - Document import_warnings option, and mention it & link to that documentation in opportune places. - Document that 'get' also creates a route for 'HEAD' requests (David Precious, prompted by Matt S Trout) - Extend request() keyword docs with examples (David Precious) - Correct port in Lighty/FCGI example in Dancer::Deployment (David Precious, thanks to pwfraley in Issue 621) [ENHANCEMENTS] - send_file can send data (pass a reference to a scalar), and can specify a content-disposition filename. (Alberto Simões) - Set 'Server' HTTP response header as well as 'X-Powered-By'. For cases where Dancer is being accessed directly, or the proxy passes on this header, it's nice to see it. (David Precious) 1.3072 2011-08-23 - Codename: Precious David Precious // David Precious (bigpresh) ** [ENHANCEMENTS] - No functional changes, just releasing as stable. 1.3071 2011-07-26 - Security release based on 1.3070 ** [SECURITY] - FIX directory traversal issue Since 1.3070, it was possible to abuse the static file serving feature to obtain files from a directory immediately above the directory configured to serve static files from. (Vladimir Lettiev and David Precious) 1.3070 2011-07-14 - Codename: The Exceptional Mr. Dams // Damien Krotkine (dams) ** [ENHANCEMENTS] - No functional changes, just releasing as stable. 1.3069_02 2011-07-10 [BUG FIXES] - Fix a bunch of cpan testers reports (Alberto Simões) 1.3069_01 2011-07-07 [BUG FIXES] - Fix a bug while parsing some cookies (Franck Cuny) - Documentation and tests on how to use many Dancer application inside one PSGI file (PR 564) (Alex Kalderimis and Franck Cuny) - More flexible test for locale-aware logging (Alberto Simões) - Do not re-read config files when dance starts if they were already loaded. (Alberto Simões) - Fixed shell-dependent tests for Window testing. (Alberto Simões) - Die properly if halt is call inside an hook. (Damien Krotkine and Alberto Simões) - Make template work outside of requests (Issue 592) (David Precious) - Cleanup session tests folder (Issue 594) (Sawyer X) [DOCUMENTATION] - Documentation on tokens automatically added to templates. (Alberto Simões) - Documentation on serializer magical access to put/posted data. (Alberto Simões) [ENHANCEMENTS] - Error Hook (PR 563 - JT Smith) - Exceptions system (Damien Krotkine) - The no prefix can be set using 'prefix "/";' (Alberto Simões) - Support for nested prefixes (Alberto Simões) - Cleanup on Dancer::FileUtils (Sawyer X) - Cleanup on File::Temp dependencies (Sawyer X) 1.3060 2011-06-15 - Codename: Pirouetting Pedro // Pedro Melo ** [ENHANCEMENTS] - No functional changes, just releasing as stable. 1.3059_04 2011-06-12 [BUG FIXES] - Fix a bunch of cpan testers reports - (Alberto Simões) 1.3059_03 2011-06-11 [BUG FIXES] - Fix for issue #539 https://github.com/sukria/Dancer/issues/539 Don't decode twice entries in the params hash table, file uploads with UTF-8 characters in their name are now possible. (Toby Corkindale, Alexis Sukrieh) - Fix broken test with old version of HTTP::Parser::XS (Franck Cuny) - #492 - Don't run Test::TCP tests on win32 (Franck Cuny) - Fix a bug that when forwarding a post with post data stalled the code (read on no data handle). (Alberto Simões) - Tweak tests regular expression to be more flexible (Pedro Melo) - Require a recent Test::TCP (1.13) to run tests. (Alberto Simões) - Fix hooks implementation that failed when user messes $_ (Pedro Melo) - Fix broken params('query') and params('body') during forward and dancer_request test function. (Alberto Simões and Squeek) [DOCUMENTATION] - Improve FileUtils documentation. (mokko) [ENHANCEMENTS] - Fix for issue #516 https://github.com/sukria/Dancer/issues/516 No more legacy code in Dancer::Route to handle routes created with the deprecated keyword "r". The related code is now more concise and should be slightly more efficient. (Alexis Sukrieh) - Merge PR #541 https://github.com/sukria/Dancer/pull/541 New "param" accessor to retrieve a parameter easily. (Alberto Simões) - Implement session directory testing cache for Session::YAML (Damien Krotkine) - Tests rework (improve speed, remove useless tests, ...) (Alberto Simões and Franck Cuny) - Configuration for log_dir and log_file. (Alberto Simões) - Pass vars to templates automatically (David Precious) - Support lexical prefix (Pedro Melo) 1.3059_02 2011-05-29 [BUG FIXES] - Fix for smoker failure under Perl 5.13.4 http://www.cpantesters.org/cpan/report/b37416b8-88df-11e0-9c74-cad5bcb80 94c Better use of Time::Hires in t/22_hooks/04_template.t (Franck Cuny) 1.3059_01 2011-05-27 [API CHANGES] - Second level of deprecation for render_with_layout method. (Alberto Simões) - Second level of deprecation for mime_type method. (Alberto Simões) [BUG FIXES] - Dancer::Test was broken for tests using data in POST (GH#534) (Franck Cuny) - Multiple setter implemented at 1.3039_01 was broken for App specific settings. (Alberto Simões) [DOCUMENTATION] - Improve Serializers documentation (Damien Krotkine) [ENHANCEMENTS] - Cookie accessor to manipulate cookies directly. (Niko) 1.3051 2011-05-27 - Security release based on 1.3050 ** [SECURITY] - FIX CVE-2011-1589 (Mojolicious report, but Dancer was vulnerable as well). Return "400 Bad Request" when requested filename seems suspicious http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2011-1589 (Vladimir Lettiev and Franck Cuny) 1.3050 2011-05-20 - Codename: The Captain Hook Adventure // Franck Cuny ** [DOCUMENTATION] - Improve Dancer documentation (Damien Krotkine) [ENHANCEMENTS] - No functional changes, just releasing as stable. 1.3049_01 2011-05-14 [API CHANGES] - Deprecation of 'logger' (use set). (Alberto Simões) - Deprecate 'layout' (use set). (Alberto Simões) - Definitely remove plack_middlewares HashRef deprecation. (Alberto Simões & Damien Krotkine) [BUG FIXES] - Unbreaking auto_page somewhat - the catch-all route added will pass unless a suitable view exists. This means that routes like /foo are not obscured, and made up URLs will result in a proper 404, not 500. A little more work required here, though. (David Precious) - Anchor regular expression routes. Before regular expressions were matching anywhere in the URL. (Alberto Simões) [ENHANCEMENTS] - GH #519: remove redundant lines from CSS (Alberto Simões) - When scaffolding an app, show a warning if YAML not installed. Prompted by Issue 496. (David Precious) - Hooks! add new positions for hooks, and possibility to create your own hooks inside your application and your plugin. (Franck Cuny) - Don't try to read/set session vars with empty/undef keys. It doesn't make sense to do so, and can cause warnings elsewhere. (David Precious) - Check HTTP status code/alias passed to status() is valid; previously, and invalid code would result in the response status being unset (David Precious, prompted on IRC by jonas) - Lowercase status aliases and swap spaces for underscores before trying to match (David Precious, suggested on IRC by jonas) - Added 'behind_proxy' setting, making Dancer honor X_FORWARDED_PROTOCOL and X_FORWARDED_HOST (Alberto Simões, requested by sukria and others) 1.3040 2011-05-01 - Codename: Yanick in Black // Yanick Champoux, Labor Day - May Day ** [ENHANCEMENTS] - No functional changes, just releasing as stable. 1.3039_01 2011-04-27 [BUG FIXES] - Fix 404 results from forwarding. (Alberto Simões) - Don't remove trailing slashes from route patterns under prefix. (Brian E. Lozier) - Remove deprecated r() function from list of exports. (Stefan Hornburg) - GH #402: make session_expires honor +2h style formatting. (Michael G. Schwern) - GH #433: encoding issues with forward(). (Alberto Simões) - GH #390: Renaming access_log to startup_info (+doc). (Sawyer X) - Rewrite scalar usage of qw() that is incompatible with 5.14. (Alberto Simões) - Don't parse ARGV when under PSGI (closes #473) (Franck Cuny) [DOCUMENTATION] - Major rewrite/reorganization on Dancer::Config documentation. (David Precious, pushed by Alberto Simões PR) - GH #284: Document hosting multiples Dancer apps in a single PSGI file. (Franck Cuny) - Dancer::Session POD typos and spurious characters. (Stefan Hornburg) [ENHANCEMENTS] - Forward can change method GH#493 (Alberto Simões) - Introducing the "megasplat"! (Yanick Champoux) - More tests for versions, setings and variables. (Alberto Simões) - Improve Dancer::Test so failures report the correct line numbers. (Michael G. Schwern) - GH #466: Can now set cookies with http_only => 0 for JS integration. (Alberto Simões) - Session engine can be told to set cookies without HttpOnly attribute using new session_is_http_only setting. (Alberto Simões, requested by JT Smith) - GH #296: Show versions of loaded modules in startup info. (Sawyer X) - Able to set more than one value at once using set(). (Alberto Simões) - GH #253: Use Clone::clone() if available to clone data before censoring. (Sawyer X) - GH #246: Dancer::Test can now test for file uploads as well. (Franck Cuny) - Allow parameters in forward(). (Alberto Simões) 1.3030 2011-04-13 - Codename: Silence of the ambs // Alberto Simões ** [ENHANCEMENTS] - Change the flag for sending system-wide path with send_file to 'system_path' (was 'absolute'). (Alberto Simões) 1.3029_03 2011-04-10 [BUG FIXES] - Dancer::Session::Cookie 0.14 is required for dependency test. - Only test for undef serializer if we have the default (JSON) available. (Sawyer X) [ENHANCEMENTS] - Test before_template & auto_page. 1.3029_02 2011-04-08 [BUG FIXES] - Better way to initialize the logdir in Dancer::Logger::File. Works now cleanly if the appdir is not writable but the logdir exist and is writable. (Alberto Simões) - fix warnings in t/03_route_handler/28_plack_mount.t. (Franck Cuny) [DOCUMENTATION] - POD fix. (Stefan Hornburg - Racke) [ENHANCEMENTS] - Support for error templates. If the setting "error_template" is set, it is used when building an error page instead of using the default template. Added the appropirate documentation as well. (Alberto Simões) - Dancer::Test::dancer_response() returns a 404 response when no route handler is found. This is consistent with what Dancer does internally. (Alberto Simões) - Dancer::Test provides a new helper for inspecting subsets of headers: "response_headers_include". (Alberto Simões, Alexis Sukrieh) - dancer_response now handles the rendering of static pages as well. (Alberto Simões) - Cleanup some tests. (Alberto Simões) 1.3029_01 2011-04-01 [BUG FIXES] - Fix t/14_serializer/02_json.t to work with older JSON (relates to GH#416) (Damien Krotkine) - the Changelog test now supports Codenames. It suggests to add codenames for table releaes as well (Damien Krotkine) - GH #420: Extra content generated (Alberto Simões, Damien Krotkine) - GH #409: If pass has no more matching routes, return 404. (Alberto Simões) [DOCUMENTATION] - Add documentation to send_file optional argument (Alberto Simões) - Fix plack_middlewares example in the cookbook (Michael G. Schwern) - Extend the POD on plugin_setting to prevent a pitfall with plugin modules more than 3 levels deep. (Stefan Hornburg) - GH #400: Documenting the plack_middlewares_map. (Michael G. Schwern, Sawyer X) - GH #422: Documenting no need for caret when you have a prefix. (Sawyer X) [ENHANCEMENTS] - GH #396: Test that Dancer::Session::Cookie isn't broken (Michael G. Schwern) - GH #399: Make sure session can have their name changed. (Michael G. Schwern) - Dancer::Test tests assumes 'GET' if their first argument is scalar. (Yanick Champoux) - send_file accepts optional content-type declaration, to override guessed MIME type, e.g. send_file $filename, content_type => 'image/png' (Alberto Simões, requested by Michael G Schwern) - send_file accepts optional absolute option, to send an absolute path (Alberto Simões) - Have `dancer` cmd tool create MANIFEST and MANIFEST.SKIP. (Alberto Simões) - mime_type is deprecated; new keyword 'mime'; new config key 'default_mime_type'; (Alberto Simões and Michael G. Schwern) - Recognize absolute redirects (Yanick Champoux) 1.3020 2011-03-21 - Codename: The Schwern Cometh // Michael G. Schwern ** [ENHANCEMENTS] - No functional changes, just releasing as stable. 1.3019_02 2011-03-14 [BUG FIXES] - GH #354: Tokens are not passed to layout if no params are passed to template. (Damien Krotkine) 1.3019_01 2011-03-13 [BUG FIXES] - GH #393: Reset vars for each new request. (Franck Cuny) [ENHANCEMENTS] - GH #391: Dancer::Logger::Note now exists. :) (Sawyer X) - Porting documentation on WRAPPER to Dancer::Template::TemplateToolkit. (Sawyer X) - GH #387: Document views and appdir in Dancer::Config. (Michael G. Schwern) - Add a new symbol to exporter ':script'. (Franck Cuny) - GH #397: Support cookie expire times like "+2h". (Michael G. Schwern) 1.3014_01 2011-03-10 [BUG FIXES] - GH #373: Display valid path to the main app file in the welcome screen. (Franck Cuny) - GH #152, GH #170, GH #362: Log dir is not created when logger is not set to 'file', and setting log_path works as expected. (Franck Cuny) - GH #308: Use request's uri_base. (Sawyer X) - GH #378: Some routes with prefix where wrongly matched. (Franck Cuny) [DOCUMENTATION] - Dancing on command line. (Maurice Mengel) - Improve Dancer::Cookbook. (Maurice Mengel) [ENHANCEMENTS] - GH #351: Explicitly exclude some keywords when important Dancer's syntax, add modes that also excludes some keywords (:moose, :tests). (Sawyer X, Naveed Massjouni, Michael G. Schwern, Franck Cuny) - All logging options accept any number of variables. (Sawyer X) - GH #297: All logging options can automatically serialize references. (Sawyer X) - Add Dancer::Logger::Capture to capture and read log messages during testing. (Michael G. Schwern) - Dancer::Cookie make secure (https only) cookies. It also adds the "session_secure" setting instructing sessions to use secure cookies. (Michael G. Schwern) - Adding uri_base to Request.pm. (Sawyer X) - Make Dancer::Test use the capture logger (Michael G. Schwern) 1.3014 2011-03-04 [BUG FIXES] - YAML Session UTF-8 Fix (Roman Galeev) - Tests and documentations for Dancer::Request::Upload + type method in Dancer::Request::Upload (Michael G. Schwern) - Dancer::Test::dancer_response handles correctly its 'body' parameter We can now pass a hash ref as the body of dancer_response, it will automatically be serialized as an URL-encoded string with the appropriate content_type header. (Alexis Sukrieh) 1.3013 2011-03-01 [ENHANCEMENTS] - Fix test suite: the changelog test is skipped if not under RELEASE_TESTING environment. 1.3012 2011-03-01 [BUG FIXES] - Fix cookies disappearing when more than one is set. Complete refactoring of the cookie handling. (Chris Andrews, Geistteufel) - Properly set the settings in Dancer::Test only after config loading. (Sawyer X) - Fix possible loss of last directory in path. (Sawyer X) - No need for default upper directory in Dancer::Test. This fixes an issue raised on the list about the default scaffolded test failing. (Sawyer X) - Fix anti UNC substitution under Cygwin (Rowan Thorpe) - GH#299 Return appropriate headers on HEAD request (content-type, ...) (franck cuny) - Use the dancer_version variable in scaffolded app. (Sawyer X, reported by Brian E. Lozier) [DOCUMENTATION] - Add missing methods (e.g. "referer"), sorting, clean up. (Flavio Poletti) - Complete working example of deployment under Nginx/Starman in Deployment.pod (Geistteufel) [ENHANCEMENTS] - Fix manifest (Damien Krotkine) - Various packaging, changelog and test fixes (Damien Krotkine) - Add a new accessor to Dancer::Request: ->uri. (it's an alias to ->request_uri) (Franck Cuny) - Removes Dancer::Helpers, refactor Dancer.pm accordingly. (Franck Cuny) - Introduce changelog test of hell. (Damien Krotkine) - Add Dancer::Logger::Null. (Sawyer X) - Add Dancer::Logger::Diag. (Sawyer X) - Refactor Dancer::Response (franck cuny) - Allow to use a subclass of Template::Toolkit. (Michael G. Schwern) - Dancer::Test now uses Dancer::Logger::Null instead of ::File. (Sawyer X) - Add Dancer::Deprecation. (handle deprecation messages) (franck cuny) - Introduce new timestamp format in logger (%T) (Roman Galeev) - Refactoring of the forward method (Alex Kalderimis) - Refactoring of internal objects in the core, use more of Dancer::Object. Introduce attributes_defaults (Damien Krotkine) - Add a perl_version variable to all templates, used in scaffolded app. (Sawyer X, reported by Brian E. Lozier) - Better output when template file is missing. (Brian E. Lozier, Sawyer X) 1.3011 2011 .02.14 [BUG FIXES] - Set binmode in write_data_to_file() to fix image corruption in Windows (Rowan Thorpe) - GH#319, GH#278, GH#276, GH#217: Fix file issues on Cygwin and Win32 platforms (Rowan Thorpe) - GH#322: Detect errors in scaffolded dispatchers (Alberto Simões) - Fix tests so that they don't fail if JSON is not installed (Damien Krotkine) [DOCUMENTATION] - Small spaces fix (Alberto Simões). 1.3010_01 2011 .02.12 [BUG FIXES] - GH#136: fix again Mime::Type issues in preforking environment (Chris Andrews) * GH#220: fix for path issues under MacOS X and Windows platforms. A new function is provided by Dancer::FileUtils: path_no_verify() (Rowan Thorpe) * Fix for infinite loops detection in before filters (Flavio Poletti) [DOCUMENTATION] - Fix a typo in Dancer::Request::Upload's POD (Rowan Thorpe) - Better documentation for the before filters, explanations about the potential infinite loops that can happen when using before filters (and what Dancer does in that case). (Flavio Poletti) [ENHANCEMENTS] - Better detection of the application layout under non-UNIX platforms. (Rowan Thorpe, Alexis Sukrieh) 1.3010 2011 .02.10 [BUG FIXES] - GH#303: Generated Makefile.PL's clean is done correctly now. (Sawyer X) - Minimum version of HTTP::Headers to avoid test fails. (LoonyPandora) - Do not require JSON to get version number (fixes tests). (Sawyer X) [ENHANCEMENTS] - Allow read_file DWIMishness using wantarray. (LoonyPandora) - Tidy up Dancer.pm (Damien Krotkine) - Document forward should use return. (Sawyer X) - GH#290: Use return with redirect examples in docs. (Damien Krotkine) - Document that base() returns a URI object. (David Precious) - Show version when starting standalone server. (David Precious) 1.3003 2011 .02.06 [API CHANGES] - Remove load_plugin from the core's DSL (was deprecated). [BUG FIXES] - Eliminate test warnings on Windows. (Gabor Szabo) - GH#271 - use correct VERSION_FROM in scaffolded application. (Sawyer X) - GH#260 - send_file doesn't clobber existing headers (Alexis Sukrieh) - logger unicode bugfix in the formated date (jahmed) - GH#281 - Don't crash if splat is used with no captures (David Precious) - Possible to given "template" a view name with the extenstion. (Alexis Sukrieh) [ENHANCEMENTS] - New setting log_path to allow for alternalte logging path in logger "file". (Natal Ngétal) - GH#289: Add more aliases on the ENV, provide more smart accessors to Plack env entries (Franck Cuny) 1.3002 2011-02-02 [API CHANGES] - to_json and from_json accept options as hashref instead of hash. Passing arguments as hash is deprecated (Franck Cuny). [BUGFIXES] - status is kept even when halt is used in a before filter (Alexis Sukrieh) * Proper handling of temporary file creation using File::Temp module instead of homebrew solution. (jahmed) * Logger::Abstract unicode bug fix. (jahmed) [ENHANCEMENTS] - In development, pretty-print JSON serializations for easier development (Ask Bjørn Hansen) 1.3001 2011-01-27 [Alberto Simoes] - Support for aliases for content_type and refactoring of mime-types handling, with a new class Dancer::MIME (closes issue GH #124) - Deprecation of Dancer::Config::mime_types (now handled by Dancer::MIME). [David Precious] - Point people towards D::P::Database in the tutorial. - Mention leaving ratings on cpanratings. - Some minor typo fixed in the documentations. [Flavio Poletti] - Added "git fetch upstream" for remote tracking - turned a tab into the right number of spaces - Fix weird Plack error "status code needs to be an integer greater than or equal to 100", because of a typo in a call to Dancer::Error (Closes issue GH#264) [Franck Cuny] - uri_(un)escape cookie value; closes GH-248 - remove websocket tutorial (it has its own distro now) - add a new tests to make sure unknown templates produce a warning - path for send_file must be relative from the public directory - Support for complex values in cookies (scalars, flat arrays and flat hashes). Fixes issue GH#249 [Hagen Fuchs] - Request.pm Decode HTTP::Request's uploads [jahmed] - Fix a bug in YAML session backend, during the creation of the session file. [mokko] - typos and a little more substatial changes to Development.pod 1.3000_02 2011-01-03 [Damien Krotkine] - FIX for --no-check switch in script/dancer - Refactoring of Dancer::Template::Abstract - add support of apply_layout and apply_renderer - deprecation of render_with_layout (now handled better) - add an accessor "engine" to the DSL to access any engine singleton - better interface for Dancer::Object and Dancer::Object::Singleton - updated tests accordingly [Jonathan Otsuka] - Bring dancer application creation pod up-to-date 1.2003 [Sawyer X] - Added forward() functionality (incl. tests and docs) 1.3000_01 2010-12-22 [Alan Haggai] - Fixing up typos in various places. - Show the correct filename in usage. [Alexis Sukrieh] - Update documentation for developers. Dancer::Development reflects the new releases startegy since 1.2 is out. Also better explaining about how to contribute pull-requests to the core team. - New documentation for integrators: Dancer::Development::Integration describes precisely how integrators should handle pull-requests. [Damien Krotkine] - Better check of keywords used in plugins. - internal refactoring: - Dancer::Object::Singleton added to refactor engines later - Support of inheritance in attributes declared with Dancer::Object [Franck Cuny] - Support for configurable log format in logger engines - Refactoring of Dancer::Route, some optimisations and code cleanup - Add several tests to increase the coverage (reached 92.4%, for 1399 tests) [Gabor Szabo] - Adding test for multi-leveled scaffolding. [Maurice Mengel (mokko)] - Skip file upload tests on Cygwin, not just win32. [Naveen] - add a --no-check switch to script/dancer to disable remote check of new Dancer versions. [Philippe Bruhat] - add script/wallflower, helper to turn a Dancer application into a static web site. - better behaviour for plugin_setting (better search, more user-friendly) [jamhed] - Fix some unicode issues, refactored all file openings in one function in Dancer::FileUtils. 1.2003 2010-12-10 - Production release. 1.2002_02 2010-12-08 [Danijel Tasov] - Correct HTTP.pm POD's 503 entry with 403. [Paul Tomlin] - Tests for URI object in uri_for. - Update Plack middleware tests compatibility. 1.2002_01 2010-12-07 [Franck Cuny] - Fix test failures on old machines with Test::More without done_testing. [Joel Roth] - Code fixes in documentation (Dancer::Session, Dancer::Introduction). 1.2002 2011-01-27 - Productionized! :) 1.2001_01 2010-12-02 [Danijel Tasov] - Default layout now validates. [David Precious, Ivan Bessarabov] - Fixing TT example config. 1.2001 2010-11-30 [David Precious] - Doc fixes. Clarifications to Cookbook's REST section. - Don't crash if application name is invalid and provide better information. [Franck Cuny] - Refactoring engine triggers. This resolves an issue of engine inits being run before all configuration is read. That also crashes D::S::Cookie. As a side effect we now have a refactored _set_setting() which does not trigger any engine hooks (unlike setting()). - Fix failing test t/07_apphandlers/06_debug.t [Sawyer X] - Fix clash with KiokuDB because of Dancer::Serializer::Dumper. 1.2000 2011-01-27 - 1.2 is a stable release of Dancer ** - We assure consistency and stability for this release and the following ** - 1.2xxx releases; you should not have issues updating to any 1.2xxx ** - version because of it. ** - A very special thanks goes to the Dancer community who improved and ++ - perfected this release and worked hard on reporting bugs, fixing them, ++ - improving the stability, providing important features and everything ++ - else which makes Dancer so attractive - and above all: its community ++ - so thank you! ++ [Sawyer X] - Fixing some more XML tests with missing preqreqs. 1.1999_04 2010-11-14 [Sawyer X] - Load Plack::Loader dynamically in test. [Yanick Champoux] - Doc fix. 1.1999_03 2010-11-11 [Al Newkirk] - fixed redirect to redirect immediately (+ refactoring by franck) [Alexis Sukrieh] - Transparent unicode support Dancer now takes care transparently of decoding unicode strings used within route handlers and encoding them back before sending a response content. Once the 'charset' setting is set, the user has nothing more to do to have a working unicode-aware application. - FIX for issue #172 More documentation added to Dancer::Request, all public method are documented. A pod coverage test has been added for this module. - Documentation update The deployment documentation is more precise about cgi/fast-cgi deployment under Apache. - FIX for issue GH#171 Scaffolded configuration files are fully commented in order to quickly guide the user in her first steps. [Damien Krotkine] - Fix Dancer::Plugin OO issue [Danijel Tasov] - Fixed expires in cookies + tests [Dave Doyle] - clarify Pod as to how before_template works [Franck Cuny] - Closes issue 181 (unknown log level) - Plack middlewares must be listed in an arrayref (listing them in a hashref is now deprecated) [Philippe Bruhat] - Dancer::Logger::Abstract: turn _should() into a closure, and avoid setting up the hash again and agai [Sawyer X] - Overhaul tests to use lib t/lib instead of t::lib::. (fixes Windows test fails) - PSGI envs on Windows is in capital letters. (fixes Windows test fails) - Add tests on every required directory to create a fake environment. (realpath() on Windows fails when path doesn't exist) 1.1999_02 2010-10-15 [Alexis Sukrieh] - FIX for issue GH #151 utf8 pragma is imported automatically when Dancer is loaded to allow the usage of UTF-8 strings in the application code. (Thanks to kocoureasy for the report). - FIX for "UTF-8" issues (GH#153): - response content is encoded only if content_type is text - charset setting is normalized to UTF-8 when appropriate - automatically decode UTF-8 strings in params - FIX scaffolded dispatchers (script/dancer) The PLACK_ENV variable is not propagated by Apoache to the dispatchers (at least with our Deployment examples) so the dispatchers aren't aware of the PSGI context if we don't tell them explicitly. This patch forces the dispatchers in PSGI mode. - FIX (unknown bug) When a serializer is set and show_errors is true, don't expose internal errors caught. [Damien Krotkine] - replace all die and warn with croak and carp [Franck Cuny] - Dancer::Test load D::Session::Simple - rewrite how Dancer handle HTTP headers - no more Dancer::Headers - all headers are HTTP::Headers object [Mark Allen] - Add a tutorial (Dancer::Tutorial) - example application 'Dancr', provided in example/ [Naveen] - add --version to the dancer CLI - changed the URI fetched by the dancer script to check Dancer's version [Philippe Bruhat] - use Pod::Usage 1.1999_01 2010-10-14 [Adam J. Foxson] - FIX for issue GH#136: "readline() on closed filehandle DATA" error that appears when running the app with Starman [Alexis Sukrieh] - FIX for utf8 content in views Dancer now handles correctly templates with non-ASCII characters in views. All you have to do is to set the "charset" setting in your config. Your content response will then be encoded appropriately on-the-fly by Dancer. - Scaffolded app sets the charset to "utf8" by default. - Better design for the scaffolded app (logo, favicon and background image added) - Environment info available on scaffolded app - LWP is used by the dancer helper to download files - jQuery 1.4.2 (minified) is included in the scaffolded app - default layout uses <% request.base %> in order to support mounted apps (Thanks to Naveed Massjouni and Franck Cuny for the concept/idea). - The main.tt layout sources jQuery first from Google CDN and falls back to the local minified version if on offline mode. - New default token provided to the "template" helper: dancer_version [Damien Krotkine] - FIX for issue GH#115 documentation about compression in Dancer::Deployment [David Precious] - Make the 'layout' param to the template keyword work as you'd expect and allow you to set a custom layout to use, e.g.: template 'templatename', {}, { layout => 'layoutname' }; [Franck Cuny] - FIX for issue GH#129 don't add multiple content-type to headers - fix broken tests (they were testing incorrect content type) [Naveed Massjouni] - Dancer::Test function get_response is renamed to dancer_response get_response still works but is deprecated - dispatch.f?cgi scripts use FindBin to resolve their location. FIX a bug when using symlinks. [Philippe Bruhat] - Make sure a plugin refuse to register a keyword twice [Sawyer X] - Lots of documentation updates - Dancer now logs caught crashes in rendering (easier to debug Ajax routes) [Sebastian de Castelberg] - The dancer helper is able to download files via a transparent proxy (thanks to LWP). 1.1904 2011-01-27 [Sawyer X, Franck Cuny] - SAX, not Sax. - Check for XML::Parser or XML::SAX in test as well. 1.1903 2011-01-27 [Sawyer X, Franck Cuny] - XML::Simple needs either XML::SAX or XML::Parser. (fixed test fails from Dancer::Serializer::XML) 1.1902 2010-11-02 [Adam J. Foxson] - Addresses issue #136: "readline() on closed filehandle DATA" 1.1901 2010-09-24 [Alexis Sukrieh] - load_plugin is DEPRECATED; 'use' should be used instead to load a plugin. This is fixes the major issue with plugins about symbol exports that didn't work well (issue #101). - All paths built in a scaffolded application are dynamic, it's now possible to move a scaffolded application after it's been generated. (fixes issues #88, - The auto_reload feature is now disabled by default due to too many unsolved issues (it works most of the time, but some race conditions are still present) This feature is still being working on, but it's now flagged "experimental"). - Default log level in development environment is now 'core' in order to provide more information. - New scaffolded application design. More neutral and with lots of information for a beginner, and links to useful material. Based on the Ruby on Rails start page (kudos to the Rails team, http://www.rubyonrails.org). [Boris Shomodjvarac] - Support for a clean way for Template engines to define their template file extensions (issue #126). [Franck Cuny] - implemented GH#120: - methods {to,from}_{xml,json,yaml} accept more than one arguments. The first argument is the data to transform. All the remainings arguments are parameters to alter the behavior of the serializers. Refer to the documentation for more informations. - more tests added 1.1812 2010-09-21 [Alexis Sukrieh] - Fix for scaffolded apps - Dancer::Deployment cleanup (CGI section) - Declare LWP explicitly (already implied by HTTP::Body and HTTP::Headers) [Franck Cuny] - Skip bogus uploads test on Win32 (thanks to Alias for reporting) [Sawyer X] - Nitpicking at tabs and spaces at end of lines 1.1811 2010-09-03 [Franck Cuny] - FIX for issue #113 and #112 [Naveed Massjouni] - FIX for issues #111 and #108 1.1810 2010-09-01 [Alexis Sukrieh] - Fix a test that depends on YAML (pass if not present) (Smoker failure '2010-08-30T11:07:59Z'). [Naveed Massjouni] - FIX for issue #108 replaced Clone::clone() with Storable::dclone(). - Fixed the plan of one of the test files. 1.1809 2010-08-25 [Alexis Sukrieh] - fix plan for t/03_route_handler/24_named_captures.t [Franck Cuny] - update Deployement.pod and Cookbook.pod - fix bug in route building with prefix - don't use app.psgi anymore in generated scripts - fix GH#106: serializer - fix bug in PSGI handler using HTTP::Headers when using some header - fix bug in ajax query - more tests 1.1808 2010-08-24 [Alexis Sukrieh] - FIX test failures - t/08_session/07_session_expires.t - t/08_session/07_session_expires.t 1.1807 2010-08-23 [Alexis Sukrieh] - Global rewrite of Dancer's core to allow support for sub-application, better route resolution and a better design. - Support for mountable applications via "load_app". Mounted applications can have their own settings registry and can be mounted under a given prefix. [Franck Cuny] - Support for new hooks: - after: to allow response post-processing - before_template: to allow defaut tokens to be given at anytime to the template function. - Fix and test for bug RT#57829 (Custom response headers lost when using JSON serializer) - FIX PSGI compatibility layer (request->path_info is used when appropriate instead of request->path) - FIX for GH#100 When loading a module, it's possible to require a minimal version. - New option "ajax" for route handlers. - Fix a bug in ajax route when processing the route resolution (when a route is defined with options, it's pushed in the beggining of the route handler tree). [Naveed Massjouni] - Dancer::Test can now test requests with a body [Sawyer X] - Fix for RT #60403: removing Test::Exception requirement [jamhed] - Support for new setting "session_expire" in order to allow session cookies to expire before the browser is closed. 1.1806_02 2010-08-16 [David Precious] - Add Dancer::Plugins POD, describing useful plugins - Extend sessions & logging in entry in cookbook [François Charlier] - fix for GH#76 and GH#88 [James Aitken] - fix issues GH #84 #86 and #87 (failing tests on < 5.10 due to regex with named captures) [franck cuny] - update cookbook 1.1806_01 2010-08-15 [Alexis Sukrieh] - Fix for RT#56239 logger calls are better traced - Fix for GH#72 New keyword 'load_plugin' for loading a plugin in the current namespace. Plugins can be used anywhere thanks to that method. - Fix for issue #77 Passing and caching works well together again. - Applied miyagawa's patch for droping the app.psgi file. Refactoring of Dancer::Handler::PSGI and friends. - Applied LoonyPandora's patch for checking Dancer's VERSION when running script/dancer. Changed it a bit so it can check against CPAN rather than GitHub. - Documentation update: r('') is now DEPRECATED, the method triggers a warning when called and will be removed in the next stable release (1.2). - Transparent wrapping of Plack middlewares in Dancer's configuration. It's possible to enable/disable middlewares right from Dancer's config files. Thanks to Tatsuiko Miyagawa and Franck Cuny for their help. [Marc Chantreux] - Support for regexp objects in route definition - Support for named captures (keyword 'captures' added to Dancer's syntax). [jbarratt] - Dancer::Serializer::JSON supports 'allow_blessed' and 'convert_blessed' options. [sebastian de castelberg] - Support for path_info() in Dancer::Request so it's possible to mount an application under a directory. 1.1805 2010-06-22 [Alexis Sukrieh] - Fix for RT#56239 logger calls are better traced - Fix for GH#72 New keyword 'load_plugin' for loading a plugin in the current namespace. Plugins can be used anywhere thanks to that method. [Minty] - Update Introduction pod with (required) -a dancer opt (Murray, 5 hours ago) - Bump HTTP::Body dependency to 1.07 (Murray, 6 hours ago) 1.1804 2010-06-18 [Alexis Sukrieh] - FIX for bug RT#58355 Rewrite of Dancer::Template::Simple's parser, now more robust, based on Perl's regexp engine. - FIX a warning when remote_address is undefined [Daniel Pittman] - FIX for issue #80 Make sure the tempfiles created during uploads are removed when the request object dies. [David Precious] - Fix test failures with old Plack versions (Issue 73). - Don't surround content with

tags in layout. - Add $ENV{REMOTE_ADDR} in core log messages [SawyerX] - Fix issue #75, reported by nanis. perl -MDancer -e "print $Dancer::VERSION" now works as expected [sebastian de castelberg] - Fix priority in D::S::Mutable. 1.1803 2010-05-23 [Alexis Sukrieh] - Fix for issue #69 The issue was resolved in 1.1801, this time, the fix is working as expected. [Sawyer X] - Fix for RT #57715, require Test::More 0.88 and up. 1.1802 2010-05-19 [Sawyer X] - Fix RT #57158 (route_cache does not work with multiple parameters) Cache revealed a small design overlook of not cloning a route before returning it to the user, making multiple parameters disabled. (Thanks to Stéphane Alnet for reporting and adding a test for it!) 1.1801 2010-05-19 [Alexis Sukrieh] - FIX issue #69 Error are trapped even if occuring from Dancer's source code. auto_reload is set to false in scaffolded applications to prevent errors if Module::Refresh is not installed. 1.1800 2010-05-16 [Alexis Sukrieh] - merge of the devel branch into master, first stable release of 1.178_01 and 1.178_02 1.178_02 2010-05-11 [Alexis Sukrieh] - Errors are caught in before filters - halt can be given a Dancer::Response object rahter than plain text content 1.178_01 2010-05-05 [Alex Kapranof] - Support for on-the-fly charset encoding when the setting is set and a content is sent by Dancer and needs to be encoded. The response Content-Type is updated accordingly as well. [Alexis Sukrieh] - New logger for sending log message to STDERR: Dancer::Logger::Console Thanks to Gabor Szabo for the idea. - Logger engines don't have anymore to implement _format(), they can use $self->format_message instead. - New log level: "core" for letting Dancer's core express itself on crucial events. That way, when the app config sets log to "core", any core messages is sent to the logger, and the end-user can see which route is chosen for each request received. Thanks to Gabor Szabo for the idea. - New class Dancer::Timer added so any logger engine can now show a timer string. - Scaffolded applications are now built like a CPAN distribution, with a Makefile.PL and test scripts (thanks to Gabor Szabo for the idea). - Added Dancer::Test to provide helpers for writing test script for Dancer applications - FIX bug when returning a void context after redirecting a route. Thanks to Juan J. Martínez for the report. - Add support for request headers in Dancer::Request - Add support for halt() in Dancer's syntax. [Sawyer X] - Adding "import_warnings" settings. On by default, but allows to disable auto-import of "warnings" pragma. Reported by Adam Kennedy. 1.176 2010-04-22 - Bringing 1.175_01 into production. 1.175_01 2010-04-19 [Sawyer X] - Documentation for Dancer::FileUtils. - Documentation for Dancer::Cookie. - Fixing PNG bug on IE (reported by Adam Kennedy - thank you). 1.175 2010-04-11 [Alexis Sukrieh] - fixed t/15_plugins/02_config.t when YAML is not installed [Sawyer X] - RT #56395 reported by Jonathan Yu on behalf of Debian Perl team. - Documentation for Dancer::Error. 1.174 2010-04-08 [David Precious] - Support semi-colons as name=value pair separators when parsing querystring. Satisfies feature request/issue 59. Thanks to deepakg for requesting this feature. [Gabor Szabo] - Docs fixes, typo in warning. - TestUtils.pm is now in "t/lib". [Sawyer X] - RT #56381 reported by Jonathan Yu on behalf of Debian Perl team. (Adding LICENSE file) 1.173_01 2010-04-04 [Alexis Sukrieh] - New serializer: Dumper for easily output dumped variable in text/plain. - Before filters can now access route params - Support for '.' as a token separator in params parsing - The standalone server respect the 'access_log' setting, the starting banner is printed on STDERR only if the setting is set to true. [Franck Cuny] - Doc fixes. (Thanks to poisonbit) - Plugins configuration - Cleaning up tests [Sawyer X] - Fixed Windows PSGI.URL_SCHEME bug, causing tests to fail (Thanks to ADAMK for reporting) 1.173 2010-04-04 [Alexis Sukrieh] - Documenting set_cookie in Dancer.pm. [David Precious] - Fix issue 52 - creating invalid cookie expiration dates. Thanks to Juanjo (reidrac) for reporting! [Franck Cuny] - Cleaning up serializer test. [François Charlier] - Documenting layout disabling. [Sawyer X] - Fix a few failing tests because of compilation errors. - Add init{} subs for all serializers. - Dancer::Engine documentation 1.172 2010-03-28 [Alexis Sukrieh] - Plugin support. [Franck Cuny] - Prevent usage of reserved Dancer keywords in plugins. - Tests cleanups. [Robert Olson] - Fixing docs to clarify layouts can use variables too. 1.171 2010-03-24 [Alexis Sukrieh] - Removed bogus TestApp/ directory 1.170 2010-03-24 [Alexis Sukrieh] - Query string params are not dropped anymore when their value is 0. thanks to "Squeeks" for the report. (closes: bug #49) - Support for file uploads The Dancer::Request class provides a common interface to access file uploads. Syntactic sugar has been added to Dancer's as well (keyword 'upload'). (closes whish #36) [David Precious] - Fixed bug with status keyword not converting aliases (e.g. 'not_found') to real usable status lines with valid HTTP codes. Thanks to P Kishor for reporting this on the dancer-users mailing list! - Accept end_tag as a synonym for stop_tag when configuring TemplateToolkit. Thanks to James Ronan for bringing this up. [Franck Cuny] - Support for automatic serialization/deserialization Dancer is now able to serialize route handler's response in various format (JSON, YAML, XML); and can also deserialize request body when appropriate. (closes: wish #29) [Sawyer X] - Route::Cache store_route = store_path, beefed up docs - Changed names of limits in settings - Added documentation for it in Dancer.pm - More documentation about Module::Refresh dependency (closes bug #48) - uri_for now accepts a boolean for not escaping URIs, and redirect calls uri_for with that boolean. (closes: bug #47) 1.160 2010-03-07 [Alexis Sukrieh] - Dancer helper propagates its perl executable into the generated $appname.pl script (FIX for RT #54759). - FIX for issue #34 No more warnings undeer Win32 for tests script that needs a tempdir - FIX (unknown bug) The standalone server now parses commandline options (was broken since 1.140). - FIX for issue #37 A new setting "confdir" is provided for making Dancer read the application configuration files from an alternate location. - Core settings can be initialized via environment variables, prefixed with "DANCER_" (e.g. "DANCER_DAEMON" for the setting "daemon"). - Config and command-line arguments are parsed and loaded at import time, rather than when the handler is initialized. - Routes are compiled at startup instead of being compiled whenever a request is handled. This can increase performances up to 50%. - FIX Params are not polluted anymore by the 'splat' keyword when no capture is needed by the pattern. - New feature 'auto_page' (closes: #41) Lets the user have automatic route resolution for requests that match an existing template in the views dir. Thanks to David Precious for the idea and his help. [Daniel Tasov] - Plack environment is propagated to Dancer if none specified. [David Precious] - Added session backend Dancer::Session::Simple - Dump session contents on development error page, if session is in use - Censor sensitive-looking information on development error page settings / session dumps, to help avoid passwords / card details etc being leaked. - Add deployment guide [Sawyer X] - Route Caching with size and path number limits: Dancer::Route::Cache. - FIX for issue #39. - Dancer::ModuleLoader documentation - Cleaned Dancer::Template::Abstract docs - Cleaner die in Dancer::Engine if can't find engine - Added default route example in Dancer::Cookbook 1.150 2010-02-17 [Alexis Sukrieh] - Refactored all core engines with Dancer::Engine - Support for engine configuration via config files - Each core template engine now uses start_tag/stop_tag from the configuration instead of harcoding '<%' and '%>'. - FIX for issue #34 Cookies can now be used when the application is ran under a Plack server. [Anirvan Chatterjee] - Various documentation typo fixes [Danijel Tasov] - FIX for issue #24 Dancer now depends on MIME::Types rather than using File::MimeInfo::Simple which uses a fork(). [David Precious] - Lots of documentation cleaning and fixes. - Make the session available to the views, if possible. - Added Dancer::Cookbook to provide lots of concrete examples for newcomers. - Helper script `dancer' now provides a default favicon.ico in the application public directory. - FIX for issue #30 Added 'config' method to provide easy access to app config [Franck Cuny] - Test scripts cleanup: + Cleanup is performed in test scripts when necessary (all temp files are removed at the end of the script). + FIX for issue #23 Test scripts that try to write logfiles set the appdir. [Paul Driver] - Support for virtual location. It's now possible to mount a Dancer app under a user-defined prefix. 1.140 2010-02-09 - Dancer now depends on HTTP::Server::Simple::PSGI in order to rely on a PSGI environement even when running the app with the standalone server (Thanks to Tatsuiko Miyagawa). - Dancer::Request object enhancements: + Dancer::Request now provide an accesor to the raw body of the request. + FIX for issue #13 The params helper now provides accessors to route params, query string params and body params so the user can chose from which source they want to access params instead of dealing with a mixed structure. + Added accessors to referer and remote_address - The Standalone server now uses the setting 'server' to bind itself to the IP address given by the setting. Default value is 0.0.0.0 1.130 2010-01-29 - Fix a memory leak that could occur between two requests under mod_perl (Thanks to Nicolas Rennert for the report and diagnosis). - remove all optional modules from the core, they are now shipped as separate CPAN distributions: - Dancer::Template::MicroTemplate - Dancer::Session::Cookie - Dancer::Session::Memcached - Dancer::Logger::LogHandler - Dancer::Logger::Syslog - support for the `header' keyword in Dancer's syntax. The user is now able to alter response-headers in route handlers. - support for `prefix' keyword in Dancer's syntax. A prefix can be set by the user before defining routes handlers. All route defined then will be automatically prefixed accordingly. 1.122 2010-01-16 - Fix the test suite under Perl 5.8.x - Security Fix: protection from CRLF injection in response headers (thanks to Mark Stosberg for the report). - Support for multi-valued params in GET/POST data (thanks to Mark Stosberg for the report). - Backward compatibility with old app.psgi files, don't die when a request is initialized with a CGI::PSGI object. 1.121 2010-01-15 - Fix for POST data parsing (was broken in 1.120) now Dancer depends on HTTP::Body for that. 1.120 2010-01-15 - ROADMAP updated - Dancer is now compliant with Plack::Server::Apache2 - Remove the CGI.pm dependency, huge refactoring - POD typo fixes (Naveed) - Support for syntax-only importation (Sawyer X) - Remove the example/ directory, useless and deprecated - New logger engine: Log::Handler (franck cuny) - New template engine Text::Microtemplate (franck cuny) - Remove compilation-time warnings catching (issue #14) 1.110 2010-01-11 - Fix test script `t/11_logger/04_syslog.t' - Fix test script `t/10_template/05_template_toolkit.t' 1.100 2009-01-01 - Support for multiple method routes at once with 'any' - Templates engines + Bug fixes in Dancer::Template::Simple (Jury Gorky) + Refactoring of the factory + option for disabling the layout in the template helper. - New session engine based on encrypted cookies (Alex Kapranof) - More HTTP codes supported for a better REST compat (Nate Jones) - Documentation updates - script/dancer now requires an appname - New Makefile.PL with better metadata (CPAN Service) 1.000 2009-01-01 - Support for Syslog logger (Dancer::Logger::Syslog) - Basic template engine so Template is no more a hard deps. - Memcache Session support (Dancer::Session::Memcache) - YAML file-based session support (Dancer::Session::YAML) - Lots of tests (more than 80% of the code is covered) 0.9906 2009-01-01 - move from File::MimeInfo to File::MimeInfo::Simple for smooth run on Mac OSX and Win32 systems. 0.9005 2009-01-01 - Source code extract on error catching - Support for configurable error handling - New design for the starting app built with script/dancer 0.9004 2009-01-01 - Support for PSGI/Plack environment - script/dancer helper script for bootstraping a new app 0.9003 2009-01-01 - Detect differently compilation-time warnings and runtime warnings closes bug #48440 (Thanks to Enric Joffrion for the report, and to Vincent Pit for the diagnosis) AUTHORS100644001750001750 1204315135765170 14066 0ustar00davidpdavidp000000000000Dancer-1.3522*** Meet the Dancer Crew *** The first version of Dancer was written by Alexis Sukrieh in summer 2009. The project has evolved a lot since that time, and a huge and very active community emerged to extend and improve Dancer.. The Project is now handled by an organised team of core developers, and many valued contributions are sent by motivated developers around the globe. This is what makes Dancer such a fun project to use - it's a living community of motivated people. A huge thank you to all of them! [ CORE TEAM ] Alberto Simões Alexis Sukrieh Damien Krotkine David Golden David Precious Franck Cuny Sawyer X Yanick Champoux [ CONTRIBUTORS ] a-adam Achim Adam Adam J. Foxson Akash Ayare Al Newkirk Alan Haggai Alavi Alex Kalderimis Alex Kapranoff Andrei Andy Anirvan Chatterjee Anton Gerasimov asergei Ask Bjørn Hansen Bernhard Reutner-Fischer boris shomodjvarac Brian E. Lozier Brian Phillips burnersk Chris Andrews Chris Seymour chromatic Colin Keith Colin Kuskie Craig Craig Treptow Daniel Perett Danijel Tasov Dave Doyle David Moreno David Steinbrunner Fabrice Gabolde Flavio Poletti Florian Larysch François Charlier Gabor Szabo geistteufel Gregor Herrmann Grzegorz Rożniecki Hagen Fuchs Hans Dieter Pearcey Ilya Chesnokov ironcamel isync Ivan Bessarabov Jakob Voss James Aitken Jesse van Herk Joel Roth John Wittkoski Jonathan "Duke" Leto Jonathan Otsuka Jonathan Schatz Joshua Barratt Juan J. Martínez Jury Gorky Kaitlyn Parkhurst Kent Fredric Lee Carmichael Marc Chantreux Mark Allen Mark Stosberg Matthew Horsfall (alh) Maurice Max Maischein Michael G. Schwern Michal Wojciechowski Mikolaj Kucharski mlbarrow mokko Murray Natal Ngétal Nate Jones Naveed Naveed Massjouni Naveen Nicolas Franck Nicolas Oudard Niko Olivier Mengué Olof Johansson Ovid Paul Driver Paul Fenwick Paul Tomlin Perlover Philippe Bruhat (BooK) ppisar Rick Myers Rik Brown Roman Galeev Rowan Thorpe Sapphire Paw Scott Penrose sdeseille Sebastian de Castelberg Skeeve smashz Stefan Hornburg (Racke) Tatsuhiko Miyagawa tednolan Tom Heady Tom Hukins Tom Wyant Vyacheslav Matyukhin Xaerxess Zefram t000755001750001750 015135765170 13101 5ustar00davidpdavidp000000000000Dancer-1.3522pod.t100644001750001750 52415135765170 14171 0ustar00davidpdavidp000000000000Dancer-1.3522/t#!perl -T use strict; use warnings; use Test::More; unless ( $ENV{RELEASE_TESTING} ) { plan( skip_all => "Author tests not required for installation" ); } # Ensure a recent version of Test::Pod my $min_tp = 1.44; eval "use Test::Pod $min_tp"; plan skip_all => "Test::Pod $min_tp required for testing POD" if $@; all_pod_files_ok(); LICENSE100644001750001750 4365615135765170 14041 0ustar00davidpdavidp000000000000Dancer-1.3522This software is copyright (c) 2010 by Alexis Sukrieh. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. Terms of the Perl programming language system itself a) the GNU General Public License as published by the Free Software Foundation; either version 1, or (at your option) any later version, or b) the "Artistic License" --- The GNU General Public License, Version 1, February 1989 --- This software is Copyright (c) 2010 by Alexis Sukrieh. This is free software, licensed under: The GNU General Public License, Version 1, February 1989 GNU GENERAL PUBLIC LICENSE Version 1, February 1989 Copyright (C) 1989 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The license agreements of most software companies try to keep users at the mercy of those companies. By contrast, our General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. The General Public License applies to the Free Software Foundation's software and to any other program whose authors commit to using it. You can use it for your programs, too. When we speak of free software, we are referring to freedom, not price. Specifically, the General Public License is designed to make sure that you have the freedom to give away or sell copies of free software, that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of a such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must tell them their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any work containing the Program or a portion of it, either verbatim or with modifications. Each licensee is addressed as "you". 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this General Public License and to the absence of any warranty; and give any other recipients of the Program a copy of this General Public License along with the Program. You may charge a fee for the physical act of transferring a copy. 2. You may modify your copy or copies of the Program or any portion of it, and copy and distribute such modifications under the terms of Paragraph 1 above, provided that you also do the following: a) cause the modified files to carry prominent notices stating that you changed the files and the date of any change; and b) cause the whole of any work that you distribute or publish, that in whole or in part contains the Program or any part thereof, either with or without modifications, to be licensed at no charge to all third parties under the terms of this General Public License (except that you may choose to grant warranty protection to some or all third parties, at your option). c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the simplest and most usual way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this General Public License. d) You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. Mere aggregation of another independent work with the Program (or its derivative) on a volume of a storage or distribution medium does not bring the other work under the scope of these terms. 3. You may copy and distribute the Program (or a portion or derivative of it, under Paragraph 2) in object code or executable form under the terms of Paragraphs 1 and 2 above provided that you also do one of the following: a) accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Paragraphs 1 and 2 above; or, b) accompany it with a written offer, valid for at least three years, to give any third party free (except for a nominal charge for the cost of distribution) a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Paragraphs 1 and 2 above; or, c) accompany it with the information you received as to where the corresponding source code may be obtained. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form alone.) Source code for a work means the preferred form of the work for making modifications to it. For an executable file, complete source code means all the source code for all modules it contains; but, as a special exception, it need not include source code for modules which are standard libraries that accompany the operating system on which the executable file runs, or for standard header files or definitions files that accompany that operating system. 4. You may not copy, modify, sublicense, distribute or transfer the Program except as expressly provided under this General Public License. Any attempt otherwise to copy, modify, sublicense, distribute or transfer the Program is void, and will automatically terminate your rights to use the Program under this License. However, parties who have received copies, or rights to use copies, from you under this General Public License will not have their licenses terminated so long as such parties remain in full compliance. 5. By copying, distributing or modifying the Program (or any work based on the Program) you indicate your acceptance of this license to do so, and all its terms and conditions. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. 7. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of the license which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the license, you may choose any version ever published by the Free Software Foundation. 8. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 9. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 10. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS Appendix: How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to humanity, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 19yy This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 1, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19xx name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (a program to direct compilers to make passes at assemblers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice That's all there is to it! --- The Artistic License 1.0 --- This software is Copyright (c) 2010 by Alexis Sukrieh. This is free software, licensed under: The Artistic License 1.0 The Artistic License Preamble The intent of this document is to state the conditions under which a Package may be copied, such that the Copyright Holder maintains some semblance of artistic control over the development of the package, while giving the users of the package the right to use and distribute the Package in a more-or-less customary fashion, plus the right to make reasonable modifications. Definitions: - "Package" refers to the collection of files distributed by the Copyright Holder, and derivatives of that collection of files created through textual modification. - "Standard Version" refers to such a Package if it has not been modified, or has been modified in accordance with the wishes of the Copyright Holder. - "Copyright Holder" is whoever is named in the copyright or copyrights for the package. - "You" is you, if you're thinking about copying or distributing this Package. - "Reasonable copying fee" is whatever you can justify on the basis of media cost, duplication charges, time of people involved, and so on. (You will not be required to justify it to the Copyright Holder, but only to the computing community at large as a market that must bear the fee.) - "Freely Available" means that no fee is charged for the item itself, though there may be fees involved in handling the item. It also means that recipients of the item may redistribute it under the same conditions they received it. 1. You may make and give away verbatim copies of the source form of the Standard Version of this Package without restriction, provided that you duplicate all of the original copyright notices and associated disclaimers. 2. You may apply bug fixes, portability fixes and other modifications derived from the Public Domain or from the Copyright Holder. A Package modified in such a way shall still be considered the Standard Version. 3. You may otherwise modify your copy of this Package in any way, provided that you insert a prominent notice in each changed file stating how and when you changed that file, and provided that you do at least ONE of the following: a) place your modifications in the Public Domain or otherwise make them Freely Available, such as by posting said modifications to Usenet or an equivalent medium, or placing the modifications on a major archive site such as ftp.uu.net, or by allowing the Copyright Holder to include your modifications in the Standard Version of the Package. b) use the modified Package only within your corporation or organization. c) rename any non-standard executables so the names do not conflict with standard executables, which must also be provided, and provide a separate manual page for each non-standard executable that clearly documents how it differs from the Standard Version. d) make other distribution arrangements with the Copyright Holder. 4. You may distribute the programs of this Package in object code or executable form, provided that you do at least ONE of the following: a) distribute a Standard Version of the executables and library files, together with instructions (in the manual page or equivalent) on where to get the Standard Version. b) accompany the distribution with the machine-readable source of the Package with your modifications. c) accompany any non-standard executables with their corresponding Standard Version executables, giving the non-standard executables non-standard names, and clearly documenting the differences in manual pages (or equivalent), together with instructions on where to get the Standard Version. d) make other distribution arrangements with the Copyright Holder. 5. You may charge a reasonable copying fee for any distribution of this Package. You may charge any fee you choose for support of this Package. You may not charge a fee for this Package itself. However, you may distribute this Package in aggregate with other (possibly commercial) programs as part of a larger (possibly commercial) software distribution provided that you do not advertise this Package as a product of your own. 6. The scripts and library files supplied as input to or produced as output from the programs of this Package do not automatically fall under the copyright of this Package, but belong to whomever generated them, and may be sold commercially, and may be aggregated with this Package. 7. C or perl subroutines supplied by you and linked into this Package shall not be considered part of this Package. 8. The name of the Copyright Holder may not be used to endorse or promote products derived from this software without specific prior written permission. 9. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. The End INSTALL100644001750001750 447515135765170 14041 0ustar00davidpdavidp000000000000Dancer-1.3522This is the Perl distribution Dancer. Installing Dancer is straightforward. ## Installation with cpanm If you have cpanm, you only need one line: % cpanm Dancer If it does not have permission to install modules to the current perl, cpanm will automatically set up and install to a local::lib in your home directory. See the local::lib documentation (https://metacpan.org/pod/local::lib) for details on enabling it in your environment. ## Installing with the CPAN shell Alternatively, if your CPAN shell is set up, you should just be able to do: % cpan Dancer ## Manual installation As a last resort, you can manually install it. If you have not already downloaded the release tarball, you can find the download link on the module's MetaCPAN page: https://metacpan.org/pod/Dancer Untar the tarball, install configure prerequisites (see below), then build it: % perl Makefile.PL % make && make test Then install it: % make install On Windows platforms, you should use `dmake` or `nmake`, instead of `make`. If your perl is system-managed, you can create a local::lib in your home directory to install modules to. For details, see the local::lib documentation: https://metacpan.org/pod/local::lib The prerequisites of this distribution will also have to be installed manually. The prerequisites are listed in one of the files: `MYMETA.yml` or `MYMETA.json` generated by running the manual build process described above. ## Configure Prerequisites This distribution requires other modules to be installed before this distribution's installer can be run. They can be found under the "configure_requires" key of META.yml or the "{prereqs}{configure}{requires}" key of META.json. ## Other Prerequisites This distribution may require additional modules to be installed after running Makefile.PL. Look for prerequisites in the following phases: * to run make, PHASE = build * to use the module code itself, PHASE = runtime * to run tests, PHASE = test They can all be found in the "PHASE_requires" key of MYMETA.yml or the "{prereqs}{PHASE}{requires}" key of MYMETA.json. ## Documentation Dancer documentation is available as POD. You can run `perldoc` from a shell to read the documentation: % perldoc Dancer For more information on installing Perl modules via CPAN, please see: https://www.cpan.org/modules/INSTALL.html MANIFEST100644001750001750 2421415135765170 14152 0ustar00davidpdavidp000000000000Dancer-1.3522AUTHORS CONTRIBUTORS Changes INSTALL LICENSE MANIFEST META.json META.yml Makefile.PL README SIGNATURE bin/dancer cpanfile doap.xml examples/dancr/dancr.pl examples/dancr/public/css/style.css examples/dancr/schema.sql examples/dancr/views/layouts/main.tt examples/dancr/views/login.tt examples/dancr/views/show_entries.tt lib/Dancer.pm lib/Dancer/App.pm lib/Dancer/Config.pm lib/Dancer/Config/Object.pm lib/Dancer/Continuation.pm lib/Dancer/Continuation/Halted.pm lib/Dancer/Continuation/Route.pm lib/Dancer/Continuation/Route/ErrorSent.pm lib/Dancer/Continuation/Route/FileSent.pm lib/Dancer/Continuation/Route/Forwarded.pm lib/Dancer/Continuation/Route/Passed.pm lib/Dancer/Continuation/Route/Templated.pm lib/Dancer/Cookbook.pod lib/Dancer/Cookie.pm lib/Dancer/Cookies.pm lib/Dancer/Deployment.pod lib/Dancer/Deprecation.pm lib/Dancer/Development.pod lib/Dancer/Development/Integration.pod lib/Dancer/Engine.pm lib/Dancer/Error.pm lib/Dancer/Exception.pm lib/Dancer/Exception/Base.pm lib/Dancer/Factory/Hook.pm lib/Dancer/FileUtils.pm lib/Dancer/GetOpt.pm lib/Dancer/HTTP.pm lib/Dancer/Handler.pm lib/Dancer/Handler/Debug.pm lib/Dancer/Handler/PSGI.pm lib/Dancer/Handler/Standalone.pm lib/Dancer/Hook.pm lib/Dancer/Hook/Properties.pm lib/Dancer/Introduction.pod lib/Dancer/Logger.pm lib/Dancer/Logger/Abstract.pm lib/Dancer/Logger/Capture.pm lib/Dancer/Logger/Capture/Trap.pm lib/Dancer/Logger/Console.pm lib/Dancer/Logger/Diag.pm lib/Dancer/Logger/File.pm lib/Dancer/Logger/Note.pm lib/Dancer/Logger/Null.pm lib/Dancer/MIME.pm lib/Dancer/ModuleLoader.pm lib/Dancer/Object.pm lib/Dancer/Object/Singleton.pm lib/Dancer/Plugin.pm lib/Dancer/Plugin/Ajax.pm lib/Dancer/Plugins.pod lib/Dancer/Policy.pod lib/Dancer/Renderer.pm lib/Dancer/Request.pm lib/Dancer/Request/Upload.pm lib/Dancer/Response.pm lib/Dancer/Route.pm lib/Dancer/Route/Cache.pm lib/Dancer/Route/Registry.pm lib/Dancer/Serializer.pm lib/Dancer/Serializer/Abstract.pm lib/Dancer/Serializer/Dumper.pm lib/Dancer/Serializer/JSON.pm lib/Dancer/Serializer/JSONP.pm lib/Dancer/Serializer/Mutable.pm lib/Dancer/Serializer/XML.pm lib/Dancer/Serializer/YAML.pm lib/Dancer/Session.pm lib/Dancer/Session/Abstract.pm lib/Dancer/Session/Simple.pm lib/Dancer/Session/YAML.pm lib/Dancer/SharedData.pm lib/Dancer/Template.pm lib/Dancer/Template/Abstract.pm lib/Dancer/Template/Simple.pm lib/Dancer/Template/TemplateToolkit.pm lib/Dancer/Test.pm lib/Dancer/Timer.pm lib/Dancer/Tutorial.pod lib/HTTP/Tiny/NoProxy.pm t/00-compile.t t/00-report-prereqs.dd t/00-report-prereqs.t t/00_base/000_create_fake_env.t t/00_base/001_load.t t/00_base/002_strict_and_warnings.t t/00_base/003_syntax.t t/00_base/004_args.t t/00_base/005_module_loader.t t/00_base/007_load_syntax.t t/00_base/008_export.t t/00_base/009_syntax_export.t t/00_base/010_export_script.t t/00_base/06_dancer_object.t t/00_base/08_pod_coverage_dancer.t t/00_base/09_load_app.t t/00_base/11_file_utils.t t/00_base/12_utf8_charset.t t/00_base/13_dancer_singleton.t t/00_base/15_dependent_modules.t t/00_base/17_globalwarnings_config_on.t t/00_base/config.t t/00_base/easymocker.t t/00_base/lib/AppWithError.pm t/00_base/lib/WorkingApp.pm t/00_base/normalize_path.t t/00_base/optional-module-versions.t t/00_base/uri_for.t t/00_base/utf8.tt t/00_base/views/unicode.tt t/01_config/01_settings.t t/01_config/02_mime_type.t t/01_config/03_logger.t t/01_config/04_config_file.t t/01_config/05_serializers.t t/01_config/06_config_api.t t/01_config/06_stack_trace.t t/01_config/07_strict_config.t t/01_config/08_environments.t t/01_config/environments/development.pl t/01_config/yaml_dependency.t t/02_request/000_create_fake_env.t t/02_request/01_load.t t/02_request/04_custom.t t/02_request/04_forward.t t/02_request/05_cgi_pm_compat.t t/02_request/06_init_env.t t/02_request/07_raw_data.t t/02_request/08_param_array.t t/02_request/08_params.t t/02_request/10_mixed_params.t t/02_request/11_accessors.t t/02_request/12_base.t t/02_request/13_ajax.t t/02_request/14_uploads.t t/02_request/15_headers.t t/02_request/16_delete.t t/02_request/17_uri_base.t t/02_request/18_param_accessor.t t/02_request/19_json_body.t t/02_request/20_body.t t/02_request/21_dancer_response_multiple_params.t t/03_route_handler/01_http_methods.t t/03_route_handler/02_params.t t/03_route_handler/03_routes_api.t t/03_route_handler/04_routes_matching.t t/03_route_handler/04_wildcards_megasplat.t t/03_route_handler/05_filter.t t/03_route_handler/05_unicode.t t/03_route_handler/06_redirect.t t/03_route_handler/07_compilation_warning.t t/03_route_handler/08_errors.t t/03_route_handler/12_response.t t/03_route_handler/12_response_halt.t t/03_route_handler/14_options.t t/03_route_handler/15_prefix.t t/03_route_handler/16_caching.t t/03_route_handler/16_embedded_prefixes.t t/03_route_handler/18_auto_page.t t/03_route_handler/21_ajax.t t/03_route_handler/23_filter_error_catching.t t/03_route_handler/24_multiple_params.t t/03_route_handler/24_named_captures.t t/03_route_handler/28_plack_mount.t t/03_route_handler/29_forward.t t/03_route_handler/29_redirect_immediately.t t/03_route_handler/30_forward_session.t t/03_route_handler/31_infinite_loop.t t/03_route_handler/33_vars.t t/03_route_handler/34_forward_body_post.t t/03_route_handler/35_no_further_routes.t t/03_route_handler/36_false_routes.t t/03_route_handler/99_bugs.t t/03_route_handler/public/404.html t/03_route_handler/public/utf8file.txt t/03_route_handler/views/error.tt t/03_route_handler/views/foo/bar.tt t/03_route_handler/views/foo/index.tt t/03_route_handler/views/hello.tt t/04_static_file/001_base.t t/04_static_file/003_mime_types_reinit.t t/04_static_file/01_mime_types.t t/04_static_file/02_dir_traversal.t t/04_static_file/secretfile t/04_static_file/static/hello.foo t/04_static_file/static/hello.txt t/05_views/002_view_rendering.t t/05_views/03_layout.t t/05_views/views/clock.tt t/05_views/views/index.tt t/05_views/views/layouts/custom.tt t/05_views/views/layouts/main.tt t/05_views/views/request.tt t/05_views/views/t03.tt t/05_views/views/vars.tt t/06_helpers/000_create_fake_env.t t/06_helpers/01_send_file.t t/06_helpers/02_http_status.t t/06_helpers/03_content_type.t t/06_helpers/04_status.t t/06_helpers/05_send_error.t t/06_helpers/06_load.t t/06_helpers/public/file.txt t/06_helpers/routes.pl t/07_apphandlers/000_create_fake_env.t t/07_apphandlers/01_base.t t/07_apphandlers/02_apache2_plack.t t/07_apphandlers/03_psgi_app.t t/07_apphandlers/04_standalone_app.t t/07_apphandlers/05_middlewares.t t/07_apphandlers/05_psgi_api.t t/07_apphandlers/06_debug.t t/07_apphandlers/07_middleware_map.t t/07_apphandlers/08_is_text.t t/08_session/000_create_fake_env.t t/08_session/01_load.t t/08_session/02_dependency_check.t t/08_session/03_http_requests.t t/08_session/04_api.t t/08_session/05_yaml.t t/08_session/06_abstract.t t/08_session/07_session_expires.t t/08_session/08_simple.t t/08_session/09_session.t t/08_session/10_filter.t t/08_session/11_session_secure.t t/08_session/12_session_name.t t/08_session/13_session_httponly.t t/08_session/14_session_domain.t t/09_cookies/000_create_fake_env.t t/09_cookies/01_use.t t/09_cookies/02_cookie_object.t t/09_cookies/03_persistence.t t/09_cookies/04_secure.t t/09_cookies/05_api.t t/09_cookies/06_expires.t t/10_template/000_create_fake_env.t t/10_template/01_factory.t t/10_template/02_abstract_class.t t/10_template/03_simple.t t/10_template/05_template_toolkit.t t/10_template/05_template_toolkit_fromdata.t t/10_template/extension.t t/10_template/index.txt t/10_template/template.t t/10_template/views/index.ts t/10_template/views/index.tt t/10_template/views/layouts/main.ts t/10_template/views/layouts/main.tt t/11_logger/000_create_fake_env.t t/11_logger/01_abstract.t t/11_logger/02_factory.t t/11_logger/03_file.t t/11_logger/04_console.t t/11_logger/05_format.t t/11_logger/06_null.t t/11_logger/07_diag.t t/11_logger/08_serialize.t t/11_logger/09_capture.t t/11_logger/10_note.t t/11_logger/11_runtime_file.t t/11_logger/unicode.t t/12_response/000_create_fake_env.t t/12_response/01_CRLF_injection.t t/12_response/02_headers.t t/12_response/03_charset.t t/12_response/04_charset_server.t t/12_response/05_api.t t/12_response/06_filter_halt_status.t t/12_response/07_cookies.t t/12_response/08_drop_content.t t/12_response/09_headers_to_array.t t/12_response/10_error_dumper.t t/12_response/10_error_dumper_without_clone.t t/12_response/11_CVE-2012-5572.t t/13_engines/00_load.t t/13_engines/02_template_init.t t/14_serializer/01_helpers.t t/14_serializer/02_request_json.t t/14_serializer/03_request_yaml.t t/14_serializer/04_request_xml.t t/14_serializer/05_request_mutable.t t/14_serializer/06_api.t t/14_serializer/07_request_jsonp.t t/14_serializer/17_clear_serializer.t t/14_serializer/18_mutable_template_or_serialize.t t/14_serializer/99_bugs.t t/15_plugins/000_create_fake_env.t t/15_plugins/01_register.t t/15_plugins/02_config.t t/15_plugins/03_namespace.t t/15_plugins/04_apps_and_plugins.t t/15_plugins/05_keywords.t t/15_plugins/05_plugins_and_OO.t t/15_plugins/05b_plugins_and_c3.t t/15_plugins/06_hook.t t/15_plugins/07_ajax_plack_builder.t t/16_timer/00_base.t t/17_apps/000_create_fake_env.t t/17_apps/00_base.t t/17_apps/01_settings.t t/17_apps/02_load_app.t t/17_apps/03_prefix.t t/17_apps/05_api.t t/19_dancer/01_script.t t/19_dancer/02_script_version_from.t t/20_deprecation/01_api.t t/21_dependents/Dancer-Session-Cookie.t t/22_hooks/00_syntax.t t/22_hooks/01_api.t t/22_hooks/02_before.t t/22_hooks/03_after.t t/22_hooks/04_template.t t/22_hooks/05_layout.t t/22_hooks/06_serializer.t t/22_hooks/07_file.t t/22_hooks/08_error.t t/22_hooks/09_before_error_init.t t/22_hooks/10_error_in_hook.t t/22_hooks/11_error_in_hook.t t/22_hooks/views/index.tt t/22_hooks/views/layouts/main.tt t/23_dancer_tests/01_basic.t t/23_dancer_tests/02_tests_functions.t t/23_dancer_tests/03_uris.t t/24_deployment/01_multi_webapp.t t/25_exceptions/01_exceptions.t t/25_exceptions/02_exceptions.t t/25_exceptions/03_exceptions.t t/25_exceptions/04_exceptions_warn.t t/25_exceptions/views/error.tt t/25_exceptions/views/index.tt t/25_exceptions/views/layouts/main.tt t/author-pod-syntax.t t/TestAppExt.pm t/TestPlugin.pm t/lib/EasyMocker.pm t/lib/Forum.pm t/lib/FromDataApp.pm t/lib/Hookee.pm t/lib/LinkBlocker.pm t/lib/TestApp.pm t/lib/TestAppUnicode.pm t/lib/TestPlugin.pm t/lib/TestPlugin2.pm t/lib/TestPluginMRO.pm t/lib/TestUtils.pm t/pod.t META.yml100644001750001750 3731215135765170 14275 0ustar00davidpdavidp000000000000Dancer-1.3522--- abstract: 'lightweight yet powerful web application framework' author: - 'Dancer Core Developers' build_requires: Data::Dump: '0' Devel::Hide: '0' Digest::MD5: '0' ExtUtils::MakeMaker: '0' File::Spec: '0' HTTP::CookieJar: '0.008' HTTP::Request: '0' HTTP::Tiny: '0.014' IO::Handle: '0' IO::Socket::INET: '0' IPC::Open3: '0' JSON: '2.90' Plack::Builder: '0' Test::LongString: '0' Test::More: '0' Test::NoWarnings: '0' perl: '5.006' utf8: '0' configure_requires: ExtUtils::MakeMaker: '0' dynamic_config: 0 generated_by: 'Dist::Zilla version 6.025, CPAN::Meta::Converter version 2.150010' license: perl meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html version: '1.4' name: Dancer no_index: directory: - lib/Dancer/HTTP provides: Dancer: file: lib/Dancer.pm version: '1.3522' Dancer::App: file: lib/Dancer/App.pm version: '1.3522' Dancer::Config: file: lib/Dancer/Config.pm version: '1.3522' Dancer::Config::Object: file: lib/Dancer/Config/Object.pm version: '1.3522' Dancer::Continuation: file: lib/Dancer/Continuation.pm version: '1.3522' Dancer::Continuation::Halted: file: lib/Dancer/Continuation/Halted.pm version: '1.3522' Dancer::Continuation::Route: file: lib/Dancer/Continuation/Route.pm version: '1.3522' Dancer::Continuation::Route::ErrorSent: file: lib/Dancer/Continuation/Route/ErrorSent.pm version: '1.3522' Dancer::Continuation::Route::FileSent: file: lib/Dancer/Continuation/Route/FileSent.pm version: '1.3522' Dancer::Continuation::Route::Forwarded: file: lib/Dancer/Continuation/Route/Forwarded.pm version: '1.3522' Dancer::Continuation::Route::Passed: file: lib/Dancer/Continuation/Route/Passed.pm version: '1.3522' Dancer::Continuation::Route::Templated: file: lib/Dancer/Continuation/Route/Templated.pm version: '1.3522' Dancer::Cookie: file: lib/Dancer/Cookie.pm version: '1.3522' Dancer::Cookies: file: lib/Dancer/Cookies.pm version: '1.3522' Dancer::Deprecation: file: lib/Dancer/Deprecation.pm version: '1.3522' Dancer::Engine: file: lib/Dancer/Engine.pm version: '1.3522' Dancer::Error: file: lib/Dancer/Error.pm version: '1.3522' Dancer::Exception: file: lib/Dancer/Exception.pm version: '1.3522' Dancer::Exception::Base: file: lib/Dancer/Exception/Base.pm version: '1.3522' Dancer::Factory::Hook: file: lib/Dancer/Factory/Hook.pm version: '1.3522' Dancer::FileUtils: file: lib/Dancer/FileUtils.pm version: '1.3522' Dancer::GetOpt: file: lib/Dancer/GetOpt.pm version: '1.3522' Dancer::HTTP: file: lib/Dancer/HTTP.pm version: '1.3522' Dancer::Handler: file: lib/Dancer/Handler.pm version: '1.3522' Dancer::Handler::Debug: file: lib/Dancer/Handler/Debug.pm version: '1.3522' Dancer::Handler::PSGI: file: lib/Dancer/Handler/PSGI.pm version: '1.3522' Dancer::Handler::Standalone: file: lib/Dancer/Handler/Standalone.pm version: '1.3522' Dancer::Hook: file: lib/Dancer/Hook.pm version: '1.3522' Dancer::Hook::Properties: file: lib/Dancer/Hook/Properties.pm version: '1.3522' Dancer::Logger: file: lib/Dancer/Logger.pm version: '1.3522' Dancer::Logger::Abstract: file: lib/Dancer/Logger/Abstract.pm version: '1.3522' Dancer::Logger::Capture: file: lib/Dancer/Logger/Capture.pm version: '1.3522' Dancer::Logger::Capture::Trap: file: lib/Dancer/Logger/Capture/Trap.pm version: '1.3522' Dancer::Logger::Console: file: lib/Dancer/Logger/Console.pm version: '1.3522' Dancer::Logger::Diag: file: lib/Dancer/Logger/Diag.pm version: '1.3522' Dancer::Logger::File: file: lib/Dancer/Logger/File.pm version: '1.3522' Dancer::Logger::Note: file: lib/Dancer/Logger/Note.pm version: '1.3522' Dancer::Logger::Null: file: lib/Dancer/Logger/Null.pm version: '1.3522' Dancer::MIME: file: lib/Dancer/MIME.pm version: '1.3522' Dancer::ModuleLoader: file: lib/Dancer/ModuleLoader.pm version: '1.3522' Dancer::Object: file: lib/Dancer/Object.pm version: '1.3522' Dancer::Object::Singleton: file: lib/Dancer/Object/Singleton.pm version: '1.3522' Dancer::Plugin: file: lib/Dancer/Plugin.pm version: '1.3522' Dancer::Plugin::Ajax: file: lib/Dancer/Plugin/Ajax.pm version: '1.3522' Dancer::Renderer: file: lib/Dancer/Renderer.pm version: '1.3522' Dancer::Request: file: lib/Dancer/Request.pm version: '1.3522' Dancer::Request::Upload: file: lib/Dancer/Request/Upload.pm version: '1.3522' Dancer::Response: file: lib/Dancer/Response.pm version: '1.3522' Dancer::Route: file: lib/Dancer/Route.pm version: '1.3522' Dancer::Route::Cache: file: lib/Dancer/Route/Cache.pm version: '1.3522' Dancer::Route::Registry: file: lib/Dancer/Route/Registry.pm version: '1.3522' Dancer::Serializer: file: lib/Dancer/Serializer.pm version: '1.3522' Dancer::Serializer::Abstract: file: lib/Dancer/Serializer/Abstract.pm version: '1.3522' Dancer::Serializer::Dumper: file: lib/Dancer/Serializer/Dumper.pm version: '1.3522' Dancer::Serializer::JSON: file: lib/Dancer/Serializer/JSON.pm version: '1.3522' Dancer::Serializer::JSONP: file: lib/Dancer/Serializer/JSONP.pm version: '1.3522' Dancer::Serializer::Mutable: file: lib/Dancer/Serializer/Mutable.pm version: '1.3522' Dancer::Serializer::XML: file: lib/Dancer/Serializer/XML.pm version: '1.3522' Dancer::Serializer::YAML: file: lib/Dancer/Serializer/YAML.pm version: '1.3522' Dancer::Session: file: lib/Dancer/Session.pm version: '1.3522' Dancer::Session::Abstract: file: lib/Dancer/Session/Abstract.pm version: '1.3522' Dancer::Session::Simple: file: lib/Dancer/Session/Simple.pm version: '1.3522' Dancer::Session::YAML: file: lib/Dancer/Session/YAML.pm version: '1.3522' Dancer::SharedData: file: lib/Dancer/SharedData.pm version: '1.3522' Dancer::Template: file: lib/Dancer/Template.pm version: '1.3522' Dancer::Template::Abstract: file: lib/Dancer/Template/Abstract.pm version: '1.3522' Dancer::Template::Simple: file: lib/Dancer/Template/Simple.pm version: '1.3522' Dancer::Template::TemplateToolkit: file: lib/Dancer/Template/TemplateToolkit.pm version: '1.3522' Dancer::Test: file: lib/Dancer/Test.pm version: '1.3522' Dancer::Timer: file: lib/Dancer/Timer.pm version: '1.3522' HTTP::Tiny::NoProxy: file: lib/HTTP/Tiny/NoProxy.pm version: '1.3522' recommends: MIME::Types: '2.17' YAML: '0' YAML::XS: '0' requires: Carp: '0' Cwd: '0' Data::Dumper: '0' Encode: '0' Exporter: '0' Fcntl: '0' File::Basename: '0' File::Copy: '0' File::Path: '0' File::Spec: '0' File::Spec::Functions: '0' File::Temp: '0' File::stat: '0' FindBin: '0' Getopt::Long: '0' HTTP::Body: '0' HTTP::Date: '0' HTTP::Headers: '0' HTTP::Server::Simple::PSGI: '0' HTTP::Tiny: '0.014' Hash::Merge::Simple: '0' IO::File: '0' MIME::Types: '0' Module::Runtime: '0' POSIX: '0' Pod::Usage: '0' Scalar::Util: '0' Test::Builder: '0' Test::LongString: '0' Test::More: '0' Time::HiRes: '0' Try::Tiny: '0' URI: '0' URI::Escape: '0' base: '0' bytes: '0' constant: '0' lib: '0' overload: '0' parent: '0' strict: '0' vars: '0' warnings: '0' resources: bugtracker: https://github.com/PerlDancer/Dancer/issues homepage: https://github.com/PerlDancer/Dancer repository: https://github.com/PerlDancer/Dancer.git version: '1.3522' x_authority: cpan:SUKRIA x_contributors: - '1nickt ' - 'a-adam ' - 'Achim Adam ' - 'Adam J. Foxson ' - 'Adam Kennedy ' - 'Akash Ayare ' - 'alambike ' - 'Alan Haggai Alavi ' - 'Alberto Simões ' - 'Alessandro Ranellucci ' - 'Alex C ' - 'Alexis Sukrieh ' - 'Alex Kalderimis ' - 'Alex Kapranoff ' - 'Alex Peters ' - 'Alfie John ' - 'Al Newkirk ' - 'Al Newkirk ' - 'Andrew Beverley ' - 'andy ' - 'Anirvan Chatterjee ' - 'Anton Gerasimov ' - 'asergei ' - 'Ashley Willis ' - 'A. Sinan Unur ' - 'Ask Bjørn Hansen ' - 'Assaf Gordon ' - 'Ben Hutton ' - 'Bernhard Reutner-Fischer ' - 'boris shomodjvarac ' - 'Brad Macpherson ' - 'Breno G. de Oliveira ' - 'Brian E. Lozier ' - 'Brian Hann ' - 'Brian Phillips ' - 'burnersk ' - 'Chris Andrews ' - 'chrisjrob ' - 'Chris Seymour ' - 'Christian Walde ' - 'chromatic ' - 'Colin Keith ' - 'Colin Kuskie ' - 'CPAN Service ' - 'Craig Treptow ' - 'Dagfinn Ilmari Mannsåker ' - 'Damien Krotkine ' - 'Damien Krotkine ' - 'Damyan Ivanov ' - 'Dan Book ' - 'Dan Book ' - 'Danijel Tasov ' - 'Dave Doyle ' - 'David Cantrell ' - 'David Golden ' - 'David Moreno ' - 'David Precious ' - 'David Steinbrunner ' - 'David Zurborg ' - 'Dennis Lichtenthaeler ' - 'Duncan Hutty ' - 'Emmanuel Rodriguez ' - 'Eugen Konkov ' - 'Fabrice Gabolde ' - 'Fabrice Gabolde ' - 'Fabrice Gabolde ' - 'Fayland Lam ' - 'Felix Dorner ' - 'Flavio Poletti ' - 'Florian Larysch ' - 'Florian Sojer ' - 'Franck Cuny ' - 'François Charlier ' - 'François Charlier ' - 'Gabor Szabo ' - 'Gary Mullen ' - 'geistteufel ' - 'Gil Magno ' - 'Gonzalo Barco ' - 'Graham Knop ' - 'Grzegorz Rożniecki ' - 'Hagen Fuchs ' - 'Hans Dieter Pearcey ' - 'Ilmari Vacklin ' - 'Ilya Chesnokov ' - 'isync ' - 'Ivan Bessarabov ' - 'Ivan Paponov ' - 'Jacob Rideout ' - 'Jakob Voss ' - 'jamhed ' - 'jamhed ' - 'Jason A. Crome ' - 'Jess ' - 'Jesse van Herk ' - 'Jochen Lutz ' - 'Joel Roth ' - 'John Barrett ' - 'John Wittkoski ' - 'jonasreinsch ' - 'Jonathan "Duke" Leto ' - 'Jonathan Hall ' - 'Jonathan Otsuka ' - 'jonathan schatz ' - 'Jonathan Scott Duff ' - 'Josh Rabinowitz ' - 'Joshua Barratt ' - 'JT Smith ' - 'Juan J. Martínez ' - 'Jury Gorky ' - 'Kaitlyn Parkhurst ' - 'Kent Fredric ' - 'Kirk Kimmel ' - 'Lars Thegler ' - 'Lee Carmichael ' - 'Lee Johnson ' - 'LoonyPandora ' - 'Manuel Weiss ' - 'Marc Chantreux ' - 'Mark Allen ' - 'Mark A. Stratman ' - 'Mark Stosberg ' - 'Martin Schut ' - 'Matthew Horsfall (alh) ' - 'Maxim Ivanov ' - 'Max Maischein ' - 'Michael Genereux ' - 'Michael G. Schwern ' - 'Michael McClennen ' - 'Michal Wojciechowski ' - 'Mikolaj Kucharski ' - 'miyagawa ' - 'mlbarrow ' - 'Mohammad S Anwar ' - 'mokko ' - 'Murray ' - 'Natal Ngétal ' - 'Nate Jones ' - 'Naveed Massjouni ' - 'Naveed Massjouni ' - 'Naveed ' - 'Naveen ' - 'Neil Hooey ' - 'Nick Tonkin <1nickt@users.noreply.github.com>' - 'Nicolas Oudard ' - 'niko ' - 'Nuno Carvalho ' - 'Oliver Gorwits ' - 'Olivier Mengué ' - 'Olof Johansson ' - 'Ovid ' - 'Paul Driver ' - 'Paul Fenwick ' - 'Paul Johnson ' - 'Paul Tomlin ' - 'pdl ' - 'Pedro Melo ' - 'Perlover ' - 'Phil Carmody ' - 'Philippe Bruhat (BooK) ' - 'ppisar ' - 'Richard Simões ' - 'Rick Myers ' - 'Rik Brown ' - 'Roberto Patriarca ' - 'Roman Nuritdinov ' - 'rowanthorpe ' - 'Russell Jenkins ' - 'Sam Kington ' - 'Sapphire Paw ' - 'Sawyer X ' - 'scoopio ' - 'Scott Penrose ' - 'sdeseille ' - 'Sean Smith ' - 'Sebastian de Castelberg ' - 'Skeeve ' - 'Slaven Rezic ' - 'Sniperovitch ' - 'Squeeks ' - 'Stefan Hornburg (Racke) ' - 'Steve Hay ' - 'Tatsuhiko Miyagawa ' - 'tednolan ' - 'Tim Gim Yee ' - 'Tim King ' - 'Tom Heady ' - 'Tom Hukins ' - 'Tom Wyant ' - 'Vyacheslav Matyukhin ' - 'William Wolf ' - 'Yanick Champoux ' - 'YOUR_NAME ' - 'Zefram ' x_generated_by_perl: v5.32.1 x_serialization_backend: 'YAML::Tiny version 1.73' x_spdx_expression: 'Artistic-1.0-Perl OR GPL-1.0-or-later' cpanfile100644001750001750 462115135765170 14505 0ustar00davidpdavidp000000000000Dancer-1.3522# This file is generated by Dist::Zilla::Plugin::CPANFile v6.025 # Do not edit this file directly. To change prereqs, edit the `dist.ini` file. requires "Carp" => "0"; requires "Cwd" => "0"; requires "Data::Dumper" => "0"; requires "Encode" => "0"; requires "Exporter" => "0"; requires "Fcntl" => "0"; requires "File::Basename" => "0"; requires "File::Copy" => "0"; requires "File::Path" => "0"; requires "File::Spec" => "0"; requires "File::Spec::Functions" => "0"; requires "File::Temp" => "0"; requires "File::stat" => "0"; requires "FindBin" => "0"; requires "Getopt::Long" => "0"; requires "HTTP::Body" => "0"; requires "HTTP::Date" => "0"; requires "HTTP::Headers" => "0"; requires "HTTP::Server::Simple::PSGI" => "0"; requires "HTTP::Tiny" => "0.014"; requires "Hash::Merge::Simple" => "0"; requires "IO::File" => "0"; requires "MIME::Types" => "0"; requires "Module::Runtime" => "0"; requires "POSIX" => "0"; requires "Pod::Usage" => "0"; requires "Scalar::Util" => "0"; requires "Test::Builder" => "0"; requires "Test::LongString" => "0"; requires "Test::More" => "0"; requires "Time::HiRes" => "0"; requires "Try::Tiny" => "0"; requires "URI" => "0"; requires "URI::Escape" => "0"; requires "base" => "0"; requires "bytes" => "0"; requires "constant" => "0"; requires "lib" => "0"; requires "overload" => "0"; requires "parent" => "0"; requires "strict" => "0"; requires "vars" => "0"; requires "warnings" => "0"; recommends "MIME::Types" => "2.17"; recommends "YAML" => "0"; recommends "YAML::XS" => "0"; on 'test' => sub { requires "Data::Dump" => "0"; requires "Devel::Hide" => "0"; requires "Digest::MD5" => "0"; requires "ExtUtils::MakeMaker" => "0"; requires "File::Spec" => "0"; requires "HTTP::CookieJar" => "0.008"; requires "HTTP::Request" => "0"; requires "HTTP::Tiny" => "0.014"; requires "IO::Handle" => "0"; requires "IO::Socket::INET" => "0"; requires "IPC::Open3" => "0"; requires "JSON" => "2.90"; requires "Plack::Builder" => "0"; requires "Test::LongString" => "0"; requires "Test::More" => "0"; requires "Test::NoWarnings" => "0"; requires "perl" => "5.006"; requires "utf8" => "0"; }; on 'test' => sub { recommends "CPAN::Meta" => "2.120900"; }; on 'configure' => sub { requires "ExtUtils::MakeMaker" => "0"; }; on 'configure' => sub { suggests "JSON::PP" => "2.27300"; }; on 'develop' => sub { requires "Test::CPAN::Meta" => "0"; requires "Test::Pod" => "1.41"; }; doap.xml100644001750001750 21752315135765170 14515 0ustar00davidpdavidp000000000000Dancer-1.3522 Dancer lightweight yet powerful web application framework 1nickt a-adam Achim Adam Adam J. Foxson Adam Kennedy Akash Ayare alambike Alan Haggai Alavi Alberto Simões Alessandro Ranellucci Alex C Alexis Sukrieh Alex Kalderimis Alex Kapranoff Alex Peters Alfie John Al Newkirk Al Newkirk Andrew Beverley andy Anirvan Chatterjee Anton Gerasimov asergei Ashley Willis A. Sinan Unur Ask Bjørn Hansen Assaf Gordon Ben Hutton Bernhard Reutner-Fischer boris shomodjvarac Brad Macpherson Breno G. de Oliveira Brian E. Lozier Brian Hann Brian Phillips burnersk Chris Andrews chrisjrob Chris Seymour Christian Walde chromatic Colin Keith Colin Kuskie CPAN Service Craig Treptow Dagfinn Ilmari Mannsåker Damien Krotkine Damien Krotkine Damyan Ivanov Dan Book Dan Book Danijel Tasov Dave Doyle David Cantrell David Golden David Moreno David Precious David Steinbrunner David Zurborg Dennis Lichtenthaeler Duncan Hutty Emmanuel Rodriguez Eugen Konkov Fabrice Gabolde Fabrice Gabolde Fabrice Gabolde Fayland Lam Felix Dorner Flavio Poletti Florian Larysch Florian Sojer Franck Cuny François Charlier François Charlier Gabor Szabo Gary Mullen geistteufel Gil Magno Gonzalo Barco Graham Knop Grzegorz Rożniecki Hagen Fuchs Hans Dieter Pearcey Ilmari Vacklin Ilya Chesnokov isync Ivan Bessarabov Ivan Paponov Jacob Rideout Jakob Voss jamhed jamhed Jason A. Crome Jess Jesse van Herk Jochen Lutz Joel Roth John Barrett John Wittkoski jonasreinsch Jonathan "Duke" Leto Jonathan Hall Jonathan Otsuka jonathan schatz Jonathan Scott Duff Josh Rabinowitz Joshua Barratt JT Smith Juan J. Martínez Jury Gorky Kaitlyn Parkhurst Kent Fredric Kirk Kimmel Lars Thegler Lee Carmichael Lee Johnson LoonyPandora Manuel Weiss Marc Chantreux Mark Allen Mark A. Stratman Mark Stosberg Martin Schut Matthew Horsfall alh Maxim Ivanov Max Maischein Michael Genereux Michael G. Schwern Michael McClennen Michal Wojciechowski Mikolaj Kucharski miyagawa mlbarrow Mohammad S Anwar mokko Murray Natal Ngétal Nate Jones Naveed Massjouni Naveed Massjouni Naveed Naveen Neil Hooey Nick Tonkin Nicolas Oudard niko Nuno Carvalho Oliver Gorwits Olivier Mengué Olof Johansson Ovid Paul Driver Paul Fenwick Paul Johnson Paul Tomlin pdl Pedro Melo Perlover Phil Carmody Philippe Bruhat BooK ppisar Richard Simões Rick Myers Rik Brown Roberto Patriarca Roman Nuritdinov rowanthorpe Russell Jenkins Sam Kington Sapphire Paw Sawyer X scoopio Scott Penrose sdeseille Sean Smith Sebastian de Castelberg Skeeve Slaven Rezic Sniperovitch Squeeks Stefan Hornburg Racke Steve Hay Tatsuhiko Miyagawa tednolan Tim Gim Yee Tim King Tom Heady Tom Hukins Tom Wyant Vyacheslav Matyukhin William Wolf Yanick Champoux YOUR_NAME Zefram 0.9003 2009-01-01 0.9004 2009-01-01 0.9005 2009-01-01 0.9906 2009-01-01 1.000 2009-01-01 1.100 2009-01-01 1.110 2010-01-11 1.120 2010-01-15 1.121 2010-01-15 1.122 2010-01-16 1.130 2010-01-29 1.140 2010-02-09 1.150 2010-02-17 1.160 2010-03-07 1.170 2010-03-24 1.171 2010-03-24 1.172 2010-03-28 1.173 2010-04-04 1.173_01 2010-04-04 1.174 2010-04-08 1.175 2010-04-11 1.175_01 2010-04-19 1.176 2010-04-22 1.178_01 2010-05-05 1.178_02 2010-05-11 1.1800 2010-05-16 1.1801 2010-05-19 1.1802 2010-05-19 1.1803 2010-05-23 1.1804 2010-06-18 1.1805 2010-06-22 1.1806_01 2010-08-15 1.1806_02 2010-08-16 1.1807 2010-08-23 1.1808 2010-08-24 1.1809 2010-08-25 1.1810 2010-09-01 1.1811 2010-09-03 1.1812 2010-09-21 1.1901 2010-09-24 1.1902 2010-11-02 1.1903 2011-01-27 1.1904 2011-01-27 1.1999_01 2010-10-14 1.1999_02 2010-10-15 1.1999_03 2010-11-11 1.1999_04 2010-11-14 1.2000 2011-01-27 1.2001 2010-11-30 1.2001_01 2010-12-02 1.2002 2011-01-27 1.2002_01 2010-12-07 1.2002_02 2010-12-08 1.2003 2010-12-10 1.3000_01 2010-12-22 1.3000_02 2011-01-03 1.3001 2011-01-27 1.3002 2011-02-02 1.3003 2011 1.3010 2011 1.3010_01 2011 1.3011 2011 1.3012 2011-03-01 1.3013 2011-03-01 1.3014 2011-03-04 1.3014_01 2011-03-10 1.3019_01 2011-03-13 1.3019_02 2011-03-14 1.3020 2011-03-21 1.3029_01 2011-04-01 1.3029_02 2011-04-08 1.3029_03 2011-04-10 1.3030 2011-04-13 1.3039_01 2011-04-27 1.3040 2011-05-01 1.3049_01 2011-05-14 1.3050 2011-05-20 1.3051 2011-05-27 1.3059_01 2011-05-27 1.3059_02 2011-05-29 1.3059_03 2011-06-11 1.3059_04 2011-06-12 1.3060 2011-06-15 1.3069_01 2011-07-07 1.3069_02 2011-07-10 1.3070 2011-07-14 1.3071 2011-07-26 1.3072 2011-08-23 1.3079_01 2011-08-17 1.3079_02 2011-08-28 1.3079_03 2011-09-10 1.3079_04 2011-10-02 1.3079_05 2011-10-02 1.3080 2011-10-25 1.3089_01 2011-11-26 1.3090 2011-12-13 1.3091 2011-12-17 1.3092 2012-01-27 1.3093 2012-02-29 1.3094 2012-03-31 1.3095 2012-04-01 1.3095_01 2012-06-22 1.3095_02 2012-07-03 1.3096 2012-07-06 1.3097 2012-07-08 1.3098 2012-07-28 1.3099 2012-08-11 1.3100 2012-08-25 1.3110 2012-10-06 1.3111 2013-02-24 1.3111_01 2013-03-30 1.3111_02 2013-04-01 1.3112 2013-04-10 1.3113 2013-05-08 1.3114 2013-06-02 1.3115 2013-06-09 1.3116 2013-07-03 1.3117 2013-07-31 1.3118 2013-09-01 1.3119 2013-10-26 1.3120 2013-12-24 1.3121 2014-02-02 1.3122 2014-04-10 1.3123 2014-04-12 1.3124 2014-05-09 1.3125 2014-07-12 1.3126 2014-07-14 1.3127 2014-09-08 1.3128 2014-09-09 1.3129 2014-09-09 1.3130 2014-09-15 1.3131_0 2014-10-11 1.3131_1 2014-10-13 1.3132 2014-10-20 1.3133 2014-11-26 1.3134 2015-02-22 1.3135 2015-04-22 1.3136 2015-05-24 1.3137 2015-06-05 1.3138 2015-06-12 1.3139 2015-06-25 1.3140 2015-07-03 1.3141 2015-09-07 1.3142 2015-09-14 1.3143 2015-10-26 1.3144 2015-11-04 1.3200 2015-11-06 1.3201 2015-11-07 1.3202 2015-11-07 1.3203 2018-05-20T20:44:30+01:00 1.3204 2018-05-23T14:40:33+01:00 1.3205 2018-06-13T22:59:32+01:00 1.3300 2016-02-15 1.3301 2016-02-16 1.3400 2018-06-15T23:08:34+01:00 1.3401 2018-10-01T12:49:53+01:00 1.3402 2018-10-10T11:42:07+01:00 1.3403 2018-10-11T23:41:11+01:00 1.3500 2018-10-12T21:31:46+01:00 1.3501 2019-03-14T19:19:49+00:00 1.3510 2019-03-19T14:42:26+00:00 1.3511 2019-03-29T11:16:08+00:00 1.3512 2019-03-31T20:10:08+01:00 1.3513 2020-01-29T21:00:41+00:00 1.3514 2020-06-29T17:38:54+01:00 1.3514_02 2020-10-02T21:39:34+01:00 1.3514_03 2020-10-06T22:22:51+01:00 1.3514_04 2022-06-29T22:38:57+01:00 1.3520 2023-01-01 1.3521 2023-02-05 Perl META.json100644001750001750 5117115135765170 14444 0ustar00davidpdavidp000000000000Dancer-1.3522{ "abstract" : "lightweight yet powerful web application framework", "author" : [ "Dancer Core Developers" ], "dynamic_config" : 0, "generated_by" : "Dist::Zilla version 6.025, CPAN::Meta::Converter version 2.150010", "license" : [ "perl_5" ], "meta-spec" : { "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", "version" : 2 }, "name" : "Dancer", "no_index" : { "directory" : [ "lib/Dancer/HTTP" ] }, "prereqs" : { "configure" : { "requires" : { "ExtUtils::MakeMaker" : "0" }, "suggests" : { "JSON::PP" : "2.27300" } }, "develop" : { "requires" : { "Test::CPAN::Meta" : "0", "Test::Pod" : "1.41" } }, "runtime" : { "recommends" : { "MIME::Types" : "2.17", "YAML" : "0", "YAML::XS" : "0" }, "requires" : { "Carp" : "0", "Cwd" : "0", "Data::Dumper" : "0", "Encode" : "0", "Exporter" : "0", "Fcntl" : "0", "File::Basename" : "0", "File::Copy" : "0", "File::Path" : "0", "File::Spec" : "0", "File::Spec::Functions" : "0", "File::Temp" : "0", "File::stat" : "0", "FindBin" : "0", "Getopt::Long" : "0", "HTTP::Body" : "0", "HTTP::Date" : "0", "HTTP::Headers" : "0", "HTTP::Server::Simple::PSGI" : "0", "HTTP::Tiny" : "0.014", "Hash::Merge::Simple" : "0", "IO::File" : "0", "MIME::Types" : "0", "Module::Runtime" : "0", "POSIX" : "0", "Pod::Usage" : "0", "Scalar::Util" : "0", "Test::Builder" : "0", "Test::LongString" : "0", "Test::More" : "0", "Time::HiRes" : "0", "Try::Tiny" : "0", "URI" : "0", "URI::Escape" : "0", "base" : "0", "bytes" : "0", "constant" : "0", "lib" : "0", "overload" : "0", "parent" : "0", "strict" : "0", "vars" : "0", "warnings" : "0" } }, "test" : { "recommends" : { "CPAN::Meta" : "2.120900" }, "requires" : { "Data::Dump" : "0", "Devel::Hide" : "0", "Digest::MD5" : "0", "ExtUtils::MakeMaker" : "0", "File::Spec" : "0", "HTTP::CookieJar" : "0.008", "HTTP::Request" : "0", "HTTP::Tiny" : "0.014", "IO::Handle" : "0", "IO::Socket::INET" : "0", "IPC::Open3" : "0", "JSON" : "2.90", "Plack::Builder" : "0", "Test::LongString" : "0", "Test::More" : "0", "Test::NoWarnings" : "0", "perl" : "5.006", "utf8" : "0" } } }, "provides" : { "Dancer" : { "file" : "lib/Dancer.pm", "version" : "1.3522" }, "Dancer::App" : { "file" : "lib/Dancer/App.pm", "version" : "1.3522" }, "Dancer::Config" : { "file" : "lib/Dancer/Config.pm", "version" : "1.3522" }, "Dancer::Config::Object" : { "file" : "lib/Dancer/Config/Object.pm", "version" : "1.3522" }, "Dancer::Continuation" : { "file" : "lib/Dancer/Continuation.pm", "version" : "1.3522" }, "Dancer::Continuation::Halted" : { "file" : "lib/Dancer/Continuation/Halted.pm", "version" : "1.3522" }, "Dancer::Continuation::Route" : { "file" : "lib/Dancer/Continuation/Route.pm", "version" : "1.3522" }, "Dancer::Continuation::Route::ErrorSent" : { "file" : "lib/Dancer/Continuation/Route/ErrorSent.pm", "version" : "1.3522" }, "Dancer::Continuation::Route::FileSent" : { "file" : "lib/Dancer/Continuation/Route/FileSent.pm", "version" : "1.3522" }, "Dancer::Continuation::Route::Forwarded" : { "file" : "lib/Dancer/Continuation/Route/Forwarded.pm", "version" : "1.3522" }, "Dancer::Continuation::Route::Passed" : { "file" : "lib/Dancer/Continuation/Route/Passed.pm", "version" : "1.3522" }, "Dancer::Continuation::Route::Templated" : { "file" : "lib/Dancer/Continuation/Route/Templated.pm", "version" : "1.3522" }, "Dancer::Cookie" : { "file" : "lib/Dancer/Cookie.pm", "version" : "1.3522" }, "Dancer::Cookies" : { "file" : "lib/Dancer/Cookies.pm", "version" : "1.3522" }, "Dancer::Deprecation" : { "file" : "lib/Dancer/Deprecation.pm", "version" : "1.3522" }, "Dancer::Engine" : { "file" : "lib/Dancer/Engine.pm", "version" : "1.3522" }, "Dancer::Error" : { "file" : "lib/Dancer/Error.pm", "version" : "1.3522" }, "Dancer::Exception" : { "file" : "lib/Dancer/Exception.pm", "version" : "1.3522" }, "Dancer::Exception::Base" : { "file" : "lib/Dancer/Exception/Base.pm", "version" : "1.3522" }, "Dancer::Factory::Hook" : { "file" : "lib/Dancer/Factory/Hook.pm", "version" : "1.3522" }, "Dancer::FileUtils" : { "file" : "lib/Dancer/FileUtils.pm", "version" : "1.3522" }, "Dancer::GetOpt" : { "file" : "lib/Dancer/GetOpt.pm", "version" : "1.3522" }, "Dancer::HTTP" : { "file" : "lib/Dancer/HTTP.pm", "version" : "1.3522" }, "Dancer::Handler" : { "file" : "lib/Dancer/Handler.pm", "version" : "1.3522" }, "Dancer::Handler::Debug" : { "file" : "lib/Dancer/Handler/Debug.pm", "version" : "1.3522" }, "Dancer::Handler::PSGI" : { "file" : "lib/Dancer/Handler/PSGI.pm", "version" : "1.3522" }, "Dancer::Handler::Standalone" : { "file" : "lib/Dancer/Handler/Standalone.pm", "version" : "1.3522" }, "Dancer::Hook" : { "file" : "lib/Dancer/Hook.pm", "version" : "1.3522" }, "Dancer::Hook::Properties" : { "file" : "lib/Dancer/Hook/Properties.pm", "version" : "1.3522" }, "Dancer::Logger" : { "file" : "lib/Dancer/Logger.pm", "version" : "1.3522" }, "Dancer::Logger::Abstract" : { "file" : "lib/Dancer/Logger/Abstract.pm", "version" : "1.3522" }, "Dancer::Logger::Capture" : { "file" : "lib/Dancer/Logger/Capture.pm", "version" : "1.3522" }, "Dancer::Logger::Capture::Trap" : { "file" : "lib/Dancer/Logger/Capture/Trap.pm", "version" : "1.3522" }, "Dancer::Logger::Console" : { "file" : "lib/Dancer/Logger/Console.pm", "version" : "1.3522" }, "Dancer::Logger::Diag" : { "file" : "lib/Dancer/Logger/Diag.pm", "version" : "1.3522" }, "Dancer::Logger::File" : { "file" : "lib/Dancer/Logger/File.pm", "version" : "1.3522" }, "Dancer::Logger::Note" : { "file" : "lib/Dancer/Logger/Note.pm", "version" : "1.3522" }, "Dancer::Logger::Null" : { "file" : "lib/Dancer/Logger/Null.pm", "version" : "1.3522" }, "Dancer::MIME" : { "file" : "lib/Dancer/MIME.pm", "version" : "1.3522" }, "Dancer::ModuleLoader" : { "file" : "lib/Dancer/ModuleLoader.pm", "version" : "1.3522" }, "Dancer::Object" : { "file" : "lib/Dancer/Object.pm", "version" : "1.3522" }, "Dancer::Object::Singleton" : { "file" : "lib/Dancer/Object/Singleton.pm", "version" : "1.3522" }, "Dancer::Plugin" : { "file" : "lib/Dancer/Plugin.pm", "version" : "1.3522" }, "Dancer::Plugin::Ajax" : { "file" : "lib/Dancer/Plugin/Ajax.pm", "version" : "1.3522" }, "Dancer::Renderer" : { "file" : "lib/Dancer/Renderer.pm", "version" : "1.3522" }, "Dancer::Request" : { "file" : "lib/Dancer/Request.pm", "version" : "1.3522" }, "Dancer::Request::Upload" : { "file" : "lib/Dancer/Request/Upload.pm", "version" : "1.3522" }, "Dancer::Response" : { "file" : "lib/Dancer/Response.pm", "version" : "1.3522" }, "Dancer::Route" : { "file" : "lib/Dancer/Route.pm", "version" : "1.3522" }, "Dancer::Route::Cache" : { "file" : "lib/Dancer/Route/Cache.pm", "version" : "1.3522" }, "Dancer::Route::Registry" : { "file" : "lib/Dancer/Route/Registry.pm", "version" : "1.3522" }, "Dancer::Serializer" : { "file" : "lib/Dancer/Serializer.pm", "version" : "1.3522" }, "Dancer::Serializer::Abstract" : { "file" : "lib/Dancer/Serializer/Abstract.pm", "version" : "1.3522" }, "Dancer::Serializer::Dumper" : { "file" : "lib/Dancer/Serializer/Dumper.pm", "version" : "1.3522" }, "Dancer::Serializer::JSON" : { "file" : "lib/Dancer/Serializer/JSON.pm", "version" : "1.3522" }, "Dancer::Serializer::JSONP" : { "file" : "lib/Dancer/Serializer/JSONP.pm", "version" : "1.3522" }, "Dancer::Serializer::Mutable" : { "file" : "lib/Dancer/Serializer/Mutable.pm", "version" : "1.3522" }, "Dancer::Serializer::XML" : { "file" : "lib/Dancer/Serializer/XML.pm", "version" : "1.3522" }, "Dancer::Serializer::YAML" : { "file" : "lib/Dancer/Serializer/YAML.pm", "version" : "1.3522" }, "Dancer::Session" : { "file" : "lib/Dancer/Session.pm", "version" : "1.3522" }, "Dancer::Session::Abstract" : { "file" : "lib/Dancer/Session/Abstract.pm", "version" : "1.3522" }, "Dancer::Session::Simple" : { "file" : "lib/Dancer/Session/Simple.pm", "version" : "1.3522" }, "Dancer::Session::YAML" : { "file" : "lib/Dancer/Session/YAML.pm", "version" : "1.3522" }, "Dancer::SharedData" : { "file" : "lib/Dancer/SharedData.pm", "version" : "1.3522" }, "Dancer::Template" : { "file" : "lib/Dancer/Template.pm", "version" : "1.3522" }, "Dancer::Template::Abstract" : { "file" : "lib/Dancer/Template/Abstract.pm", "version" : "1.3522" }, "Dancer::Template::Simple" : { "file" : "lib/Dancer/Template/Simple.pm", "version" : "1.3522" }, "Dancer::Template::TemplateToolkit" : { "file" : "lib/Dancer/Template/TemplateToolkit.pm", "version" : "1.3522" }, "Dancer::Test" : { "file" : "lib/Dancer/Test.pm", "version" : "1.3522" }, "Dancer::Timer" : { "file" : "lib/Dancer/Timer.pm", "version" : "1.3522" }, "HTTP::Tiny::NoProxy" : { "file" : "lib/HTTP/Tiny/NoProxy.pm", "version" : "1.3522" } }, "release_status" : "stable", "resources" : { "bugtracker" : { "web" : "https://github.com/PerlDancer/Dancer/issues" }, "homepage" : "https://github.com/PerlDancer/Dancer", "repository" : { "type" : "git", "url" : "https://github.com/PerlDancer/Dancer.git", "web" : "https://github.com/PerlDancer/Dancer" } }, "version" : "1.3522", "x_authority" : "cpan:SUKRIA", "x_contributors" : [ "1nickt ", "a-adam ", "Achim Adam ", "Adam J. Foxson ", "Adam Kennedy ", "Akash Ayare ", "alambike ", "Alan Haggai Alavi ", "Alberto Sim\u00f5es ", "Alessandro Ranellucci ", "Alex C ", "Alexis Sukrieh ", "Alex Kalderimis ", "Alex Kapranoff ", "Alex Peters ", "Alfie John ", "Al Newkirk ", "Al Newkirk ", "Andrew Beverley ", "andy ", "Anirvan Chatterjee ", "Anton Gerasimov ", "asergei ", "Ashley Willis ", "A. Sinan Unur ", "Ask Bj\u00f8rn Hansen ", "Assaf Gordon ", "Ben Hutton ", "Bernhard Reutner-Fischer ", "boris shomodjvarac ", "Brad Macpherson ", "Breno G. de Oliveira ", "Brian E. Lozier ", "Brian Hann ", "Brian Phillips ", "burnersk ", "Chris Andrews ", "chrisjrob ", "Chris Seymour ", "Christian Walde ", "chromatic ", "Colin Keith ", "Colin Kuskie ", "CPAN Service ", "Craig Treptow ", "Dagfinn Ilmari Manns\u00e5ker ", "Damien Krotkine ", "Damien Krotkine ", "Damyan Ivanov ", "Dan Book ", "Dan Book ", "Danijel Tasov ", "Dave Doyle ", "David Cantrell ", "David Golden ", "David Moreno ", "David Precious ", "David Steinbrunner ", "David Zurborg ", "Dennis Lichtenthaeler ", "Duncan Hutty ", "Emmanuel Rodriguez ", "Eugen Konkov ", "Fabrice Gabolde ", "Fabrice Gabolde ", "Fabrice Gabolde ", "Fayland Lam ", "Felix Dorner ", "Flavio Poletti ", "Florian Larysch ", "Florian Sojer ", "Franck Cuny ", "Fran\u00e7ois Charlier ", "Fran\u00e7ois Charlier ", "Gabor Szabo ", "Gary Mullen ", "geistteufel ", "Gil Magno ", "Gonzalo Barco ", "Graham Knop ", "Grzegorz Ro\u017cniecki ", "Hagen Fuchs ", "Hans Dieter Pearcey ", "Ilmari Vacklin ", "Ilya Chesnokov ", "isync ", "Ivan Bessarabov ", "Ivan Paponov ", "Jacob Rideout ", "Jakob Voss ", "jamhed ", "jamhed ", "Jason A. Crome ", "Jess ", "Jesse van Herk ", "Jochen Lutz ", "Joel Roth ", "John Barrett ", "John Wittkoski ", "jonasreinsch ", "Jonathan \"Duke\" Leto ", "Jonathan Hall ", "Jonathan Otsuka ", "jonathan schatz ", "Jonathan Scott Duff ", "Josh Rabinowitz ", "Joshua Barratt ", "JT Smith ", "Juan J. Mart\u00ednez ", "Jury Gorky ", "Kaitlyn Parkhurst ", "Kent Fredric ", "Kirk Kimmel ", "Lars Thegler ", "Lee Carmichael ", "Lee Johnson ", "LoonyPandora ", "Manuel Weiss ", "Marc Chantreux ", "Mark Allen ", "Mark A. Stratman ", "Mark Stosberg ", "Martin Schut ", "Matthew Horsfall (alh) ", "Maxim Ivanov ", "Max Maischein ", "Michael Genereux ", "Michael G. Schwern ", "Michael McClennen ", "Michal Wojciechowski ", "Mikolaj Kucharski ", "miyagawa ", "mlbarrow ", "Mohammad S Anwar ", "mokko ", "Murray ", "Natal Ng\u00e9tal ", "Nate Jones ", "Naveed Massjouni ", "Naveed Massjouni ", "Naveed ", "Naveen ", "Neil Hooey ", "Nick Tonkin <1nickt@users.noreply.github.com>", "Nicolas Oudard ", "niko ", "Nuno Carvalho ", "Oliver Gorwits ", "Olivier Mengu\u00e9 ", "Olof Johansson ", "Ovid ", "Paul Driver ", "Paul Fenwick ", "Paul Johnson ", "Paul Tomlin ", "pdl ", "Pedro Melo ", "Perlover ", "Phil Carmody ", "Philippe Bruhat (BooK) ", "ppisar ", "Richard Sim\u00f5es ", "Rick Myers ", "Rik Brown ", "Roberto Patriarca ", "Roman Nuritdinov ", "rowanthorpe ", "Russell Jenkins ", "Sam Kington ", "Sapphire Paw ", "Sawyer X ", "scoopio ", "Scott Penrose ", "sdeseille ", "Sean Smith ", "Sebastian de Castelberg ", "Skeeve ", "Slaven Rezic ", "Sniperovitch ", "Squeeks ", "Stefan Hornburg (Racke) ", "Steve Hay ", "Tatsuhiko Miyagawa ", "tednolan ", "Tim Gim Yee ", "Tim King ", "Tom Heady ", "Tom Hukins ", "Tom Wyant ", "Vyacheslav Matyukhin ", "William Wolf ", "Yanick Champoux ", "YOUR_NAME ", "Zefram " ], "x_generated_by_perl" : "v5.32.1", "x_serialization_backend" : "Cpanel::JSON::XS version 4.37", "x_spdx_expression" : "Artistic-1.0-Perl OR GPL-1.0-or-later" } SIGNATURE100644001750001750 11061515135765170 14326 0ustar00davidpdavidp000000000000Dancer-1.3522This file contains message digests of all files listed in MANIFEST, signed via the Module::Signature module, version 0.87. To verify the content in this distribution, first make sure you have Module::Signature installed, then type: % cpansign -v It will check each file's integrity, as well as the signature's validity. If "==> Signature verified OK! <==" is not displayed, the distribution may already have been compromised, and you should not run its Makefile.PL or Build.PL. -----BEGIN PGP SIGNED MESSAGE----- Hash: RIPEMD160 SHA256 c5238c6f0f27863c35fb04d893849838aa8a7e97c148e43dcec30f512a47fae3 AUTHORS SHA256 dd60c44090f6e33e075866cbc2f3b84b41852bc27bed529b31919442d2c4356f CONTRIBUTORS SHA256 a8487cb3069536280e7dd3e5aa2892d03a548bdec10c85f776e8622833a11083 Changes SHA256 4b75ff2124c76212b58ffe26f0c23b7d00bb5298f94e15219917ae1f0c613866 INSTALL SHA256 ec6ee90c28dcb8d4fe538fc7d86c474ad6e106a220c00fc34148cde78239f9fb LICENSE SHA256 7318cc8ed2c68cdf9b855631c82e43be8a7b2d2dc1ff4ee79c3c2a7ac754f72f MANIFEST SHA256 781f9e60e058314b040c0cc89f8ca6960e21e67e5e5ebc7f5880bf76f6832bbd META.json SHA256 dd92ab5b5bc01fd2318b20b6ca5156ca1cf45583f6cdeb67e928659ba0b7b177 META.yml SHA256 419d1201c35f32b157314381698eedecc3247d91a0920c106ce4d223d77bfbd4 Makefile.PL SHA256 ba7a8c86b6ffa52ac3ff69b31bf0810bcd2058c072fc9a11b6e500188cb13bd7 README SHA256 ca71bd7064ee0715efcf764017fda5a174801ebdc7a08c576b5fa0f873185baf bin/dancer SHA256 e4d38183e3305ae406360561bade812c02fa571c0bdf4ee5fba367b78903810e cpanfile SHA256 3728b30a331c0a2b0fbb804cac8066f25c1849c1091b37bf9df0a2d892d82fe0 doap.xml SHA256 d6139becb274390d406513d8be8ed9219722e9661b1e2f058f7b698344883784 examples/dancr/dancr.pl SHA256 5ba243fe7fa2613aa3f1bac555d08ef4f99fedd674ed7ba4f517c18a94bb339d examples/dancr/public/css/style.css SHA256 910ce26105deaa95bcfca3e5b6025540a467b6cd998f97a074e831143688ca1d examples/dancr/schema.sql SHA256 072e6180ba6188b39d88ad5eecf071fa35e8878f2626a716561c64a9ef96c6da examples/dancr/views/layouts/main.tt SHA256 1eb2741b1ba9d6ab0b6724ea27624ae37fa994e2ddd5fcc87235a9013927af9e examples/dancr/views/login.tt SHA256 4d1a1e652a706ccfec079a502b88fc898b0224cfdf77f6d04615556206befe3d examples/dancr/views/show_entries.tt SHA256 38129035f76ce08172f25b35c2af8cc2af05de207ba531d6b2b80716fb7f0980 lib/Dancer.pm SHA256 3bcada7e845fdfefa12ca79aa609381f40d528f3bc9a411b82716a73ffde747d lib/Dancer/App.pm SHA256 ff8b6307dae53a1ebbfe92203d4a7c8ffb1d3e46da9845468266b6567903456b lib/Dancer/Config.pm SHA256 6b09d01c3d9344275a15ee534dfe5d97f6c2bd610155ae4e2986f65350bcc61c lib/Dancer/Config/Object.pm SHA256 c412b4d8e436470258545cfed780763a7b533389be6ab14a2afc1a3b18b4a298 lib/Dancer/Continuation.pm SHA256 497727645126758a14f7dccced2747c6b75b0cc0cbb11f7da43aefce54f2afcf lib/Dancer/Continuation/Halted.pm SHA256 6191900ff2bcfb53c927c0d82893a9a8b94fde2d0d0d00c1c30ebcaa6a6015f5 lib/Dancer/Continuation/Route.pm SHA256 5eaa09706f8bbccea81f6748438fc84bf6b5f11601fe45880059bfbf95332e50 lib/Dancer/Continuation/Route/ErrorSent.pm SHA256 d4a04d7b29a423734afab2a1b053d0e3bc01d7e11cdc5ada16df076701a90f1b lib/Dancer/Continuation/Route/FileSent.pm SHA256 fdda8b684bb93eb4046e015a680bf29b5f1228066e04f798dd487e83a5d03fc4 lib/Dancer/Continuation/Route/Forwarded.pm SHA256 3b027cf28817065e2fdc08a52b9ecd97a3bc6d1b0ad27a11b6a3916a4f208c81 lib/Dancer/Continuation/Route/Passed.pm SHA256 5dd899a924f0bfa449de724ec788ddaec88fb7059d6ebd00e5928c7ebf576bb3 lib/Dancer/Continuation/Route/Templated.pm SHA256 5f3f1a41559aa336a1000d60023062624acfcd90ba05c3155d05b0651b67c8ef lib/Dancer/Cookbook.pod SHA256 69a71373616b418497fb99e62a967fcda9870ce134fb9bb94fca456dec4e992c lib/Dancer/Cookie.pm SHA256 270be848eb7457aa2672060cb85707c995d62f6813ecffb970143d23b8e18e94 lib/Dancer/Cookies.pm SHA256 942c076b1d86a4b5cc2fd8c8552b8ca02dc79d95d940d692e925fd8c078cc7a1 lib/Dancer/Deployment.pod SHA256 962d065f7256150836bbd97848a8b641dc56b503c67f5701521ae1e2b8a4bc57 lib/Dancer/Deprecation.pm SHA256 c70d7c5dca3c29ed32a301d0a42a922f23ab09cdd6b794da5fe7029c59ff5810 lib/Dancer/Development.pod SHA256 0bf44d4a04f43a9640151587087d27d508d00cb59ab8851886d8f09820100398 lib/Dancer/Development/Integration.pod SHA256 ef45f94782fd75c27b3d22f09804c2a0fd79086b9835760a984a48a7c31635e1 lib/Dancer/Engine.pm SHA256 c7996c169a61be25ca7997ac0fe6f8b0502377c999b769ea1ec3ca4d441b02aa lib/Dancer/Error.pm SHA256 9e011344873d14126076c44ad66ce05e741f477c95e884285be0b5e48968a263 lib/Dancer/Exception.pm SHA256 473d9c4bf25159728fc353f141ec554001d5b34a1381aa066036cbc5ce43093f lib/Dancer/Exception/Base.pm SHA256 132a36b37eeabe39307fc8a175ddb4ed6ad7c73b4c2881877451d1877422d991 lib/Dancer/Factory/Hook.pm SHA256 08edcdaa7b19cb47c7ab47058557ce09e06ee53ed1c07f5107ed6589811cf701 lib/Dancer/FileUtils.pm SHA256 ace8cb6c99997e95e3fcfc5733b7aefb1559cd39954762bb9e898aa047e7de6c lib/Dancer/GetOpt.pm SHA256 7602f43d09ec03713d4edeff4eceadeffacff1958b821d6b62b25eebf4b479f3 lib/Dancer/HTTP.pm SHA256 46aa133fd8b0cf0d8edf419c5b05f7aa9327670835943ab19ff1244e2cac1391 lib/Dancer/Handler.pm SHA256 11a7767b019970ba3b31265539eb519c1605a2a0111eda860fc05ad31755e577 lib/Dancer/Handler/Debug.pm SHA256 2a3f46d6e3789703cb8ac6c1f5dd3d0ea3d716a41d7bd732a1d040947e72ec55 lib/Dancer/Handler/PSGI.pm SHA256 b7e4c4d07b1dbd146a32a24eb031df4c42111e4503f4420b5009760edc66ef71 lib/Dancer/Handler/Standalone.pm SHA256 3a62cbf8f72f562350ee16ecfac0d4d8fee30af712a76e1453a24d2e3c5fb526 lib/Dancer/Hook.pm SHA256 bb01619e48e39629d84ce5e58b8a19becb64ab97f69dcec306c85617d5198c65 lib/Dancer/Hook/Properties.pm SHA256 3ac1aa2e8814a8e6a9b065388aa3dc26127f82ce05c545446dfe8badd4962c00 lib/Dancer/Introduction.pod SHA256 764c852aca8ec1422858eeadc4fd679d104288c7f30b12ebd5bdb6293e0293b7 lib/Dancer/Logger.pm SHA256 815c0095ea73c8e7a82ce096caf5a4314498ba95ef045bcd542f7f78fbd7e3ad lib/Dancer/Logger/Abstract.pm SHA256 d6b2489e80e4fddcefd59327e6657b87dd6f9c879516d552fe1e883e53984bf6 lib/Dancer/Logger/Capture.pm SHA256 147a1b8807e677d2b179407f8a955a3986f4afc3a8cf35b25f7d5de530f67a76 lib/Dancer/Logger/Capture/Trap.pm SHA256 06f69011555aeddf4198d7e47a312a75c254b878aae8e0936ef32a69766a0a1d lib/Dancer/Logger/Console.pm SHA256 7460675d52f592075154797e4d3ac0fa57b890502f0834b469af90db60602302 lib/Dancer/Logger/Diag.pm SHA256 5d3130b5ea5fc4375df0d7217c62aefc3c50003dd582499d634aa9463c84724f lib/Dancer/Logger/File.pm SHA256 6f073f0cd24cce180b719d3cd5aa72dfbc9a7ce9a99745f8e00806740a111b78 lib/Dancer/Logger/Note.pm SHA256 7aea4dcbc5336b0a589f3f2469d338535db10e6284965d3aa27a2fbb86c7a9d5 lib/Dancer/Logger/Null.pm SHA256 64f64af6d60b00d9afe1f78fbce94a440e5df56b70f5422974d9f3177eed767f lib/Dancer/MIME.pm SHA256 10032294f75a3008df0004a4b6ac868072e24614a6f6e4cdf334e56ee2636138 lib/Dancer/ModuleLoader.pm SHA256 fd8f3e24b5b6025bb660e357370e6899f5cf5b5cfdaf07d898ebfb9033a948e8 lib/Dancer/Object.pm SHA256 964f7c71066820116b845c998aa121632c49202a176e30b4b712bedc412e0f44 lib/Dancer/Object/Singleton.pm SHA256 3a9a16f12821b72cbf492780f5d2d43a3acf124087bf951a06f134b52e931f53 lib/Dancer/Plugin.pm SHA256 134a5f5d14f2acc0573ae9076670ae0a5f8e4ef976ef82326757d865a9790089 lib/Dancer/Plugin/Ajax.pm SHA256 32eb2ea8e1dff4299dd7d1a787628540ee7f709b66bf3faa9f11c77297dcd082 lib/Dancer/Plugins.pod SHA256 ebad4a3861e04c5210f9f4cf311d5a4f0bb0f8d7eaa0adea82f1624fd948d1a6 lib/Dancer/Policy.pod SHA256 bd8bdd0e3887f6b168257f7e0863fbc4fed542b5cfa3c7fad6bee44e32965172 lib/Dancer/Renderer.pm SHA256 0245a1ef4e7c0bfb2788805e2f21b764a18dad3d87cf1a71c8dece580c7df827 lib/Dancer/Request.pm SHA256 6cfe6e2dfe98a6bc13fcfa6311128631d41a703e01df3be8111bb25610ca5224 lib/Dancer/Request/Upload.pm SHA256 0d90ef9064420507764b77b64260058345fc0b7ff09791f0f4111184e7a15247 lib/Dancer/Response.pm SHA256 e05c7e37c5abe96097d84a7d089331c26b7ccc8c946cb8892023f9b3b15ad2e4 lib/Dancer/Route.pm SHA256 d00f7a5ac0ea4f62e2086bd5a609ebd47e395414e569bf8f0a19e7541e8738cf lib/Dancer/Route/Cache.pm SHA256 6a8c4bee5ec09bc059fa5b2e61506687a0d7cd21aa7e53c644cc4a21e61da04a lib/Dancer/Route/Registry.pm SHA256 b1dae0f8b379e6ad5be5cf9a64850365ba7a9e50cea9230a70508fbebeea468a lib/Dancer/Serializer.pm SHA256 8b5d0d0ac4c442eb643191ad290e8dcfe558d5c74ddff39f1bf3de84736aac5a lib/Dancer/Serializer/Abstract.pm SHA256 02bfc259d123021b16d2b25d6346e1283c23fb5e11e6d01de097102eff90872d lib/Dancer/Serializer/Dumper.pm SHA256 6bdf316710323c73aeeec04aa6bf7cf33ef3da9fa73f7ecdb9fcff5e08072dd0 lib/Dancer/Serializer/JSON.pm SHA256 1d7f8ec4ecea80b35721e9c401f22f5877fc4f3611da9493bf2ef32d0d8896e6 lib/Dancer/Serializer/JSONP.pm SHA256 9da886a45ecd8bdf826a2bddab529e56d106d637f5e4c41822b02bca4a19c103 lib/Dancer/Serializer/Mutable.pm SHA256 6b2e4dcdeab807ad23836b5cf144451c9ba5679ccacd9cda6efcd949610a49d9 lib/Dancer/Serializer/XML.pm SHA256 7202a7e043814632ba259f9b934e618f2eb5ba0ca4338afbeb1f592b3cd1ad5a lib/Dancer/Serializer/YAML.pm SHA256 d42b756b0b4ce86d5e8f46cb3efa4834802b239e04a9c0284f7508e085622cd0 lib/Dancer/Session.pm SHA256 0c45a119782909ca1a19368ca32f9864b926907177c61d266840311a4a1a030d lib/Dancer/Session/Abstract.pm SHA256 c88cba85da87b737c750a2bdb5945a4556146dc807170ed303ba9adcb5e5e3fd lib/Dancer/Session/Simple.pm SHA256 d549938e7ac84065ffdaa84c04e72ce9f8783d525f20583c3a2fc92644eeec9b lib/Dancer/Session/YAML.pm SHA256 9a7cb761c5c8be93dcc73eea1432587df923c237ae899f5088b1a78b4dad89bd lib/Dancer/SharedData.pm SHA256 32cad17cde68eaf75c56c6949394337426d932d90662f2689586e5cda9033930 lib/Dancer/Template.pm SHA256 4fcd04e6ae1d678263b0b7bbfbc6af9ddb4087c78241956fcca178acf05bc18d lib/Dancer/Template/Abstract.pm SHA256 c61807d672c3126d44fc4a61e89f9159466531de9c17034fdb4db69ca98a0ee6 lib/Dancer/Template/Simple.pm SHA256 c889f55bd42a8335f6b5fb5fe357f40f3a30e7ab51e4c2ac60b8fcc28a93d70d lib/Dancer/Template/TemplateToolkit.pm SHA256 ea56839fa90a8c1729c178231f1d0d6739c846e3cc8f90c9113518ff7bc74151 lib/Dancer/Test.pm SHA256 af2dca8e80c7b483361be5a9cade4dee00be6377c762f302c7fb27690846c2cc lib/Dancer/Timer.pm SHA256 6dab362d066416d3377a7a7a20193bb1efd4353685441c0f38ff360e25a5d84d lib/Dancer/Tutorial.pod SHA256 9799c40652cdcf85fc11ecf26b61018f1d9ee0cb06ed4629acaaeb82a3066ebf lib/HTTP/Tiny/NoProxy.pm SHA256 e978fd28e943dae9ad89363298d49c08de82c507ac784ab06f137d27988bd26a t/00-compile.t SHA256 4bed919e5fc2e0f9a05828fe0a76a20ffe6a23db401893dc244b9846856e2c20 t/00-report-prereqs.dd SHA256 383a9d586fba3bdc22341350adc67e848ff9151380895131b1f6fb2ce8291435 t/00-report-prereqs.t SHA256 4dfbe8eea3ab51861582c03ebdd6c10223b9332b7d2ba1b45a14e8ea6f7f9f92 t/00_base/000_create_fake_env.t SHA256 67e2ffa0f3cbde2a199bd2de3f47925029f684f87b158fc2946f3ef2dc8d69c7 t/00_base/001_load.t SHA256 f16af5e802b5d307833552944fcfe8965a6c4c5167f56e80ea2853e4c42ef929 t/00_base/002_strict_and_warnings.t SHA256 7d860af2b43ddfae17aa7790685bda7bcd1c20b5a9700445cbb0d933aa5112ae t/00_base/003_syntax.t SHA256 60fa580e20f226ab6370daa6d0c10df6353668499c42d9678a688548da472a0b t/00_base/004_args.t SHA256 84cae8e34cd73a7224f091778eb2823705ce7d0c27665b023375c30a7008e6ca t/00_base/005_module_loader.t SHA256 ee31342ec4c020665bb3a45f0732056a8d263e051723264b7e86298c0ca47005 t/00_base/007_load_syntax.t SHA256 125cf6b0c8dd47e6e97986f41fcb8c2a68a0c1776534c34db811e812ff65d823 t/00_base/008_export.t SHA256 af3727da32ded12bf8db917bb22b648cf1313a58570bebd8eaa74c7e72b7c7ea t/00_base/009_syntax_export.t SHA256 304447fb8872abe272b197818bd2ca2a413035b08d362684a1737b6b26940595 t/00_base/010_export_script.t SHA256 4c98e01e4143fb0c3676eaaddbb55c7229c07192647522abe70fa0722d0c07e3 t/00_base/06_dancer_object.t SHA256 7dd33abcd28b87f11f7d42656b163fd77d4d35ad91eeea6f710115fbbb633774 t/00_base/08_pod_coverage_dancer.t SHA256 7debc0eeabc251dfa282515ac19ffa40d404ff88116181da09499740716ec700 t/00_base/09_load_app.t SHA256 d2bc31d97a536a54d16042e99f4221ff108e0ce8a3ea65436903d3edde053a8e t/00_base/11_file_utils.t SHA256 7fca62ff8ea7ed5daeb1843622b4c3c28a9ac5a03cb66c4586b5a1aec4e4fd21 t/00_base/12_utf8_charset.t SHA256 5289a4e3298967ac84e11deebe61a129c9f95abc167768dd300c44135d73ed06 t/00_base/13_dancer_singleton.t SHA256 73e14f2e7405433b0e1ea06a3313297c6bef07a8233dcf5d68c6960c8b13e063 t/00_base/15_dependent_modules.t SHA256 bac784440a43555f1e9abffc873c9c11e02f3c5108144b138c4bfa588a9c173b t/00_base/17_globalwarnings_config_on.t SHA256 6183768d6ab1d860ea442d6779d45845f6b4ebd8d66c0e40c51d0601631d737e t/00_base/config.t SHA256 5ab0fc0597aab972c423654d84dfd9de771998e3d750ce3d719c98e60e7e1603 t/00_base/easymocker.t SHA256 dbb2d5f6624c0c05399cf74ea6ce4429fe53bb1e490a02b0562c327b2a79995b t/00_base/lib/AppWithError.pm SHA256 29e2028d89c441b03adecd516bf1dd66c2dd4a3759d82faaf28fdc6bde3361a4 t/00_base/lib/WorkingApp.pm SHA256 6c09dde3ebbe2dac6509981f0ad7137b709087037d8527c9c49155c93b79ffbc t/00_base/normalize_path.t SHA256 984d6d6b55d66129aec2fe226784ce1498099b64b3bf465b2409b16ec7ba57e0 t/00_base/optional-module-versions.t SHA256 f7d6bace00a144b57b91ee96056d8d4c68f8fc7d0be4414f7f4451c27977f230 t/00_base/uri_for.t SHA256 b44f2248df36874e7d9f39c97ab2d9616f97655ebfb5c7c7dfdbdb56a8929273 t/00_base/utf8.tt SHA256 590d4a6b3d28d23c8a4fcfcf7608f4efe398654d70bde20674d5c1a0cdf47b6d t/00_base/views/unicode.tt SHA256 c85493fdfd6dfc547c01fcaa8cb98661f03e8092ac9b48b6931c0bc269ae0e77 t/01_config/01_settings.t SHA256 94c0b1d06bc507c1cc1ae7cc22cf71c0d3b868ef42f23f21969560d1b76cbcae t/01_config/02_mime_type.t SHA256 e502df1e0c5bebeedf664fccb9be4527ef9d77312331dca615058b8b3e90f1e9 t/01_config/03_logger.t SHA256 fd4d25081e8624969c92346364f791034175a85d09ef5e9b82f36dac840cb577 t/01_config/04_config_file.t SHA256 ac1dcee2c93d9028d0848f3a1b7b6a190c831e195e6da3242933f199fc3dc80d t/01_config/05_serializers.t SHA256 5a58d3b6241549a7dabb0f46fee1937ca5c8bfc6e67f5e8ec0745a79a75de303 t/01_config/06_config_api.t SHA256 e437f5376adc8213c6d5d9b5487ebfb26ed06ce530c35bdb4496b100cc369b1c t/01_config/06_stack_trace.t SHA256 43e77a60252dfc42ce2d20f9cd10c92a1541f5b90570dbb9c3a0e70b06ec5703 t/01_config/07_strict_config.t SHA256 5a96a6d48c09dd93c49240e7c125308cfb3cb2668e0408855d4fae313c04f7f2 t/01_config/08_environments.t SHA256 97a18ae8e28c3a8e24dc4a46fbb47a8106f7ca3e9e7a2015212caa44bf64db43 t/01_config/environments/development.pl SHA256 b8d590ff0b2b8d2a1a5d641d84f7dfdce9ddbb6714ec150e5d035b0fe61ef900 t/01_config/yaml_dependency.t SHA256 c2173fc136fe9807df329fc2676eafef49a48709826ac5c9a49805fc2cfe758a t/02_request/000_create_fake_env.t SHA256 efdd73b29c1400841be83f0e9a2413f5e0c07bee119d2ebfd673e492780d748a t/02_request/01_load.t SHA256 30f06249483eddbeba8c4194829d7eda01cd351cb3dc851d33871213cedeb288 t/02_request/04_custom.t SHA256 340bd4d5c6a2b154247e316d3ef91175bbbe71209ca9a41181db00bef6e01bdf t/02_request/04_forward.t SHA256 98b4b0ac9d2422de82611794687301e8dce954fbfab43be90664a7b84bcee430 t/02_request/05_cgi_pm_compat.t SHA256 16f0a5924d45a7e5486016a8c4b3eb8223135ff3dc4122fb696504b1e3659a65 t/02_request/06_init_env.t SHA256 3ee96414c56c3e9f52c7d95984da430cecc5d4b01849e48c91783d503a8d4098 t/02_request/07_raw_data.t SHA256 afc0680f3047fcf2ee88261c41beae6f0866e4e8c029640bec14496498a77cb9 t/02_request/08_param_array.t SHA256 dcce05209167ef641b8dbfed1e31c9f8f94e40c85c57d88092ea2df43eb2b1b7 t/02_request/08_params.t SHA256 837b98a8e6d8b1df6b1033ff243016a9132113fd3f6a79915d0d96a555bd81ec t/02_request/10_mixed_params.t SHA256 e64ab06abc1c7fe6d06f6204345595f72e44bc5bc6f314127f41dd67f37b9cad t/02_request/11_accessors.t SHA256 b62381b69a16d7797ce04dde9c7ee438fb9f0378b76d935e8673f9cc9d375b83 t/02_request/12_base.t SHA256 c90086a6ae69d37392143cea487ddcfe21b70a15fc4b7479346622361141a4a7 t/02_request/13_ajax.t SHA256 d0dc4620280e09c78f98df242c830f12695a698e122465439dd678a2660d2ba3 t/02_request/14_uploads.t SHA256 fd484c82c63a1c728e5f68d827de9ff0995befceb1a4397be0556accd680dfad t/02_request/15_headers.t SHA256 7fc4f9b5b0b340a4d7e0f7988e1413a4560cec5ed767c321b223b3c183071ac1 t/02_request/16_delete.t SHA256 c2a389a68c52745b243cb3e7d1577c93800a57cee4ddbb9c3eaa28cfdb6a161e t/02_request/17_uri_base.t SHA256 f86b2bfd6b60ad50797ef1506d97554bffd704ba3888bcda715d72549953dcfc t/02_request/18_param_accessor.t SHA256 b9fc22a3b680aeeca639a9fce4df5476fbca41e48ff4e717e8de85ddbabe6fc0 t/02_request/19_json_body.t SHA256 a7c4f0be31462cd499f840ef66d18411cbd8c4569069155d2d9ff421bf7791a3 t/02_request/20_body.t SHA256 aae5bda971355fc35336da7f7e57ec63f610b61d311e5eb7124047362cd7f168 t/02_request/21_dancer_response_multiple_params.t SHA256 8a43a3f2fc6a257a4e651d0e8e1eaefaec9ba2f1246886d5e8e0f8acbd275980 t/03_route_handler/01_http_methods.t SHA256 d1c8b2750f0f8f9b30b7ed3029e8a47c3d1b59c15dd280b49e8ff4583cc9e4db t/03_route_handler/02_params.t SHA256 e52459a0cd8b0464710f6f402f1305bf6076da15f3a2124a5e5233235309cb13 t/03_route_handler/03_routes_api.t SHA256 3e211bd463d8cdcf61f0ab4f463561ab3446e306582d88d1768fa2e5869082f8 t/03_route_handler/04_routes_matching.t SHA256 8887c3c2dc181c805621a1c52545d34bf0f5dce64db94a7efa336ba1315c54d3 t/03_route_handler/04_wildcards_megasplat.t SHA256 771e10e55818233ece1e101d99a8c6e59aa318e2302b13b74612e9d1dd67647b t/03_route_handler/05_filter.t SHA256 f4ff9f5d5796d954c2bc146190296a9d96908074455bd4f8e3c38fbc8a54ae51 t/03_route_handler/05_unicode.t SHA256 c6cac9f9e27764d75beed8889a4ec248dfcbe4e310fcc7df7cded2401beea227 t/03_route_handler/06_redirect.t SHA256 8b9f1b232c3c912b3accafab8e0d37d7f4963ff9631b42ae10c934b70ee6c7de t/03_route_handler/07_compilation_warning.t SHA256 87df45ad9c36ea460353e4de02baab4596f97748cd679fee00faf82400d08b30 t/03_route_handler/08_errors.t SHA256 c099ca4876eca323e4e711c5f82f39d331b2e7458bb0b9724a10694f56c96ada t/03_route_handler/12_response.t SHA256 fba5cbf9c29d192cb38824b89bc1cbb922fe21c3a27b4843535018798b9dc19c t/03_route_handler/12_response_halt.t SHA256 e6b52b82678ef4ac3199eef0a18676e848adda9eb27641a3c992b8002c692e64 t/03_route_handler/14_options.t SHA256 35bca2efe3439a2d7ec1b289768aec2c2f0f4bb8098c87373f03fca2ea5d9141 t/03_route_handler/15_prefix.t SHA256 ba54c787429f45dbde4c21e05fc16200b451fd26b738ef18aa5af42c210aee17 t/03_route_handler/16_caching.t SHA256 19decb1d62a675818a0f8ec4e745680bf99c2e0a1d2a43d68faec667f0c198aa t/03_route_handler/16_embedded_prefixes.t SHA256 bea7f31d4c84e142b24a7062da90b4814d8804a0aeab72019dd15643f3a128c2 t/03_route_handler/18_auto_page.t SHA256 e785080551b06ce68210600bd477e8debe67d878cab389ac550fc285656a3555 t/03_route_handler/21_ajax.t SHA256 cf24301898ffcde453c12d36453cef2aedbf229735cead601db73bd40d4e2132 t/03_route_handler/23_filter_error_catching.t SHA256 9b9d5ccc488bdae448ffd6afdddb091177b9b42df9fa7e064f0da3557ec77f3b t/03_route_handler/24_multiple_params.t SHA256 9931a3bf5ad1440b38ace1e543a72d9e772f578e3c6541f5ecc9cd4b8a7eb4cf t/03_route_handler/24_named_captures.t SHA256 a1f70af7bb9dde814dca32e86f6a332d0cddd391ab2e0ec70dbe26656e488098 t/03_route_handler/28_plack_mount.t SHA256 4ab97c99920dbb829d31894b450368b47fa661cea66a0d0249bf416b8e2c192f t/03_route_handler/29_forward.t SHA256 e6741a021263e90321cdf926c10215be06366354394ead73d8d36eaba06fef54 t/03_route_handler/29_redirect_immediately.t SHA256 a980fd706f96bd65156b0de80f0ce707b730a3f023fdd28ffdec3b20ee773963 t/03_route_handler/30_forward_session.t SHA256 ec79c88f9ffa3c7f403b3b704d3f238c848f7e50fdbbccc127ca4034dface458 t/03_route_handler/31_infinite_loop.t SHA256 8c9b206440c862bcf071c2526f735bd29159539460894af19942ba103e694a20 t/03_route_handler/33_vars.t SHA256 f8f72b6254ea76c361b592666f153e1c8d3aee3a1aa44d1f44b2b9ad691cee1a t/03_route_handler/34_forward_body_post.t SHA256 12d22e97a148068e4f9f8bb72141177ffc1e7f6f2a2e4c073c97d98c086c5161 t/03_route_handler/35_no_further_routes.t SHA256 3d7512691501dca6793075ab3a745b7a1ce78509fd2f928197981575501d9bc5 t/03_route_handler/36_false_routes.t SHA256 bd09fb1194835712f56c480f03229d628382880a7d5196c6562f42f34c7f99b8 t/03_route_handler/99_bugs.t SHA256 72c8462c858fb8037a32e5c91c1e35526b565a22ccfeff84e3835c51b530a331 t/03_route_handler/public/404.html SHA256 9dc808006e73fcb3fa34be8abfbd2b8404fd39854b117fae5e42a5f242d49067 t/03_route_handler/public/utf8file.txt SHA256 fd8be70be76fbb0eb37b877140fec16a8592805c8518e07267ea147fc1da4d99 t/03_route_handler/views/error.tt SHA256 a32d91ba265e6fcb1963c28bb688d0b799a1966f30f6ea17d8eca1d436bbc267 t/03_route_handler/views/foo/bar.tt SHA256 e3a3fef06c20e67387d15b75ac2936c797c9ee5d814bbb89cbb38b24748e89c9 t/03_route_handler/views/foo/index.tt SHA256 66a045b452102c59d840ec097d59d9467e13a3f34f6494e539ffd32c1bb35f18 t/03_route_handler/views/hello.tt SHA256 fb9362171b09486f8a668aa0af70e39191ae99fbf83d03978cf1aee6ed45a235 t/04_static_file/001_base.t SHA256 ca983a95ec57419641de8f51ea1b778cd49067e334351b0c8a4e90e38962af37 t/04_static_file/003_mime_types_reinit.t SHA256 897a981199c2b8aa76694667c9daa26ff4752aea5785dcca6a1877aed633b982 t/04_static_file/01_mime_types.t SHA256 1c0598916ac4de0f378670452a0d3389589765ca1d853a84ef2f75150ad31272 t/04_static_file/02_dir_traversal.t SHA256 68bb470dae2474bfa0977ad09559b75132df56093edd30c485ee758a43b6f5d1 t/04_static_file/secretfile SHA256 5b6331fa2098c31029040a15bfb29e6593a6cdea08aea5a291e88ed1c6a96ef3 t/04_static_file/static/hello.foo SHA256 aadc1955c030f723e9d89ed9d486b4eef5b0d1c6945be0dd6b7b340d42928ec9 t/04_static_file/static/hello.txt SHA256 ce846f9cb880ee938000f5c34b699d3d4ca55d46beff5b1e8d62d06957715fad t/05_views/002_view_rendering.t SHA256 f67d9587a379f115c0044e9f6cd64fcafda2b245c82af65ebdec32f5e6f5f71f t/05_views/03_layout.t SHA256 3b8e3345eed599db4d1944b08742a768e222dfe00f593593217eaa958d587e15 t/05_views/views/clock.tt SHA256 d0ce10b06649634fe96307809a5811c45b680d460c20727e3bbddab6dec9845b t/05_views/views/index.tt SHA256 ad92c1df9149500f224de14ed9d8873dcbc91377daf15d48954015aa881fe0a2 t/05_views/views/layouts/custom.tt SHA256 ae8e45f1a39849bd3c01a472ac56b2316b519edf6b52af7e9946f2c988f85b22 t/05_views/views/layouts/main.tt SHA256 a07beb4c8cec9c5b8c41ceb42561f9417a60f73519a3effa1f127dcac82a625a t/05_views/views/request.tt SHA256 0da59952a001f5b24004da150132a3970701d5b4dd7923ff789c1ccc682b11e4 t/05_views/views/t03.tt SHA256 3dd29b8aebf9b01be3cde0eecc5e951662eddcc969eaa9889bff6d285caf2834 t/05_views/views/vars.tt SHA256 c2173fc136fe9807df329fc2676eafef49a48709826ac5c9a49805fc2cfe758a t/06_helpers/000_create_fake_env.t SHA256 d6b09133c21d1c49a0721e857e810fe29b694df1c2c251c6c36fcb7915ec7714 t/06_helpers/01_send_file.t SHA256 2f31da42f7dd1870ec64a159629d221341585b685ad71308de53251cbb839b7b t/06_helpers/02_http_status.t SHA256 932cfb4be62110d5d9ee05f27e50336ca72b3a061e79b19c6d66de9f1c12e755 t/06_helpers/03_content_type.t SHA256 f52ae71db910cccbbae1044a8168fe7cca74a1e1167b484c75a018fea317e91f t/06_helpers/04_status.t SHA256 c557071896fffb0003c21fe2636529e22077203ff4bf5278c9c18a583b4ba644 t/06_helpers/05_send_error.t SHA256 a7f25eff98bbfa88b7aecf8a82b8993a79459a4769f836ee62de3b611dbd0655 t/06_helpers/06_load.t SHA256 14c5e74c4b96ccef41cd94db73a9ec3348038ac094feca4fd897cecffa07cdae t/06_helpers/public/file.txt SHA256 36f2c494168e79816ad768f952553aa2caa3bc35d26502e8ae3d57a616f8fbde t/06_helpers/routes.pl SHA256 c2173fc136fe9807df329fc2676eafef49a48709826ac5c9a49805fc2cfe758a t/07_apphandlers/000_create_fake_env.t SHA256 9b2d35953ac7a5a76012e7318ecc20d807bafd322870cf029cac47d5df4ff133 t/07_apphandlers/01_base.t SHA256 45c3aa3e1f289141f862c25e94c5f15f5bef530ad371ff98d926a7589ac269a3 t/07_apphandlers/02_apache2_plack.t SHA256 43a1f1ff16c2060346ac18ab103170fabdaa143125e60b8ac5d0a4945256aef1 t/07_apphandlers/03_psgi_app.t SHA256 eb9cdb1b0278e3e1a0a0ce16ec2e29383e98ffcb801af7e7e6e337db3c475a23 t/07_apphandlers/04_standalone_app.t SHA256 037852fd9a799756ae5c7b55023289deac5d951acfb0ecfadf9c53d81a10efcf t/07_apphandlers/05_middlewares.t SHA256 ced4d384d5d76998b51f764f63e74b3f782a12bf495b457b6394a6236febcd65 t/07_apphandlers/05_psgi_api.t SHA256 f5c759979c0c2459cec4b43879ddd8c3e263b64daae9affda89eeece8ba2edb2 t/07_apphandlers/06_debug.t SHA256 6c74a7eec16ca46d1cc07dcdb0186cc5a89c5efe671a368fd3875c5908e1ea9e t/07_apphandlers/07_middleware_map.t SHA256 b20924da611b2ca4bca3838e4d6e556e94b2ed431961c211bdb834df1b258af4 t/07_apphandlers/08_is_text.t SHA256 c2173fc136fe9807df329fc2676eafef49a48709826ac5c9a49805fc2cfe758a t/08_session/000_create_fake_env.t SHA256 52605d75ebcb5bf4995562219736a08ec2ec9375b89e5b94144d9f7bbc34bb6a t/08_session/01_load.t SHA256 3db8988633b8e232ad86ee6e2afa49ec1ec539c71df3ff733de2a12ff6eb04a2 t/08_session/02_dependency_check.t SHA256 ef01b7c32173f9dc858391ced6059fb5e47ec3df66bbcb520425b7891e5a70e6 t/08_session/03_http_requests.t SHA256 651b8483ad4dafece06ba5ceb1d228ab18f36a2109c3170891f31fad0938639d t/08_session/04_api.t SHA256 d136eb6a628680f015a71507c3c956a94e03af0b4aa7d255503cb79a5fd4cd83 t/08_session/05_yaml.t SHA256 651083261c273b43887cbf22e77549299defd147ea13a8aafc236a39da7371a1 t/08_session/06_abstract.t SHA256 f2dd2747a3eff5ea84ab1678fb3f09a049348c519672e69fe2d11a90979ed1c3 t/08_session/07_session_expires.t SHA256 86ab2bb962ee2398386df3f57177e635325faf38a2decc5abf9e38bf4915d2da t/08_session/08_simple.t SHA256 b4951a82eaef6a420552aecb2e49ba66cc6e96dbc0d198054090e5e076158f77 t/08_session/09_session.t SHA256 44d6ef462e83f3c88cc8cd964b8f3318b319c03b2758a845281d43c1e0e1b972 t/08_session/10_filter.t SHA256 6706a998aa66745668cb98aaf9605bcaa63b1fa42eae69cad45d7133146b47fe t/08_session/11_session_secure.t SHA256 82bda85638d61ff0c648efbb7b39e090872689e35ab76cbac0b5de60b2cb7bc1 t/08_session/12_session_name.t SHA256 3d139b326b587cd7b2d8df8f0d5bf6aa1276aca5df85afc36eb7353d19e11476 t/08_session/13_session_httponly.t SHA256 bb624685ea61187106b63b215a33ad3963d0283a29eea255babd579dfe6f99d4 t/08_session/14_session_domain.t SHA256 c2173fc136fe9807df329fc2676eafef49a48709826ac5c9a49805fc2cfe758a t/09_cookies/000_create_fake_env.t SHA256 ca581c9705de1a9fd40d40b418b8506f22a4fe7f77f0560aa721053b765cae68 t/09_cookies/01_use.t SHA256 0c432f794d33bd7df1d106317301d8b394ee4f27ba5e8be1925fde5bfeba79cb t/09_cookies/02_cookie_object.t SHA256 6e8646a5cbdeb8e4fbeb5ba8a699b82eeccb83a63351157a959a3cbf3b0db2a9 t/09_cookies/03_persistence.t SHA256 0fe06c56456f318a5f83b53396434d1924123f9d76e8a9356cdf78c9fd486348 t/09_cookies/04_secure.t SHA256 e51febfed707d106258547ed8f61009b5b8d2a2fc13eaad2840aedcdb6da3974 t/09_cookies/05_api.t SHA256 549df6e21f265574c6f30b365c22f1edbc028054024ac5fd8fd3e7a8eef109b8 t/09_cookies/06_expires.t SHA256 c2173fc136fe9807df329fc2676eafef49a48709826ac5c9a49805fc2cfe758a t/10_template/000_create_fake_env.t SHA256 bdfc8e9d7c52eab12d3dd7cbbd3387cbd5945fddad1eb678d94d96a0ed3fc390 t/10_template/01_factory.t SHA256 06f21991f29b1a78117922cd077cb834d6f6a29410638cbdc2679353812698ab t/10_template/02_abstract_class.t SHA256 e59996cdfd7de7cb86c172447867607c438956b95b81702f2b76421ef1653bc8 t/10_template/03_simple.t SHA256 52fd58cd1cc0a8767783cb0654dfdf0f861658d91b62817b08d34a9a1cd7111c t/10_template/05_template_toolkit.t SHA256 5a35530d0a790fc88b15d24b16a37ed18554d82dda0160cb98ad624158439f87 t/10_template/05_template_toolkit_fromdata.t SHA256 746b7431427d73c7c9679d3b8c6876c67dc7c7ac4c35a9fcc52cbc0c03e8f8b4 t/10_template/extension.t SHA256 9d731c275b0dfccea4edf31f2e60c30cdb37e0d1549ecdc98a0d0d630456ffb6 t/10_template/index.txt SHA256 72f81c6c71939aebea0dcdac26a9818de0325d169576295d868899c3a124a97f t/10_template/template.t SHA256 b17bd8f170fe75c226bc2a0c6e16cca4d731ad16122c282921ee489122540733 t/10_template/views/index.ts SHA256 026dbd365d86aabaa1dc937ba06bdcd93165c82e77b7b3273e4ad4605b30c422 t/10_template/views/index.tt SHA256 8c3baba03417c53953b8be27da8fae08b73f52954d6528162aa790611fad2fc2 t/10_template/views/layouts/main.ts SHA256 8c3baba03417c53953b8be27da8fae08b73f52954d6528162aa790611fad2fc2 t/10_template/views/layouts/main.tt SHA256 c2173fc136fe9807df329fc2676eafef49a48709826ac5c9a49805fc2cfe758a t/11_logger/000_create_fake_env.t SHA256 ad587bbadadb24227b23d705ee89387ab5f8c15a33ee7ae329ff215eadb69b32 t/11_logger/01_abstract.t SHA256 0c6dcc610df60b25dacada8eb8aa73ee8b03e23b75f57b1b447cd2a478ca686e t/11_logger/02_factory.t SHA256 5d8f390d0fb07e4815d454d04d5ee3a4d855e0f52d587d4642f47f193ebad299 t/11_logger/03_file.t SHA256 3b491f1466214a20c9cc5c13cee67ec72025ed4d797783838e1140c797c70499 t/11_logger/04_console.t SHA256 7ed89ef85a772d94dcf81b2bd0c7877412be655d80919a663ed48b80b7357029 t/11_logger/05_format.t SHA256 57f73b912c3ea67a4c8f522810f3e510c10702d92b3edb9017fce0daa9b74d8d t/11_logger/06_null.t SHA256 ad1bd42627df1f43ea15e7c1899e9a67aac2a24de477f1f6246402accb738316 t/11_logger/07_diag.t SHA256 c479b63c0026513955a237bac13dede05e10197629741d38920ef4a2d3d5e5c0 t/11_logger/08_serialize.t SHA256 d3e1c9d2de30775fb8d5741dc4653fd58e945c1b4f570d6ca01425109a54347c t/11_logger/09_capture.t SHA256 d92567be17c02a657dbe2a88952ae9c8979473a1ce360233ed76d8d7ac533128 t/11_logger/10_note.t SHA256 31e95a165ee3948583fdd1c6a46e21e9e9f9364bb3a0d3693e4aedcc2a93f000 t/11_logger/11_runtime_file.t SHA256 94dcbb41c701dc163f55c0564b782672cfb455f0fb54dbfd40093fbba0c4f6f5 t/11_logger/unicode.t SHA256 c2173fc136fe9807df329fc2676eafef49a48709826ac5c9a49805fc2cfe758a t/12_response/000_create_fake_env.t SHA256 7a4a6df38a064e11ff0b3a80489085a734c0a47b8dec1a8abd9220b9a23a4e86 t/12_response/01_CRLF_injection.t SHA256 9d00242052c706c0a2a4460ca7850b278aa8ab74add507a7c4251571862cf3bb t/12_response/02_headers.t SHA256 31795386fc100124d5c13335e6705e8931af1d906f62c0bb16f8bff4c9b1d833 t/12_response/03_charset.t SHA256 00259827ba98fdbdaf1dff866816d1bdcd521ffab2c4a18ca169f79df41d931c t/12_response/04_charset_server.t SHA256 d3bca35b57321a427457c286853f211fd6f1de119240f57e442169275b8eb9d3 t/12_response/05_api.t SHA256 5d75f809a8c34dc7a3ec6b03e789f8a270676add3bc52726f501d23da9c11ee3 t/12_response/06_filter_halt_status.t SHA256 7c2cf7ab1bdfe8fbd6a155796b6c91400d31c6b41f5f23705262ddfdfd1024d2 t/12_response/07_cookies.t SHA256 adee8c79be0459972b756360f8f4cff0626eea992b4d4f0861958c1aaaf12482 t/12_response/08_drop_content.t SHA256 319afc870124e88054419027898f8b2556b5d0f1456bf0dd00e3ceba567c95b1 t/12_response/09_headers_to_array.t SHA256 e08f51b5486a55718974395f1c34427f52e4fe762a2066c9b38405bce1d2149f t/12_response/10_error_dumper.t SHA256 70a681d2f2d78247e93c64559ee19941de49c08cbbb81b2d6b45a77b0a713559 t/12_response/10_error_dumper_without_clone.t SHA256 de8cc92bfcb828db715d07e81b28d2bbc4fd6bdf194aa7588e31224e8152d15e t/12_response/11_CVE-2012-5572.t SHA256 82d09c4d220ed48d60d8155dd85ca213c6bbe9ebe619170855388e0839ef79f6 t/13_engines/00_load.t SHA256 6f46d44d01067618a4d036edb5ff94a16d5207c7faaebe4cc0a7d9986b72309a t/13_engines/02_template_init.t SHA256 5b974a7db702134d7c1a5726e2ac8c522823a4fcef8a61817b255334d0a39bb9 t/14_serializer/01_helpers.t SHA256 f23da10efe0c217d75999742e7d5ac4d433f45d5ec337e3ee00291ef967ca443 t/14_serializer/02_request_json.t SHA256 ab9ca710fa9ed97c70de8d4d7ef9f8d02953cfd926545894f6b74e49a5c55329 t/14_serializer/03_request_yaml.t SHA256 cae3c9b4a41678893468d23ee3c59eb63c71da6a35b9fa53757ea2cec9523d51 t/14_serializer/04_request_xml.t SHA256 8202633c38e2fd4ff591868d74a41a9185a01b74c9e7e6351af35734d7eff0cd t/14_serializer/05_request_mutable.t SHA256 7df8195e5a32b90bf531fa6741bafc6980ba8daed4825f7fa3ce36601854b15b t/14_serializer/06_api.t SHA256 6ac7955f68f15037f670dbf8605e55c4ebd257b98f3bb293e0ad4e4c6a312f14 t/14_serializer/07_request_jsonp.t SHA256 8b64bccce3b70deeed4a5355b9684b902cbcea65b53d4f2c44450b047fd00b33 t/14_serializer/17_clear_serializer.t SHA256 14465c70cad0ff02cb83fd17b0198b4fb0cd509672eaaebca1b5193c9ac1aa25 t/14_serializer/18_mutable_template_or_serialize.t SHA256 7dfa8be6a40ae7667c95160460a4c8efaa7827c03c7e49c30fa6aa75e017e4fe t/14_serializer/99_bugs.t SHA256 c2173fc136fe9807df329fc2676eafef49a48709826ac5c9a49805fc2cfe758a t/15_plugins/000_create_fake_env.t SHA256 e2c157430c47ba6017354e27169a54ea8f4c942bb98c7a47efacd8a8d58cc56f t/15_plugins/01_register.t SHA256 96f43eb174635225b08a013861beacff53d2fc174fffbd7ce5dbd52974ad4060 t/15_plugins/02_config.t SHA256 4ae3e2287ee671f12e78928bcb9c4cf607b586832c457ad19ef857ebeb8d4421 t/15_plugins/03_namespace.t SHA256 0c750afa8878a52700ad3d56d1d37b0aa3d2b23d2fb7355bb8a92dbc5589d17c t/15_plugins/04_apps_and_plugins.t SHA256 d338c8dfabd7d5019876e58d4960463bf673431768d80b1e8eec48b46933e32a t/15_plugins/05_keywords.t SHA256 b8729a15f8070876d2ab06c9b81265a276180f256a5f76ed83368ef190a9e5c7 t/15_plugins/05_plugins_and_OO.t SHA256 6c1c712590e66e9460ba3660af16146d1345566f8bf96c543f163959c32df0a5 t/15_plugins/05b_plugins_and_c3.t SHA256 40298fae0ca3b33337b6c2eb57d1586ba2beeed0e8023c96d81343c6cb32bcd9 t/15_plugins/06_hook.t SHA256 5297f8828e8fe6a831f6775cc6452269ac6a8a09d80f1d1b8c22269dc0f98f57 t/15_plugins/07_ajax_plack_builder.t SHA256 e0ef472fc509a023e061893d150de3cdd4b00ccdfc373c267ac01808fe47b33c t/16_timer/00_base.t SHA256 c2173fc136fe9807df329fc2676eafef49a48709826ac5c9a49805fc2cfe758a t/17_apps/000_create_fake_env.t SHA256 988d2a067c61820a2ae40d95d4928f656ba6e740008c1eaeb9b01c41bbb76515 t/17_apps/00_base.t SHA256 7b67ef49d549a46a8945af1ab26d7956faaf14f05ce880138615848a28710656 t/17_apps/01_settings.t SHA256 da1b9c27f73ade4011fbbb3e4f8832989d9a34969bf21633c79cf0b6a5106254 t/17_apps/02_load_app.t SHA256 a5c8b396be7650001046e47d73d2ce0d4dc8cfc1217c8b3288672c6a98028294 t/17_apps/03_prefix.t SHA256 55679bfb0221f5ae673df092c70c8547f0b6b731c77d2afaeab05efaa057d930 t/17_apps/05_api.t SHA256 c06adedee57518d58ae7f5f3665505177901a0fc28395e6a69fe67fbab9dfec7 t/19_dancer/01_script.t SHA256 2ab0741a3b367ba0bed4341f7869b73f15f812d29ad98e1f864533d5d43e2289 t/19_dancer/02_script_version_from.t SHA256 e2ca7eb2aa6b13576e1c2a98e6cfff8b8eace35f86edce8a2cb5b68497a34d15 t/20_deprecation/01_api.t SHA256 40263227a40308ea42293f0618741f32bd8da52ef711e9a0b820787ff4458465 t/21_dependents/Dancer-Session-Cookie.t SHA256 4493dfa11405ab622682e312c72e41348fb4e022b4ccff0bb7383b31673ab689 t/22_hooks/00_syntax.t SHA256 11e0a4a82b35a96bb1c20b35edd605ebc0b49afb14f34ec1d7aa798c59bc55df t/22_hooks/01_api.t SHA256 dd754b56a666d8fc697c690132069d3588d3e2bed177e2a20d252aee93b13663 t/22_hooks/02_before.t SHA256 a16f523b2f636ed383a2450dd8872c5138a837800c5418eda6a0ba6f9ddfc6da t/22_hooks/03_after.t SHA256 a0cab2e294d9aefc09fc4d372d0854c18cd58e803be3e381f0a0972a74ef358c t/22_hooks/04_template.t SHA256 3c6c955225c41ad5fbcba349257cb6771507614faffb8aa64ca00c43610151cd t/22_hooks/05_layout.t SHA256 9f4109e7c3fe2ee96d37b79b07a59eb205be67af40347e63cce2c8ac0dfda0f9 t/22_hooks/06_serializer.t SHA256 5ff91a80158c2b0e42ccf36fba04da8ff33637e356d12a8b8fc181a818339c4d t/22_hooks/07_file.t SHA256 9a132b8731afd42f58ad6c303f1b3ab39c490e61dfbdeeca6cc66a0637d34e83 t/22_hooks/08_error.t SHA256 fca43de0ee09e00db4a9979cec382b79be70c53e8967b2925823b917eafa32a9 t/22_hooks/09_before_error_init.t SHA256 b301b6dabd33e7b755051d72e745860e7cba91ac0c7f4166fded40951894d51a t/22_hooks/10_error_in_hook.t SHA256 3c68b516dbe53bef2a4e79c3132343e8cc58b005ac46416899cf31c9dc93082e t/22_hooks/11_error_in_hook.t SHA256 026dbd365d86aabaa1dc937ba06bdcd93165c82e77b7b3273e4ad4605b30c422 t/22_hooks/views/index.tt SHA256 204ebf7d221f3119b12e672aaf947a4de6135a5952af9f34100be2bde35f3abe t/22_hooks/views/layouts/main.tt SHA256 097aa65952f07c899ae8b989925d975c8f3aa1d2d117a78d5e51459362b09d6f t/23_dancer_tests/01_basic.t SHA256 9abfd44a32f576e4ad25bf0488a655c64b0b6d5e5861d4377aa92e8b21dd7061 t/23_dancer_tests/02_tests_functions.t SHA256 6e217f185967fe3cd8e40e55cb4444af9ce937656ae822e22a150b1d0241728e t/23_dancer_tests/03_uris.t SHA256 08b809a31d8738523083232042396360033fc5f1978f104a8f374717f6635cb9 t/24_deployment/01_multi_webapp.t SHA256 f637c08f6c18a734cdb29894eec3f2b5b820e6c49d7f55a0f69f129427ec9442 t/25_exceptions/01_exceptions.t SHA256 4d710c7fe7077363b2e619911cc78c3c54c95b5bb81611bc3088ab3ddbafb2bd t/25_exceptions/02_exceptions.t SHA256 ab62b53288c4d365769d7af3b0b5474719875008133e8b0846d41ca23019a669 t/25_exceptions/03_exceptions.t SHA256 05dbd2c034c19381dda43bcd005631370e70f830c780452112f263e0e02a782f t/25_exceptions/04_exceptions_warn.t SHA256 b21a6150642bddd22d9f942f1b4b4f435a93b570f4e0d78d4db69901553cd0c1 t/25_exceptions/views/error.tt SHA256 026dbd365d86aabaa1dc937ba06bdcd93165c82e77b7b3273e4ad4605b30c422 t/25_exceptions/views/index.tt SHA256 204ebf7d221f3119b12e672aaf947a4de6135a5952af9f34100be2bde35f3abe t/25_exceptions/views/layouts/main.tt SHA256 9fc1cc89cd0cc5c8267d2d0c701952fc3fd84bbfd8f71715535d177ed07867f7 t/TestAppExt.pm SHA256 1e2890ec118417cbf029a3095152d64e1d4bab58938f0bf67e258e00fe91aba7 t/TestPlugin.pm SHA256 305c657c6b73f10767a0ea286b8a73d693940f4cbb8b6a0a4d34e2b5a1c04635 t/author-pod-syntax.t SHA256 f772206e780a1fb0188f8236cdfa782b271210c053126da2cd91dd1dd6a2a3bb t/lib/EasyMocker.pm SHA256 9f8f52b8a5eee402ba90228ef6083a7585c8204a38c55da18cd53dcc00b7cd88 t/lib/Forum.pm SHA256 acfc45165f680d7fc9a733b6e0ab379f298850d4d157dc4d10b9a4396b463d25 t/lib/FromDataApp.pm SHA256 0b9235107700e09cb37d6534109a315e6118a3dccaffb3648321e43abeb3c8a1 t/lib/Hookee.pm SHA256 822091747c9aad2e9ecbc539114c5f5f7833506064dc96cde47c6c6efcb0b3b8 t/lib/LinkBlocker.pm SHA256 6f4e62ee79256d9efda0d75d8866de165d37eb7bcc470dcde420b4d30689c0d9 t/lib/TestApp.pm SHA256 4207def70440e960de069f11df63b266f1f11a51cec4b117dcd0554b73746076 t/lib/TestAppUnicode.pm SHA256 bdab63ec4413bc80fa09683e0cd009512cf207c2b0123140e7bdad12040532f8 t/lib/TestPlugin.pm SHA256 248dde5b9c8d3349228c3a3a98b8f468d3601777123f85929104d6d210d727c6 t/lib/TestPlugin2.pm SHA256 9f487992e4bb4a59dcaeb7b85130a85ec62f84145b843ad7fe83a4355aa3d4fc t/lib/TestPluginMRO.pm SHA256 5a37bb006bd99b3d54ce0e137edaa6f8cbe7a803b6f93c11839b0034e82d2c53 t/lib/TestUtils.pm SHA256 e7d33404e8abd18f992e3a17ba8b8a0a71ad21819c950b2a3d4e054675e487d6 t/pod.t bin000755001750001750 015135765170 13406 5ustar00davidpdavidp000000000000Dancer-1.3522dancer100755001750001750 41511115135765170 14773 0ustar00davidpdavidp000000000000Dancer-1.3522/bin#!/usr/bin/perl #PODNAME: dancer #ABSTRACT: helper script to create new Dancer applications use strict; use warnings; use Dancer::Template::Simple; use File::Basename 'basename', 'dirname'; use File::Path 'mkpath'; use File::Spec::Functions; use Getopt::Long; use Pod::Usage; use Dancer::Renderer; use HTTP::Tiny; use constant FILE => 1; # options my $help = 0; my $do_check_dancer_version = 1; my $name = undef; my $path = '.'; sub templates($); sub app_tree($); sub create_node($;$); GetOptions( "h|help" => \$help, "a|application=s" => \$name, "p|path=s" => \$path, "x|no-check" => sub { $do_check_dancer_version = 0 }, "v|version" => \&version, ) or pod2usage( -verbose => 1 ); # main my $PERL_INTERPRETER = -r '/usr/bin/env' ? '#!/usr/bin/env perl' : "#!$^X"; pod2usage( -verbose => 1 ) if $help; pod2usage( -verbose => 1 ) if not defined $name; pod2usage( -verbose => 1, -msg => "directory '$path' does not exist" ) unless -d $path; pod2usage( -verbose => 1, -msg => "directory '$path' is not writable" ) unless -w $path; sub version {require Dancer; print 'Dancer ' . $Dancer::VERSION . "\n"; exit 0;} validate_app_name($name); my $DO_OVERWRITE_ALL = 0; my $DANCER_APP_DIR = get_application_path($path, $name); my $DANCER_SCRIPT = get_script_path($name); my ($LIB_FILE, $LIB_PATH) = get_lib_path($name); my $AUTO_RELOAD = eval "require Module::Refresh and require Clone" ? 1 : 0; require Dancer; my $DANCER_VERSION = $Dancer::VERSION; version_check() if $do_check_dancer_version; safe_mkdir($DANCER_APP_DIR); create_node( app_tree($name), $DANCER_APP_DIR ); unless (eval "require YAML") { print < 'MANIFEST'); open my $manifest, ">", $manifest_name or die $!; # create a closure, so we do not need to get $root passed as # argument on _create_node my $add_to_manifest = sub { my $file = shift; $file =~ s{^$root/?}{}; print $manifest "$file\n"; }; $add_to_manifest->($manifest_name); _create_node($add_to_manifest, $node, $root); close $manifest; } sub _create_node { my ($add_to_manifest, $node, $root) = @_; my $templates = templates($name); while ( my ($path, $content) = each %$node ) { $path = catfile($root, $path); if (ref($content) eq 'HASH') { safe_mkdir($path); _create_node($add_to_manifest, $content, $path); } elsif (ref($content) eq 'CODE') { # The content is a coderef, which, given the path to the file it # should create, will do the appropriate thing: $content->($path); $add_to_manifest->($path); } else { my $file = basename($path); my $dir = dirname($path); my $ex = ($file =~ s/^\+//); # look for '+' flag (executable) my $template = $templates->{$file}; $path = catfile($dir, $file); # rebuild the path without the '+' flag write_file($path, $template, {appdir => File::Spec->rel2abs($DANCER_APP_DIR)}); chmod 0755, $path if $ex; $add_to_manifest->($path); } } } sub app_tree($) { my ($appname) = @_; return { "Makefile.PL" => FILE, "MANIFEST.SKIP" => FILE, lib => { $LIB_PATH => { $LIB_FILE => FILE,} }, "bin" => { "+app.pl" => FILE, }, "config.yml" => FILE, "environments" => { "development.yml" => FILE, "production.yml" => FILE, }, "views" => { "layouts" => {"main.tt" => FILE,}, "index.tt" => FILE, }, "public" => { "+dispatch.cgi" => FILE, "+dispatch.fcgi" => FILE, "404.html" => FILE, "500.html" => FILE, "css" => { "style.css" => FILE, "error.css" => FILE, }, "images" => { "perldancer-bg.jpg" => \&write_bg, "perldancer.jpg" => \&write_logo, }, "javascripts" => { "jquery.min.js" => FILE, }, "favicon.ico" => \&write_favicon, }, "t" => { "001_base.t" => FILE, "002_index_route.t" => FILE, }, }; } sub safe_mkdir { my ($dir) = @_; if (not -d $dir) { print "+ $dir\n"; mkpath $dir or die "could not mkpath $dir: $!"; } else { print " $dir\n"; } } sub write_file { my ($path, $template, $vars) = @_; die "no template found for $path" unless defined $template; $vars->{dancer_version} = $DANCER_VERSION; # if file already exists, ask for confirmation if (-f $path && (not $DO_OVERWRITE_ALL)) { print "! $path exists, overwrite? [N/y/a]: "; my $res = ; chomp($res); $DO_OVERWRITE_ALL = 1 if $res eq 'a'; return 0 unless ($res eq 'y') or ($res eq 'a'); } my $fh; my $content = process_template($template, $vars); print "+ $path\n"; open $fh, '>', $path or die "unable to open file `$path' for writing: $!"; print $fh $content; close $fh; } sub process_template { my ($template, $tokens) = @_; my $engine = Dancer::Template::Simple->new; $engine->{start_tag} = '[%'; $engine->{stop_tag} = '%]'; return $engine->render(\$template, $tokens); } sub write_data_to_file { my ($data, $path) = @_; open(my $fh, '>', $path) or warn "Failed to write file to $path - $!" and return; binmode($fh); print {$fh} unpack 'u*', $data; close $fh; } sub send_http_request { my $url = shift; my $ua = HTTP::Tiny->new; $ua->timeout(5); my $response = $ua->get($url); if ($response->{success}) { return $response->{content}; } else { return; } } sub version_check { my $latest_version = 0; require Dancer; my $resp = send_http_request('http://search.cpan.org/api/module/Dancer'); if ($resp) { if ( $resp =~ /"version" (?:\s+)? \: (?:\s+)? "(\d\.\d+)"/x ) { $latest_version = $1; } else { die "Can't understand search.cpan.org's reply.\n"; } } return if $DANCER_VERSION =~ m/_/; if ($latest_version > $DANCER_VERSION) { print qq| The latest stable Dancer release is $latest_version, you are currently using $DANCER_VERSION. Please check http://search.cpan.org/dist/Dancer/ for updates. |; } } sub download_file { my ($path, $url) = @_; my $resp = send_http_request($url); if ($resp) { open my $fh, '>', $path or die "cannot open $path for writing: $!"; print $fh $resp; close $fh } return 1; } sub templates($) { my $appname = shift; my $appfile = $appname; my $cleanfiles = $appname; $appfile =~ s{::}{/}g; $cleanfiles =~ s{::}{-}g; return { 'Makefile.PL' => "use strict; use warnings; use ExtUtils::MakeMaker; # Normalize version strings like 6.30_02 to 6.3002, # so that we can do numerical comparisons on them. my \$eumm_version = \$ExtUtils::MakeMaker::VERSION; \$eumm_version =~ s/_//; WriteMakefile( NAME => '$appname', AUTHOR => q{YOUR NAME }, VERSION_FROM => 'lib/$appfile.pm', ABSTRACT => 'YOUR APPLICATION ABSTRACT', (\$eumm_version >= 6.3001 ? ('LICENSE'=> 'perl') : ()), PL_FILES => {}, PREREQ_PM => { 'Test::More' => 0, 'YAML' => 0, 'Dancer' => [% dancer_version %], }, dist => { COMPRESS => 'gzip -9f', SUFFIX => 'gz', }, clean => { FILES => '$cleanfiles-*' }, ); ", 'index.tt' => '

Getting started

Here’s how to get dancing:

About your application\'s environment

  1. Tune your application

    Your application is configured via a global configuration file, config.yml and an "environment" configuration file, environments/development.yml. Edit those files if you want to change the settings of your application.

  2. Add your own routes

    The default route that displays this page can be removed, it\'s just here to help you get started. The template used to generate this content is located in views/index.tt. You can add some routes to lib/'.$LIB_PATH.$LIB_FILE.'.

  3. Enjoy web development again

    Once you\'ve made your changes, restart your standalone server (bin/app.pl) and you\'re ready to test your web application.

', 'main.tt' => ' '.$appname.' <% content %> ', "dispatch.cgi" => "$PERL_INTERPRETER use Dancer ':syntax'; use FindBin '\$RealBin'; use Plack::Runner; # For some reason Apache SetEnv directives don't propagate # correctly to the dispatchers, so forcing PSGI and env here # is safer. set apphandler => 'PSGI'; set environment => 'production'; my \$psgi = path(\$RealBin, '..', 'bin', 'app.pl'); die \"Unable to read startup script: \$psgi\" unless -r \$psgi; Plack::Runner->run(\$psgi); ", "dispatch.fcgi" => qq{$PERL_INTERPRETER use Dancer ':syntax'; use FindBin '\$RealBin'; use Plack::Handler::FCGI; # For some reason Apache SetEnv directives don't propagate # correctly to the dispatchers, so forcing PSGI and env here # is safer. set apphandler => 'PSGI'; set environment => 'production'; my \$psgi = path(\$RealBin, '..', 'bin', 'app.pl'); my \$app = do(\$psgi); die "Unable to read startup script: \$@" if \$@; my \$server = Plack::Handler::FCGI->new(nproc => 5, detach => 1); \$server->run(\$app); }, "app.pl" => "$PERL_INTERPRETER use Dancer; use $appname; dance; ", "$LIB_FILE" => "package $appname; use Dancer ':syntax'; our \$VERSION = '0.1'; get '/' => sub { template 'index'; }; true; ", 'style.css' => ' body { margin: 0; margin-bottom: 25px; padding: 0; background-color: #ddd; background-image: url("/images/perldancer-bg.jpg"); background-repeat: no-repeat; background-position: top left; font-family: "Lucida Grande", "Bitstream Vera Sans", "Verdana"; font-size: 13px; color: #333; } h1 { font-size: 28px; color: #000; } a {color: #03c} a:hover { background-color: #03c; color: white; text-decoration: none; } #page { background-color: #ddd; width: 750px; margin: auto; margin-left: auto; padding-left: 0px; margin-right: auto; } #content { background-color: white; border: 3px solid #aaa; border-top: none; padding: 25px; width: 500px; } #sidebar { float: right; width: 175px; } #header, #about, #getting-started { padding-left: 75px; padding-right: 30px; } #header { background-image: url("/images/perldancer.jpg"); background-repeat: no-repeat; background-position: top left; height: 64px; } #header h1, #header h2 {margin: 0} #header h2 { color: #888; font-weight: normal; font-size: 16px; } #about h3 { margin: 0; margin-bottom: 10px; font-size: 14px; } #about-content { background-color: #ffd; border: 1px solid #fc0; margin-left: -11px; } #about-content table { margin-top: 10px; margin-bottom: 10px; font-size: 11px; border-collapse: collapse; } #about-content td { padding: 10px; padding-top: 3px; padding-bottom: 3px; } #about-content td.name {color: #555} #about-content td.value {color: #000} #about-content.failure { background-color: #fcc; border: 1px solid #f00; } #about-content.failure p { margin: 0; padding: 10px; } #getting-started { border-top: 1px solid #ccc; margin-top: 25px; padding-top: 15px; } #getting-started h1 { margin: 0; font-size: 20px; } #getting-started h2 { margin: 0; font-size: 14px; font-weight: normal; color: #333; margin-bottom: 25px; } #getting-started ol { margin-left: 0; padding-left: 0; } #getting-started li { font-size: 18px; color: #888; margin-bottom: 25px; } #getting-started li h2 { margin: 0; font-weight: normal; font-size: 18px; color: #333; } #getting-started li p { color: #555; font-size: 13px; } #search { margin: 0; padding-top: 10px; padding-bottom: 10px; font-size: 11px; } #search input { font-size: 11px; margin: 2px; } #search-text {width: 170px} #sidebar ul { margin-left: 0; padding-left: 0; } #sidebar ul h3 { margin-top: 25px; font-size: 16px; padding-bottom: 10px; border-bottom: 1px solid #ccc; } #sidebar li { list-style-type: none; } #sidebar ul.links li { margin-bottom: 5px; } h1, h2, h3, h4, h5 { font-family: sans-serif; margin: 1.2em 0 0.6em 0; } p { line-height: 1.5em; margin: 1.6em 0; } code, tt { font-family: \'Andale Mono\', Monaco, \'Liberation Mono\', \'Bitstream Vera Sans Mono\', \'DejaVu Sans Mono\', monospace; } #footer { clear: both; padding-top: 2em; text-align: center; padding-right: 160px; font-family: sans-serif; font-size: 10px; } ', # error.css "error.css" => "body { font-family: Lucida,sans-serif; } h1 { color: #AA0000; border-bottom: 1px solid #444; } h2 { color: #444; } pre { font-family: \"lucida console\",\"monaco\",\"andale mono\",\"bitstream vera sans mono\",\"consolas\",monospace; font-size: 12px; border-left: 2px solid #777; padding-left: 1em; } footer { font-size: 10px; } span.key { color: #449; font-weight: bold; width: 120px; display: inline; } span.value { color: #494; } /* these are for the message boxes */ pre.content { background-color: #eee; color: #000; padding: 1em; margin: 0; border: 1px solid #aaa; border-top: 0; margin-bottom: 1em; } div.title { font-family: \"lucida console\",\"monaco\",\"andale mono\",\"bitstream vera sans mono\",\"consolas\",monospace; font-size: 12px; background-color: #aaa; color: #444; font-weight: bold; padding: 3px; padding-left: 10px; } pre.content span.nu { color: #889; margin-right: 10px; } pre.error { background: #334; color: #ccd; padding: 1em; border-top: 1px solid #000; border-left: 1px solid #000; border-right: 1px solid #eee; border-bottom: 1px solid #eee; } ", "404.html" => < Error 404

Error 404

Page Not Found

Sorry, this is the void.

EOH "500.html" => < Error 500

Error 500

Internal Server Error

Wooops, something went wrong

EOH 'config.yml' => "# This is the main configuration file of your Dancer app # env-related settings should go to environments/\$env.yml. # All the settings in this file will be loaded at Dancer's startup. # Your application's name appname: \"$name\" # The default layout to use for your application (located in # views/layouts/main.tt) layout: \"main\" # When the charset is set to UTF-8 Dancer will handle for you # all the magic of encoding and decoding. You should not care # about unicode within your app when this setting is set (recommended). charset: \"UTF-8\" # template engine # simple: default and very basic template engine # template_toolkit: TT template: \"simple\" # template: \"template_toolkit\" # engines: # template_toolkit: # start_tag: '[%' # end_tag: '%]' # For session support enable the following line and see Dancer::Session # session: \"YAML\" ", 'jquery.min.js' => jquery_minified(), 'MANIFEST.SKIP' => manifest_skip(), 'development.yml' => "# configuration file for development environment # the logger engine to use # console: log messages to STDERR (your console where you started the # application server) # file: log message to a file in log/ logger: \"console\" # the log level for this environment # core is the lowest, it shows Dancer's core log messages as well as yours # (debug, info, warning and error) log: \"core\" # Should Dancer consider warnings as critical errors? warnings: 1 # Should Dancer show a stacktrace when an error is caught? show_errors: 1 ", 'production.yml' => '# configuration file for production environment # only log warning and error messages log: "warning" # log message to a file in logs/ logger: "file" # don\'t consider warnings critical warnings: 0 # hide errors show_errors: 0 # cache route resolution for maximum performance route_cache: 1 ', "001_base.t" => "use Test::More tests => 1; use strict; use warnings; use_ok '$appname'; ", "002_index_route.t" => "use Test::More tests => 2; use strict; use warnings; # the order is important use $appname; use Dancer::Test; route_exists [GET => '/'], 'a route handler is defined for /'; response_status_is ['GET' => '/'], 200, 'response status is 200 for /'; ", }; } sub write_bg { my $path = shift; my $data =<<'EOF'; M_]C_X``02D9)1@`!`0$`2`!(``#_VP!#``4#!`0$`P4$!`0%!04&!PP(!P<' M!P\+"PD,$0\2$A$/$1$3%AP7$Q0:%1$1&"$8&AT='Q\?$Q)!P>'Q[_ MVP!#`04%!0<&!PX("`X>%!$4'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX> M'AX>'AX>'AX>'AX>'AX>'AX>'AX>'A[_P``1"`'T`?0#`2(``A$!`Q$!_\0` M&0`!``,!`0````````````````(#!`$(_\0`*Q`!``("``4#!`,!`0$!```` M``$"`Q$$$B$Q,C-!41,B87$C0E(48H%#_\0`%`$!```````````````````` M`/_$`!01`0````````````````````#_V@`,`P$``A$#$0`_`/2H```````` M```````````````````````````````````````````````````````````` M````````````````````````YN#?=`!*WRY$2[R6^`.:3FGY=BEI M]G)I8#GM\NQDM'NYRRY,2"R,U_E*,_RIUI[H`G?):WNB1&^R=,5K>V@5I169[0OKBK7REV;TKXQ "$@H` M:XK3WA9&"/>7>>]NU9@C'>W>TP!R8Z^[O-BCX(Q?,[2C'3X!'ZE/:(<^K'^8 M6(3Y*_Y@Y*?Y@$/XI]X< MG%2W:4IQ5]NCDXI]K:!"V"8[=5_5-AB9CLLQYICOU!J$:7BT=)2`````` M```````````````````````````1M:*QN4;3N03R99MTCI"MQ.E M)MV!&(WV64PS;K/1;6E,<;GNC-[7G5.@)17'2/:9^X7@*8R1;I: M-%L5;>,PLM2MNZJ:7IUK/0%5Z36>R#57)%OMM'5#)A]Z@IK,UG<-&++$])9Y MB8GJX#>,N++->D]FFMHM&X!T```````````````````````````!3ERZZ1W< MS9==(4`3,S/4(B9G4-&/'6D5L1$1J'0`; <16TS:8E'^^W:=Y`M>=ZAV;?;N'*QN\NVCEIH"@`` MVM,]DT*3$]$Y!7SSS?A.;=-H6B*__7;>,`5M,SJ2]IB=1W1CR=MZD`E2VXZH MS>=_ARGN>T@LK.XVZCC\(2`$(O&])@A?'%OPK^_'^E[DQON"N8IEA1DI-)ZK MKXYB>:KM;Q;[;QJ094\=YK*67%->L=E0-M+Q:.B3%2TUG<-6.\7C\@F````` M```````````````````ISY-1J'KE:ZF9!&LZO,NVGFIMVU-SN)=F MOVZ@'*1":%:VB>Z4]@0\K?IW)VASDM$[B4];KJ05QY.V]2':TF)W,NWKOK'< M$L=)6`*:7U/+=' M+BU]U>RW)2+1^4,=IK/)?L#.ECM-9VGGQZ^ZO92#;2T6C<),>*\UG\-=9BT; M@'0```````````````````$_X/KW_`-( MSQGGW3KFK/<%HY$Q,='0`49,UJWF([`O&;Z]_P`'U[_@&D9OKW_!]>_X!I&; MZ]_POQS-J[D$@0RVFM=P"8S?7O\`@^O?\`TC-]>_X=C//N#0*JYJSW61,3V! MT``%.7+:DZ@%PS?7O^':Y[S,1T!H``0R4YH_*8"G';^EE>;'RSN.R[+3<;CO M#F.T7KRV[@RKL%^6=3V0R5FMM(`WP*<%]QJ5P`````````````````(WGEK, M@KXB^HU#,E>>:VW(C6OY3`$;^,L<] /VR_C+'/<'`68L?/OKK0* MQ;;%KM.U/)-9::6BT;AB6\/;5N7Y!JADS^K+6R9_5D%8)XZ\]M;T"` MO^A'^SZ,?[!3'=KP^G"KZ,?[78XU70)*\_@L5Y_`&0``74Q1;'S3.G+8ICM. MP5IX\DUG\(.`W5M%HW#K/PUNNF@!EXCRAJ9>(\H!4E3RC]HI4\H_8-H```"G *+6:SSU7.3&XT"@`` M[1&7'N.[-,:G2^/X\FO:7.(I_:.P*J6Y;1+72W-6)8EW#WU.I!I````````` M```````9^(O[0OO/+698[SNTR"*_AZ?VGLIK&YB&F\_3QQ$`C/\`)DU[+HC4 M:0PUY:_M8``"-_&6.>[9?QECGN#C1PO]F=HX3W!;RQ[,_$5U?;4S\2"A*DZM 2M$!NIUK$LN?U9:<7A5FS^K(* MUO#^HJ6\/Z@-,UC?9SEK\)2`CRU^$HZ``KS^"Q7G\`9``:\$1.*-IO+:8TVG<@B[6 M-SIQ9AKN\?`-6/I6(9<_JRUPR9_5D%:WA_4A4E6TUG<`VC)]6Q]6P-8CBG=( MF4@%>?P6*\_@#(`#7P_I+%&+)%<>G,F:>T`CGMS65.SUEP$\4;M#8S\-7WEH M`9>(\H:F7B/*`5)4\H_:*5/*/V#:``````AEKS4GY3`58YYJ32?9GO'+:87> M&7]N<374\WR"FLZF);:SN&%IX>VZZ!<````````````CEGEIM)3Q,_;H&>>L MI88W>$&CAHUN9!W-.[16%M8U&E-/NS6E>````"-_&6.>[9?QECGN#@.Q$SV@ M'!.*6GV3KA]YD%5:S:=0U8J16"E8CM&DX!V&3/ZLM<,F?U9!6"6.O/;4`B+O MH3_J#Z$_Z@%V'TH31QQRTB$@%>?P6*\_@#(``+*XIM7FVA:-3H'%F*G-/Z5K M>'G5M`T4C4)``R\1Y0U,O$>4`J2IY1^T4J>4?L&T```````%6>.D6^"?OQ;3 $O&ZS"@`` M\/::@SK,$ZNADC5M.5G4[!N'*^,.@``````````,W$SN[3/9CRSNP(-5?MPS M/X9JQN6G)TQQ`&".G-\K4,4:I"8````(W\98Y[ME_&6.>X.-'"]K:[L[1PGN 5"S5O?3O+'ND```0R9_5EKADS^K(* MUO#^HJ6\/Z@-$TC9R52D!R(U&G0`5Y_!8KS^`,@`->"-XH4\1&KKN'])#B8] MP9TL MD2Q6[RV9)U5CGN"6*-WA=G\JPJP1_)"S)URU_8+HC4.@````"-_&6.>[9?QE MCGN#C1PGNSM'">X+P```(9,_JRUPR9_5D%:WA_45)X[\EN;6P;)%'_1_Y/\` MH_\`(+Q1_P!'_E;2W-78)*\_@L5Y_`&0`&OA_2=S1O',.'G==+F;AIU:6D!EXCRAJ9>(\H!4E3RC]HNUZ6@&X5?6J?5J"T5?5JG2 MT6[`D````JSQN(6H9?$$,GW8F=IKUPLT]P6\-/732R8)_DAK``````````!# M-X,DM6?P99!;P\?8TJ^A;Y@$<(\H3P7F9U+ MN;'-YW&@9A;]"WS!]"WS`*A;]"WS!]"WS`*FGANTJ_H6^878:36)V"P```!' ()X2DY?PG]`H` M\/HRS3WEIP>G+-/>02P^I#8QX?4AL``````````!7G\&66O-X,D@MX;R2CU9 M1X?R2_\`U_\`H+P`````)1Y(^92GM,L\\1;?:`7( MUO6W:4@`1O/+69!)&:Q,[W*G_HGX@C/:9UJ`7P2Z5@BT3/26;+DFT].R-+3%NX-=HVYRQ'7;DY*Q6.O5 M1DRS;I`+;Y:UC4=U6K9;;=QXIM.[++WKCC4=P2QTBD:]W;5B94?7M\)X\LWM MJ8!9R1\RG+-/>6G#Z4LT]Y!+%ZD-D,>'U(;```````````0R> M+)/=MMUK+%/>06?XU@,O$>4*XG4[6<1Y0J!MQSND2CG\'.'G==.Y_`&7W:L/@ MR^[5A\`0XF)Z*HO.M-62(FDL<@X`#LS,]U^#'TYK*\->:T?#3?ICF(]@59I/5;@K69ZQL%*WA_.%O+3_#M(KOI70(<7WAG:.+]E$=P".C12E9Q M]E%Z\LZ!?@ON-2N9,,ZR0U@````(9?%-7GG40#E.F%FGNT7Z86<$\'J0ULW# MQ]VVD``````````">S%DC5FUEXB-7!"DZMM?EZTB69JC[L.OP">.=TB4E6"? MLTM````!R?&?TQ3WEMGQG],4]Y!9P_G"_+&Z2HX?SAHR>G8&)?PW=0NX6?OT H#2S\5/6(:&7B)W8%8ECC=G,GG(+^&G[=+F?AI^[30#+Q'E"I;Q'E"@`` M@7<-.K+<_@S4G5H:G8&)?PWDH7\-Y`T``HXOV41W7\7[*([@UX?3A3Q/3(NP 7^G"CB)W<$,?E#97M#'C\X;([`Z````H` M<_6U8_*Y3Y9ICX`XF=4B&9=Q,_=I4"_A8Z3*]7@C55@``````````"CB8Z;7 MH9HW28!C:.&G<3"B>Z>&VKP"W']N6T2N49HY;Q:/==$[@'0```06I`$QRV73 ,.\$2KSQJ\NUG^/0* M_=JP^#+[M6'P!'B>D0S-/$]H9@%F#SA6LP>I`-:.3T[)(Y/3L#$GCR32=Q"` 1"_\`Z+?$+XG<1+%#;7PC]`H` M>+]E$+^+]F<%]\V2S M6U77RYX80499W?:,1N24\$;N#52-5AT`````````````8\D:M*,3J=K^)K[P MS@U3]^*)=P6W37NAP]M[K)'V9=>P+P```06TJ0". M\-M9W$,4=VO%.Z@HXCRA#'ZE?VGQ'E"&/U*_L%W%1VE1$M>:-U9`/=JP^#+# M5A\`=RUB:3/PR->68BDQ\L8"WA_45.UF8G<`W(Y/3L8[J MI?PWD"7)7_*V.QIT%'%^RB.Z_B_91'<%MJQ]*)B.JKW:8C>%FGN#7AG=$U/# M3NLK@```1R3RUF056^_+'X.)M[0[AC43>?=3DGFO,@@T<-7IM1'66S'7EKH$ M@`````````````1R1S5F&.T:F8;F;B*ZG?R"NDS%H7YHYJ1:&9HX>VXY9!9B KMS5341_'DU[+P``06NP9&G GAIWC9I7\-/30(<1Y0AC]2O[3XCR0Q^I7]@V6ZQ+'>-6TVLO$1JX* MX:\,?8RTCFMIIR6Y,>O<%7$7W.H]E+LSN=D1N0<$YQVBNYA`%_#WU/+\KLGI MV8ZSJVVN-7QZ^08U_#>2&3':OZVI@'.+]E$=U M_%^RB.X->.-XF2T:F6O#Z3-EC5@6<-/730R8)UDAK```4Y9YKQ6.RS);EKM7 MBC43>P&:>2D59D\MN:THQUG0+.'KNW7LU*\->6BP``````````````!')7FK M*0##:-3IVDS6VX7<13^T,X-5HC)CW'=W#;<:GO"K!?4ZGLGDCEMSU[`N$:6B MT;2!R?&?TQ3WEN5,ND]@8;1J5O#3]VEDUI[T=I%8MTKJ05<3YJ\ *S/6NW*Q3<:IH%JGB8^W:Y&\1,=8V"@`` M>&KO[D<]MV:*1$5^V-,E_*0178N2O6=*0&R;TF-3++DB(MT1=@'$JWM7M*RN M/GKN.BNU9K/6`:,=XR1J5.:O+?4)<-&[2MO%9GK78,BW!YPMY:?X=I%=]*Z! 4#B^\*([M>2*SKFKM'EI_@$L/IPH` M.)C5VFNHCHC>*S/6NP9:3JT-E>M85\M/\+([`Z"K-?\`K7N",_R9->QGMRUY M82C6*FY[L]IYIV"*W!3FMOX5UC6OY!,`````````````````'+1N-, MF2O+;38AEIS5!D:,-XO7ELSS&IT5F:SN`7QO'?\`$KHG<;A7$QEI^4:6FEN6 MW8%X```````````````"NV.EIVL1FL2"$8:._1QI[/>DU MG4M<5UV0XB-TW[@[AC5.CF>-TVEBC5#-X2"KA9ZS#0S<-Y2T@```````C>T5 MC8.9+16OY0Q5_O9RE9O;FMV5[D1J-.@ <````````````````````ISX]QS0SMS/FQZZP"@`` MJ6FL[AHG66OY9DJ7FL@NQWFD\MERK[G=&EII/+;L"\P(TI6L]$W*Q MIT`````$;WBL?D"]HK&Y55B[,1,Q.X!?]V.?F%M+1:.BK'EBWVV=M2:SS4D%P MJIEB>ENZT`````57F>;IV65WH'4(US)JX\I!*;1$Z=CJKZ1;JLB-1T!#)&[0 M[-8BG1S)OFZ.]8IU!'^KENT._P!7+>,`[,[TMA3VG2Z`!R_CT0QS.P6````# MEK16.LJ9O:\ZH">3)KI'64:TF?NO+L5KCC=NZK+EFW2.P)9 M[/,3$ZEN0R8XM`,BS'EFO2>R-\=JSVZ(`U:IDCITE'[\<_A1$S':5U,WM:`6 D5RUM^UBJ:TOXSI'^2G:-P"\55RQ_;HLK:)[2#N@`%<>4K#0* MK3N=2LKVZFH^'05W\X3M&ZN@*=^SMHUJ%FH^#4`KO'WK8`!S3H`(VO6.\JYR M6GQC8+9F(C2V2M(U7NKR99MVZ*P=O M>;3N478C:W'AF>MN@(8Z3:>W1II2*QT2K$1&H=`````````````````````` M``````````!R8B>ZG)A]X7@,-JS'>'&VU*V[PIOA]X!3%ICM*ZF;VF-JIK,= MX1!JB<=N^HER<<]ZV9TJY+1[@MWDK[3*499]ZZ0KGUWZI1>EN\`G&2D^[O-7 MYA#DQ3\.?3C^LP"W8-8J]H!R8=G-6.D0A;-:>W0$XQUKY3 MLMDI7QB%%K3/>4067RVM^$)ZB5,=K?@$$Z8[6GLOIAB._59$1$=`0ICBL=>J MP```````````````````````````````````````1M6+=X5WP1/BN`9+8K50 MU/PW(VI$^P,3K1;!7V0MAGV!4[%ICW2G%:/9&:3'L#L9+1[N_5O\H3$P`L^M M?Y2OP12OQ"0#G+7X@Y8^(=`0"%@GX`B8-Z`(>$@0")AH(`CXF! M`(^,AP"3C80`DXV%`)"-B`"5CX8`D8Z+`)B3B0"PI@"W ML*<`N;&G`+6RK0"[LZ@`N[2J`+BTK0"\M:L`OK:M`+FVL0#!N:T`P;FN`,*Z ML0##N[``PKNQ`,2\L`#$O+$`P[RR`,*^N`#&O[0`R,"V`,K!MP#)P;@`R\*V M`,K#N0#/QKH`T37`.;CW@#HX]\`[N77`.WEV`#NY=D`[^;8 M`/#GV`#PY]D`\>?9`/#GV@#PY]P`\>C;`/+IVP#T[-\`\.OF`/#LY@#X[N`` M^>_B`/SRY0#X].\`^O?R`/[[]@#__/<`_?W]`/[]_0#]_?X`_?[^`/__^@#^ M_OX`_?[_`/[__P#___\````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M````````QLG&P90(O\+&QGT0BI9>%!$4'AX>'AX> M'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'A[_ MP``1"`!``$`#`2(``A$!`Q$!_\0`&P```@,!`0$`````````````!@<$!0@# M`0+_Q``W$``!!`$"`P4%!P0#`0`````!`@,$!1$`!@<2(0@3(C%!%5%A<8$4 M%B0R0E*1(S-RH4-B8X+_Q``7`0`#`0```````````````````@,!_\0`'!$` M`P$``P$!``````````````$"$1(A(C%!_]H`#`,!``(1`Q$`/P#9>JS>6$I2/F=>[GNZ[;E!-N[60B/"@`` =&RIUYQ9P$I`R=9&DRY/&2^5O7B!:-46QHKP360H` M4X&V>OY7',]%N*QD)/0#J?<62T5U@:7?:'W-NF8J#PFV@N7&*BA-O9A3;3GQ M::`[QSZ#/_7UU!54]HVZ`?F;Z]E*/7NXE?'#>/AWCG./DI`.F-MR9M%G;TF7 MMBZJ/9<2,O[2\P\E00`G/,MP'*0`">OS]-#.W;J+;6J(%;Q!J+.2\4%J+'L> M=SPH\>`#D^6_B;R;N>7JI$VN9*,>[^@LN'Z-G5IMG ,M&6E%.;K.+.UG*4* M6&Q:PB7HG-[EC\S9\NAZCU"=3YMY!L;6165G$.G:FK>4A$860*TJRL2 MGI\,>FB;>+.U)SS-)NJ?7"19\K,%AY24/+)PGE1GJO*CY8QUQ@ZURF"IH:%- M:5]Q7,V%9+9EQ7DA;;K2PI*@?(@CH=3-9#BOWO9UW@B1'<>F[!GN_BXO4B&2 M?[S0]`"?$CT].F,:RJI\6SKH\^$\AZ.^V'&UI.0I)&01J53A6:TSIVM+63N? M=^VN%$!:C'EK^WVR4'JMI"@&VO\`[7@?/E]^J#M?U4:E[.J*R*A"6V)\8'E& M`5>+)_G4^B/MOM=[NFO^(UHC14`^7(&7'?\`3G='Z:^^VNR\_P`$'6V&7'5> IT8YY4))./%[M42\LFWZ0E8(V^=[;X5PS).VON#-]IED+#'?_`&560`H` B]>;EQGUYL:8/8R:X7V5=6^SZUL[YJXRWYD@M+24H4YR9"@`` MSRDX6D>7KIH;KV]44O`3=,>DIXL$O[9EE;<9D(YUF*KT'KG2S[(F^MK1Z^CV M.G;=U%W&XTXA^A+&8WJ$3ICRG MXD%QB?/:C-%QUCQ,O%M2?1?*1X3@]1I?P9_31^]:&+N7;4NHE,(>#K9Y$J'Z ML$8^O4?70)V.MP2XD:]X:6CRG']NO@P5+/5<-P7)Z>(=,)\\IL1&DHS^PL.-Y^K@:3\U:)^T7:W55L".NAM7: MJ9*MH<02FD!2D)=GL-(0J0Q%:4ZM13CE'@(S@?I^>K#B'Q8O*[=E]#@ 5VBXS$W9L>QJPA*0(\DI0X5)./,H* MAC0E6;7WAN-FI@5D7V8[<3[VY2)\\)T:JAQ7)$ $A+1""@`` M6RP'7$`X/BSX4J\TYR,:X5EMN]CA!2[GK=_MUZMR[BC15QHT=&*H*5(2OF4I M2E.%00A1*SS'&23YZ$JO?,.OXZS]]I1%;I9Y>JGL.!3R$]P$%\H'B"<@'.,8 MSJV@4M0[PDH]C-;=G)MT;J@JO7.Z6IB4%_:0AQ"P<*3W93U&!@@Z--S#2W`C M<%IN7AI!LKAYJ3-2\_'!I/\I;2?KJQX1WJ-L\`(3UE^$=J$OPL.(Y"5-.+2%8/GT'-GW:[]CJ 5AE3_`+P<3K)E3;E\^&Z]*QU1#:\* M//\`=Y_()/KIJ?0LKMCVW90UNYMNS:*WCID0IK*FG4*'F",:RI3V=_P%W;]T M-VAV5MB2YBJM%?D6CT;6?)+B1TR_K8]A!?3A;3 "R`H` ('S'N/QU*:PH` MU.@A3V<"UAB5726WVB`3R^:<^\>8UQE7<%DI:5S*4ZRIQ">4@J`!)'4=/(Z5 MUSP`WKLZ6J9PHW;S0DDJ146KBR&Q^UMY!"T#TZ$''F3J`J^[0%4YW5APT59. M(&._1(CNH/\`B`&U8^:E'XZLK3(N&@GAT?#^ZER4L;;CPY,5MU*W4,C.'4EI M0Z#)_/Y?`'1A*GU&T=NQFI\Q+3$.,AM'.05K2A(3G'KY>?EI4-VO:"N%J9K> /'*:E:_\`F>E,M-'/[N4* M<^J5I.K7;O9WW%N:@\1'31S2!0V M"S:;SM#[O36UR'8>Q8+OXZ:.B9(!_L-']6<>)0Z>@Z>>LZ:NB5-7&K8#*&(T J9M+;3:1@)2!@#7Q04U70U3%73P6(4-A`0VRR@)2D#W`:GZC5:6Fa?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(n.isPlainObject(c)||(b=n.isArray(c)))?(b?(b=!1,f=a&&n.isArray(a)?a:[]):f=a&&n.isPlainObject(a)?a:{},g[d]=n.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray||function(a){return"array"===n.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return a-parseFloat(a)>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(l.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&n.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:k&&!k.call("\ufeff\xa0")?function(a){return null==a?"":k.call(a)}:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),n.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||n.guid++,e):void 0},now:function(){return+new Date},support:l}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s="sizzle"+-new Date,t=a.document,u=0,v=0,w=eb(),x=eb(),y=eb(),z=function(a,b){return a===b&&(j=!0),0},A="undefined",B=1<<31,C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=D.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",M=L.replace("w","w#"),N="\\["+K+"*("+L+")"+K+"*(?:([*^$|!~]?=)"+K+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+M+")|)|)"+K+"*\\]",O=":("+L+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+N.replace(3,8)+")*)|.*)\\)|)",P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(O),U=new RegExp("^"+M+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L.replace("w","w*")+")"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=/'|\\/g,ab=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),bb=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{G.apply(D=H.call(t.childNodes),t.childNodes),D[t.childNodes.length].nodeType}catch(cb){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function db(a,b,d,e){var f,g,h,i,j,m,p,q,u,v;if((b?b.ownerDocument||b:t)!==l&&k(b),b=b||l,d=d||[],!a||"string"!=typeof a)return d;if(1!==(i=b.nodeType)&&9!==i)return[];if(n&&!e){if(f=Z.exec(a))if(h=f[1]){if(9===i){if(g=b.getElementById(h),!g||!g.parentNode)return d;if(g.id===h)return d.push(g),d}else if(b.ownerDocument&&(g=b.ownerDocument.getElementById(h))&&r(b,g)&&g.id===h)return d.push(g),d}else{if(f[2])return G.apply(d,b.getElementsByTagName(a)),d;if((h=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(h)),d}if(c.qsa&&(!o||!o.test(a))){if(q=p=s,u=b,v=9===i&&a,1===i&&"object"!==b.nodeName.toLowerCase()){m=ob(a),(p=b.getAttribute("id"))?q=p.replace(_,"\\$&"):b.setAttribute("id",q),q="[id='"+q+"'] ",j=m.length;while(j--)m[j]=q+pb(m[j]);u=$.test(a)&&mb(b.parentNode)||b,v=m.join(",")}if(v)try{return G.apply(d,u.querySelectorAll(v)),d}catch(w){}finally{p||b.removeAttribute("id")}}}return xb(a.replace(P,"$1"),b,d,e)}function eb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function fb(a){return a[s]=!0,a}function gb(a){var b=l.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function hb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function ib(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||B)-(~a.sourceIndex||B);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function jb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function kb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function lb(a){return fb(function(b){return b=+b,fb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function mb(a){return a&&typeof a.getElementsByTagName!==A&&a}c=db.support={},f=db.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},k=db.setDocument=function(a){var b,e=a?a.ownerDocument||a:t,g=e.defaultView;return e!==l&&9===e.nodeType&&e.documentElement?(l=e,m=e.documentElement,n=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){k()},!1):g.attachEvent&&g.attachEvent("onunload",function(){k()})),c.attributes=gb(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=gb(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(e.getElementsByClassName)&&gb(function(a){return a.innerHTML="
",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=gb(function(a){return m.appendChild(a).id=s,!e.getElementsByName||!e.getElementsByName(s).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==A&&n){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ab,bb);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ab,bb);return function(a){var c=typeof a.getAttributeNode!==A&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==A?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==A&&n?b.getElementsByClassName(a):void 0},p=[],o=[],(c.qsa=Y.test(e.querySelectorAll))&&(gb(function(a){a.innerHTML="",a.querySelectorAll("[t^='']").length&&o.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||o.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll(":checked").length||o.push(":checked")}),gb(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&o.push("name"+K+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||o.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),o.push(",.*:")})),(c.matchesSelector=Y.test(q=m.webkitMatchesSelector||m.mozMatchesSelector||m.oMatchesSelector||m.msMatchesSelector))&&gb(function(a){c.disconnectedMatch=q.call(a,"div"),q.call(a,"[s!='']:x"),p.push("!=",O)}),o=o.length&&new RegExp(o.join("|")),p=p.length&&new RegExp(p.join("|")),b=Y.test(m.compareDocumentPosition),r=b||Y.test(m.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},z=b?function(a,b){if(a===b)return j=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===t&&r(t,a)?-1:b===e||b.ownerDocument===t&&r(t,b)?1:i?I.call(i,a)-I.call(i,b):0:4&d?-1:1)}:function(a,b){if(a===b)return j=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],k=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:i?I.call(i,a)-I.call(i,b):0;if(f===g)return ib(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)k.unshift(c);while(h[d]===k[d])d++;return d?ib(h[d],k[d]):h[d]===t?-1:k[d]===t?1:0},e):l},db.matches=function(a,b){return db(a,null,null,b)},db.matchesSelector=function(a,b){if((a.ownerDocument||a)!==l&&k(a),b=b.replace(S,"='$1']"),!(!c.matchesSelector||!n||p&&p.test(b)||o&&o.test(b)))try{var d=q.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return db(b,l,null,[a]).length>0},db.contains=function(a,b){return(a.ownerDocument||a)!==l&&k(a),r(a,b)},db.attr=function(a,b){(a.ownerDocument||a)!==l&&k(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!n):void 0;return void 0!==f?f:c.attributes||!n?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},db.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},db.uniqueSort=function(a){var b,d=[],e=0,f=0;if(j=!c.detectDuplicates,i=!c.sortStable&&a.slice(0),a.sort(z),j){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return i=null,a},e=db.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=db.selectors={cacheLength:50,createPseudo:fb,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ab,bb),a[3]=(a[4]||a[5]||"").replace(ab,bb),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||db.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&db.error(a[0]),a},PSEUDO:function(a){var b,c=!a[5]&&a[2];return V.CHILD.test(a[0])?null:(a[3]&&void 0!==a[4]?a[2]=a[4]:c&&T.test(c)&&(b=ob(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ab,bb).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=w[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&w(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==A&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=db.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),t=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&t){k=q[s]||(q[s]={}),j=k[a]||[],n=j[0]===u&&j[1],m=j[0]===u&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[u,n,m];break}}else if(t&&(j=(b[s]||(b[s]={}))[a])&&j[0]===u)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(t&&((l[s]||(l[s]={}))[a]=[u,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||db.error("unsupported pseudo: "+a);return e[s]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?fb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:fb(function(a){var b=[],c=[],d=g(a.replace(P,"$1"));return d[s]?fb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:fb(function(a){return function(b){return db(a,b).length>0}}),contains:fb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:fb(function(a){return U.test(a||"")||db.error("unsupported lang: "+a),a=a.replace(ab,bb).toLowerCase(),function(b){var c;do if(c=n?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===m},focus:function(a){return a===l.activeElement&&(!l.hasFocus||l.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:lb(function(){return[0]}),last:lb(function(a,b){return[b-1]}),eq:lb(function(a,b,c){return[0>c?c+b:c]}),even:lb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:lb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:lb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:lb(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function qb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=v++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[u,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[s]||(b[s]={}),(h=i[d])&&h[0]===u&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function rb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function sb(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function tb(a,b,c,d,e,f){return d&&!d[s]&&(d=tb(d)),e&&!e[s]&&(e=tb(e,f)),fb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||wb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:sb(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=sb(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?I.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=sb(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ub(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],i=g||d.relative[" "],j=g?1:0,k=qb(function(a){return a===b},i,!0),l=qb(function(a){return I.call(b,a)>-1},i,!0),m=[function(a,c,d){return!g&&(d||c!==h)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>j;j++)if(c=d.relative[a[j].type])m=[qb(rb(m),c)];else{if(c=d.filter[a[j].type].apply(null,a[j].matches),c[s]){for(e=++j;f>e;e++)if(d.relative[a[e].type])break;return tb(j>1&&rb(m),j>1&&pb(a.slice(0,j-1).concat({value:" "===a[j-2].type?"*":""})).replace(P,"$1"),c,e>j&&ub(a.slice(j,e)),f>e&&ub(a=a.slice(e)),f>e&&pb(a))}m.push(c)}return rb(m)}function vb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,i,j,k){var m,n,o,p=0,q="0",r=f&&[],s=[],t=h,v=f||e&&d.find.TAG("*",k),w=u+=null==t?1:Math.random()||.1,x=v.length;for(k&&(h=g!==l&&g);q!==x&&null!=(m=v[q]);q++){if(e&&m){n=0;while(o=a[n++])if(o(m,g,i)){j.push(m);break}k&&(u=w)}c&&((m=!o&&m)&&p--,f&&r.push(m))}if(p+=q,c&&q!==p){n=0;while(o=b[n++])o(r,s,g,i);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=E.call(j));s=sb(s)}G.apply(j,s),k&&!f&&s.length>0&&p+b.length>1&&db.uniqueSort(j)}return k&&(u=w,h=t),r};return c?fb(f):f}g=db.compile=function(a,b){var c,d=[],e=[],f=y[a+" "];if(!f){b||(b=ob(a)),c=b.length;while(c--)f=ub(b[c]),f[s]?d.push(f):e.push(f);f=y(a,vb(e,d))}return f};function wb(a,b,c){for(var d=0,e=b.length;e>d;d++)db(a,b[d],c);return c}function xb(a,b,e,f){var h,i,j,k,l,m=ob(a);if(!f&&1===m.length){if(i=m[0]=m[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&c.getById&&9===b.nodeType&&n&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(ab,bb),b)||[])[0],!b)return e;a=a.slice(i.shift().value.length)}h=V.needsContext.test(a)?0:i.length;while(h--){if(j=i[h],d.relative[k=j.type])break;if((l=d.find[k])&&(f=l(j.matches[0].replace(ab,bb),$.test(i[0].type)&&mb(b.parentNode)||b))){if(i.splice(h,1),a=f.length&&pb(i),!a)return G.apply(e,f),e;break}}}return g(a,m)(f,b,!n,e,$.test(a)&&mb(b.parentNode)||b),e}return c.sortStable=s.split("").sort(z).join("")===s,c.detectDuplicates=!!j,k(),c.sortDetached=gb(function(a){return 1&a.compareDocumentPosition(l.createElement("div"))}),gb(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||hb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&gb(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||hb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),gb(function(a){return null==a.getAttribute("disabled")})||hb(J,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),db}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return n.inArray(a,b)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;e>b;b++)if(n.contains(d[b],this))return!0}));for(b=0;e>b;b++)n.find(a,d[b],c);return c=this.pushStack(e>1?n.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=a.document,A=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,B=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:A.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:z,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=z.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return y.find(a);this.length=1,this[0]=d}return this.context=z,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};B.prototype=n.fn,y=n(z);var C=/^(?:parents|prev(?:Until|All))/,D={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!n(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b,c=n(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(n.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?n.inArray(this[0],n(a)):n.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function E(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return E(a,"nextSibling")},prev:function(a){return E(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return n.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(D[a]||(e=n.unique(e)),C.test(a)&&(e=e.reverse())),this.pushStack(e)}});var F=/\S+/g,G={};function H(a){var b=G[a]={};return n.each(a.match(F)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?G[a]||H(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&n.each(arguments,function(a,c){var d;while((d=n.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){if(a===!0?!--n.readyWait:!n.isReady){if(!z.body)return setTimeout(n.ready);n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(z,[n]),n.fn.trigger&&n(z).trigger("ready").off("ready"))}}});function J(){z.addEventListener?(z.removeEventListener("DOMContentLoaded",K,!1),a.removeEventListener("load",K,!1)):(z.detachEvent("onreadystatechange",K),a.detachEvent("onload",K))}function K(){(z.addEventListener||"load"===event.type||"complete"===z.readyState)&&(J(),n.ready())}n.ready.promise=function(b){if(!I)if(I=n.Deferred(),"complete"===z.readyState)setTimeout(n.ready);else if(z.addEventListener)z.addEventListener("DOMContentLoaded",K,!1),a.addEventListener("load",K,!1);else{z.attachEvent("onreadystatechange",K),a.attachEvent("onload",K);var c=!1;try{c=null==a.frameElement&&z.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!n.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}J(),n.ready()}}()}return I.promise(b)};var L="undefined",M;for(M in n(l))break;l.ownLast="0"!==M,l.inlineBlockNeedsLayout=!1,n(function(){var a,b,c=z.getElementsByTagName("body")[0];c&&(a=z.createElement("div"),a.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",b=z.createElement("div"),c.appendChild(a).appendChild(b),typeof b.style.zoom!==L&&(b.style.cssText="border:0;margin:0;width:1px;padding:1px;display:inline;zoom:1",(l.inlineBlockNeedsLayout=3===b.offsetWidth)&&(c.style.zoom=1)),c.removeChild(a),a=b=null)}),function(){var a=z.createElement("div");if(null==l.deleteExpando){l.deleteExpando=!0;try{delete a.test}catch(b){l.deleteExpando=!1}}a=null}(),n.acceptData=function(a){var b=n.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(O,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}n.data(a,b,c)}else c=void 0}return c}function Q(a){var b;for(b in a)if(("data"!==b||!n.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function R(a,b,d,e){if(n.acceptData(a)){var f,g,h=n.expando,i=a.nodeType,j=i?n.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||n.guid++:h),j[k]||(j[k]=i?{}:{toJSON:n.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=n.extend(j[k],b):j[k].data=n.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[n.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[n.camelCase(b)])):f=g,f }}function S(a,b,c){if(n.acceptData(a)){var d,e,f=a.nodeType,g=f?n.cache:a,h=f?a[n.expando]:n.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){n.isArray(b)?b=b.concat(n.map(b,n.camelCase)):b in d?b=[b]:(b=n.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!Q(d):!n.isEmptyObject(d))return}(c||(delete g[h].data,Q(g[h])))&&(f?n.cleanData([a],!0):l.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}n.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?n.cache[a[n.expando]]:a[n.expando],!!a&&!Q(a)},data:function(a,b,c){return R(a,b,c)},removeData:function(a,b){return S(a,b)},_data:function(a,b,c){return R(a,b,c,!0)},_removeData:function(a,b){return S(a,b,!0)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=n.data(f),1===f.nodeType&&!n._data(f,"parsedAttrs"))){c=g.length;while(c--)d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d]));n._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){n.data(this,a)}):arguments.length>1?this.each(function(){n.data(this,a,b)}):f?P(f,a,n.data(f,a)):void 0},removeData:function(a){return this.each(function(){n.removeData(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=n._data(a,b),c&&(!d||n.isArray(c)?d=n._data(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return n._data(a,c)||n._data(a,c,{empty:n.Callbacks("once memory").add(function(){n._removeData(a,b+"queue"),n._removeData(a,c)})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},X=/^(?:checkbox|radio)$/i;!function(){var a=z.createDocumentFragment(),b=z.createElement("div"),c=z.createElement("input");if(b.setAttribute("className","t"),b.innerHTML="
a",l.leadingWhitespace=3===b.firstChild.nodeType,l.tbody=!b.getElementsByTagName("tbody").length,l.htmlSerialize=!!b.getElementsByTagName("link").length,l.html5Clone="<:nav>"!==z.createElement("nav").cloneNode(!0).outerHTML,c.type="checkbox",c.checked=!0,a.appendChild(c),l.appendChecked=c.checked,b.innerHTML="",l.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,a.appendChild(b),b.innerHTML="",l.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,l.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){l.noCloneEvent=!1}),b.cloneNode(!0).click()),null==l.deleteExpando){l.deleteExpando=!0;try{delete b.test}catch(d){l.deleteExpando=!1}}a=b=c=null}(),function(){var b,c,d=z.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(l[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),l[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var Y=/^(?:input|select|textarea)$/i,Z=/^key/,$=/^(?:mouse|contextmenu)|click/,_=/^(?:focusinfocus|focusoutblur)$/,ab=/^([^.]*)(?:\.(.+)|)$/;function bb(){return!0}function cb(){return!1}function db(){try{return z.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=n.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof n===L||a&&n.event.triggered===a.type?void 0:n.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(F)||[""],h=b.length;while(h--)f=ab.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=n.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=n.event.special[o]||{},l=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},i),(m=g[o])||(m=g[o]=[],m.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,l):m.push(l),n.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n.hasData(a)&&n._data(a);if(r&&(k=r.events)){b=(b||"").match(F)||[""],j=b.length;while(j--)if(h=ab.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=m.length;while(f--)g=m[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(m.splice(f,1),g.selector&&m.delegateCount--,l.remove&&l.remove.call(a,g));i&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(k)&&(delete r.handle,n._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,m,o=[d||z],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||z,3!==d.nodeType&&8!==d.nodeType&&!_.test(p+n.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[n.expando]?b:new n.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),k=n.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!n.isWindow(d)){for(i=k.delegateType||p,_.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||z)&&o.push(l.defaultView||l.parentWindow||a)}m=0;while((h=o[m++])&&!b.isPropagationStopped())b.type=m>1?i:k.bindType||p,f=(n._data(h,"events")||{})[b.type]&&n._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&n.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&n.acceptData(d)&&g&&d[p]&&!n.isWindow(d)){l=d[g],l&&(d[g]=null),n.event.triggered=p;try{d[p]()}catch(r){}n.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(n._data(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((n.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?n(c,this).index(i)>=0:n.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h]","i"),ib=/^\s+/,jb=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,kb=/<([\w:]+)/,lb=/\s*$/g,sb={option:[1,""],legend:[1,"
","
"],area:[1,"",""],param:[1,"",""],thead:[1,"","
"],tr:[2,"","
"],col:[2,"","
"],td:[3,"","
"],_default:l.htmlSerialize?[0,"",""]:[1,"X
","
"]},tb=eb(z),ub=tb.appendChild(z.createElement("div"));sb.optgroup=sb.option,sb.tbody=sb.tfoot=sb.colgroup=sb.caption=sb.thead,sb.th=sb.td;function vb(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==L?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==L?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||n.nodeName(d,b)?f.push(d):n.merge(f,vb(d,b));return void 0===b||b&&n.nodeName(a,b)?n.merge([a],f):f}function wb(a){X.test(a.type)&&(a.defaultChecked=a.checked)}function xb(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function yb(a){return a.type=(null!==n.find.attr(a,"type"))+"/"+a.type,a}function zb(a){var b=qb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ab(a,b){for(var c,d=0;null!=(c=a[d]);d++)n._data(c,"globalEval",!b||n._data(b[d],"globalEval"))}function Bb(a,b){if(1===b.nodeType&&n.hasData(a)){var c,d,e,f=n._data(a),g=n._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)n.event.add(b,c,h[c][d])}g.data&&(g.data=n.extend({},g.data))}}function Cb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!l.noCloneEvent&&b[n.expando]){e=n._data(b);for(d in e.events)n.removeEvent(b,d,e.handle);b.removeAttribute(n.expando)}"script"===c&&b.text!==a.text?(yb(b).text=a.text,zb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),l.html5Clone&&a.innerHTML&&!n.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&X.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}n.extend({clone:function(a,b,c){var d,e,f,g,h,i=n.contains(a.ownerDocument,a);if(l.html5Clone||n.isXMLDoc(a)||!hb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ub.innerHTML=a.outerHTML,ub.removeChild(f=ub.firstChild)),!(l.noCloneEvent&&l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(d=vb(f),h=vb(a),g=0;null!=(e=h[g]);++g)d[g]&&Cb(e,d[g]);if(b)if(c)for(h=h||vb(a),d=d||vb(f),g=0;null!=(e=h[g]);g++)Bb(e,d[g]);else Bb(a,f);return d=vb(f,"script"),d.length>0&&Ab(d,!i&&vb(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k,m=a.length,o=eb(b),p=[],q=0;m>q;q++)if(f=a[q],f||0===f)if("object"===n.type(f))n.merge(p,f.nodeType?[f]:f);else if(mb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(kb.exec(f)||["",""])[1].toLowerCase(),k=sb[i]||sb._default,h.innerHTML=k[1]+f.replace(jb,"<$1>")+k[2],e=k[0];while(e--)h=h.lastChild;if(!l.leadingWhitespace&&ib.test(f)&&p.push(b.createTextNode(ib.exec(f)[0])),!l.tbody){f="table"!==i||lb.test(f)?""!==k[1]||lb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)n.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}n.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),l.appendChecked||n.grep(vb(p,"input"),wb),q=0;while(f=p[q++])if((!d||-1===n.inArray(f,d))&&(g=n.contains(f.ownerDocument,f),h=vb(o.appendChild(f),"script"),g&&Ab(h),c)){e=0;while(f=h[e++])pb.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=n.expando,j=n.cache,k=l.deleteExpando,m=n.event.special;null!=(d=a[h]);h++)if((b||n.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)m[e]?n.event.remove(d,e):n.removeEvent(d,e,g.handle);j[f]&&(delete j[f],k?delete d[i]:typeof d.removeAttribute!==L?d.removeAttribute(i):d[i]=null,c.push(f))}}}),n.fn.extend({text:function(a){return W(this,function(a){return void 0===a?n.text(this):this.empty().append((this[0]&&this[0].ownerDocument||z).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=xb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=xb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(vb(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&Ab(vb(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&n.cleanData(vb(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&n.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return W(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(gb,""):void 0;if(!("string"!=typeof a||nb.test(a)||!l.htmlSerialize&&hb.test(a)||!l.leadingWhitespace&&ib.test(a)||sb[(kb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(jb,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(vb(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(vb(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,k=this.length,m=this,o=k-1,p=a[0],q=n.isFunction(p);if(q||k>1&&"string"==typeof p&&!l.checkClone&&ob.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(k&&(i=n.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=n.map(vb(i,"script"),yb),f=g.length;k>j;j++)d=i,j!==o&&(d=n.clone(d,!0,!0),f&&n.merge(g,vb(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,n.map(g,zb),j=0;f>j;j++)d=g[j],pb.test(d.type||"")&&!n._data(d,"globalEval")&&n.contains(h,d)&&(d.src?n._evalUrl&&n._evalUrl(d.src):n.globalEval((d.text||d.textContent||d.innerHTML||"").replace(rb,"")));i=c=null}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=0,e=[],g=n(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),n(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Db,Eb={};function Fb(b,c){var d=n(c.createElement(b)).appendTo(c.body),e=a.getDefaultComputedStyle?a.getDefaultComputedStyle(d[0]).display:n.css(d[0],"display");return d.detach(),e}function Gb(a){var b=z,c=Eb[a];return c||(c=Fb(a,b),"none"!==c&&c||(Db=(Db||n("