# This is the base configuration file for Kalamar.
# Further configurations can override these values.
# To define a new configuration, create a file in the
# root folder of your application with the name like
#
#   kalamar.[MYNAME].conf
#
# To load the configuration, start your application with
# the environment variable
#
#   MOJO_MODE=[MYNAME]
#
# Further typical configurations in this file include
#
# - hypnotoad
#     See Mojo::Server::Hypnotoad
# - MailException
#     See Mojolicious::Plugin::MailException
# - TagHelpers-Pagination
#     See Mojolicious::Plugin::TagHelpers::Pagination
# - Localize
#     See Mojolicious::Plugin::Localize
# - TagHelpers-ContentBlock
#     See Mojolicious::Plugin::TagHelpers::ContentBlock
# - TagHelpers-MailToChiffre
#     See Mojolicious::Plugin::TagHelpers::MailToChiffre
# - CHI
#     See Mojolicious::Plugin::CHI

# For Plugins,
# - Piwik
#     See Mojolicious::Plugin::Piwik

{
  Kalamar => {
    ## Backend server path
    # api_path => 'https://korap.example.org/api/',

    ## Backend API version
    # api_version => '1.0',

    ## If the application is run behind a proxy, ignore the forwarded host
    # proxy_host => 0,

    ## Run the application in a subfolder behind a proxy:
    # proxy_prefix => '/korap',

    ## The name of the base corpus,
    ## for query examples (see kalamar.queries.dict)
    # examplecorpus => 'dereko',

    ## For further Plugins, add them
    ## to this array:
    # plugins => [],
    ## Currently bundled: Piwik, Auth

    ## Require everything to be send via https only:
    # https_only => 1,

    ## Override default content security policy
    # cs_policy => "default-src '*';"

    ## Set proxy timeouts
    # proxy_inactivity_timeout => 120,
    # proxy_connect_timeout => 120,
  }
}
