[
  {
    "path": ".gitignore",
    "content": "local/*\nfiles/*\ncover_db/*\n*.conf\n*.db\n*.db-shm\n*.db-wal\n*.bak\n*.swp\nscript/*.pid\nstop-upload\n.zanata-cache/\nthemes/*\n!themes/default\n!themes/default/*\n"
  },
  {
    "path": ".gitlab-ci.yml",
    "content": "image: hatsoftwares/lufi-test-ci:bullseye\nstages:\n  - create_release\n  - publish_changelog\n  - pouet_it\n  - carton\n  - carton_bdd\n  - tests\nvariables:\n  POSTGRES_DB: lufi_db\n  POSTGRES_USER: lufi\n  POSTGRES_PASSWORD: lufi_pwd\n  MYSQL_DATABASE: lufi_db\n  MYSQL_USER: lufi\n  MYSQL_PASSWORD: lufi_pwd\n  MYSQL_ROOT_PASSWORD: root\n\n### Jobs templates\n##\n#\n.retry: &retry\n  retry: 2\n  except:\n    - tags\n.carton_bdd_template: &carton_bdd_definition\n  <<: *retry\n  stage: carton_bdd\n  cache:\n    key: \"$CI_COMMIT_REF_NAME\"\n    paths:\n      - local/\n    policy: pull\n  artifacts:\n    paths:\n      - local.tar\n    expire_in: 3 hours\n  needs:\n    - carton\n  after_script:\n    - tar cf local.tar local/\n\n.tests_template: &tests_template\n  <<: *retry\n  stage: tests\n  coverage: '/Total.* (\\d+\\.\\d+)$/'\n  before_script:\n    - tar xf local.tar && rm local.tar\n    - which mariadb_config && cd $(dirname $(which mariadb_config)) && ln -s mariadb_config mysql_config\n    - cd $CI_PROJECT_DIR\n    - pwd\n  script:\n    - MOJO_CONFIG=\"t/${CI_JOB_NAME}.conf\" make test\n    - MOJO_CONFIG=\"t/${CI_JOB_NAME}.conf\" make cover\n\n.sqlite_template: &sqlite_definition\n  <<: *tests_template\n  needs:\n    - carton_sqlite\n  services:\n    - name: rroemhild/test-openldap\n      alias: rroemhild-test-openldap\n      # - name: openstackswift/saio\n      #   alias: swiftstack-picoswiftstack\n.pg_template: &pg_definition\n  <<: *tests_template\n  needs:\n    - carton_postgresql\n  services:\n    - name: postgres:11\n      alias: postgres\n    - name: rroemhild/test-openldap\n      alias: rroemhild-test-openldap\n      # - name: openstackswift/saio\n      #   alias: swiftstack-picoswiftstack\n.mysql_template: &mysql_definition\n  <<: *tests_template\n  needs:\n    - carton_mysql\n  services:\n    - name: mariadb:10.3\n      alias: mariadb\n    - name: rroemhild/test-openldap\n      alias: rroemhild-test-openldap\n      # - name: openstackswift/saio\n      #   alias: swiftstack-picoswiftstack\n\n### Publish tag changelog and create a toot\n##\n#\ninclude:\n  - 'https://framagit.org/fiat-tux/gitlabci-snippets/-/raw/2aac6c1f3dd725d9aed57549da67a92759f9f9ec/create-release-from-ci.gitlab-ci.yml'\n  - 'https://framagit.org/fiat-tux/gitlabci-snippets/-/raw/4e4e03322e95e9b0124c714456ebf1bdc02ad43f/pouet-it-from-ci.gitlab-ci.yml'\n\n### Podcheck\n##\n#\npodcheck:\n  stage: carton\n  script:\n    - make podcheck\n  except:\n    - tags\n\n### Cpanfile.snapshot\n## Used to get a cpanfile.snapshot from a fresh server (not like my dev VM)\n#\n#cpanfile_snapshot:\n#  stage: carton\n#  script:\n#    - rm cpanfile.snapshot\n#    - which mariadb_config && cd $(dirname $(which mariadb_config)) && ln -s mariadb_config mysql_config\n#    - carton install\n#    - cat cpanfile.snapshot\n#  except:\n#    - tags\n\n### Install common dependencies\n##\n#\ncarton:\n  <<: *retry\n  stage: carton\n  cache:\n    key: \"$CI_COMMIT_REF_NAME\"\n    paths:\n      - local/\n  script:\n    - carton install --deployment --without=sqlite --without=postgresql --without=mysql\n\n### Install DB related dependencies\n##\n#\ncarton_sqlite:\n  <<: *carton_bdd_definition\n  script:\n    - carton install --deployment --without=postgresql --without=mysql\ncarton_postgresql:\n  <<: *carton_bdd_definition\n  script:\n    - carton install --deployment --without=sqlite --without=mysql\ncarton_mysql:\n  <<: *carton_bdd_definition\n  before_script:\n    - which mariadb_config && cd $(dirname $(which mariadb_config)) && ln -s mariadb_config mysql_config\n    - cd $CI_PROJECT_DIR\n  script:\n    - carton install --deployment --without=sqlite --without=postgresql\n\n### Tests\n##\n#\nsqlite:\n  <<: *sqlite_definition\npostgresql:\n  <<: *pg_definition\nmysql:\n  <<: *mysql_definition\n"
  },
  {
    "path": ".provision/README.md",
    "content": "## ansible-role-lufi\n\nAn ansible role deploy the application on host machine(Ubuntu 20.04)\n\n## terraform-aws-lufi\n\nA terraform plan creates necessary AWS infrastructure and deploy the lufi. This terraform plan uses the `lufi_startup.sh` script to deploy application on AWS and also uses above ansible roles `ansible-role-lufi` to configure the application on AWS."
  },
  {
    "path": ".provision/ansible-role-lufi/README.md",
    "content": "Ansible-Role-Lufi\n=========\nThis role installs the and configures Lufi on Debian/Ubuntu servers with nginx web server configuration.\n\nRole Variables\n-------------- \n| Variable name | Value | Description |\n| ------------- | ----- | ----------- |\n| `app_dir` | /var/www/lufi | Set the application directory for the best practice |\n| `lufi_owner` | www-data | Set the application user for the best practice |\n| `lufi_group` | www-data | Set the application group for the best practice |\n| `_contact` | contact.example.com | Contact option (mandatory), where you have to put some way for the users to contact you. |\n| `_report` | report@example.com | report option (mandatory) Put an email address or an URL to let people report illegal files |\n| `_project_version` | master | We can chose the project version either Master branch, Dev branch or tag based |\n| `_server_name` | IP address (or) CNAME/FQDN | Mention the Server Name for the Nginx configurations |\n\nSample example of use in a playbook\n--------------\n\nThe following code has been tested with Ubuntu 20.04\n\n```yaml\n \n- name: \"install lufi\"\n  hosts: enter your hosts file\n  become: yes\n  role:\n    - ansible-role-lufi\n  vars:\n    lufi_owner: \"www-data\"\n    lufi_group: \"www-data\"\n    contact: \"contact.example.com\"\n    report: \"report@example.com\"\n    app_dir: \"/var/www/lufi\"\n    project_version: \"master\"\n    servername: \"IP address (or) CNAME/FQDN\"\n```   \n\nContributing\n------------\nDon’t hesitate to create a pull request\n\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": ".provision/ansible-role-lufi/defaults/main.yml",
    "content": "---\n# defaults file for roles/servers\n\nrobots_text: /var/www/html/\n"
  },
  {
    "path": ".provision/ansible-role-lufi/files/cronjob",
    "content": "#Path of the script\nPATH=/var/www/lufi\n\ncarton exec script/lufi cron cleanbdd --mode production\ncarton exec script/lufi cron cleanfiles --mode production\ncarton exec script/lufi cron watch --mode production\n\n\n"
  },
  {
    "path": ".provision/ansible-role-lufi/files/robots.txt",
    "content": "User-agent: *\nAllow: /$\nAllow: /js/\nAllow: /css/\nAllow: /font/\nAllow: /img/\nDisallow: /r/\n"
  },
  {
    "path": ".provision/ansible-role-lufi/handlers/main.yml",
    "content": "---\n# handlers file for roles/servers\n\n- name: restart nginx\n  service: name=nginx state=restarted\n"
  },
  {
    "path": ".provision/ansible-role-lufi/tasks/apprun.yml",
    "content": "#apprun.yml\n---\n    - name: This command will install the postgress module\n      ansible.builtin.shell:\n        cmd: carton install --deployment --without=test --without=sqlite --without=mysql\n        chdir: \"{{ app_dir }}\"          \n\n    - name: Upload application file\n      ansible.builtin.template:\n        src: ../templates/lufi.conf.j2\n        dest: \"{{ app_dir }}/lufi.conf\"\n\n    - name: Run the command for app_executes\n      ansible.builtin.shell:\n        cmd: carton exec hypnotoad script/lufi\n        chdir: \"{{ app_dir }}\" \n\n    - name: Nginx configuration file add\n      ansible.builtin.template:\n        src: ../templates/app.conf\n        dest: /etc/nginx/conf.d/\n        mode: '0644'\n      notify: restart nginx"
  },
  {
    "path": ".provision/ansible-role-lufi/tasks/cron.yml",
    "content": "#cron.yml\n---\n  - name: Copy the cronjob file\n    ansible.builtin.copy:\n      src: ../files/cronjob\n      dest: /etc/cron.d/\n      owner: www-data\n      group: www-data\n\n  - name: \"example cronjob\"\n    ansible.builtin.cron:\n      name: \"cronjob\"\n      state: present\n      user: www-data\n      minute: \"0\"\n      hour: \"0\"\n      day: \"*\"\n      month: \"*\"\n      weekday: \"*\"\n      job: |\n        carton exec script/lufi cron cleanbdd --mode production; carton exec script/lufi cron cleanfiles --mode production; carton exec script/lufi cron watch --mode production\n        \n        \n\n#- name: Crontab file exists\n#  cron:\n#    name: Add date and time to a file.\n#    minute: \"*/2\"\n#    hour: 9-16\n#    weekday: 1-5\n#    user: devops\n#    job: df >> /home/devops/disk_usage\n#    cron_file: disk_usage\n#    state: present      "
  },
  {
    "path": ".provision/ansible-role-lufi/tasks/dependencies.yml",
    "content": "#dependencies.yml\n--- \n     - name: Install Dependencies\n       ansible.builtin.apt:\n        name:\n          - nginx\n          - build-essential\n          - libssl-dev \n          - libio-socket-ssl-perl \n          - liblwp-protocol-https-perl \n          - zlib1g-dev\n          - libmojo-sqlite-perl\n          - carton\n        state: present\n        \n     - name: Install Postgress Dev Packages\n       ansible.builtin.apt:\n         name:\n           - libpq-dev"
  },
  {
    "path": ".provision/ansible-role-lufi/tasks/gitclone.yml",
    "content": "#gitclone\n---\n\n- name: clone the repository\n  ansible.builtin.git:\n    repo: 'https://framagit.org/fiat-tux/hat-softwares/lufi.git'\n    dest: \"{{ app_dir }}\"\n    clone: yes\n    update: yes \n    version: \"{{ project_version }}\"\n\n- name: Change the owner \n  ansible.builtin.file:\n    path: \"{{ app_dir }}\"\n    owner: \"{{ lufi_owner }}\"\n    group: \"{{ lufi_group }}\"\n    state: directory\n    recurse: yes\n\n- name: Add the robots.txt file\n  ansible.builtin.copy:\n    src: ../files/robots.txt\n    dest: \"{{ robots_text }}\"\n\n\n\n      \n\n\n"
  },
  {
    "path": ".provision/ansible-role-lufi/tasks/main.yml",
    "content": "---\n# tasks file for roles/servers\n\n- include: dependencies.yml\n- include: gitclone.yml\n- include: apprun.yml\n- include: cron.yml\n"
  },
  {
    "path": ".provision/ansible-role-lufi/templates/lufi.conf.j2",
    "content": "# vim:set sw=4 ts=4 sts=4 ft=perl expandtab:\n{\n    ####################\n    # Hypnotoad settings\n    ####################\n    # see http://mojolicio.us/perldoc/Mojo/Server/Hypnotoad for a full list of settings\n    hypnotoad => {\n        # array of IP addresses and ports you want to listen to\n        # you can specify a unix socket too, like 'http+unix://%2Ftmp%2Flufi.sock'\n        listen => ['http://0.0.0.0:8081'],\n        # if you use Lufi behind a reverse proxy like Nginx, you want to set proxy to 1\n        # if you use Lufi directly, let it commented\n        #proxy  => 1,\n\n        # Please read http://mojolicious.org/perldoc/Mojo/Server/Hypnotoad#workers\n        # to adjust this to your server\n        workers => 30,\n        clients => 1,\n    },\n\n    # Put a way to contact you here and uncomment it\n    # You can put some HTML in it\n    # MANDATORY\n    contact       => '<a href=\"https://{{ _contact }}\">Contact page</a>',\n\n    # Put an URL or an email address to receive file reports and uncomment it\n    # It's for make reporting illegal files easy for users\n    # MANDATORY\n    report => '{{ _report }}',\n\n    # Array of random strings used to encrypt cookies\n    # optional, default is ['fdjsofjoihrei'], PLEASE, CHANGE IT\n    #secrets        => ['fdjsofjoihrei'],\n\n    # Name of the instance, displayed next to the logo\n    # optional, default is Lufi\n    #instance_name => 'Lufi',\n\n    # Choose a theme. See the available themes in `themes` directory\n    # Optional, default is 'default'\n    #theme         => 'default',\n\n    # Length of the random URL\n    # optional, default is 8\n    #length            => 8,\n\n    # How many URLs will be provisioned in a batch ?\n    # optional, default is 5\n    #provis_step       => 5,\n\n    # Max number of URLs to be provisioned\n    # optional, default is 100\n    #provisioning      => 100,\n\n    # Length of the modify/delete token\n    # optional, default is 32\n    #token_length      => 32,\n\n    # Max file size, in octets\n    # You can write it 100*1024*1024\n    # optional, no default\n    #max_file_size     => 104857600,\n\n    # If you want to have piwik statistics, provide a piwik image tracker\n    # Only the image tracker is allowed, no javascript\n    # optional, no default\n    #piwik_img         => 'https://piwik.example.org/piwik.php?idsite=1&amp;rec=1',\n\n    # Broadcast_message which will displayed on the index page\n    # optional, no default\n    #broadcast_message => 'Maintenance',\n\n    # Default time limit for files\n    # Valid values are 0, 1, 7, 30 and 365\n    # optional, default is 0 (no limit)\n    #default_delay     => 0,\n\n    # Number of days after which the files will be deleted, even if they were uploaded with \"no delay\" (or value superior to max_delay)\n    # A warning message will be displayed on homepage\n    # optional, default is 0 (no limit)\n    #max_delay         => 0,\n\n    # Size thresholds: if you want to define max delays for different sizes of file\n    # The keys are size in Bytes, you can't have 10*1000*10000 as key\n    # If a file is smaller than the smallest configured size, it will have a expiration delay of max_delay (see above)\n    # optional, default is using max_delay (see above) for all sizes\n    #delay_for_size  => {\n    #    10000000   => 90, # between 10MB and 50MB => max is 90 days, less than 10MB => max is max_delay (see above)\n    #    50000000   => 60, # between 50MB ans 1GB  => max is 60 days\n    #    1000000000 => 2,  # more than 1GB         => max is 2 days\n    #},\n\n    # URL sub-directory in which you want Lufi to be accessible\n    # example: you want to have Lufi under https://example.org/lufi/\n    # => set prefix to '/lufi' or to '/lufi/', it doesn't matter\n    # optional, defaut is /\n    #prefix        => '/',\n\n    # Array of authorized domains for API calls.\n    # If you want to authorize everyone to use the API: ['*']\n    # optional, no domains allowed by default\n    #allowed_domains => ['http://1.example.com', 'http://2.example.com'],\n\n    # String of the URL to be redirected to when accessing /logout\n    # optional, default is no redirection after logging out\n    #logout_custom => 'https://sso.example.com/logout?redirect_uri=https%3A%2F%2Fexample.com',\n\n    # Define a path to the upload directory, where the uploaded files will be stored\n    # You can define it relative to lufi directory or set an absolute path\n    # Remember that it has to be in a directory writable by Lufi user\n    # optional, default is 'files'\n    #upload_dir => 'files',\n\n    #!!!!!!!!!!!!!!!\n    # EXPERIMENTAL !\n    #!!!!!!!!!!!!!!!\n    # You can store files on Swift object storage (https://en.wikipedia.org/wiki/OpenStack#Swift) instead of filesystem\n    # Please read https://metacpan.org/pod/Net::OpenStack::Swift#SYNOPSIS to know how to configure this setting\n    # IMPORTANT: add a `container` key in it, to let Lufi know which container to use. This is not a regular Net::OpenStack::Swift setting, but Lufi need it.\n    # EXPERIMENTAL: if the upload or download of files are stucked, reload Lufi and create a cron task to reload Lufi once a day\n    # You can copy Lufi files to Swift object storage by launching the command `carton exec script/lufi copyFilesToSwift` (can take a long time)\n    # optional, no default\n    #swift => {\n    #  auth_url    => 'https://auth-endpoint-url/v2.0',\n    #  user        => 'userid',\n    #  password    => 'password',\n    #  tenant_name => 'project_id',\n    #  container   => 'lufi'\n    #},\n\n    # Allow to add a password on files, asked before allowing to download files\n    # optional, default is 0\n    #allow_pwd_on_files => 0,\n\n    # Force all files to be in \"Burn after reading mode\"\n    # optional, default is 0\n    #force_burn_after_reading => 0,\n\n    # If set, the files' URLs will always use this domain\n    # optional, no default\n    #fixed_domain => 'example.org',\n\n    # Abuse reasons\n    # Set an integer in the abuse field of a file in the database and it will not be downloadable anymore\n    # The reason will be displayed to the downloader, according to the reasons you will configure here.\n    # optional, no default\n    #abuse => {\n    #   0 => 'Copyright infringment',\n    #   1 => 'Illegal content',\n    #},\n\n    ###############\n    # Mail settings\n    ###############\n\n    # Mail configuration\n    # See https://metacpan.org/pod/Mojolicious::Plugin::Mail#EXAMPLES\n    # optional, default to sendmail method with no arguments\n    #mail => {\n    #    # Valid values are 'sendmail' and 'smtp'\n    #    how => 'smtp',\n    #    howargs => ['smtp.example.org']\n    #},\n\n    # Email sender address\n    # optional, default to no-reply@lufi.io\n    #mail_sender => 'no-reply@lufi.io',\n\n    # Disable sending mail through the server\n    # optional, default is false\n    #disable_mail_sending => 0,\n\n    #############\n    # DB settings\n    #############\n\n    # Choose what database you want to use\n    # Valid choices are sqlite, postgresql and mysql (all lowercase)\n    # optional, default is sqlite\n    # dbtype => 'sqlite',\n\n    # SQLite ONLY - only used if dbtype is set to sqlite\n    # Define a path to the SQLite database\n    # You can define it relative to lufi directory or set an absolute path\n    # Remember that it has to be in a directory writable by Lufi user\n    # optional, default is lufi.db\n    # db_path           => 'lufi.db',\n\n    # PostgreSQL ONLY - only used if dbtype is set to postgresql\n    # These are the credentials to access the PostgreSQL database\n    # mandatory if you choosed postgresql as dbtype\n    pgdb => {\n        database => 'lufi',\n        host     => 'localhost',\n        # optional, default is 5432\n        port     => 5432,\n        user     => 'DBUSER',\n        pwd      => 'DBPASSWORD',\n        # https://mojolicious.org/perldoc/Mojo/Pg#max_connections\n        # optional, default is 1\n        #max_connections => 1,\n    },\n\n    # MySQL ONLY - only used if dbtype is set to mysql\n    # These are the credentials to access the MySQL database\n    # mandatory if you choosed mysql as dbtype\n    #mysqldb => {\n    #    database => 'lufi',\n    #    host     => 'localhost',\n    #    # optional, default is 3306\n    #    #port     => 3306,\n    #    user     => 'DBUSER',\n    #    pwd      => 'DBPASSWORD',\n    #    # https://metacpan.org/pod/Mojo::mysql#max_connections\n    #    # optional, default is 5 (set to 0 to disable persistent connections)\n    #    #max_connections => 5,\n    #},\n\n    #############################################\n    # LDAP settings (authentication and features)\n    #############################################\n\n    # Set `ldap` if you want that only authenticated users can upload files\n    # Please note that everybody can still download files\n    # optional, no default\n    #ldap => {\n    #    uri         => 'ldaps://ldap.example.org',                 # server URI\n    #    user_tree   => 'ou=users,dc=example,dc=org',               # search base DN\n    #    bind_dn     => 'uid=ldap_user,ou=users,dc=example,dc=org', # search bind DN\n    #    bind_pwd    => 'secr3t',                                   # search bind password\n    #    user_attr   => 'uid',                                      # user attribute (uid, mail, sAMAccountName, etc.)\n    #    user_filter => '(!(uid=ldap_user))',                       # user filter (to exclude some users, etc.)\n    #    # optional start_tls configuration. See https://metacpan.org/pod/distribution/perl-ldap/lib/Net/LDAP.pod#start_tls\n    #    # don't set or uncomment if you don't want to configure it\n    #    start_tls => {\n    #       verify     => 'optional',\n    #       clientcert => '/etc/ssl/certs/ca-bundle.pem'\n    #    }\n    #},\n\n    # If you've set ldap above, the session will last `session_duration` seconds before\n    # the user needs to reauthenticate\n    # optional, default is 3600\n    #session_duration => 3600,\n\n    # If you use `ldap` for authentication, you can map some attributes from LDAP to be able to access them in Lufi\n    # Those attributes will be accessible with:\n    #   $c->current_user->{lufi_attribute_name} in Lufi backend files (all that is in `lib` directory)\n    #   <%= $self->current_user->{lufi_attribute_name} %> in templates files (in `themes` directory)\n    #\n    # Define the attributes like this: `lufi_attribute_name => 'LDAP_attribute_name'`\n    # Note that you can’t use `username` as a Lufi attribute name: this name is reserved and will contain the login of the user\n    # optional, no default\n    #ldap_map_attr => {\n    #    displayname => 'cn',\n    #    mail        => 'mail'\n    #},\n\n    # When using LDAP authentication, LDAP users can invite people (by mail) to use Lufi to send them files without\n    # being authenticated.\n    # This is where you configure the behavior of the invitations.\n    # You may need to fetch some attributes from LDAP to use some invitations settings. See `ldap_map_attr` above.\n    # optional, no default\n    #invitations => {\n    #   # The name of the key set in `ldap_map_attr` (above) that corresponds to the mail of the LDAP user\n    #   # optional, default is `mail`\n    #   mail_attr => 'mail',\n    #   # The `From` header of invitation mail can be the mail of the LDAP user\n    #   # Be sure to have a mail system that will correctly send the mail from your users! (DKIM, SPF…)\n    #   # To enable this feature, set it to 1\n    #   # optional, disabled by default\n    #   send_invitation_with_ldap_user_mail => 1,\n    #   # The user is able to set an expiration delay for the invitation.\n    #   # This expiration delay can’t be more than this setting (in days).\n    #   # optional, default is 30 days\n    #   max_invitation_expiration_delay => 30,\n    #   # Once the guest has submitted his files, he has an additional period of time to submit forgotten files.\n    #   # You can set that additional period of time in minutes here.\n    #   # To disable that feature, set it to 0 or less\n    #   # optional, default is 10 minutes\n    #   max_additional_period => 10,\n    #   # Lufi follows privacy-by-design, so, by default, no files URLs (with the decode secret) are stored in database.\n    #   # However, the concern is different for this case. Storing files URLs makes users able to retrieve the guests’ sent files\n    #   # from their `invitations` page.\n    #   # Set to 1 to store guests’ files URLs in database\n    #   # optional, default is 0 (disabled)\n    #   save_files_url_in_db => 0,\n    #   # Users can resend the invitation to their guest. This does not extend the invitation’s expiration delay unless you\n    #   # set this option to 1.\n    #   # optional, default is 0 (disabled)\n    #   extend_invitation_expiration_on_resend => 0,\n    #},\n\n    #########################\n    # Htpasswd authentication\n    #########################\n\n    # Set `htpasswd` if you want to use an htpasswd file instead of ldap\n    # See 'man htpasswd' to know how to create such file\n    #htpasswd => 'lufi.passwd',\n\n    #######################\n    # HTTP Headers settings\n    #######################\n\n    # Content-Security-Policy header that will be sent by Lufi\n    # Set to '' to disable CSP header\n    # https://content-security-policy.com/ provides a good documentation about CSP.\n    # https://report-uri.com/home/generate provides a tool to generate a CSP header.\n    # optional, default is \"base-uri 'self'; connect-src 'self' ws://YOUR_HOST; default-src 'none'; font-src 'self'; form-action 'self'; frame-ancestors 'none'; img-src 'self' blob:; media-src blob:; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'\"\n    #csp => \"\",\n\n    # X-Frame-Options header that will be sent by Lufi\n    # Valid values are: 'DENY', 'SAMEORIGIN', 'ALLOW-FROM https://example.com/'\n    # Set to '' to disable X-Frame-Options header\n    # See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options\n    # Please note that this will add a \"frame-ancestors\" directive to the CSP header (see above) accordingly\n    # to the chosen setting (See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/frame-ancestors)\n    # optional, default is 'DENY'\n    #x_frame_options => 'DENY',\n\n    # X-Content-Type-Options that will be sent by Lufi\n    # See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Content-Type-Options\n    # Set to '' to disable X-Content-Type-Options header\n    # optional, default is 'nosniff'\n    #x_content_type_options => 'nosniff',\n\n    # X-XSS-Protection that will be sent by Lufi\n    # See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-XSS-Protection\n    # Set to '' to disable X-XSS-Protection header\n    # optional, default is '1; mode=block'\n    #x_xss_protection => '1; mode=block',\n\n    #########################\n    # Lufi cron jobs settings\n    #########################\n\n    # Expired files will be kept for 2 additional days after the expiration time has passed!\n    # The reasoning behind this is to allow downloads to complete and avoid deleting them while\n    # they are still being tranfered.\n\n    # Number of days senders' IP addresses are kept in database\n    # After that delay, they will be deleted from database (used with script/lufi cron cleanbdd)\n    # optional, default is 365\n    keep_ip_during    => 1,\n\n    # Max size of the files directory, in octets\n    # Used by script/lufi cron watch to trigger an action\n    # optional, no default\n    max_total_size    => 10*1024*1024*1024,\n\n    # Default action when files directory is over max_total_size (used with script/lufi cron watch)\n    # Valid values are 'warn', 'stop-upload' and 'delete'\n    # Please, see README.md\n    # optional, default is 'warn'\n    policy_when_full  => 'warn',\n\n    # Files which are not viewed since delete_no_longer_viewed_files days will be deleted by the cron cleanfiles task\n    # If delete_no_longer_viewed_files is not set, the no longer viewed files will NOT be deleted\n    # optional, no default\n    delete_no_longer_viewed_files => 1,\n};\n"
  },
  {
    "path": ".provision/ansible-role-lufi/templates/update.sh",
    "content": "# install perl dependencies\napt install liblwp-protocol-https-perl carton\nsleep 5\ngit pull\nsleep 5\ncarton install --deployment --without=test --without=sqlite --without=mysql\nsleep5\ncarton exec hypnotoad script/lufi\n\n\n"
  },
  {
    "path": ".provision/ansible-role-lufi/vars/main.yml",
    "content": "---\n# vars file for roles/servers\n\nlufi_owner: \"www-data\"\n\nlufi_group: \"www-data\"\n\napp_dir: \"\"\n\n_contact: \"contact.example.com\"\n\n_report: \"report@example.com\"\n\n_project_version: \"\"\n\n_servername: \"\"\n"
  },
  {
    "path": ".provision/terraform-aws-lufi/README.md",
    "content": "# Terraform-AWS-Lufi\n\n This terraform plan create the resourcess of EC2 instance\n\n## Terraform Variables\n Edit the `vars.tf` file to add the variables as per your need.\n\n| Variable name | Value | Description |\n| ------------- | ----- | ----------- |\n| `aws_region` | us-east-1 | Set the region  |\n| `vpc_cidr` | 10.0.0.0/16 | Set the cidr value for the vpc |\n| `public_subnet_cidr` | 10.0.2.0/24 | Set the cidr value for the public subnet |\n| `user` | ubuntu | Set the EC2 instance user name |\n| `public_key` | /home/user_name/.ssh/id_rsa_pub | Set the publickey value for the ec2 instance from the host machine |\n| `private_key` | /home/user_name/.ssh/id_rsa | Set the private key value for the ec2 instance from the hostmachine |\n| `aws_access_key` | AWSACCESSKEY | Enter your aws access key |\n| `aws_secrete_key` | AWSSECRETEKEY | Enter your aws secrete key |\n| `instance_name` | Lufi_app_instance | Set the name for instance |\n| `app_dir` | /var/www/ | Set the application directory for the best practice |\n| `lufi_owner` | www-data | Set the application user for the best practice |\n| `lufi_group` | www-data | Set the application group for the best practice |\n| `contact` | contact.example.com | Contact option (mandatory), where you have to put some way for the users to contact you. |\n| `report` | report@example.com | report option (mandatory) Put an email address or an URL to let people report illegal files |\n\n\n## Usage of terraform plan with lufi deploy script\n\n```sh \ngit clone https://framagit.org/fiat-tux/hat-softwares/lufi.git\n\ncd lufi/.provision/terraform-aws-lufi\n\nterraform init\nterraform plan\nterraform apply\n```\n## Usage of terraform plan with ansible role\n\n- Comment out the below `data template` and `user_data` source in __main.tf__ file\n\n```hcl\nlocals {\n  user_data_vars = {\n    user = var.lufi_owner\n    group = var.lufi_group\n    directory = var.app_dir\n    git_branch = var.project_version\n    contact_lufi = var.contact\n    report_lufi = var.report\n  }\n}\n```\n\n```hcl\nuser_data = templatefile(\"${path.module}/lufi_startup.sh\", local.user_data_vars)\n```\n\n- Add the below provisioner data in __main.tf__ file at the `aws_instance` resource\n\n```sh\n connection          {\n    agent            = false\n    type             = \"ssh\"\n    host             = aws_instance.ec2_instance.public_dns \n    private_key      = \"${file(var.private_key)}\"\n    user             = \"${var.user}\"\n  }\n\n  provisioner \"remote-exec\" {\n    inline = [\n      \"sudo apt update -y\",\n      \"sudo apt install python3.9 -y\",\n      ]\n  }\n\n  provisioner \"local-exec\" {\n    command = <<EOT\n      sleep 120 && \\\n      > hosts && \\\n      echo \"[Lufi]\" | tee -a hosts && \\\n      echo \"${aws_instance.ec2_instance.public_ip} ansible_user=${var.user} ansible_ssh_private_key_file=${var.private_key}\" | tee -a hosts && \\\n      export ANSIBLE_HOST_KEY_CHECKING=False && \\\n      ansible-playbook -u ${var.user} --private-key ${var.private_key} -i hosts site.yml\n    EOT\n  }\n```  "
  },
  {
    "path": ".provision/terraform-aws-lufi/lufi_startup.sh",
    "content": "#!/usr/bin/env bash\nset -euo pipefail\n\necho \"**********************************************************************\"\necho \"                                                                     *\"\necho \"Install dependencies                                                 *\"\necho \"                                                                     *\"\necho \"**********************************************************************\"\n\nSUDO=sudo\n$SUDO apt update\n$SUDO apt install jq wget unzip carton build-essential nginx libssl-dev libio-socket-ssl-perl liblwp-protocol-https-perl zlib1g-dev libmojo-sqlite-perl libpq-dev -y\n\necho \"**********************************************************************\"\necho \"                                                                     *\"\necho \"Configuring the Application                                          *\"\necho \"                                                                     *\"\necho \"**********************************************************************\"\n\nsleep 10;\nversion=$(curl -s https://framagit.org/api/v4/projects/1998/releases | jq '.[]' | jq -r '.name' | head -1)\necho $version\npushd ${directory} \n$SUDO wget https://framagit.org/fiat-tux/hat-softwares/lufi/-/archive/$version/lufi-$version.zip\n$SUDO unzip lufi-$version.zip\n$SUDO chown ${user} lufi-$version\n$SUDO chgrp ${group} lufi-$version\npushd lufi-$version\n\necho \"**********************************************************************\"\necho \"                                                                     *\"\necho \"Install Carton Packages                                              *\"\necho \"                                                                     *\"\necho \"**********************************************************************\"\n\n$SUDO carton install --deployment --without=test --without=sqlite --without=mysql\n\nsleep 10;\n\n$SUDO cp lufi.conf.template lufi.conf\n\nsed -i 's/127.0.0.1/0.0.0.0/'  lufi.conf\nsed -i 's/#contact/contact/g' lufi.conf\nsed -i \"s/contact.example.com/${contact_lufi}/g\" lufi.conf\nsed -i 's/#report/report/' -i lufi.conf\nsed -i \"s/report@example.com/${report_lufi}/g\" lufi.conf\nsed -i \"192 , 194 s/#/ /g\" lufi.conf && \\\nsed -i \"195 s/#  / /g\" lufi.conf && \\\nsed -i \"196 , 198 s/#/ /g\" lufi.conf && \\\nsed -i \"199 , 201 s/#  / /g\" lufi.conf && \\\nsed -i \"202 s/#/ /g\" lufi.conf\n\necho \"**********************************************************************\"\necho \"                                                                     *\"\necho \"Run the Application                                                  *\"\necho \"                                                                     *\"\necho \"**********************************************************************\"\n\n$SUDO carton exec hypnotoad script/lufi\n"
  },
  {
    "path": ".provision/terraform-aws-lufi/main.tf",
    "content": "locals {\n  user_data_vars = {\n    user = var.lufi_owner\n    group = var.lufi_group\n    directory = var.app_dir\n    contact_lufi = var.contact\n    report_lufi = var.report\n  }\n}\n\n#Create the VPC \nresource \"aws_vpc\" \"vpc\" {\n  cidr_block           = \"${var.vpc_cidr}\"\n  enable_dns_hostnames = true \n  enable_dns_support   = true\n  instance_tenancy     = \"default\"\n  tags                 = {\n      Name             = \"lufi-master-vpc\"\n  }\n}\n\n# Create InternetGateWay and attach to VPC\n\nresource \"aws_internet_gateway\" \"IGW\" {\n  vpc_id           = \"${aws_vpc.vpc.id}\"\n  tags = {\n    \"Name\"         = \"lufi-master-igw\"\n  } \n}\n\n# Create a public subnet\n\nresource \"aws_subnet\" \"publicsubnet\" {\n  vpc_id                  = \"${aws_vpc.vpc.id}\" \n  cidr_block              = \"${var.public_subnet_cidr}\"\n  map_public_ip_on_launch = true\n  tags                    = {\n      Name                = \"lufi-master-us-east-1-public\"\n  }  \n}\n\n# Create routeTable\nresource \"aws_route_table\" \"public\" {\n    vpc_id         = \"${aws_vpc.vpc.id}\"\n    route {\n        cidr_block = \"0.0.0.0/0\"\n        gateway_id = \"${aws_internet_gateway.IGW.id}\"\n    }\n             \n    tags           = {\n      Name         = \"lufi-master-us-east-1-public-rt\"\n }\n}\n\nresource \"aws_main_route_table_association\" \"mainRTB\" {\n  vpc_id         = \"${aws_vpc.vpc.id}\"\n  route_table_id = \"${aws_route_table.public.id}\"\n}\n## Create security group\nresource \"aws_security_group\" \"security\" {\n  name             = \"lufi-master-sg\"  \n  description      = \"allow all traffic\"\n  vpc_id           = \"${aws_vpc.vpc.id}\"\n\n  ingress  {\n    description    =  \"allow all traffic\"\n    from_port      = \"0\"\n    to_port        = \"65535\"  \n    protocol       = \"tcp\"\n    cidr_blocks    = [\"0.0.0.0/0\"]\n  }\n  ingress  {\n    description    = \"allow port SSH\"\n    from_port      = \"22\"\n    to_port        = \"22\"\n    protocol       = \"tcp\"\n    cidr_blocks    = [\"0.0.0.0/0\"]\n  }\n  egress  {\n    from_port      = 0\n    to_port        = 0\n    protocol       = \"-1\"\n    cidr_blocks    = [\"0.0.0.0/0\"]\n  }\n  \n}\n\n#Create key_pair for the instance\n\nresource \"aws_key_pair\" \"genkey\" {\n  key_name           = \"lufi.webapp\"\n  public_key         = \"${file(var.public_key)}\"\n}\n\n# Add ubuntu AMI\ndata \"aws_ami\" \"ubuntu\" {\n  most_recent = true\n  owners = [\"099720109477\"]\n\n    filter {\n        name   = \"name\"\n        values = [\"ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-*\"]\n    }\n}\n\n# Craete ec2 instance\nresource \"aws_instance\" \"ec2_instance\" {\n  ami                = \"${data.aws_ami.ubuntu.id}\"\n  instance_type      = \"t2.medium\"\n  associate_public_ip_address = \"true\"\n  subnet_id          = \"${aws_subnet.publicsubnet.id}\"\n  vpc_security_group_ids = [\"${aws_security_group.security.id}\"]\n  user_data          = templatefile(\"${path.module}/lufi_startup.sh\", local.user_data_vars)\n  key_name           = \"lufi.webapp\"\n  \n  tags               = {\n    Name             = \"${var.instance_name}\"\n  }\n}\n"
  },
  {
    "path": ".provision/terraform-aws-lufi/output.tf",
    "content": "output \"public_ip\" {\n  value = \"${aws_instance.ec2_instance.public_ip}\"\n}\n\noutput \"App_running_at\" {\n  value = \"http://${aws_instance.ec2_instance.public_ip}:8081\"\n}\n"
  },
  {
    "path": ".provision/terraform-aws-lufi/provider.tf",
    "content": "terraform {\n  required_providers {\n    aws = {\n      source  = \"hashicorp/aws\"\n      version = \"~> 3.0\"\n    }\n  }\n}\n\nprovider \"aws\" {\naccess_key = \"${var.aws_access_key}\"\nsecret_key = \"${var.aws_secret_key}\"\nregion     = \"${var.aws_region}\"\n}"
  },
  {
    "path": ".provision/terraform-aws-lufi/vars.tf",
    "content": "variable \"aws_region\" {\n    default = \"aws_region\"\n}\nvariable \"vpc_cidr\" {\n    default = \"cidr_value\"\n}\nvariable \"public_subnet_cidr\" {\n    default = \"cidr_value\"\n}\nvariable \"public_subnet1_cidr\" {\n    default = \"cidr_value\"\n}\n\nvariable \"user\" {\n    default = \"user_of_instance\" \n}\n\nvariable \"public_key\" {\n    default = \"$PWD_publickey\"\n}\nvariable \"private_key\" {\n    default = \"$PWD_privatekey\"\n}\nvariable \"aws_access_key\" {\n    default = \"aws_access_key\"\n}\n\nvariable \"aws_secret_key\" {\n    default = \"aws_secrete_key\"\n}\n\nvariable \"instance_name\" {\n    default = \"instance_name\"  \n}\n\nvariable \"lufi_owner\" {\n    default = \"\"  \n}\n\nvariable \"lufi_group\" {\n    default = \"\"  \n}\n\nvariable \"app_dir\" {\n    default = \"\"  \n}\n\nvariable \"contact\" {\n    default = \"\"  \n}\n\nvariable \"report\" {\n    default = \"\"  \n}\n\n"
  },
  {
    "path": "AUTHORS.md",
    "content": "# Lufi's authors\n\n## Main developer 🤪\n\n- Luc Didry, aka Sky (<https://fiat-tux.fr>), core developer, [@framasky@framapiaf.org](https://framapiaf.org/@framasky/) on Mastodon\n\n## Contributors\n\n### Translations 🌐\n\n- Nikos Filopoulos (italian translation)\n- Framartin (fix french translation)\n- Sébastien Duthil (fix english translation)\n- Armando Lüscher, https://noplanman.ch/ (german translation)\n- Quentin Pagès (occitan translation)\n- Jéssica Da Cunha (portuguese translation)\n- Ilker Kulgu (dutch translation)\n- Butterfly of Fire (arabic translation)\n- Frju365 (german translation)\n- pi2 (german translation)\n\n### Code ⌨️\n\n- Armando Lüscher, https://noplanman.ch/ (fix css)\n- Yann Le Brech (htpasswd file support)\n- Ilker Kulgu (fix IE11 compatibility)\n- Stéphane Baron (bugfix)\n- alexandre.LG, http://inios.fr/\n- Mildis (bugfix)\n- TECH'advantage, https://www.tech-advantage.com/ (paid for LDAP invitations feature)\n- pi2 (typo)\n- Rain (bugfix)\n- Nicolas Constant (notifications)\n\n## Vulnerabilities / bug hunters 🐛\n\nLufi participated to a [Hackpéro](https://hackpero.com/) (sort of a bug bounty hackathon), thanks to [Bounty factory](https://hackpero.com/).\n\nMany thanks to those who found bugs and vulnerabilities:\n\n- joker2a\n- March\n- Nicknam3\n- SaxX\n- tfairane\n"
  },
  {
    "path": "CHANGELOG",
    "content": "Revision history for Lufi\n\n0.08.0 ????-??-??\n\n0.07.3 2025-11-15\n\t- 🔖 — Fix 0.07.2 release (tag on wrong commit)\n\n0.07.2 2025-07-29\n\t- 🐛 — Fix bug in POST file deletion (#319)\n\n0.07.1 2025-07-16\n\t- 🚚 — Use POST to delete a file instead of GET\n\n0.07.0 2023-12-25\n\t- ⬆️ — Update jQuery\n\t- 🩹 — Fix a format query parameter\n\t- 🎨 — Use template literals in js\n\t- ➖ — Replace moment.js with Date().toLocaleDateString(…)\n\t- 🩹 — Fix Roboto font warnings in js console\n\t- ♿️ — Add autofocus on login input field\n\t- ✨ — Add a `lockfile_dir` setting (fix #242)\n\t- 👷 — Update the create-release snippet’s URL\n\n0.06.00 2023-12-18\n\t- ⬆️ — Update deps\n\t- 🌐 Update translations\n\n0.05.21 2023-02-21\n\t- ⬆️ — Update deps (still #284)\n\n0.05.20 2023-02-21\n\t- ⬆️ — Update deps (#284)\n\n0.05.19 2023-01-11\n\t- 🌐 Update translations\n\t- 👷 — Deactivate Swift tests in CI\n\t- Terraform and Ansible provisioning (@arunodhayamsam)\n\t- Support for header authentication (@mildis)\n\n0.05.18 2022-03-19\n\t- ✨ Add support for header authentication, thanks to @mildis (!69)\n\t- 🌐 Update translations\n\n0.05.17 2022-03-02\n\t- 🌐 Update translations\n\n0.05.16 2021-11-08\n\t- 👷🐛 Create release in CI before publishing changelog\n\t- 🌐 Update translations\n\n0.05.15 2021-11-03\n\t- 🐛 Fix mail signature separator\n\t- 💄 Disable signature when using LDAP (#249)\n\t- 🌐 Update translations\n\t- 🔒 Fix XSS where using zip feature (#254)\n\t- 🔒 Fix unauthorized manipulations of invitations (#254)\n\t- 🔒 Detect schemeless URL in mail (#254)\n\n0.05.14 2021-06-16\n\t- 🔧 Set default morbo port to 3000 (as it should have stay)\n\t- 🐛 Fix `Notification not defined` in Duckduckgo browser (Fix #224 again)\n\t- ✨ Add `disable_mail_sending` config parameter\n\t- 🌐 Update translations\n\n0.05.13 2021-01-28\n\t- 🐛 Fix latest git tag improperly fetched\n\n0.05.12 2021-01-13\n\t- 🌐 Update translations\n\t- 🐛 Fix `Notification not defined`\n\n0.05.11 2020-12-07\n\t- 🌐 Update translations\n\t- 🐛 Try to avoid clients constantly hitting /download/XXX\n\n0.05.10 2020-11-28\n\t- 🌐 Update translations\n\n0.05.9 2020-11-25\n\t- 🐛 Invitation, error 500 when guest send file with special character (#229)\n\t- 🌐 Update translations\n\n0.05.8 2020-11-18\n\t- 🌐 Update translations\n\n0.05.7 2020-10-06\n\t- 🐛 Remove breakingchanges migration from sqliteToOtherDB (no need for now)\n\n0.05.6 2020-09-28\n\t- 🌐 Update translations\n\t- 📝 Document file deletion behavior\n\n0.05.5 2020-08-20\n\t- 🐛 Change lufi-provisioning.lock handling process to avoid error messages (#210)\n\n0.05.4 2020-08-17\n\t- 🐛 Fix incorrect HTML in delays.html.ep (#207)\n\n0.05.3 2020-08-17\n\t- 🐛 Check if provisioning lockfile mod time exists before using it (#208)\n\n0.05.2 2020-07-25\n\t- 🔥 Remove code from abandonned feature\n\t- Fix regression introduced in 0.05.1 (#201)\n\n0.05.1 2020-06-30\n\t- Update german translation\n\t- Fix possible high load due to concurrent provisioning\n\n0.05.0 2020-06-02\n\t- Notifications when uploading and downloading files (#181)\n\t- Use Weblate instead of Zanata for translations (https://weblate.framasoft.org/projects/lufi/development/)\n\t- Add config API endpoint (#183)\n\t- Show latest tag and commit of the instance in about page and config API endpoint (#174)\n\t- Add support for Swift object storage (EXPERIMENTAL)\n\n0.04.6 2019-11-07\n\t- Now can send large files (>2Gio) while using a DB other than SQLite (#165)\n\t- Use customized instance name in <title>\n\n0.04.5 2019-10-14\n\t- Update german language\n\t- Smoother progress of progress bar (use smaller chunks)\n\n0.04.4 2019-10-11\n\t- Fix invitations sorting order (#163)\n\t- Same behavior on files and invitations tables (striped, invert selection\n\t  button) (#166)\n\t- Change row color on hover\n\t- Fix typo that leads to error in Safari (#164)\n\t- Fix (for good, I hope) the problem with badly detected URLs in mail\n\t  sending (#159)\n\t- Fix unstranslated string (#167)\n\n0.04.3 2019-09 29\n\t- Translate dates in invitations (#161)\n\t- Ignore all .conf files in .gitignore\n\t- Remove redundant fixed_domain setting in conf template\n\n0.04.2 2019-08-14\n\t- Update german language\n\t- Fix logout button color on mobile view (#157)\n\n0.04.1 2019-08-12\n\t- LocalStorage key is now prefix-dependant (#154)\n\t  This allow to not mix up files in localStorage for two instances if they\n\t  are on the same domain\n\t- Fix bug on cookie-based language choice when using two instances on same\n\t  domain, with one’s path is the beginning of the other instance’s path.\n\t  WARNING! You need to do a `carton install --deployment …` to have the fix.\n\t- Fix navbar bug (there can be too much items in it, depending on Lufi\n\t  settings (LDAP, invitations…), trouble beginning at screens < 1800px)\n\t- Add setting to customize the instance name (#156)\n\n0.04.0 2019-08-04\n\t- Allow to zip the files before upload\n\t- Allow to see what’s in zip file on download page\n\t- Allow to individually download files from zip file (only if zip created by Lufi)\n\t- Allow to invite people to send you files on Lufi when using LDAP auth (#150).\n\t  Feature paid for by TECH’advantage (https://www.tech-advantage.com/)\n\n0.03.7 2019-08-01\n\t- Fix missing default values for some settings (mildis)\n\n0.03.6 2019-07-30\n\t- Update german translation\n\t- Use configured url prefix when using mail sending interface\n\t- Avoid collision between startup and recurring provisionings\n\t- Avoid files password autocomplete by browsers (tested with Firefox and\n\t  Chromium) (#138)\n\n0.03.5 2018-12-06\n\t- Fix CI\n\n0.03.4 2018-12-06\n\t- Update arabic, german and italian translations\n\n0.03.3 2018-11-02\n\t- Update deps, seems to fix install on Debian Jessie\n\n0.03.2 2018-11-02\n\t- Fix dependences in Lufi.pm\n\n0.03.1 2018-10-29\n\t- Fix default CSP Header\n\n0.03 2018-10-28\n\t- Use Mojo::SQLite instead of ORLite\n\t- Use FiatTux plugins\n\t- Option to force \"Burn after reading\" for each uploaded file\n\t- Use GzipStatic and StaticCache plugins for speed\n\t- Allow to block files by setting an abuse field in DB\n\t- Display file size when uploading\n\t- Add Content-Security-Policy header\n\t- Update sjcl.js\n\t- Mitigate genRandomKey exception risk\n\t- Add report file link in the navbar\n\t- Allow to choose your language\n\t- Use a recurrent task to provision shorts\n\t- Add a command to migrate data from SQLite to an other database\n\t- Add a test suite\n\t- MySQL support\n\t- Display max size on upload page\n\t- Add CSRF token challenge on login\n\t- Add CSRF token challenge on logout\n\t- Add constraints on mail sending to prevent spam sending (not perfect, but\n\tshould be good enough)\n\t- Add Code of Conduct\n\t- Add arabic translation\n\t- Add german translation\n\n0.02.2 2017-09-18\n\t- Fix cron tasks bug\n\n0.02.1 2017-09-14\n\t- Fix DB abstraction layer bug\n\n0.02  2017-09-13\n\t- Database abstraction layer\n\t- PostgreSQL support\n\t- IE 11 and Edge support\n\t- Fix encoding error (#83)\n\t- Htpassword authentication support\n\t- Ability to add a password to a file\n\t- Portuguese translation\n\t- Catalan translation\n\t- Dutch translation\n\t- Deleting files from \"My files\" is now done with Ajax (#23)\n\t- Allow bulk files deletion from \"My files\" (#24)\n\t- Bugfixes\n\n0.01  2017-01-09\n\t- Upload files\n\t- Download files\n\t- Preview files in browser depending on mimetype (images and videos)\n\t- LDAP authentication support\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# CONTRIBUTING\n\nPlease, read about contributing at <https://framagit.org/luc/lufi/wikis/contribute>"
  },
  {
    "path": "LICENSE",
    "content": "                    GNU AFFERO GENERAL PUBLIC LICENSE\n                       Version 3, 19 November 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU Affero General Public License is a free, copyleft license for\nsoftware and other kinds of works, specifically designed to ensure\ncooperation with the community in the case of network server software.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nour General Public Licenses are intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  Developers that use our General Public Licenses protect your rights\nwith two steps: (1) assert copyright on the software, and (2) offer\nyou this License which gives you legal permission to copy, distribute\nand/or modify the software.\n\n  A secondary benefit of defending all users' freedom is that\nimprovements made in alternate versions of the program, if they\nreceive widespread use, become available for other developers to\nincorporate.  Many developers of free software are heartened and\nencouraged by the resulting cooperation.  However, in the case of\nsoftware used on network servers, this result may fail to come about.\nThe GNU General Public License permits making a modified version and\nletting the public access it on a server without ever releasing its\nsource code to the public.\n\n  The GNU Affero General Public License is designed specifically to\nensure that, in such cases, the modified source code becomes available\nto the community.  It requires the operator of a network server to\nprovide the source code of the modified version running there to the\nusers of that server.  Therefore, public use of a modified version, on\na publicly accessible server, gives the public access to the source\ncode of the modified version.\n\n  An older license, called the Affero General Public License and\npublished by Affero, was designed to accomplish similar goals.  This is\na different license, not a version of the Affero GPL, but Affero has\nreleased a new version of the Affero GPL which permits relicensing under\nthis license.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU Affero General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Remote Network Interaction; Use with the GNU General Public License.\n\n  Notwithstanding any other provision of this License, if you modify the\nProgram, your modified version must prominently offer all users\ninteracting with it remotely through a computer network (if your version\nsupports such interaction) an opportunity to receive the Corresponding\nSource of your version by providing access to the Corresponding Source\nfrom a network server at no charge, through some standard or customary\nmeans of facilitating copying of software.  This Corresponding Source\nshall include the Corresponding Source for any work covered by version 3\nof the GNU General Public License that is incorporated pursuant to the\nfollowing paragraph.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the work with which it is combined will remain governed by version\n3 of the GNU General Public License.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU Affero General Public License from time to time.  Such new versions\nwill be similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU Affero General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU Affero General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU Affero General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If your software can interact with users remotely through a computer\nnetwork, you should also make sure that it provides a way for users to\nget its source.  For example, if your program is a web application, its\ninterface could display a \"Source\" link that leads users to an archive\nof the code.  There are many ways you could offer source, and different\nsolutions will be better for different programs; see section 13 for the\nspecific requirements.\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU AGPL, see\n<http://www.gnu.org/licenses/>.\n"
  },
  {
    "path": "Makefile",
    "content": "EXTRACTDIR ?= -D lib -D themes/default/templates\nPOT ?= themes/default/lib/Lufi/I18N/lufi.pot\nENPO ?= themes/default/lib/Lufi/I18N/en.po\nXGETTEXT ?= carton exec local/bin/xgettext.pl -u\nCARTON ?= carton exec\nREAL_LUFI ?= script/application\nLUFI ?= script/lufi\nLDAP_CONTAINER_IMAGE ?= docker.io/rroemhild/test-openldap:latest\nLOCAL_LDAP_PORT ?= 10389\nLOCAL_SWIFT_PORT ?= 8080\nSWIFT_CONTAINER_IMAGE ?= docker.io/openstackswift/saio:latest\nMORBO_HOST ?= 0.0.0.0\nMORBO_PORT ?= 3000\n\n\nlocales:\n\t$(XGETTEXT) $(EXTRACTDIR) -o $(POT) 2>/dev/null\n\t$(XGETTEXT) $(EXTRACTDIR) -o $(ENPO) 2>/dev/null\n\npodcheck:\n\tpodchecker lib/Lufi/DB/File.pm lib/Lufi/DB/Slice.pm lib/Lufi/DB/Invitation.pm\n\ncover:\n\tPERL5OPT='-Ilib/' HARNESS_PERL_SWITCHES='-MDevel::Cover' $(CARTON) cover --ignore_re '^local'\n\ntest:\n\t@PERL5OPT='-Ilib/' HARNESS_PERL_SWITCHES='-MDevel::Cover' $(CARTON) prove -l -f -o t/test.t\n\nclean:\n\trm -rf lufi.db files/\n\ndev: clean\n\t$(CARTON) morbo $(LUFI) --listen http://$(MORBO_HOST):$(MORBO_PORT) --watch lib/ --watch script/ --watch themes/ --watch lufi.conf\n\nldap:\n\tpodman run -d -p $(LOCAL_LDAP_PORT):10389 $(LDAP_CONTAINER_IMAGE); exit 0\n\nldapdev: ldap dev\n\nswift:\n\tpodman run -d --rm -p $(LOCAL_SWIFT_PORT):8080 --hostname=\"picoswiftstack\" --name=\"picoswiftstack\" $(SWIFT_CONTAINER_IMAGE); exit 0\n\t@echo \"Sleeping 20 seconds to let picoswiftstack start\"\n\t@sleep 20\n\tpodman exec picoswiftstack get_auth\n\nswiftdev: swift dev\n\ndevlog:\n\tmultitail log/development.log\n\nprod:\n\t$(CARTON) hypnotoad -f $(LUFI)\n"
  },
  {
    "path": "README.md",
    "content": "# Lufi\n\n## What does Lufi mean?\n\nLufi means Let's Upload that FIle. It's a E2E encrypted file sharing software.\n\n## Which browsers are compatible?\n\nLufi is tested and working on the following browsers / devices :\n    - Firefox\n    - Chrome\n    - Internet Explorer 11\n    - Microsoft Edge\n    - Safari\n    - iOS devices (ipad, iphone)\n    - Android devices (Galaxy tab, Galaxy S8)\n\n## What does it do?\n\nIt stores files and allows you to download them.\n\nIs that all? No. All the files are encrypted **by the browser**! It means that your files **never** leave your computer unencrypted.\nThe administrator of the Lufi instance you use will not be able to see what is in your file, neither will your network administrator, or your ISP.\n\nThe encryption key part of the URL is a anchor (Cf. [Fragment Identifier](https://en.wikipedia.org/wiki/Fragment_identifier)), that means this part is only processed client-side and does not reach the server. :-)\n\n## License\n\nLufi is licensed under the terms of the AGPL. See the [LICENSE](LICENSE) file.\n\n## Official instance\n\nThere is a demonstration site, available at <https://lufi.fiat-tux.fr>, with strong limitations on time and file size.\n\n## Logo\n\nBecause Lufi is quite similar to Luffy, like in \"[Monkey D. Luffy](https://en.wikipedia.org/wiki/Monkey_D._Luffy)\" from [One Piece](https://en.wikipedia.org/wiki/One_Piece) manga, the logo is a straw hat, made with pain, love and [Inkscape](https://inkscape.org/).\n\n## Wiki (work in progress)\n\nThe official wiki will contain all you need to know about Lufi (installation, configuration, etc.). Go to <https://framagit.org/fiat-tux/hat-softwares/lufi/wikis/home> or clone it:\n\n```\ngit clone https://framagit.org/fiat-tux/hat-softwares/lufi.wiki.git\n```\n\n## Encryption\n\nAll the encryption/decryption processes take place in your browser. The encryption key is never sent over the network.\n\nHowever please note that some metadata are sent unencrypted:\n\n* the file name\n* its size\n* its mimetype\n\n## Client\n\nThere is the web interface, but you can use a CLI client too! Have a look at [lufi-cli](https://framagit.org/fiat-tux/hat-softwares/lufi-cli) or install it directly with `sudo npm install -g lufi-cli`.\n\nThere is another client in Python too: <https://framagit.org/setop/pylufic>.\n\n## Internationalization\n\nLufi comes with several languages.\n\nPlease, see [this wiki page](https://framagit.org/fiat-tux/hat-softwares/lufi/wikis/contribute#internationalization) to know how to contribute to internationalization.\n\n## Authors\n\nSee [AUTHORS.md](AUTHORS.md) file.\n\n## Contribute!\n\nPlease consider contributing, either by [reporting issues](https://framagit.org/fiat-tux/hat-softwares/lufi/issues) or by helping the internationalization. And of course, code contributions are welcome!\n\nThe details on how to contribute are on the [wiki](https://framagit.org/fiat-tux/hat-softwares/lufi/wikis/contribute).\n\nThis software uses [Fiat Tux Code of conduct](https://framagit.org/fiat-tux/code-of-conduct/blob/master/README.md).\n\n## Make a donation\n\nYou can make a donation to the author on [Tipeee](https://www.tipeee.com/fiat-tux) or on [Liberapay](https://liberapay.com/sky/).\n\n## Other dependencies\n\nLufi is written in Perl with the [Mojolicious](http://mojolicio.us) framework.\n\nIt uses:\n\n* [Materialize](http://materializecss.com/) framework to look not too ugly\n* [jQuery](https://jquery.com)\n* [Stanford Javascript Crypto Library](http://bitwiseshiftleft.github.com/sjcl/)\n* [Moment.js](http://momentjs.com/) for displaying real dates instead of unix timestamps.\n* [Filesize.js](http://filesizejs.com/) for displaying file sizes\n\n## Deploy Lufi\n\nAn ansible role and a terraform plan reside under the `.provision` directory. An user could utilize the terraform plan if they chose to deploy lufi on AWS, if that's not the goal, they could simply execute the ansible role in part. Usage docs for both are present in their respective directories.\n\nYou can use Docker by using the recipe on <https://github.com/megalis-bretagne/lufi-docker>.\n"
  },
  {
    "path": "cpanfile",
    "content": "requires 'inc::Module::Install';\nrequires 'Mojolicious', '>= 8.05';\nrequires 'Mojolicious::Plugin::DebugDumperHelper';\nrequires 'Mojolicious::Plugin::I18N';\nrequires 'Mojolicious::Plugin::Mail';\nrequires 'Mojolicious::Plugin::GzipStatic';\nrequires 'Mojolicious::Plugin::StaticCache';\nrequires 'Mojolicious::Plugin::CSPHeader', '>= 0.06';\nrequires 'Mojolicious::Plugin::FiatTux::Helpers', '== 0.12', url => 'https://framagit.org/fiat-tux/mojolicious/fiat-tux/mojolicious-plugin-fiattux-helpers/-/archive/0.12/mojolicious-plugin-fiattux-helpers-0.12.tar.gz';\nrequires 'Mojolicious::Plugin::FiatTux::GrantAccess', '== 0.10', url => 'https://framagit.org/fiat-tux/mojolicious/fiat-tux/mojolicious-plugin-fiattux-grantaccess/-/archive/0.10/mojolicious-plugin-fiattux-grantaccess-0.10.tar.gz';\nrequires 'Mojolicious::Plugin::FiatTux::Themes', '== 0.02', url => 'https://framagit.org/fiat-tux/mojolicious/fiat-tux/mojolicious-plugin-fiattux-themes/-/archive/0.02/mojolicious-plugin-fiattux-themes-0.02.tar.gz';\nrequires 'Filesys::DiskUsage';\nrequires 'Switch';\nrequires 'Locale::Maketext';\nrequires 'Locale::Maketext::Extract';\nrequires 'Net::DNS';\nrequires 'Email::Valid';\nrequires 'Number::Bytes::Human';\nrequires 'Filesys::DfPortable';\nrequires 'Data::Entropy';\nrequires 'Crypt::SaltedHash';\nrequires 'Data::Validate::URI';\nrequires 'Term::ProgressBar';\nrequires 'URI::Find';\n\n# Mojolicious optional deps\nfeature 'optional_deps' => sub {\n    requires 'Cpanel::JSON::XS';\n    requires 'EV';\n    requires 'IO::Socket::Socks';\n    requires 'Role::Tiny';\n};\n\nfeature 'test' => sub {\n    requires 'Devel::Cover';\n    requires 'B::Debug';\n};\nfeature 'ldap', 'LDAP authentication support' => sub {\n    requires 'Net::LDAP';\n    requires 'Mojolicious::Plugin::Authentication';\n    requires 'Date::Language';\n};\nfeature 'htpasswd', 'Htpasswd authentication support' => sub {\n    requires 'Apache::Htpasswd';\n    requires 'Mojolicious::Plugin::Authentication';\n};\nfeature 'auth_headers', 'Header authentication support' => sub {\n    requires 'Mojolicious::Plugin::Authentication';\n};\nfeature 'postgresql', 'PostgreSQL support' => sub {\n    requires 'Mojo::Pg';\n    requires 'Mojolicious::Plugin::PgURLHelper';\n};\nfeature 'sqlite', 'SQLite support' => sub {\n    requires 'Mojo::SQLite', '>= 3.000';\n};\nfeature 'mysql', 'MySQL support' => sub {\n    requires 'DBD::mysql', '== 4.050';\n    requires 'Mojo::mysql';\n    requires 'Mojolicious::Plugin::PgURLHelper';\n};\nfeature 'swift-storage', 'Openstack Swift object storage support' => sub {\n    requires 'Net::OpenStack::Swift';\n};\n"
  },
  {
    "path": "cpanfile.snapshot",
    "content": "# carton snapshot format: version 1.0\nDISTRIBUTIONS\n  Apache-Htpasswd-1.9\n    pathname: K/KM/KMELTZ/Apache-Htpasswd-1.9.tar.gz\n    provides:\n      Apache::Htpasswd 1.9\n    requirements:\n      Crypt::PasswdMD5 0\n      Digest::SHA 2\n      ExtUtils::MakeMaker 0\n      MIME::Base64 0\n  App-Rad-1.05\n    pathname: G/GA/GARU/App-Rad-1.05.tar.gz\n    provides:\n      App::Rad 1.05\n      App::Rad::Config undef\n      App::Rad::Exclude 0.01\n      App::Rad::Help 0.03\n      App::Rad::Include 0.01\n    requirements:\n      Attribute::Handlers 0\n      B::Deparse 0\n      Carp 0\n      ExtUtils::MakeMaker 0\n      File::Temp 0\n      FindBin 0\n      Getopt::Long 2.36\n      Test::More 0\n  Authen-SASL-2.1700\n    pathname: E/EH/EHUELS/Authen-SASL-2.1700.tar.gz\n    provides:\n      Authen::SASL 2.1700\n      Authen::SASL::CRAM_MD5 2.1700\n      Authen::SASL::EXTERNAL 2.1700\n      Authen::SASL::Perl 2.1700\n      Authen::SASL::Perl::ANONYMOUS 2.1700\n      Authen::SASL::Perl::CRAM_MD5 2.1700\n      Authen::SASL::Perl::DIGEST_MD5 2.1700\n      Authen::SASL::Perl::EXTERNAL 2.1700\n      Authen::SASL::Perl::GSSAPI 2.1700\n      Authen::SASL::Perl::LOGIN 2.1700\n      Authen::SASL::Perl::PLAIN 2.1700\n    requirements:\n      Digest::HMAC_MD5 0\n      Digest::MD5 0\n      ExtUtils::MakeMaker 0\n      perl 5.006000\n  B-Debug-1.26\n    pathname: R/RU/RURBAN/B-Debug-1.26.tar.gz\n    provides:\n      B::Debug 1.26\n    requirements:\n      B 0\n      ExtUtils::MakeMaker 0\n      Test::More 0\n      deprecate 0.03\n  B-Hooks-EndOfScope-0.26\n    pathname: E/ET/ETHER/B-Hooks-EndOfScope-0.26.tar.gz\n    provides:\n      B::Hooks::EndOfScope 0.26\n      B::Hooks::EndOfScope::PP 0.26\n      B::Hooks::EndOfScope::XS 0.26\n    requirements:\n      ExtUtils::MakeMaker 0\n      Hash::Util::FieldHash 0\n      Module::Implementation 0.05\n      Scalar::Util 0\n      Sub::Exporter::Progressive 0.001006\n      Text::ParseWords 0\n      Tie::Hash 0\n      Variable::Magic 0.48\n      perl 5.006001\n      strict 0\n      warnings 0\n  Canary-Stability-2013\n    pathname: M/ML/MLEHMANN/Canary-Stability-2013.tar.gz\n    provides:\n      Canary::Stability 2013\n    requirements:\n      ExtUtils::MakeMaker 0\n  Capture-Tiny-0.48\n    pathname: D/DA/DAGOLDEN/Capture-Tiny-0.48.tar.gz\n    provides:\n      Capture::Tiny 0.48\n    requirements:\n      Carp 0\n      Exporter 0\n      ExtUtils::MakeMaker 6.17\n      File::Spec 0\n      File::Temp 0\n      IO::Handle 0\n      Scalar::Util 0\n      perl 5.006\n      strict 0\n      warnings 0\n  Class-Accessor-Lite-0.08\n    pathname: K/KA/KAZUHO/Class-Accessor-Lite-0.08.tar.gz\n    provides:\n      Class::Accessor::Lite 0.08\n    requirements:\n      ExtUtils::MakeMaker 6.36\n  Class-Method-Modifiers-2.15\n    pathname: E/ET/ETHER/Class-Method-Modifiers-2.15.tar.gz\n    provides:\n      Class::Method::Modifiers 2.15\n    requirements:\n      B 0\n      Carp 0\n      Exporter 0\n      ExtUtils::MakeMaker 0\n      base 0\n      perl 5.006\n      strict 0\n      warnings 0\n  Class-MethodMaker-2.24\n    pathname: S/SC/SCHWIGON/class-methodmaker/Class-MethodMaker-2.24.tar.gz\n    provides:\n      Class::MethodMaker 2.24\n      Class::MethodMaker::Constants undef\n      Class::MethodMaker::Engine 2.24\n      Class::MethodMaker::OptExt undef\n      Class::MethodMaker::V1Compat undef\n      Generate undef\n    requirements:\n      ExtUtils::MakeMaker 0\n      perl 5.006\n  Clone-0.46\n    pathname: G/GA/GARU/Clone-0.46.tar.gz\n    provides:\n      Clone 0.46\n    requirements:\n      ExtUtils::MakeMaker 0\n  Clone-Choose-0.010\n    pathname: H/HE/HERMES/Clone-Choose-0.010.tar.gz\n    provides:\n      Clone::Choose 0.010\n    requirements:\n      ExtUtils::MakeMaker 0\n      Storable 0\n      perl 5.008001\n  Convert-ASN1-0.34\n    pathname: T/TI/TIMLEGGE/Convert-ASN1-0.34.tar.gz\n    provides:\n      Convert::ASN1 0.34\n    requirements:\n      ExtUtils::MakeMaker 0\n  Cpanel-JSON-XS-4.37\n    pathname: R/RU/RURBAN/Cpanel-JSON-XS-4.37.tar.gz\n    provides:\n      Cpanel::JSON::XS 4.37\n      Cpanel::JSON::XS::Type undef\n    requirements:\n      Carp 0\n      Config 0\n      Encode 1.9801\n      Exporter 0\n      ExtUtils::MakeMaker 0\n      Pod::Text 2.08\n      XSLoader 0\n      overload 0\n      strict 0\n      warnings 0\n  Crypt-PasswdMD5-1.42\n    pathname: R/RS/RSAVAGE/Crypt-PasswdMD5-1.42.tgz\n    provides:\n      Crypt::PasswdMD5 1.42\n    requirements:\n      Digest::MD5 2.53\n      ExtUtils::MakeMaker 0\n      strict 0\n      warnings 0\n  Crypt-Rijndael-1.16\n    pathname: L/LE/LEONT/Crypt-Rijndael-1.16.tar.gz\n    provides:\n      Crypt::Rijndael 1.16\n    requirements:\n      ExtUtils::MakeMaker 0\n      perl 5.006\n  Crypt-SaltedHash-0.09\n    pathname: G/GS/GSHANK/Crypt-SaltedHash-0.09.tar.gz\n    provides:\n      Crypt::SaltedHash 0.09\n    requirements:\n      Digest 0\n      ExtUtils::MakeMaker 6.30\n      Test::Fatal 0\n      Test::More 0\n  DBD-MariaDB-1.23\n    pathname: P/PA/PALI/DBD-MariaDB-1.23.tar.gz\n    provides:\n      DBD::MariaDB 1.23\n    requirements:\n      Config 0\n      DBI 1.608\n      Data::Dumper 0\n      Devel::CheckLib 1.12\n      DynaLoader 0\n      ExtUtils::MakeMaker 0\n      File::Spec 0\n      Getopt::Long 0\n      perl 5.008001\n      strict 0\n      utf8 0\n      warnings 0\n  DBD-Pg-3.18.0\n    pathname: T/TU/TURNSTEP/DBD-Pg-3.18.0.tar.gz\n    provides:\n      Bundle::DBD::Pg v3.18.0\n      DBD::Pg v3.18.0\n    requirements:\n      DBI 1.614\n      ExtUtils::MakeMaker 6.58\n      File::Temp 0\n      Test::More 0.88\n      Time::HiRes 0\n      version 0\n  DBD-SQLite-1.74\n    pathname: I/IS/ISHIGAKI/DBD-SQLite-1.74.tar.gz\n    provides:\n      DBD::SQLite 1.74\n      DBD::SQLite::Constants undef\n      DBD::SQLite::GetInfo undef\n      DBD::SQLite::VirtualTable 1.74\n      DBD::SQLite::VirtualTable::Cursor 1.74\n      DBD::SQLite::VirtualTable::FileContent undef\n      DBD::SQLite::VirtualTable::FileContent::Cursor undef\n      DBD::SQLite::VirtualTable::PerlData undef\n      DBD::SQLite::VirtualTable::PerlData::Cursor undef\n    requirements:\n      DBI 1.57\n      ExtUtils::MakeMaker 0\n      File::Spec 0.82\n      Test::More 0.88\n      Tie::Hash 0\n      perl 5.006\n  DBD-mysql-4.050\n    pathname: D/DV/DVEEDEN/DBD-mysql-4.050.tar.gz\n    provides:\n      Bundle::DBD::mysql 4.050\n      DBD::mysql 4.050\n      DBD::mysql::GetInfo undef\n      DBD::mysql::db 4.050\n      DBD::mysql::dr 4.050\n      DBD::mysql::st 4.050\n    requirements:\n      DBI 1.609\n      Data::Dumper 0\n      Devel::CheckLib 1.09\n      ExtUtils::MakeMaker 0\n      perl 5.008001\n  DBI-1.643\n    pathname: T/TI/TIMB/DBI-1.643.tar.gz\n    provides:\n      Bundle::DBI 12.008696\n      DBD::DBM 0.08\n      DBD::DBM::Statement 0.08\n      DBD::DBM::Table 0.08\n      DBD::DBM::db 0.08\n      DBD::DBM::dr 0.08\n      DBD::DBM::st 0.08\n      DBD::ExampleP 12.014311\n      DBD::ExampleP::db 12.014311\n      DBD::ExampleP::dr 12.014311\n      DBD::ExampleP::st 12.014311\n      DBD::File 0.44\n      DBD::File::DataSource::File 0.44\n      DBD::File::DataSource::Stream 0.44\n      DBD::File::Statement 0.44\n      DBD::File::Table 0.44\n      DBD::File::TableSource::FileSystem 0.44\n      DBD::File::db 0.44\n      DBD::File::dr 0.44\n      DBD::File::st 0.44\n      DBD::Gofer 0.015327\n      DBD::Gofer::Policy::Base 0.010088\n      DBD::Gofer::Policy::classic 0.010088\n      DBD::Gofer::Policy::pedantic 0.010088\n      DBD::Gofer::Policy::rush 0.010088\n      DBD::Gofer::Transport::Base 0.014121\n      DBD::Gofer::Transport::corostream undef\n      DBD::Gofer::Transport::null 0.010088\n      DBD::Gofer::Transport::pipeone 0.010088\n      DBD::Gofer::Transport::stream 0.014599\n      DBD::Gofer::db 0.015327\n      DBD::Gofer::dr 0.015327\n      DBD::Gofer::st 0.015327\n      DBD::Mem 0.001\n      DBD::Mem::DataSource 0.001\n      DBD::Mem::Statement 0.001\n      DBD::Mem::Table 0.001\n      DBD::Mem::db 0.001\n      DBD::Mem::dr 0.001\n      DBD::Mem::st 0.001\n      DBD::NullP 12.014715\n      DBD::NullP::db 12.014715\n      DBD::NullP::dr 12.014715\n      DBD::NullP::st 12.014715\n      DBD::Proxy 0.2004\n      DBD::Proxy::RPC::PlClient 0.2004\n      DBD::Proxy::db 0.2004\n      DBD::Proxy::dr 0.2004\n      DBD::Proxy::st 0.2004\n      DBD::Sponge 12.010003\n      DBD::Sponge::db 12.010003\n      DBD::Sponge::dr 12.010003\n      DBD::Sponge::st 12.010003\n      DBDI 12.015129\n      DBI 1.643\n      DBI::Const::GetInfo::ANSI 2.008697\n      DBI::Const::GetInfo::ODBC 2.011374\n      DBI::Const::GetInfoReturn 2.008697\n      DBI::Const::GetInfoType 2.008697\n      DBI::DBD 12.015129\n      DBI::DBD::Metadata 2.014214\n      DBI::DBD::SqlEngine 0.06\n      DBI::DBD::SqlEngine::DataSource 0.06\n      DBI::DBD::SqlEngine::Statement 0.06\n      DBI::DBD::SqlEngine::Table 0.06\n      DBI::DBD::SqlEngine::TableSource 0.06\n      DBI::DBD::SqlEngine::TieMeta 0.06\n      DBI::DBD::SqlEngine::TieTables 0.06\n      DBI::DBD::SqlEngine::db 0.06\n      DBI::DBD::SqlEngine::dr 0.06\n      DBI::DBD::SqlEngine::st 0.06\n      DBI::Gofer::Execute 0.014283\n      DBI::Gofer::Request 0.012537\n      DBI::Gofer::Response 0.011566\n      DBI::Gofer::Serializer::Base 0.009950\n      DBI::Gofer::Serializer::DataDumper 0.009950\n      DBI::Gofer::Serializer::Storable 0.015586\n      DBI::Gofer::Transport::Base 0.012537\n      DBI::Gofer::Transport::pipeone 0.012537\n      DBI::Gofer::Transport::stream 0.012537\n      DBI::Profile 2.015065\n      DBI::ProfileData 2.010008\n      DBI::ProfileDumper 2.015325\n      DBI::ProfileDumper::Apache 2.014121\n      DBI::ProfileSubs 0.009396\n      DBI::ProxyServer 0.3005\n      DBI::ProxyServer::db 0.3005\n      DBI::ProxyServer::dr 0.3005\n      DBI::ProxyServer::st 0.3005\n      DBI::SQL::Nano 1.015544\n      DBI::SQL::Nano::Statement_ 1.015544\n      DBI::SQL::Nano::Table_ 1.015544\n      DBI::Util::CacheMemory 0.010315\n      DBI::Util::_accessor 0.009479\n      DBI::common 1.643\n    requirements:\n      ExtUtils::MakeMaker 6.48\n      Test::Simple 0.90\n      perl 5.008001\n  Data-Entropy-0.007\n    pathname: Z/ZE/ZEFRAM/Data-Entropy-0.007.tar.gz\n    provides:\n      Data::Entropy 0.007\n      Data::Entropy::Algorithms 0.007\n      Data::Entropy::RawSource::CryptCounter 0.007\n      Data::Entropy::RawSource::Local 0.007\n      Data::Entropy::RawSource::RandomOrg 0.007\n      Data::Entropy::RawSource::RandomnumbersInfo 0.007\n      Data::Entropy::Source 0.007\n    requirements:\n      Carp 0\n      Crypt::Rijndael 0\n      Data::Float 0.008\n      Errno 1.00\n      Exporter 0\n      HTTP::Lite 2.2\n      IO::File 1.03\n      Module::Build 0\n      Params::Classify 0\n      Test::More 0\n      constant 0\n      integer 0\n      parent 0\n      perl 5.006\n      strict 0\n      warnings 0\n  Data-Float-0.013\n    pathname: Z/ZE/ZEFRAM/Data-Float-0.013.tar.gz\n    provides:\n      Data::Float 0.013\n    requirements:\n      Carp 0\n      Exporter 0\n      Module::Build 0\n      Test::More 0\n      constant 0\n      integer 0\n      parent 0\n      perl 5.006\n      strict 0\n      warnings 0\n  Data-Validate-Domain-0.15\n    pathname: D/DR/DROLSKY/Data-Validate-Domain-0.15.tar.gz\n    provides:\n      Data::Validate::Domain 0.15\n    requirements:\n      Exporter 0\n      ExtUtils::MakeMaker 0\n      Net::Domain::TLD 1.74\n      strict 0\n      warnings 0\n  Data-Validate-IP-0.31\n    pathname: D/DR/DROLSKY/Data-Validate-IP-0.31.tar.gz\n    provides:\n      Data::Validate::IP 0.31\n    requirements:\n      Exporter 0\n      ExtUtils::MakeMaker 0\n      NetAddr::IP 4\n      Scalar::Util 0\n      base 0\n      perl 5.008\n      strict 0\n      warnings 0\n  Data-Validate-URI-0.07\n    pathname: S/SO/SONNEN/Data-Validate-URI-0.07.tar.gz\n    provides:\n      Data::Validate::URI 0.07\n    requirements:\n      Data::Validate::Domain 0\n      Data::Validate::IP 0\n      ExtUtils::MakeMaker 0\n  Data-Validator-1.07\n    pathname: G/GF/GFUJI/Data-Validator-1.07.tar.gz\n    provides:\n      Data::Validator 1.07\n      Data::Validator::Role::AllowExtra undef\n      Data::Validator::Role::Croak undef\n      Data::Validator::Role::Method undef\n      Data::Validator::Role::NoRestricted undef\n      Data::Validator::Role::NoThrow undef\n      Data::Validator::Role::Sequenced undef\n      Data::Validator::Role::SmartSequenced undef\n      Data::Validator::Role::StrictSequenced undef\n    requirements:\n      ExtUtils::MakeMaker 6.59\n      Module::Build 0.38\n      Mouse 0.93\n      perl 5.008001\n  Devel-CheckCompiler-0.07\n    pathname: S/SY/SYOHEX/Devel-CheckCompiler-0.07.tar.gz\n    provides:\n      Devel::AssertC99 undef\n      Devel::CheckCompiler 0.07\n    requirements:\n      Exporter 0\n      ExtUtils::CBuilder 0\n      File::Temp 0\n      Module::Build::Tiny 0.035\n      Test::More 0.98\n      parent 0\n      perl 5.008001\n  Devel-CheckLib-1.16\n    pathname: M/MA/MATTN/Devel-CheckLib-1.16.tar.gz\n    provides:\n      Devel::CheckLib 1.16\n    requirements:\n      Exporter 0\n      ExtUtils::MakeMaker 0\n      File::Spec 0\n      File::Temp 0.16\n      perl 5.004050\n  Devel-Cover-1.40\n    pathname: P/PJ/PJCJ/Devel-Cover-1.40.tar.gz\n    provides:\n      Devel::Cover 1.40\n      Devel::Cover::Annotation::Git 1.40\n      Devel::Cover::Annotation::Random 1.40\n      Devel::Cover::Annotation::Svk 1.40\n      Devel::Cover::Branch 1.40\n      Devel::Cover::Collection 1.40\n      Devel::Cover::Collection::Template::Provider 1.40\n      Devel::Cover::Condition 1.40\n      Devel::Cover::Condition_and_2 1.40\n      Devel::Cover::Condition_and_3 1.40\n      Devel::Cover::Condition_or_2 1.40\n      Devel::Cover::Condition_or_3 1.40\n      Devel::Cover::Condition_xor_4 1.40\n      Devel::Cover::Criterion 1.40\n      Devel::Cover::DB 1.40\n      Devel::Cover::DB::Criterion 1.40\n      Devel::Cover::DB::Digests 1.40\n      Devel::Cover::DB::File 1.40\n      Devel::Cover::DB::IO 1.40\n      Devel::Cover::DB::IO::Base 1.40\n      Devel::Cover::DB::IO::JSON 1.40\n      Devel::Cover::DB::IO::Sereal 1.40\n      Devel::Cover::DB::IO::Storable 1.40\n      Devel::Cover::DB::Run 1.40\n      Devel::Cover::DB::Structure 1.40\n      Devel::Cover::Html_Common 1.40\n      Devel::Cover::Op 1.40\n      Devel::Cover::Pod 1.40\n      Devel::Cover::Report::Compilation 1.40\n      Devel::Cover::Report::Html 1.40\n      Devel::Cover::Report::Html_basic 1.40\n      Devel::Cover::Report::Html_basic::Template::Provider 1.40\n      Devel::Cover::Report::Html_minimal 1.40\n      Devel::Cover::Report::Html_subtle 1.40\n      Devel::Cover::Report::Html_subtle::Template::Provider 1.40\n      Devel::Cover::Report::Json 1.40\n      Devel::Cover::Report::Sort 1.40\n      Devel::Cover::Report::Text 1.40\n      Devel::Cover::Report::Text2 1.40\n      Devel::Cover::Report::Vim 1.40\n      Devel::Cover::Report::Vim::Template::Provider 1.40\n      Devel::Cover::Statement 1.40\n      Devel::Cover::Subroutine 1.40\n      Devel::Cover::Test 1.40\n      Devel::Cover::Time 1.40\n      Devel::Cover::Truth_Table 1.40\n      Devel::Cover::Truth_Table::Row 1.40\n      Devel::Cover::Util 1.40\n      Devel::Cover::Web 1.40\n    requirements:\n      Digest::MD5 0\n      ExtUtils::MakeMaker 0\n      HTML::Entities 3.69\n      Storable 0\n      Test::More 0\n  Digest-HMAC-1.04\n    pathname: A/AR/ARODLAND/Digest-HMAC-1.04.tar.gz\n    provides:\n      Digest::HMAC 1.04\n      Digest::HMAC_MD5 1.04\n      Digest::HMAC_SHA1 1.04\n    requirements:\n      Digest::MD5 2\n      Digest::SHA 1\n      ExtUtils::MakeMaker 0\n      perl 5.004\n  Dist-CheckConflicts-0.11\n    pathname: D/DO/DOY/Dist-CheckConflicts-0.11.tar.gz\n    provides:\n      Dist::CheckConflicts 0.11\n    requirements:\n      Carp 0\n      Exporter 0\n      ExtUtils::MakeMaker 6.30\n      Module::Runtime 0.009\n      base 0\n      strict 0\n      warnings 0\n  EV-4.34\n    pathname: M/ML/MLEHMANN/EV-4.34.tar.gz\n    provides:\n      EV 4.34\n      EV::MakeMaker undef\n    requirements:\n      Canary::Stability 0\n      ExtUtils::MakeMaker 6.52\n      common::sense 0\n  Email-Date-Format-1.008\n    pathname: R/RJ/RJBS/Email-Date-Format-1.008.tar.gz\n    provides:\n      Email::Date::Format 1.008\n    requirements:\n      Exporter 5.57\n      ExtUtils::MakeMaker 6.78\n      Time::Local 1.27\n      perl 5.012\n      warnings 0\n  Email-Valid-1.203\n    pathname: R/RJ/RJBS/Email-Valid-1.203.tar.gz\n    provides:\n      Email::Valid 1.203\n    requirements:\n      ExtUtils::MakeMaker 0\n      Mail::Address 0\n      Scalar::Util 0\n      Test::More 0\n      perl 5.006\n  Encode-Locale-1.05\n    pathname: G/GA/GAAS/Encode-Locale-1.05.tar.gz\n    provides:\n      Encode::Locale 1.05\n    requirements:\n      Encode 2\n      Encode::Alias 0\n      ExtUtils::MakeMaker 0\n      perl 5.008\n  ExtUtils-Config-0.008\n    pathname: L/LE/LEONT/ExtUtils-Config-0.008.tar.gz\n    provides:\n      ExtUtils::Config 0.008\n    requirements:\n      Data::Dumper 0\n      ExtUtils::MakeMaker 6.30\n      strict 0\n      warnings 0\n  ExtUtils-Helpers-0.026\n    pathname: L/LE/LEONT/ExtUtils-Helpers-0.026.tar.gz\n    provides:\n      ExtUtils::Helpers 0.026\n      ExtUtils::Helpers::Unix 0.026\n      ExtUtils::Helpers::VMS 0.026\n      ExtUtils::Helpers::Windows 0.026\n    requirements:\n      Carp 0\n      Exporter 5.57\n      ExtUtils::MakeMaker 0\n      File::Basename 0\n      File::Copy 0\n      File::Spec::Functions 0\n      Text::ParseWords 3.24\n      perl 5.006\n      strict 0\n      warnings 0\n  ExtUtils-InstallPaths-0.012\n    pathname: L/LE/LEONT/ExtUtils-InstallPaths-0.012.tar.gz\n    provides:\n      ExtUtils::InstallPaths 0.012\n    requirements:\n      Carp 0\n      ExtUtils::Config 0.002\n      ExtUtils::MakeMaker 0\n      File::Spec 0\n      perl 5.006\n      strict 0\n      warnings 0\n  File-Listing-6.16\n    pathname: P/PL/PLICEASE/File-Listing-6.16.tar.gz\n    provides:\n      File::Listing 6.16\n      File::Listing::apache 6.16\n      File::Listing::dosftp 6.16\n      File::Listing::netware 6.16\n      File::Listing::unix 6.16\n      File::Listing::vms 6.16\n    requirements:\n      Exporter 5.57\n      ExtUtils::MakeMaker 0\n      HTTP::Date 0\n      perl 5.006\n  File-Remove-1.61\n    pathname: S/SH/SHLOMIF/File-Remove-1.61.tar.gz\n    provides:\n      File::Remove 1.61\n    requirements:\n      Cwd 3.29\n      ExtUtils::MakeMaker 0\n      File::Glob 0\n      File::Path 0\n      File::Spec 3.29\n      Module::Build 0.28\n      constant 0\n      perl 5.008\n      strict 0\n      vars 0\n      warnings 0\n  Filesys-DfPortable-0.85\n    pathname: I/IG/IGUTHRIE/Filesys-DfPortable-0.85.tar.gz\n    provides:\n      Filesys::DfPortable 0.85\n    requirements:\n      ExtUtils::MakeMaker 0\n  Filesys-DiskUsage-0.13\n    pathname: M/MA/MANWAR/Filesys-DiskUsage-0.13.tar.gz\n    provides:\n      Filesys::DiskUsage 0.13\n    requirements:\n      ExtUtils::MakeMaker 0\n      File::Basename 0\n      File::Find 0\n      File::Temp 0\n      Test::More 0\n      Test::Warn 0\n      perl 5.006\n  Furl-3.14\n    pathname: S/SY/SYOHEX/Furl-3.14.tar.gz\n    provides:\n      Furl 3.14\n      Furl::ConnectionCache undef\n      Furl::HTTP 3.14\n      Furl::Headers undef\n      Furl::Request undef\n      Furl::Response undef\n      Furl::ZlibStream undef\n    requirements:\n      Class::Accessor::Lite 0\n      Encode 0\n      HTTP::Parser::XS 0.11\n      MIME::Base64 0\n      Module::Build::Tiny 0.035\n      Mozilla::CA 0\n      Scalar::Util 0\n      Socket 0\n      Time::HiRes 0\n      perl 5.008001\n  HTML-Parser-3.81\n    pathname: O/OA/OALDERS/HTML-Parser-3.81.tar.gz\n    provides:\n      HTML::Entities 3.81\n      HTML::Filter 3.81\n      HTML::HeadParser 3.81\n      HTML::LinkExtor 3.81\n      HTML::Parser 3.81\n      HTML::PullParser 3.81\n      HTML::TokeParser 3.81\n    requirements:\n      Carp 0\n      Exporter 0\n      ExtUtils::MakeMaker 6.52\n      HTML::Tagset 0\n      HTTP::Headers 0\n      IO::File 0\n      URI 0\n      URI::URL 0\n      XSLoader 0\n      strict 0\n  HTML-Tagset-3.20\n    pathname: P/PE/PETDANCE/HTML-Tagset-3.20.tar.gz\n    provides:\n      HTML::Tagset 3.20\n    requirements:\n      ExtUtils::MakeMaker 0\n  HTTP-CookieJar-0.014\n    pathname: D/DA/DAGOLDEN/HTTP-CookieJar-0.014.tar.gz\n    provides:\n      HTTP::CookieJar 0.014\n      HTTP::CookieJar::LWP 0.014\n    requirements:\n      Carp 0\n      ExtUtils::MakeMaker 6.17\n      HTTP::Date 0\n      Time::Local 1.1901\n      parent 0\n      perl 5.008001\n      strict 0\n      warnings 0\n  HTTP-Cookies-6.11\n    pathname: O/OA/OALDERS/HTTP-Cookies-6.11.tar.gz\n    provides:\n      HTTP::Cookies 6.11\n      HTTP::Cookies::Microsoft 6.11\n      HTTP::Cookies::Netscape 6.11\n    requirements:\n      Carp 0\n      ExtUtils::MakeMaker 0\n      HTTP::Date 6\n      HTTP::Headers::Util 6\n      HTTP::Request 0\n      locale 0\n      perl 5.008001\n      strict 0\n  HTTP-Date-6.06\n    pathname: O/OA/OALDERS/HTTP-Date-6.06.tar.gz\n    provides:\n      HTTP::Date 6.06\n    requirements:\n      Exporter 0\n      ExtUtils::MakeMaker 0\n      Time::Local 1.28\n      Time::Zone 0\n      perl 5.006002\n      strict 0\n  HTTP-Lite-2.44\n    pathname: N/NE/NEILB/HTTP-Lite-2.44.tar.gz\n    provides:\n      HTTP::Lite 2.44\n    requirements:\n      ExtUtils::MakeMaker 0\n      Fcntl 0\n      Socket 1.3\n      perl 5.005\n      strict 0\n      warnings 0\n  HTTP-Message-6.45\n    pathname: O/OA/OALDERS/HTTP-Message-6.45.tar.gz\n    provides:\n      HTTP::Config 6.45\n      HTTP::Headers 6.45\n      HTTP::Headers::Auth 6.45\n      HTTP::Headers::ETag 6.45\n      HTTP::Headers::Util 6.45\n      HTTP::Message 6.45\n      HTTP::Request 6.45\n      HTTP::Request::Common 6.45\n      HTTP::Response 6.45\n      HTTP::Status 6.45\n    requirements:\n      Carp 0\n      Clone 0.46\n      Compress::Raw::Bzip2 0\n      Compress::Raw::Zlib 2.062\n      Encode 3.01\n      Encode::Locale 1\n      Exporter 5.57\n      ExtUtils::MakeMaker 0\n      File::Spec 0\n      HTTP::Date 6\n      IO::Compress::Bzip2 2.021\n      IO::Compress::Deflate 0\n      IO::Compress::Gzip 0\n      IO::HTML 0\n      IO::Uncompress::Inflate 0\n      IO::Uncompress::RawInflate 0\n      LWP::MediaTypes 6\n      MIME::Base64 2.1\n      MIME::QuotedPrint 0\n      URI 1.10\n      parent 0\n      perl 5.008001\n      strict 0\n      warnings 0\n  HTTP-Negotiate-6.01\n    pathname: G/GA/GAAS/HTTP-Negotiate-6.01.tar.gz\n    provides:\n      HTTP::Negotiate 6.01\n    requirements:\n      ExtUtils::MakeMaker 0\n      HTTP::Headers 6\n      perl 5.008001\n  HTTP-Parser-XS-0.17\n    pathname: K/KA/KAZUHO/HTTP-Parser-XS-0.17.tar.gz\n    provides:\n      HTTP::Parser::XS 0.17\n      HTTP::Parser::XS::PP undef\n    requirements:\n      ExtUtils::MakeMaker 6.36\n      Test::More 0.96\n  Hash-Merge-0.302\n    pathname: H/HE/HERMES/Hash-Merge-0.302.tar.gz\n    provides:\n      Hash::Merge 0.302\n    requirements:\n      Clone::Choose 0.008\n      ExtUtils::MakeMaker 6.64\n      Scalar::Util 0\n      perl 5.008001\n  IO-HTML-1.004\n    pathname: C/CJ/CJM/IO-HTML-1.004.tar.gz\n    provides:\n      IO::HTML 1.004\n    requirements:\n      Carp 0\n      Encode 2.10\n      Exporter 5.57\n      ExtUtils::MakeMaker 0\n      perl 5.008\n  IO-Socket-SSL-2.084\n    pathname: S/SU/SULLR/IO-Socket-SSL-2.084.tar.gz\n    provides:\n      IO::Socket::SSL 2.084\n      IO::Socket::SSL::Intercept 2.056\n      IO::Socket::SSL::OCSP_Cache 2.084\n      IO::Socket::SSL::OCSP_Resolver 2.084\n      IO::Socket::SSL::PublicSuffix undef\n      IO::Socket::SSL::SSL_Context 2.084\n      IO::Socket::SSL::SSL_HANDLE 2.084\n      IO::Socket::SSL::Session_Cache 2.084\n      IO::Socket::SSL::Trace 2.084\n      IO::Socket::SSL::Utils 2.015\n    requirements:\n      ExtUtils::MakeMaker 0\n      Mozilla::CA 0\n      Net::SSLeay 1.46\n      Scalar::Util 0\n  IO-Socket-Socks-0.74\n    pathname: O/OL/OLEG/IO-Socket-Socks-0.74.tar.gz\n    provides:\n      IO::Socket::Socks 0.74\n      IO::Socket::Socks::Debug 0.74\n      IO::Socket::Socks::Error 0.74\n      IO::Socket::Socks::ReadOnlyVar 0.74\n      IO::Socket::Socks::SocketClassVar 0.74\n    requirements:\n      ExtUtils::MakeMaker 6.52\n      IO::Select 0\n      Socket 1.94\n      Test::More 0.88\n      constant 1.03\n  ISO-639_1-0.04\n    pathname: L/LD/LDIDRY/ISO-639_1-0.04.tar.gz\n    provides:\n      ISO::639_1 0.04\n    requirements:\n      Module::Build::Tiny 0.035\n      perl 5.008001\n  JSON-4.10\n    pathname: I/IS/ISHIGAKI/JSON-4.10.tar.gz\n    provides:\n      JSON 4.10\n      JSON::Backend::PP 4.10\n    requirements:\n      ExtUtils::MakeMaker 0\n      Test::More 0\n  LWP-MediaTypes-6.04\n    pathname: O/OA/OALDERS/LWP-MediaTypes-6.04.tar.gz\n    provides:\n      LWP::MediaTypes 6.04\n    requirements:\n      Carp 0\n      Exporter 0\n      ExtUtils::MakeMaker 0\n      File::Basename 0\n      Scalar::Util 0\n      perl 5.006002\n      strict 0\n  Locale-Maketext-Lexicon-1.00\n    pathname: D/DR/DRTECH/Locale-Maketext-Lexicon-1.00.tar.gz\n    provides:\n      Locale::Maketext::Extract 1.00\n      Locale::Maketext::Extract::Plugin::Base 1.00\n      Locale::Maketext::Extract::Plugin::FormFu 1.00\n      Locale::Maketext::Extract::Plugin::FormFu::Extractor 1.00\n      Locale::Maketext::Extract::Plugin::Generic 1.00\n      Locale::Maketext::Extract::Plugin::Haml 1.00\n      Locale::Maketext::Extract::Plugin::Mason 1.00\n      Locale::Maketext::Extract::Plugin::PPI 1.00\n      Locale::Maketext::Extract::Plugin::Perl 1.00\n      Locale::Maketext::Extract::Plugin::TT2 1.00\n      Locale::Maketext::Extract::Plugin::TT2::Directive 1.00\n      Locale::Maketext::Extract::Plugin::TT2::Parser 1.00\n      Locale::Maketext::Extract::Plugin::TextTemplate 1.00\n      Locale::Maketext::Extract::Plugin::TextTemplate::Parser 1.00\n      Locale::Maketext::Extract::Plugin::YAML 1.00\n      Locale::Maketext::Extract::Plugin::YAML::Extractor 1.00\n      Locale::Maketext::Extract::Run 1.00\n      Locale::Maketext::Lexicon 1.00\n      Locale::Maketext::Lexicon::Auto 1.00\n      Locale::Maketext::Lexicon::Gettext 1.00\n      Locale::Maketext::Lexicon::Msgcat 1.00\n      Locale::Maketext::Lexicon::Tie 1.00\n    requirements:\n      ExtUtils::MakeMaker 6.30\n      Locale::Maketext 1.17\n  Log-Minimal-0.19\n    pathname: K/KA/KAZEBURO/Log-Minimal-0.19.tar.gz\n    provides:\n      Log::Minimal 0.19\n    requirements:\n      CPAN::Meta 0\n      CPAN::Meta::Prereqs 0\n      Data::Dumper 0\n      Module::Build 0.38\n      Scalar::Util 0\n      Term::ANSIColor 0\n  MIME-Charset-1.013.1\n    pathname: N/NE/NEZUMI/MIME-Charset-1.013.1.tar.gz\n    provides:\n      MIME::Charset v1.13.1\n    requirements:\n      CPAN 0\n      Encode 1.98\n      ExtUtils::MakeMaker 6.42\n      Test::More 0\n      perl 5.005\n  MIME-EncWords-1.014.3\n    pathname: N/NE/NEZUMI/MIME-EncWords-1.014.3.tar.gz\n    provides:\n      Encode::MIME::EncWords 0.03\n      MIME::EncWords 1.014003\n    requirements:\n      Encode 1.98\n      ExtUtils::MakeMaker 0\n      MIME::Base64 2.13\n      MIME::Charset v1.10.1\n      Test::More 0\n  MIME-Lite-3.033\n    pathname: R/RJ/RJBS/MIME-Lite-3.033.tar.gz\n    provides:\n      MIME::Lite 3.033\n      MIME::Lite::IO_Handle 3.033\n      MIME::Lite::IO_Scalar 3.033\n      MIME::Lite::IO_ScalarArray 3.033\n      MIME::Lite::SMTP 3.033\n      MailTool undef\n    requirements:\n      Email::Date::Format 1.000\n      ExtUtils::MakeMaker 0\n      File::Basename 0\n      File::Spec 0\n      MIME::Base64 0\n      MIME::QuotedPrint 0\n      MIME::Types 1.28\n      Mail::Address 1.62\n  MIME-Types-2.24\n    pathname: M/MA/MARKOV/MIME-Types-2.24.tar.gz\n    provides:\n      MIME::Type 2.24\n      MIME::Types 2.24\n      MojoX::MIME::Types 2.24\n    requirements:\n      ExtUtils::MakeMaker 0\n      File::Basename 0\n      File::Spec 0\n      List::Util 0\n      Test::More 0.47\n  MRO-Compat-0.15\n    pathname: H/HA/HAARG/MRO-Compat-0.15.tar.gz\n    provides:\n      MRO::Compat 0.15\n    requirements:\n      ExtUtils::MakeMaker 0\n      perl 5.006\n  MailTools-2.21\n    pathname: M/MA/MARKOV/MailTools-2.21.tar.gz\n    provides:\n      Mail::Address 2.21\n      Mail::Cap 2.21\n      Mail::Field 2.21\n      Mail::Field::AddrList 2.21\n      Mail::Field::Date 2.21\n      Mail::Field::Generic 2.21\n      Mail::Filter 2.21\n      Mail::Header 2.21\n      Mail::Internet 2.21\n      Mail::Mailer 2.21\n      Mail::Mailer::qmail 2.21\n      Mail::Mailer::rfc822 2.21\n      Mail::Mailer::sendmail 2.21\n      Mail::Mailer::smtp 2.21\n      Mail::Mailer::smtp::pipe 2.21\n      Mail::Mailer::smtps 2.21\n      Mail::Mailer::smtps::pipe 2.21\n      Mail::Mailer::testfile 2.21\n      Mail::Mailer::testfile::pipe 2.21\n      Mail::Send 2.21\n      Mail::Util 2.21\n      MailTools 2.21\n    requirements:\n      Date::Format 0\n      Date::Parse 0\n      ExtUtils::MakeMaker 0\n      IO::Handle 0\n      Net::Domain 1.05\n      Net::SMTP 1.03\n      Test::More 0\n  Module-Build-0.4234\n    pathname: L/LE/LEONT/Module-Build-0.4234.tar.gz\n    provides:\n      Module::Build 0.4234\n      Module::Build::Base 0.4234\n      Module::Build::Compat 0.4234\n      Module::Build::Config 0.4234\n      Module::Build::Cookbook 0.4234\n      Module::Build::Dumper 0.4234\n      Module::Build::Notes 0.4234\n      Module::Build::PPMMaker 0.4234\n      Module::Build::Platform::Default 0.4234\n      Module::Build::Platform::MacOS 0.4234\n      Module::Build::Platform::Unix 0.4234\n      Module::Build::Platform::VMS 0.4234\n      Module::Build::Platform::VOS 0.4234\n      Module::Build::Platform::Windows 0.4234\n      Module::Build::Platform::aix 0.4234\n      Module::Build::Platform::cygwin 0.4234\n      Module::Build::Platform::darwin 0.4234\n      Module::Build::Platform::os2 0.4234\n      Module::Build::PodParser 0.4234\n    requirements:\n      CPAN::Meta 2.142060\n      Cwd 0\n      Data::Dumper 0\n      ExtUtils::CBuilder 0.27\n      ExtUtils::Install 0\n      ExtUtils::Manifest 0\n      ExtUtils::Mkbootstrap 0\n      ExtUtils::ParseXS 2.21\n      File::Basename 0\n      File::Compare 0\n      File::Copy 0\n      File::Find 0\n      File::Path 0\n      File::Spec 0.82\n      Getopt::Long 0\n      Module::Metadata 1.000002\n      Perl::OSType 1\n      TAP::Harness 3.29\n      Text::Abbrev 0\n      Text::ParseWords 0\n      perl 5.006001\n      version 0.87\n  Module-Build-Tiny-0.047\n    pathname: L/LE/LEONT/Module-Build-Tiny-0.047.tar.gz\n    provides:\n      Module::Build::Tiny 0.047\n    requirements:\n      CPAN::Meta 0\n      DynaLoader 0\n      Exporter 5.57\n      ExtUtils::CBuilder 0\n      ExtUtils::Config 0.003\n      ExtUtils::Helpers 0.020\n      ExtUtils::Install 0\n      ExtUtils::InstallPaths 0.002\n      ExtUtils::ParseXS 0\n      File::Basename 0\n      File::Find 0\n      File::Path 0\n      File::Spec::Functions 0\n      Getopt::Long 2.36\n      JSON::PP 2\n      Pod::Man 0\n      TAP::Harness::Env 0\n      perl 5.006\n      strict 0\n      warnings 0\n  Module-Build-XSUtil-0.19\n    pathname: H/HI/HIDEAKIO/Module-Build-XSUtil-0.19.tar.gz\n    provides:\n      Module::Build::XSUtil 0.19\n    requirements:\n      Devel::CheckCompiler 0\n      Devel::PPPort 0\n      Exporter 0\n      ExtUtils::CBuilder 0\n      File::Basename 0\n      File::Path 0\n      Module::Build 0.4005\n      XSLoader 0\n      parent 0\n      perl 5.008001\n  Module-Implementation-0.09\n    pathname: D/DR/DROLSKY/Module-Implementation-0.09.tar.gz\n    provides:\n      Module::Implementation 0.09\n    requirements:\n      Carp 0\n      ExtUtils::MakeMaker 0\n      Module::Runtime 0.012\n      Try::Tiny 0\n      strict 0\n      warnings 0\n  Module-Install-1.21\n    pathname: E/ET/ETHER/Module-Install-1.21.tar.gz\n    provides:\n      Module::AutoInstall 1.21\n      Module::Install 1.21\n      Module::Install::Admin 1.21\n      Module::Install::Admin::Bundle 1.21\n      Module::Install::Admin::Compiler 1.21\n      Module::Install::Admin::Find 1.21\n      Module::Install::Admin::Include 1.21\n      Module::Install::Admin::Makefile 1.21\n      Module::Install::Admin::Manifest 1.21\n      Module::Install::Admin::Metadata 1.21\n      Module::Install::Admin::ScanDeps 1.21\n      Module::Install::Admin::WriteAll 1.21\n      Module::Install::AutoInstall 1.21\n      Module::Install::Base 1.21\n      Module::Install::Base::FakeAdmin 1.21\n      Module::Install::Bundle 1.21\n      Module::Install::Can 1.21\n      Module::Install::Compiler 1.21\n      Module::Install::Deprecated 1.21\n      Module::Install::External 1.21\n      Module::Install::Fetch 1.21\n      Module::Install::Include 1.21\n      Module::Install::Inline 1.21\n      Module::Install::MakeMaker 1.21\n      Module::Install::Makefile 1.21\n      Module::Install::Metadata 1.21\n      Module::Install::PAR 1.21\n      Module::Install::Run 1.21\n      Module::Install::Scripts 1.21\n      Module::Install::Share 1.21\n      Module::Install::Win32 1.21\n      Module::Install::With 1.21\n      Module::Install::WriteAll 1.21\n      inc::Module::Install 1.21\n    requirements:\n      Devel::PPPort 3.16\n      ExtUtils::Install 1.52\n      ExtUtils::MakeMaker 6.59\n      ExtUtils::ParseXS 2.19\n      File::Path 0\n      File::Remove 1.42\n      File::Spec 3.28\n      Module::Build 0.29\n      Module::CoreList 2.17\n      Module::ScanDeps 1.09\n      Parse::CPAN::Meta 1.4413\n      Test::Harness 3.13\n      Test::More 0.86\n      YAML::Tiny 1.38\n      autodie 0\n      perl 5.006\n  Module-Runtime-0.016\n    pathname: Z/ZE/ZEFRAM/Module-Runtime-0.016.tar.gz\n    provides:\n      Module::Runtime 0.016\n    requirements:\n      Module::Build 0\n      Test::More 0.41\n      perl 5.006\n      strict 0\n      warnings 0\n  Module-ScanDeps-1.35\n    pathname: R/RS/RSCHUPP/Module-ScanDeps-1.35.tar.gz\n    provides:\n      Module::ScanDeps 1.35\n    requirements:\n      ExtUtils::MakeMaker 0\n      File::Spec 0\n      File::Temp 0\n      Getopt::Long 0\n      List::Util 1.33\n      Module::Metadata 0\n      Text::ParseWords 0\n      perl 5.008009\n      version 0\n  Mojo-Pg-4.27\n    pathname: S/SR/SRI/Mojo-Pg-4.27.tar.gz\n    provides:\n      Mojo::Pg 4.27\n      Mojo::Pg::Database undef\n      Mojo::Pg::Migrations undef\n      Mojo::Pg::PubSub undef\n      Mojo::Pg::Results undef\n      Mojo::Pg::Transaction undef\n    requirements:\n      DBD::Pg 3.007004\n      ExtUtils::MakeMaker 0\n      Mojolicious 8.50\n      SQL::Abstract::Pg 1.0\n      perl 5.016\n  Mojo-SQLite-3.009\n    pathname: D/DB/DBOOK/Mojo-SQLite-3.009.tar.gz\n    provides:\n      Mojo::SQLite 3.009\n      Mojo::SQLite::Database 3.009\n      Mojo::SQLite::Migrations 3.009\n      Mojo::SQLite::PubSub 3.009\n      Mojo::SQLite::Results 3.009\n      Mojo::SQLite::Transaction 3.009\n    requirements:\n      Carp 0\n      DBD::SQLite 1.68\n      DBI 1.627\n      File::Spec::Functions 0\n      File::Temp 0\n      Module::Build::Tiny 0.034\n      Mojolicious 8.03\n      SQL::Abstract::Pg 1.0\n      Scalar::Util 0\n      URI 1.69\n      URI::db 0.15\n      URI::file 4.21\n      perl 5.010001\n  Mojo-mysql-1.27\n    pathname: J/JH/JHTHORSEN/Mojo-mysql-1.27.tar.gz\n    provides:\n      Mojo::mysql 1.27\n      Mojo::mysql::Database undef\n      Mojo::mysql::Migrations undef\n      Mojo::mysql::PubSub undef\n      Mojo::mysql::Results undef\n      Mojo::mysql::Transaction undef\n      SQL::Abstract::mysql undef\n    requirements:\n      DBD::MariaDB 1.21\n      DBI 1.643\n      ExtUtils::MakeMaker 0\n      Mojolicious 8.03\n      SQL::Abstract 1.86\n      perl 5.016\n  Mojolicious-9.35\n    pathname: S/SR/SRI/Mojolicious-9.35.tar.gz\n    provides:\n      Mojo undef\n      Mojo::Asset undef\n      Mojo::Asset::File undef\n      Mojo::Asset::Memory undef\n      Mojo::Base undef\n      Mojo::ByteStream undef\n      Mojo::Cache undef\n      Mojo::Collection undef\n      Mojo::Content undef\n      Mojo::Content::MultiPart undef\n      Mojo::Content::Single undef\n      Mojo::Cookie undef\n      Mojo::Cookie::Request undef\n      Mojo::Cookie::Response undef\n      Mojo::DOM undef\n      Mojo::DOM::CSS undef\n      Mojo::DOM::HTML undef\n      Mojo::Date undef\n      Mojo::DynamicMethods undef\n      Mojo::EventEmitter undef\n      Mojo::Exception undef\n      Mojo::File undef\n      Mojo::Headers undef\n      Mojo::HelloWorld undef\n      Mojo::Home undef\n      Mojo::IOLoop undef\n      Mojo::IOLoop::Client undef\n      Mojo::IOLoop::Server undef\n      Mojo::IOLoop::Stream undef\n      Mojo::IOLoop::Subprocess undef\n      Mojo::IOLoop::TLS undef\n      Mojo::JSON undef\n      Mojo::JSON::Pointer undef\n      Mojo::Loader undef\n      Mojo::Log undef\n      Mojo::Message undef\n      Mojo::Message::Request undef\n      Mojo::Message::Response undef\n      Mojo::Parameters undef\n      Mojo::Path undef\n      Mojo::Promise undef\n      Mojo::Reactor undef\n      Mojo::Reactor::EV undef\n      Mojo::Reactor::Poll undef\n      Mojo::Server undef\n      Mojo::Server::CGI undef\n      Mojo::Server::Daemon undef\n      Mojo::Server::Hypnotoad undef\n      Mojo::Server::Morbo undef\n      Mojo::Server::Morbo::Backend undef\n      Mojo::Server::Morbo::Backend::Poll undef\n      Mojo::Server::PSGI undef\n      Mojo::Server::Prefork undef\n      Mojo::Template undef\n      Mojo::Transaction undef\n      Mojo::Transaction::HTTP undef\n      Mojo::Transaction::WebSocket undef\n      Mojo::URL undef\n      Mojo::Upload undef\n      Mojo::UserAgent undef\n      Mojo::UserAgent::CookieJar undef\n      Mojo::UserAgent::Proxy undef\n      Mojo::UserAgent::Server undef\n      Mojo::UserAgent::Transactor undef\n      Mojo::Util undef\n      Mojo::WebSocket undef\n      Mojolicious 9.35\n      Mojolicious::Command undef\n      Mojolicious::Command::Author::cpanify undef\n      Mojolicious::Command::Author::generate undef\n      Mojolicious::Command::Author::generate::app undef\n      Mojolicious::Command::Author::generate::dockerfile undef\n      Mojolicious::Command::Author::generate::lite_app undef\n      Mojolicious::Command::Author::generate::makefile undef\n      Mojolicious::Command::Author::generate::plugin undef\n      Mojolicious::Command::Author::inflate undef\n      Mojolicious::Command::cgi undef\n      Mojolicious::Command::daemon undef\n      Mojolicious::Command::eval undef\n      Mojolicious::Command::get undef\n      Mojolicious::Command::prefork undef\n      Mojolicious::Command::psgi undef\n      Mojolicious::Command::routes undef\n      Mojolicious::Command::version undef\n      Mojolicious::Commands undef\n      Mojolicious::Controller undef\n      Mojolicious::Lite undef\n      Mojolicious::Plugin undef\n      Mojolicious::Plugin::Config undef\n      Mojolicious::Plugin::DefaultHelpers undef\n      Mojolicious::Plugin::EPLRenderer undef\n      Mojolicious::Plugin::EPRenderer undef\n      Mojolicious::Plugin::HeaderCondition undef\n      Mojolicious::Plugin::JSONConfig undef\n      Mojolicious::Plugin::Mount undef\n      Mojolicious::Plugin::NotYAMLConfig undef\n      Mojolicious::Plugin::TagHelpers undef\n      Mojolicious::Plugins undef\n      Mojolicious::Renderer undef\n      Mojolicious::Routes undef\n      Mojolicious::Routes::Match undef\n      Mojolicious::Routes::Pattern undef\n      Mojolicious::Routes::Route undef\n      Mojolicious::Sessions undef\n      Mojolicious::Static undef\n      Mojolicious::Types undef\n      Mojolicious::Validator undef\n      Mojolicious::Validator::Validation undef\n      Test::Mojo undef\n      ojo undef\n    requirements:\n      ExtUtils::MakeMaker 0\n      IO::Socket::IP 0.37\n      Sub::Util 1.41\n      perl 5.016\n  Mojolicious-Plugin-Authentication-1.39\n    pathname: J/JJ/JJATRIA/Mojolicious-Plugin-Authentication-1.39.tar.gz\n    provides:\n      Mojolicious::Plugin::Authentication 1.39\n    requirements:\n      Exporter 0\n      ExtUtils::MakeMaker 0\n      Mojolicious 8.0\n      perl 5.016\n  Mojolicious-Plugin-CSPHeader-0.06\n    pathname: L/LD/LDIDRY/Mojolicious-Plugin-CSPHeader-0.06.tar.gz\n    provides:\n      Mojolicious::Plugin::CSPHeader 0.06\n    requirements:\n      ExtUtils::MakeMaker 0\n      Mojolicious 7.75\n  Mojolicious-Plugin-DebugDumperHelper-0.03\n    pathname: L/LD/LDIDRY/Mojolicious-Plugin-DebugDumperHelper-0.03.tar.gz\n    provides:\n      Mojolicious::Plugin::DebugDumperHelper 0.03\n    requirements:\n      ExtUtils::MakeMaker 0\n      Mojolicious 6.11\n  Mojolicious-Plugin-GzipStatic-0.04\n    pathname: L/LD/LDIDRY/Mojolicious-Plugin-GzipStatic-0.04.tar.gz\n    provides:\n      Mojolicious::Plugin::GzipStatic 0.04\n    requirements:\n      ExtUtils::MakeMaker 0\n      IO::Compress::Gzip 0\n      Mojolicious 7.75\n  Mojolicious-Plugin-I18N-1.6\n    pathname: S/SH/SHARIFULN/Mojolicious-Plugin-I18N-1.6.tar.gz\n    provides:\n      Mojolicious::Plugin::I18N 1.6\n    requirements:\n      I18N::LangTags 0.35\n      Module::Build 0.42\n      Mojolicious 5\n      Test::More 0\n      perl 5.010001\n  Mojolicious-Plugin-Mail-1.5\n    pathname: S/SH/SHARIFULN/Mojolicious-Plugin-Mail-1.5.tar.gz\n    provides:\n      Mojolicious::Plugin::Mail 1.5\n    requirements:\n      Encode 0\n      MIME::EncWords 0\n      MIME::Lite 3.027\n      Mojolicious 5\n      Test::More 0\n      perl 5.001001\n  Mojolicious-Plugin-PgURLHelper-0.03\n    pathname: L/LD/LDIDRY/Mojolicious-Plugin-PgURLHelper-0.03.tar.gz\n    provides:\n      Mojolicious::Plugin::PgURLHelper 0.03\n    requirements:\n      ExtUtils::MakeMaker 0\n      Mojolicious 7.23\n  Mojolicious-Plugin-StaticCache-0.02\n    pathname: L/LD/LDIDRY/Mojolicious-Plugin-StaticCache-0.02.tar.gz\n    provides:\n      Mojolicious::Plugin::StaticCache 0.02\n    requirements:\n      ExtUtils::MakeMaker 0\n      Mojolicious 7.33\n  Moo-2.005005\n    pathname: H/HA/HAARG/Moo-2.005005.tar.gz\n    provides:\n      Method::Generate::Accessor undef\n      Method::Generate::BuildAll undef\n      Method::Generate::Constructor undef\n      Method::Generate::DemolishAll undef\n      Moo 2.005005\n      Moo::HandleMoose undef\n      Moo::HandleMoose::FakeConstructor undef\n      Moo::HandleMoose::FakeMetaClass undef\n      Moo::HandleMoose::_TypeMap undef\n      Moo::Object undef\n      Moo::Role 2.005005\n      Moo::_Utils undef\n      Moo::sification undef\n      oo undef\n    requirements:\n      Carp 0\n      Class::Method::Modifiers 1.10\n      Exporter 0\n      ExtUtils::MakeMaker 0\n      Role::Tiny 2.002003\n      Scalar::Util 1.00\n      Sub::Defer 2.006006\n      Sub::Quote 2.006006\n      perl 5.006\n  Mouse-v2.5.10\n    pathname: S/SK/SKAJI/Mouse-v2.5.10.tar.gz\n    provides:\n      Mouse v2.5.10\n      Mouse::Exporter undef\n      Mouse::Meta::Attribute undef\n      Mouse::Meta::Class undef\n      Mouse::Meta::Method undef\n      Mouse::Meta::Method::Accessor undef\n      Mouse::Meta::Method::Constructor undef\n      Mouse::Meta::Method::Delegation undef\n      Mouse::Meta::Method::Destructor undef\n      Mouse::Meta::Module undef\n      Mouse::Meta::Role undef\n      Mouse::Meta::Role::Application undef\n      Mouse::Meta::Role::Application::RoleSummation undef\n      Mouse::Meta::Role::Composite undef\n      Mouse::Meta::Role::Method undef\n      Mouse::Meta::TypeConstraint undef\n      Mouse::Object undef\n      Mouse::PurePerl undef\n      Mouse::Role v2.5.10\n      Mouse::Spec v2.5.10\n      Mouse::TypeRegistry undef\n      Mouse::Util v2.5.10\n      Mouse::Util::MetaRole undef\n      Mouse::Util::TypeConstraints undef\n      Squirrel undef\n      Squirrel::Role undef\n      Test::Mouse undef\n      ouse undef\n    requirements:\n      ExtUtils::CBuilder 0\n      Module::Build 0.4005\n      Module::Build::XSUtil 0.19\n      Scalar::Util 1.14\n      XSLoader 0.02\n      perl 5.008005\n  Mozilla-CA-20231213\n    pathname: L/LW/LWP/Mozilla-CA-20231213.tar.gz\n    provides:\n      Mozilla::CA 20231213\n    requirements:\n      ExtUtils::MakeMaker 0\n  Net-DNS-1.41\n    pathname: N/NL/NLNETLABS/Net-DNS-1.41.tar.gz\n    provides:\n      Net::DNS 1.41\n      Net::DNS::Domain 1913\n      Net::DNS::DomainName 1898\n      Net::DNS::DomainName1035 1898\n      Net::DNS::DomainName2535 1898\n      Net::DNS::Header 1910\n      Net::DNS::Mailbox 1910\n      Net::DNS::Mailbox1035 1910\n      Net::DNS::Mailbox2535 1910\n      Net::DNS::Nameserver 1949\n      Net::DNS::Packet 1947\n      Net::DNS::Parameters 1945\n      Net::DNS::Question 1895\n      Net::DNS::RR 1910\n      Net::DNS::RR::A 1896\n      Net::DNS::RR::AAAA 1896\n      Net::DNS::RR::AFSDB 1945\n      Net::DNS::RR::AMTRELAY 1896\n      Net::DNS::RR::APL 1896\n      Net::DNS::RR::APL::Item 1896\n      Net::DNS::RR::CAA 1910\n      Net::DNS::RR::CDNSKEY 1909\n      Net::DNS::RR::CDS 1909\n      Net::DNS::RR::CERT 1896\n      Net::DNS::RR::CNAME 1896\n      Net::DNS::RR::CSYNC 1910\n      Net::DNS::RR::DHCID 1896\n      Net::DNS::RR::DNAME 1896\n      Net::DNS::RR::DNSKEY 1910\n      Net::DNS::RR::DS 1909\n      Net::DNS::RR::EUI48 1896\n      Net::DNS::RR::EUI64 1896\n      Net::DNS::RR::GPOS 1910\n      Net::DNS::RR::HINFO 1896\n      Net::DNS::RR::HIP 1896\n      Net::DNS::RR::HTTPS 1945\n      Net::DNS::RR::IPSECKEY 1909\n      Net::DNS::RR::ISDN 1896\n      Net::DNS::RR::KEY 1896\n      Net::DNS::RR::KX 1945\n      Net::DNS::RR::L32 1896\n      Net::DNS::RR::L64 1896\n      Net::DNS::RR::LOC 1896\n      Net::DNS::RR::LP 1896\n      Net::DNS::RR::MB 1910\n      Net::DNS::RR::MG 1910\n      Net::DNS::RR::MINFO 1896\n      Net::DNS::RR::MR 1910\n      Net::DNS::RR::MX 1945\n      Net::DNS::RR::NAPTR 1898\n      Net::DNS::RR::NID 1896\n      Net::DNS::RR::NS 1896\n      Net::DNS::RR::NSEC 1945\n      Net::DNS::RR::NSEC3 1910\n      Net::DNS::RR::NSEC3PARAM 1896\n      Net::DNS::RR::NULL 1896\n      Net::DNS::RR::OPENPGPKEY 1896\n      Net::DNS::RR::OPT 1934\n      Net::DNS::RR::OPT::CHAIN 1934\n      Net::DNS::RR::OPT::CLIENT_SUBNET 1934\n      Net::DNS::RR::OPT::COOKIE 1934\n      Net::DNS::RR::OPT::DAU 1934\n      Net::DNS::RR::OPT::DHU 1934\n      Net::DNS::RR::OPT::EXPIRE 1934\n      Net::DNS::RR::OPT::EXTENDED_ERROR 1934\n      Net::DNS::RR::OPT::KEY_TAG 1934\n      Net::DNS::RR::OPT::N3U 1934\n      Net::DNS::RR::OPT::NSID 1934\n      Net::DNS::RR::OPT::PADDING 1934\n      Net::DNS::RR::OPT::REPORT_CHANNEL 1934\n      Net::DNS::RR::OPT::TCP_KEEPALIVE 1934\n      Net::DNS::RR::PTR 1896\n      Net::DNS::RR::PX 1945\n      Net::DNS::RR::RP 1945\n      Net::DNS::RR::RRSIG 1896\n      Net::DNS::RR::RT 1945\n      Net::DNS::RR::SIG 1908\n      Net::DNS::RR::SMIMEA 1896\n      Net::DNS::RR::SOA 1945\n      Net::DNS::RR::SPF 1896\n      Net::DNS::RR::SRV 1945\n      Net::DNS::RR::SSHFP 1896\n      Net::DNS::RR::SVCB 1945\n      Net::DNS::RR::TKEY 1908\n      Net::DNS::RR::TLSA 1896\n      Net::DNS::RR::TSIG 1909\n      Net::DNS::RR::TXT 1911\n      Net::DNS::RR::URI 1896\n      Net::DNS::RR::X25 1896\n      Net::DNS::RR::ZONEMD 1896\n      Net::DNS::Resolver 1895\n      Net::DNS::Resolver::Base 1947\n      Net::DNS::Resolver::MSWin32 1856\n      Net::DNS::Resolver::Recurse 1930\n      Net::DNS::Resolver::UNIX 1856\n      Net::DNS::Resolver::android 1856\n      Net::DNS::Resolver::cygwin 1856\n      Net::DNS::Resolver::os2 1856\n      Net::DNS::Resolver::os390 1856\n      Net::DNS::Text 1894\n      Net::DNS::Update 1895\n      Net::DNS::ZoneFile 1910\n      Net::DNS::ZoneFile::Generator 1910\n      Net::DNS::ZoneFile::Text 1910\n    requirements:\n      Carp 1.1\n      Digest::HMAC 1.03\n      Digest::MD5 2.13\n      Digest::SHA 5.23\n      Encode 2.26\n      Exporter 5.63\n      ExtUtils::MakeMaker 6.48\n      File::Spec 3.29\n      Getopt::Long 2.43\n      IO::File 1.14\n      IO::Select 1.17\n      IO::Socket 1.3\n      IO::Socket::IP 0.38\n      MIME::Base64 2.13\n      PerlIO 1.05\n      Scalar::Util 1.19\n      Time::Local 1.19\n      perl 5.008009\n  Net-Domain-TLD-1.75\n    pathname: A/AL/ALEXP/Net-Domain-TLD-1.75.tar.gz\n    provides:\n      Net::Domain::TLD 1.75\n    requirements:\n      Carp 0\n      ExtUtils::MakeMaker 0\n      Storable 0\n  Net-HTTP-6.23\n    pathname: O/OA/OALDERS/Net-HTTP-6.23.tar.gz\n    provides:\n      Net::HTTP 6.23\n      Net::HTTP::Methods 6.23\n      Net::HTTP::NB 6.23\n      Net::HTTPS 6.23\n    requirements:\n      Carp 0\n      Compress::Raw::Zlib 0\n      ExtUtils::MakeMaker 0\n      IO::Socket::INET 0\n      IO::Uncompress::Gunzip 0\n      URI 0\n      base 0\n      perl 5.006002\n      strict 0\n      warnings 0\n  Net-OpenStack-Swift-0.15\n    pathname: M/MA/MASAKYST/Net-OpenStack-Swift-0.15.tar.gz\n    provides:\n      Net::OpenStack::Swift 0.15\n      Net::OpenStack::Swift::InnerKeystone::Base undef\n      Net::OpenStack::Swift::InnerKeystone::V1_0 undef\n      Net::OpenStack::Swift::InnerKeystone::V2_0 undef\n      Net::OpenStack::Swift::InnerKeystone::V3_0 undef\n      Net::OpenStack::Swift::Util undef\n    requirements:\n      App::Rad 0\n      Data::Validator 0\n      Furl 0\n      IO::Socket::SSL 0\n      JSON 0\n      Log::Minimal 0\n      Module::Build::Tiny 0.035\n      Mouse 0\n      Parallel::Fork::BossWorkerAsync 0\n      Path::Tiny 0\n      Sys::CPU 0\n      Text::ASCIITable 0\n      URI::Escape 0\n      namespace::clean 0\n      perl 5.010_001\n  Net-SSLeay-1.92\n    pathname: C/CH/CHRISN/Net-SSLeay-1.92.tar.gz\n    provides:\n      Net::SSLeay 1.92\n      Net::SSLeay::Handle 1.92\n    requirements:\n      English 0\n      ExtUtils::MakeMaker 0\n      File::Spec::Functions 0\n      MIME::Base64 0\n      Text::Wrap 0\n      constant 0\n      perl 5.008001\n  NetAddr-IP-4.079\n    pathname: M/MI/MIKER/NetAddr-IP-4.079.tar.gz\n    provides:\n      NetAddr::IP 4.079\n      NetAddr::IP::InetBase 0.08\n      NetAddr::IP::Lite 1.57\n      NetAddr::IP::Util 1.53\n      NetAddr::IP::UtilPP 1.09\n      NetAddr::IP::UtilPolluted 1.53\n      NetAddr::IP::Util_IS 1\n    requirements:\n      ExtUtils::MakeMaker 0\n      Test::More 0\n  Number-Bytes-Human-0.11\n    pathname: F/FE/FERREIRA/Number-Bytes-Human-0.11.tar.gz\n    provides:\n      Number::Bytes::Human 0.11\n    requirements:\n      Carp 0\n      ExtUtils::MakeMaker 0\n      POSIX 0\n      Test::More 0\n  Package-Stash-0.40\n    pathname: E/ET/ETHER/Package-Stash-0.40.tar.gz\n    provides:\n      Package::Stash 0.40\n      Package::Stash::PP 0.40\n    requirements:\n      B 0\n      Carp 0\n      Dist::CheckConflicts 0.02\n      ExtUtils::MakeMaker 0\n      Getopt::Long 0\n      Module::Implementation 0.06\n      Package::Stash::XS 0.26\n      Scalar::Util 0\n      Symbol 0\n      Text::ParseWords 0\n      constant 0\n      perl 5.008001\n      strict 0\n      warnings 0\n  Package-Stash-XS-0.30\n    pathname: E/ET/ETHER/Package-Stash-XS-0.30.tar.gz\n    provides:\n      Package::Stash::XS 0.30\n    requirements:\n      ExtUtils::MakeMaker 0\n      XSLoader 0\n      perl 5.008001\n      strict 0\n      warnings 0\n  Parallel-Fork-BossWorkerAsync-0.09\n    pathname: J/JV/JVANNUCCI/Parallel-Fork-BossWorkerAsync-0.09.tar.gz\n    provides:\n      Parallel::Fork::BossWorkerAsync 0.09\n    requirements:\n      ExtUtils::MakeMaker 0\n  Params-Classify-0.015\n    pathname: Z/ZE/ZEFRAM/Params-Classify-0.015.tar.gz\n    provides:\n      Params::Classify 0.015\n    requirements:\n      Exporter 0\n      Module::Build 0\n      Scalar::Util 1.01\n      Test::More 0\n      parent 0\n      perl 5.006001\n      strict 0\n      warnings 0\n  Path-Tiny-0.144\n    pathname: D/DA/DAGOLDEN/Path-Tiny-0.144.tar.gz\n    provides:\n      Path::Tiny 0.144\n      Path::Tiny::Error 0.144\n    requirements:\n      Carp 0\n      Cwd 0\n      Digest 1.03\n      Digest::SHA 5.45\n      Encode 0\n      Exporter 5.57\n      ExtUtils::MakeMaker 6.17\n      Fcntl 0\n      File::Compare 0\n      File::Copy 0\n      File::Glob 0\n      File::Path 2.07\n      File::Spec 0.86\n      File::Temp 0.19\n      File::stat 0\n      constant 0\n      overload 0\n      perl 5.008001\n      strict 0\n      warnings 0\n      warnings::register 0\n  Role-Tiny-2.002004\n    pathname: H/HA/HAARG/Role-Tiny-2.002004.tar.gz\n    provides:\n      Role::Tiny 2.002004\n      Role::Tiny::With 2.002004\n    requirements:\n      Exporter 5.57\n      perl 5.006\n  SQL-Abstract-2.000001\n    pathname: M/MS/MSTROUT/SQL-Abstract-2.000001.tar.gz\n    provides:\n      Chunkstrumenter undef\n      DBIx::Class::SQLMaker::Role::SQLA2Passthrough undef\n      SQL::Abstract 2.000001\n      SQL::Abstract::Formatter undef\n      SQL::Abstract::Parts undef\n      SQL::Abstract::Plugin::BangOverrides undef\n      SQL::Abstract::Plugin::ExtraClauses undef\n      SQL::Abstract::Reference undef\n      SQL::Abstract::Role::Plugin undef\n      SQL::Abstract::Test undef\n      SQL::Abstract::Tree undef\n    requirements:\n      Exporter 5.57\n      ExtUtils::MakeMaker 0\n      Hash::Merge 0.12\n      List::Util 0\n      MRO::Compat 0.12\n      Moo 2.000001\n      Scalar::Util 0\n      Sub::Quote 2.000001\n      Test::Builder::Module 0.84\n      Test::Deep 0.101\n      Text::Balanced 2.00\n      perl 5.006\n  SQL-Abstract-Pg-1.0\n    pathname: S/SR/SRI/SQL-Abstract-Pg-1.0.tar.gz\n    provides:\n      SQL::Abstract::Pg 1.0\n    requirements:\n      ExtUtils::MakeMaker 0\n      SQL::Abstract 2.0\n      perl 5.016\n  Sub-Exporter-Progressive-0.001013\n    pathname: F/FR/FREW/Sub-Exporter-Progressive-0.001013.tar.gz\n    provides:\n      Sub::Exporter::Progressive 0.001013\n    requirements:\n      ExtUtils::MakeMaker 0\n  Sub-Quote-2.006008\n    pathname: H/HA/HAARG/Sub-Quote-2.006008.tar.gz\n    provides:\n      Sub::Defer 2.006008\n      Sub::Quote 2.006008\n    requirements:\n      ExtUtils::MakeMaker 0\n      Scalar::Util 0\n      perl 5.006\n  Sub-Uplevel-0.2800\n    pathname: D/DA/DAGOLDEN/Sub-Uplevel-0.2800.tar.gz\n    provides:\n      Sub::Uplevel 0.2800\n    requirements:\n      Carp 0\n      ExtUtils::MakeMaker 6.17\n      constant 0\n      perl 5.006\n      strict 0\n      warnings 0\n  Switch-2.17\n    pathname: C/CH/CHORNY/Switch-2.17.tar.gz\n    provides:\n      Switch 2.17\n    requirements:\n      ExtUtils::MakeMaker 0\n      Filter::Util::Call 0\n      Text::Balanced 2\n      if 0\n      perl 5.005\n  Sys-CPU-0.52\n    pathname: M/MK/MKODERER/Sys-CPU-0.52.tar.gz\n    provides:\n      Sys::CPU 0.52\n    requirements:\n      ExtUtils::MakeMaker 0\n  Term-ProgressBar-2.23\n    pathname: M/MA/MANWAR/Term-ProgressBar-2.23.tar.gz\n    provides:\n      Term::ProgressBar 2.23\n      Term::ProgressBar::IO 2.23\n    requirements:\n      Capture::Tiny 0.13\n      Carp 0\n      Class::MethodMaker 1.02\n      ExtUtils::MakeMaker 0\n      Fatal 0\n      File::Temp 0\n      POSIX 0\n      Term::ReadKey 2.14\n      Test::Exception 0.31\n      Test::More 0.80\n      Test::Warnings 0\n      perl 5.006\n  TermReadKey-2.38\n    pathname: J/JS/JSTOWE/TermReadKey-2.38.tar.gz\n    provides:\n      Term::ReadKey 2.38\n    requirements:\n      ExtUtils::MakeMaker 6.58\n  Test-Deep-1.204\n    pathname: R/RJ/RJBS/Test-Deep-1.204.tar.gz\n    provides:\n      Test::Deep 1.204\n      Test::Deep::All 1.204\n      Test::Deep::Any 1.204\n      Test::Deep::Array 1.204\n      Test::Deep::ArrayEach 1.204\n      Test::Deep::ArrayElementsOnly 1.204\n      Test::Deep::ArrayLength 1.204\n      Test::Deep::ArrayLengthOnly 1.204\n      Test::Deep::Blessed 1.204\n      Test::Deep::Boolean 1.204\n      Test::Deep::Cache 1.204\n      Test::Deep::Cache::Simple 1.204\n      Test::Deep::Class 1.204\n      Test::Deep::Cmp 1.204\n      Test::Deep::Code 1.204\n      Test::Deep::Hash 1.204\n      Test::Deep::HashEach 1.204\n      Test::Deep::HashElements 1.204\n      Test::Deep::HashKeys 1.204\n      Test::Deep::HashKeysOnly 1.204\n      Test::Deep::Ignore 1.204\n      Test::Deep::Isa 1.204\n      Test::Deep::ListMethods 1.204\n      Test::Deep::MM 1.204\n      Test::Deep::Methods 1.204\n      Test::Deep::NoTest 1.204\n      Test::Deep::None 1.204\n      Test::Deep::Number 1.204\n      Test::Deep::Obj 1.204\n      Test::Deep::Ref 1.204\n      Test::Deep::RefType 1.204\n      Test::Deep::Regexp 1.204\n      Test::Deep::RegexpMatches 1.204\n      Test::Deep::RegexpOnly 1.204\n      Test::Deep::RegexpRef 1.204\n      Test::Deep::RegexpRefOnly 1.204\n      Test::Deep::RegexpVersion 1.204\n      Test::Deep::ScalarRef 1.204\n      Test::Deep::ScalarRefOnly 1.204\n      Test::Deep::Set 1.204\n      Test::Deep::Shallow 1.204\n      Test::Deep::Stack 1.204\n      Test::Deep::String 1.204\n      Test::Deep::SubHash 1.204\n      Test::Deep::SubHashElements 1.204\n      Test::Deep::SubHashKeys 1.204\n      Test::Deep::SubHashKeysOnly 1.204\n      Test::Deep::SuperHash 1.204\n      Test::Deep::SuperHashElements 1.204\n      Test::Deep::SuperHashKeys 1.204\n      Test::Deep::SuperHashKeysOnly 1.204\n    requirements:\n      ExtUtils::MakeMaker 6.78\n      List::Util 1.09\n      Scalar::Util 1.09\n      Test::Builder 0\n      Test::More 0.96\n      perl 5.012\n  Test-Exception-0.43\n    pathname: E/EX/EXODIST/Test-Exception-0.43.tar.gz\n    provides:\n      Test::Exception 0.43\n    requirements:\n      Carp 0\n      Exporter 0\n      ExtUtils::MakeMaker 0\n      Sub::Uplevel 0.18\n      Test::Builder 0.7\n      Test::Builder::Tester 1.07\n      Test::Harness 2.03\n      base 0\n      perl 5.006001\n      strict 0\n      warnings 0\n  Test-Fatal-0.017\n    pathname: R/RJ/RJBS/Test-Fatal-0.017.tar.gz\n    provides:\n      Test::Fatal 0.017\n    requirements:\n      Carp 0\n      Exporter 5.57\n      ExtUtils::MakeMaker 6.78\n      Test::Builder 0\n      Try::Tiny 0.07\n      strict 0\n      warnings 0\n  Test-Warn-0.37\n    pathname: B/BI/BIGJ/Test-Warn-0.37.tar.gz\n    provides:\n      Test::Warn 0.37\n    requirements:\n      Carp 1.22\n      ExtUtils::MakeMaker 0\n      Sub::Uplevel 0.12\n      Test::Builder 0.13\n      Test::Builder::Tester 1.02\n      perl 5.006\n  Test-Warnings-0.032\n    pathname: E/ET/ETHER/Test-Warnings-0.032.tar.gz\n    provides:\n      Test::Warnings 0.032\n    requirements:\n      Carp 0\n      Exporter 0\n      ExtUtils::MakeMaker 0\n      Test::Builder 0\n      parent 0\n      perl 5.006\n      strict 0\n      warnings 0\n  Text-ASCIITable-0.22\n    pathname: L/LU/LUNATIC/Text-ASCIITable-0.22.tar.gz\n    provides:\n      Text::ASCIITable 0.22\n      Text::ASCIITable::Wrap 0.2\n    requirements:\n      Carp 0\n      Encode 0\n      List::Util 0\n      perl v5.6.0\n  Text-Soundex-3.05\n    pathname: R/RJ/RJBS/Text-Soundex-3.05.tar.gz\n    provides:\n      Text::Soundex 3.05\n    requirements:\n      ExtUtils::MakeMaker 0\n      if 0\n  TimeDate-2.33\n    pathname: A/AT/ATOOMIC/TimeDate-2.33.tar.gz\n    provides:\n      Date::Format 2.24\n      Date::Format::Generic 2.24\n      Date::Language 1.10\n      Date::Language::Afar 0.99\n      Date::Language::Amharic 1.00\n      Date::Language::Austrian 1.01\n      Date::Language::Brazilian 1.01\n      Date::Language::Bulgarian 1.01\n      Date::Language::Chinese 1.00\n      Date::Language::Chinese_GB 1.01\n      Date::Language::Czech 1.01\n      Date::Language::Danish 1.01\n      Date::Language::Dutch 1.02\n      Date::Language::English 1.01\n      Date::Language::Finnish 1.01\n      Date::Language::French 1.04\n      Date::Language::Gedeo 0.99\n      Date::Language::German 1.02\n      Date::Language::Greek 1.00\n      Date::Language::Hungarian 1.01\n      Date::Language::Icelandic 1.01\n      Date::Language::Italian 1.01\n      Date::Language::Norwegian 1.01\n      Date::Language::Occitan 1.04\n      Date::Language::Oromo 0.99\n      Date::Language::Romanian 1.01\n      Date::Language::Russian 1.01\n      Date::Language::Russian_cp1251 1.01\n      Date::Language::Russian_koi8r 1.01\n      Date::Language::Sidama 0.99\n      Date::Language::Somali 0.99\n      Date::Language::Spanish 1.00\n      Date::Language::Swedish 1.01\n      Date::Language::Tigrinya 1.00\n      Date::Language::TigrinyaEritrean 1.00\n      Date::Language::TigrinyaEthiopian 1.00\n      Date::Language::Turkish 1.0\n      Date::Parse 2.33\n      Time::Zone 2.24\n      TimeDate 1.21\n    requirements:\n      ExtUtils::MakeMaker 0\n  Try-Tiny-0.31\n    pathname: E/ET/ETHER/Try-Tiny-0.31.tar.gz\n    provides:\n      Try::Tiny 0.31\n    requirements:\n      Carp 0\n      Exporter 5.57\n      ExtUtils::MakeMaker 0\n      constant 0\n      perl 5.006\n      strict 0\n      warnings 0\n  URI-5.21\n    pathname: O/OA/OALDERS/URI-5.21.tar.gz\n    provides:\n      URI 5.21\n      URI::Escape 5.21\n      URI::Heuristic 5.21\n      URI::IRI 5.21\n      URI::QueryParam 5.21\n      URI::Split 5.21\n      URI::URL 5.21\n      URI::WithBase 5.21\n      URI::data 5.21\n      URI::file 5.21\n      URI::file::Base 5.21\n      URI::file::FAT 5.21\n      URI::file::Mac 5.21\n      URI::file::OS2 5.21\n      URI::file::QNX 5.21\n      URI::file::Unix 5.21\n      URI::file::Win32 5.21\n      URI::ftp 5.21\n      URI::gopher 5.21\n      URI::http 5.21\n      URI::https 5.21\n      URI::icap 5.21\n      URI::icaps 5.21\n      URI::ldap 5.21\n      URI::ldapi 5.21\n      URI::ldaps 5.21\n      URI::mailto 5.21\n      URI::mms 5.21\n      URI::news 5.21\n      URI::nntp 5.21\n      URI::nntps 5.21\n      URI::pop 5.21\n      URI::rlogin 5.21\n      URI::rsync 5.21\n      URI::rtsp 5.21\n      URI::rtspu 5.21\n      URI::sftp 5.21\n      URI::sip 5.21\n      URI::sips 5.21\n      URI::snews 5.21\n      URI::ssh 5.21\n      URI::telnet 5.21\n      URI::tn3270 5.21\n      URI::urn 5.21\n      URI::urn::isbn 5.21\n      URI::urn::oid 5.21\n    requirements:\n      Carp 0\n      Cwd 0\n      Data::Dumper 0\n      Encode 0\n      Exporter 5.57\n      ExtUtils::MakeMaker 0\n      MIME::Base64 2\n      Net::Domain 0\n      Scalar::Util 0\n      constant 0\n      integer 0\n      overload 0\n      parent 0\n      perl 5.008001\n      strict 0\n      utf8 0\n      warnings 0\n  URI-Find-20160806\n    pathname: M/MS/MSCHWERN/URI-Find-20160806.tar.gz\n    provides:\n      URI::Find 20160806\n      URI::Find::Schemeless 20160806\n    requirements:\n      Module::Build 0.30\n      Test::More 0.88\n      URI 1.60\n      perl v5.8.8\n  URI-Nested-0.10\n    pathname: D/DW/DWHEELER/URI-Nested-0.10.tar.gz\n    provides:\n      URI::Nested 0.10\n    requirements:\n      Module::Build 0.30\n      Test::More 0.88\n      URI 1.40\n      perl 5.008001\n  URI-db-0.21\n    pathname: D/DW/DWHEELER/URI-db-0.21.tar.gz\n    provides:\n      URI::cassandra 0.21\n      URI::cockroach 0.21\n      URI::cockroachdb 0.21\n      URI::couch 0.21\n      URI::couchdb 0.21\n      URI::cubrid 0.21\n      URI::db 0.21\n      URI::db2 0.21\n      URI::derby 0.21\n      URI::exasol 0.21\n      URI::firebird 0.21\n      URI::hive 0.21\n      URI::impala 0.21\n      URI::informix 0.21\n      URI::ingres 0.21\n      URI::interbase 0.21\n      URI::ldapdb 0.21\n      URI::maria 0.21\n      URI::mariadb 0.21\n      URI::max 0.21\n      URI::maxdb 0.21\n      URI::monet 0.21\n      URI::monetdb 0.21\n      URI::mongo 0.21\n      URI::mongodb 0.21\n      URI::mssql 0.21\n      URI::mysql 0.21\n      URI::oracle 0.21\n      URI::pg 0.21\n      URI::pgsql 0.21\n      URI::pgxc 0.21\n      URI::postgres 0.21\n      URI::postgresql 0.21\n      URI::postgresxc 0.21\n      URI::redshift 0.21\n      URI::snowflake 0.21\n      URI::sqlite 0.21\n      URI::sqlite3 0.21\n      URI::sqlserver 0.21\n      URI::sybase 0.21\n      URI::teradata 0.21\n      URI::unify 0.21\n      URI::vertica 0.21\n      URI::yugabyte 0.21\n      URI::yugabytedb 0.21\n    requirements:\n      Module::Build 0.30\n      Test::More 0.88\n      URI 1.40\n      URI::Nested 0.10\n      perl 5.008001\n  Variable-Magic-0.63\n    pathname: V/VP/VPIT/Variable-Magic-0.63.tar.gz\n    provides:\n      Variable::Magic 0.63\n    requirements:\n      Carp 0\n      Config 0\n      Exporter 0\n      ExtUtils::MakeMaker 0\n      IO::Handle 0\n      IO::Select 0\n      IPC::Open3 0\n      POSIX 0\n      Socket 0\n      Test::More 0\n      XSLoader 0\n      base 0\n      lib 0\n      perl 5.008\n  WWW-RobotRules-6.02\n    pathname: G/GA/GAAS/WWW-RobotRules-6.02.tar.gz\n    provides:\n      WWW::RobotRules 6.02\n      WWW::RobotRules::AnyDBM_File 6.00\n      WWW::RobotRules::InCore 6.02\n    requirements:\n      AnyDBM_File 0\n      ExtUtils::MakeMaker 0\n      Fcntl 0\n      URI 1.10\n      perl 5.008001\n  YAML-Tiny-1.74\n    pathname: E/ET/ETHER/YAML-Tiny-1.74.tar.gz\n    provides:\n      YAML::Tiny 1.74\n    requirements:\n      B 0\n      Carp 0\n      Exporter 0\n      ExtUtils::MakeMaker 0\n      Fcntl 0\n      Scalar::Util 0\n      perl 5.008001\n      strict 0\n      warnings 0\n  common-sense-3.75\n    pathname: M/ML/MLEHMANN/common-sense-3.75.tar.gz\n    provides:\n      common::sense 3.75\n    requirements:\n      ExtUtils::MakeMaker 0\n  libwww-perl-6.72\n    pathname: O/OA/OALDERS/libwww-perl-6.72.tar.gz\n    provides:\n      LWP 6.72\n      LWP::Authen::Basic 6.72\n      LWP::Authen::Digest 6.72\n      LWP::Authen::Ntlm 6.72\n      LWP::ConnCache 6.72\n      LWP::Debug 6.72\n      LWP::Debug::TraceHTTP 6.72\n      LWP::DebugFile 6.72\n      LWP::MemberMixin 6.72\n      LWP::Protocol 6.72\n      LWP::Protocol::cpan 6.72\n      LWP::Protocol::data 6.72\n      LWP::Protocol::file 6.72\n      LWP::Protocol::ftp 6.72\n      LWP::Protocol::gopher 6.72\n      LWP::Protocol::http 6.72\n      LWP::Protocol::loopback 6.72\n      LWP::Protocol::mailto 6.72\n      LWP::Protocol::nntp 6.72\n      LWP::Protocol::nogo 6.72\n      LWP::RobotUA 6.72\n      LWP::Simple 6.72\n      LWP::UserAgent 6.72\n    requirements:\n      Digest::MD5 0\n      Encode 2.12\n      Encode::Locale 0\n      ExtUtils::MakeMaker 0\n      File::Copy 0\n      File::Listing 6\n      File::Temp 0\n      Getopt::Long 0\n      HTML::Entities 0\n      HTML::HeadParser 3.71\n      HTTP::CookieJar::LWP 0\n      HTTP::Cookies 6\n      HTTP::Date 6\n      HTTP::Negotiate 6\n      HTTP::Request 6.18\n      HTTP::Request::Common 6.18\n      HTTP::Response 6.18\n      HTTP::Status 6.18\n      IO::Select 0\n      IO::Socket 0\n      LWP::MediaTypes 6\n      MIME::Base64 2.1\n      Module::Load 0\n      Net::FTP 2.58\n      Net::HTTP 6.18\n      Scalar::Util 0\n      Try::Tiny 0\n      URI 1.10\n      URI::Escape 0\n      WWW::RobotRules 6\n      parent 0.217\n      perl 5.008001\n      strict 0\n      warnings 0\n  namespace-clean-0.27\n    pathname: R/RI/RIBASUSHI/namespace-clean-0.27.tar.gz\n    provides:\n      namespace::clean 0.27\n    requirements:\n      B::Hooks::EndOfScope 0.12\n      ExtUtils::MakeMaker 0\n      Package::Stash 0.23\n      perl 5.008001\n  perl-ldap-0.68\n    pathname: M/MA/MARSCHAP/perl-ldap-0.68.tar.gz\n    provides:\n      Bundle::Net::LDAP 0.03\n      LWP::Protocol::ldap 1.25\n      LWP::Protocol::ldapi undef\n      LWP::Protocol::ldaps undef\n      Net::LDAP 0.68\n      Net::LDAP::ASN 0.13\n      Net::LDAP::Bind 1.05\n      Net::LDAP::Constant 0.24\n      Net::LDAP::Control 0.20\n      Net::LDAP::Control::Assertion 0.02\n      Net::LDAP::Control::DontUseCopy 0.02\n      Net::LDAP::Control::EntryChange 0.02\n      Net::LDAP::Control::ManageDsaIT 0.04\n      Net::LDAP::Control::MatchedValues 0.02\n      Net::LDAP::Control::NoOp 0.01\n      Net::LDAP::Control::Paged 0.05\n      Net::LDAP::Control::PasswordPolicy 0.04\n      Net::LDAP::Control::PersistentSearch 0.04\n      Net::LDAP::Control::PostRead 0.03\n      Net::LDAP::Control::PreRead 0.04\n      Net::LDAP::Control::ProxyAuth 1.09\n      Net::LDAP::Control::Relax 0.03\n      Net::LDAP::Control::Sort 0.04\n      Net::LDAP::Control::SortResult 0.03\n      Net::LDAP::Control::Subentries 0.01\n      Net::LDAP::Control::SyncDone 0.03\n      Net::LDAP::Control::SyncRequest 0.03\n      Net::LDAP::Control::SyncState 0.04\n      Net::LDAP::Control::TreeDelete 0.01\n      Net::LDAP::Control::VLV 0.07\n      Net::LDAP::Control::VLVResponse 0.04\n      Net::LDAP::DSML 0.17\n      Net::LDAP::DSML::output 0.17\n      Net::LDAP::DSML::pp 0.17\n      Net::LDAP::Entry 0.29\n      Net::LDAP::Extension 1.04\n      Net::LDAP::Extension::Cancel 0.02\n      Net::LDAP::Extension::Refresh 0.04\n      Net::LDAP::Extension::SetPassword 0.06\n      Net::LDAP::Extension::WhoAmI 0.02\n      Net::LDAP::Extra 0.02\n      Net::LDAP::Extra::AD 0.05\n      Net::LDAP::Extra::eDirectory 0.03\n      Net::LDAP::Filter 0.20\n      Net::LDAP::FilterList 0.02\n      Net::LDAP::FilterMatch 0.27\n      Net::LDAP::Intermediate 0.04\n      Net::LDAP::Intermediate::SyncInfo 0.03\n      Net::LDAP::LDIF 0.27\n      Net::LDAP::Message 1.12\n      Net::LDAP::Message::Dummy 1.12\n      Net::LDAP::Reference 0.14\n      Net::LDAP::RootDSE 0.02\n      Net::LDAP::Schema 0.9908\n      Net::LDAP::Search 0.14\n      Net::LDAP::Util 0.20\n      Net::LDAPI 0.04\n      Net::LDAPS 0.06\n    requirements:\n      Authen::SASL 2.00\n      Convert::ASN1 0.2\n      Digest::MD5 0\n      ExtUtils::MakeMaker 6.59\n      File::Basename 0\n      File::Compare 0\n      File::Path 0\n      HTTP::Negotiate 0\n      HTTP::Response 0\n      HTTP::Status 0\n      IO::File 0\n      IO::Socket::SSL 1.26\n      JSON 0\n      LWP 0\n      LWP::MediaTypes 0\n      LWP::Protocol 0\n      MIME::Base64 0\n      Test::More 0\n      Text::Soundex 0\n      Time::Local 0\n      URI::ldap 1.1\n      perl 5.008001\n"
  },
  {
    "path": "lib/Date/Language/Occitan.pm",
    "content": "##\n## Occitan tables, contributed by Quentn PAGÈS\n##\n\npackage Date::Language::Occitan;\n\nuse Date::Language ();\nuse vars qw(@ISA @DoW @DoWs @MoY @MoYs @AMPM @Dsuf %MoY %DoW $VERSION);\n@ISA = qw(Date::Language);\n$VERSION = \"1.04\";\n\n@DoW = qw(dimenge diluns dimars dimècres dijòus divendres dissabte);\n@MoY = qw(genièr febrièr març abrial mai junh\n          julhet agost octòbre novembre decembre);\n@DoWs = map { substr($_,0,3) } @DoW;\n@MoYs = map { substr($_,0,3) } @MoY;\n$MoYs[6] = 'jul';\n@AMPM = qw(AM PM);\n\n@Dsuf = ((qw(er e e e e e e e e e)) x 3, 'er');\n\n@MoY{@MoY}  = (0 .. scalar(@MoY));\n@MoY{@MoYs} = (0 .. scalar(@MoYs));\n@DoW{@DoW}  = (0 .. scalar(@DoW));\n@DoW{@DoWs} = (0 .. scalar(@DoWs));\n\n# Formatting routines\n\nsub format_a { $DoWs[$_[0]->[6]] }\nsub format_A { $DoW[$_[0]->[6]] }\nsub format_b { $MoYs[$_[0]->[4]] }\nsub format_B { $MoY[$_[0]->[4]] }\nsub format_h { $MoYs[$_[0]->[4]] }\nsub format_p { $_[0]->[2] >= 12 ?  $AMPM[1] : $AMPM[0] }\n\n1;\n"
  },
  {
    "path": "lib/Lufi/Command/copyFilesToSwift.pm",
    "content": "package Lufi::Command::copyFilesToSwift;\nuse Mojo::Base 'Mojolicious::Command';\nuse File::Spec;\nuse Term::ProgressBar;\n\nhas description => 'Copy files from filesystem to Swift object storage';\nhas usage       => sub { shift->extract_usage };\n\nsub run {\n    my $c = shift;\n\n    if ($c->app->config('swift')) {\n        $c->app->check_swift_container();\n        my @dirs = glob(File::Spec->catdir($c->app->config('upload_dir'), '*'));\n\n        unless (scalar(@dirs)) {\n            say sprintf('The configured upload_dir (%s) seems to be empty. Is `upload_dir` configured in lufi.conf?', $c->app->config('upload_dir'));\n            exit 1;\n        }\n        say sprintf('%d folders to upload to Swift (can\\'t say how many files, or the total size, sorry). This can take some time.', scalar(@dirs));\n        print 'Do you want to continue? [Y/n] ';\n        my $confirm = <STDIN>;\n\n        if ($confirm =~ m/yes|y/i) {\n            my $progress = Term::ProgressBar->new({ count => scalar(@dirs), ETA => 'linear', name => 'Copying to Swift'});\n            for my $dir (@dirs) {\n                my @files = glob(File::Spec->catfile($dir, '*'));\n                for my $file (@files) {\n                    my ($volume, $directories, $filename) = File::Spec->splitpath($file);\n                    my @file_dirs = File::Spec->splitdir($directories);\n                    my $short     = ($file_dirs[-1] ne '') ? $file_dirs[-1] : $file_dirs[-2];\n                    my $path      = File::Spec->catfile($short, $filename);\n\n                    open my $fh, '<', $file or die sprintf('Unable to open file %s: %s', $file, $!);\n\n                    $c->app->swift->put_object(\n                        container_name => $c->app->config('swift')->{container},\n                        object_name    => $path,\n                        content_length => -s $file,\n                        content        => $fh\n                    );\n                    close $fh;\n                }\n                $progress->update();\n            }\n            say sprintf('The copy to Swift object storage has ended. You can test Lufi, then delete `%s` directory', $c->app->config('upload_dir'));\n        } else {\n            say 'You want to stop. No problem.';\n        }\n    } else {\n        say 'You didn\\'t configure `swift` in your config file. Exiting.';\n        exit 1;\n    }\n}\n\n=encoding utf8\n\n=head1 NAME\n\nLufi::Command::copyFilesToSwift Copy files from filesystem to Swift object storage\n\n=head1 SYNOPSIS\n\n  Usage: script/lufi copyFilesToSwift\n\n  This command needs you to:\n    - set `upload_dir` in your config file (otherwise, it will use the default path, `files` to copy files from)\n    - configure `swift` with correct informations in your config file\n\n=cut\n\n1;\n"
  },
  {
    "path": "lib/Lufi/Command/cron/cleanbdd.pm",
    "content": "# vim:set sw=4 ts=4 sts=4 ft=perl expandtab:\npackage Lufi::Command::cron::cleanbdd;\nuse Mojo::Base 'Mojolicious::Command';\nuse Lufi::DB::File;\nuse FindBin qw($Bin);\nuse Lufi::DefaultConfig qw($default_config);\n\nhas description => 'Delete IP addresses from database after configured delay.';\nhas usage => sub { shift->extract_usage };\n\nsub run {\n    my $c = shift;\n\n    my $cfile = Mojo::File->new($Bin, '..' , 'lufi.conf');\n    if (defined $ENV{MOJO_CONFIG}) {\n        $cfile = Mojo::File->new($ENV{MOJO_CONFIG});\n        unless (-e $cfile->to_abs) {\n            $cfile = Mojo::File->new($Bin, '..', $ENV{MOJO_CONFIG});\n        }\n    }\n    my $config = $c->app->plugin('Config', {\n        file    => $cfile,\n        default => $default_config\n    });\n\n    my $separation = time() - $config->{keep_ip_during} * 86400;\n\n    Lufi::DB::File->new(app => $c->app)->delete_creator_before($separation);\n}\n\n=encoding utf8\n\n=head1 NAME\n\nLufi::Command::cron::cleanbdd - Delete IP addresses from database after configured delay\n\n=head1 SYNOPSIS\n\n  Usage: script/lufi cron cleanbdd\n\n=cut\n\n1;\n"
  },
  {
    "path": "lib/Lufi/Command/cron/cleanfiles.pm",
    "content": "# vim:set sw=4 ts=4 sts=4 ft=perl expandtab:\npackage Lufi::Command::cron::cleanfiles;\nuse Mojo::Base 'Mojolicious::Command';\nuse Lufi::DB::File;\nuse FindBin qw($Bin);\nuse Lufi::DefaultConfig qw($default_config);\n\nhas description => 'Delete expired files.';\nhas usage => sub { shift->extract_usage };\n\nsub run {\n    my $c = shift;\n\n    my $cfile = Mojo::File->new($Bin, '..' , 'lufi.conf');\n    if (defined $ENV{MOJO_CONFIG}) {\n        $cfile = Mojo::File->new($ENV{MOJO_CONFIG});\n        unless (-e $cfile->to_abs) {\n            $cfile = Mojo::File->new($Bin, '..', $ENV{MOJO_CONFIG});\n        }\n    }\n    my $config = $c->app->plugin('Config', {\n        file    => $cfile,\n        default => $default_config\n    });\n\n    my $time = time();\n\n    my $ldfile = Lufi::DB::File->new(app => $c->app);\n    $ldfile->get_expired($time)->each(\n        sub {\n            my ($f, $num) = @_;\n            $f->delete;\n        }\n    );\n\n    if (defined($config->{delete_no_longer_viewed_files}) && $config->{delete_no_longer_viewed_files} > 0) {\n        $time = time() - $config->{delete_no_longer_viewed_files} * 86400;\n        my $ldfile = Lufi::DB::File->new(app => $c->app);\n        $ldfile->get_no_longer_viewed($time)->each(\n            sub {\n                my ($f, $num) = @_;\n                $f->delete;\n            }\n        );\n    }\n}\n\n=encoding utf8\n\n=head1 NAME\n\nLufi::Command::cron::cleanfiles - Delete expired files\n\n=head1 SYNOPSIS\n\n  Usage: script/lufi cron cleanfiles\n\n=cut\n\n1;\n"
  },
  {
    "path": "lib/Lufi/Command/cron/watch.pm",
    "content": "package Lufi::Command::cron::watch;\nuse Mojo::Base 'Mojolicious::Command';\nuse Filesys::DiskUsage qw/du/;\nuse Lufi::DB::File;\nuse Switch;\nuse FindBin qw($Bin);\nuse Lufi::DefaultConfig qw($default_config);\n\nhas description => 'Watch the files directory and take action when over quota';\nhas usage => sub { shift->extract_usage };\n\nsub run {\n    my $c = shift;\n\n    my $cfile = Mojo::File->new($Bin, '..' , 'lufi.conf');\n    if (defined $ENV{MOJO_CONFIG}) {\n        $cfile = Mojo::File->new($ENV{MOJO_CONFIG});\n        unless (-e $cfile->to_abs) {\n            $cfile = Mojo::File->new($Bin, '..', $ENV{MOJO_CONFIG});\n        }\n    }\n    my $config = $c->app->plugin('Config', {\n        file    => $cfile,\n        default => $default_config\n    });\n\n    if (defined($config->{max_total_size})) {\n        my $total = du(($c->app->config('upload_dir')));\n\n        if ($total > $config->{max_total_size}) {\n            say \"[Lufi cron job watch] Files directory is over quota ($total > \".$config->{max_total_size}.\")\";\n            switch ($config->{policy_when_full}) {\n                case 'warn' {\n                    say \"[Lufi cron job watch] Please, delete some files or increase quota (\".$config->{max_total_size}.\")\";\n                }\n                case 'stop-upload' {\n                    open (my $fh, '>', 'stop-upload') or die (\"Couldn't open stop-upload: $!\");\n                    close($fh);\n                    say '[Lufi cron job watch] Uploads are stopped. Delete some images and the stop-upload file to reallow uploads.';\n                }\n                case 'delete' {\n                    say '[Lufi cron job watch] Older files are being deleted';\n                    my $ldfile = Lufi::DB::File->new(app => $c->app);\n                    do {\n                        $ldfile->get_oldest_undeleted_files(50)->each(\n                            sub {\n                                my ($f, $num) = @_;\n                                $f->delete;\n                            }\n                        );\n                    } while (du(qw/files/) > $config->{max_total_size});\n                }\n                else {\n                    say '[Lufi cron job watch] Unrecognized policy_when_full option: '.$config->{policy_when_full}.'. Aborting.';\n                }\n            }\n        } else {\n            unlink 'stop-upload' if (-f 'stop-upload');\n        }\n    } else {\n        say \"[Lufi cron job watch] No max_total_size found in the configuration file. Aborting.\";\n    }\n}\n\n=encoding utf8\n\n=head1 NAME\n\nLufi::Command::cron::watch - Watch the files directory and take action when over quota\n\n=head1 SYNOPSIS\n\n  Usage: script/lufi cron watch\n\n=cut\n\n1;\n"
  },
  {
    "path": "lib/Lufi/Command/cron.pm",
    "content": "# vim:set sw=4 ts=4 sts=4 ft=perl expandtab:\npackage Lufi::Command::cron;\nuse Mojo::Base 'Mojolicious::Commands';\n\nhas description => 'Execute tasks.';\nhas hint        => <<EOF;\n\nSee 'script/lufi cron help TASK' for more information on a specific task.\nEOF\nhas message    => sub { shift->extract_usage . \"\\nCron tasks:\\n\" };\nhas namespaces => sub { ['Lufi::Command::cron'] };\n\nsub help { shift->run(@_) }\n\n1;\n\n=encoding utf8\n\n=head1 NAME\n\nLufi::Command::cron - Cron commands\n\n=head1 SYNOPSIS\n\n  Usage: script/lufi cron TASK [OPTIONS]\n\n=cut\n"
  },
  {
    "path": "lib/Lufi/Command/sqliteToOtherDB.pm",
    "content": "package Lufi::Command::sqliteToOtherDB;\nuse Mojo::Base 'Mojolicious::Command';\nuse Lufi::DB::File;\nuse Lufi::DB::Slice;\nuse Lufi::DB::Invitation;\nuse Mojo::SQLite;\nuse FindBin qw($Bin);\nuse Term::ProgressBar;\nuse Lufi::DefaultConfig qw($default_config);\n\nhas description => 'Migrate the records from a SQLite db to the currently configured database';\nhas usage       => sub { shift->extract_usage };\n\nsub run {\n    my $c = shift;\n\n    my $cfile = Mojo::File->new($Bin, '..' , 'lufi.conf');\n    if (defined $ENV{MOJO_CONFIG}) {\n        $cfile = Mojo::File->new($ENV{MOJO_CONFIG});\n        unless (-e $cfile->to_abs) {\n            $cfile = Mojo::File->new($Bin, '..', $ENV{MOJO_CONFIG});\n        }\n    }\n    my $config = $c->app->plugin('Config', {\n        file    => $cfile,\n        default => $default_config\n    });\n\n    if ($config->{dbtype} eq 'sqlite') {\n        say 'Please configure `dbtype` to something else than `sqlite` to use this command.';\n        print $c->usage;\n        exit 1;\n    }\n\n    my $sqlite      = Mojo::SQLite->new('sqlite:'.$config->{db_path});\n    my $files       = $sqlite->db->select('files', undef)->hashes;\n    my $slices      = $sqlite->db->select('slices', undef)->hashes;\n    my $invitations = $sqlite->db->select('invitations', undef)->hashes;\n\n    my $progress = Term::ProgressBar->new({count => $files->size + $slices->size + $invitations->size});\n\n    $files->each(sub {\n        my ($file, $num) = @_;\n\n        $progress->update();\n\n        Lufi::DB::File->new(app => $c->app)\n                      ->short($file->{short})\n                      ->deleted($file->{deleted})\n                      ->mediatype($file->{mediatype})\n                      ->filename($file->{filename})\n                      ->filesize($file->{filesize})\n                      ->counter($file->{counter})\n                      ->delete_at_first_view($file->{delete_at_first_view})\n                      ->delete_at_day($file->{delete_at_day})\n                      ->created_at($file->{created_at})\n                      ->created_by($file->{created_by})\n                      ->last_access_at($file->{last_access_at})\n                      ->mod_token($file->{mod_token})\n                      ->nbslices($file->{nbslices})\n                      ->complete($file->{complete})\n                      ->passwd($file->{passwd})\n                      ->abuse($file->{abuse})\n                      ->write();\n    });\n    $slices->each(sub {\n        my ($slice, $num) = @_;\n\n        Lufi::DB::Slice->new(app => $c->app)\n                      ->short($slice->{short})\n                      ->j($slice->{j})\n                      ->write();\n\n        $progress->update();\n    });\n    $invitations->each(sub {\n        my ($invitation, $num) = @_;\n\n        Lufi::DB::Invitation->new(app => $c->app)\n                            ->token($invitation->{token})\n                            ->ldap_user($invitation->{ldap_user})\n                            ->ldap_user_mail($invitation->{ldap_user_mail})\n                            ->guest_mail($invitation->{guest_mail})\n                            ->created_at($invitation->{created_at})\n                            ->expire_at($invitation->{expire_at})\n                            ->files_sent_at($invitation->{files_sent_at})\n                            ->expend_expire_at($invitation->{expend_expire_at})\n                            ->files($invitation->{files})\n                            ->show_in_list($invitation->{show_in_list})\n                            ->deleted($invitation->{deleted})\n                            ->write();\n        $progress->update();\n    });\n}\n\n=encoding utf8\n\n=head1 NAME\n\nLufi::Command::sqliteToOtherDB Migrate the records from a SQLite db to the currently configured database\n\n=head1 SYNOPSIS\n\n  Usage: script/lufi sqliteToOtherDB\n\n  This command needs you to:\n    - set `db_path` in your config file (otherwise, it will use the default path, `lufi.db` to migrate data from)\n    - set `dbtype` to an other database type in your config file\n    - configure the other database access in your config file\n\n=cut\n\n1;\n"
  },
  {
    "path": "lib/Lufi/Command/theme.pm",
    "content": "# vim:set sw=4 ts=4 sts=4 ft=perl expandtab:\npackage Lufi::Command::theme;\nuse Mojo::Base 'Mojolicious::Commands';\nuse FindBin qw($Bin);\nuse File::Spec qw(catfile catdir);\nuse File::Path qw(make_path);\n\nhas description => 'Create new theme skeleton.';\nhas usage => sub { shift->extract_usage };\nhas message    => sub { shift->extract_usage . \"\\nCreate new theme skeleton:\\n\" };\nhas namespaces => sub { ['Lufi::Command::theme'] };\n\nsub run {\n    my $c    = shift;\n    my $name = shift;\n\n    unless (defined $name) {\n        say $c->extract_usage;\n        exit 1;\n    }\n\n    my $home = File::Spec->catdir($Bin, '..', 'themes', $name);\n\n    unless (-d $home) {\n\n        # Create skeleton\n        mkdir $home;\n        mkdir File::Spec->catdir($home, 'public');\n        make_path(File::Spec->catdir($home, 'templates', 'layouts'));\n        make_path(File::Spec->catdir($home, 'lib', 'Lufi', 'I18N'));\n\n        my $i18n = <<EOF;\n# vim:set sw=4 ts=4 sts=4 ft=perl expandtab:\npackage Lufi::I18N;\n\nuse base 'Locale::Maketext';\nuse File::Basename qw/dirname/;\nuse Locale::Maketext::Lexicon {\n    _auto => 1,\n    _decode => 1,\n    _style  => 'gettext',\n    '*' => [\n        Gettext => dirname(__FILE__) . '/I18N/*.po',\n        Gettext => dirname(__FILE__) . '/../../../default/lib/Lufi/I18N/*.po',\n    ]\n};\n\n1;\nEOF\n\n        open my $f, '>', File::Spec->catfile($home, 'lib', 'Lufi', 'I18N.pm') or die \"Unable to open $home/lib/Lufi/I18N.pm: $!\";\n        print $f $i18n;\n        close $f;\n\n        my $makefile = <<EOF;\nEN=lib/Lufi/I18N/en.po\nFR=lib/Lufi/I18N/fr.po\nIT=lib/Lufi/I18N/it.po\nOC=lib/Lufi/I18N/oc.po\nSEDOPTS=-e \"s\\@SOME DESCRIPTIVE TITLE\\@Lufi language file\\@\" \\\\\n\t\t-e \"s\\@YEAR THE PACKAGE'S COPYRIGHT HOLDER\\@2015 Luc Didry\\@\" \\\\\n\t\t-e \"s\\@CHARSET\\@utf8\\@\" \\\\\n\t\t-e \"s\\@the PACKAGE package\\@the Lufi package\\@\" \\\\\n\t\t-e '/^\\\\#\\\\. (/{N;/\\\\n\\\\#\\\\. (/{N;/\\\\n.*\\\\.\\\\.\\\\/default\\\\//{s/\\\\#\\\\..*\\\\n.*\\\\#\\\\./\\\\#. (/g}}}' \\\\\n\t\t-e '/^\\\\#\\\\. (/{N;/\\\\n.*\\\\.\\\\.\\\\/default\\\\//{s/\\\\n/ /}}'\nSEDOPTS2=-e '/^\\\\#.*\\\\.\\\\.\\\\/default\\\\//,+3d'\nXGETTEXT=carton exec ../../local/bin/xgettext.pl\nCARTON=carton exec\n\nlocales:\n\t\t\\$(XGETTEXT) -D templates -D ../default/templates -o \\$(EN) 2>/dev/null\n\t\t\\$(XGETTEXT) -D templates -D ../default/templates -o \\$(FR) 2>/dev/null\n\t\t\\$(XGETTEXT) -D templates -D ../default/templates -o \\$(IT) 2>/dev/null\n\t\t\\$(XGETTEXT) -D templates -D ../default/templates -o \\$(OC) 2>/dev/null\n\t\tsed \\$(SEDOPTS) -i \\$(EN)\n\t\tsed \\$(SEDOPTS2) -i \\$(EN)\n\t\tsed \\$(SEDOPTS) -i \\$(FR)\n\t\tsed \\$(SEDOPTS2) -i \\$(FR)\n\t\tsed \\$(SEDOPTS) -i \\$(IT)\n\t\tsed \\$(SEDOPTS2) -i \\$(IT)\n\t\tsed \\$(SEDOPTS) -i \\$(OC)\n\t\tsed \\$(SEDOPTS2) -i \\$(OC)\nEOF\n\n        open $f, '>', File::Spec->catfile($home, 'Makefile') or die \"Unable to open $home/Makefile: $!\";\n        print $f $makefile;\n        close $f;\n    } else {\n        say \"$name theme already exists. Aborting.\";\n        exit 1;\n    }\n}\n\n=encoding utf8\n\n=head1 NAME\n\nLufi::Command::theme - Create new theme skeleton.\n\n=head1 SYNOPSIS\n\n  Usage: script/lufi theme THEME_NAME\n\n  Your new theme will be available in the themes directory.\n=cut\n\n1;\n"
  },
  {
    "path": "lib/Lufi/Controller/Auth.pm",
    "content": "# vim:set sw=4 ts=4 sts=4 ft=perl expandtab:\npackage Lufi::Controller::Auth;\nuse Mojo::Base 'Mojolicious::Controller';\n\nsub login_page {\n    my $c = shift;\n    my $redirect = $c->param('redirect') // '/';\n\n    if ($c->is_user_authenticated) {\n        $c->redirect_to('/');\n    } else {\n        if ($c->config('auth_headers')) {\n            if($c->authenticate('dummy', 'dummy')) {\n                if ($redirect eq 'invite') {\n                    return $c->redirect_to('invite');\n                } elsif ($redirect eq 'my_invitations') {\n                    return $c->redirect_to('invite_list');\n                }\n                return $c->redirect_to('/');\n            }\n        } else {\n            $c->render(\n                template => 'login',\n                redirect => $redirect\n            );\n        }\n    }\n}\n\nsub login {\n    my $c = shift;\n\n    my $login    = $c->param('login');\n    my $pwd      = $c->param('password');\n    my $redirect = $c->param('redirect') // '/';\n\n    if ($c->validation->csrf_protect->has_error('csrf_token')) {\n        $c->stash(msg => $c->l('Bad CSRF token.'));\n        $c->render(template => 'login');\n    } else {\n        if($c->authenticate($login, $pwd)) {\n            if ($redirect eq 'invite') {\n                return $c->redirect_to('invite');\n            } elsif ($redirect eq 'my_invitations') {\n                return $c->redirect_to('invite_list');\n            }\n            return $c->redirect_to('/');\n        } else {\n            $c->stash(msg => $c->l('Please, check your credentials or your right to access this service: unable to authenticate.'));\n            $c->render(template => 'login');\n        }\n    }\n}\n\nsub log_out {\n    my $c = shift;\n\n    if ($c->is_user_authenticated) {\n        if ($c->validation->csrf_protect->has_error('csrf_token')) {\n            $c->stash(msg => $c->l('Bad CSRF token.'));\n        } else {\n            $c->logout;\n        }\n    }\n\n    if ($c->config('logout_custom')) {\n        return $c->redirect_to($c->config('logout_custom'));\n    } else {\n        $c->render(template => 'logout');\n    }\n}\n\n1;\n"
  },
  {
    "path": "lib/Lufi/Controller/Files.pm",
    "content": "# vim:set sw=4 ts=4 sts=4 ft=perl expandtab:\npackage Lufi::Controller::Files;\nuse Mojo::Base 'Mojolicious::Controller';\nuse Mojo::JSON qw(encode_json decode_json to_json true false);\nuse Mojo::Util qw(encode decode);\nuse Mojo::File;\nuse Lufi::DB::File;\nuse Lufi::DB::Slice;\nuse File::Spec::Functions;\nuse Number::Bytes::Human qw(format_bytes);\nuse Filesys::DfPortable;\nuse Crypt::SaltedHash;\n\nsub files {\n    my $c = shift;\n\n    if ((!defined($c->config('ldap')) && !defined($c->config('htpasswd'))) || $c->is_user_authenticated) {\n        $c->render(template => 'files');\n    } else {\n        $c->redirect_to('login');\n    }\n}\n\nsub upload {\n    my $c = shift;\n\n    my $invitation;\n    my $token = $c->session->{guest_token};\n    $invitation = Lufi::DB::Invitation->new(app => $c->app)->from_token($token) if $token;\n    if ((!defined($c->config('ldap')) && !defined($c->config('htpasswd')) && !defined($c->config('auth_headers'))) || $c->is_user_authenticated || $invitation) {\n        $c->inactivity_timeout(30000000);\n\n        $c->app->log->debug('Client connected');\n\n        $c->on(\n            message => sub {\n                my ($ws, $text) = @_;\n\n                my $invit = Lufi::DB::Invitation->new(app => $c->app)->from_token($token) if $token;\n\n                my $begin = time;\n\n                my ($json) = split('XXMOJOXX', $text, 2);\n                $json = encode 'UTF-8', $json;\n                $text =~ s/^.*?XXMOJOXX/${json}XXMOJOXX/;\n                $json = decode_json $json;\n\n                $c->app->log->debug('Got message');\n\n                if (defined($json->{cancel}) && $json->{cancel}) {\n                    my $f = Lufi::DB::File->new(app => $c->app)->from_short($json->{id});\n                    if ($f && $f->mod_token && $f->mod_token eq $json->{mod_token}) {\n                        $f = $f->delete();\n                        return $ws->send(to_json(\n                            {\n                                action  => 'cancel',\n                                success => $f->deleted ? true : false,\n                                msg     => $f->deleted ? 'Lufi::DB::File->delete() was successfull' : 'Lufi::DB::File->delete() failed',\n                                i       => $json->{i}\n                            }\n                        ));\n                    } else {\n                        return $ws->send(to_json(\n                            {\n                                action  => 'cancel',\n                                success => false,\n                                msg     => 'Lufi::DB::File not found or invalid mod_token',\n                                i       => $json->{i}\n                            }\n                        ));\n                    }\n                }\n\n                my $stop = 0;\n\n                # Check if stop_upload file is present\n                if ($c->stop_upload) {\n                    $stop = 1;\n                    return $ws->send(decode('UTF-8', encode_json(\n                        {\n                            success    => false,\n                            msg        => $c->l('Sorry, uploading is disabled.'),\n                            sent_delay => $json->{delay},\n                            i          => $json->{i}\n                        }\n                    )));\n                }\n                # Check against max_size\n                if (defined $c->config('max_file_size')) {\n                    if ($json->{size} > $c->config('max_file_size')) {\n                        $stop = 1;\n                        return $ws->send(decode('UTF-8', encode_json(\n                            {\n                                success    => false,\n                                msg        => $c->l('Your file is too big: %1 (maximum size allowed: %2)', format_bytes($json->{size}), format_bytes($c->config('max_file_size'))),\n                                sent_delay => $json->{delay},\n                                i          => $json->{i}\n                            }\n                        )));\n                    }\n                }\n                # Check that we have enough space (multiplying by 2 since it's encrypted, it takes more place that the original file)\n                # Only check if using filesystem, not Swift storage\n                if (!defined($c->config('swift')) && $json->{part} == 0 && ($json->{size} * 2) >= dfportable($c->config('upload_dir'))->{bavail}) {\n                    $stop = 1;\n                    return $ws->send(decode('UTF-8', encode_json(\n                        {\n                            success    => false,\n                            msg        => $c->l('No enough space available on the server for this file (size: %1).', format_bytes($json->{size})),\n                            sent_delay => $json->{delay},\n                            i          => $json->{i}\n                        }\n                    )));\n                }\n                # Check that the invitation is still valid, but only if it's the first chunk\n                # (i.e. a new file, we don't want to stop a current uploading)\n                if ($json->{part} == 0 && $invit && !$invit->is_valid()) {\n                    $stop = 1;\n                    $c->app->log->info(sprintf('Someone (%s) tried to use an expired or deleted invitation.', $invit->guest_mail));\n                    $ws->send(decode('UTF-8', encode_json(\n                        {\n                            success    => false,\n                            msg        => $c->l('Sorry, your invitation has expired or has been deleted. Please contact %1 to have another invitation.', $invit->ldap_user_mail),\n                        }\n                    )));\n                }\n\n                unless ($stop) {\n                    my $f;\n                    if (defined($json->{id})) {\n                        $f = Lufi::DB::File->new(app => $c->app)->from_short($json->{id});\n                    } else {\n                        my $delay;\n                        unless (defined $json->{delay}) {\n                            $json->{delay} = $c->max_delay;\n                        }\n\n                        if (defined $c->config('delay_for_size')) {\n                            # Choose delay according to config\n                            my $delays   = $c->config('delay_for_size');\n                            my @keys     = sort {$b <=> $a} keys %{$delays};\n                            for my $key (@keys) {\n                                if ($json->{size} >= $key) {\n                                    $delay = ($json->{delay} < $delays->{$key}) ? $json->{delay} : $delays->{$key};\n                                    last;\n                                }\n                            }\n                        }\n                        # If the file size is lower than the lowest configured size or if there is no delay_for_size setting, we choose the configured max delay\n                        unless (defined $delay) {\n                            $delay = (($json->{delay} > 0 && $json->{delay} <= $c->max_delay) || $c->max_delay == 0) ? $json->{delay} : $c->max_delay;\n                        }\n                        # If we have a password\n                        my $salted_pwd;\n                        if ($c->config('allow_pwd_on_files') && defined($json->{file_pwd}) && $json->{file_pwd} ne '') {\n                            my $csh = Crypt::SaltedHash->new(algorithm => 'SHA-256', salt_len => 8);\n                            $csh->add($json->{file_pwd});\n\n                            $salted_pwd = $csh->generate();\n                        }\n\n                        my $creator = $c->ip;\n                        # Authenticated user logging\n                        if ((defined($c->config('ldap')) || defined($c->config('htpasswd')) || defined($c->config('auth_headers'))) && !$invitation) {\n                            $creator = sprintf('User: %s, IP: %s', $c->current_user->{username}, $creator);\n                        }\n                        # Guest user logging\n                        if ($invitation) {\n                            $creator = sprintf('User: %s, IP: %s', $invitation->guest_mail, $creator);\n                        }\n\n                        my $delete_at_first_view = ($json->{del_at_first_view}) ? 1 : 0;\n                        $delete_at_first_view    = 1 if $c->app->config('force_burn_after_reading');\n                        $f = Lufi::DB::File->new(app => $c->app)->get_empty()\n                                ->created_by($creator)\n                                ->delete_at_first_view($delete_at_first_view)\n                                ->delete_at_day($delay)\n                                ->mediatype($json->{type})\n                                ->filename($json->{name})\n                                ->filesize($json->{size})\n                                ->nbslices($json->{total})\n                                ->mod_token($c->shortener($c->config('token_length')))\n                                ->passwd($salted_pwd)\n                                ->zipped($json->{zipped})\n                                ->write;\n                    }\n\n                    # This check is just in case we didn't succeed to find a corresponding record\n                    # It normally can't happen\n                    if (defined $f) {\n                        # If we already have a part, it's a resend because the websocket has been broken\n                        # In this case, we don't need to rewrite the file\n                        unless ($f->slices->grep(sub { $_->j == $json->{part} })->size) {\n                            # Create slice file\n                            my $s    = Lufi::DB::Slice->new(\n                                app   => $c->app,\n                                short => $f->short,\n                                j     => $json->{part}\n                            )->store($text);\n                            push @{$f->slices}, $s;\n                            $s->write;\n\n                            if (($json->{part} + 1) == $json->{total}) {\n                                $f->complete(1);\n                                $f->created_at(time);\n                                $f->write;\n                            }\n                        }\n\n                        my $result = {\n                            success           => true,\n                            i                 => $json->{i},\n                            j                 => $json->{part},\n                            parts             => $json->{total},\n                            short             => $f->short,\n                            name              => $f->filename,\n                            size              => $f->filesize,\n                            del_at_first_view => (($f->delete_at_first_view) ? true : false),\n                            created_at        => $f->created_at,\n                            delay             => $f->delete_at_day,\n                            token             => $f->mod_token,\n                            sent_delay        => $json->{delay},\n                            duration          => time - $begin\n                        };\n                        $ws->send(to_json($result));\n                    } else {\n                        $ws->send(decode('UTF-8', encode_json(\n                            {\n                                success    => false,\n                                msg        => $c->l('The server was unable to find the file record to add your file part to. Please, contact the administrator.'),\n                                sent_delay => $json->{delay},\n                                i          => $json->{i}\n                            }\n                        )));\n                    }\n                }\n            }\n        );\n        $c->on(\n            finish => sub {\n                $c->app->log->debug('Client disconnected');\n            }\n        );\n    } else {\n        $c->on(\n            message => sub {\n                $c->app->log->info(sprintf('Someone unauthenticated tried to upload a file. IP: %s', $c->ip));\n                $c->finish;\n            }\n        );\n    }\n}\n\nsub download {\n    my $c     = shift;\n    my $short = $c->param('short');\n\n    $c->inactivity_timeout(300000);\n    $c->app->log->debug('Client connected');\n\n    my $ldfile = Lufi::DB::File->new(app => $c->app)->from_short($short);\n\n    # Do we have a file?\n    if (defined $ldfile) {\n        # Is the file fully uploaded?\n        if ($ldfile->deleted\n            || (\n                $ldfile->delete_at_day != 0\n                && (\n                    ($ldfile->created_at + $ldfile->delete_at_day * 86400) < time()\n                )\n            )\n        ) {\n            unless ($ldfile->deleted) {\n                $ldfile->delete;\n            }\n            $c->on(\n                message => sub {\n                    my ($ws, $json) = @_;\n                    $c->send(decode('UTF-8', encode_json(\n                        {\n                            success => false,\n                            msg     => $c->l('Error: the file existed but was deleted.')\n                        }\n                    )));\n                }\n            );\n        } elsif (defined($ldfile->abuse)) {\n            my $abuse_msg = $c->l('This file has been deactivated by the admins. Contact them to know why.');\n            $abuse_msg    = $c->app->config('abuse')->{$ldfile->abuse} if ($c->app->config('abuse') && $c->app->config('abuse')->{$ldfile->abuse});\n            $c->on(\n                message => sub {\n                    my ($ws, $json) = @_;\n                    $c->send(decode('UTF-8', encode_json(\n                        {\n                            success => false,\n                            msg     => $abuse_msg\n                        }\n                    )));\n                }\n            );\n        } elsif ($ldfile->complete) {\n            my $f = $ldfile;\n\n            $c->on(\n                message => sub {\n                    my ($ws, $json) = @_;\n                    $json = decode_json $json;\n\n                    # Do we need a password?\n                    my $valid = 1;\n                    if ($c->config('allow_pwd_on_files') && defined($f->{passwd})) {\n                        my $pwd = $json->{file_pwd};\n                        $valid = Crypt::SaltedHash->validate($f->{passwd}, $json->{file_pwd}, 8);\n                    }\n\n                    if ($valid) {\n                        if (defined($json->{part})) {\n                            # Make $num an integer instead of a string\n                            my $num = $json->{part} + 0;\n\n                            # Get the slice\n                            my $e    = $f->slices->[$num];\n                            my $text = $e->retrieve();\n\n                            my ($json2) = split('XXMOJOXX', $text, 2);\n                            $json2 = decode 'UTF-8', $json2;\n                            $text =~ s/^.*?XXMOJOXX/${json2}XXMOJOXX/;\n\n                            # Send the slice\n                            $c->send($text);\n                        } elsif (defined($json->{ended}) && $json->{ended}) {\n                            $f->counter($f->counter + 1);\n                            $f->last_access_at(time);\n\n                            if ($f->delete_at_first_view) {\n                                $f->delete;\n                            } else {\n                                $f->write;\n                            }\n                        }\n                    } else {\n                        $c->send(decode('UTF-8', encode_json(\n                            {\n                                msg => $c->l('Your password is not valid. Please refresh the page to retry.')\n                            }\n                        )));\n                    }\n                }\n            );\n            $c->on(\n                finish => sub {\n                    $c->app->log->debug('Client disconnected');\n                }\n            );\n        } else {\n            $c->on(\n                message => sub {\n                    my ($ws, $json) = @_;\n                    $c->send(decode('UTF-8', encode_json(\n                        {\n                            success => false,\n                            msg     => $c->l('Error: the file has not been sent entirely.')\n                        }\n                    )));\n                }\n            );\n        }\n    } else {\n        $c->send(decode('UTF-8', encode_json(\n            {\n                success => false,\n                msg     => $c->l('Error: unable to find the file. Are you sure of your URL?')\n            }\n        )));\n    }\n}\n\nsub r {\n    my $c     = shift;\n    my $short = $c->param('short');\n\n    my $ldfile = Lufi::DB::File->new(app => $c->app)->from_short($short);\n\n    if (defined $ldfile) {\n        return $c->render(\n            template => 'render',\n            f        => $ldfile,\n            file_pwd => ($c->config('allow_pwd_on_files') && defined($ldfile->passwd))\n        );\n    } else {\n        return $c->render(\n            template => 'render',\n            msg      => $c->l('Could not find the file. Are you sure of the URL?')\n        );\n    }\n}\n\nsub get_counter {\n    my $c     = shift;\n    my $short = $c->param('short');\n    my $token = $c->param('token');\n\n    if ((!defined($c->config('ldap')) && !defined($c->config('htpasswd')) && !defined($c->config('auth_headers'))) || $c->is_user_authenticated) {\n        my $ldfile = Lufi::DB::File->new(app => $c->app)->from_short($short);\n\n        if (defined $ldfile) {\n            if ($ldfile->mod_token eq $token) {\n                return $c->render(\n                    json => {\n                        success => true,\n                        short   => $short,\n                        counter => $ldfile->counter,\n                        deleted => ($ldfile->deleted) ? true : false\n                    }\n                );\n            } else {\n                return $c->render(\n                    json => {\n                        success => false,\n                        missing => false,\n                        short   => $short,\n                        msg     => $c->l('Unable to get counter for %1. The token is invalid.', $short)\n                    }\n                );\n            }\n        } else {\n            return $c->render(\n                json => {\n                    success => false,\n                    missing => true,\n                    short   => $short,\n                    msg     => $c->l('Unable to get counter for %1. The file does not exists. It will be removed from your localStorage.', $short)\n                }\n            );\n        }\n    } else {\n        return $c->render(\n            json => {\n                success => false,\n                missing => false,\n                short   => $short,\n                msg     => $c->l('Unable to get counter for %1. You are not authenticated.', $short)\n            }\n        );\n    }\n}\n\nsub delete_file_page {\n    my $c = shift;\n    if ((!defined($c->config('ldap')) && !defined($c->config('htpasswd'))) || $c->is_user_authenticated) {\n        my $short = $c->param('short');\n        my $token = $c->param('token');\n        my $ldfile = Lufi::DB::File->new(app => $c->app)->from_short($short);\n\n        $c->render(\n            template => 'delete_file',\n            short    => $short,\n            token    => $token,\n            filename => $ldfile->{filename},\n        );\n    } else {\n        $c->redirect_to('login');\n    }\n}\n\nsub delete {\n    my $c     = shift;\n    my $short = $c->param('short');\n    my $token = $c->param('token');\n\n    if ((!defined($c->config('ldap')) && !defined($c->config('htpasswd')) && !defined($c->config('auth_headers'))) || $c->is_user_authenticated) {\n        if (!(defined($c->param('_format')) && $c->param('_format') eq 'json') && $c->validation->csrf_protect->has_error('csrf_token')) {\n            $c->flash(msg => $c->l('Bad CSRF token.'));\n            $c->redirect_to('delete', $short, $token);\n        } else {\n            my $ldfile = Lufi::DB::File->new(app => $c->app)->from_short($short);\n\n            $ldfile = undef unless (defined($ldfile) && $ldfile->mod_token eq $token);\n\n            if (defined $ldfile) {\n                my $msg;\n                if ($ldfile->deleted) {\n                    $msg = $c->l('The file has already been deleted');\n                } else {\n                    $ldfile->delete;\n                    $msg = $c->l('File deleted');\n                }\n                return $c->respond_to(\n                    json => {\n                        json => {\n                            success => true,\n                            msg     => $msg\n                        }\n                    },\n                    any => sub {\n                        $c->render(\n                            template                    => 'msg',\n                            f                           => $ldfile,\n                            msg                         => $msg,\n                            del_short_from_localstorage => $short\n                        );\n                    }\n                );\n            } else {\n                my $msg = $c->l('Could not find the file. Are you sure of the URL and the token?');\n                return $c->respond_to(\n                    json => {\n                        json => {\n                            success => false,\n                            msg     => $msg\n                        }\n                    },\n                    any => sub {\n                        $c->render(\n                            template => 'msg',\n                            f        => undef,\n                            msg      => $msg\n                        );\n                    }\n                );\n            }\n        }\n    } else {\n        my $msg = $c->l('Could not delete the file. You are not authenticated.');\n        return $c->respond_to(\n            json => {\n                json => {\n                    success => false,\n                    msg     => $msg\n                }\n            },\n            any => sub {\n                $c->render(\n                    template => 'msg',\n                    f        => undef,\n                    msg      => $msg\n                );\n            }\n        );\n    }\n}\n\n1;\n"
  },
  {
    "path": "lib/Lufi/Controller/Invitation.pm",
    "content": "# vim:set sw=4 ts=4 sts=4 ft=perl expandtab:\npackage Lufi::Controller::Invitation;\nuse Mojo::Base 'Mojolicious::Controller';\nuse Mojo::Collection 'c';\nuse Mojo::File;\nuse Mojo::JSON qw(true false decode_json encode_json);\nuse Mojo::URL;\nuse Mojo::Util qw(decode encode);\nuse Email::Valid;\nuse Lufi::DB::File;\nuse Lufi::DB::Invitation;\nuse Date::Format;\n\nsub new_invite {\n    my $c = shift;\n\n    # The `if (defined($c->config('ldap')))` is at the router level in lib/Lufi.pm\n    if ($c->is_user_authenticated) {\n        my $mail_attr            = $c->config('invitations')->{'mail_attr'} // 'mail';\n        my $max_expire_at        = $c->config('invitations')->{'max_invitation_expiration_delay'} // 30;\n        my $send_with_user_email = defined $c->config('invitations')->{'send_invitation_with_ldap_user_mail'};\n        $c->render(\n            template             => 'invitations/invite',\n            max_expire_at        => $max_expire_at,\n            send_with_user_email => $send_with_user_email,\n            user_mail            => ($send_with_user_email) ? $c->current_user->{$mail_attr} : '',\n            fails                => [],\n            success              => []\n        );\n    } else {\n        $c->redirect_to($c->url_for('login')->query(redirect => 'invite'));\n    }\n}\n\nsub send_invite {\n    my $c          = shift;\n    my $guest_mail = $c->param('guest_mail');\n    my $expire_at  = $c->param('expire_at');\n\n    my $mail_attr            = $c->config('invitations')->{'mail_attr'} // 'mail';\n    my $max_expire_at        = $c->config('invitations')->{'max_invitation_expiration_delay'} // 30;\n    my $send_with_user_email = defined $c->config('invitations')->{'send_invitation_with_ldap_user_mail'};\n\n    # The `if (defined($c->config('ldap')))` is at the router level in lib/Lufi.pm\n    if ($c->is_user_authenticated) {\n        my @fails   = ();\n        my @success = ();\n        unless (Email::Valid->address($guest_mail)) {\n            push @fails, $c->l('The guest email address (%1) is unvalid.', $guest_mail);\n        }\n        unless ($expire_at >= 1 && $expire_at <= $max_expire_at) {\n            push @fails, $c->l('The expiration delay (%1) is not between 1 and %2 days.', $expire_at, $max_expire_at);\n        }\n\n        unless (scalar(@fails)) {\n            my $invitation       = Lufi::DB::Invitation->new(app => $c->app);\n            my $mail_attr        = $c->config('invitations')->{'mail_attr'} // 'mail';\n            my $expend_expire_at = $c->config('invitations')->{'max_additional_period'} // 10;\n\n            my $token;\n            do {\n                $token = $c->create_invitation_token;\n            } while ($invitation->is_token_used($token));\n\n            $invitation = $invitation->from_token($token);\n            $invitation->ldap_user($c->current_user->{username});\n            $invitation->ldap_user_mail($c->current_user->{$mail_attr});\n            $invitation->created_at(time);\n            $invitation->guest_mail($guest_mail);\n            $invitation->expire_at($invitation->created_at + 86400 * $expire_at);\n            $invitation->expend_expire_at($expend_expire_at);\n            $invitation->show_in_list(1);\n            $invitation = $invitation->write;\n\n            my $from = ($c->config('invitations')->{'send_invitation_with_ldap_user_mail'}) ? $invitation->ldap_user_mail : $c->config('mail_sender');\n            my $url  = $c->url_for('guest', token => $invitation->token)->to_abs;\n            $c->mail(\n                from       => $from,\n                to         => $invitation->guest_mail,\n                template   => 'invitations/invite',\n                format     => 'mail',\n                ldap_user  => ucfirst($invitation->ldap_user),\n                url        => $url,\n                invitation => $invitation,\n                expires    => $c->get_date_lang()->time2str($c->l('%A %d %B %Y at %T'), $invitation->expire_at)\n            );\n\n            push @success, $c->l('Invitation sent to %1.<br> URL: %2', $invitation->guest_mail, $url);\n        }\n\n        $c->render(\n            template             => 'invitations/invite',\n            max_expire_at        => $max_expire_at,\n            send_with_user_email => $send_with_user_email,\n            user_mail            => ($send_with_user_email) ? $c->current_user->{$mail_attr} : '',\n            fails                => \\@fails,\n            success              => \\@success\n        );\n    } else {\n        $c->redirect_to('login');\n    }\n}\n\nsub my_invitations {\n    my $c = shift;\n\n    # The `if (defined($c->config('ldap')))` is at the router level in lib/Lufi.pm\n    if ($c->is_user_authenticated) {\n        my $invitations = Lufi::DB::Invitation->new(app => $c->app)\n                                              ->from_user($c->current_user->{username});\n        $invitations = c() unless $invitations;\n        $c->render(\n            template    => 'invitations/my_invitations',\n            invitations => $invitations\n        );\n    } else {\n        $c->redirect_to($c->url_for('login')->query(redirect => 'my_invitations'));\n    }\n}\n\nsub delete_invitations {\n    my $c = shift;\n    my @tokens = @{$c->every_param('tokens[]')};\n\n    if ($c->is_user_authenticated) {\n        my @result   = ();\n        my @failures = ();\n        for my $token (@tokens) {\n            my $i = Lufi::DB::Invitation->new(app => $c->app)\n                                        ->from_token($token);\n            if ($i->ldap_user eq $c->current_user->{username}) {\n                $i->deleted(1)\n                  ->write;\n                push @result, { msg => $c->l('The invitation %1 has been deleted.', $i->token), token => $i->token, deleted => $i->deleted };\n            } else {\n                push @failures, $c->l('The invitation %1 can’t be deleted: it wasn’t created by you (%2).', $i->token, $c->current_user->{username});\n            }\n        }\n\n        $c->render(json => {\n            success  => (scalar(@result) > 0) ? true : false,\n            tokens   => \\@result,\n            failures => \\@failures\n        });\n    } else {\n        $c->redirect_to($c->url_for('login')->query(redirect => 'my_invitations'));\n    }\n}\n\nsub resend_invitations {\n    my $c = shift;\n    my @tokens = @{$c->every_param('tokens[]')};\n\n    if ($c->is_user_authenticated) {\n        my @success  = ();\n        my @failures = ();\n        for my $token (@tokens) {\n            my $i = Lufi::DB::Invitation->new(app => $c->app)\n                                        ->from_token($token);\n\n            if ($i->ldap_user eq $c->current_user->{username}) {\n                if ($i->files_sent_at) {\n                    push @failures, $c->l('The invitation %1 can’t be resent: %2 has already sent files.<br>Please create a new invitation.', $i->token, $i->guest_mail);\n                } else {\n                    if ($c->config('invitations')->{'extend_invitation_expiration_on_resend'}) {\n                        $i->expire_at(time + $i->expire_at - $i->created_at)\n                          ->write;\n                    }\n\n                    my $from   = ($c->config('invitations')->{'send_invitation_with_ldap_user_mail'}) ? $i->ldap_user_mail : $c->config('mail_sender');\n                    my $url    = $c->url_for('guest', token => $i->token)->to_abs;\n                    my $expire = $c->get_date_lang()->time2str($c->l('%A %d %B %Y at %T'), $i->expire_at);\n                    $c->mail(\n                        from       => $from,\n                        to         => $i->guest_mail,\n                        template   => 'invitations/invite',\n                        format     => 'mail',\n                        ldap_user  => ucfirst($i->ldap_user),\n                        url        => $url,\n                        invitation => $i,\n                        expires    => $expire\n                    );\n\n                    push @success, { msg => $c->l('Invitation resent to %1.<br> URL: %2', $i->guest_mail, $url), expires => $expire, token => $i->token };\n                }\n            } else {\n                push @failures, $c->l('The invitation %1 can’t be resent: it wasn’t created by you (%2).', $i->token, $c->current_user->{username});\n            }\n        }\n\n        $c->render(json => {\n            success  => \\@success,\n            failures => \\@failures\n        });\n    } else {\n        $c->redirect_to($c->url_for('login')->query(redirect => 'my_invitations'));\n    }\n}\n\nsub toggle_invitations_visibility {\n    my $c = shift;\n    my @tokens = @{$c->every_param('tokens[]')};\n\n    my @result = ();\n    for my $token (@tokens) {\n        my $i = Lufi::DB::Invitation->new(app => $c->app)\n                                    ->from_token($token)\n                                    ->toggle_visibility;\n        push @result, { token => $i->token, show => ($i->show_in_list) ? true : false }\n    }\n\n    $c->render(json => {\n        success => true,\n        tokens  => \\@result\n    });\n}\n\nsub guest {\n    my $c = shift;\n    my $token = $c->param('token');\n\n    my $invitation = Lufi::DB::Invitation->new(app => $c->app)->from_token($token);\n    if ($invitation) {\n        if ($invitation->is_valid) {\n            $c->session->{guest_token} = $token;\n            $c->session(expires => $invitation->expire_at);\n            return $c->render(\n                template   => 'index',\n                invitation => $invitation\n            );\n        } else {\n            $c->stash('expired_or_deleted_invitation' => 1);\n        }\n    } else {\n        $c->stash('invitation_not_found' => 1);\n    }\n    return $c->render(template => 'invitations/exception');\n}\n\nsub send_mail_to_ldap_user {\n    my $c = shift;\n    my $token = $c->param('token');\n    my $urls  = c(@{$c->every_param('urls[]')});\n\n    my $invitation = Lufi::DB::Invitation->new(app => $c->app)->from_token($token);\n    if ($invitation) {\n        my @files = ();\n        if ($c->config('invitations')->{'save_files_url_in_db'} && $urls->size) {\n            my $guest_files = $invitation->files;\n            my %list_token;\n            if ($guest_files) {\n                $guest_files = decode_json(encode 'UTF-8', $guest_files);\n                for my $file (@{$guest_files}) {\n                    $list_token{$file->{token}} = 1;\n                }\n            } else {\n                $guest_files = [];\n            }\n            push @files, @{$guest_files};\n            $urls->each(sub {\n                my ($e, $num) = @_;\n                $e = decode_json(encode 'UTF-8', $e);\n                if (!defined($list_token{$e->{token}})) {\n                    push @{$guest_files}, $e;\n                    push @files, $e;\n                }\n            });\n            $invitation->files(decode 'UTF-8', encode_json($guest_files));\n            $invitation->write;\n        } else {\n            $urls->each(sub {\n                push @files, decode_json(encode 'UTF-8', shift);\n            });\n        }\n        my $already_notified = 1;\n        unless ($invitation->files_sent_at) {\n            $invitation->files_sent_at(time);\n            $invitation->write;\n            $already_notified = 0;\n        }\n        $c->session(expires => $invitation->files_sent_at + 60 * $invitation->expend_expire_at);\n        $c->mail(\n            from             => $c->config('mail_sender'),\n            to               => $invitation->ldap_user_mail,\n            template         => 'invitations/notification_files_sent',\n            format           => 'mail',\n            files            => c(@files),\n            invitation       => $invitation,\n            already_notified => $already_notified\n        );\n\n        return $c->render(\n            json => {\n                success => true,\n                msg     => $c->l('The URLs of your files have been sent by email to %1.', $invitation->ldap_user_mail)\n            }\n        );\n    } else {\n        return $c->render(\n            json => {\n                success => false,\n                msg     => $c->l('Sorry, the invitation doesn’t exist. Are you sure you are on the right URL?')\n            }\n        );\n    }\n}\n\n1;\n"
  },
  {
    "path": "lib/Lufi/Controller/Mail.pm",
    "content": "# vim:set sw=4 ts=4 sts=4 ft=perl expandtab:\npackage Lufi::Controller::Mail;\nuse Mojo::Base 'Mojolicious::Controller';\nuse Mojo::JSON qw(decode_json);\nuse Mojo::URL;\nuse Email::Valid;\nuse URI::Find;\nuse URI::Find::Schemeless;\n\nsub render_mail {\n    my $c = shift;\n    my $links = (defined($c->param('links'))) ? decode_json($c->param('links')) : [];\n\n    $c->redirect_to('/') unless (scalar(@{$links}));\n\n    $c->render(\n        template => 'mail',\n        links    => $links\n    );\n}\n\nsub send_mail {\n    my $c = shift;\n\n    my $validation = $c->validation;\n    return $c->render(text => $c->l('Bad CSRF token!'), status => 403) if $validation->csrf_protect->has_error('csrf_token');\n\n    my $emails  = $c->param('emails');\n    my $body    = $c->param('body');\n    my $subject = $c->param('subject');\n    my $msg     = '';\n\n    my $base_url  = $c->req->url->to_abs->path($c->config('prefix').'r/');\n    my $fixed_url = $base_url;\n    if ($c->config('fixed_domain')) {\n        $fixed_url->host($c->config('fixed_domain'));\n    }\n    my $at_least_one_instance_url = 0;\n    my $finder = URI::Find->new(sub {\n        my ($uri, $orig_uri) = @_;\n        $uri = Mojo::URL->new($uri);\n        if ($uri->host ne $base_url->to_abs->host && $uri->host ne $fixed_url->to_abs->host) {\n            $msg .= $c->l('You can\\'t add URLs that are not related to this instance (%1).', $orig_uri).'<br>';\n        } elsif (index($orig_uri, $fixed_url->to_abs->to_string) > -1) {\n            $at_least_one_instance_url = 1;\n        }\n        return $orig_uri;\n    });\n    $finder->find(\\$body);\n    $finder->find(\\$subject);\n\n    # Schemeless URI beginning with www, which are interpreted by mailers 🤦\n    $finder = URI::Find::Schemeless->new(sub {\n        my ($uri, $orig_uri) = @_;\n        return $orig_uri if ($uri !~ m/www/);\n\n        $uri = Mojo::URL->new($uri);\n        if ($uri->host ne $base_url->to_abs->host && $uri->host ne $fixed_url->to_abs->host) {\n            $msg .= $c->l('You can\\'t add URLs that are not related to this instance (%1).', $orig_uri).'<br>';\n        }\n        return $orig_uri;\n    });\n    $finder->find(\\$body);\n    $finder->find(\\$subject);\n\n    unless ($at_least_one_instance_url) {\n        $msg .= $c->l('The body of the mail must contain at least one URL pointing to a file hosted on this instance.').'<br>';\n    }\n\n    $emails =~ s/ //g;\n    my @a   = split(',', $emails);\n\n    my @bad;\n    my @good;\n    for my $email (@a) {\n        if (!Email::Valid->address($email)) {\n            push @bad, $email;\n        }\n    }\n\n    if (scalar(@bad)) {\n        $msg .= $c->l('The following email addresses are not valid: %1', join(', ', @bad)).'<br>';\n    }\n\n    $msg .= $c->l('You must give email addresses.').'<br>'     unless (scalar(@a));\n    $msg .= $c->l('The email subject can\\'t be empty.').'<br>' unless ($subject);\n    $msg .= $c->l('The email body can\\'t be empty.').'<br>'    unless ($body);\n\n    if ($msg) {\n        return $c->render(\n            template => 'mail',\n            msg      => $msg,\n            links    => [],\n            values   => {\n                emails  => $emails,\n                subject => $subject,\n                body    => $body\n            }\n        )\n    }\n\n    $c->mail(\n        from    => $c->config('mail_sender'),\n        bcc     => $emails,\n        subject => $subject,\n        data    => $body\n    );\n\n    return $c->render(\n        template    => 'msg',\n        msg_success => $c->l('The mail has been sent.')\n    );\n}\n\n1;\n"
  },
  {
    "path": "lib/Lufi/Controller/Misc.pm",
    "content": "# vim:set sw=4 ts=4 sts=4 ft=perl expandtab:\npackage Lufi::Controller::Misc;\nuse Mojo::Base 'Mojolicious::Controller';\nuse Mojo::File;\nuse Mojo::JSON qw(true false);\nuse Mojo::URL;\nuse Lufi::DB::File;\n\nsub index {\n    my $c = shift;\n    if ((!defined($c->config('ldap')) && !defined($c->config('htpasswd')) && !defined($c->config('auth_headers'))) || $c->is_user_authenticated) {\n        $c->render(template => 'index');\n    } else {\n        $c->redirect_to('login');\n    }\n}\n\nsub change_lang {\n    my $c = shift;\n    my $l = $c->param('l');\n\n    if ($c->iso639_native_name($l)) {\n        $c->cookie($c->app->moniker.'_lang' => $l, { path => $c->config('prefix') });\n    }\n\n    if ($c->req->headers->referrer\n        && Mojo::URL->new($c->req->headers->referrer)->host eq $c->req->url->to_abs->host) {\n        return $c->redirect_to($c->req->headers->referrer);\n    } else {\n        return $c->redirect_to('/');\n    }\n}\n\nsub about {\n    my $c = shift;\n\n    $c->render(\n        template => 'about',\n        version  => $c->git_version\n    );\n}\n\nsub config_infos {\n    my $c = shift;\n\n    $c->render(\n        json => {\n            report                   => $c->config('report'),\n            instance_name            => $c->config('instance_name'),\n            max_file_size            => $c->config('max_file_size'),\n            broadcast_message        => $c->config('broadcast_message'),\n            default_delay            => $c->config('default_delay'),\n            max_delay                => $c->config('max_delay'),\n            delay_for_size           => $c->config('delay_for_size'),\n            allow_pwd_on_files       => $c->config('allow_pwd_on_files'),\n            force_burn_after_reading => $c->config('force_burn_after_reading'),\n            keep_ip_during           => $c->config('keep_ip_during'),\n            stop_upload              => (-f 'stop-upload' || -f 'stop-upload.manual') ? true : false,\n            need_authentication      => (defined($c->config('ldap')) || defined($c->config('htpasswd')) || defined($c->config('auth_headers'))) ? true : false,\n            version                  => $c->git_version\n        }\n    );\n}\n\nsub js_files {\n    my $c = shift;\n\n    $c->stash($c->req->params->to_hash);\n    $c->render(\n        template => 'partial/'.$c->param('file'),\n        format   => 'js',\n        layout   => undef,\n    );\n}\n\nsub fullstats {\n    my $c = shift;\n\n    my $stats = Lufi::DB::File->new(app => $c->app)->get_stats;\n    $stats->{timestamp} = time;\n\n    return $c->render(\n        json => $stats\n    );\n}\n\nsub delays {\n    shift->render(template => 'delays');\n}\n\n1;\n"
  },
  {
    "path": "lib/Lufi/DB/File/Mysql.pm",
    "content": "# vim:set sw=4 ts=4 sts=4 ft=perl expandtab:\npackage Lufi::DB::File::Mysql;\nuse Mojo::Base 'Lufi::DB::File';\n\nsub new {\n    my $c = shift;\n\n    $c = $c->SUPER::new(@_);\n\n    return $c;\n}\n\n1;\n"
  },
  {
    "path": "lib/Lufi/DB/File/Pg.pm",
    "content": "# vim:set sw=4 ts=4 sts=4 ft=perl expandtab:\npackage Lufi::DB::File::Pg;\nuse Mojo::Base 'Lufi::DB::File';\n\nsub new {\n    my $c = shift;\n\n    $c = $c->SUPER::new(@_);\n\n    return $c;\n}\n\n1;\n"
  },
  {
    "path": "lib/Lufi/DB/File/SQLite.pm",
    "content": "# vim:set sw=4 ts=4 sts=4 ft=perl expandtab:\npackage Lufi::DB::File::SQLite;\nuse Mojo::Base 'Lufi::DB::File';\n\nsub new {\n    my $c = shift;\n\n    $c = $c->SUPER::new(@_);\n    $c = $c->_slurp if defined $c->record;\n\n    return $c;\n}\n\n1;\n"
  },
  {
    "path": "lib/Lufi/DB/File.pm",
    "content": "# vim:set sw=4 ts=4 sts=4 ft=perl expandtab:\npackage Lufi::DB::File;\nuse Mojo::Base -base;\nuse Mojo::File;\nuse Mojo::Collection 'c';\nuse Lufi::DB::Slice;\n\nhas 'short';\nhas 'deleted' => 0;\nhas 'mediatype';\nhas 'filename';\nhas 'filesize';\nhas 'counter' => 0;\nhas 'delete_at_first_view' => 0;\nhas 'delete_at_day';\nhas 'created_at' => sub {\n    return time;\n};\nhas 'created_by';\nhas 'last_access_at';\nhas 'mod_token';\nhas 'nbslices';\nhas 'complete' => 0;\nhas 'slices' => sub {\n    return Mojo::Collection->new();\n};\nhas 'passwd';\nhas 'abuse';\nhas 'zipped' => 0;\nhas 'record' => 0;\nhas 'app';\n\n=head1 NAME\n\nLufi::DB::File - DB abstraction layer for Lufi file\n\n=head1 Contributing\n\nWhen creating a new database accessor, make sure that it provides the following subroutines.\nAfter that, modify this file and modify the C<new> subroutine to allow to use your accessor.\n\nHave a look at Lufi::DB::File::SQLite's code: it's simple and may be more understandable that this doc.\n\n=head1 Attributes\n\n=over 1\n\n=item B<short>                : string\n\n=item B<deleted>              : boolean\n\n=item B<mediatype>            : string\n\n=item B<filename>             : string\n\n=item B<filesize>             : integer\n\n=item B<counter>              : integer\n\n=item B<delete_at_first_view> : boolean\n\n=item B<delete_at_day>        : integer\n\n=item B<created_at>           : unix timestamp\n\n=item B<created_by>           : string\n\n=item B<last_access_at>       : unix timestamp\n\n=item B<mod_token>            : string\n\n=item B<nbslices>             : integer\n\n=item B<complete>             : boolean\n\n=item B<slices>               : Mojo::Collection of Lufi::DB::Slice\n\n=item B<passwd>               : string\n\n=item B<abuse>                : integer\n\n=item B<zipped>               : boolean\n\n=item B<app>                  : a Mojolicious object\n\n=back\n\n=head1 Sub routines\n\n=head2 new\n\n=over 1\n\n=item B<Usage>     : C<$c = Lufi::DB::File-E<gt>new(app =E<gt> $self);>\n\n=item B<Arguments> : any of the attribute above\n\n=item B<Purpose>   : construct a new db accessor object. If the C<short> attribute is provided, it have to load the informations from the database.\n\n=item B<Returns>   : the db accessor object\n\n=item B<Info>      : the app argument is used by Lufi::DB::File to choose which db accessor will be used, you don't need to use it in new(), but you can use it to access helpers or configuration settings in the other subroutines\n\n=back\n\n=cut\n\nsub new {\n    my $c = shift;\n\n    $c = $c->SUPER::new(@_);\n\n    if (ref($c) eq 'Lufi::DB::File') {\n        my $dbtype = $c->app->config('dbtype');\n        if ($dbtype eq 'sqlite') {\n            use Lufi::DB::File::SQLite;\n            $c = Lufi::DB::File::SQLite->new(@_);\n        } elsif ($dbtype eq 'postgresql') {\n            use Lufi::DB::File::Pg;\n            $c = Lufi::DB::File::Pg->new(@_);\n        } elsif ($dbtype eq 'mysql') {\n            use Lufi::DB::File::Mysql;\n            $c = Lufi::DB::File::Mysql->new(@_);\n        }\n    }\n\n    return $c;\n}\n\n=head2 delete\n\n=over 1\n\n=item B<Usage>     : C<$c-E<gt>delete>\n\n=item B<Arguments> : none\n\n=item B<Purpose>   : delete the files of the slices and the directory containing those files, then update the object by setting the deleted attribute to 1 (true)\n\n=item B<Returns>   : the db accessor object\n\n=back\n\n=cut\n\nsub delete {\n    my $c = shift;\n\n    $c->slices->each(sub {\n        my ($e, $num) = @_;\n        $e->delete_file();\n    });\n    $c->delete_path\n      ->deleted(1)\n      ->write;\n\n    return $c;\n}\n\n=head2 delete_path\n\n=over 1\n\n=item B<Usage>     : C<$c-E<gt>delete_path()>\n\n=item B<Arguments> : none\n\n=item B<Purpose>   : delete the directory of the slices on filesystem or Swift object storage\n\n=item B<Returns>   : the db accessor object\n\n=back\n\n=cut\n\nsub delete_path {\n    my $c = shift;\n\n    if (!defined($c->app->config('swift'))) {\n        rmdir Mojo::File->new($c->app->config('upload_dir'), $c->short);\n    }\n    return $c;\n}\n\n=head2 write\n\n=over 1\n\n=item B<Usage>     : C<$c-E<gt>write>\n\n=item B<Arguments> : none\n\n=item B<Purpose>   : create or update a record in the database, with the values of the object's attributes\n\n=item B<Returns>   : the db accessor object\n\n=back\n\n=cut\n\nsub write {\n    my $c = shift;\n\n    if ($c->record) {\n        $c->app->dbi->db->query('UPDATE files SET short = ?, deleted = ?, mediatype = ?, filename = ?, filesize = ?, counter = ?, delete_at_first_view = ?, delete_at_day = ?, created_at = ?, created_by = ?, last_access_at = ?, mod_token = ?, nbslices = ?, complete = ?, passwd = ?, abuse = ?, zipped = ? WHERE short = ?', $c->short, $c->deleted, $c->mediatype, $c->filename, $c->filesize, $c->counter, $c->delete_at_first_view, $c->delete_at_day, $c->created_at, $c->created_by, $c->last_access_at, $c->mod_token, $c->nbslices, $c->complete, $c->passwd, $c->abuse, $c->zipped, $c->short);\n    } else {\n        $c->app->dbi->db->query('INSERT INTO files (short, deleted, mediatype, filename, filesize, counter, delete_at_first_view, delete_at_day, created_at, created_by, last_access_at, mod_token, nbslices, complete, passwd, abuse, zipped) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', $c->short, $c->deleted, $c->mediatype, $c->filename, $c->filesize, $c->counter, $c->delete_at_first_view, $c->delete_at_day, $c->created_at, $c->created_by, $c->last_access_at, $c->mod_token, $c->nbslices, $c->complete, $c->passwd, $c->abuse, $c->zipped);\n        $c->record(1);\n    }\n\n    return $c;\n}\n\n=head2 count_empty\n\n=over 1\n\n=item B<Usage>     : C<$c-E<gt>count_empty>\n\n=item B<Arguments> : none\n\n=item B<Purpose>   : count how many records have a null created_at column\n\n=item B<Returns>   : integer\n\n=back\n\n=cut\n\nsub count_empty {\n    my $c = shift;\n\n    return $c->app->dbi->db->query('SELECT count(short) AS count FROM files WHERE created_at IS NULL')->hashes->first->{count};\n}\n\n=head2 already_exists\n\n=over 1\n\n=item B<Usage>     : C<$c-E<gt>already_exists($short)>\n\n=item B<Arguments> : a string\n\n=item B<Purpose>   : check if the given string is already used as short attribute for a file\n\n=item B<Returns>   : 1 or 0\n\n=back\n\n=cut\n\nsub already_exists {\n    my $c     = shift;\n    my $short = shift;\n\n    return $c->app->dbi->db->query('SELECT count(short) AS count FROM files WHERE short = ?', $short)->hashes->first->{count};\n}\n\n=head2 get_empty\n\n=over 1\n\n=item B<Usage>     : C<$c-E<gt>get_empty>\n\n=item B<Arguments> : none\n\n=item B<Purpose>   : select an empty ready-to-use record from the database\n\n=item B<Returns>   : a db accessor object\n\n=back\n\n=cut\n\nsub get_empty {\n    my $c     = shift;\n\n    my $r = $c->app->dbi->db->query('SELECT * FROM files WHERE created_at IS NULL')->hashes->shuffle->first;\n\n    return $c->_slurp($r)->created_at(time)->write;\n}\n\n=head2 get_stats\n\n=over 1\n\n=item B<Usage>     : C<$c-E<gt>get_stats>\n\n=item B<Arguments> : none\n\n=item B<Purpose>   : get stats about how many empty files, deleted files and non-deleted files there is in the database\n\n=item B<Returns>   : a hash table reference containing three keys: files, deleted and empty\n\n=back\n\n=cut\n\nsub get_stats {\n    my $c = shift;\n\n    my $files     = $c->app->dbi->db->query('SELECT count(short) AS count FROM files WHERE created_at IS NOT null AND deleted = ?', 0)->hashes->first->{count};\n    my $deleted   = $c->app->dbi->db->query('SELECT count(short) AS count FROM files WHERE created_at IS NOT null AND deleted = ?', 1)->hashes->first->{count};\n    my $empty     = $c->app->dbi->db->query('SELECT count(short) AS count FROM files WHERE created_at IS null')->hashes->first->{count};\n    my $downloads = $c->app->dbi->db->query('SELECT SUM(counter) AS sum FROM files')->hashes->first->{sum};\n\n    return { files => $files, deleted => $deleted, empty => $empty, downloads => $downloads };\n}\n\n=head2 from_short\n\n=over 1\n\n=item B<Usage>     : C<$c-E<gt>from_short($short)>\n\n=item B<Arguments> : string\n\n=item B<Purpose>   : find a file in the database from its short attribute\n\n=item B<Returns>   : a db accessor object\n\n=back\n\n=cut\n\nsub from_short {\n    my $c     = shift;\n    my $short = shift;\n\n    my $r = $c->app->dbi->db->query('SELECT * FROM files WHERE short = ?', $short)->hashes;\n\n    if ($r->size) {\n        return $c->_slurp($r->first)->record(1);\n    } else {\n        return undef;\n    }\n}\n\n=head2 get_oldest_undeleted_files\n\n=over 1\n\n=item B<Usage>     : C<$c-E<gt>get_oldest_undeleted_files($num)>\n\n=item B<Arguments> : integer\n\n=item B<Purpose>   : get the X oldest non-deleted files\n\n=item B<Returns>   : a Mojo::Collection of Lufi::DB::File objects\n\n=back\n\n=cut\n\nsub get_oldest_undeleted_files {\n    my $c   = shift;\n    my $num = shift;\n\n    my @files;\n    my $records = $c->app->dbi->db->query('SELECT * FROM files WHERE deleted = ? ORDER BY created_at ASC LIMIT ?', 0, $num)->hashes;\n    $records->each(\n        sub {\n            my ($e, $num) = @_;\n            my $i = Lufi::DB::File->new(app => $c->app);\n\n            push @files, $i->_slurp($e);\n        }\n    );\n\n    return c(@files);\n}\n\n=head2 get_expired\n\n=over 1\n\n=item B<Usage>     : C<$c-E<gt>get_expired($time)>\n\n=item B<Arguments> : unix timestamp\n\n=item B<Purpose>   : get the non-deleted files that are expired at the given timestamp minus 2 days\n\n=item B<Returns>   : a Mojo::Collection of Lufi::DB::File objects\n\n=back\n\n=cut\n\nsub get_expired {\n    my $c    = shift;\n    my $time = shift;\n\n    my @files;\n    ## Select only files expired since two days, to be sure that nobody is still downloading it\n    my $records = $c->app->dbi->db->query('SELECT * FROM files WHERE deleted = ? AND ((delete_at_day + 2) * 86400) < (? - created_at) AND delete_at_day != 0', 0, $time)->hashes;\n    $records->each(\n        sub {\n            my ($e, $num) = @_;\n            my $i = Lufi::DB::File->new(app => $c->app);\n\n            push @files, $i->_slurp($e);\n        }\n    );\n\n    return c(@files);\n}\n\n=head2 get_no_longer_viewed\n\n=over 1\n\n=item B<Usage>     : C<$c-E<gt>get_no_longer_viewed($time)>\n\n=item B<Arguments> : unix timestamp\n\n=item B<Purpose>   : get the files that have not been viewed after the given timestamp\n\n=item B<Returns>   : a Mojo::Collection of Lufi::DB::File objects\n\n=back\n\n=cut\n\nsub get_no_longer_viewed {\n    my $c    = shift;\n    my $time = shift;\n\n    my @files;\n    my $records = $c->app->dbi->db->query('SELECT * FROM files WHERE deleted = ? AND last_access_at < ?', 0, $time)->hashes;\n    $records->each(\n        sub {\n            my ($e, $num) = @_;\n            my $i = Lufi::DB::File->new(app => $c->app);\n\n            push @files, $i->_slurp($e);\n        }\n    );\n\n    return c(@files);\n}\n\n=head2 delete_creator_before\n\n=over 1\n\n=item B<Usage>     : C<$c-E<gt>delete_creator_before($time)>\n\n=item B<Arguments> : unix timestamp\n\n=item B<Purpose>   : empty the created_by column for files created before the given timestamp\n\n=item B<Returns>   : nothing\n\n=back\n\n=cut\n\nsub delete_creator_before {\n    my $c          = shift;\n    my $separation = shift;\n\n    $c->app->dbi->db->query('UPDATE files SET created_by = NULL WHERE created_by IS NOT NULL AND created_at < ?', $separation);\n}\n\n=head2 delete_all\n\n=over 1\n\n=item B<Usage>     : C<$c-E<gt>delete_all()>\n\n=item B<Arguments> : none\n\n=item B<Purpose>   : delete all file records from database unconditionnally\n\n=item B<Returns>   : nothing\n\n=back\n\n=cut\n\nsub delete_all {\n    my $c = shift;\n\n    $c->app->dbi->db->delete('files');\n}\n\n=head2 _slurp\n\n=over 1\n\n=item B<Usage>     : C<$c-E<gt>_slurp>\n\n=item B<Arguments> : none\n\n=item B<Purpose>   : put a database record's columns into the Lufi::DB::File object's attributes\n\n=item B<Returns>   : the Lufi::DB::File object\n\n=back\n\n=cut\n\nsub _slurp {\n    my $c = shift;\n    my $r = shift;\n\n    my $file;\n    if (defined $r) {\n        $file = $r;\n    } else {\n        my $files = $c->app->dbi->db->query('SELECT * FROM files WHERE short = ?', $c->short)->hashes;\n\n        if ($files->size) {\n            $file = $files->first;\n        }\n    }\n\n    if ($file) {\n        $c->short($file->{short});\n        $c->deleted($file->{deleted});\n        $c->mediatype($file->{mediatype});\n        $c->filename($file->{filename});\n        $c->filesize($file->{filesize});\n        $c->counter($file->{counter});\n        $c->delete_at_first_view($file->{delete_at_first_view});\n        $c->delete_at_day($file->{delete_at_day});\n        $c->created_at($file->{created_at});\n        $c->created_by($file->{created_by});\n        $c->last_access_at($file->{last_access_at});\n        $c->mod_token($file->{mod_token});\n        $c->nbslices($file->{nbslices});\n        $c->complete($file->{complete});\n        $c->passwd($file->{passwd});\n        $c->abuse($file->{abuse});\n        $c->zipped($file->{zipped});\n\n        $c->record(1) unless $c->record;\n    }\n\n    $c->slices(Lufi::DB::Slice->new(app => $c->app)->get_slices_of_file($c->short));\n\n    return $c;\n}\n\n1;\n"
  },
  {
    "path": "lib/Lufi/DB/Invitation/Mysql.pm",
    "content": "# vim:set sw=4 ts=4 sts=4 ft=perl expandtab:\npackage Lufi::DB::Invitation::Mysql;\nuse Mojo::Base 'Lufi::DB::Invitation';\n\nsub new {\n    my $c = shift;\n\n    $c = $c->SUPER::new(@_);\n\n    return $c;\n}\n\n1;\n"
  },
  {
    "path": "lib/Lufi/DB/Invitation/Pg.pm",
    "content": "# vim:set sw=4 ts=4 sts=4 ft=perl expandtab:\npackage Lufi::DB::Invitation::Pg;\nuse Mojo::Base 'Lufi::DB::Invitation';\n\nsub new {\n    my $c = shift;\n\n    $c = $c->SUPER::new(@_);\n\n    return $c;\n}\n\n1;\n"
  },
  {
    "path": "lib/Lufi/DB/Invitation/SQLite.pm",
    "content": "# vim:set sw=4 ts=4 sts=4 ft=perl expandtab:\npackage Lufi::DB::Invitation::SQLite;\nuse Mojo::Base 'Lufi::DB::Invitation';\n\nsub new {\n    my $c = shift;\n\n    $c = $c->SUPER::new(@_);\n    $c = $c->_slurp if defined $c->record;\n\n    return $c;\n}\n\n1;\n"
  },
  {
    "path": "lib/Lufi/DB/Invitation.pm",
    "content": "# vim:set sw=4 ts=4 sts=4 ft=perl expandtab:\npackage Lufi::DB::Invitation;\nuse Mojo::Base -base;\nuse Mojo::File;\nuse Mojo::Collection 'c';\n\nhas 'token';\nhas 'ldap_user';\nhas 'ldap_user_mail';\nhas 'guest_mail';\nhas 'created_at';\nhas 'expire_at';\nhas 'files_sent_at';\nhas 'expend_expire_at';\nhas 'files';\nhas 'show_in_list' => 1;\nhas 'deleted' => 0;\nhas 'record' => 0;\nhas 'app';\n\n=head1 NAME\n\nLufi::DB::Invitation - DB abstraction layer for Lufi invitations\n\n=head1 Contributing\n\nWhen creating a new database accessor, make sure that it provides the following subroutines.\nAfter that, modify this file and modify the C<new> subroutine to allow to use your accessor.\n\nHave a look at Lufi::DB::Invitation::SQLite's code: it's simple and may be more understandable that this doc.\n\n=head1 Attributes\n\n=over 1\n\n=item B<token>            : string, invitation token\n\n=item B<ldap_user>        : string, the user who created the invitation\n\n=item B<ldap_user_mail>   : string, the email of the user who created the invitation\n\n=item B<guest_mail>       : string, the email of the guest\n\n=item B<created_at>       : unix timestamp\n\n=item B<expire_at>        : unix timestamp\n\n=item B<files_sent_at>    : unix timestamp\n\n=item B<expend_expire_at> : integer, \"error\" delay, in minutes\n\n=item B<files>            : string, optional, list of files sent by the guest\n\n=item B<show_in_list>     : boolean, if the ldap user want to see the invitation in his/her invitations list\n\n=item B<deleted>          : boolean\n\n=item B<app>              : a Mojolicious object\n\n=back\n\n=head1 Sub routines\n\n=head2 new\n\n=over 1\n\n=item B<Usage>     : C<$c = Lufi::DB::Invitation-E<gt>new(app =E<gt> $self);>\n\n=item B<Arguments> : any of the attribute above\n\n=item B<Purpose>   : construct a new db accessor object. If the C<short> attribute is provided, it have to load the informations from the database.\n\n=item B<Returns>   : the db accessor object\n\n=item B<Info>      : the app argument is used by Lufi::DB::Invitation to choose which db accessor will be used, you don't need to use it in new(), but you can use it to access helpers or configuration settings in the other subroutines\n\n=back\n\n=cut\n\nsub new {\n    my $c = shift;\n\n    $c = $c->SUPER::new(@_);\n\n    if (ref($c) eq 'Lufi::DB::Invitation') {\n        my $dbtype = $c->app->config('dbtype');\n        if ($dbtype eq 'sqlite') {\n            use Lufi::DB::Invitation::SQLite;\n            $c = Lufi::DB::Invitation::SQLite->new(@_);\n        } elsif ($dbtype eq 'postgresql') {\n            use Lufi::DB::Invitation::Pg;\n            $c = Lufi::DB::Invitation::Pg->new(@_);\n        } elsif ($dbtype eq 'mysql') {\n            use Lufi::DB::Invitation::Mysql;\n            $c = Lufi::DB::Invitation::Mysql->new(@_);\n        }\n    }\n\n    return $c;\n}\n\nsub to_hash {\n    my $c = shift;\n\n    return {\n        token            => $c->token,\n        ldap_user        => $c->ldap_user,\n        ldap_user_mail   => $c->ldap_user_mail,\n        guest_mail       => $c->guest_mail,\n        created_at       => $c->created_at,\n        expire_at        => $c->expire_at,\n        files_sent_at    => $c->files_sent_at,\n        expend_expire_at => $c->expend_expire_at,\n        files            => $c->files,\n        show_in_list     => $c->show_in_list,\n        deleted          => $c->deleted\n    };\n}\n\n=head2 delete\n\n=over 1\n\n=item B<Usage>     : C<$c-E<gt>delete>\n\n=item B<Arguments> : none\n\n=item B<Purpose>   : set the C<deleted> flag to true\n\n=item B<Returns>   : the db accessor object\n\n=back\n\n=cut\n\nsub delete {\n    my $c = shift;\n\n    $c->deleted(1);\n\n    $c->write;\n\n    return $c;\n}\n\n=head2 hide\n\n=over 1\n\n=item B<Usage>     : C<$c-E<gt>hide>\n\n=item B<Arguments> : none\n\n=item B<Purpose>   : set the C<show_in_list> flag to false\n\n=item B<Returns>   : the db accessor object\n\n=back\n\n=cut\n\nsub hide {\n    my $c = shift;\n\n    $c->show_in_list(0);\n\n    $c->write;\n\n    return $c;\n}\n\n=head2 show\n\n=over 1\n\n=item B<Usage>     : C<$c-E<gt>show>\n\n=item B<Arguments> : none\n\n=item B<Purpose>   : set the C<show_in_list> flag to true\n\n=item B<Returns>   : the db accessor object\n\n=back\n\n=cut\n\nsub show {\n    my $c = shift;\n\n    $c->show_in_list(1);\n\n    $c->write;\n\n    return $c;\n}\n\n=head2 toggle_visibility\n\n=over 1\n\n=item B<Usage>     : C<$c-E<gt>toggle_visibility>\n\n=item B<Arguments> : none\n\n=item B<Purpose>   : toggle the C<show_in_list> flag\n\n=item B<Returns>   : the db accessor object\n\n=back\n\n=cut\n\nsub toggle_visibility {\n    my $c = shift;\n\n    if ($c->show_in_list) {\n        return $c->hide;\n    } else {\n        return $c->show;\n    }\n}\n\n=head2 write\n\n=over 1\n\n=item B<Usage>     : C<$c-E<gt>write>\n\n=item B<Arguments> : none\n\n=item B<Purpose>   : create or update a record in the database, with the values of the object's attributes\n\n=item B<Returns>   : the db accessor object\n\n=back\n\n=cut\n\nsub write {\n    my $c = shift;\n\n    if ($c->record) {\n        $c->app->dbi->db->update('invitations', $c->to_hash, { token => $c->token });\n    } else {\n        $c->app->dbi->db->insert('invitations', $c->to_hash);\n        $c->record(1);\n    }\n\n    return $c;\n}\n\n=head2 from_token\n\n=over 1\n\n=item B<Usage>     : C<$c-E<gt>from_token($token)>\n\n=item B<Arguments> : string\n\n=item B<Purpose>   : find an invitation in the database from its C<token> attribute\n\n=item B<Returns>   : a db accessor object\n\n=back\n\n=cut\n\nsub from_token {\n    my $c     = shift;\n    my $token = shift;\n\n    my $r = $c->app->dbi->db->select('invitations', undef, { token => $token })->hashes;\n\n    if ($r->size) {\n        return $c->_slurp($r->first)->record(1);\n    } else {\n        return undef;\n    }\n}\n\n=head2 from_user\n\n=over 1\n\n=item B<Usage>     : C<$c-E<gt>from_user($mail)>\n\n=item B<Arguments> : string\n\n=item B<Purpose>   : find invitations in the database from their C<ldap_user_mail> attribute\n\n=item B<Returns>   : a Mojo::Collection of Lufi::DB::Invitation objects, sorted by creation date\n\n=back\n\n=cut\n\nsub from_user {\n    my $c    = shift;\n    my $user = shift;\n\n    my $r = $c->app->dbi->db\n              ->select('invitations', undef, { ldap_user => $user }, { -desc => 'created_at' })\n              ->hashes;\n\n    if ($r->size) {\n        my @invitations;\n        $r->each(sub {\n            my ($e, $num) = @_;\n            $e->{app}    = $c->app;\n            $e->{record} = 1;\n            push @invitations, Lufi::DB::Invitation->new($e);\n        });\n        return c(@invitations);\n    } else {\n        return undef;\n    }\n}\n\n=head2 is_token_used\n\n=over 1\n\n=item B<Usage>     : C<$c-E<gt>is_token_used($token)>\n\n=item B<Arguments> : string\n\n=item B<Purpose>   : tells if a token is already used. If not, insert it in database to reserve it\n\n=item B<Returns>   : a boolean\n\n=back\n\n=cut\n\nsub is_token_used {\n    my $c     = shift;\n    my $token = shift;\n\n    my $r = $c->app->dbi->db->select('invitations', ['token'], { token => $token })->hashes;\n\n    if ($r->size) {\n        return 1;\n    } else {\n        $c->app->dbi->db->insert('invitations', { token => $token });\n        return 0;\n    }\n}\n\n=head2 is_valid\n\n=over 1\n\n=item B<Usage>     : C<$c-E<gt>is_valid()>\n\n=item B<Arguments> : none\n\n=item B<Purpose>   : tells if an invitation is still valid\n\n=item B<Returns>   : a boolean\n\n=back\n\n=cut\n\nsub is_valid {\n    my $c = shift;\n\n    my $time = time;\n    #       Active          After creation date        Before expiration date   Before files send date plus extension delay\n    return (!$c->deleted && $time >= $c->created_at && $time < $c->expire_at && (!defined($c->files_sent_at) || $time < ($c->files_sent_at + $c->expend_expire_at * 60)));\n}\n\n=head2 _slurp\n\n=over 1\n\n=item B<Usage>     : C<$c-E<gt>_slurp>\n\n=item B<Arguments> : none\n\n=item B<Purpose>   : put a database record's columns into the Lufi::DB::Invitation object's attributes\n\n=item B<Returns>   : the Lufi::DB::Invitation object\n\n=back\n\n=cut\n\nsub _slurp {\n    my $c = shift;\n    my $r = shift;\n\n    my $invitation;\n    if (defined $r) {\n        $invitation = $r;\n    } else {\n        my $invitations = $c->app->dbi->db->select('invitations', undef, { token => $c->token })->hashes;\n\n        if ($invitations->size) {\n            $invitation = $invitations->first;\n        }\n    }\n\n    if ($invitation) {\n        $c->token(           $invitation->{token}           );\n        $c->ldap_user(       $invitation->{ldap_user}       );\n        $c->ldap_user_mail(  $invitation->{ldap_user_mail}  );\n        $c->guest_mail(      $invitation->{guest_mail}      );\n        $c->created_at(      $invitation->{created_at}      );\n        $c->expire_at(       $invitation->{expire_at}       );\n        $c->files_sent_at(   $invitation->{files_sent_at}   );\n        $c->expend_expire_at($invitation->{expend_expire_at});\n        $c->files(           $invitation->{files}           );\n        $c->show_in_list(    $invitation->{show_in_list}    );\n        $c->deleted(         $invitation->{deleted}         );\n\n        $c->record(1) unless $c->record;\n    }\n\n    return $c;\n}\n\n1;\n"
  },
  {
    "path": "lib/Lufi/DB/Slice/Mysql.pm",
    "content": "# vim:set sw=4 ts=4 sts=4 ft=perl expandtab:\npackage Lufi::DB::Slice::Mysql;\nuse Mojo::Base 'Lufi::DB::Slice';\n\nsub new {\n    my $c = shift;\n\n    $c = $c->SUPER::new(@_);\n\n    $c = $c->_slurp if defined $c->record;\n\n    return $c;\n}\n\n1;\n"
  },
  {
    "path": "lib/Lufi/DB/Slice/Pg.pm",
    "content": "# vim:set sw=4 ts=4 sts=4 ft=perl expandtab:\npackage Lufi::DB::Slice::Pg;\nuse Mojo::Base 'Lufi::DB::Slice';\n\nsub new {\n    my $c = shift;\n\n    $c = $c->SUPER::new(@_);\n\n    $c = $c->_slurp if defined $c->record;\n\n    return $c;\n}\n\n1;\n"
  },
  {
    "path": "lib/Lufi/DB/Slice/SQLite.pm",
    "content": "# vim:set sw=4 ts=4 sts=4 ft=perl expandtab:\npackage Lufi::DB::Slice::SQLite;\nuse Mojo::Base 'Lufi::DB::Slice';\n\nsub new {\n    my $c = shift;\n\n    $c = $c->SUPER::new(@_);\n\n    $c = $c->_slurp if defined $c->record;\n\n    return $c;\n}\n\n1;\n"
  },
  {
    "path": "lib/Lufi/DB/Slice.pm",
    "content": "# vim:set sw=4 ts=4 sts=4 ft=perl expandtab:\npackage Lufi::DB::Slice;\nuse Mojo::Base -base;\nuse Encode 'encode';\nuse File::Spec::Functions;\nuse Mojo::Collection 'c';\n\nhas 'short';\nhas 'j';\nhas 'record' => 0;\nhas 'app';\n\n=encoding utf8\n\n=head1 NAME\n\nLufi::DB::Slice - DB abstraction layer for Lufi file\n\n=head1 Contributing\n\nWhen creating a new database accessor, make sure that it provides the following subroutines.\nAfter that, modify this file and modify the C<new> subroutine to allow to use your accessor.\n\nHave a look at Lufi::DB::Slice::SQLite's code: it's simple and may be more understandable that this doc.\n\n=head1 Attributes\n\n=over 1\n\n=item B<short> : string\n\n=item B<j>     : integer\n\n=item B<app>   : A mojolicious object\n\n=back\n\n=head1 Sub routines\n\n=head2 new\n\n=over 1\n\n=item B<Usage>     : C<$c = Lufi::DB::Slice-E<gt>new(app =E<gt> $self);>\n\n=item B<Arguments> : any of the attribute above\n\n=item B<Purpose>   : construct a new db accessor object. If the C<short> attribute is provided, it have to load the informations from the database.\n\n=item B<Returns>   : the db accessor object\n\n=item B<Info>      : the app argument is used by Lufi::DB::Slice to choose which db accessor will be used, you don't need to use it in new(), but you can use it to access helpers or configuration settings in the other subroutines\n\n=back\n\n=cut\n\nsub new {\n    my $c = shift;\n\n    $c = $c->SUPER::new(@_);\n\n    if (ref($c) eq 'Lufi::DB::Slice') {\n        my $dbtype = $c->app->config('dbtype');\n        if ($dbtype eq 'sqlite') {\n            use Lufi::DB::Slice::SQLite;\n            $c = Lufi::DB::Slice::SQLite->new(@_);\n        } elsif ($dbtype eq 'postgresql') {\n            use Lufi::DB::Slice::Pg;\n            $c = Lufi::DB::Slice::Pg->new(@_);\n        } elsif ($dbtype eq 'mysql') {\n            use Lufi::DB::Slice::Mysql;\n            $c = Lufi::DB::Slice::Mysql->new(@_);\n        }\n    }\n\n    return $c;\n}\n\n=head2 write\n\n=over 1\n\n=item B<Usage>     : C<$c-E<gt>write>\n\n=item B<Arguments> : none\n\n=item B<Purpose>   : create or update a record in the database, with the values of the object's attributes\n\n=item B<Returns>   : the db accessor object\n\n=back\n\n=cut\n\nsub write {\n    my $c = shift;\n\n    if ($c->record) {\n        $c->app->dbi->db->query('UPDATE slices SET short = ?, j = ? WHERE short = ? AND j = ?', $c->short, $c->j, $c->short, $c->j);\n    } else {\n        $c->app->dbi->db->query('INSERT INTO slices (short, j) VALUES (?, ?)', $c->short, $c->j);\n        $c->record(1);\n    }\n\n    return $c;\n}\n\n=head2 store\n\n=over 1\n\n=item B<Usage>     : C<$c-E<gt>store($text)>\n\n=item B<Arguments> : a scalar value\n\n=item B<Purpose>   : will store the content to the object's path, either on filesystem or on Swift object storage\n\n=item B<Returns>   : the db accessor object\n\n=back\n\n=cut\n\nsub store {\n    my $c    = shift;\n    my $text = shift;\n\n    if ($c->app->config('swift')) {\n        $c->app->swift->put_object(\n            container_name => $c->app->config('swift')->{container},\n            object_name    => $c->get_path(),\n            content_length => length(Encode::encode_utf8($text)),\n            content        => Encode::encode_utf8($text)\n        );\n    } else {\n        # Create directory\n        my $dir = catfile($c->app->config('upload_dir'), $c->short);\n        mkdir($dir, 0700) unless (-d $dir);\n\n        # Write file\n        my $file = catfile($c->app->config('upload_dir'), $c->get_path());\n        Mojo::File->new($file)->spew($text);\n    }\n\n    return $c;\n}\n\n=head2 retrieve\n\n=over 1\n\n=item B<Usage>     : C<$c-E<gt>retrieve>\n\n=item B<Arguments> : none\n\n=item B<Purpose>   : get file from storage, either filesystem or Swift object storage\n\n=item B<Returns>   : the data from the file\n\n=back\n\n=cut\n\nsub retrieve {\n    my $c      = shift;\n    my $upload = shift;\n\n    if ($c->app->config('swift')) {\n        my $file;\n        $c->app->swift->get_object(\n            container_name => $c->app->config('swift')->{container},\n            object_name    => $c->get_path(),\n            write_code => sub {\n                my ($status, $message, $headers, $chunk) = @_;\n                $file .= $chunk;\n            }\n        );\n        return Encode::decode_utf8($file);\n    } else {\n        my $file = catfile($c->app->config('upload_dir'), $c->get_path());\n        return Mojo::File->new($file)->slurp;\n    }\n}\n=head2 delete_file\n\n=over 1\n\n=item B<Usage>     : C<$c-E<gt>delete_file()>\n\n=item B<Arguments> : none\n\n=item B<Purpose>   : delete the file on filesystem or Swift object storage\n\n=item B<Returns>   : the db accessor object\n\n=back\n\n=cut\n\nsub delete_file {\n    my $c   = shift;\n\n    if ($c->app->config('swift')) {\n        $c->app->swift->delete_object({\n            container_name => $c->app->config('swift')->{container},\n            object_name    => $c->get_path()\n        });\n    } else {\n        my $file = catfile($c->app->config('upload_dir'), $c->get_path());\n        unlink $file or warn sprintf('Could not unlink %s: %s', $file, $!);\n    }\n    return $c;\n}\n=head2 get_slices_of_file\n\n=over 1\n\n=item B<Usage>     : C<$c-E<gt>get_slices_of_file($short)>\n\n=item B<Arguments> : string\n\n=item B<Purpose>   : get all Lufi::DB::Slice objects related to a file\n\n=item B<Returns>   : a Mojo::Collection of Lufi::DB::Slice objects\n\n=back\n\n=cut\n\nsub get_slices_of_file {\n    my $c     = shift;\n    my $short = shift;\n\n    my @slices;\n    my $records = $c->app->dbi->db->query('SELECT * FROM slices WHERE short = ? ORDER BY j ASC', $short)->hashes;\n    $records->each(\n        sub {\n            my ($e, $num) = @_;\n            my $i = Lufi::DB::Slice->new(app => $c->app);\n\n            push @slices, $i->_slurp($e);\n        }\n    );\n\n    return c(@slices);\n}\n\n=head2 delete_all\n\n=over 1\n\n=item B<Usage>     : C<$c-E<gt>delete_all()>\n\n=item B<Arguments> : none\n\n=item B<Purpose>   : delete all slices records from database unconditionnally\n\n=item B<Returns>   : nothing\n\n=back\n\n=cut\n\nsub delete_all {\n    my $c = shift;\n\n    $c->app->dbi->db->delete('slices');\n}\n\n=head2 path\n\n=over 1\n\n=item B<Usage>     : C<$c-E<gt>path()>\n\n=item B<Arguments> : non\n\n=item B<Purpose>   : format the path of the file, relative to the directory of the Swift object storage\n\n=item B<Returns>   : the path of the file\n\n=back\n\n=cut\n\nsub get_path {\n    my $c        = shift;\n\n    return catfile($c->short, sprintf('%d.part', $c->j));\n}\n\n=head2 count\n\n=over 1\n\n=item B<Usage>     : C<$c-E<gt>count()>\n\n=item B<Arguments> : none\n\n=item B<Purpose>   : get count of slices records from database\n\n=item B<Returns>   : integer\n\n=back\n\n=cut\n\nsub count {\n    my $c = shift;\n\n    return $c->app->dbi->db->query('SELECT count(*) AS count FROM slices')->hashes->first->{count};\n}\n\n=head2 _slurp\n\n=over 1\n\n=item B<Usage>     : C<$c-E<gt>_slurp>\n\n=item B<Arguments> : none\n\n=item B<Purpose>   : put a database record's columns into the Lufi::DB::Slice object's attributes\n\n=item B<Returns>   : the Lufi::DB::Slice object\n\n=back\n\n=cut\n\nsub _slurp {\n    my $c = shift;\n    my $r = shift;\n\n    my $slice;\n    if (defined $r) {\n        $slice = $r;\n    } else {\n        my $slices = $c->app->dbi->db->query('SELECT * FROM slices WHERE short = ? AND j = ?', $c->short, $c->j)->hashes;\n\n        if ($slices->size) {\n            $slice = $slices->first;\n        }\n    }\n\n    if ($slice) {\n        $c->short($slice->{short});\n        $c->j($slice->{j});\n\n        $c->record(1);\n    }\n\n    return $c;\n}\n\n1;\n"
  },
  {
    "path": "lib/Lufi/DefaultConfig.pm",
    "content": "# vim:set sw=4 ts=4 sts=4 ft=perl expandtab:\npackage Lufi::DefaultConfig;\nrequire Exporter;\n@ISA = qw(Exporter);\n@EXPORT_OK = qw($default_config);\nour $default_config = {\n    instance_name => 'Lufi',\n    prefix        => '/',\n    provisioning  => 100,\n    provis_step   => 5,\n    length        => 10,\n    token_length  => 32,\n    secrets       => ['hfudsifdsih'],\n    default_delay => 0,\n    max_delay     => 0,\n    mail          => {\n        how => 'sendmail'\n    },\n    mail_sender              => 'no-reply@lufi.io',\n    disable_mail_sending     => 0,\n    theme                    => 'default',\n    upload_dir               => 'files',\n    session_duration         => 3600,\n    allow_pwd_on_files       => 0,\n    dbtype                   => 'sqlite',\n    db_path                  => 'lufi.db',\n    force_burn_after_reading => 0,\n    x_frame_options          => 'DENY',\n    x_content_type_options   => 'nosniff',\n    x_xss_protection         => '1; mode=block',\n    keep_ip_during           => 365,\n    policy_when_full         => 'warn',\n};\n\n1;\n"
  },
  {
    "path": "lib/Lufi/Plugin/Headers.pm",
    "content": "package Lufi::Plugin::Headers;\nuse Mojo::Base 'Mojolicious::Plugin';\n\nsub register {\n    my ($self, $app) = @_;\n\n    # Assets Cache headers\n    $app->plugin('StaticCache');\n\n    # Add CSP Header\n    if (!defined($app->config('csp')) || (defined($app->config('csp')) && $app->config('csp') ne '')) {\n        my $directives = {\n            'default-src'     => \"'none'\",\n            'script-src'      => \"'self' 'unsafe-inline' 'unsafe-eval'\",\n            'style-src'       => \"'self' 'unsafe-inline'\",\n            'img-src'         => \"'self' blob:\",\n            'media-src'       => \"blob:\",\n            'font-src'        => \"'self'\",\n            'form-action'     => \"'self'\",\n            'base-uri'        => \"'self'\",\n            'connect-src'     => {\n                base => \"'self'\",\n                ws   => 1\n            }\n        };\n\n        my $frame_ancestors = '';\n        $frame_ancestors = \"'none'\" if $app->config('x_frame_options') eq 'DENY';\n        $frame_ancestors = \"'self'\" if $app->config('x_frame_options') eq 'SAMEORIGIN';\n        if ($app->config('x_frame_options') =~ m#^ALLOW-FROM#) {\n            $frame_ancestors = $app->config('x_frame_options');\n            $frame_ancestors =~ s#ALLOW-FROM +##;\n        }\n        $directives->{'frame-ancestors'} = $frame_ancestors if $frame_ancestors;\n\n        $app->plugin('CSPHeader',\n            csp        => $app->config('csp'),\n            directives => $directives\n        );\n    }\n\n    # Add other headers\n    $app->hook(\n        before_dispatch => sub {\n            my $c = shift;\n\n            $c->res->headers->header('X-Frame-Options'        => $app->config('x_frame_options'))        if $app->config('x_frame_options');\n            $c->res->headers->header('X-Content-Type-Options' => $app->config('x_content_type_options')) if $app->config('x_content_type_options');\n            $c->res->headers->header('X-XSS-Protection'       => $app->config('x_xss_protection'))       if $app->config('x_xss_protection');\n        }\n    );\n\n}\n\n1;\n"
  },
  {
    "path": "lib/Lufi/Plugin/Helpers.pm",
    "content": "# vim:set sw=4 ts=4 sts=4 ft=perl expandtab:\npackage Lufi::Plugin::Helpers;\nuse Mojo::Base 'Mojolicious::Plugin';\nuse Lufi::DB::File;\nuse Lufi::DB::Invitation;\nuse Date::Language;\n\nsub register {\n    my ($self, $app) = @_;\n\n    # PgURL helper\n    if ($app->config('dbtype') eq 'postgresql' || $app->config('dbtype') eq 'mysql') {\n        $app->plugin('PgURLHelper');\n    }\n\n    if ($app->config('dbtype') eq 'postgresql') {\n        require Mojo::Pg;\n        $app->helper(dbi => \\&_pg);\n\n        # Database migration\n        my $migrations = Mojo::Pg::Migrations->new(pg => $app->dbi);\n        if ($app->mode eq 'development' && $ENV{LUFI_DEV}) {\n            $migrations->from_file('utilities/migrations/pg.sql')->migrate(0)->migrate($migrations->latest);\n        } else {\n            $migrations->from_file('utilities/migrations/pg.sql')->migrate($migrations->latest);\n        }\n    } elsif ($app->config('dbtype') eq 'mysql') {\n        require Mojo::mysql;\n        $app->helper(dbi => \\&_mysql);\n\n        # Database migration\n        my $migrations = Mojo::mysql::Migrations->new(mysql => $app->dbi);\n        if ($app->mode eq 'development' && $ENV{LUFI_DEV}) {\n            $migrations->from_file('utilities/migrations/mysql.sql')->migrate(0)->migrate($migrations->latest);\n        } else {\n            $migrations->from_file('utilities/migrations/mysql.sql')->migrate($migrations->latest);\n        }\n    } elsif ($app->config('dbtype') eq 'sqlite') {\n        require Mojo::SQLite;\n        $app->helper(dbi => \\&_sqlite);\n\n        # Database migration\n        # Have to create $sql before using its migrations attribute, otherwise, it won't work\n        my $sql        = $app->dbi;\n        my $migrations = $sql->migrations;\n        if ($app->mode eq 'development' && $ENV{LUFI_DEV}) {\n            $migrations->from_file('utilities/migrations/sqlite.sql')->migrate(0)->migrate($migrations->latest);\n        } else {\n            $migrations->from_file('utilities/migrations/sqlite.sql')->migrate($migrations->latest);\n        }\n\n        # Check if passwd column is missing\n        my $columns = $app->dbi->db->query('PRAGMA table_info(files)')->hashes;\n        my $pwd_col = 0;\n        $columns->each(sub {\n            my ($e, $num) = @_;\n            $pwd_col = 1 if $e->{name} eq 'passwd';\n        });\n        $app->dbi->db->query('ALTER TABLE files ADD COLUMN passwd TEXT') unless $pwd_col;\n    }\n\n    $app->helper(provisioning            => \\&_provisioning);\n    $app->helper(get_empty               => \\&_get_empty);\n    $app->helper(ip                      => \\&_ip);\n    $app->helper(default_delay           => \\&_default_delay);\n    $app->helper(max_delay               => \\&_max_delay);\n    $app->helper(is_selected             => \\&_is_selected);\n    $app->helper(stop_upload             => \\&_stop_upload);\n    $app->helper(create_invitation_token => \\&_create_invitation_token);\n    $app->helper(is_guest                => \\&_is_guest);\n    $app->helper(get_date_lang           => \\&_get_date_lang);\n    $app->helper(git_version             => \\&_git_version);\n}\n\nsub _pg {\n    my $c = shift;\n\n    my $pgdb = $c->config('pgdb');\n    my $port = (defined $pgdb->{port}) ? $pgdb->{port}: 5432;\n    my $addr = $c->pg_url({\n        host => $pgdb->{host}, port => $port, database => $pgdb->{database}, user => $pgdb->{user}, pwd => $pgdb->{pwd}\n    });\n    state $pg = Mojo::Pg->new($addr);\n    $pg->max_connections($pgdb->{max_connections}) if defined $pgdb->{max_connections};\n    return $pg;\n}\n\nsub _mysql {\n    my $c = shift;\n\n    my $mysqldb = $c->config('mysqldb');\n    my $port    = (defined $mysqldb->{port}) ? $mysqldb->{port}: 3306;\n    my $addr    = $c->pg_url({\n        host => $mysqldb->{host}, port => $port, database => $mysqldb->{database}, user => $mysqldb->{user}, pwd => $mysqldb->{pwd}\n    });\n    $addr =~ s/postgresql/mysql/;\n    state $mysql = Mojo::mysql->new($addr);\n    $mysql->max_connections($mysqldb->{max_connections}) if defined $mysqldb->{max_connections};\n    return $mysql;\n}\n\nsub _sqlite {\n    my $c = shift;\n\n    state $sqlite = Mojo::SQLite->new('sqlite:'.$c->app->config('db_path'));\n    return $sqlite;\n}\n\nsub _provisioning {\n    my $c = shift;\n\n    # Create some short patterns for provisioning\n    my $ldfile = Lufi::DB::File->new(app => $c->app);\n    if ($ldfile->count_empty < $c->app->config('provisioning')) {\n        for (my $i = 0; $i < $c->app->config('provis_step'); $i++) {\n            my $short;\n            do {\n                $short = $c->shortener($c->app->config('length'));\n            } while ($ldfile->already_exists($short));\n\n            $ldfile->created_at(undef)->short($short)->write;\n        }\n    }\n}\n\nsub _get_empty {\n    my $c = shift;\n\n    my $ldfile = Lufi::DB::File->new(app => $c->app)->get_empty;\n\n    return $ldfile;\n}\n\nsub _ip {\n    my $c           = shift;\n    my $proxy       = $c->req->headers->header('X-Forwarded-For');\n    my $ip          = ($proxy) ? $proxy : $c->tx->remote_address;\n    my $remote_port = (defined($c->req->headers->header('X-Remote-Port'))) ? $c->req->headers->header('X-Remote-Port') : $c->tx->remote_port;\n\n    return \"$ip remote port:$remote_port\";\n}\n\nsub _default_delay {\n    my $c = shift;\n\n    return $c->app->config('default_delay') if ($c->app->config('default_delay') >= 0);\n\n    warn \"default_delay set to a negative value. Default to 0.\";\n    return 0;\n}\n\nsub _max_delay {\n    my $c = shift;\n\n    return $c->app->config('max_delay') if ($c->app->config('max_delay') >= 0);\n\n    warn \"max_delay set to a negative value. Default to 0.\";\n    return 0;\n}\n\nsub _is_selected {\n    my $c   = shift;\n    my $num = shift;\n\n    return ($num == $c->max_delay)     ? 'selected=\"selected\"' : '' if ($c->max_delay && !$c->default_delay);\n    return ($num == $c->default_delay) ? 'selected=\"selected\"' : '';\n}\n\nsub _stop_upload {\n    my $c = shift;\n\n    if (-f 'stop-upload' || -f 'stop-upload.manual') {\n        return 1;\n    }\n    return 0;\n}\n\nsub _create_invitation_token {\n    my $c = shift;\n\n    return $c->shortener(32);\n}\n\nsub _is_guest {\n    my $c     = shift;\n    my $token = shift;\n\n    my $invitation = Lufi::DB::Invitation->new(app => $c->app)->from_token($token);\n    return $invitation if ($invitation && $invitation->is_valid);\n    return 0;\n}\n\nmy %date_langs = (\n    aa => 'Afar',\n    am => 'Amharic',\n    pt => 'Brazilian',\n    bg => 'Bulgarian',\n    zh => 'Chinese',\n    cs => 'Czech',\n    da => 'Danish',\n    nl => 'Dutch',\n    fi => 'Finnish',\n    en => 'English',\n    fr => 'French',\n    de => 'German',\n    el => 'Greek',\n    hu => 'Hungarian',\n    is => 'Icelandic',\n    it => 'Italian',\n    nn => 'Norwegian',\n    om => 'Oromo',\n    oc => 'Occitan',\n    ro => 'Romanian',\n    ru => 'Russian',\n    so => 'Somali',\n    es => 'Spanish',\n    sv => 'Swedish',\n    ti => 'Tigrinya',\n    tk => 'Turkish',\n);\n\nsub _get_date_lang {\n    my $c = shift;\n\n    my $l = $c->languages();\n\n    return Date::Language->new($date_langs{$l}) if $date_langs{$l};\n\n    $l =~ s/^(..).*/$1/;\n    return Date::Language->new($date_langs{$l}) if $date_langs{$l};\n\n    return Date::Language->new('English');\n}\n\nsub _git_version {\n    my $c = shift;\n\n    my $last_tag    = `git describe --tags --abbrev=0`;\n    my $last_commit = `git rev-parse HEAD`;\n    chomp $last_tag;\n    chomp $last_commit;\n\n    return {\n        tag    => $last_tag,\n        commit => $last_commit\n    }\n}\n\n1;\n"
  },
  {
    "path": "lib/Lufi.pm",
    "content": "# vim:set sw=4 ts=4 sts=4 ft=perl expandtab:\npackage Lufi;\nuse Mojo::Base 'Mojolicious';\nuse Mojolicious::Sessions;\nuse Mojo::File;\nuse Email::Valid;\nuse Data::Validate::URI qw(is_web_uri);\nuse Lufi::DefaultConfig qw($default_config);\n\n$ENV{MOJO_MAX_WEBSOCKET_SIZE} = 100485760; # 10 * 1024 * 1024 = 10MiB\n\n# This method will run once at server start\nsub startup {\n    my $self = shift;\n\n    my $config = $self->plugin('Config' => {\n        default => $default_config\n    });\n\n    die 'You need to provide a contact information in lufi.conf!' unless (defined($self->config('contact')));\n    die 'You need to provide a **report** information in lufi.conf!' unless (defined($self->config('report')));\n\n    if (Email::Valid->address($self->config('report'))) {\n        $self->config('report' => 'mailto:'.$self->config('report'));\n    } elsif (!is_web_uri($self->config('report'))) {\n        die 'You need to provide an email address or an URL as report information in lufi.conf!';\n    }\n\n    $self->config('prefix', $self->config('prefix').'/') unless substr($self->config('prefix'), -1) eq '/';\n\n    # Themes handling\n    $self->plugin('FiatTux::Themes');\n\n    # Mail config\n    my $mail_config = {\n        type     => 'text/plain',\n        encoding => 'quoted-printable',\n        how      => $self->config('mail')->{'how'}\n    };\n    $mail_config->{howargs} = $self->config('mail')->{'howargs'} if (defined $self->config('mail')->{'howargs'});\n\n    $self->plugin('Mail' => $mail_config);\n\n    # Internationalization\n    my $lib = $self->home->rel_file('themes/'.$config->{theme}.'/lib');\n    eval qq(use lib \"$lib\");\n    $self->plugin('I18N');\n\n    # Debug\n    $self->plugin('DebugDumperHelper');\n\n    # Compress static assets\n    $self->plugin('GzipStatic');\n\n    # Headers\n    $self->plugin('Lufi::Plugin::Headers');\n\n    # Fiat Tux helpers\n    $self->plugin('FiatTux::Helpers');\n\n    # Authentication\n    $self->plugin('FiatTux::GrantAccess');\n\n    # Secrets\n    $self->secrets($self->config('secrets'));\n\n    # Helpers\n    $self->plugin('Lufi::Plugin::Helpers');\n\n    # Now helpers has been loaded, time to check Swift container\n    if ($config->{swift}) {\n        $self->check_swift_container();\n        $self->log->info('EXPERIMENTAL Using Swift object storage');\n    }\n\n    # Recurrent task\n    my $config_file = $ENV{MOJO_CONFIG} || $self->moniker.'.conf';\n    Mojo::IOLoop->recurring(2 => sub {\n        my $loop = shift;\n\n        my $lockfile = Mojo::File->new($config_file)->basename('.conf').'-provisioning.lock';\n        if (defined($config->{lockfile_dir})) {\n            $lockfile = Mojo::File->new($config->{lockfile_dir}, $lockfile)->to_string;\n        }\n        if (-e $lockfile) {\n            my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = stat($lockfile);\n\n            # Remove the lockfile if more than 20 seconds old\n            if ($mtime && time - $mtime > 20) {\n                unlink $lockfile if -e $lockfile; # if -e just to be sure the file hasn’t been removed while checking it\n            } else {\n                return;\n            }\n        }\n\n        Mojo::File->new($lockfile)->open('>'); # Create the file, like ->touch() but does not croak on fail\n\n        $self->provisioning();\n\n        unlink $lockfile if -e $lockfile;\n    });\n\n    # Create directory if needed\n    if (!defined($config->{swift})) {\n        mkdir($self->config('upload_dir'), 0700) unless (-d $self->config('upload_dir'));\n        die ('The upload directory ('.$self->config('upload_dir').') is not writable') unless (-w $self->config('upload_dir'));\n    }\n\n    # Configure sessions\n    my $sessions = Mojolicious::Sessions->new;\n    $sessions->cookie_name('lufi');\n    $sessions->cookie_path($self->config('prefix'));\n    $self->sessions($sessions);\n\n    # Default layout\n    $self->defaults(layout => 'default');\n\n    # Router\n    my $r = $self->routes;\n\n    # Page for files uploading\n    $r->get('/')\n      ->to('Misc#index')\n      ->name('index');\n\n    $r->get('/lang/:l')\n      ->to('Misc#change_lang')\n      ->name('lang');\n\n    if (defined $self->config('ldap') || defined $self->config('htpasswd') || defined $self->config('auth_headers')) {\n        # Login page\n        $r->get('/login')\n          ->to('Auth#login_page');\n\n        # Authentication\n        $r->post('/login')\n          ->to('Auth#login');\n\n        # Logout page\n        $r->post('/logout')\n          ->to('Auth#log_out')\n          ->name('logout');\n\n        if ((defined $self->config('ldap') || defined $self->config('auth_headers')) && defined $self->config('invitations')) {\n            # Invitation creation page\n            $r->get('/invite')\n              ->name('invite')\n              ->to('Invitation#new_invite');\n\n            # Send invitation\n            $r->post('/invite')\n              ->to('Invitation#send_invite');\n\n            # Get my invitations\n            $r->get('/invite/list')\n              ->name('invite_list')\n              ->to('Invitation#my_invitations');\n\n            # Delete invitations\n            $r->post('/invite/list/delete')\n              ->name('invite_list_delete')\n              ->to('Invitation#delete_invitations');\n\n            # Resend invitation mail\n            $r->post('/invite/list/resend')\n              ->name('invite_list_resend')\n              ->to('Invitation#resend_invitations');\n\n            # Toggle invitations visibility\n            $r->post('/invite/list/visibility')\n              ->name('invite_list_visibility')\n              ->to('Invitation#toggle_invitations_visibility');\n\n            # I’m a guest\n            $r->get('/guest/:token')\n              ->name('guest')\n              ->to('Invitation#guest');\n\n            # I’m a guest and I sent all my files\n            $r->post('/guest/:token/send_mail')\n              ->name('guest_send_mail')\n              ->to('Invitation#send_mail_to_ldap_user');\n        }\n    }\n\n    # About page\n    $r->get('/about')\n      ->to('Misc#about')\n      ->name('about');\n\n    # About config API endpoint\n    $r->get('/about/config')\n      ->to('Misc#config_infos')\n      ->name('config');\n\n    # Generated js files\n    $r->get('/partial/<:file>.<:ext>')\n      ->to('Misc#js_files')\n      ->name('partial');\n\n    # Get instance stats\n    $r->get('/fullstats')\n        ->to('Misc#fullstats')\n        ->name('fullstats');\n\n    # Get a file\n    $r->get('/r/:short')\n      ->to('Files#r')\n      ->name('render');\n\n    # List of files (use localstorage, so the server know nothing about files)\n    $r->get('/files')\n      ->to('Files#files')\n      ->name('files');\n\n    # Get counter informations about a file\n    $r->post('/c')\n      ->to('Files#get_counter')\n      ->name('counter');\n\n    # Delete a file\n    $r->get('/d/:short/:token')\n      ->to('Files#delete_file_page')\n      ->name('delete');\n\n    $r->post('/d/:short/:token')\n      ->to('Files#delete')\n      ->name('really_delete');\n\n    # Get some informations about delays\n    $r->get('/delays')\n      ->to('Misc#delays')\n      ->name('delays');\n\n    # Get mail page\n    $r->get('/m')\n      ->to('Mail#render_mail')\n      ->name('mail');\n\n    # Submit mail\n    $r->post('/m')\n      ->to('Mail#send_mail') unless $self->config('disable_mail_sending');\n\n    # Upload files websocket\n    $r->websocket('/upload')\n      ->to('Files#upload')\n      ->name('upload');\n\n    # Get files websocket\n    $r->websocket('/download/:short')\n      ->to('Files#download')\n      ->name('download');\n}\n\n1;\n"
  },
  {
    "path": "lib/Mounter.pm",
    "content": "package Mounter;\nuse Mojo::Base 'Mojolicious';\nuse FindBin qw($Bin);\nuse File::Spec qw(catfile);\nuse Lufi::DefaultConfig qw($default_config);\n\n# This method will run once at server start\nsub startup {\n    my $self = shift;\n\n    push @{$self->commands->namespaces}, 'Lufi::Command';\n\n    my $cfile = Mojo::File->new($Bin, '..' , 'lufi.conf');\n    if (defined $ENV{MOJO_CONFIG}) {\n        $cfile = Mojo::File->new($ENV{MOJO_CONFIG});\n        unless (-e $cfile->to_abs) {\n            $cfile = Mojo::File->new($Bin, '..', $ENV{MOJO_CONFIG});\n        }\n    }\n    my $config = $self->plugin('Config' =>\n        {\n            file    => $cfile,\n            default => $default_config\n        }\n    );\n\n    # Compress static assets\n    $self->plugin('GzipStatic');\n\n    # Fiat Tux helpers\n    $self->plugin('FiatTux::Helpers');\n\n    # Headers\n    $self->plugin('Lufi::Plugin::Headers');\n\n    # Helpers\n    $self->plugin('Lufi::Plugin::Helpers');\n\n    # Themes handling\n    $self->plugin('FiatTux::Themes');\n\n    $self->plugin('Mount' => {$config->{prefix} => File::Spec->catfile($Bin, '..', 'script', 'application')});\n}\n\n1;\n"
  },
  {
    "path": "lufi.conf.template",
    "content": "# vim:set sw=4 ts=4 sts=4 ft=perl expandtab:\n{\n    ####################\n    # Hypnotoad settings\n    ####################\n    # see http://mojolicio.us/perldoc/Mojo/Server/Hypnotoad for a full list of settings\n    hypnotoad => {\n        # array of IP addresses and ports you want to listen to\n        # you can specify a unix socket too, like 'http+unix://%2Ftmp%2Flufi.sock'\n        listen => ['http://127.0.0.1:8081'],\n        # if you use Lufi behind a reverse proxy like Nginx, you want to set proxy to 1\n        # if you use Lufi directly, let it commented\n        #proxy  => 1,\n\n        # Please read http://mojolicious.org/perldoc/Mojo/Server/Hypnotoad#workers\n        # to adjust this to your server\n        workers => 30,\n        clients => 1,\n    },\n\n    # Put a way to contact you here and uncomment it\n    # You can put some HTML in it\n    # MANDATORY\n    #contact       => '<a href=\"https://contact.example.com\">Contact page</a>',\n\n    # Put an URL or an email address to receive file reports and uncomment it\n    # It's for make reporting illegal files easy for users\n    # MANDATORY\n    #report => 'report@example.com',\n\n    # Array of random strings used to encrypt cookies\n    # optional, default is ['fdjsofjoihrei'], PLEASE, CHANGE IT\n    #secrets        => ['fdjsofjoihrei'],\n\n    # Name of the instance, displayed next to the logo\n    # optional, default is Lufi\n    #instance_name => 'Lufi',\n\n    # Choose a theme. See the available themes in `themes` directory\n    # Optional, default is 'default'\n    #theme         => 'default',\n\n    # Length of the random URL\n    # optional, default is 8\n    #length            => 8,\n\n    # How many URLs will be provisioned in a batch ?\n    # optional, default is 5\n    #provis_step       => 5,\n\n    # Max number of URLs to be provisioned\n    # optional, default is 100\n    #provisioning      => 100,\n\n    # Length of the modify/delete token\n    # optional, default is 32\n    #token_length      => 32,\n\n    # Max file size, in octets\n    # You can write it 100*1024*1024\n    # optional, no default\n    #max_file_size     => 104857600,\n\n    # If you want to have piwik statistics, provide a piwik image tracker\n    # Only the image tracker is allowed, no javascript\n    # optional, no default\n    #piwik_img         => 'https://piwik.example.org/piwik.php?idsite=1&amp;rec=1',\n\n    # Broadcast_message which will displayed on the index page\n    # optional, no default\n    #broadcast_message => 'Maintenance',\n\n    # Default time limit for files\n    # Valid values are 0, 1, 7, 30 and 365\n    # optional, default is 0 (no limit)\n    #default_delay     => 0,\n\n    # Number of days after which the files will be deleted, even if they were uploaded with \"no delay\" (or value superior to max_delay)\n    # A warning message will be displayed on homepage\n    # optional, default is 0 (no limit)\n    #max_delay         => 0,\n\n    # Size thresholds: if you want to define max delays for different sizes of file\n    # The keys are size in Bytes, you can't have 10*1000*10000 as key\n    # If a file is smaller than the smallest configured size, it will have a expiration delay of max_delay (see above)\n    # optional, default is using max_delay (see above) for all sizes\n    #delay_for_size  => {\n    #    10000000   => 90, # between 10MB and 50MB => max is 90 days, less than 10MB => max is max_delay (see above)\n    #    50000000   => 60, # between 50MB ans 1GB  => max is 60 days\n    #    1000000000 => 2,  # more than 1GB         => max is 2 days\n    #},\n\n    # URL sub-directory in which you want Lufi to be accessible\n    # example: you want to have Lufi under https://example.org/lufi/\n    # => set prefix to '/lufi' or to '/lufi/', it doesn't matter\n    # optional, defaut is /\n    #prefix        => '/',\n\n    # Array of authorized domains for API calls.\n    # If you want to authorize everyone to use the API: ['*']\n    # optional, no domains allowed by default\n    #allowed_domains => ['http://1.example.com', 'http://2.example.com'],\n\n    # String of the URL to be redirected to when accessing /logout\n    # optional, default is no redirection after logging out\n    #logout_custom => 'https://sso.example.com/logout?redirect_uri=https%3A%2F%2Fexample.com',\n\n    # Define a path to the upload directory, where the uploaded files will be stored\n    # You can define it relative to lufi directory or set an absolute path\n    # Remember that it has to be in a directory writable by Lufi user\n    # optional, default is 'files'\n    #upload_dir => 'files',\n\n    #!!!!!!!!!!!!!!!\n    # EXPERIMENTAL !\n    #!!!!!!!!!!!!!!!\n    # You can store files on Swift object storage (https://en.wikipedia.org/wiki/OpenStack#Swift) instead of filesystem\n    # Please read https://metacpan.org/pod/Net::OpenStack::Swift#SYNOPSIS to know how to configure this setting\n    # IMPORTANT: add a `container` key in it, to let Lufi know which container to use. This is not a regular Net::OpenStack::Swift setting, but Lufi need it.\n    # EXPERIMENTAL: if the upload or download of files are stucked, reload Lufi and create a cron task to reload Lufi once a day\n    # You can copy Lufi files to Swift object storage by launching the command `carton exec script/lufi copyFilesToSwift` (can take a long time)\n    # optional, no default\n    #swift => {\n    #  auth_url    => 'https://auth-endpoint-url/v2.0',\n    #  user        => 'userid',\n    #  password    => 'password',\n    #  tenant_name => 'project_id',\n    #  container   => 'lufi'\n    #},\n\n    # Allow to add a password on files, asked before allowing to download files\n    # optional, default is 0\n    #allow_pwd_on_files => 0,\n\n    # Force all files to be in \"Burn after reading mode\"\n    # optional, default is 0\n    #force_burn_after_reading => 0,\n\n    # If set, the files' URLs will always use this domain\n    # optional, no default\n    #fixed_domain => 'example.org',\n\n    # Abuse reasons\n    # Set an integer in the abuse field of a file in the database and it will not be downloadable anymore\n    # The reason will be displayed to the downloader, according to the reasons you will configure here.\n    # optional, no default\n    #abuse => {\n    #   0 => 'Copyright infringment',\n    #   1 => 'Illegal content',\n    #},\n\n    # Lockfile directory\n    # In which directory do you want to store the lockfile?\n    # If using load balancing, you will want to set a directory shared by the servers\n    # You can define it relative to lufi directory or set an absolute path\n    # Remember that it has to be in a directory writable by Lufi user\n    # optional, default is lufi directory\n    #lockfile_dir => '.',\n\n    ###############\n    # Mail settings\n    ###############\n\n    # Mail configuration\n    # See https://metacpan.org/pod/Mojolicious::Plugin::Mail#EXAMPLES\n    # optional, default to sendmail method with no arguments\n    #mail => {\n    #    # Valid values are 'sendmail' and 'smtp'\n    #    how => 'smtp',\n    #    howargs => ['smtp.example.org']\n    #},\n\n    # Email sender address\n    # optional, default to no-reply@lufi.io\n    #mail_sender => 'no-reply@lufi.io',\n\n    # Disable sending mail through the server\n    # optional, default is false\n    #disable_mail_sending => 0,\n\n    #############\n    # DB settings\n    #############\n\n    # Choose what database you want to use\n    # Valid choices are sqlite, postgresql and mysql (all lowercase)\n    # optional, default is sqlite\n    #dbtype => 'sqlite',\n\n    # SQLite ONLY - only used if dbtype is set to sqlite\n    # Define a path to the SQLite database\n    # You can define it relative to lufi directory or set an absolute path\n    # Remember that it has to be in a directory writable by Lufi user\n    # optional, default is lufi.db\n    #db_path           => 'lufi.db',\n\n    # PostgreSQL ONLY - only used if dbtype is set to postgresql\n    # These are the credentials to access the PostgreSQL database\n    # mandatory if you choosed postgresql as dbtype\n    #pgdb => {\n    #    database => 'lufi',\n    #    host     => 'localhost',\n    #    # optional, default is 5432\n    #    #port     => 5432,\n    #    user     => 'DBUSER',\n    #    pwd      => 'DBPASSWORD',\n    #    # https://mojolicious.org/perldoc/Mojo/Pg#max_connections\n    #    # optional, default is 1\n    #    #max_connections => 1,\n    #},\n\n    # MySQL ONLY - only used if dbtype is set to mysql\n    # These are the credentials to access the MySQL database\n    # mandatory if you choosed mysql as dbtype\n    #mysqldb => {\n    #    database => 'lufi',\n    #    host     => 'localhost',\n    #    # optional, default is 3306\n    #    #port     => 3306,\n    #    user     => 'DBUSER',\n    #    pwd      => 'DBPASSWORD',\n    #    # https://metacpan.org/pod/Mojo::mysql#max_connections\n    #    # optional, default is 5 (set to 0 to disable persistent connections)\n    #    #max_connections => 5,\n    #},\n\n    #############################################\n    # LDAP settings (authentication and features)\n    #############################################\n\n    # Set `ldap` if you want that only authenticated users can upload files\n    # Please note that everybody can still download files\n    # optional, no default\n    #ldap => {\n    #    uri         => 'ldaps://ldap.example.org',                 # server URI\n    #    user_tree   => 'ou=users,dc=example,dc=org',               # search base DN\n    #    bind_dn     => 'uid=ldap_user,ou=users,dc=example,dc=org', # search bind DN\n    #    bind_pwd    => 'secr3t',                                   # search bind password\n    #    user_attr   => 'uid',                                      # user attribute (uid, mail, sAMAccountName, etc.)\n    #    user_filter => '(!(uid=ldap_user))',                       # user filter (to exclude some users, etc.)\n    #    # optional start_tls configuration. See https://metacpan.org/pod/distribution/perl-ldap/lib/Net/LDAP.pod#start_tls\n    #    # don't set or uncomment if you don't want to configure it\n    #    start_tls => {\n    #       verify     => 'optional',\n    #       clientcert => '/etc/ssl/certs/ca-bundle.pem'\n    #    }\n    #},\n\n    # If you've set ldap above, the session will last `session_duration` seconds before\n    # the user needs to reauthenticate\n    # optional, default is 3600\n    #session_duration => 3600,\n\n    # If you use `ldap` for authentication, you can map some attributes from LDAP to be able to access them in Lufi\n    # Those attributes will be accessible with:\n    #   $c->current_user->{lufi_attribute_name} in Lufi backend files (all that is in `lib` directory)\n    #   <%= $self->current_user->{lufi_attribute_name} %> in templates files (in `themes` directory)\n    #\n    # Define the attributes like this: `lufi_attribute_name => 'LDAP_attribute_name'`\n    # Note that you can’t use `username` as a Lufi attribute name: this name is reserved and will contain the login of the user\n    # optional, no default\n    #ldap_map_attr => {\n    #    displayname => 'cn',\n    #    mail        => 'mail'\n    #},\n\n    # When using LDAP authentication, LDAP users can invite people (by mail) to use Lufi to send them files without\n    # being authenticated.\n    # This is where you configure the behavior of the invitations.\n    # You may need to fetch some attributes from LDAP to use some invitations settings. See `ldap_map_attr` above.\n    # optional, no default\n    #invitations => {\n    #   # The name of the key set in `ldap_map_attr` (above) that corresponds to the mail of the LDAP user\n    #   # optional, default is `mail`\n    #   mail_attr => 'mail',\n    #   # The `From` header of invitation mail can be the mail of the LDAP user\n    #   # Be sure to have a mail system that will correctly send the mail from your users! (DKIM, SPF…)\n    #   # To enable this feature, set it to 1\n    #   # optional, disabled by default\n    #   send_invitation_with_ldap_user_mail => 1,\n    #   # The user is able to set an expiration delay for the invitation.\n    #   # This expiration delay can’t be more than this setting (in days).\n    #   # optional, default is 30 days\n    #   max_invitation_expiration_delay => 30,\n    #   # Once the guest has submitted his files, he has an additional period of time to submit forgotten files.\n    #   # You can set that additional period of time in minutes here.\n    #   # To disable that feature, set it to 0 or less\n    #   # optional, default is 10 minutes\n    #   max_additional_period => 10,\n    #   # Lufi follows privacy-by-design, so, by default, no files URLs (with the decode secret) are stored in database.\n    #   # However, the concern is different for this case. Storing files URLs makes users able to retrieve the guests’ sent files\n    #   # from their `invitations` page.\n    #   # Set to 1 to store guests’ files URLs in database\n    #   # optional, default is 0 (disabled)\n    #   save_files_url_in_db => 0,\n    #   # Users can resend the invitation to their guest. This does not extend the invitation’s expiration delay unless you\n    #   # set this option to 1.\n    #   # optional, default is 0 (disabled)\n    #   extend_invitation_expiration_on_resend => 0,\n    #},\n\n    #########################\n    # Htpasswd authentication\n    #########################\n\n    # Set `htpasswd` if you want to use an htpasswd file instead of ldap\n    # See 'man htpasswd' to know how to create such file\n    #htpasswd => 'lufi.passwd',\n\n    ############################\n    # HTTP header authentication\n    ############################\n\n    # Set `auth_headers` if you want to use HTTP header auth.\n    # Typically, these headers are set by a reverse-proxy\n    # acting as an authentication server. Useful for SSO.\n    # `auth_headers` should contains the user's username.\n    #\n    # /!\\ LUFI BLINDLY TRUSTS THESE HEADERS\n    # /!\\ IT'S UP TO YOU TO SANITIZE INCOMING HEADERS TO SECURE YOUR INSTANCE\n    #\n    #auth_headers => 'X-AUTH-PREFERRED-USERNAME',\n    #auth_headers_map_value => {\n    #    # Like ldap_map_attr but for headers\n    #    displayname => 'X-AUTH-DISPLAYNAME',\n    #    firstname   => 'X-AUTH-GIVENNAME',\n    #    lastname    => 'X-AUTH-LASTNAME',\n    #    mail        => 'X-AUTH-EMAIL'\n    #},\n\n\n    #######################\n    # HTTP Headers settings\n    #######################\n\n    # Content-Security-Policy header that will be sent by Lufi\n    # Set to '' to disable CSP header\n    # https://content-security-policy.com/ provides a good documentation about CSP.\n    # https://report-uri.com/home/generate provides a tool to generate a CSP header.\n    # optional, default is \"base-uri 'self'; connect-src 'self' ws://YOUR_HOST; default-src 'none'; font-src 'self'; form-action 'self'; frame-ancestors 'none'; img-src 'self' blob:; media-src blob:; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'\"\n    #csp => \"\",\n\n    # X-Frame-Options header that will be sent by Lufi\n    # Valid values are: 'DENY', 'SAMEORIGIN', 'ALLOW-FROM https://example.com/'\n    # Set to '' to disable X-Frame-Options header\n    # See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options\n    # Please note that this will add a \"frame-ancestors\" directive to the CSP header (see above) accordingly\n    # to the chosen setting (See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/frame-ancestors)\n    # optional, default is 'DENY'\n    #x_frame_options => 'DENY',\n\n    # X-Content-Type-Options that will be sent by Lufi\n    # See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Content-Type-Options\n    # Set to '' to disable X-Content-Type-Options header\n    # optional, default is 'nosniff'\n    #x_content_type_options => 'nosniff',\n\n    # X-XSS-Protection that will be sent by Lufi\n    # See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-XSS-Protection\n    # Set to '' to disable X-XSS-Protection header\n    # optional, default is '1; mode=block'\n    #x_xss_protection => '1; mode=block',\n\n    #########################\n    # Lufi cron jobs settings\n    #########################\n\n    # Expired files will be kept for 2 additional days after the expiration time has passed!\n    # The reasoning behind this is to allow downloads to complete and avoid deleting them while\n    # they are still being tranfered.\n\n    # Number of days senders' IP addresses are kept in database\n    # After that delay, they will be deleted from database (used with script/lufi cron cleanbdd)\n    # optional, default is 365\n    #keep_ip_during    => 365,\n\n    # Max size of the files directory, in octets\n    # Used by script/lufi cron watch to trigger an action\n    # optional, no default\n    #max_total_size    => 10*1024*1024*1024,\n\n    # Default action when files directory is over max_total_size (used with script/lufi cron watch)\n    # Valid values are 'warn', 'stop-upload' and 'delete'\n    # Please, see README.md\n    # optional, default is 'warn'\n    #policy_when_full  => 'warn',\n\n    # Files which are not viewed since delete_no_longer_viewed_files days will be deleted by the cron cleanfiles task\n    # If delete_no_longer_viewed_files is not set, the no longer viewed files will NOT be deleted\n    # optional, no default\n    #delete_no_longer_viewed_files => 90,\n};\n"
  },
  {
    "path": "script/application",
    "content": "#!/usr/bin/env perl\n\nuse strict;\nuse warnings;\n\nuse lib 'lib';\n\n# Start command line interface for application\nrequire Mojolicious::Commands;\nMojolicious::Commands->start_app('Lufi');\n"
  },
  {
    "path": "script/lufi",
    "content": "#!/usr/bin/env perl\n\nuse strict;\nuse warnings;\n\nuse FindBin;\nBEGIN { unshift @INC, \"$FindBin::Bin/../lib\" }\n\n# Start command line interface for application\nrequire Mojolicious::Commands;\nMojolicious::Commands->start_app('Mounter');\n"
  },
  {
    "path": "t/lufi.passwd",
    "content": "luc:$apr1$zG4UAKGa$FqSi4widrkVH/pT3qPawd.\n"
  },
  {
    "path": "t/test.t",
    "content": "# vim:set sw=4 ts=4 sts=4 ft=perl expandtab:\nuse Mojo::Base -strict;\nuse Mojo::File;\nuse Mojo::JSON qw(to_json from_json true false);\nuse Mojolicious;\n\nuse Test::More;\nuse Test::Mojo;\n\nuse Lufi::DB::File;\nuse Lufi::DB::Slice;\nuse FindBin qw($Bin);\n\nmy ($m, $cfile, $config_orig, $config_file, $config_content);\n\nmy $msg = Encode::encode_utf8(to_json {\n    \"total\"             => 1,\n    \"part\"              => 0,\n    \"size\"              => 7,\n    \"name\"              => \"foobaré.txt\",\n    \"type\"              => \"text/plain\",\n    \"delay\"             => \"0\",\n    \"del_at_first_view\" => 1,\n    \"id\"                => undef,\n    \"zipped\"            => 0,\n    \"i\"                 => 0\n});\nmy $filename_test = Encode::encode_utf8('foobaré');\nmy $encrypted     = '\"{\\\\\"iv\\\\\":\\\\\"2RGAviAeYybBqcLCmnqlgA==\\\\\",\\\\\"v\\\\\":1,\\\\\"iter\\\\\":10000,\\\\\"ks\\\\\":128,\\\\\"ts\\\\\":64,\\\\\"mode\\\\\":\\\\\"ccm\\\\\",\\\\\"adata\\\\\":\\\\\"\\\\\",\\\\\"cipher\\\\\":\\\\\"aes\\\\\",\\\\\"salt\\\\\":\\\\\"1dvKtbZ8hxA=\\\\\",\\\\\"ct\\\\\":\\\\\"w9wDZCwNSyH/yL7q1GW5fPSdi+w=\\\\\"}\"';\nmy $encrypted_rgx = $encrypted;\n$encrypted_rgx    =~ s@\\\\@\\\\\\\\@g;\n$encrypted_rgx    =~ s@\\+@\\\\+@g;\n$encrypted_rgx    =~ s@(\\{|\\})@\\\\$1@g;\n\nBEGIN {\n    use lib 'lib';\n    $m = Mojolicious->new;\n    $cfile = Mojo::File->new($Bin, '..', 'lufi.conf');\n    if (defined $ENV{MOJO_CONFIG}) {\n        $cfile = Mojo::File->new($ENV{MOJO_CONFIG});\n        unless (-e $cfile->to_abs) {\n            $cfile = Mojo::File->new($Bin, '..', $ENV{MOJO_CONFIG});\n        }\n    }\n    my $config = $m->plugin(\n        'Config' => {\n            file    => $cfile->to_abs->to_string,\n            default => {\n                prefix        => '/',\n                provisioning  => 100,\n                provis_step   => 5,\n                length        => 10,\n                token_length  => 32,\n                secrets       => ['hfudsifdsih'],\n                default_delay => 0,\n                max_delay     => 0,\n                mail          => {\n                    how => 'sendmail'\n                },\n                mail_sender              => 'no-reply@lufi.io',\n                theme                    => 'default',\n                upload_dir               => 'files',\n                session_duration         => 3600,\n                allow_pwd_on_files       => 0,\n                dbtype                   => 'sqlite',\n                db_path                  => 'lufi.db',\n                force_burn_after_reading => 0,\n                x_frame_options          => 'DENY',\n                x_content_type_options   => 'nosniff',\n                x_xss_protection         => '1; mode=block',\n            }\n        }\n    );\n    $m->plugin('Lufi::Plugin::Helpers');\n    $m->plugin('DebugDumperHelper');\n} ## end BEGIN\n\nLufi::DB::Slice->new(app => $m)->delete_all;\nLufi::DB::File->new(app => $m)->delete_all;\n\n$config_file = Mojo::File->new($cfile->to_abs->to_string);\n$config_orig = $config_file->slurp;\n\nmy $t = Test::Mojo->new('Lufi');\n\n## Wait for short generation\nsleep 5;\n\n## Let's go\n$t->get_ok('/')\n  ->status_is(200)\n  ->content_like(qr@Lufi@i);\n\ntest_infos_api(false);\ntest_upload_file();\ntest_download_file();\n\n## Test htpasswd\nswitch_to_htpasswd();\ntest_infos_api(true);\nauth_test_suite('luc', 'toto');\nrestore_config();\n\n## Test LDAP\nswitch_to_ldap();\ntest_infos_api(true);\nauth_test_suite('zoidberg', 'zoidberg');\nrestore_config();\n\n## Test Swift object storage\n#switch_to_swift();\n#test_upload_file();\n#test_download_file();\n#restore_config();\n\ndone_testing();\n\n######\n### Functions\n##\nsub test_infos_api {\n    my $auth = shift;\n\n    $t->get_ok('/about/config')\n      ->status_is(200)\n      ->json_has(\n          '/allow_pwd_on_files', '/need_authentication', '/max_delay',\n          '/instance_name',      '/broadcast_message',   '/max_file_size',\n          '/keep_ip_during',     '/report',              '/stop_upload',\n          '/delay_for_size',     '/default_delay',       '/force_burn_after_reading'\n      )\n      ->json_is(\n          '/allow_pwd_on_files'       => 1,\n          '/need_authentication'      => $auth,\n          '/max_delay'                => 0,\n          '/instance_name'            => 'Lufi',\n          '/broadcast_message'        => undef,\n          '/max_file_size'            => undef,\n          '/keep_ip_during'           => 365,\n          '/report'                   => 'mailto:report@example.com',\n          '/stop_upload'              => false,\n          '/delay_for_size'           => undef,\n          '/default_delay'            => 0,\n          '/force_burn_after_reading' => 0\n      );\n}\n\nsub test_upload_file {\n    $t->websocket_ok('/upload/')\n      ->send_ok($msg.'XXMOJOXX'.$encrypted)\n      ->message_ok\n      ->message_like(qr@\"created_at\":\\d+@)\n      ->message_like(qr@\"del_at_first_view\":true@)\n      ->message_like(qr@\"delay\":0@)\n      ->message_like(qr@\"duration\":\\d+@)\n      ->message_like(qr@\"i\":0@)\n      ->message_like(qr@\"j\":0@)\n      ->message_like(qr@\"name\":\"$filename_test\\.txt\"@)\n      ->message_like(qr@\"parts\":1@)\n      ->message_like(qr@\"sent_delay\":0@)\n      ->message_like(qr@\"short\":\"[^\"]+\"@)\n      ->message_like(qr@\"size\":7@)\n      ->message_like(qr@\"success\":true@)\n      ->message_like(qr@\"token\":\"[^\"]+\"}@)\n      ->finish_ok;\n}\n\nsub test_download_file {\n    my $ws_msg;\n    $t->ua->websocket_p('/upload/')->then(sub {\n        my $tx = shift;\n        my $promise = Mojo::Promise->new;\n        $tx->on(finish => sub { $promise->resolve });\n        $tx->on(message => sub {\n            my $tx = shift;\n            $ws_msg = shift;\n            $tx->finish;\n        });\n        $tx->send($msg.'XXMOJOXX'.$encrypted);\n        return $promise;\n    })->catch(sub {\n        my $err = shift;\n        is($err, undef);\n    })->wait;\n\n    $ws_msg = from_json($ws_msg);\n    $t->websocket_ok('/download/'.$ws_msg->{short})\n      ->send_ok(to_json({part => 0}))\n      ->message_ok\n      ->message_like(qr@\"total\":1@)\n      ->message_like(qr@\"part\":0@)\n      ->message_like(qr@\"i\":0@)\n      ->message_like(qr@\"id\":null@)\n      ->message_like(qr@\"del_at_first_view\":1@)\n      ->message_like(qr@\"delay\":\"0\"@)\n      ->message_like(qr@\"name\":\"$filename_test\\.txt\"@)\n      ->message_like(qr@\"size\":7@)\n      ->message_like(qr@\"type\":\"text\\\\/plain\"@)\n      ->message_like(qr@XXMOJOXX@)\n      ->message_like(qr@$encrypted_rgx@)\n      ->send_ok(to_json({ended => true}))\n      ->finish_ok;\n\n    # The file is not supposed to be available anymore\n    $t->websocket_ok('/download/'.$ws_msg->{short})\n      ->send_ok(to_json({part => 0}))\n      ->message_ok\n      ->message_like(qr@\"msg\":\"Error: the file existed but was deleted\\.\"@)\n      ->message_like(qr@\"success\":false@)\n      ->send_ok(to_json({ended => true}))\n      ->finish_ok;\n}\n\nsub auth_test_suite {\n    my ($login, $pass) = @_;\n\n    $t->get_ok('/')\n      ->status_is(302)\n      ->header_is(Location => '/login');\n\n    test_fail_upload();\n    test_login($login, $pass);\n    test_upload_file();\n    test_download_file();\n\n    my $token = '';\n\n    $t->post_ok('/logout' => form => { csrf_token => $token })\n      ->status_is(200)\n      ->content_like(qr@Bad CSRF token\\.@);\n\n    $token = $t->ua->get('/')->res->dom->find('input[name=\"csrf_token\"]')->first->attr('value');\n\n    $t->post_ok('/logout' => form => { csrf_token => $token })\n      ->status_is(200)\n      ->content_like(qr@You have been successfully logged out\\.@);\n\n    test_fail_upload();\n}\n\nsub test_fail_upload {\n    # An empty message would make it fail if we were allowed to go in the authenticated part\n    $t->websocket_ok('/upload/')\n      ->send_ok('')\n      ->finish_ok;\n}\n\nsub test_login {\n    my ($login, $pass) = @_;\n    $t->get_ok('/login')\n      ->status_is(200)\n      ->content_like(qr@Signin@);\n\n    my $token = '';\n\n    $t->post_ok('/login' => form => { login => $login, password => $pass, csrf_token => $token })\n      ->status_is(200)\n      ->content_like(qr@Bad CSRF token\\.@);\n\n    $token = $t->ua->get('/login')->res->dom->find('input[name=\"csrf_token\"]')->first->attr('value');\n\n    $t->post_ok('/login' => form => { login => $login, password => $pass, csrf_token => $token })\n      ->status_is(302)\n      ->header_is(Location => '/');\n\n    $t->get_ok('/login')\n      ->status_is(302)\n      ->header_is(Location => '/');\n}\n\nsub restore_config {\n    $config_file->spew($config_orig);\n}\n\nsub switch_to_htpasswd {\n    $config_content = $config_orig;\n    $config_content =~ s/#?htpasswd.*/htpasswd => 't\\/lufi.passwd',/gm;\n    $config_file->spew($config_content);\n\n    Lufi::DB::Slice->new(app => $m)->delete_all;\n    Lufi::DB::File->new(app => $m)->delete_all;\n\n    $t = Test::Mojo->new('Lufi');\n\n    ## Wait for short generation\n    sleep 5;\n}\n\nsub switch_to_ldap {\n    $config_content = $config_orig;\n    $config_content =~ s/^( +)#?ldap => \\{ uri/$1ldap => { uri/gm;\n    $config_file->spew($config_content);\n\n    Lufi::DB::Slice->new(app => $m)->delete_all;\n    Lufi::DB::File->new(app => $m)->delete_all;\n\n    $t = Test::Mojo->new('Lufi');\n\n    ## Wait for short generation\n    sleep 5;\n}\n\nsub switch_to_swift {\n    $config_content = $config_orig;\n    $config_content =~ s/^( +)#?swift => \\{ auth_url/$1swift => { auth_url/gm;\n    $config_file->spew($config_content);\n\n    Lufi::DB::Slice->new(app => $m)->delete_all;\n    Lufi::DB::File->new(app => $m)->delete_all;\n\n    $t = Test::Mojo->new('Lufi');\n\n    ## Wait for short generation\n    sleep 5;\n}\n"
  },
  {
    "path": "themes/default/lib/Lufi/I18N/ar.po",
    "content": "# ButterflyOfFire <butterflyoffire@protonmail.com>, 2018. #zanata\n# ButterflyOfFire <butterflyoffire@protonmail.com>, 2019. #zanata\n# Luc Didry <luc@framasoft.org>, 2019. #zanata\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\\n\"\n\"PO-Revision-Date: 2021-10-08 03:05+0000\\n\"\n\"Last-Translator: ButterflyOfFire <butterflyoffire@protonmail.com>\\n\"\n\"Language-Team: Arabic <https://weblate.framasoft.org/projects/lufi/\"\n\"default-theme/ar/>\\n\"\n\"Language: ar\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 \"\n\"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\\n\"\n\"X-Generator: Weblate 4.6.2\\n\"\n\n#. ($delay)\n#. (max_delay)\n#: themes/default/templates/index.html.ep:56 themes/default/templates/index.html.ep:65 themes/default/templates/index.html.ep:66\nmsgid \"%1 days\"\nmsgstr \"زَمَن %1 يَوم\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:2\nmsgid \"%1 invites you to send him/her files\"\nmsgstr \"يَدعُوكَ %1 لإرسالِ المَلَفَّاتِ إليه\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:6\nmsgid \"%1 invites you to send him/her files through Lufi.\"\nmsgstr \"يَدعُوكَ %1 لإرسالِ المَلَفَّاتِ إلَيه عَبرَ لُوفي.\"\n\n#. (stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:4\nmsgid \"%1 sent you files\"\nmsgstr \"لَقَد أرسَلَ %1 مَلَفَّاتٍ إليك\"\n\n#. (stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:8\nmsgid \"%1 used your invitation to send you files:\"\nmsgstr \"لَقَد اِستَخدَمَ %1 دَعوَتَكَ لإرسالِ المَلَفَّاتِ إليك:\"\n\n#: lib/Lufi/Controller/Invitation.pm:159 lib/Lufi/Controller/Invitation.pm:84 themes/default/templates/invitations/my_invitations.html.ep:51 themes/default/templates/invitations/my_invitations.html.ep:52 themes/default/templates/invitations/my_invitations.html.ep:53 themes/default/templates/invitations/notification_files_sent.mail.ep:12\nmsgid \"%A %d %B %Y at %T\"\nmsgstr \"%A %d %B %Y عَلَى %T\"\n\n#: themes/default/templates/partial/index.js.ep:27\nmsgid \"(max size: XXX)\"\nmsgstr \"(الحَجمُ الأقصَى: XXX)\"\n\n#: themes/default/templates/index.html.ep:5\nmsgid \"1 year\"\nmsgstr \"سَنَةٌ واحِدَةٌ\"\n\n#: themes/default/templates/index.html.ep:4 themes/default/templates/index.html.ep:65\nmsgid \"24 hours\"\nmsgstr \"زَمَن 24 ساعَة\"\n\n#: themes/default/templates/partial/mail.js.ep:40\nmsgid \":\"\nmsgstr \":\"\n\n#: themes/default/templates/render.html.ep:42\nmsgid \"Abort\"\nmsgstr \"إجهَاض\"\n\n#: themes/default/templates/layouts/default.html.ep:53 themes/default/templates/layouts/default.html.ep:86\nmsgid \"About\"\nmsgstr \"حَول\"\n\n#: themes/default/templates/index.html.ep:107\nmsgid \"Add a password to file(s)\"\nmsgstr \"إضافَةُ كَلِمَةُ مُرُورٍ إلى المَلَفَّات\"\n\n#: themes/default/templates/mail.html.ep:16\nmsgid \"\"\n\"Adding URLs not related to this Lufi instance to the mail body or subject is \"\n\"prohibited.\"\nmsgstr \"\"\n\"يُمنَعُ إضافَةُ رابِط غَيرُ مُرتَبِطٍ بِمَثِيلِ Lufi هَذَا فِي نَصِّ البَريدِ\"\n\" أو مَوضُوعِه.\"\n\n#: themes/default/templates/partial/invitations.js.ep:3\nmsgid \"Are you sure you want to delete the selected invitations?\"\nmsgstr \"هَل أنتَ مُتَأكِّدٌ مِن رَغبَتِكَ فِي حَذفِ الدَّعَواتِ المُحَدَّدَة؟\"\n\n#: themes/default/templates/partial/invitations.js.ep:4\nmsgid \"\"\n\"Are you sure you want to resend the invitation mail for the selected \"\n\"invitations?\"\nmsgstr \"\"\n\"هَل أنتَ مُتَأكِّدٌ مِن رَغبَتِكَ فِي إعادَةِ إرسالِ الدَّعَوَة البَريديَّة \"\n\"لِلدَعَوَات المُحَدَّدَة؟\"\n\n#: themes/default/templates/about.html.ep:17\nmsgid \"\"\n\"As Lufi is a free software licensed under of the terms of the <a href=\"\n\"\\\"https://gnu.org/licenses/agpl.html\\\" class=\\\"classic\\\">AGPLv3</a>, you can \"\n\"install it on you own server. Have a look on the <a href=\\\"https://framagit.\"\n\"org/luc/lufi/wikis/home\\\" class=\\\"classic\\\">Wiki</a> for the procedure.\"\nmsgstr \"\"\n\n#. (stash('nbslices')\n#: themes/default/templates/partial/render.js.ep:9\nmsgid \"Asking for file part XX1 of %1\"\nmsgstr \"يَجري طَلَبُ جُزءِ المَلَفّ XX1 مِن %1\"\n\n#: themes/default/templates/about.html.ep:20\nmsgid \"Back to homepage\"\nmsgstr \"العَودَةُ إلى الصَّفحَةِ الرَّئِيسَة\"\n\n#: lib/Lufi/Controller/Mail.pm:25\nmsgid \"Bad CSRF token!\"\nmsgstr \"رَمزُ CSRF غَيرُ صَالِح!\"\n\n#: lib/Lufi/Controller/Auth.pm:27 lib/Lufi/Controller/Auth.pm:49\nmsgid \"Bad CSRF token.\"\nmsgstr \"رَمزُ CSRF غَيرُ صَالِح.\"\n\n#: themes/default/templates/partial/render.js.ep:5\nmsgid \"Click here to refresh the page and restart the download.\"\nmsgstr \"اِضغَط لِتَحدِيثِ الصَّفحَة وَإِعادَةِ التَّنزِيل.\"\n\n#: themes/default/templates/invitations/invite.mail.ep:8\nmsgid \"Click on the following URL to upload files on Lufi:\"\nmsgstr \"اِضغَط عَلَى عُنوَانِ URL التَّالِي قَصدُ رَفعِ مَلَفَّاتٍ عَلَى لوفي:\"\n\n#: themes/default/templates/index.html.ep:126\nmsgid \"Click to open the file browser\"\nmsgstr \"اِضغَط لِفَتحِ مُتَصَفِّحِ المَلَفَّات\"\n\n#: themes/default/templates/delays.html.ep:38 themes/default/templates/invitations/my_invitations.html.ep:80\nmsgid \"Close\"\nmsgstr \"إغلاق\"\n\n#: themes/default/templates/mail.html.ep:23\nmsgid \"Comma-separated email addresses\"\nmsgstr \"عَنَاوِينُ البَريدِ الإلكتُرونِيِّ مُقَسَّمَةٌ-بِفَوَاصِلِ\"\n\n#: themes/default/templates/index.html.ep:140\nmsgid \"Compressing zip file…\"\nmsgstr \"يَجري ضَغطُ مَلَفِّ zip…\"\n\n#: themes/default/templates/partial/index.js.ep:15\nmsgid \"Copy all links to clipboard\"\nmsgstr \"نَسخُ جَميعِ الرَّوابِطِ إلى الحافِظَة\"\n\n#: themes/default/templates/partial/index.js.ep:18\nmsgid \"Copy to clipboard\"\nmsgstr \"النَّسخُ إلى الحافِظَة\"\n\n#: lib/Lufi/Controller/Files.pm:507\nmsgid \"Could not delete the file. You are not authenticated.\"\nmsgstr \"يَتَعَذَّرُ حَذفُ المَلَفّ. أَنتَ غَيرُ مُصَدَّق.\"\n\n#: lib/Lufi/Controller/Files.pm:489\nmsgid \"Could not find the file. Are you sure of the URL and the token?\"\nmsgstr \"\"\n\"يَتَعَذَّرُ حَذفُ المَلَفّ. هَل أنتَ مُتَأَكِّدٌ مِن عُنوانِ URL وَالرَّمز؟\"\n\n#: lib/Lufi/Controller/Files.pm:400\nmsgid \"Could not find the file. Are you sure of the URL?\"\nmsgstr \"\"\n\"يَتَعَذَّرُ العُثُورُ عَلَى المَلَفّ. هَل أنتَ مُتَأَكِّدٌ مِن عُنوانِ URL؟\"\n\n#: themes/default/templates/files.html.ep:29\nmsgid \"Counter\"\nmsgstr \"العَدَّاد\"\n\n#: themes/default/templates/index.html.ep:100\nmsgid \"Create a zip archive with the files before uploading?\"\nmsgstr \"إنشاءُ أرشيفِ zip مِنَ المَلَفَّاتِ قَبلَ الرَّفع؟\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:26\nmsgid \"Created at\"\nmsgstr \"أُنشِئ فِي\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:14\nmsgid \"Delete\"\nmsgstr \"حَذف\"\n\n#: themes/default/templates/files.html.ep:30 themes/default/templates/index.html.ep:90\nmsgid \"Delete at first download?\"\nmsgstr \"الحَذفُ عِندَ أوَّلِ تَنزيل؟\"\n\n#: themes/default/templates/files.html.ep:19\nmsgid \"Delete selected files\"\nmsgstr \"حَذفُ المَلَفَّاتِ المُحَدَّدَة\"\n\n#: themes/default/templates/files.html.ep:33 themes/default/templates/partial/index.js.ep:19\nmsgid \"Deletion link\"\nmsgstr \"رابِطُ الحَذف\"\n\n#: themes/default/templates/delays.html.ep:8\nmsgid \"\"\n\"Don't worry: if a user begins to download the file before the expiration and \"\n\"the download ends after the expiration, he will be able to get the file.\"\nmsgstr \"\"\n\"لا تَقلَق: إذا بَدَأ المُستخدِمُ فِي تَنزيلِ المَلَفِّ قَبلَ اِنتِهاءِ \"\n\"الصَّلاحِيَّة ثُمَّ اِنتَهَى التَّنزِيلُ بَعدَ اِنتِهاءِ الصَّلاحِيَّة، \"\n\"فَسَوفَ يَكُونُ قادِرًا عَلَى الحُصُولِ عَلَى المَلَفّ.\"\n\n#: themes/default/templates/partial/index.js.ep:21 themes/default/templates/render.html.ep:28\nmsgid \"Download\"\nmsgstr \"تَنزِيل\"\n\n#: themes/default/templates/partial/render.js.ep:4\nmsgid \"Download aborted.\"\nmsgstr \"أُجهِضَ التَّنزيل.\"\n\n#: themes/default/templates/files.html.ep:28 themes/default/templates/partial/index.js.ep:20\nmsgid \"Download link\"\nmsgstr \"رابِط التَّنزيل\"\n\n#: themes/default/templates/about.html.ep:10\nmsgid \"\"\n\"Drag and drop files in the appropriate area or use the traditional way to \"\n\"send files and the files will be chunked, encrypted and sent to the server. \"\n\"You will get two links per file: a download link, that you give to the \"\n\"people you want to share the file with and a deletion link, allowing you to \"\n\"delete the file whenever you want.\"\nmsgstr \"\"\n\"اسحب الملفات إلى الحقل المخصص لذلك أو حدد ملفًا بطريقة كلاسيكية وسيتم قص \"\n\"الملفات إلى أجزاء مشفرة وإرسالها إلى الخادم. ستحصل على روابط لكل ملف: رابط \"\n\"للتنزيل ورابط لحذف الملف عند الحاجة لذلك.\"\n\n#: themes/default/templates/index.html.ep:122\nmsgid \"Drop files here\"\nmsgstr \"اِرمِ المَلَفَّاتَ هُنَا\"\n\n#: themes/default/templates/invitations/invite.html.ep:40\nmsgid \"Email address of your guest\"\nmsgstr \"عنوان البريد الإلكتروني لضيفك\"\n\n#: themes/default/templates/mail.html.ep:39\nmsgid \"Email body\"\nmsgstr \"مضمون الرسالة الإلكترونية\"\n\n#: themes/default/templates/mail.html.ep:31\nmsgid \"Email subject\"\nmsgstr \"موضوع الرسالة الإلكترونية\"\n\n#: themes/default/templates/mail.html.ep:25 themes/default/templates/mail.html.ep:27\nmsgid \"Emails\"\nmsgstr \"عناوين البريد الإلكترونية\"\n\n#: themes/default/templates/partial/index.js.ep:22\nmsgid \"Encrypting part XX1 of XX2\"\nmsgstr \"تعمية الجزء XX1 مِن XX2\"\n\n#: lib/Lufi/Controller/Files.pm:289\nmsgid \"Error: the file existed but was deleted.\"\nmsgstr \"خطأ: لقد كان الملف موجودا بالفعل و لكن تم حذفه.\"\n\n#: lib/Lufi/Controller/Files.pm:369\nmsgid \"Error: the file has not been sent entirely.\"\nmsgstr \"خطأ: لم يتم إرسال الملف كاملا.\"\n\n#: lib/Lufi/Controller/Files.pm:379\nmsgid \"Error: unable to find the file. Are you sure of your URL?\"\nmsgstr \"خطأ: غير قادر على العثور على الملف. هل أنت متأكد من العنوان؟\"\n\n#: themes/default/templates/partial/index.js.ep:23\nmsgid \"Expiration:\"\nmsgstr \"تاريخ نهاية الصلاحية:\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:27\nmsgid \"Expire at\"\nmsgstr \"تنتهي صلاحيتها في\"\n\n#: themes/default/templates/files.html.ep:32\nmsgid \"Expires at\"\nmsgstr \"تنتهي صلاحيته في\"\n\n#: themes/default/templates/files.html.ep:12\nmsgid \"Export localStorage data\"\nmsgstr \"تصدير بيانات localStorage\"\n\n#: lib/Lufi/Controller/Files.pm:471\nmsgid \"File deleted\"\nmsgstr \"تم حذف الملف\"\n\n#: themes/default/templates/files.html.ep:27\nmsgid \"File name\"\nmsgstr \"اسم الملف\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:61\nmsgid \"Files\"\nmsgstr \"الملفات\"\n\n#: themes/default/templates/index.html.ep:80\nmsgid \"Files deleted at first download\"\nmsgstr \"تم حذف الملفات عند أول تنزيل\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:28\nmsgid \"Files sent at\"\nmsgstr \"تم إرسال الملف في\"\n\n#: themes/default/templates/partial/invitations.js.ep:8\nmsgid \"Files sent in invitation XX1 by XX2\"\nmsgstr \"الملفات المرسلة في الدعوة XX1 بواسطة XX2\"\n\n#: themes/default/templates/partial/render.js.ep:8\nmsgid \"Get the file\"\nmsgstr \"تحصّل على الملف\"\n\n#: themes/default/templates/about.html.ep:18\nmsgid \"\"\n\"Get the source code on <a href=\\\"https://framagit.org/luc/lufi\\\" class=\"\n\"\\\"classic\\\">the official repository</a> or on its <a href=\\\"https://github.\"\n\"com/ldidry/lufi\\\" class=\\\"classic\\\">Github mirror</a>\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:24\nmsgid \"Guest mail\"\nmsgstr \"البريد الإلكتروني للضيف\"\n\n#. (ucfirst(stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:6\nmsgid \"Hello %1,\"\nmsgstr \"سلام %1,\"\n\n#: themes/default/templates/invitations/invite.mail.ep:4\nmsgid \"Hello,\"\nmsgstr \"سلام،\"\n\n#: themes/default/templates/partial/mail.js.ep:35\nmsgid \"Hello,\\\\n\\\\nHere's some files I want to share with you:\\\\n\"\nmsgstr \"السلام،\\\\n\\\\nها هي بعض الملفات التي أحببتُ مشاركتها معك:\\\\n\"\n\n#: themes/default/templates/mail.html.ep:35\nmsgid \"Here's some files\"\nmsgstr \"ها هي بعض الملفات\"\n\n#: themes/default/templates/partial/invitations.js.ep:7\nmsgid \"Hide hidden invitations\"\nmsgstr \"اخف الدعوات المخفية\"\n\n#: themes/default/templates/partial/index.js.ep:25\nmsgid \"Hit Enter, then Ctrl+C to copy all the download links\"\nmsgstr \"اضغط على Enter، ثم Ctrl+C لنسخ جميع روابط التحميل\"\n\n#: themes/default/templates/partial/index.js.ep:24\nmsgid \"Hit Enter, then Ctrl+C to copy the download link\"\nmsgstr \"اضغط على Enter، ثم Ctrl+C لنسخ رابط التحميل\"\n\n#: themes/default/templates/about.html.ep:9\nmsgid \"How does it work?\"\nmsgstr \"كيف يعمل؟\"\n\n#: themes/default/templates/invitations/invite.html.ep:46\nmsgid \"How many days would you like the invitation to be valid?\"\nmsgstr \"ما هي مدة صلاحية الدعوة بالأيام؟\"\n\n#: themes/default/templates/about.html.ep:16\nmsgid \"How to install the software on my server?\"\nmsgstr \"كيف يمكنني تثبيت البرنامج على خادومي؟\"\n\n#: themes/default/templates/about.html.ep:12\nmsgid \"How to report an illegal file?\"\nmsgstr \"كيف يمكن الإبلاغ عن ملف غير قانوني؟\"\n\n#: themes/default/templates/delays.html.ep:7\nmsgid \"If you choose a delay, the file will be deleted after that delay.\"\nmsgstr \"إذا قمت باختيار تأخير، سيتم حذف الملف بعد ذلك التأخير.\"\n\n#: themes/default/templates/mail.html.ep:15\nmsgid \"\"\n\"If you send the mail from this server, the links will be sent to the server, \"\n\"which may lower your privacy protection.\"\nmsgstr \"\"\n\"إذا قمت بإرسال البريد من هذا الخادوم، سيتم إرسال الروابط إلى الخادم، الأمر \"\n\"الذي يمكن أن يقلل من حماية خصوصيتك.\"\n\n#: themes/default/templates/files.html.ep:14\nmsgid \"Import localStorage data\"\nmsgstr \"استيراد بيانات localStorage\"\n\n#: themes/default/templates/index.html.ep:53\nmsgid \"Important: more information on delays\"\nmsgstr \"هام: مزيد من المعلومات عن التأخير\"\n\n#: themes/default/templates/delays.html.ep:5\nmsgid \"Information about delays\"\nmsgstr \"معلومات حول التأخير\"\n\n#: themes/default/templates/files.html.ep:18 themes/default/templates/invitations/my_invitations.html.ep:12\nmsgid \"Invert selection\"\nmsgstr \"عكس الاختيار\"\n\n#. ($i->guest_mail, $url)\n#: lib/Lufi/Controller/Invitation.pm:171\nmsgid \"Invitation resent to %1.<br> URL: %2\"\nmsgstr \"تم إعادة إرسال الدعوة إلى %1.<br> الرابط: %2\"\n\n#. ($invitation->guest_mail, $url)\n#: lib/Lufi/Controller/Invitation.pm:87\nmsgid \"Invitation sent to %1.<br> URL: %2\"\nmsgstr \"تم إرسال الدعوة إلى %1.<br> الرابط: %2\"\n\n#: themes/default/templates/invitations/invite.html.ep:27 themes/default/templates/layouts/default.html.ep:36 themes/default/templates/layouts/default.html.ep:69\nmsgid \"Invite a guest\"\nmsgstr \"أدع ضيفا\"\n\n#: themes/default/templates/partial/render.js.ep:6\nmsgid \"\"\n\"It seems that the key in your URL is incorrect. Please, verify your URL.\"\nmsgstr \"\"\n\"ويبدو أن المفتاح في عنوان URL الخاص بك غير صحيح. الرجاء تحقق من عنوان رابطك.\"\n\n#: themes/default/templates/index.html.ep:12\nmsgid \"Javascript is disabled. You won't be able to use Lufi.\"\nmsgstr \"الجافا سكريبت غير مفعل. ليس بإمكانك استخدام لوفي Lufi.\"\n\n#: themes/default/templates/layouts/default.html.ep:44 themes/default/templates/layouts/default.html.ep:46 themes/default/templates/layouts/default.html.ep:77 themes/default/templates/layouts/default.html.ep:79\nmsgid \"Language\"\nmsgstr \"اللغة\"\n\n#: themes/default/templates/login.html.ep:15\nmsgid \"Login\"\nmsgstr \"تسجيل الدخول\"\n\n#: themes/default/templates/layouts/default.html.ep:58 themes/default/templates/layouts/default.html.ep:91\nmsgid \"Logout\"\nmsgstr \"الخروج\"\n\n#: themes/default/templates/about.html.ep:4\nmsgid \"Lufi is a free (as in free speech) file hosting software.\"\nmsgstr \"\"\n\"لوفي أو Lufi برنامج حر (كما هو الحال في حرية التعبير) لاستضافة الملفات.\"\n\n#: themes/default/templates/partial/files.js.ep:12\nmsgid \"\"\n\"Lufi recently changed its way to store files information.\\\\n\\\\nNo files have \"\n\"been found in the new localStorage location but we found files in the old \"\n\"one.\\\\nDo you want to import those informations?\\\\n\\\\nPlease note that this \"\n\"is the only time that we will ask you this.\"\nmsgstr \"\"\n\"Lufi مؤاخرا غير طريقه تخزين معلومات الملفات\\\\n\"\n\"\\\\n\"\n\"لم يتم العثور على ملفات في موقع التخزين المحلي الجديد ولكننا وجدنا ملفات في \"\n\"الموقع القديم.\\\\n\"\n\"هل تريد استيراد تلك المعلومات؟\\\\n\"\n\"\\\\n\"\n\"يرجى ملاحظة أن هذه هي المرة الوحيدة التي سنطلب فيها منك ذلك.\"\n\n#: themes/default/templates/files.html.ep:34\nmsgid \"Mail\"\nmsgstr \"البريد\"\n\n#: themes/default/templates/files.html.ep:3 themes/default/templates/layouts/default.html.ep:34 themes/default/templates/layouts/default.html.ep:67\nmsgid \"My files\"\nmsgstr \"ملفاتي\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:5 themes/default/templates/layouts/default.html.ep:37 themes/default/templates/layouts/default.html.ep:70\nmsgid \"My invitations\"\nmsgstr \"دعواتي\"\n\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:17\nmsgid \"\"\n\"NB: this list includes the list of files that have already been sent to you.\"\nmsgstr \"ملاحظة: هذه القائمة تتضمن قائمة الملفات التي أرسِلت إليك.\"\n\n#: themes/default/templates/index.html.ep:115\nmsgid \"Name of the zip file\"\nmsgstr \"اسم الملف المضغوط zip\"\n\n#. (format_bytes($json->{size})\n#: lib/Lufi/Controller/Files.pm:108\nmsgid \"No enough space available on the server for this file (size: %1).\"\nmsgstr \"لا توجد مساحة كافية متوفرة على السيرفر لاستضافة الملف (الحجم: %1).\"\n\n#: themes/default/templates/partial/files.js.ep:10 themes/default/templates/partial/index.js.ep:28\nmsgid \"No expiration delay\"\nmsgstr \"دون تاريخ لنهاية الصلاحية\"\n\n#: themes/default/templates/files.html.ep:8\nmsgid \"\"\n\"Only the files sent with this browser will be listed here. This list is \"\n\"stored in localStorage: if you delete your localStorage data, you'll lose \"\n\"this list.\"\nmsgstr \"\"\n\"سيتم سرد الملفات المرسلة باستخدام هذا المتصفح فقط هنا. يتم تخزين هذه القائمة \"\n\"في التخزين المحلي: إذا قمت بحذف بيانات التخزين المحلية ، فستفقد هذه القائمة.\"\n\n#: themes/default/templates/index.html.ep:106 themes/default/templates/login.html.ep:21 themes/default/templates/render.html.ep:26\nmsgid \"Password\"\nmsgstr \"الكلمة السرية\"\n\n#. (config('contact')\n#: themes/default/templates/about.html.ep:13\nmsgid \"Please contact the administrator: %1\"\nmsgstr \"يرجى الاتصال بالمدير: %1\"\n\n#: themes/default/templates/render.html.ep:33\nmsgid \"\"\n\"Please wait while we are getting your file. We first need to download and \"\n\"decrypt all parts before you can get it.\"\nmsgstr \"\"\n\"يرجى الانتظار من فضلكم حتى نحصل على ملفكم. نحتاج أولا تنزيل وفك تشفير كل \"\n\"الأجزاء قبل أن تتمكنوا مِن الحصول عليه.\"\n\n#: lib/Lufi/Controller/Auth.pm:38\nmsgid \"\"\n\"Please, check your credentials or your right to access this service: unable \"\n\"to authenticate.\"\nmsgstr \"\"\n\"من فضلك ، تحقق من بيناتك أو حقك في الوصول إلى هذه الخدمة: غير قادر على \"\n\"التحقق.\"\n\n#: themes/default/templates/about.html.ep:5\nmsgid \"Privacy\"\nmsgstr \"الخصوصية\"\n\n#: themes/default/templates/files.html.ep:13\nmsgid \"Purge expired files from localStorage\"\nmsgstr \"تطهير الملفات منتهية الصلاحية من مساحة التخزين المحلية\"\n\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:20\nmsgid \"Regards,\"\nmsgstr \"تحياتي،\"\n\n#: themes/default/templates/invitations/invite.mail.ep:15\nmsgid \"Regards.\"\nmsgstr \"تحياتي.\"\n\n#: themes/default/templates/layouts/default.html.ep:31 themes/default/templates/layouts/default.html.ep:64\nmsgid \"Report file\"\nmsgstr \"الإبلاغ عن ملف\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:15\nmsgid \"Resend invitation mail\"\nmsgstr \"أعد إرسال رسالة الدعوة\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:9\nmsgid \"Rows in purple mean that the invitations have expired.\"\nmsgstr \"الصفوف باللون الأرجواني تعني أن الدعوات انتهت صلاحيتها.\"\n\n#: themes/default/templates/files.html.ep:9\nmsgid \"\"\n\"Rows in red mean that the files have expired and are no longer available.\"\nmsgstr \"تعني الأعمدة باللون الأحمر انتهاء صلاحية الملفات وأنها لم تعد متوفرة.\"\n\n#: themes/default/templates/partial/index.js.ep:26\nmsgid \"Send all links by email\"\nmsgstr \"إرسال كافة الروابط عبر البريد الإلكتروني\"\n\n#: themes/default/templates/invitations/invite.html.ep:50\nmsgid \"Send the invitation\"\nmsgstr \"ابعث الدعوة\"\n\n#: themes/default/templates/mail.html.ep:46\nmsgid \"Send with this server\"\nmsgstr \"إرسال عبر هذا الخادوم\"\n\n#: themes/default/templates/mail.html.ep:47\nmsgid \"Send with your own mail software\"\nmsgstr \"إرسال باستخدام برنامج البريد الخاص بك\"\n\n#: themes/default/templates/partial/index.js.ep:29\nmsgid \"\"\n\"Sending part XX1 of XX2. Please, be patient, the progress bar can take a \"\n\"while to move.\"\nmsgstr \"\"\n\"إرسال الجزء XX1 من XX2. يرجى التحلي بالصبر ، قد يستغرق شريط التقدم بعض الوقت \"\n\"للتحرك.\"\n\n#. (url_for('/')\n#: themes/default/templates/partial/mail.js.ep:48\nmsgid \"Share your files in total privacy on %1\"\nmsgstr \"شارك ملفاتك بخصوصية تامة على %1\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:13 themes/default/templates/partial/invitations.js.ep:9\nmsgid \"Show hidden invitations\"\nmsgstr \"أظهر الدعوات المخفية\"\n\n#: themes/default/templates/partial/render.js.ep:11\nmsgid \"Show zip content\"\nmsgstr \"أظهر محتوى الملف المضغوط zip\"\n\n#: themes/default/templates/layouts/default.html.ep:40 themes/default/templates/layouts/default.html.ep:73 themes/default/templates/login.html.ep:28 themes/default/templates/logout.html.ep:17\nmsgid \"Signin\"\nmsgstr \"تسجيل الدخول\"\n\n#: lib/Lufi/Controller/Invitation.pm:283 themes/default/templates/invitations/exception.html.ep:16\nmsgid \"\"\n\"Sorry, the invitation doesn’t exist. Are you sure you are on the right URL?\"\nmsgstr \"آسف ، الدعوة غير موجودة. هل أنت متأكد مِن صحة العنوان؟\"\n\n#: themes/default/templates/index.html.ep:46\nmsgid \"Sorry, the uploading is currently disabled. Please try again later.\"\nmsgstr \"عذراً، التحميل معطل حاليا. يرجى إعادة المحاولة لاحقًا.\"\n\n#: lib/Lufi/Controller/Files.pm:82\nmsgid \"Sorry, uploading is disabled.\"\nmsgstr \"عذرًا ، التحميل معطل.\"\n\n#: themes/default/templates/invitations/exception.html.ep:7\nmsgid \"Sorry, your invitation has expired or has been deleted.\"\nmsgstr \"المعذرة، إنّ دعوتك منتهية الصلاحية أو تم حذفها.\"\n\n#. ($invit->ldap_user_mail)\n#: lib/Lufi/Controller/Files.pm:122\nmsgid \"\"\n\"Sorry, your invitation has expired or has been deleted. Please contact %1 to \"\n\"have another invitation.\"\nmsgstr \"\"\n\"المعذرة ، لقد انتهت مدة صلاحية دعوتك أو قد تم حذفها. الرجاء الاتصال بـ %1 \"\n\"للحصول على دعوة أخرى.\"\n\n#. ($invitation->ldap_user_mail)\n#: lib/Lufi/Controller/Invitation.pm:276\nmsgid \"The URLs of your files have been sent by email to %1.\"\nmsgstr \"لقد تم إرسال روابط ملفاتك بالبريد الإلكتروني إلى %1.\"\n\n#: themes/default/templates/about.html.ep:7\nmsgid \"\"\n\"The administrator can only see the file's name, its size and its mimetype \"\n\"(what kind of file it is: video, text, etc.).\"\nmsgstr \"\"\n\"يمكن للمدير رؤية اسم الملف فقط ، وحجمه ونوع الملف (أي نوع من الملفات هو: \"\n\"فيديو ، نص ، وما إلى ذلك).).\"\n\n#: lib/Lufi/Controller/Mail.pm:53\nmsgid \"\"\n\"The body of the mail must contain at least one URL pointing to a file hosted \"\n\"on this instance.\"\nmsgstr \"\"\n\"يجب أن يحتوي نص البريد على رابط واحد على الأقل يشير إلى ملف مستضاف على هذا \"\n\"السيرفر.\"\n\n#: themes/default/templates/partial/files.js.ep:11\nmsgid \"The data has been successfully imported.\"\nmsgstr \"تم استيراد البيانات بنجاح.\"\n\n#: lib/Lufi/Controller/Mail.pm:73\nmsgid \"The email body can't be empty.\"\nmsgstr \"لا يمكن أن يُترك مضمون الرسالة فارغًا.\"\n\n#: lib/Lufi/Controller/Mail.pm:72\nmsgid \"The email subject can't be empty.\"\nmsgstr \"لا يمكن أن يُترك موضوع الرسالة فارغًا.\"\n\n#. ($expire_at, $max_expire_at)\n#: lib/Lufi/Controller/Invitation.pm:51\nmsgid \"The expiration delay (%1) is not between 1 and %2 days.\"\nmsgstr \"مدة انتهاء الصلاحية (%1) ليس محصور بين 1 و %2 أيام.\"\n\n#: lib/Lufi/Controller/Files.pm:468\nmsgid \"The file has already been deleted\"\nmsgstr \"لقد تم حذف الملف مِن قبلُ\"\n\n#: themes/default/templates/about.html.ep:6\nmsgid \"\"\n\"The files uploaded on a Lufi instance are encrypted before the upload to the \"\n\"server: the administrator of the server can not see the file's content.\"\nmsgstr \"\"\n\"يتم تشفير الملفات التي يتم تحميلها على خادوم لوفي قبل تحميلها على الخادم: لا \"\n\"يمكن لمدير الخادم الإطلاع على محتوى الملف.\"\n\n#. (join(', ', @bad)\n#: lib/Lufi/Controller/Mail.pm:68\nmsgid \"The following email addresses are not valid: %1\"\nmsgstr \"عناوين البريد الإلكترونية التالية غير صحيحة: %1\"\n\n#. ($guest_mail)\n#: lib/Lufi/Controller/Invitation.pm:48\nmsgid \"The guest email address (%1) is unvalid.\"\nmsgstr \"عنوان البريد الإلكتروني للضيف (%1) غير صالح..\"\n\n#. ($i->token, $i->guest_mail)\n#: lib/Lufi/Controller/Invitation.pm:150\nmsgid \"\"\n\"The invitation %1 can’t be resent: %2 has already sent files.<br>Please \"\n\"create a new invitation.\"\nmsgstr \"\"\n\"لا يمكن إعادة إرسال الدعوة %1: لقد أرسل %2 ملفات بالفعل. <br> الرجاء إنشاء \"\n\"دعوة جديدة.\"\n\n#. ($i->token)\n#: lib/Lufi/Controller/Invitation.pm:130\nmsgid \"The invitation %1 has been deleted.\"\nmsgstr \"لقد تم حذف الدعوة %1.\"\n\n#. (stash('user_mail')\n#: themes/default/templates/invitations/invite.html.ep:34\nmsgid \"The invitation mail will be send from your email address (%1).\"\nmsgstr \"سيتم إرسال بريد الدعوة من عنوان بريدك الإلكتروني (%1).\"\n\n#: themes/default/templates/partial/index.js.ep:16\nmsgid \"The link(s) has been copied to your clipboard\"\nmsgstr \"لقد تم نسخ الرابط أو الروابط إلى الحافظة\"\n\n#. (stash('invitation')\n#: themes/default/templates/index.html.ep:30\nmsgid \"\"\n\"The link(s) of your file(s) will automatically be sent by mail to %1 (%2)\"\nmsgstr \"سيتم إرسال الرابط (الروابط) لملفاتك تلقائيًا عن طريق البريد إلى %1 (%2)\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:11\nmsgid \"The links of your file(s) will automatically be sent by mail to %1.\"\nmsgstr \"\"\n\"سيتم إرسال الارتباط (الارتباطات) لملفاتك تلقائيًا عن طريق البريد إلى %1.\"\n\n#: lib/Lufi/Controller/Mail.pm:97\nmsgid \"The mail has been sent.\"\nmsgstr \"لقد تم إرسال الرسالة الإلكترونية.\"\n\n#: themes/default/templates/about.html.ep:15\nmsgid \"\"\n\"The original (and only for now) author is <a href=\\\"https://fiat-tux.fr\\\" \"\n\"class=\\\"classic\\\">Luc Didry</a>.\"\nmsgstr \"\"\n\"المؤلف الأصلي (إلى غاية الآن) هو <a href=\\\"https://fiat-tux.fr\\\" class=\"\n\"\\\"classic\\\">Luc Didry</a>.\"\n\n#: lib/Lufi/Controller/Files.pm:236\nmsgid \"\"\n\"The server was unable to find the file record to add your file part to. \"\n\"Please, contact the administrator.\"\nmsgstr \"\"\n\"لم يتمكن الخادم من العثور على سجل الملف لإضافة جزء ملفك إليه. من فضلك، تواصل \"\n\"بالمسؤول.\"\n\n#: lib/Lufi/Controller/Files.pm:295\nmsgid \"\"\n\"This file has been deactivated by the admins. Contact them to know why.\"\nmsgstr \"لقد تم تعطيل الملف من طرف المشرفين. الرجاء الإتصال بهم لمعرفة السبب.\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:46 themes/default/templates/partial/invitations.js.ep:6\nmsgid \"This invitation is normally hidden\"\nmsgstr \"الدعوة مخفية بشكل عادي\"\n\n#. (stash('expires')\n#: themes/default/templates/invitations/invite.mail.ep:13\nmsgid \"This invitation is valid until %1.\"\nmsgstr \"هذه الدعوة صالحة إلى غاية %1.\"\n\n#: themes/default/templates/delays.html.ep:10\nmsgid \"\"\n\"This server sets limitations according to the file size. The expiration \"\n\"delay of your file will be the minimum between what you choose and the \"\n\"following limitations:\"\nmsgstr \"\"\n\"يضع هذا الخادم قيودًا وفقًا لحجم الملف. سيكون تأخير انتهاء صلاحية ملفك هو \"\n\"الحد الأدنى بين ما تختاره والقيود التالية:\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:16\nmsgid \"Toggle visibility\"\nmsgstr \"تبديل الرؤية\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:25\nmsgid \"URL\"\nmsgstr \"الرابط\"\n\n#: themes/default/templates/partial/index.js.ep:17\nmsgid \"Unable to copy the link(s) to your clipboard\"\nmsgstr \"تعذر نسخ كافة الروابط إلى الحافظة\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:439\nmsgid \"\"\n\"Unable to get counter for %1. The file does not exists. It will be removed \"\n\"from your localStorage.\"\nmsgstr \"\"\n\"تعذّر الحصول على عداد لـ %1. الملف غير موجود. ستتم إزالته من localStorage.\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:429\nmsgid \"Unable to get counter for %1. The token is invalid.\"\nmsgstr \"لا يمكن جلب عداد %1. إن الرمز غير صالح.\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:449\nmsgid \"Unable to get counter for %1. You are not authenticated.\"\nmsgstr \"لا يمكن جلب عداد %1. إنك لم تقم بتسجيل الدخول.\"\n\n#: themes/default/templates/layouts/default.html.ep:33 themes/default/templates/layouts/default.html.ep:66\nmsgid \"Upload files\"\nmsgstr \"إرسال ملفات\"\n\n#: themes/default/templates/index.html.ep:145\nmsgid \"Upload generated zip file\"\nmsgstr \"حمّل الملف المضغوط الذي تم توليده\"\n\n#: themes/default/templates/files.html.ep:31\nmsgid \"Uploaded at\"\nmsgstr \"أرسِل بتاريخ\"\n\n#: themes/default/templates/index.html.ep:153\nmsgid \"Uploaded files\"\nmsgstr \"الملفات المُرسَلة\"\n\n#: themes/default/templates/partial/index.js.ep:30\nmsgid \"Websocket communication error\"\nmsgstr \"خطأ في اتصال ويب سوكيت\"\n\n#: themes/default/templates/about.html.ep:3\nmsgid \"What is Lufi?\"\nmsgstr \"ماذا نعني بـ لوفي Lufi؟\"\n\n#: themes/default/templates/about.html.ep:14\nmsgid \"Who wrote this software?\"\nmsgstr \"من قام بتطوير هذا البرنامج؟\"\n\n#: themes/default/templates/partial/index.js.ep:13\nmsgid \"XXX file has been added to upload queue.\"\nmsgstr \"تم إضافة الملف XXX إلى قائمة الإنتظار للتحميل.\"\n\n#: themes/default/templates/invitations/invite.html.ep:30\nmsgid \"\"\n\"You can invite someone to send you files through this Lufi instance even if \"\n\"they don’t have an account on it.\"\nmsgstr \"\"\n\"يمكنك دعوة شخص ما لإرسال الملفات إليك من خلال سيرفر Lufi هذا حتى إذا لم يكن \"\n\"لديه حساب عليه.\"\n\n#: themes/default/templates/about.html.ep:11\nmsgid \"\"\n\"You can see the list of your files by clicking on the \\\"My files\\\" link at \"\n\"the top right of this page.\"\nmsgstr \"\"\n\"يمكنك عرض قائمة ملفاتك عن طريق النقر على وصلة \\\"ملفاتي\\\" في الجزء العلوي \"\n\"الأيمن من هذه الصفحة.\"\n\n#: lib/Lufi/Controller/Mail.pm:42\nmsgid \"You can't add URLs that are not related to this instance.\"\nmsgstr \"لا يمكنك إضافة روابط غير مرتبطة بهذا السيرفر.\"\n\n#: themes/default/templates/about.html.ep:8\nmsgid \"\"\n\"You don't need to register yourself to upload files but be aware that, for \"\n\"legal reasons, your IP address will be stored when you send a file. Don't \"\n\"panic, this is normally the case for all sites on which you send files.\"\nmsgstr \"\"\n\"لا تحتاج إلى تسجيل نفسك لإرسال ملفات ولكن انتبه إلى أنه، لأسباب قانونية، \"\n\"سيتم تخزين عنوان IP الخاص بك عندما تقوم بإرسال ملف. لا داعي للقلق فهذا شيء \"\n\"عادي ينطبق على جميع المواقع التي توفر خدمة إرسال الملفات.\"\n\n#: themes/default/templates/partial/render.js.ep:10\nmsgid \"\"\n\"You don't seem to have a key in your URL. You won't be able to decrypt the \"\n\"file. Download canceled.\"\nmsgstr \"\"\n\"يبدو أنك لا تملك مفتاحًا في الرابط الخاص بك. لن تتمكن من فك تشفير الملف. تم \"\n\"إلغاء التنزيل.\"\n\n#: themes/default/templates/partial/render.js.ep:7\nmsgid \"\"\n\"You have attempted to leave this page. The download will be canceled. Are \"\n\"you sure?\"\nmsgstr \"\"\n\"لقد حاولتَ ترك هذه الصفحة. سيتم إلغاء تنزيل الملف الذي أنت بصدد تنزيله. هل \"\n\"أنت متأكد؟\"\n\n#: themes/default/templates/partial/index.js.ep:14\nmsgid \"\"\n\"You have attempted to leave this page. The upload will be canceled. Are you \"\n\"sure?\"\nmsgstr \"\"\n\"لقد حاولتَ ترك هذه الصفحة. سيتم إلغاء إرسال لملف الذي أنت بصدد تحميله. هل \"\n\"أنت متأكد؟\"\n\n#: themes/default/templates/logout.html.ep:14\nmsgid \"You have been successfully logged out.\"\nmsgstr \"لقد تم تسجيل خروجك بنجاح.\"\n\n#: lib/Lufi/Controller/Mail.pm:71\nmsgid \"You must give email addresses.\"\nmsgstr \"يجب إدخال عناوين للبريد الإلكتروني.\"\n\n#: themes/default/templates/index.html.ep:38\nmsgid \"\"\n\"Your browser does not have enough entropy to generate a strong encryption \"\n\"key. Please wait (it's better if you do things on your computer while \"\n\"waiting).\"\nmsgstr \"لا يحتوي متصفحك على قدر كافٍ من الإنتروبيا لإنشاء مفتاح تشفير قوي.\"\n\n#. (format_bytes($json->{size})\n#: lib/Lufi/Controller/Files.pm:95\nmsgid \"Your file is too big: %1 (maximum size allowed: %2)\"\nmsgstr \"الملف كبير جدًا: %1 (الحد الأقصى المسموح به للحجم هو: %2)\"\n\n#: lib/Lufi/Controller/Files.pm:351\nmsgid \"Your password is not valid. Please refresh the page to retry.\"\nmsgstr \"الكلمة السرية غير صالحة. يرجى تحديث الصفحة لإعادة المحاولة.\"\n\n#: themes/default/templates/partial/render.js.ep:12\nmsgid \"Zip content:\"\nmsgstr \"محتوى ملف Zip المضغوط:\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:20\nmsgid \"between %1 and %2, the file will be kept %3 day(s).\"\nmsgstr \"بين %1 و %2، سيتم الاحتفاظ بالملف %1 يوم (أيام).\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:22\nmsgid \"between %1 and %2, the file will be kept forever.\"\nmsgstr \"بين %1 و%2 ، سيتم الاحتفاظ بالملف إلى الأبد.\"\n\n#: themes/default/templates/partial/mail.js.ep:42\nmsgid \"deadline: \"\nmsgstr \"آخر أجل: \"\n\n#: themes/default/templates/partial/invitations.js.ep:5\nmsgid \"expires on XXX\"\nmsgstr \"منتهية صلاحيتها في XXX\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:26\nmsgid \"for %1 and more, the file will be kept %2 day(s)\"\nmsgstr \"ل%1 والمزيد ، سيتم الاحتفاظ بالملف %2 يوم (أيام)\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:28\nmsgid \"for %1 and more, the file will be kept forever.\"\nmsgstr \"ل%1 والمزيد ، سيتم الاحتفاظ بالملف إلى الأبد.\"\n\n#: themes/default/templates/index.html.ep:3\nmsgid \"no time limit\"\nmsgstr \"بلا حدود\"\n\n#: themes/default/templates/index.html.ep:124\nmsgid \"or\"\nmsgstr \"أو\"\n\n#. ($e->{name}, format_bytes($e->{size})\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:12\nmsgid \"— %1 (%2), that will expire on %3\"\nmsgstr \"— %1 (%2)، ستنتهي صلاحيته في %3\"\n\n#: themes/default/templates/about.html.ep:18\nmsgid \"Get the source code on <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi\\\" class=\\\"classic\\\">the official repository</a> or on its <a href=\\\"https://github.com/ldidry/lufi\\\" class=\\\"classic\\\">Github mirror</a>\"\nmsgstr \"\"\n\"احصل علي الكود من <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/\"\n\"lufi\\\" class=\\\"classic\\\"> المستودع الرسمي </a> او من <a href=\\\"\"\n\"https://github.com/ldidry/lufi\\\" class=\\\"classic\\\"> Github </a>\"\n\n#: themes/default/templates/partial/index.js.ep:24\nmsgid \"File uploaded\"\nmsgstr \"تم رفع الملف\"\n\n#: themes/default/templates/partial/render.js.ep:9\nmsgid \"File downloaded\"\nmsgstr \"تم تنزيل الملف\"\n\n#: themes/default/templates/about.html.ep:17\nmsgid \"As Lufi is a free software licensed under of the terms of the <a href=\\\"https://gnu.org/licenses/agpl.html\\\" class=\\\"classic\\\">AGPLv3</a>, you can install it on you own server. Have a look on the <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi/wikis/home\\\" class=\\\"classic\\\">Wiki</a> for the procedure.\"\nmsgstr \"\"\n\"بِما أنَّ لوفي هُوَ بَرنامَجٌ حُرٌّ مُرَخَصٌّ بِمُوجَبِ شُرُوطِ <a href=\"\n\"\\\"https://gnu.org/licenses/agpl.html\\\" class=\\\"classic\\\">AGPLv3</a> يُمكِنُكَ\"\n\" تَثبيته عَلَى خادِمِكَ الخاصّ. ألق نَظرَةً عَلَى <a href=\\\"https://framagit.\"\n\"org/fiat-tux/hat-softwares/lufi/wikis/home\\\" class=\\\"classic\\\">الويكي</a> \"\n\"لِفِعلِ ذَلِك.\"\n\n#: themes/default/templates/about.html.ep:20\nmsgid \"Version\"\nmsgstr \"الإصدار\"\n\n#. (sprintf('<a href=\"https://framagit.org/fiat-tux/hat-softwares/lufi/-/releases/%s\" class=\"classic\">%s</a>', stash('version')\n#: themes/default/templates/about.html.ep:21\nmsgid \"Latest tag of this instance: %1\"\nmsgstr \"آخر علامة على مثيل الخادم هذا: %1\"\n\n#. (sprintf('<a href=\"https://framagit.org/fiat-tux/hat-softwares/lufi/-/commit/%s\" class=\"classic\">%s</a>', stash('version')\n#: themes/default/templates/about.html.ep:22\nmsgid \"Latest commit of this instance: %1\"\nmsgstr \"آخر مراجعة على مثيل الخادم هذا: %1\"\n\n#: themes/default/templates/partial/render.js.ep:13\nmsgid \"Unable to download the file: too much unsuccessful attempts to open a websocket. Please, contact the administrator.\"\nmsgstr \"\"\n\"استحالة تنزيل الملف: العديد من المحاولات غير الناجحة لفتح websocket. الرجاء \"\n\"الاتصال بالمدير.\"\n"
  },
  {
    "path": "themes/default/lib/Lufi/I18N/br.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\\n\"\n\"PO-Revision-Date: 2023-11-23 12:06+0000\\n\"\n\"Last-Translator: Ewen <darempred@korr.bzh>\\n\"\n\"Language-Team: Breton <https://weblate.framasoft.org/projects/lufi/\"\n\"default-theme/br/>\\n\"\n\"Language: br\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=5; plural=(n % 10 == 1 && n % 100 != 11 && n % 100 != \"\n\"71 && n % 100 != 91) ? 0 : ((n % 10 == 2 && n % 100 != 12 && n % 100 != 72 \"\n\"&& n % 100 != 92) ? 1 : ((((n % 10 == 3 || n % 10 == 4) || n % 10 == 9) && (\"\n\"n % 100 < 10 || n % 100 > 19) && (n % 100 < 70 || n % 100 > 79) && (n % 100 \"\n\"< 90 || n % 100 > 99)) ? 2 : ((n != 0 && n % 1000000 == 0) ? 3 : 4)));\\n\"\n\"X-Generator: Weblate 5.2\\n\"\n\n#. ($delay)\n#. (max_delay)\n#: themes/default/templates/index.html.ep:56 themes/default/templates/index.html.ep:65 themes/default/templates/index.html.ep:66\nmsgid \"%1 days\"\nmsgstr \"%1 devezh\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:2\nmsgid \"%1 invites you to send him/her files\"\nmsgstr \"Pedet oc'h gant %1 da gas dezhi/dezhañ oh fichennaoueg\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:6\nmsgid \"%1 invites you to send him/her files through Lufi.\"\nmsgstr \"Pedet oc'h gant %1 da gas dezhi/dezhañ oh fichennaoueg dre Lufi.\"\n\n#. (stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:4\nmsgid \"%1 sent you files\"\nmsgstr \"%1 o deus kaset deoc'h fichennaouegoù\"\n\n#. (stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:8\nmsgid \"%1 used your invitation to send you files:\"\nmsgstr \"Implijet eo bet oh pedadenn gant %1 :\"\n\n#: lib/Lufi/Controller/Invitation.pm:172 lib/Lufi/Controller/Invitation.pm:85 themes/default/templates/invitations/my_invitations.html.ep:51 themes/default/templates/invitations/my_invitations.html.ep:52 themes/default/templates/invitations/my_invitations.html.ep:53 themes/default/templates/invitations/notification_files_sent.mail.ep:12\nmsgid \"%A %d %B %Y at %T\"\nmsgstr \"%A %d %B %Y da %T\"\n\n#: themes/default/templates/partial/index.js.ep:28\nmsgid \"(max size: XXX)\"\nmsgstr \"(pouezh maks : XXX)\"\n\n#: themes/default/templates/index.html.ep:5\nmsgid \"1 year\"\nmsgstr \"1 bloazh\"\n\n#: themes/default/templates/index.html.ep:4 themes/default/templates/index.html.ep:65\nmsgid \"24 hours\"\nmsgstr \"24 eur\"\n\n#: themes/default/templates/partial/mail.js.ep:40\nmsgid \":\"\nmsgstr \":\"\n\n#: themes/default/templates/render.html.ep:42\nmsgid \"Abort\"\nmsgstr \"Nullañ\"\n\n#: themes/default/templates/layouts/default.html.ep:53 themes/default/templates/layouts/default.html.ep:86\nmsgid \"About\"\nmsgstr \"Diwar benn\"\n\n#: themes/default/templates/index.html.ep:107\nmsgid \"Add a password to file(s)\"\nmsgstr \"Ouzhpenn ur ger kuzh d'ho fichennaoueg(où)\"\n\n#: themes/default/templates/mail.html.ep:16\nmsgid \"Adding URLs not related to this Lufi instance to the mail body or subject is prohibited.\"\nmsgstr \"\"\n\"Ouzhpennañ liammoù diliam gant al lec'hienn Lufi-mañ e-barzh sujed pe korf \"\n\"oh mail a zo difennet.\"\n\n#: themes/default/templates/partial/invitations.js.ep:3\nmsgid \"Are you sure you want to delete the selected invitations?\"\nmsgstr \"Ah sur oc'h dilemel ar pedadennoù choazet ?\"\n\n#: themes/default/templates/partial/invitations.js.ep:4\nmsgid \"Are you sure you want to resend the invitation mail for the selected invitations?\"\nmsgstr \"Ah sur oc'h adkas ho mail pediñ evit ar pedadenn choazet ?\"\n\n#: themes/default/templates/about.html.ep:17\nmsgid \"As Lufi is a free software licensed under of the terms of the <a href=\\\"https://gnu.org/licenses/agpl.html\\\" class=\\\"classic\\\">AGPLv3</a>, you can install it on you own server. Have a look on the <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi/wikis/home\\\" class=\\\"classic\\\">Wiki</a> for the procedure.\"\nmsgstr \"\"\n\"Lufi a zo ur poellad frank diwar aotre-implijout an <a href=\\\"https://gnu.\"\n\"org/licenses/agpl.html\\\" class=\\\"classic\\\">AGPLv3</a>, posubl eo deoc'h \"\n\"staliañ anezhañ war oh servijer. Kit war omp <a href=\\\"https://framagit.org/\"\n\"fiat-tux/hat-softwares/lufi/wikis/home\\\" class=\\\"classic\\\">Wiki</a> da \"\n\"wellout penaos.\"\n\n#. (stash('nbslices')\n#: themes/default/templates/partial/render.js.ep:10\nmsgid \"Asking for file part XX1 of %1\"\nmsgstr \"Oh goulenn evit ar fichennaoueg lodenn XX1 diwar %1\"\n\n#: themes/default/templates/about.html.ep:23\nmsgid \"Back to homepage\"\nmsgstr \"Distro war ar bajenn degemer\"\n\n#: lib/Lufi/Controller/Mail.pm:26\nmsgid \"Bad CSRF token!\"\nmsgstr \"Token CSRF fall !\"\n\n#: lib/Lufi/Controller/Auth.pm:27 lib/Lufi/Controller/Auth.pm:49\nmsgid \"Bad CSRF token.\"\nmsgstr \"Token CSRF fall.\"\n\n#: themes/default/templates/partial/render.js.ep:5\nmsgid \"Click here to refresh the page and restart the download.\"\nmsgstr \"Klik amañ da adkarg ar bajenn ha krog ar pellgargañ adare.\"\n\n#: themes/default/templates/invitations/invite.mail.ep:8\nmsgid \"Click on the following URL to upload files on Lufi:\"\nmsgstr \"Klik war al liammoù dindan da gas fichennaouegoù gant Lufi :\"\n\n#: themes/default/templates/index.html.ep:126\nmsgid \"Click to open the file browser\"\nmsgstr \"Klik da zigor an ergerzher fichennoù\"\n\n#: themes/default/templates/delays.html.ep:42 themes/default/templates/invitations/my_invitations.html.ep:80\nmsgid \"Close\"\nmsgstr \"Seriñ\"\n\n#: themes/default/templates/mail.html.ep:23\nmsgid \"Comma-separated email addresses\"\nmsgstr \"Mailoù dispartiet gant virgulennoù\"\n\n#: themes/default/templates/index.html.ep:140\nmsgid \"Compressing zip file…\"\nmsgstr \"Gwaskañ en ur zip fichenn…\"\n\n#: themes/default/templates/partial/index.js.ep:15\nmsgid \"Copy all links to clipboard\"\nmsgstr \"Kopiañ holl ar liammoù d'ar gwask-paper\"\n\n#: themes/default/templates/partial/index.js.ep:18\nmsgid \"Copy to clipboard\"\nmsgstr \"Kopiañ d'ar gwask-paper\"\n\n#: lib/Lufi/Controller/Files.pm:501\nmsgid \"Could not delete the file. You are not authenticated.\"\nmsgstr \"N'eo ket be posubl dilemel ar fichenn. N'och ket luget.\"\n\n#: lib/Lufi/Controller/Files.pm:483\nmsgid \"Could not find the file. Are you sure of the URL and the token?\"\nmsgstr \"Ne oa ket posubl kavout ar fichenn. Ah sur oc'h eus oh liamm ha token ?\"\n\n#: lib/Lufi/Controller/Files.pm:394\nmsgid \"Could not find the file. Are you sure of the URL?\"\nmsgstr \"Ne oa ket posubl kavout ar fichenn. Ah sur oc'h eus oh liamm ?\"\n\n#: themes/default/templates/files.html.ep:29\nmsgid \"Counter\"\nmsgstr \"Kont\"\n\n#: themes/default/templates/index.html.ep:100\nmsgid \"Create a zip archive with the files before uploading?\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:26\nmsgid \"Created at\"\nmsgstr \"Krouet d'an/d'ar\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:14\nmsgid \"Delete\"\nmsgstr \"Dilemel\"\n\n#: themes/default/templates/files.html.ep:30 themes/default/templates/index.html.ep:90\nmsgid \"Delete at first download?\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:19\nmsgid \"Delete selected files\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:33 themes/default/templates/partial/index.js.ep:19\nmsgid \"Deletion link\"\nmsgstr \"\"\n\n#: themes/default/templates/delays.html.ep:9\nmsgid \"Don't worry: if a user begins to download the file before the expiration and the download ends after the expiration, he will be able to get the file.\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/index.js.ep:21 themes/default/templates/render.html.ep:28\nmsgid \"Download\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/render.js.ep:4\nmsgid \"Download aborted.\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:28 themes/default/templates/partial/index.js.ep:20\nmsgid \"Download link\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:10\nmsgid \"Drag and drop files in the appropriate area or use the traditional way to send files and the files will be chunked, encrypted and sent to the server. You will get two links per file: a download link, that you give to the people you want to share the file with and a deletion link, allowing you to delete the file whenever you want.\"\nmsgstr \"\"\n\n#: themes/default/templates/index.html.ep:122\nmsgid \"Drop files here\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/invite.html.ep:40\nmsgid \"Email address of your guest\"\nmsgstr \"\"\n\n#: themes/default/templates/mail.html.ep:39\nmsgid \"Email body\"\nmsgstr \"\"\n\n#: themes/default/templates/mail.html.ep:31\nmsgid \"Email subject\"\nmsgstr \"\"\n\n#: themes/default/templates/mail.html.ep:25 themes/default/templates/mail.html.ep:27\nmsgid \"Emails\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/index.js.ep:22\nmsgid \"Encrypting part XX1 of XX2\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Files.pm:283\nmsgid \"Error: the file existed but was deleted.\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Files.pm:363\nmsgid \"Error: the file has not been sent entirely.\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Files.pm:373\nmsgid \"Error: unable to find the file. Are you sure of your URL?\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/index.js.ep:23\nmsgid \"Expiration:\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:27\nmsgid \"Expire at\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:32\nmsgid \"Expires at\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:12\nmsgid \"Export localStorage data\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Files.pm:465\nmsgid \"File deleted\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/render.js.ep:9\nmsgid \"File downloaded\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:27\nmsgid \"File name\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/index.js.ep:24\nmsgid \"File uploaded\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:61\nmsgid \"Files\"\nmsgstr \"\"\n\n#: themes/default/templates/index.html.ep:80\nmsgid \"Files deleted at first download\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:28\nmsgid \"Files sent at\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/invitations.js.ep:8\nmsgid \"Files sent in invitation XX1 by XX2\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/render.js.ep:8\nmsgid \"Get the file\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:18\nmsgid \"Get the source code on <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi\\\" class=\\\"classic\\\">the official repository</a> or on its <a href=\\\"https://github.com/ldidry/lufi\\\" class=\\\"classic\\\">Github mirror</a>\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:24\nmsgid \"Guest mail\"\nmsgstr \"\"\n\n#. (ucfirst(stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:6\nmsgid \"Hello %1,\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/invite.mail.ep:4\nmsgid \"Hello,\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/mail.js.ep:35\nmsgid \"Hello,\\\\n\\\\nHere's some files I want to share with you:\\\\n\"\nmsgstr \"\"\n\n#: themes/default/templates/mail.html.ep:35\nmsgid \"Here's some files\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/invitations.js.ep:7\nmsgid \"Hide hidden invitations\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/index.js.ep:26\nmsgid \"Hit Enter, then Ctrl+C to copy all the download links\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/index.js.ep:25\nmsgid \"Hit Enter, then Ctrl+C to copy the download link\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:9\nmsgid \"How does it work?\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/invite.html.ep:46\nmsgid \"How many days would you like the invitation to be valid?\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:16\nmsgid \"How to install the software on my server?\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:12\nmsgid \"How to report an illegal file?\"\nmsgstr \"\"\n\n#: themes/default/templates/delays.html.ep:8\nmsgid \"If you choose a delay, the file will be deleted after that delay.\"\nmsgstr \"\"\n\n#: themes/default/templates/mail.html.ep:15\nmsgid \"If you send the mail from this server, the links will be sent to the server, which may lower your privacy protection.\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:14\nmsgid \"Import localStorage data\"\nmsgstr \"\"\n\n#: themes/default/templates/index.html.ep:53\nmsgid \"Important: more information on delays\"\nmsgstr \"\"\n\n#: themes/default/templates/delays.html.ep:5\nmsgid \"Information about delays\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:18 themes/default/templates/invitations/my_invitations.html.ep:12\nmsgid \"Invert selection\"\nmsgstr \"\"\n\n#. ($i->guest_mail, $url)\n#: lib/Lufi/Controller/Invitation.pm:184\nmsgid \"Invitation resent to %1.<br> URL: %2\"\nmsgstr \"\"\n\n#. ($invitation->guest_mail, $url)\n#: lib/Lufi/Controller/Invitation.pm:88\nmsgid \"Invitation sent to %1.<br> URL: %2\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/invite.html.ep:27 themes/default/templates/layouts/default.html.ep:36 themes/default/templates/layouts/default.html.ep:69\nmsgid \"Invite a guest\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/render.js.ep:6\nmsgid \"It seems that the key in your URL is incorrect. Please, verify your URL.\"\nmsgstr \"\"\n\n#: themes/default/templates/index.html.ep:12\nmsgid \"Javascript is disabled. You won't be able to use Lufi.\"\nmsgstr \"\"\n\n#: themes/default/templates/layouts/default.html.ep:44 themes/default/templates/layouts/default.html.ep:46 themes/default/templates/layouts/default.html.ep:77 themes/default/templates/layouts/default.html.ep:79\nmsgid \"Language\"\nmsgstr \"\"\n\n#. (sprintf('<a href=\"https://framagit.org/fiat-tux/hat-softwares/lufi/-/commit/%s\" class=\"classic\">%s</a>', stash('version')\n#: themes/default/templates/about.html.ep:22\nmsgid \"Latest commit of this instance: %1\"\nmsgstr \"\"\n\n#. (sprintf('<a href=\"https://framagit.org/fiat-tux/hat-softwares/lufi/-/releases/%s\" class=\"classic\">%s</a>', stash('version')\n#: themes/default/templates/about.html.ep:21\nmsgid \"Latest tag of this instance: %1\"\nmsgstr \"\"\n\n#: themes/default/templates/login.html.ep:15\nmsgid \"Login\"\nmsgstr \"\"\n\n#: themes/default/templates/layouts/default.html.ep:58 themes/default/templates/layouts/default.html.ep:91\nmsgid \"Logout\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:4\nmsgid \"Lufi is a free (as in free speech) file hosting software.\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/files.js.ep:12\nmsgid \"Lufi recently changed its way to store files information.\\\\n\\\\nNo files have been found in the new localStorage location but we found files in the old one.\\\\nDo you want to import those informations?\\\\n\\\\nPlease note that this is the only time that we will ask you this.\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:34\nmsgid \"Mail\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:3 themes/default/templates/layouts/default.html.ep:34 themes/default/templates/layouts/default.html.ep:67\nmsgid \"My files\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:5 themes/default/templates/layouts/default.html.ep:37 themes/default/templates/layouts/default.html.ep:70\nmsgid \"My invitations\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:17\nmsgid \"NB: this list includes the list of files that have already been sent to you.\"\nmsgstr \"\"\n\n#: themes/default/templates/index.html.ep:115\nmsgid \"Name of the zip file\"\nmsgstr \"\"\n\n#. (format_bytes($json->{size})\n#: lib/Lufi/Controller/Files.pm:109\nmsgid \"No enough space available on the server for this file (size: %1).\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/files.js.ep:10 themes/default/templates/partial/index.js.ep:29\nmsgid \"No expiration delay\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:8\nmsgid \"Only the files sent with this browser will be listed here. This list is stored in localStorage: if you delete your localStorage data, you'll lose this list.\"\nmsgstr \"\"\n\n#: themes/default/templates/index.html.ep:106 themes/default/templates/login.html.ep:21 themes/default/templates/render.html.ep:26\nmsgid \"Password\"\nmsgstr \"\"\n\n#. (config('contact')\n#: themes/default/templates/about.html.ep:13\nmsgid \"Please contact the administrator: %1\"\nmsgstr \"\"\n\n#: themes/default/templates/render.html.ep:33\nmsgid \"Please wait while we are getting your file. We first need to download and decrypt all parts before you can get it.\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Auth.pm:38\nmsgid \"Please, check your credentials or your right to access this service: unable to authenticate.\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:5\nmsgid \"Privacy\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:13\nmsgid \"Purge expired files from localStorage\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:20\nmsgid \"Regards,\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/invite.mail.ep:15\nmsgid \"Regards.\"\nmsgstr \"\"\n\n#: themes/default/templates/layouts/default.html.ep:31 themes/default/templates/layouts/default.html.ep:64\nmsgid \"Report file\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:15\nmsgid \"Resend invitation mail\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:9\nmsgid \"Rows in purple mean that the invitations have expired.\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:9\nmsgid \"Rows in red mean that the files have expired and are no longer available.\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/index.js.ep:27\nmsgid \"Send all links by email\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/invite.html.ep:50\nmsgid \"Send the invitation\"\nmsgstr \"\"\n\n#: themes/default/templates/mail.html.ep:47\nmsgid \"Send with this server\"\nmsgstr \"\"\n\n#: themes/default/templates/mail.html.ep:49\nmsgid \"Send with your own mail software\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/index.js.ep:30\nmsgid \"Sending part XX1 of XX2. Please, be patient, the progress bar can take a while to move.\"\nmsgstr \"\"\n\n#. (url_for('/')\n#: themes/default/templates/partial/mail.js.ep:49\nmsgid \"Share your files in total privacy on %1\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:13 themes/default/templates/partial/invitations.js.ep:9\nmsgid \"Show hidden invitations\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/render.js.ep:12\nmsgid \"Show zip content\"\nmsgstr \"\"\n\n#: themes/default/templates/layouts/default.html.ep:40 themes/default/templates/layouts/default.html.ep:73 themes/default/templates/login.html.ep:28 themes/default/templates/logout.html.ep:17\nmsgid \"Signin\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Invitation.pm:302 themes/default/templates/invitations/exception.html.ep:16\nmsgid \"Sorry, the invitation doesn’t exist. Are you sure you are on the right URL?\"\nmsgstr \"\"\n\n#: themes/default/templates/index.html.ep:46\nmsgid \"Sorry, the uploading is currently disabled. Please try again later.\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Files.pm:82\nmsgid \"Sorry, uploading is disabled.\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/exception.html.ep:7\nmsgid \"Sorry, your invitation has expired or has been deleted.\"\nmsgstr \"\"\n\n#. ($invit->ldap_user_mail)\n#: lib/Lufi/Controller/Files.pm:123\nmsgid \"Sorry, your invitation has expired or has been deleted. Please contact %1 to have another invitation.\"\nmsgstr \"\"\n\n#. ($invitation->ldap_user_mail)\n#: lib/Lufi/Controller/Invitation.pm:295\nmsgid \"The URLs of your files have been sent by email to %1.\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:7\nmsgid \"The administrator can only see the file's name, its size and its mimetype (what kind of file it is: video, text, etc.).\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Mail.pm:67\nmsgid \"The body of the mail must contain at least one URL pointing to a file hosted on this instance.\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/files.js.ep:11\nmsgid \"The data has been successfully imported.\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Mail.pm:87\nmsgid \"The email body can't be empty.\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Mail.pm:86\nmsgid \"The email subject can't be empty.\"\nmsgstr \"\"\n\n#. ($expire_at, $max_expire_at)\n#: lib/Lufi/Controller/Invitation.pm:52\nmsgid \"The expiration delay (%1) is not between 1 and %2 days.\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Files.pm:462\nmsgid \"The file has already been deleted\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:6\nmsgid \"The files uploaded on a Lufi instance are encrypted before the upload to the server: the administrator of the server can not see the file's content.\"\nmsgstr \"\"\n\n#. (join(', ', @bad)\n#: lib/Lufi/Controller/Mail.pm:82\nmsgid \"The following email addresses are not valid: %1\"\nmsgstr \"\"\n\n#. ($guest_mail)\n#: lib/Lufi/Controller/Invitation.pm:49\nmsgid \"The guest email address (%1) is unvalid.\"\nmsgstr \"\"\n\n#. ($i->token, $c->current_user->{username})\n#: lib/Lufi/Controller/Invitation.pm:136\nmsgid \"The invitation %1 can’t be deleted: it wasn’t created by you (%2).\"\nmsgstr \"\"\n\n#. ($i->token, $i->guest_mail)\n#: lib/Lufi/Controller/Invitation.pm:163\nmsgid \"The invitation %1 can’t be resent: %2 has already sent files.<br>Please create a new invitation.\"\nmsgstr \"\"\n\n#. ($i->token, $c->current_user->{username})\n#: lib/Lufi/Controller/Invitation.pm:187\nmsgid \"The invitation %1 can’t be resent: it wasn’t created by you (%2).\"\nmsgstr \"\"\n\n#. ($i->token)\n#: lib/Lufi/Controller/Invitation.pm:134\nmsgid \"The invitation %1 has been deleted.\"\nmsgstr \"\"\n\n#. (stash('user_mail')\n#: themes/default/templates/invitations/invite.html.ep:34\nmsgid \"The invitation mail will be send from your email address (%1).\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/index.js.ep:16\nmsgid \"The link(s) has been copied to your clipboard\"\nmsgstr \"\"\n\n#. (stash('invitation')\n#: themes/default/templates/index.html.ep:30\nmsgid \"The link(s) of your file(s) will automatically be sent by mail to %1 (%2)\"\nmsgstr \"\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:11\nmsgid \"The links of your file(s) will automatically be sent by mail to %1.\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Mail.pm:111\nmsgid \"The mail has been sent.\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:15\nmsgid \"The original (and only for now) author is <a href=\\\"https://fiat-tux.fr\\\" class=\\\"classic\\\">Luc Didry</a>.\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Files.pm:230\nmsgid \"The server was unable to find the file record to add your file part to. Please, contact the administrator.\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Files.pm:289\nmsgid \"This file has been deactivated by the admins. Contact them to know why.\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:46 themes/default/templates/partial/invitations.js.ep:6\nmsgid \"This invitation is normally hidden\"\nmsgstr \"\"\n\n#. (stash('expires')\n#: themes/default/templates/invitations/invite.mail.ep:13\nmsgid \"This invitation is valid until %1.\"\nmsgstr \"\"\n\n#: themes/default/templates/delays.html.ep:13\nmsgid \"This server sets limitations according to the file size. The expiration delay of your file will be the minimum between what you choose and the following limitations:\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:16\nmsgid \"Toggle visibility\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:25\nmsgid \"URL\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/index.js.ep:17\nmsgid \"Unable to copy the link(s) to your clipboard\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/render.js.ep:13\nmsgid \"Unable to download the file: too much unsuccessful attempts to open a websocket. Please, contact the administrator.\"\nmsgstr \"\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:433\nmsgid \"Unable to get counter for %1. The file does not exists. It will be removed from your localStorage.\"\nmsgstr \"\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:423\nmsgid \"Unable to get counter for %1. The token is invalid.\"\nmsgstr \"\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:443\nmsgid \"Unable to get counter for %1. You are not authenticated.\"\nmsgstr \"\"\n\n#: themes/default/templates/layouts/default.html.ep:33 themes/default/templates/layouts/default.html.ep:66\nmsgid \"Upload files\"\nmsgstr \"\"\n\n#: themes/default/templates/index.html.ep:145\nmsgid \"Upload generated zip file\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:31\nmsgid \"Uploaded at\"\nmsgstr \"\"\n\n#: themes/default/templates/index.html.ep:153\nmsgid \"Uploaded files\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:20\nmsgid \"Version\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/index.js.ep:31\nmsgid \"Websocket communication error\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:3\nmsgid \"What is Lufi?\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:14\nmsgid \"Who wrote this software?\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/index.js.ep:13\nmsgid \"XXX file has been added to upload queue.\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/invite.html.ep:30\nmsgid \"You can invite someone to send you files through this Lufi instance even if they don’t have an account on it.\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:11\nmsgid \"You can see the list of your files by clicking on the \\\"My files\\\" link at the top right of this page.\"\nmsgstr \"\"\n\n#. ($orig_uri)\n#: lib/Lufi/Controller/Mail.pm:43 lib/Lufi/Controller/Mail.pm:59\nmsgid \"You can't add URLs that are not related to this instance (%1).\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:8\nmsgid \"You don't need to register yourself to upload files but be aware that, for legal reasons, your IP address will be stored when you send a file. Don't panic, this is normally the case for all sites on which you send files.\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/render.js.ep:11\nmsgid \"You don't seem to have a key in your URL. You won't be able to decrypt the file. Download canceled.\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/render.js.ep:7\nmsgid \"You have attempted to leave this page. The download will be canceled. Are you sure?\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/index.js.ep:14\nmsgid \"You have attempted to leave this page. The upload will be canceled. Are you sure?\"\nmsgstr \"\"\n\n#: themes/default/templates/logout.html.ep:14\nmsgid \"You have been successfully logged out.\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Mail.pm:85\nmsgid \"You must give email addresses.\"\nmsgstr \"\"\n\n#: themes/default/templates/index.html.ep:38\nmsgid \"Your browser does not have enough entropy to generate a strong encryption key. Please wait (it's better if you do things on your computer while waiting).\"\nmsgstr \"\"\n\n#. (format_bytes($json->{size})\n#: lib/Lufi/Controller/Files.pm:95\nmsgid \"Your file is too big: %1 (maximum size allowed: %2)\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Files.pm:345\nmsgid \"Your password is not valid. Please refresh the page to retry.\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/render.js.ep:14\nmsgid \"Zip content:\"\nmsgstr \"\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:24\nmsgid \"between %1 and %2, the file will be kept %3 day(s).\"\nmsgstr \"\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:26\nmsgid \"between %1 and %2, the file will be kept forever.\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/mail.js.ep:42\nmsgid \"deadline: \"\nmsgstr \"\"\n\n#: themes/default/templates/partial/invitations.js.ep:5\nmsgid \"expires on XXX\"\nmsgstr \"\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:30\nmsgid \"for %1 and more, the file will be kept %2 day(s)\"\nmsgstr \"\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:32\nmsgid \"for %1 and more, the file will be kept forever.\"\nmsgstr \"\"\n\n#: themes/default/templates/index.html.ep:3\nmsgid \"no time limit\"\nmsgstr \"\"\n\n#: themes/default/templates/index.html.ep:124\nmsgid \"or\"\nmsgstr \"\"\n\n#. ($e->{name}, format_bytes($e->{size})\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:12\nmsgid \"— %1 (%2), that will expire on %3\"\nmsgstr \"\"\n"
  },
  {
    "path": "themes/default/lib/Lufi/I18N/ca.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.\n# xd <xdrudis@tinet.cat>, 2017.\n# Luc Didry <luc@framasoft.org>, 2018. #zanata\n# Quentí, 2018. #zanata\n# Luc Didry <luc@framasoft.org>, 2019. #zanata\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\\n\"\n\"PO-Revision-Date: 2020-03-22 18:29+0000\\n\"\n\"Last-Translator: Luc Didry <luc@framasoft.org>\\n\"\n\"Language-Team: Catalan <https://weblate.framasoft.org/projects/lufi/\"\n\"default-theme/ca/>\\n\"\n\"Language: ca\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=n != 1;\\n\"\n\"X-Generator: Weblate 3.11.2\\n\"\n\n#. ($delay)\n#. (max_delay)\n#: themes/default/templates/index.html.ep:56 themes/default/templates/index.html.ep:65 themes/default/templates/index.html.ep:66\nmsgid \"%1 days\"\nmsgstr \"%1 dies\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:2\nmsgid \"%1 invites you to send him/her files\"\nmsgstr \"\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:6\nmsgid \"%1 invites you to send him/her files through Lufi.\"\nmsgstr \"\"\n\n#. (stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:4\nmsgid \"%1 sent you files\"\nmsgstr \"\"\n\n#. (stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:8\nmsgid \"%1 used your invitation to send you files:\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Invitation.pm:159 lib/Lufi/Controller/Invitation.pm:84 themes/default/templates/invitations/my_invitations.html.ep:51 themes/default/templates/invitations/my_invitations.html.ep:52 themes/default/templates/invitations/my_invitations.html.ep:53 themes/default/templates/invitations/notification_files_sent.mail.ep:12\nmsgid \"%A %d %B %Y at %T\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/index.js.ep:27\nmsgid \"(max size: XXX)\"\nmsgstr \"(mida max: XXX)\"\n\n#: themes/default/templates/index.html.ep:5\nmsgid \"1 year\"\nmsgstr \"1 any\"\n\n#: themes/default/templates/index.html.ep:4 themes/default/templates/index.html.ep:65\nmsgid \"24 hours\"\nmsgstr \"24 hores\"\n\n#: themes/default/templates/partial/mail.js.ep:40\nmsgid \":\"\nmsgstr \":\"\n\n#: themes/default/templates/render.html.ep:42\nmsgid \"Abort\"\nmsgstr \"Avorta\"\n\n#: themes/default/templates/layouts/default.html.ep:53 themes/default/templates/layouts/default.html.ep:86\nmsgid \"About\"\nmsgstr \"Quant a\"\n\n#: themes/default/templates/index.html.ep:107\nmsgid \"Add a password to file(s)\"\nmsgstr \"Afegir una contrasenya al(s) fitxer(s)\"\n\n#: themes/default/templates/mail.html.ep:16\nmsgid \"\"\n\"Adding URLs not related to this Lufi instance to the mail body or subject is \"\n\"prohibited.\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/invitations.js.ep:3\nmsgid \"Are you sure you want to delete the selected invitations?\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/invitations.js.ep:4\nmsgid \"\"\n\"Are you sure you want to resend the invitation mail for the selected \"\n\"invitations?\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:17\nmsgid \"\"\n\"As Lufi is a free software licensed under of the terms of the <a href=\"\n\"\\\"https://gnu.org/licenses/agpl.html\\\" class=\\\"classic\\\">AGPLv3</a>, you can \"\n\"install it on you own server. Have a look on the <a href=\\\"https://framagit.\"\n\"org/luc/lufi/wikis/home\\\" class=\\\"classic\\\">Wiki</a> for the procedure.\"\nmsgstr \"\"\n\"Com que Lufi és programari lliure, autoritzat sota els termes de l'<a href=\"\n\"\\\"https://gnu.org/licenses/agpl.html\\\" class=\\\"classic\\\">AGPLv3</a>, el \"\n\"podeu instal·lar al vostre propi servidor. Pel que fa a com fer-ho, feu un \"\n\"cop d'ull al <a href=\\\"https://framagit.org/luc/lufi/wikis/home\\\" class=\"\n\"\\\"classic\\\">Wiki</a>.\"\n\n#. (stash('nbslices')\n#: themes/default/templates/partial/render.js.ep:9\nmsgid \"Asking for file part XX1 of %1\"\nmsgstr \"Demanem la part XX1 de %1 del fitxer\"\n\n#: themes/default/templates/about.html.ep:20\nmsgid \"Back to homepage\"\nmsgstr \"Retorna a la pàgina d'inici\"\n\n#: lib/Lufi/Controller/Mail.pm:25\nmsgid \"Bad CSRF token!\"\nmsgstr \"Mal testimoni CSRF!\"\n\n#: lib/Lufi/Controller/Auth.pm:27 lib/Lufi/Controller/Auth.pm:49\nmsgid \"Bad CSRF token.\"\nmsgstr \"Token CSRF incorrect.\"\n\n#: themes/default/templates/partial/render.js.ep:5\nmsgid \"Click here to refresh the page and restart the download.\"\nmsgstr \"Premeu aquí per tal de refrescar la pàgina i reiniciar la descàrrega.\"\n\n#: themes/default/templates/invitations/invite.mail.ep:8\nmsgid \"Click on the following URL to upload files on Lufi:\"\nmsgstr \"\"\n\n#: themes/default/templates/index.html.ep:126\nmsgid \"Click to open the file browser\"\nmsgstr \"Premeu per obrir el navegador de fitxers\"\n\n#: themes/default/templates/delays.html.ep:38 themes/default/templates/invitations/my_invitations.html.ep:80\nmsgid \"Close\"\nmsgstr \"Tanca\"\n\n#: themes/default/templates/mail.html.ep:23\nmsgid \"Comma-separated email addresses\"\nmsgstr \"Adreces de correu electrònic separades per comes\"\n\n#: themes/default/templates/index.html.ep:140\nmsgid \"Compressing zip file…\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/index.js.ep:15\nmsgid \"Copy all links to clipboard\"\nmsgstr \"Copia tots els enllaços al porta-retalls\"\n\n#: themes/default/templates/partial/index.js.ep:18\nmsgid \"Copy to clipboard\"\nmsgstr \"Copia al porta-retalls\"\n\n#: lib/Lufi/Controller/Files.pm:507\nmsgid \"Could not delete the file. You are not authenticated.\"\nmsgstr \"No es pot esborrar el fitxer. No esteu autenticat.\"\n\n#: lib/Lufi/Controller/Files.pm:489\nmsgid \"Could not find the file. Are you sure of the URL and the token?\"\nmsgstr \"No es troba el fitxer. Esteu segur de la URL i el testimoni?\"\n\n#: lib/Lufi/Controller/Files.pm:400\nmsgid \"Could not find the file. Are you sure of the URL?\"\nmsgstr \"No trobo el fitxer. Esteu segurs de la URL?\"\n\n#: themes/default/templates/files.html.ep:29\nmsgid \"Counter\"\nmsgstr \"Comptador\"\n\n#: themes/default/templates/index.html.ep:100\nmsgid \"Create a zip archive with the files before uploading?\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:26\nmsgid \"Created at\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:14\nmsgid \"Delete\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:30 themes/default/templates/index.html.ep:90\nmsgid \"Delete at first download?\"\nmsgstr \"Eliminar-lo a la primera descàrrega?\"\n\n#: themes/default/templates/files.html.ep:19\nmsgid \"Delete selected files\"\nmsgstr \"Suprimir els fitxers seleccionats\"\n\n#: themes/default/templates/files.html.ep:33 themes/default/templates/partial/index.js.ep:19\nmsgid \"Deletion link\"\nmsgstr \"Enllaç per a eliminació\"\n\n#: themes/default/templates/delays.html.ep:8\nmsgid \"\"\n\"Don't worry: if a user begins to download the file before the expiration and \"\n\"the download ends after the expiration, he will be able to get the file.\"\nmsgstr \"\"\n\"No patiu per si un usuari comença a descarregar el fitxer abans de \"\n\"l'expiració i la descàrrega acaba després de l'expiració, encara podrà \"\n\"obtenir el fitxer.\"\n\n#: themes/default/templates/partial/index.js.ep:21 themes/default/templates/render.html.ep:28\nmsgid \"Download\"\nmsgstr \"Descàrrega\"\n\n#: themes/default/templates/partial/render.js.ep:4\nmsgid \"Download aborted.\"\nmsgstr \"Descàrrega avortada.\"\n\n#: themes/default/templates/files.html.ep:28 themes/default/templates/partial/index.js.ep:20\nmsgid \"Download link\"\nmsgstr \"Enllaç per a descàrrega\"\n\n#: themes/default/templates/about.html.ep:10\nmsgid \"\"\n\"Drag and drop files in the appropriate area or use the traditional way to \"\n\"send files and the files will be chunked, encrypted and sent to the server. \"\n\"You will get two links per file: a download link, that you give to the \"\n\"people you want to share the file with and a deletion link, allowing you to \"\n\"delete the file whenever you want.\"\nmsgstr \"\"\n\"Arrossegueu i deixeu anar fitxers a l'àrea apropiada o useu el sistema \"\n\"tradicional per enviar fitxers, i seran trossejats, xifrats i enviats al \"\n\"servidor. Obtindreu dos enllaços per a cada fitxer: un enllaç per a la \"\n\"descàrrega, que doneu a la gent amb qui voleu compartir el fitxer, i un \"\n\"enllaç per a l'eliminació, que us permet eliminar el fitxer del servidor \"\n\"quan vulgueu.\"\n\n#: themes/default/templates/index.html.ep:122\nmsgid \"Drop files here\"\nmsgstr \"Deixeu anar aquí fitxers\"\n\n#: themes/default/templates/invitations/invite.html.ep:40\nmsgid \"Email address of your guest\"\nmsgstr \"\"\n\n#: themes/default/templates/mail.html.ep:39\nmsgid \"Email body\"\nmsgstr \"Cos del correu electrònic\"\n\n#: themes/default/templates/mail.html.ep:31\nmsgid \"Email subject\"\nmsgstr \"Assumpte del correu electrònic\"\n\n#: themes/default/templates/mail.html.ep:25 themes/default/templates/mail.html.ep:27\nmsgid \"Emails\"\nmsgstr \"correus electrònics\"\n\n#: themes/default/templates/partial/index.js.ep:22\nmsgid \"Encrypting part XX1 of XX2\"\nmsgstr \"S'està xifrant la part XX1 de XX2\"\n\n#: lib/Lufi/Controller/Files.pm:289\nmsgid \"Error: the file existed but was deleted.\"\nmsgstr \"Error: el fitxer existia però va ser eliminat.\"\n\n#: lib/Lufi/Controller/Files.pm:369\nmsgid \"Error: the file has not been sent entirely.\"\nmsgstr \"Error: el fitxer no s'ha enviat del tot.\"\n\n#: lib/Lufi/Controller/Files.pm:379\nmsgid \"Error: unable to find the file. Are you sure of your URL?\"\nmsgstr \"Error: no trobo el fitxer. Esteu segur de la URL ?\"\n\n#: themes/default/templates/partial/index.js.ep:23\nmsgid \"Expiration:\"\nmsgstr \"Expiració:\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:27\nmsgid \"Expire at\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:32\nmsgid \"Expires at\"\nmsgstr \"Expira el\"\n\n#: themes/default/templates/files.html.ep:12\nmsgid \"Export localStorage data\"\nmsgstr \"Exporta dades a l'emmagatzematge local\"\n\n#: lib/Lufi/Controller/Files.pm:471\nmsgid \"File deleted\"\nmsgstr \"Fitxer eliminat\"\n\n#: themes/default/templates/files.html.ep:27\nmsgid \"File name\"\nmsgstr \"Nom de fitxer\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:61\nmsgid \"Files\"\nmsgstr \"\"\n\n#: themes/default/templates/index.html.ep:80\nmsgid \"Files deleted at first download\"\nmsgstr \"Fitxers suprimits a la primera descàrrega\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:28\nmsgid \"Files sent at\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/invitations.js.ep:8\nmsgid \"Files sent in invitation XX1 by XX2\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/render.js.ep:8\nmsgid \"Get the file\"\nmsgstr \"Obté el fitxer\"\n\n#: themes/default/templates/about.html.ep:18\nmsgid \"\"\n\"Get the source code on <a href=\\\"https://framagit.org/luc/lufi\\\" class=\"\n\"\\\"classic\\\">the official repository</a> or on its <a href=\\\"https://github.\"\n\"com/ldidry/lufi\\\" class=\\\"classic\\\">Github mirror</a>\"\nmsgstr \"\"\n\"Obteniu el codi font al <a href=\\\"https://framagit.org/luc/lufi\\\" class=\"\n\"\\\"classic\\\">repositori oficial</a> o a la seva <a href=\\\"https://github.com/\"\n\"ldidry/lufi\\\" class=\\\"classic\\\">rèplica a Github</a>\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:24\nmsgid \"Guest mail\"\nmsgstr \"\"\n\n#. (ucfirst(stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:6\nmsgid \"Hello %1,\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/invite.mail.ep:4\nmsgid \"Hello,\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/mail.js.ep:35\nmsgid \"Hello,\\\\n\\\\nHere's some files I want to share with you:\\\\n\"\nmsgstr \"\"\n\"Hola,\\\\n\"\n\"\\\\n\"\n\"Ve't aquí uns fitxers que vull compartir amb tu:\\\\n\"\n\n#: themes/default/templates/mail.html.ep:35\nmsgid \"Here's some files\"\nmsgstr \"Ve't aquí uns fitxers\"\n\n#: themes/default/templates/partial/invitations.js.ep:7\nmsgid \"Hide hidden invitations\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/index.js.ep:25\nmsgid \"Hit Enter, then Ctrl+C to copy all the download links\"\nmsgstr \"\"\n\"Prem Retorn, i després Ctrl+C per copiar tots els enllaços de descàrrega\"\n\n#: themes/default/templates/partial/index.js.ep:24\nmsgid \"Hit Enter, then Ctrl+C to copy the download link\"\nmsgstr \"Prem Retorn, i després Ctrl+C per copiar l'enllaç de descàrrega\"\n\n#: themes/default/templates/about.html.ep:9\nmsgid \"How does it work?\"\nmsgstr \"Com funciona?\"\n\n#: themes/default/templates/invitations/invite.html.ep:46\nmsgid \"How many days would you like the invitation to be valid?\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:16\nmsgid \"How to install the software on my server?\"\nmsgstr \"Com instal·lo el programari al meu servidor?\"\n\n#: themes/default/templates/about.html.ep:12\nmsgid \"How to report an illegal file?\"\nmsgstr \"Com informo d'un fitxer iŀlegal?\"\n\n#: themes/default/templates/delays.html.ep:7\nmsgid \"If you choose a delay, the file will be deleted after that delay.\"\nmsgstr \"\"\n\"Si seleccioneu una moratòria, el fitxer s'eliminarà passada la moratòria.\"\n\n#: themes/default/templates/mail.html.ep:15\nmsgid \"\"\n\"If you send the mail from this server, the links will be sent to the server, \"\n\"which may lower your privacy protection.\"\nmsgstr \"\"\n\"Si envieu el correu des d'aquest servidor, els enllaços s'enviaran al \"\n\"servidor, i això pot minvar la protecció de la vostra privacitat.\"\n\n#: themes/default/templates/files.html.ep:14\nmsgid \"Import localStorage data\"\nmsgstr \"Importar dades de l'emmagatzematge local\"\n\n#: themes/default/templates/index.html.ep:53\nmsgid \"Important: more information on delays\"\nmsgstr \"Importat: més informació sobre moratòries\"\n\n#: themes/default/templates/delays.html.ep:5\nmsgid \"Information about delays\"\nmsgstr \"Informació sobre moratòries\"\n\n#: themes/default/templates/files.html.ep:18 themes/default/templates/invitations/my_invitations.html.ep:12\nmsgid \"Invert selection\"\nmsgstr \"\"\n\n#. ($i->guest_mail, $url)\n#: lib/Lufi/Controller/Invitation.pm:171\nmsgid \"Invitation resent to %1.<br> URL: %2\"\nmsgstr \"\"\n\n#. ($invitation->guest_mail, $url)\n#: lib/Lufi/Controller/Invitation.pm:87\nmsgid \"Invitation sent to %1.<br> URL: %2\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/invite.html.ep:27 themes/default/templates/layouts/default.html.ep:36 themes/default/templates/layouts/default.html.ep:69\nmsgid \"Invite a guest\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/render.js.ep:6\nmsgid \"\"\n\"It seems that the key in your URL is incorrect. Please, verify your URL.\"\nmsgstr \"\"\n\"Sembla que la clau a l'URL és incorrecta. Si us plau, verifiqueu l'URL.\"\n\n#: themes/default/templates/index.html.ep:12\nmsgid \"Javascript is disabled. You won't be able to use Lufi.\"\nmsgstr \"Teniu el javascript deactivat. No podreu usar Lufi.\"\n\n#: themes/default/templates/layouts/default.html.ep:44 themes/default/templates/layouts/default.html.ep:46 themes/default/templates/layouts/default.html.ep:77 themes/default/templates/layouts/default.html.ep:79\nmsgid \"Language\"\nmsgstr \"Llengua\"\n\n#: themes/default/templates/login.html.ep:15\nmsgid \"Login\"\nmsgstr \"Entrada\"\n\n#: themes/default/templates/layouts/default.html.ep:58 themes/default/templates/layouts/default.html.ep:91\nmsgid \"Logout\"\nmsgstr \"Sortida\"\n\n#: themes/default/templates/about.html.ep:4\nmsgid \"Lufi is a free (as in free speech) file hosting software.\"\nmsgstr \"Lufi és programari lliure d'allotjament de fitxers.\"\n\n#: themes/default/templates/partial/files.js.ep:12\nmsgid \"\"\n\"Lufi recently changed its way to store files information.\\\\n\\\\nNo files have \"\n\"been found in the new localStorage location but we found files in the old \"\n\"one.\\\\nDo you want to import those informations?\\\\n\\\\nPlease note that this \"\n\"is the only time that we will ask you this.\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:34\nmsgid \"Mail\"\nmsgstr \"Mail\"\n\n#: themes/default/templates/files.html.ep:3 themes/default/templates/layouts/default.html.ep:34 themes/default/templates/layouts/default.html.ep:67\nmsgid \"My files\"\nmsgstr \"Els meus fitxers\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:5 themes/default/templates/layouts/default.html.ep:37 themes/default/templates/layouts/default.html.ep:70\nmsgid \"My invitations\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:17\nmsgid \"\"\n\"NB: this list includes the list of files that have already been sent to you.\"\nmsgstr \"\"\n\n#: themes/default/templates/index.html.ep:115\nmsgid \"Name of the zip file\"\nmsgstr \"\"\n\n#. (format_bytes($json->{size})\n#: lib/Lufi/Controller/Files.pm:108\nmsgid \"No enough space available on the server for this file (size: %1).\"\nmsgstr \"No hi ha prou espai al servidor per a aquest fitxer (mida: %1).\"\n\n#: themes/default/templates/partial/files.js.ep:10 themes/default/templates/partial/index.js.ep:28\nmsgid \"No expiration delay\"\nmsgstr \"Sense moratòria d'expiració\"\n\n#: themes/default/templates/files.html.ep:8\nmsgid \"\"\n\"Only the files sent with this browser will be listed here. This list is \"\n\"stored in localStorage: if you delete your localStorage data, you'll lose \"\n\"this list.\"\nmsgstr \"\"\n\"Aquí només apareixen els fitxers enviats amb aquest navegador. La llista es \"\n\"desa en emmagatzematge local: si netegeu l'emmagatzematge local perdreu \"\n\"aquesta llista.\"\n\n#: themes/default/templates/index.html.ep:106 themes/default/templates/login.html.ep:21 themes/default/templates/render.html.ep:26\nmsgid \"Password\"\nmsgstr \"Contrasenya\"\n\n#. (config('contact')\n#: themes/default/templates/about.html.ep:13\nmsgid \"Please contact the administrator: %1\"\nmsgstr \"Si us plau contacteu amb l'administrador: %1\"\n\n#: themes/default/templates/render.html.ep:33\nmsgid \"\"\n\"Please wait while we are getting your file. We first need to download and \"\n\"decrypt all parts before you can get it.\"\nmsgstr \"\"\n\"Si us plau, espereu mentre obtenim el fitxer. Abans que el tingueu \"\n\"disponible primer cal descarregar i desxifrar tots els trossos.\"\n\n#: lib/Lufi/Controller/Auth.pm:38\nmsgid \"\"\n\"Please, check your credentials or your right to access this service: unable \"\n\"to authenticate.\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:5\nmsgid \"Privacy\"\nmsgstr \"Privacitat\"\n\n#: themes/default/templates/files.html.ep:13\nmsgid \"Purge expired files from localStorage\"\nmsgstr \"Netegeu els fitxers expirats de l'emmagatzematge local\"\n\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:20\nmsgid \"Regards,\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/invite.mail.ep:15\nmsgid \"Regards.\"\nmsgstr \"\"\n\n#: themes/default/templates/layouts/default.html.ep:31 themes/default/templates/layouts/default.html.ep:64\nmsgid \"Report file\"\nmsgstr \"Senyalar un fitxer\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:15\nmsgid \"Resend invitation mail\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:9\nmsgid \"Rows in purple mean that the invitations have expired.\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:9\nmsgid \"\"\n\"Rows in red mean that the files have expired and are no longer available.\"\nmsgstr \"\"\n\"Les files en vermell indiquen que els fitxers han expirat i ja no són \"\n\"disponibles.\"\n\n#: themes/default/templates/partial/index.js.ep:26\nmsgid \"Send all links by email\"\nmsgstr \"Envia tots els enllaços per correu electrònic\"\n\n#: themes/default/templates/invitations/invite.html.ep:50\nmsgid \"Send the invitation\"\nmsgstr \"\"\n\n#: themes/default/templates/mail.html.ep:46\nmsgid \"Send with this server\"\nmsgstr \"Envia amb aquest servidor\"\n\n#: themes/default/templates/mail.html.ep:47\nmsgid \"Send with your own mail software\"\nmsgstr \"Envia amb el vostre propi programa de correu\"\n\n#: themes/default/templates/partial/index.js.ep:29\nmsgid \"\"\n\"Sending part XX1 of XX2. Please, be patient, the progress bar can take a \"\n\"while to move.\"\nmsgstr \"\"\n\"S'està enviant el tros XX1 de XX2. Si us plau, paciència; la barra de \"\n\"progrés pot trigar una mica a bellugar-se.\"\n\n#. (url_for('/')\n#: themes/default/templates/partial/mail.js.ep:48\nmsgid \"Share your files in total privacy on %1\"\nmsgstr \"Compartiu fitxers amb total privacitat a %1\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:13 themes/default/templates/partial/invitations.js.ep:9\nmsgid \"Show hidden invitations\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/render.js.ep:11\nmsgid \"Show zip content\"\nmsgstr \"\"\n\n#: themes/default/templates/layouts/default.html.ep:40 themes/default/templates/layouts/default.html.ep:73 themes/default/templates/login.html.ep:28 themes/default/templates/logout.html.ep:17\nmsgid \"Signin\"\nmsgstr \"Autenticació\"\n\n#: lib/Lufi/Controller/Invitation.pm:283 themes/default/templates/invitations/exception.html.ep:16\nmsgid \"\"\n\"Sorry, the invitation doesn’t exist. Are you sure you are on the right URL?\"\nmsgstr \"\"\n\n#: themes/default/templates/index.html.ep:46\nmsgid \"Sorry, the uploading is currently disabled. Please try again later.\"\nmsgstr \"\"\n\"Disculpeu, les pujades estan actualment desactivades. Si us plau proveu-ho \"\n\"més tard.\"\n\n#: lib/Lufi/Controller/Files.pm:82\nmsgid \"Sorry, uploading is disabled.\"\nmsgstr \"Disculpeu, les pujades estan deshabilitades.\"\n\n#: themes/default/templates/invitations/exception.html.ep:7\nmsgid \"Sorry, your invitation has expired or has been deleted.\"\nmsgstr \"\"\n\n#. ($invit->ldap_user_mail)\n#: lib/Lufi/Controller/Files.pm:122\nmsgid \"\"\n\"Sorry, your invitation has expired or has been deleted. Please contact %1 to \"\n\"have another invitation.\"\nmsgstr \"\"\n\n#. ($invitation->ldap_user_mail)\n#: lib/Lufi/Controller/Invitation.pm:276\nmsgid \"The URLs of your files have been sent by email to %1.\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:7\nmsgid \"\"\n\"The administrator can only see the file's name, its size and its mimetype \"\n\"(what kind of file it is: video, text, etc.).\"\nmsgstr \"\"\n\"L'administrador només pot veure el nom del fitxer, la seva mida i el seu \"\n\"mimetype (quina mena de fitxer és: vídeo, text, etc.).\"\n\n#: lib/Lufi/Controller/Mail.pm:53\nmsgid \"\"\n\"The body of the mail must contain at least one URL pointing to a file hosted \"\n\"on this instance.\"\nmsgstr \"\"\n\"El cor del mail deu contenir almens una URL menant al fitxer albergat a \"\n\"aquesta instància.\"\n\n#: themes/default/templates/partial/files.js.ep:11\nmsgid \"The data has been successfully imported.\"\nmsgstr \"La importació de les dades ha reeixit.\"\n\n#: lib/Lufi/Controller/Mail.pm:73\nmsgid \"The email body can't be empty.\"\nmsgstr \"El cos del correu no pot estar buit.\"\n\n#: lib/Lufi/Controller/Mail.pm:72\nmsgid \"The email subject can't be empty.\"\nmsgstr \"L'assumpte dle correu no pot estar buit.\"\n\n#. ($expire_at, $max_expire_at)\n#: lib/Lufi/Controller/Invitation.pm:51\nmsgid \"The expiration delay (%1) is not between 1 and %2 days.\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Files.pm:468\nmsgid \"The file has already been deleted\"\nmsgstr \"El fitxer ja ha estat esborrat\"\n\n#: themes/default/templates/about.html.ep:6\nmsgid \"\"\n\"The files uploaded on a Lufi instance are encrypted before the upload to the \"\n\"server: the administrator of the server can not see the file's content.\"\nmsgstr \"\"\n\"Els fitxers que es pugen a una instaŀlació de Lufi són xifrats abans de \"\n\"pujar-los al servidor i l'administrador del servidor no pot veure el \"\n\"contingut del fitxer.\"\n\n#. (join(', ', @bad)\n#: lib/Lufi/Controller/Mail.pm:68\nmsgid \"The following email addresses are not valid: %1\"\nmsgstr \"Les següents adreces de correu electrònic no són vàlides: %1\"\n\n#. ($guest_mail)\n#: lib/Lufi/Controller/Invitation.pm:48\nmsgid \"The guest email address (%1) is unvalid.\"\nmsgstr \"\"\n\n#. ($i->token, $i->guest_mail)\n#: lib/Lufi/Controller/Invitation.pm:150\nmsgid \"\"\n\"The invitation %1 can’t be resent: %2 has already sent files.<br>Please \"\n\"create a new invitation.\"\nmsgstr \"\"\n\n#. ($i->token)\n#: lib/Lufi/Controller/Invitation.pm:130\nmsgid \"The invitation %1 has been deleted.\"\nmsgstr \"\"\n\n#. (stash('user_mail')\n#: themes/default/templates/invitations/invite.html.ep:34\nmsgid \"The invitation mail will be send from your email address (%1).\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/index.js.ep:16\nmsgid \"The link(s) has been copied to your clipboard\"\nmsgstr \"L'enllaç/ els enllaços ja estan copiats al portaretalls\"\n\n#. (stash('invitation')\n#: themes/default/templates/index.html.ep:30\nmsgid \"\"\n\"The link(s) of your file(s) will automatically be sent by mail to %1 (%2)\"\nmsgstr \"\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:11\nmsgid \"The links of your file(s) will automatically be sent by mail to %1.\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Mail.pm:97\nmsgid \"The mail has been sent.\"\nmsgstr \"El correu ja està enviat.\"\n\n#: themes/default/templates/about.html.ep:15\nmsgid \"\"\n\"The original (and only for now) author is <a href=\\\"https://fiat-tux.fr\\\" \"\n\"class=\\\"classic\\\">Luc Didry</a>.\"\nmsgstr \"\"\n\"L'autor original (i per ara l'únic) és <a href=\\\"https://fiat-tux.fr\\\" class=\"\n\"\\\"classic\\\">Luc Didry</a>.\"\n\n#: lib/Lufi/Controller/Files.pm:236\nmsgid \"\"\n\"The server was unable to find the file record to add your file part to. \"\n\"Please, contact the administrator.\"\nmsgstr \"\"\n\"El servidor no ha pogut trobar el registre del fitxer per afegir-hi el tros \"\n\"del fitxer. Si us plau, contacteu l'administrador.\"\n\n#: lib/Lufi/Controller/Files.pm:295\nmsgid \"\"\n\"This file has been deactivated by the admins. Contact them to know why.\"\nmsgstr \"\"\n\"Aquest fitxer es estat desactivat pels administrators. Contacteu-los per \"\n\"saber perque.\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:46 themes/default/templates/partial/invitations.js.ep:6\nmsgid \"This invitation is normally hidden\"\nmsgstr \"\"\n\n#. (stash('expires')\n#: themes/default/templates/invitations/invite.mail.ep:13\nmsgid \"This invitation is valid until %1.\"\nmsgstr \"\"\n\n#: themes/default/templates/delays.html.ep:10\nmsgid \"\"\n\"This server sets limitations according to the file size. The expiration \"\n\"delay of your file will be the minimum between what you choose and the \"\n\"following limitations:\"\nmsgstr \"\"\n\"Aquest servidor estableix limitacions segons la mida del fitxer. La \"\n\"moratòria d'expiració del fitxer serà el mínim de l'escollida i aquestes \"\n\"limitacions:\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:16\nmsgid \"Toggle visibility\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:25\nmsgid \"URL\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/index.js.ep:17\nmsgid \"Unable to copy the link(s) to your clipboard\"\nmsgstr \"No s'han pogut copiar l'enllaç o els enllaços al porta-retalls\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:439\nmsgid \"\"\n\"Unable to get counter for %1. The file does not exists. It will be removed \"\n\"from your localStorage.\"\nmsgstr \"\"\n\"No he pogut obtenir el comptador de %1. El fitxer no existeix. Serà eliminat \"\n\"del teu emmagatzematge local.\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:429\nmsgid \"Unable to get counter for %1. The token is invalid.\"\nmsgstr \"No he pogut obtenir el comptador de %1. El testimoni no és vàlid.\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:449\nmsgid \"Unable to get counter for %1. You are not authenticated.\"\nmsgstr \"No he pogut obtenir el comptador de %1. No esteu autenticat.\"\n\n#: themes/default/templates/layouts/default.html.ep:33 themes/default/templates/layouts/default.html.ep:66\nmsgid \"Upload files\"\nmsgstr \"Pujar fitxers\"\n\n#: themes/default/templates/index.html.ep:145\nmsgid \"Upload generated zip file\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:31\nmsgid \"Uploaded at\"\nmsgstr \"Pujat a les\"\n\n#: themes/default/templates/index.html.ep:153\nmsgid \"Uploaded files\"\nmsgstr \"Fitxers pujats\"\n\n#: themes/default/templates/partial/index.js.ep:30\nmsgid \"Websocket communication error\"\nmsgstr \"Error de comunicacions del websocket\"\n\n#: themes/default/templates/about.html.ep:3\nmsgid \"What is Lufi?\"\nmsgstr \"Què és Lufi?\"\n\n#: themes/default/templates/about.html.ep:14\nmsgid \"Who wrote this software?\"\nmsgstr \"Qui va escriure aquest programa?\"\n\n#: themes/default/templates/partial/index.js.ep:13\nmsgid \"XXX file has been added to upload queue.\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/invite.html.ep:30\nmsgid \"\"\n\"You can invite someone to send you files through this Lufi instance even if \"\n\"they don’t have an account on it.\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:11\nmsgid \"\"\n\"You can see the list of your files by clicking on the \\\"My files\\\" link at \"\n\"the top right of this page.\"\nmsgstr \"\"\n\"Podeu veure la llista dels vostres fitxers amb a l'enllaç \\\"Els meus \"\n\"fitxers\\\" a dalt a la dreta d'aquesta pàgina.\"\n\n#: lib/Lufi/Controller/Mail.pm:42\nmsgid \"You can't add URLs that are not related to this instance.\"\nmsgstr \"No podeu pas afegir una URL qu'es pas ligada a aquesta instància.\"\n\n#: themes/default/templates/about.html.ep:8\nmsgid \"\"\n\"You don't need to register yourself to upload files but be aware that, for \"\n\"legal reasons, your IP address will be stored when you send a file. Don't \"\n\"panic, this is normally the case for all sites on which you send files.\"\nmsgstr \"\"\n\"No cal que us inscriviu per a pujar fitxers però tingueu en compte, que per \"\n\"raons legals, s'enregistrarà la vostra adreça IP quan envieu un fitxer. No \"\n\"us espanteu, això és el que normalment passa a tots els webs on pugeu \"\n\"fitxers.\"\n\n#: themes/default/templates/partial/render.js.ep:10\nmsgid \"\"\n\"You don't seem to have a key in your URL. You won't be able to decrypt the \"\n\"file. Download canceled.\"\nmsgstr \"\"\n\"No sembla que hi hagi una clau a la URL. No podreu desxifrar el fitxer. \"\n\"Descàrrega canceŀlada.\"\n\n#: themes/default/templates/partial/render.js.ep:7\nmsgid \"\"\n\"You have attempted to leave this page. The download will be canceled. Are \"\n\"you sure?\"\nmsgstr \"\"\n\"Heu intentat deixar aquesta pàgina. Es canceŀlarà la descàrrega. N'esteu \"\n\"segur?\"\n\n#: themes/default/templates/partial/index.js.ep:14\nmsgid \"\"\n\"You have attempted to leave this page. The upload will be canceled. Are you \"\n\"sure?\"\nmsgstr \"\"\n\"Heu intentat deixar aquesta pàgina. Es canceŀlarà la pujada. N'esteu segur?\"\n\n#: themes/default/templates/logout.html.ep:14\nmsgid \"You have been successfully logged out.\"\nmsgstr \"Heu sortit correctament.\"\n\n#: lib/Lufi/Controller/Mail.pm:71\nmsgid \"You must give email addresses.\"\nmsgstr \"Heu de donar l'adreça de correu electrònic.\"\n\n#: themes/default/templates/index.html.ep:38\nmsgid \"\"\n\"Your browser does not have enough entropy to generate a strong encryption \"\n\"key. Please wait (it's better if you do things on your computer while \"\n\"waiting).\"\nmsgstr \"\"\n\n#. (format_bytes($json->{size})\n#: lib/Lufi/Controller/Files.pm:95\nmsgid \"Your file is too big: %1 (maximum size allowed: %2)\"\nmsgstr \"El fitxer és massa gran: %1 (mida màxima admesa: %2)\"\n\n#: lib/Lufi/Controller/Files.pm:351\nmsgid \"Your password is not valid. Please refresh the page to retry.\"\nmsgstr \"\"\n\"La vostra contrasenya es incorrecta. Torneu cargar la pàgina per provar de \"\n\"nou.\"\n\n#: themes/default/templates/partial/render.js.ep:12\nmsgid \"Zip content:\"\nmsgstr \"\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:20\nmsgid \"between %1 and %2, the file will be kept %3 day(s).\"\nmsgstr \"entre %1 i %2, el fitxer es mantindrà %3 dia/es al servidor.\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:22\nmsgid \"between %1 and %2, the file will be kept forever.\"\nmsgstr \"entre %1 i %2, el fitxer es mantindrà per sempre al servidor.\"\n\n#: themes/default/templates/partial/mail.js.ep:42\nmsgid \"deadline: \"\nmsgstr \"termini: \"\n\n#: themes/default/templates/partial/invitations.js.ep:5\nmsgid \"expires on XXX\"\nmsgstr \"\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:26\nmsgid \"for %1 and more, the file will be kept %2 day(s)\"\nmsgstr \"a partir de %1, el fitxer es mantindrà %2 dia/es al servidor\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:28\nmsgid \"for %1 and more, the file will be kept forever.\"\nmsgstr \"a partir de %1, el fitxer es mantindrà per sempre al servidor.\"\n\n#: themes/default/templates/index.html.ep:3\nmsgid \"no time limit\"\nmsgstr \"no hi ha límit de temps\"\n\n#: themes/default/templates/index.html.ep:124\nmsgid \"or\"\nmsgstr \"o\"\n\n#. ($e->{name}, format_bytes($e->{size})\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:12\nmsgid \"— %1 (%2), that will expire on %3\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:18\nmsgid \"Get the source code on <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi\\\" class=\\\"classic\\\">the official repository</a> or on its <a href=\\\"https://github.com/ldidry/lufi\\\" class=\\\"classic\\\">Github mirror</a>\"\nmsgstr \"\"\n\"Obteniu el codi font al <a href=\\\"https://framagit.org/fiat-tux/\"\n\"hat-softwares/lufi\\\" class=\\\"classic\\\">repositori oficial</a> o a la seva <a \"\n\"href=\\\"https://github.com/ldidry/lufi\\\" class=\\\"classic\\\">rèplica a \"\n\"Github</a>\"\n\n#: themes/default/templates/about.html.ep:17\nmsgid \"As Lufi is a free software licensed under of the terms of the <a href=\\\"https://gnu.org/licenses/agpl.html\\\" class=\\\"classic\\\">AGPLv3</a>, you can install it on you own server. Have a look on the <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi/wikis/home\\\" class=\\\"classic\\\">Wiki</a> for the procedure.\"\nmsgstr \"\"\n\"Com que Lufi és programari lliure, autoritzat sota els termes de l’<a href=\\\"\"\n\"https://gnu.org/licenses/agpl.html\\\" class=\\\"classic\\\">AGPLv3</a>, el podeu \"\n\"instal·lar al vostre propi servidor. Pel que fa a com fer-ho, feu un cop \"\n\"d'ull al <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi/wikis/\"\n\"home\\\" class=\\\"classic\\\">Wiki</a>.\"\n"
  },
  {
    "path": "themes/default/lib/Lufi/I18N/co.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\\n\"\n\"PO-Revision-Date: 2023-05-12 14:05+0000\\n\"\n\"Last-Translator: Patriccollu di Santa Maria è Sichè <Patriccollu@gmail.com>\\n\"\n\"Language-Team: Corsican <https://weblate.framasoft.org/projects/lufi/\"\n\"default-theme/co/>\\n\"\n\"Language: co\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=n != 1;\\n\"\n\"X-Generator: Weblate 4.17\\n\"\n\n#. ($delay)\n#. (max_delay)\n#: themes/default/templates/index.html.ep:56 themes/default/templates/index.html.ep:65 themes/default/templates/index.html.ep:66\nmsgid \"%1 days\"\nmsgstr \"%1 ghjorni\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:2\nmsgid \"%1 invites you to send him/her files\"\nmsgstr \"%1 v’invita à mandalli schedarii\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:6\nmsgid \"%1 invites you to send him/her files through Lufi.\"\nmsgstr \"%1 v’invita à mandalli schedarii via Lufi.\"\n\n#. (stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:4\nmsgid \"%1 sent you files\"\nmsgstr \"%1 vi hà mandatu schedarii\"\n\n#. (stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:8\nmsgid \"%1 used your invitation to send you files:\"\nmsgstr \"%1 hà impiegatu a vostra invitazione per mandavvi schedarii :\"\n\n#: lib/Lufi/Controller/Invitation.pm:172 lib/Lufi/Controller/Invitation.pm:85 themes/default/templates/invitations/my_invitations.html.ep:51 themes/default/templates/invitations/my_invitations.html.ep:52 themes/default/templates/invitations/my_invitations.html.ep:53 themes/default/templates/invitations/notification_files_sent.mail.ep:12\nmsgid \"%A %d %B %Y at %T\"\nmsgstr \"%A %d %B %Y à %T\"\n\n#: themes/default/templates/partial/index.js.ep:28\nmsgid \"(max size: XXX)\"\nmsgstr \"(dimensione massima : XXX)\"\n\n#: themes/default/templates/index.html.ep:5\nmsgid \"1 year\"\nmsgstr \"1 annu\"\n\n#: themes/default/templates/index.html.ep:4 themes/default/templates/index.html.ep:65\nmsgid \"24 hours\"\nmsgstr \"24 ore\"\n\n#: themes/default/templates/partial/mail.js.ep:40\nmsgid \":\"\nmsgstr \":\"\n\n#: themes/default/templates/render.html.ep:42\nmsgid \"Abort\"\nmsgstr \"Interrompe\"\n\n#: themes/default/templates/layouts/default.html.ep:53 themes/default/templates/layouts/default.html.ep:86\nmsgid \"About\"\nmsgstr \"Apprupositu\"\n\n#: themes/default/templates/index.html.ep:107\nmsgid \"Add a password to file(s)\"\nmsgstr \"Aghjunghje una parolla d’intesa à u(i) schedariu(i)\"\n\n#: themes/default/templates/mail.html.ep:16\nmsgid \"Adding URLs not related to this Lufi instance to the mail body or subject is prohibited.\"\nmsgstr \"\"\n\"Hè difesu d’aghjunghje à u sughjettu o à u testu di stu messaghju l’\"\n\"indirizzi web chì ùn sò micca in relazione cù st’istanza Lufi.\"\n\n#: themes/default/templates/partial/invitations.js.ep:3\nmsgid \"Are you sure you want to delete the selected invitations?\"\nmsgstr \"Da veru, vulete squassà l’invitazioni selezziunate ?\"\n\n#: themes/default/templates/partial/invitations.js.ep:4\nmsgid \"Are you sure you want to resend the invitation mail for the selected invitations?\"\nmsgstr \"\"\n\"Da veru, vulete mandà torna u messaghju d’invitazione per l’invitazioni \"\n\"selezziunate ?\"\n\n#: themes/default/templates/about.html.ep:17\nmsgid \"As Lufi is a free software licensed under of the terms of the <a href=\\\"https://gnu.org/licenses/agpl.html\\\" class=\\\"classic\\\">AGPLv3</a>, you can install it on you own server. Have a look on the <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi/wikis/home\\\" class=\\\"classic\\\">Wiki</a> for the procedure.\"\nmsgstr \"\"\n\"Cum’è Lufi hè un prugramma liberu sottumessu à i termi di a <a href=\\\"https\"\n\"://gnu.org/licenses/agpl.html\\\" class=\\\"classic\\\">licenza AGPLv3</a>, pudete \"\n\"installallu nant’à u vostru propiu servitore. Cunsultate u <a href=\\\"https\"\n\"://framagit.org/fiat-tux/hat-softwares/lufi/wikis/home\\\" class=\\\"classic\\\"\"\n\">Wiki</a> per vede a prucedura.\"\n\n#. (stash('nbslices')\n#: themes/default/templates/partial/render.js.ep:10\nmsgid \"Asking for file part XX1 of %1\"\nmsgstr \"Dumanda di ricuperazione di a parte di schedariu XX1 per %1\"\n\n#: themes/default/templates/about.html.ep:23\nmsgid \"Back to homepage\"\nmsgstr \"Ritornu à a pagina d’accolta\"\n\n#: lib/Lufi/Controller/Mail.pm:26\nmsgid \"Bad CSRF token!\"\nmsgstr \"Gettone CSRF inaccettevule !\"\n\n#: lib/Lufi/Controller/Auth.pm:27 lib/Lufi/Controller/Auth.pm:49\nmsgid \"Bad CSRF token.\"\nmsgstr \"Gettone CSRF inaccettevule.\"\n\n#: themes/default/templates/partial/render.js.ep:5\nmsgid \"Click here to refresh the page and restart the download.\"\nmsgstr \"Fate un cliccu quì per attualizà a pagina è rilancià u scaricamentu.\"\n\n#: themes/default/templates/invitations/invite.mail.ep:8\nmsgid \"Click on the following URL to upload files on Lufi:\"\nmsgstr \"\"\n\"Fate un cliccu nant’à st’indirizzu web per incaricà i schedarii nant’à Lufi :\"\n\n#: themes/default/templates/index.html.ep:126\nmsgid \"Click to open the file browser\"\nmsgstr \"Fate un cliccu per apre u navigatore di schedarii\"\n\n#: themes/default/templates/delays.html.ep:42 themes/default/templates/invitations/my_invitations.html.ep:80\nmsgid \"Close\"\nmsgstr \"Chjode\"\n\n#: themes/default/templates/mail.html.ep:23\nmsgid \"Comma-separated email addresses\"\nmsgstr \"Indirizzi elettronichi staccati da virgule\"\n\n#: themes/default/templates/index.html.ep:140\nmsgid \"Compressing zip file…\"\nmsgstr \"Cumpressione di u schedariu zip…\"\n\n#: themes/default/templates/partial/index.js.ep:15\nmsgid \"Copy all links to clipboard\"\nmsgstr \"Cupià tutti i liami in u preme’papei\"\n\n#: themes/default/templates/partial/index.js.ep:18\nmsgid \"Copy to clipboard\"\nmsgstr \"Cupià in u preme’papei\"\n\n#: lib/Lufi/Controller/Files.pm:501\nmsgid \"Could not delete the file. You are not authenticated.\"\nmsgstr \"Impussibule di squassà u schedariu. Ùn site micca autenticati.\"\n\n#: lib/Lufi/Controller/Files.pm:483\nmsgid \"Could not find the file. Are you sure of the URL and the token?\"\nmsgstr \"\"\n\"Impussibule di truvà u schedariu. Site sicura(u) chì l’indirizzu web è u \"\n\"gettone sianu curretti ?\"\n\n#: lib/Lufi/Controller/Files.pm:394\nmsgid \"Could not find the file. Are you sure of the URL?\"\nmsgstr \"\"\n\"Impussibule di truvà u schedariu. Site sicura(u) chì l’indirizzu web sia \"\n\"currettu ?\"\n\n#: themes/default/templates/files.html.ep:29\nmsgid \"Counter\"\nmsgstr \"Cuntadore\"\n\n#: themes/default/templates/index.html.ep:100\nmsgid \"Create a zip archive with the files before uploading?\"\nmsgstr \"Creà un archiviu zip cù i schedarii nanzu d’incaricà ?\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:26\nmsgid \"Created at\"\nmsgstr \"Creatu u\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:14\nmsgid \"Delete\"\nmsgstr \"Squassà\"\n\n#: themes/default/templates/files.html.ep:30 themes/default/templates/index.html.ep:90\nmsgid \"Delete at first download?\"\nmsgstr \"Squassà dopu à u primu scaricamentu ?\"\n\n#: themes/default/templates/files.html.ep:19\nmsgid \"Delete selected files\"\nmsgstr \"Squassà i schedarii selezziunati\"\n\n#: themes/default/templates/files.html.ep:33 themes/default/templates/partial/index.js.ep:19\nmsgid \"Deletion link\"\nmsgstr \"Liame di squassatura\"\n\n#: themes/default/templates/delays.html.ep:9\nmsgid \"Don't worry: if a user begins to download the file before the expiration and the download ends after the expiration, he will be able to get the file.\"\nmsgstr \"\"\n\"Ùn v’inchietate : s’è un utilizatore principieghja a scaricà un schedariu \"\n\"nanzu à a so scadenza è chì stu scaricamentu si compie dopu a scadenza, l’\"\n\"utilizatore puderà quantunque ottene u schedariu.\"\n\n#: themes/default/templates/partial/index.js.ep:21 themes/default/templates/render.html.ep:28\nmsgid \"Download\"\nmsgstr \"Scaricà\"\n\n#: themes/default/templates/partial/render.js.ep:4\nmsgid \"Download aborted.\"\nmsgstr \"Scaricamentu interrottu.\"\n\n#: themes/default/templates/files.html.ep:28 themes/default/templates/partial/index.js.ep:20\nmsgid \"Download link\"\nmsgstr \"Liame di scaricamentu\"\n\n#: themes/default/templates/about.html.ep:10\nmsgid \"Drag and drop files in the appropriate area or use the traditional way to send files and the files will be chunked, encrypted and sent to the server. You will get two links per file: a download link, that you give to the people you want to share the file with and a deletion link, allowing you to delete the file whenever you want.\"\nmsgstr \"\"\n\"Fate trascinà i schedarii è depuniteli in l’area apposta o selezziunateli di \"\n\"a manera tradiziunale è sti schedarii seranu affittati, cifrati è mandati à \"\n\"u servitore. Ottinerete dui liami per ogni schedariu : un liame di \"\n\"scaricamentu è un altru per squassà u schedariu quand’ella vi piare.\"\n\n#: themes/default/templates/index.html.ep:122\nmsgid \"Drop files here\"\nmsgstr \"Depunite quì i vostri schedarii\"\n\n#: themes/default/templates/invitations/invite.html.ep:40\nmsgid \"Email address of your guest\"\nmsgstr \"Indirizzu elettronicu di a(u) vostra(u) invitata(u)\"\n\n#: themes/default/templates/mail.html.ep:39\nmsgid \"Email body\"\nmsgstr \"Testu di u messaghju elettronicu\"\n\n#: themes/default/templates/mail.html.ep:31\nmsgid \"Email subject\"\nmsgstr \"Sughjettu di u messaghju elettronicu\"\n\n#: themes/default/templates/mail.html.ep:25 themes/default/templates/mail.html.ep:27\nmsgid \"Emails\"\nmsgstr \"Messaghji elettronichi\"\n\n#: themes/default/templates/partial/index.js.ep:22\nmsgid \"Encrypting part XX1 of XX2\"\nmsgstr \"Cifratura di a parte di schedariu XX1 nant’à XX2\"\n\n#: lib/Lufi/Controller/Files.pm:283\nmsgid \"Error: the file existed but was deleted.\"\nmsgstr \"Sbagliu : U schedariu esistia ma hè statu squassatu.\"\n\n#: lib/Lufi/Controller/Files.pm:363\nmsgid \"Error: the file has not been sent entirely.\"\nmsgstr \"Sbagliu : U schedariu ùn hè micca statu mandatu sanu.\"\n\n#: lib/Lufi/Controller/Files.pm:373\nmsgid \"Error: unable to find the file. Are you sure of your URL?\"\nmsgstr \"\"\n\"Sbagliu : Impussibule di truvà u schedariu. Site sicura(u) chì u vostru \"\n\"indirizzu web sia currettu ?\"\n\n#: themes/default/templates/partial/index.js.ep:23\nmsgid \"Expiration:\"\nmsgstr \"Scadenza–:\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:27\nmsgid \"Expire at\"\nmsgstr \"Scadenza u\"\n\n#: themes/default/templates/files.html.ep:32\nmsgid \"Expires at\"\nmsgstr \"Scadenza u\"\n\n#: themes/default/templates/files.html.ep:12\nmsgid \"Export localStorage data\"\nmsgstr \"Espurtà i dati localStorage\"\n\n#: lib/Lufi/Controller/Files.pm:465\nmsgid \"File deleted\"\nmsgstr \"Schedariu squassatu\"\n\n#: themes/default/templates/partial/render.js.ep:9\nmsgid \"File downloaded\"\nmsgstr \"Schedariu scaricatu\"\n\n#: themes/default/templates/files.html.ep:27\nmsgid \"File name\"\nmsgstr \"Nome di u schedariu\"\n\n#: themes/default/templates/partial/index.js.ep:24\nmsgid \"File uploaded\"\nmsgstr \"Schedariu incaricatu\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:61\nmsgid \"Files\"\nmsgstr \"Schedarii\"\n\n#: themes/default/templates/index.html.ep:80\nmsgid \"Files deleted at first download\"\nmsgstr \"Schedarii squassati à u primu scaricamentu\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:28\nmsgid \"Files sent at\"\nmsgstr \"Schedarii mandati u\"\n\n#: themes/default/templates/partial/invitations.js.ep:8\nmsgid \"Files sent in invitation XX1 by XX2\"\nmsgstr \"Schedarii mandati via l’invitazione XX1 da XX2\"\n\n#: themes/default/templates/partial/render.js.ep:8\nmsgid \"Get the file\"\nmsgstr \"Ottene u schedariu\"\n\n#: themes/default/templates/about.html.ep:18\nmsgid \"Get the source code on <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi\\\" class=\\\"classic\\\">the official repository</a> or on its <a href=\\\"https://github.com/ldidry/lufi\\\" class=\\\"classic\\\">Github mirror</a>\"\nmsgstr \"\"\n\"Ottinite u codice di fonte nant’à <a href=\\\"https://framagit.org/fiat-tux/\"\n\"hat-softwares/lufi\\\" class=\\\"classic\\\">u dipositu ufficiale</a> or on its <a \"\n\"href=\\\"https://github.com/ldidry/lufi\\\" class=\\\"classic\\\">spechju Github</a>\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:24\nmsgid \"Guest mail\"\nmsgstr \"Messaghju di l’invitatu\"\n\n#. (ucfirst(stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:6\nmsgid \"Hello %1,\"\nmsgstr \"Bonghjornu o %1,\"\n\n#: themes/default/templates/invitations/invite.mail.ep:4\nmsgid \"Hello,\"\nmsgstr \"Bonghjornu,\"\n\n#: themes/default/templates/partial/mail.js.ep:35\nmsgid \"Hello,\\\\n\\\\nHere's some files I want to share with you:\\\\n\"\nmsgstr \"\"\n\"Bonghjornu,\\\\n\"\n\"\\\\n\"\n\"Eccu qualchì schedariu ch’o vogliu scumparte cù voi :\\\\n\"\n\n#: themes/default/templates/mail.html.ep:35\nmsgid \"Here's some files\"\nmsgstr \"Eccu qualchì schedariu\"\n\n#: themes/default/templates/partial/invitations.js.ep:7\nmsgid \"Hide hidden invitations\"\nmsgstr \"Ùn micca affissà l’invitazioni piattate\"\n\n#: themes/default/templates/partial/index.js.ep:26\nmsgid \"Hit Enter, then Ctrl+C to copy all the download links\"\nmsgstr \"\"\n\"Appughjate nant’à u tastu Entrée eppò fate Ctrl+C per cupià tutti i liami di \"\n\"scaricamentu\"\n\n#: themes/default/templates/partial/index.js.ep:25\nmsgid \"Hit Enter, then Ctrl+C to copy the download link\"\nmsgstr \"\"\n\"Appughjate nant’à u tastu Entrée eppò fate Ctrl+C per cupià u liame di \"\n\"scaricamentu\"\n\n#: themes/default/templates/about.html.ep:9\nmsgid \"How does it work?\"\nmsgstr \"Cumu funziuneghja l’affare ?\"\n\n#: themes/default/templates/invitations/invite.html.ep:46\nmsgid \"How many days would you like the invitation to be valid?\"\nmsgstr \"Quantu ghjorni vò vulete chì l’invitazione sia accettevule ?\"\n\n#: themes/default/templates/about.html.ep:16\nmsgid \"How to install the software on my server?\"\nmsgstr \"Cumu installà u prugramma nant’à u mo servitore ?\"\n\n#: themes/default/templates/about.html.ep:12\nmsgid \"How to report an illegal file?\"\nmsgstr \"Cumu signalà un schedariu illegale ?\"\n\n#: themes/default/templates/delays.html.ep:8\nmsgid \"If you choose a delay, the file will be deleted after that delay.\"\nmsgstr \"\"\n\"S’è vò sciglite un cumportu, u schedariu serà squassatu dopu à stu cumportu.\"\n\n#: themes/default/templates/mail.html.ep:15\nmsgid \"If you send the mail from this server, the links will be sent to the server, which may lower your privacy protection.\"\nmsgstr \"\"\n\"S’è vò mandate u messaghju da stu servitore, i liami seranu mandati à u \"\n\"servitore, ciò chì pò diminuisce a prutezzione di a cunfidenzialità.\"\n\n#: themes/default/templates/files.html.ep:14\nmsgid \"Import localStorage data\"\nmsgstr \"Impurtà i dati localStorage\"\n\n#: themes/default/templates/index.html.ep:53\nmsgid \"Important: more information on delays\"\nmsgstr \"Impurtante : più d’infurmazione nant’à i cumporti\"\n\n#: themes/default/templates/delays.html.ep:5\nmsgid \"Information about delays\"\nmsgstr \"Infurmazione apprupositu di i cumporti\"\n\n#: themes/default/templates/files.html.ep:18 themes/default/templates/invitations/my_invitations.html.ep:12\nmsgid \"Invert selection\"\nmsgstr \"Invertisce a selezzione\"\n\n#. ($i->guest_mail, $url)\n#: lib/Lufi/Controller/Invitation.pm:184\nmsgid \"Invitation resent to %1.<br> URL: %2\"\nmsgstr \"Invitazione mandata torna à %1.<br> Indirizzu web : %2\"\n\n#. ($invitation->guest_mail, $url)\n#: lib/Lufi/Controller/Invitation.pm:88\nmsgid \"Invitation sent to %1.<br> URL: %2\"\nmsgstr \"Invitazione mandata à %1.<br> Indirizzu web : %2\"\n\n#: themes/default/templates/invitations/invite.html.ep:27 themes/default/templates/layouts/default.html.ep:36 themes/default/templates/layouts/default.html.ep:69\nmsgid \"Invite a guest\"\nmsgstr \"Invità qualchissia\"\n\n#: themes/default/templates/partial/render.js.ep:6\nmsgid \"It seems that the key in your URL is incorrect. Please, verify your URL.\"\nmsgstr \"\"\n\"Pare chì a chjave in u vostru indirizzu web sia incurretta. Verificate u \"\n\"vostru indirizzu web.\"\n\n#: themes/default/templates/index.html.ep:12\nmsgid \"Javascript is disabled. You won't be able to use Lufi.\"\nmsgstr \"Javascript hè disattivatu. Ùn puderete micca impiegà Lufi.\"\n\n#: themes/default/templates/layouts/default.html.ep:44 themes/default/templates/layouts/default.html.ep:46 themes/default/templates/layouts/default.html.ep:77 themes/default/templates/layouts/default.html.ep:79\nmsgid \"Language\"\nmsgstr \"Lingua\"\n\n#. (sprintf('<a href=\"https://framagit.org/fiat-tux/hat-softwares/lufi/-/commit/%s\" class=\"classic\">%s</a>', stash('version')\n#: themes/default/templates/about.html.ep:22\nmsgid \"Latest commit of this instance: %1\"\nmsgstr \"Ultimu « commit » di st’istanza : %1\"\n\n#. (sprintf('<a href=\"https://framagit.org/fiat-tux/hat-softwares/lufi/-/releases/%s\" class=\"classic\">%s</a>', stash('version')\n#: themes/default/templates/about.html.ep:21\nmsgid \"Latest tag of this instance: %1\"\nmsgstr \"Ultima etichetta di st’istanza : %1\"\n\n#: themes/default/templates/login.html.ep:15\nmsgid \"Login\"\nmsgstr \"Identificazione di cunnessione\"\n\n#: themes/default/templates/layouts/default.html.ep:58 themes/default/templates/layouts/default.html.ep:91\nmsgid \"Logout\"\nmsgstr \"Scunnettesi\"\n\n#: themes/default/templates/about.html.ep:4\nmsgid \"Lufi is a free (as in free speech) file hosting software.\"\nmsgstr \"Lufi hè un prugramma liberu d’uspitalità di schedarii.\"\n\n#: themes/default/templates/partial/files.js.ep:12\nmsgid \"Lufi recently changed its way to store files information.\\\\n\\\\nNo files have been found in the new localStorage location but we found files in the old one.\\\\nDo you want to import those informations?\\\\n\\\\nPlease note that this is the only time that we will ask you this.\"\nmsgstr \"\"\n\"Pocu fà, Lufi hà cambiatu a so manera d’accuncià l’infurmazione di i \"\n\"schedarii.\\\\n\"\n\"\\\\n\"\n\"Alcunu schedariu ùn si trova in u novu locu localStorage ma avemu trovu \"\n\"schedarii in l’anzianu locu.\\\\n\"\n\"Vulete impurtà st’infurmazione ?\\\\n\"\n\"\\\\n\"\n\"Sappiate chì ghjè a sola volta chì vi dumandemu què.\"\n\n#: themes/default/templates/files.html.ep:34\nmsgid \"Mail\"\nmsgstr \"Messaghji\"\n\n#: themes/default/templates/files.html.ep:3 themes/default/templates/layouts/default.html.ep:34 themes/default/templates/layouts/default.html.ep:67\nmsgid \"My files\"\nmsgstr \"I mo schedarii\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:5 themes/default/templates/layouts/default.html.ep:37 themes/default/templates/layouts/default.html.ep:70\nmsgid \"My invitations\"\nmsgstr \"E mo invitazioni\"\n\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:17\nmsgid \"NB: this list includes the list of files that have already been sent to you.\"\nmsgstr \"\"\n\"Nota : sta lista cuntene quella di i schedarii chì vi sò stati mandati \"\n\"dighjà.\"\n\n#: themes/default/templates/index.html.ep:115\nmsgid \"Name of the zip file\"\nmsgstr \"Nome di u schedariu zip\"\n\n#. (format_bytes($json->{size})\n#: lib/Lufi/Controller/Files.pm:109\nmsgid \"No enough space available on the server for this file (size: %1).\"\nmsgstr \"\"\n\"Ùn ci hè abbastanza spaziu dispunibule nant’à u servitore per stu schedariu (\"\n\"dimensione : %1).\"\n\n#: themes/default/templates/partial/files.js.ep:10 themes/default/templates/partial/index.js.ep:29\nmsgid \"No expiration delay\"\nmsgstr \"Nisunu cumportu di scadenza\"\n\n#: themes/default/templates/files.html.ep:8\nmsgid \"Only the files sent with this browser will be listed here. This list is stored in localStorage: if you delete your localStorage data, you'll lose this list.\"\nmsgstr \"\"\n\"Solu i schedarii mandati cù stu navigatore sonu affissati quì. Sta lista hè \"\n\"piazzata in localStorage : s’è vò squassate i vostri dati localStorage, \"\n\"perderete sta lista.\"\n\n#: themes/default/templates/index.html.ep:106 themes/default/templates/login.html.ep:21 themes/default/templates/render.html.ep:26\nmsgid \"Password\"\nmsgstr \"Parolla d’intesa\"\n\n#. (config('contact')\n#: themes/default/templates/about.html.ep:13\nmsgid \"Please contact the administrator: %1\"\nmsgstr \"Ci vole à cuntattà u vostru amministratore : %1\"\n\n#: themes/default/templates/render.html.ep:33\nmsgid \"Please wait while we are getting your file. We first need to download and decrypt all parts before you can get it.\"\nmsgstr \"\"\n\"Ci vole à aspettà durante a ricuperazione di u vostru schedariu. Da prima, \"\n\"duvemu scaricà è dicifrà tutte e so parti nanzu chì vò possate l’ottene.\"\n\n#: lib/Lufi/Controller/Auth.pm:38\nmsgid \"Please, check your credentials or your right to access this service: unable to authenticate.\"\nmsgstr \"\"\n\"Ci vole à verificà e vostre identificazioni di cunnessione o i vostri \"\n\"diritti d’accessu à stu serviziu : fiascu di l’autenticazione.\"\n\n#: themes/default/templates/about.html.ep:5\nmsgid \"Privacy\"\nmsgstr \"Cunfidenzialità\"\n\n#: themes/default/templates/files.html.ep:13\nmsgid \"Purge expired files from localStorage\"\nmsgstr \"Spurgulà i schedarii scaduti da localStorage\"\n\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:20\nmsgid \"Regards,\"\nmsgstr \"Saluti curdiali,\"\n\n#: themes/default/templates/invitations/invite.mail.ep:15\nmsgid \"Regards.\"\nmsgstr \"Saluti curdiali.\"\n\n#: themes/default/templates/layouts/default.html.ep:31 themes/default/templates/layouts/default.html.ep:64\nmsgid \"Report file\"\nmsgstr \"Signalà un schedariu\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:15\nmsgid \"Resend invitation mail\"\nmsgstr \"Mandà torna u messaghju d’invitazione\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:9\nmsgid \"Rows in purple mean that the invitations have expired.\"\nmsgstr \"E linee in purpura indicanu chì l’invitazioni sò scadute.\"\n\n#: themes/default/templates/files.html.ep:9\nmsgid \"Rows in red mean that the files have expired and are no longer available.\"\nmsgstr \"\"\n\"E linee in rossu indicanu chì i schedarii sò scaduti è ch’elli ùn sò più \"\n\"dispunibule.\"\n\n#: themes/default/templates/partial/index.js.ep:27\nmsgid \"Send all links by email\"\nmsgstr \"Mandà tutti i liami da messaghju elettronicu\"\n\n#: themes/default/templates/invitations/invite.html.ep:50\nmsgid \"Send the invitation\"\nmsgstr \"Mandà l’invitazione\"\n\n#: themes/default/templates/mail.html.ep:47\nmsgid \"Send with this server\"\nmsgstr \"Mandà cù stu servitore\"\n\n#: themes/default/templates/mail.html.ep:49\nmsgid \"Send with your own mail software\"\nmsgstr \"Mandà cù u vostru propiu prugramma di messaghjeria\"\n\n#: themes/default/templates/partial/index.js.ep:30\nmsgid \"Sending part XX1 of XX2. Please, be patient, the progress bar can take a while to move.\"\nmsgstr \"\"\n\"Inviu di a parte XX1 nant’à XX2 Per piacè, siate pazientosi, perchè a barra \"\n\"di prugressione pò piglià un pezzu prima di dispiazzassi.\"\n\n#. (url_for('/')\n#: themes/default/templates/partial/mail.js.ep:49\nmsgid \"Share your files in total privacy on %1\"\nmsgstr \"Scumpartite i vostri schedarii in tutta cunfidenzialità cù %1\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:13 themes/default/templates/partial/invitations.js.ep:9\nmsgid \"Show hidden invitations\"\nmsgstr \"Affissà l’invitazioni piattate\"\n\n#: themes/default/templates/partial/render.js.ep:12\nmsgid \"Show zip content\"\nmsgstr \"Affissà u cuntenutu di u zip\"\n\n#: themes/default/templates/layouts/default.html.ep:40 themes/default/templates/layouts/default.html.ep:73 themes/default/templates/login.html.ep:28 themes/default/templates/logout.html.ep:17\nmsgid \"Signin\"\nmsgstr \"Autenticazione\"\n\n#: lib/Lufi/Controller/Invitation.pm:302 themes/default/templates/invitations/exception.html.ep:16\nmsgid \"Sorry, the invitation doesn’t exist. Are you sure you are on the right URL?\"\nmsgstr \"\"\n\"Per disgrazia, l’invitazione ùn esiste micca. Site sicura(u) d’impiegà l’\"\n\"indirizzu web currettu ?\"\n\n#: themes/default/templates/index.html.ep:46\nmsgid \"Sorry, the uploading is currently disabled. Please try again later.\"\nmsgstr \"\"\n\"Per disgrazia, l’incaricamentu di schedariu hè disattivatu à st’ora. Pruvate \"\n\"torna un altra volta.\"\n\n#: lib/Lufi/Controller/Files.pm:82\nmsgid \"Sorry, uploading is disabled.\"\nmsgstr \"Per disgrazia, l’incaricamentu di schedariu hè disattivatu.\"\n\n#: themes/default/templates/invitations/exception.html.ep:7\nmsgid \"Sorry, your invitation has expired or has been deleted.\"\nmsgstr \"Per disgrazia, a vostra invitazione hè scaduta o hè stata squassata.\"\n\n#. ($invit->ldap_user_mail)\n#: lib/Lufi/Controller/Files.pm:123\nmsgid \"Sorry, your invitation has expired or has been deleted. Please contact %1 to have another invitation.\"\nmsgstr \"\"\n\"Per disgrazia, a vostra invitazione hè scaduta o hè stata squassata. Ci vole \"\n\"à cuntattà %1 per ottene un altra invitazione.\"\n\n#. ($invitation->ldap_user_mail)\n#: lib/Lufi/Controller/Invitation.pm:295\nmsgid \"The URLs of your files have been sent by email to %1.\"\nmsgstr \"\"\n\"L’indirizzi web di i vostri schedarii sò stati mandati à %1 da messaghju \"\n\"elettronicu.\"\n\n#: themes/default/templates/about.html.ep:7\nmsgid \"The administrator can only see the file's name, its size and its mimetype (what kind of file it is: video, text, etc.).\"\nmsgstr \"\"\n\"L’amministratore pò solu vede u nome di u schedariu, a so dimensione è u so «\"\n\" mimetype » (u so tipu di schedariu : sonu, filmettu, testu, ecc.).\"\n\n#: lib/Lufi/Controller/Mail.pm:67\nmsgid \"The body of the mail must contain at least one URL pointing to a file hosted on this instance.\"\nmsgstr \"\"\n\"U testu di u messaghju deve cuntene omancu un indirizzu web chì appunteghja \"\n\"versu un schedariu ospitatu nant’à st’istanza.\"\n\n#: themes/default/templates/partial/files.js.ep:11\nmsgid \"The data has been successfully imported.\"\nmsgstr \"I dati sò stati impurtati currettamente.\"\n\n#: lib/Lufi/Controller/Mail.pm:87\nmsgid \"The email body can't be empty.\"\nmsgstr \"U testu di u messaghju elettronicu ùn pò micca esse viotu.\"\n\n#: lib/Lufi/Controller/Mail.pm:86\nmsgid \"The email subject can't be empty.\"\nmsgstr \"U sughjettu di u messaghju elettronicu ùn pò micca esse viotu.\"\n\n#. ($expire_at, $max_expire_at)\n#: lib/Lufi/Controller/Invitation.pm:52\nmsgid \"The expiration delay (%1) is not between 1 and %2 days.\"\nmsgstr \"U cumportu di scadenza (%1) ùn hè micca trà 1 è %2 ghjorni.\"\n\n#: lib/Lufi/Controller/Files.pm:462\nmsgid \"The file has already been deleted\"\nmsgstr \"U schedariu hè statu squassatu dighjà\"\n\n#: themes/default/templates/about.html.ep:6\nmsgid \"The files uploaded on a Lufi instance are encrypted before the upload to the server: the administrator of the server can not see the file's content.\"\nmsgstr \"\"\n\"I schedarii incaricati nant’à una istanza Lufi sò cifrati prima d’esse \"\n\"incaricati nant’à u servitore : l’amministratore di u servitore ùn pò micca \"\n\"vede u cuntenutu di i schedarii.\"\n\n#. (join(', ', @bad)\n#: lib/Lufi/Controller/Mail.pm:82\nmsgid \"The following email addresses are not valid: %1\"\nmsgstr \"Quelli indirizzi elettronichi ùn sò micca accettevule : %1\"\n\n#. ($guest_mail)\n#: lib/Lufi/Controller/Invitation.pm:49\nmsgid \"The guest email address (%1) is unvalid.\"\nmsgstr \"L’indirizzu elettronicu di l’invitatu (%1) ùn hè micca accettevule.\"\n\n#. ($i->token, $c->current_user->{username})\n#: lib/Lufi/Controller/Invitation.pm:136\nmsgid \"The invitation %1 can’t be deleted: it wasn’t created by you (%2).\"\nmsgstr \"\"\n\"L’invitazione %1 ùn pò micca esse squassata : ùn hè micca stata creata da \"\n\"voi (%2).\"\n\n#. ($i->token, $i->guest_mail)\n#: lib/Lufi/Controller/Invitation.pm:163\nmsgid \"The invitation %1 can’t be resent: %2 has already sent files.<br>Please create a new invitation.\"\nmsgstr \"\"\n\"L’invitazione %1 ùn pò micca esse mandata torna : %2 hà dighjà mandatu i \"\n\"schedarii.<br>Ci vole à creà un’altra invitazione.\"\n\n#. ($i->token, $c->current_user->{username})\n#: lib/Lufi/Controller/Invitation.pm:187\nmsgid \"The invitation %1 can’t be resent: it wasn’t created by you (%2).\"\nmsgstr \"\"\n\"L’invitazione %1 ùn pò micca esse mandata torna : ùn hè micca stata creata \"\n\"da voi (%2).\"\n\n#. ($i->token)\n#: lib/Lufi/Controller/Invitation.pm:134\nmsgid \"The invitation %1 has been deleted.\"\nmsgstr \"L’invitazione %1 hè stata squassata.\"\n\n#. (stash('user_mail')\n#: themes/default/templates/invitations/invite.html.ep:34\nmsgid \"The invitation mail will be send from your email address (%1).\"\nmsgstr \"\"\n\"U messaghju elettronicu d’invitazione serà mandatu da u vostru indirizzu \"\n\"elettronicu (%1).\"\n\n#: themes/default/templates/partial/index.js.ep:16\nmsgid \"The link(s) has been copied to your clipboard\"\nmsgstr \"U(i) liame(i) hè(sò) statu(i) cupiatu(i) in u vostru preme’papei\"\n\n#. (stash('invitation')\n#: themes/default/templates/index.html.ep:30\nmsgid \"The link(s) of your file(s) will automatically be sent by mail to %1 (%2)\"\nmsgstr \"\"\n\"U(i) liame(i) di u(i) vostru(i) schedariu(i) serà(seranu) mandatu(i) \"\n\"autumaticamente da messaghju à %1 (%2)\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:11\nmsgid \"The links of your file(s) will automatically be sent by mail to %1.\"\nmsgstr \"\"\n\"I liami di u(i) vostru(i) schedariu(i) seranu mandati autumaticamente da \"\n\"messaghju à %1.\"\n\n#: lib/Lufi/Controller/Mail.pm:111\nmsgid \"The mail has been sent.\"\nmsgstr \"U messaghju hè statu mandatu.\"\n\n#: themes/default/templates/about.html.ep:15\nmsgid \"The original (and only for now) author is <a href=\\\"https://fiat-tux.fr\\\" class=\\\"classic\\\">Luc Didry</a>.\"\nmsgstr \"\"\n\"L’autore d’origine (è per ora, l’unicu) hè <a href=\\\"https://fiat-tux.fr\\\" \"\n\"class=\\\"classic\\\">Luc Didry</a>.\"\n\n#: lib/Lufi/Controller/Files.pm:230\nmsgid \"The server was unable to find the file record to add your file part to. Please, contact the administrator.\"\nmsgstr \"\"\n\"U servitore ùn hè micca statu capace di ritruvà l’arregistramentu di u \"\n\"schedariu à quellu aghjunghje a vostra parte di schedariu. Ci vole à \"\n\"cuntattà u vostru amministratore.\"\n\n#: lib/Lufi/Controller/Files.pm:289\nmsgid \"This file has been deactivated by the admins. Contact them to know why.\"\nmsgstr \"\"\n\"U schedariu hè statu disattivatu da l’amministratori. Ci vole à cuntattalli \"\n\"per cunnoscene a ragione.\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:46 themes/default/templates/partial/invitations.js.ep:6\nmsgid \"This invitation is normally hidden\"\nmsgstr \"St’invitazione hè, di regula, piattata\"\n\n#. (stash('expires')\n#: themes/default/templates/invitations/invite.mail.ep:13\nmsgid \"This invitation is valid until %1.\"\nmsgstr \"St’invitazione hè accettevule sin’à %1.\"\n\n#: themes/default/templates/delays.html.ep:13\nmsgid \"This server sets limitations according to the file size. The expiration delay of your file will be the minimum between what you choose and the following limitations:\"\nmsgstr \"\"\n\"Stu servitore definisce limitazioni secondu à a dimensione di u schedariu. U \"\n\"cumportu di scadenza di u vostru schedariu serà u minimu trà ciò chì vò \"\n\"avete sceltu è quelle limitazioni :\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:16\nmsgid \"Toggle visibility\"\nmsgstr \"Invertisce a visibilità\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:25\nmsgid \"URL\"\nmsgstr \"Indirizzu web\"\n\n#: themes/default/templates/partial/index.js.ep:17\nmsgid \"Unable to copy the link(s) to your clipboard\"\nmsgstr \"Impussibule di cupià u(i) liame(i) in u vostru preme’papei\"\n\n#: themes/default/templates/partial/render.js.ep:13\nmsgid \"Unable to download the file: too much unsuccessful attempts to open a websocket. Please, contact the administrator.\"\nmsgstr \"\"\n\"Impussibule di scaricà u schedariu : troppu tentativi infruttuosi per apre \"\n\"un websocket. Ci vole à cuntattà u vostru amministratore.\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:433\nmsgid \"Unable to get counter for %1. The file does not exists. It will be removed from your localStorage.\"\nmsgstr \"\"\n\"Impussibule d’ottene u cuntadore per %1. U schedariu ùn esiste micca. Hà da \"\n\"esse cacciatu da u vostru localStorage.\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:423\nmsgid \"Unable to get counter for %1. The token is invalid.\"\nmsgstr \"Impussibule d’ottene u cuntadore per %1. U gettone hè inaccettevule.\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:443\nmsgid \"Unable to get counter for %1. You are not authenticated.\"\nmsgstr \"Impussibule d’ottene u cuntadore per %1. Ùn site micca autenticati.\"\n\n#: themes/default/templates/layouts/default.html.ep:33 themes/default/templates/layouts/default.html.ep:66\nmsgid \"Upload files\"\nmsgstr \"Incaricà schedarii\"\n\n#: themes/default/templates/index.html.ep:145\nmsgid \"Upload generated zip file\"\nmsgstr \"Incaricà u schedariu zip ingeneratu\"\n\n#: themes/default/templates/files.html.ep:31\nmsgid \"Uploaded at\"\nmsgstr \"Incaricatu à\"\n\n#: themes/default/templates/index.html.ep:153\nmsgid \"Uploaded files\"\nmsgstr \"Schedarii incaricati\"\n\n#: themes/default/templates/about.html.ep:20\nmsgid \"Version\"\nmsgstr \"Versione\"\n\n#: themes/default/templates/partial/index.js.ep:31\nmsgid \"Websocket communication error\"\nmsgstr \"Sbagliu di cumunicazione websocket\"\n\n#: themes/default/templates/about.html.ep:3\nmsgid \"What is Lufi?\"\nmsgstr \"Cosa hè Lufi ?\"\n\n#: themes/default/templates/about.html.ep:14\nmsgid \"Who wrote this software?\"\nmsgstr \"Quale chì hà scrittu stu prugramma ?\"\n\n#: themes/default/templates/partial/index.js.ep:13\nmsgid \"XXX file has been added to upload queue.\"\nmsgstr \"U schedariu XXX hè statu aghjuntu à a fila d’attesa d’incaricamentu.\"\n\n#: themes/default/templates/invitations/invite.html.ep:30\nmsgid \"You can invite someone to send you files through this Lufi instance even if they don’t have an account on it.\"\nmsgstr \"\"\n\"Pudete invità qualcunu à mandavvi schedarii via st’istanza Lufi ancu s’è sta \"\n\"persona ùn ci hà micca contu.\"\n\n#: themes/default/templates/about.html.ep:11\nmsgid \"You can see the list of your files by clicking on the \\\"My files\\\" link at the top right of this page.\"\nmsgstr \"\"\n\"Pudete vede a lista di i vostri schedarii da un cliccu nant’à u liame « I mo \"\n\"schedarii » insù è à diritta di sta pagina.\"\n\n#. ($orig_uri)\n#: lib/Lufi/Controller/Mail.pm:43 lib/Lufi/Controller/Mail.pm:59\nmsgid \"You can't add URLs that are not related to this instance (%1).\"\nmsgstr \"\"\n\"Ùn pudete micca aghjunghje indirizzi web chì ùn sò micca in relazione cù st’\"\n\"istanza (%1).\"\n\n#: themes/default/templates/about.html.ep:8\nmsgid \"You don't need to register yourself to upload files but be aware that, for legal reasons, your IP address will be stored when you send a file. Don't panic, this is normally the case for all sites on which you send files.\"\nmsgstr \"\"\n\"Ùn avete micca bisognu d’arregistravvi per incaricà schedarii ma, sappiate \"\n\"chì, per ragioni legale, u vostru indirizzu IP serà arregistratu quandu vò \"\n\"mandate un schedariu. Ùn spaventavvi, di regula, ghjè listessa per tutti i \"\n\"siti induve sì pò mandà schedarii.\"\n\n#: themes/default/templates/partial/render.js.ep:11\nmsgid \"You don't seem to have a key in your URL. You won't be able to decrypt the file. Download canceled.\"\nmsgstr \"\"\n\"Pare chì ùn abbiate micca chjave in u vostru indirizzu web. Ùn seriate micca \"\n\"capace di dicifrà u schedariu. Scaricamentu abbandunatu.\"\n\n#: themes/default/templates/partial/render.js.ep:7\nmsgid \"You have attempted to leave this page. The download will be canceled. Are you sure?\"\nmsgstr \"\"\n\"Avete fattu un tentativu per lascià sta pagina. U scaricamentu serà \"\n\"abbandunatu. Site sicuri ?\"\n\n#: themes/default/templates/partial/index.js.ep:14\nmsgid \"You have attempted to leave this page. The upload will be canceled. Are you sure?\"\nmsgstr \"\"\n\"Avete fattu un tentativu per lascià sta pagina. L’incaricamentu serà \"\n\"abbandunatu. Site sicuri ?\"\n\n#: themes/default/templates/logout.html.ep:14\nmsgid \"You have been successfully logged out.\"\nmsgstr \"Vi site scunnessi currettamente.\"\n\n#: lib/Lufi/Controller/Mail.pm:85\nmsgid \"You must give email addresses.\"\nmsgstr \"Duvete furnisce indirizzi elettronichi.\"\n\n#: themes/default/templates/index.html.ep:38\nmsgid \"Your browser does not have enough entropy to generate a strong encryption key. Please wait (it's better if you do things on your computer while waiting).\"\nmsgstr \"\"\n\"U vostru navigatore ùn hà abbastanza energia per ingenerà una chjave di \"\n\"cifratura forta. Ci vole à aspettà (hè megliu s’è vò fate qualcosa durante \"\n\"l’attesa).\"\n\n#. (format_bytes($json->{size})\n#: lib/Lufi/Controller/Files.pm:95\nmsgid \"Your file is too big: %1 (maximum size allowed: %2)\"\nmsgstr \"\"\n\"U vostru schedariu hè troppu maiò : %1 (dimensione massima accettata  %2)\"\n\n#: lib/Lufi/Controller/Files.pm:345\nmsgid \"Your password is not valid. Please refresh the page to retry.\"\nmsgstr \"\"\n\"A vostra parolla d’intesa ùn hè micca accettevule. Ci vole à attualizà a \"\n\"pagina per pruvà torna.\"\n\n#: themes/default/templates/partial/render.js.ep:14\nmsgid \"Zip content:\"\nmsgstr \"Cuntenutu di u zip :\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:24\nmsgid \"between %1 and %2, the file will be kept %3 day(s).\"\nmsgstr \"trà %1 è %2, u schedariu serà cunservatu %3 ghjornu(i).\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:26\nmsgid \"between %1 and %2, the file will be kept forever.\"\nmsgstr \"trà %1 è %2, u schedariu serà cunservatu ab’eternu.\"\n\n#: themes/default/templates/partial/mail.js.ep:42\nmsgid \"deadline: \"\nmsgstr \"ultimu cumportu : \"\n\n#: themes/default/templates/partial/invitations.js.ep:5\nmsgid \"expires on XXX\"\nmsgstr \"scadenza u XXX\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:30\nmsgid \"for %1 and more, the file will be kept %2 day(s)\"\nmsgstr \"per %1 è più, u schedariu serà cunservatu %2 ghjornu(i)\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:32\nmsgid \"for %1 and more, the file will be kept forever.\"\nmsgstr \"per %1 è più, u schedariu serà cunservatu ab’eternu.\"\n\n#: themes/default/templates/index.html.ep:3\nmsgid \"no time limit\"\nmsgstr \"senza limitazione di tempu\"\n\n#: themes/default/templates/index.html.ep:124\nmsgid \"or\"\nmsgstr \"o\"\n\n#. ($e->{name}, format_bytes($e->{size})\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:12\nmsgid \"— %1 (%2), that will expire on %3\"\nmsgstr \"— %1 (%2), chì serà scadutu u %3\"\n\n#:\nmsgid \"You can't add URLs that are not related to this instance.\"\nmsgstr \"\"\n\"Ùn pudete micca aghjunghje indirizzi web chì ùn sò micca in relazione cù \"\n\"st’istanza.\"\n"
  },
  {
    "path": "themes/default/lib/Lufi/I18N/de.po",
    "content": "# frju365 <abld@abld.info>, 2018. #zanata\n# Armando <armando@noplanman.ch>, 2019. #zanata\n# Luc Didry <luc@framasoft.org>, 2019. #zanata\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\\n\"\n\"PO-Revision-Date: 2021-11-08 11:05+0000\\n\"\n\"Last-Translator: pi <pi@solidaris.me>\\n\"\n\"Language-Team: German <https://weblate.framasoft.org/projects/lufi/\"\n\"default-theme/de/>\\n\"\n\"Language: de\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=n != 1;\\n\"\n\"X-Generator: Weblate 4.8.1\\n\"\n\n#. ($delay)\n#. (max_delay)\n#: themes/default/templates/index.html.ep:56 themes/default/templates/index.html.ep:65 themes/default/templates/index.html.ep:66\nmsgid \"%1 days\"\nmsgstr \"%1 Tage\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:2\nmsgid \"%1 invites you to send him/her files\"\nmsgstr \"%1 lädt Sie ein, ihm/ihr Dateien zu senden\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:6\nmsgid \"%1 invites you to send him/her files through Lufi.\"\nmsgstr \"%1 lädt Sie ein, ihm/ihr Dateien über Lufi zu senden.\"\n\n#. (stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:4\nmsgid \"%1 sent you files\"\nmsgstr \"%1 hat Ihnen Dateien zugesandt\"\n\n#. (stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:8\nmsgid \"%1 used your invitation to send you files:\"\nmsgstr \"%1 hat Ihre Einladung genutzt, um Ihnen Dateien zu schicken:\"\n\n#: lib/Lufi/Controller/Invitation.pm:159 lib/Lufi/Controller/Invitation.pm:84 themes/default/templates/invitations/my_invitations.html.ep:51 themes/default/templates/invitations/my_invitations.html.ep:52 themes/default/templates/invitations/my_invitations.html.ep:53 themes/default/templates/invitations/notification_files_sent.mail.ep:12\nmsgid \"%A %d %B %Y at %T\"\nmsgstr \"%A, %d. %B %Y um %T\"\n\n#: themes/default/templates/partial/index.js.ep:27\nmsgid \"(max size: XXX)\"\nmsgstr \"(maximale Größe: XXX)\"\n\n#: themes/default/templates/index.html.ep:5\nmsgid \"1 year\"\nmsgstr \"1 Jahr\"\n\n#: themes/default/templates/index.html.ep:4 themes/default/templates/index.html.ep:65\nmsgid \"24 hours\"\nmsgstr \"24 Stunden\"\n\n#: themes/default/templates/partial/mail.js.ep:40\nmsgid \":\"\nmsgstr \":\"\n\n#: themes/default/templates/render.html.ep:42\nmsgid \"Abort\"\nmsgstr \"Abbrechen\"\n\n#: themes/default/templates/layouts/default.html.ep:53 themes/default/templates/layouts/default.html.ep:86\nmsgid \"About\"\nmsgstr \"Über\"\n\n#: themes/default/templates/index.html.ep:107\nmsgid \"Add a password to file(s)\"\nmsgstr \"Ein Passwort zu den Dateien hinzufügen\"\n\n#: themes/default/templates/mail.html.ep:16\nmsgid \"\"\n\"Adding URLs not related to this Lufi instance to the mail body or subject is \"\n\"prohibited.\"\nmsgstr \"\"\n\"Das Hinzufügen von URLs in den Mailtext oder Betreff, die nicht mit dieser \"\n\"Lufi-Instanz in Verbindung stehen, ist verboten.\"\n\n#: themes/default/templates/partial/invitations.js.ep:3\nmsgid \"Are you sure you want to delete the selected invitations?\"\nmsgstr \"\"\n\"Sind Sie sicher, dass Sie die ausgewählten Einladungen löschen möchten?\"\n\n#: themes/default/templates/partial/invitations.js.ep:4\nmsgid \"\"\n\"Are you sure you want to resend the invitation mail for the selected \"\n\"invitations?\"\nmsgstr \"\"\n\"Sind Sie sicher, dass Sie die Einladungsmail für die ausgewählten \"\n\"Einladungen erneut versenden möchten?\"\n\n#: themes/default/templates/about.html.ep:17\nmsgid \"\"\n\"As Lufi is a free software licensed under of the terms of the <a href=\"\n\"\\\"https://gnu.org/licenses/agpl.html\\\" class=\\\"classic\\\">AGPLv3</a>, you can \"\n\"install it on you own server. Have a look on the <a href=\\\"https://framagit.\"\n\"org/luc/lufi/wikis/home\\\" class=\\\"classic\\\">Wiki</a> for the procedure.\"\nmsgstr \"\"\n\"Da es sich bei Lufi um eine freie Software handelt, die unter den \"\n\"Bedingungen der <a href=\\\"https://gnu.org/licenses/agpl.html\\\" class=\"\n\"\\\"classic\\\">AGPLv3</a> lizenziert ist, können Sie sie auf Ihrem eigenen \"\n\"Server installieren. Werfen Sie einen Blick auf die <a href=\\\"https://\"\n\"framagit.org/luc/lufi/wikis/home\\\" class=\\\"classic\\\">Wiki</a> für das \"\n\"Verfahren.\"\n\n#. (stash('nbslices')\n#: themes/default/templates/partial/render.js.ep:9\nmsgid \"Asking for file part XX1 of %1\"\nmsgstr \"Abfrage des Dateiteils XX1 von %1\"\n\n#: themes/default/templates/about.html.ep:20\nmsgid \"Back to homepage\"\nmsgstr \"Zurück zur Hauptseite\"\n\n#: lib/Lufi/Controller/Mail.pm:25\nmsgid \"Bad CSRF token!\"\nmsgstr \"Schlechtes CSRF-Token!\"\n\n#: lib/Lufi/Controller/Auth.pm:27 lib/Lufi/Controller/Auth.pm:49\nmsgid \"Bad CSRF token.\"\nmsgstr \"Schlechtes CSRF-Token.\"\n\n#: themes/default/templates/partial/render.js.ep:5\nmsgid \"Click here to refresh the page and restart the download.\"\nmsgstr \"\"\n\"Klicken Sie hier, um die Seite zu aktualisieren und den Download neu zu \"\n\"starten.\"\n\n#: themes/default/templates/invitations/invite.mail.ep:8\nmsgid \"Click on the following URL to upload files on Lufi:\"\nmsgstr \"Klicken Sie auf die folgende URL, um Dateien auf Lufi hochzuladen:\"\n\n#: themes/default/templates/index.html.ep:126\nmsgid \"Click to open the file browser\"\nmsgstr \"Klicken um den Dateibrowser zu öffnen\"\n\n#: themes/default/templates/delays.html.ep:38 themes/default/templates/invitations/my_invitations.html.ep:80\nmsgid \"Close\"\nmsgstr \"Schließen\"\n\n#: themes/default/templates/mail.html.ep:23\nmsgid \"Comma-separated email addresses\"\nmsgstr \"Kommagetrennte E-Mail-Adressen\"\n\n#: themes/default/templates/index.html.ep:140\nmsgid \"Compressing zip file…\"\nmsgstr \"Komprimierung der Zip-Datei…\"\n\n#: themes/default/templates/partial/index.js.ep:15\nmsgid \"Copy all links to clipboard\"\nmsgstr \"Alle Links in die Zwischenablage kopieren\"\n\n#: themes/default/templates/partial/index.js.ep:18\nmsgid \"Copy to clipboard\"\nmsgstr \"In die Zwischenablage kopieren\"\n\n#: lib/Lufi/Controller/Files.pm:507\nmsgid \"Could not delete the file. You are not authenticated.\"\nmsgstr \"Die Datei konnte nicht gelöscht werden. Sie sind nicht angemeldet.\"\n\n#: lib/Lufi/Controller/Files.pm:489\nmsgid \"Could not find the file. Are you sure of the URL and the token?\"\nmsgstr \"\"\n\"Die Datei konnte nicht gefunden werden. Sind Sie sich der URL und des Token \"\n\"sicher?\"\n\n#: lib/Lufi/Controller/Files.pm:400\nmsgid \"Could not find the file. Are you sure of the URL?\"\nmsgstr \"Die Datei konnte nicht gefunden werden. Sind Sie sich der URL sicher?\"\n\n#: themes/default/templates/files.html.ep:29\nmsgid \"Counter\"\nmsgstr \"Zähler\"\n\n#: themes/default/templates/index.html.ep:100\nmsgid \"Create a zip archive with the files before uploading?\"\nmsgstr \"Ein Zip-Archiv mit den Dateien vor dem Hochladen erstellen?\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:26\nmsgid \"Created at\"\nmsgstr \"Erstellt am\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:14\nmsgid \"Delete\"\nmsgstr \"Löschen\"\n\n#: themes/default/templates/files.html.ep:30 themes/default/templates/index.html.ep:90\nmsgid \"Delete at first download?\"\nmsgstr \"Beim ersten Download löschen?\"\n\n#: themes/default/templates/files.html.ep:19\nmsgid \"Delete selected files\"\nmsgstr \"Ausgewählte Dateien löschen\"\n\n#: themes/default/templates/files.html.ep:33 themes/default/templates/partial/index.js.ep:19\nmsgid \"Deletion link\"\nmsgstr \"Link zum Löschen\"\n\n#: themes/default/templates/delays.html.ep:8\nmsgid \"\"\n\"Don't worry: if a user begins to download the file before the expiration and \"\n\"the download ends after the expiration, he will be able to get the file.\"\nmsgstr \"\"\n\"Keine Sorge: Wenn ein Benutzer vor Ablauf der Frist mit dem Herunterladen \"\n\"der Datei beginnt und der Download nach Ablauf der Frist endet, kann er die \"\n\"Datei herunterladen.\"\n\n#: themes/default/templates/partial/index.js.ep:21 themes/default/templates/render.html.ep:28\nmsgid \"Download\"\nmsgstr \"Herunterladen\"\n\n#: themes/default/templates/partial/render.js.ep:4\nmsgid \"Download aborted.\"\nmsgstr \"Herunterladen abgebrochen.\"\n\n#: themes/default/templates/files.html.ep:28 themes/default/templates/partial/index.js.ep:20\nmsgid \"Download link\"\nmsgstr \"Link zum Herunterladen\"\n\n#: themes/default/templates/about.html.ep:10\nmsgid \"\"\n\"Drag and drop files in the appropriate area or use the traditional way to \"\n\"send files and the files will be chunked, encrypted and sent to the server. \"\n\"You will get two links per file: a download link, that you give to the \"\n\"people you want to share the file with and a deletion link, allowing you to \"\n\"delete the file whenever you want.\"\nmsgstr \"\"\n\"Ziehen Sie Dateien per Drag-and-Drop in den entsprechenden Bereich oder \"\n\"verwenden Sie die traditionelle Methode zum Senden von Dateien und die \"\n\"Dateien werden zerlegt, verschlüsselt und an den Server gesendet. Sie \"\n\"erhalten zwei Links pro Datei: einen Download-Link, den Sie den Personen \"\n\"geben, mit denen Sie die Datei teilen möchten, und einen Lösch-Link, mit dem \"\n\"Sie die Datei jederzeit löschen können.\"\n\n#: themes/default/templates/index.html.ep:122\nmsgid \"Drop files here\"\nmsgstr \"Dateien hier ablegen\"\n\n#: themes/default/templates/invitations/invite.html.ep:40\nmsgid \"Email address of your guest\"\nmsgstr \"E-Mail-Adresse Ihres Gastes\"\n\n#: themes/default/templates/mail.html.ep:39\nmsgid \"Email body\"\nmsgstr \"E-Mail-Text\"\n\n#: themes/default/templates/mail.html.ep:31\nmsgid \"Email subject\"\nmsgstr \"E-Mail-Betreff\"\n\n#: themes/default/templates/mail.html.ep:25 themes/default/templates/mail.html.ep:27\nmsgid \"Emails\"\nmsgstr \"E-Mails\"\n\n#: themes/default/templates/partial/index.js.ep:22\nmsgid \"Encrypting part XX1 of XX2\"\nmsgstr \"Verschlüsselung von Teil XX1 von XX2\"\n\n#: lib/Lufi/Controller/Files.pm:289\nmsgid \"Error: the file existed but was deleted.\"\nmsgstr \"Fehler: Die Datei existierte, wurde aber gelöscht.\"\n\n#: lib/Lufi/Controller/Files.pm:369\nmsgid \"Error: the file has not been sent entirely.\"\nmsgstr \"Fehler: Die Datei wurde nicht vollständig gesendet.\"\n\n#: lib/Lufi/Controller/Files.pm:379\nmsgid \"Error: unable to find the file. Are you sure of your URL?\"\nmsgstr \"\"\n\"Fehler: Die Datei konnte nicht gefunden werden. Sind Sie Ihrer URL sicher?\"\n\n#: themes/default/templates/partial/index.js.ep:23\nmsgid \"Expiration:\"\nmsgstr \"Ablaufdatum:\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:27\nmsgid \"Expire at\"\nmsgstr \"Verfällt am\"\n\n#: themes/default/templates/files.html.ep:32\nmsgid \"Expires at\"\nmsgstr \"Verfällt am\"\n\n#: themes/default/templates/files.html.ep:12\nmsgid \"Export localStorage data\"\nmsgstr \"Exportieren von localStorage-Daten\"\n\n#: lib/Lufi/Controller/Files.pm:471\nmsgid \"File deleted\"\nmsgstr \"Datei gelöscht\"\n\n#: themes/default/templates/files.html.ep:27\nmsgid \"File name\"\nmsgstr \"Dateiname\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:61\nmsgid \"Files\"\nmsgstr \"Dateien\"\n\n#: themes/default/templates/index.html.ep:80\nmsgid \"Files deleted at first download\"\nmsgstr \"Dateien, die beim ersten Download gelöscht wurden\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:28\nmsgid \"Files sent at\"\nmsgstr \"Dateien gesendet am\"\n\n#: themes/default/templates/partial/invitations.js.ep:8\nmsgid \"Files sent in invitation XX1 by XX2\"\nmsgstr \"Dateien, die in der Einladung XX1 von XX2 gesendet wurden\"\n\n#: themes/default/templates/partial/render.js.ep:8\nmsgid \"Get the file\"\nmsgstr \"Die Datei herunterladen\"\n\n#: themes/default/templates/about.html.ep:18\nmsgid \"\"\n\"Get the source code on <a href=\\\"https://framagit.org/luc/lufi\\\" class=\"\n\"\\\"classic\\\">the official repository</a> or on its <a href=\\\"https://github.\"\n\"com/ldidry/lufi\\\" class=\\\"classic\\\">Github mirror</a>\"\nmsgstr \"\"\n\"Holen Sie sich den Quellcode vom <a href=\\\"https://framagit.org/luc/lufi\\\" \"\n\"class=\\\"classic\\\">offiziellen Repository</a> oder von dessen <a href=\\\"\"\n\"https://github.com/ldidry/lufi\\\" class=\\\"classic\\\">Github mirror</a>\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:24\nmsgid \"Guest mail\"\nmsgstr \"Gast-E-Mail-Adresse\"\n\n#. (ucfirst(stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:6\nmsgid \"Hello %1,\"\nmsgstr \"Hallo %1,\"\n\n#: themes/default/templates/invitations/invite.mail.ep:4\nmsgid \"Hello,\"\nmsgstr \"Hallo,\"\n\n#: themes/default/templates/partial/mail.js.ep:35\nmsgid \"Hello,\\\\n\\\\nHere's some files I want to share with you:\\\\n\"\nmsgstr \"\"\n\"Hallo,\\\\n\\\\nHier sind einige Dateien, die ich mit Ihnen teilen möchte:\\\\n\"\n\n#: themes/default/templates/mail.html.ep:35\nmsgid \"Here's some files\"\nmsgstr \"Hier sind einige Dateien\"\n\n#: themes/default/templates/partial/invitations.js.ep:7\nmsgid \"Hide hidden invitations\"\nmsgstr \"Versteckte Einladungen ausblenden\"\n\n#: themes/default/templates/partial/index.js.ep:25\nmsgid \"Hit Enter, then Ctrl+C to copy all the download links\"\nmsgstr \"Drücken Sie Enter und dann Ctrl+C, um alle Download-Links zu kopieren\"\n\n#: themes/default/templates/partial/index.js.ep:24\nmsgid \"Hit Enter, then Ctrl+C to copy the download link\"\nmsgstr \"Drücken Sie Enter und dann Ctrl+C, um den Download-Link zu kopieren\"\n\n#: themes/default/templates/about.html.ep:9\nmsgid \"How does it work?\"\nmsgstr \"Wie funktioniert es?\"\n\n#: themes/default/templates/invitations/invite.html.ep:46\nmsgid \"How many days would you like the invitation to be valid?\"\nmsgstr \"Wie viele Tage soll die Einladung gültig sein?\"\n\n#: themes/default/templates/about.html.ep:16\nmsgid \"How to install the software on my server?\"\nmsgstr \"Wie kann ich die Software auf meinem Server installieren?\"\n\n#: themes/default/templates/about.html.ep:12\nmsgid \"How to report an illegal file?\"\nmsgstr \"Wie kann man eine illegale Datei melden?\"\n\n#: themes/default/templates/delays.html.ep:7\nmsgid \"If you choose a delay, the file will be deleted after that delay.\"\nmsgstr \"\"\n\"Wenn Sie eine Frist wählen, wird die Datei nach diesem Zeitraum gelöscht.\"\n\n#: themes/default/templates/mail.html.ep:15\nmsgid \"\"\n\"If you send the mail from this server, the links will be sent to the server, \"\n\"which may lower your privacy protection.\"\nmsgstr \"\"\n\"Wenn Sie die E-Mail von diesem Server aus versenden, werden die Links an den \"\n\"Server gesendet, was den Schutz Ihrer Privatsphäre beeinträchtigen kann.\"\n\n#: themes/default/templates/files.html.ep:14\nmsgid \"Import localStorage data\"\nmsgstr \"Importieren von localStorage-Daten\"\n\n#: themes/default/templates/index.html.ep:53\nmsgid \"Important: more information on delays\"\nmsgstr \"Wichtig: weitere Informationen zu den Fristen\"\n\n#: themes/default/templates/delays.html.ep:5\nmsgid \"Information about delays\"\nmsgstr \"Informationen zu den Fristen\"\n\n#: themes/default/templates/files.html.ep:18 themes/default/templates/invitations/my_invitations.html.ep:12\nmsgid \"Invert selection\"\nmsgstr \"Auswahl umkehren\"\n\n#. ($i->guest_mail, $url)\n#: lib/Lufi/Controller/Invitation.pm:171\nmsgid \"Invitation resent to %1.<br> URL: %2\"\nmsgstr \"Die Einladung wurde erneut an %1 gesendet.<br> URL: %2\"\n\n#. ($invitation->guest_mail, $url)\n#: lib/Lufi/Controller/Invitation.pm:87\nmsgid \"Invitation sent to %1.<br> URL: %2\"\nmsgstr \"Die Einladung wurde an %1 gesendet.<br> URL: %2\"\n\n#: themes/default/templates/invitations/invite.html.ep:27 themes/default/templates/layouts/default.html.ep:36 themes/default/templates/layouts/default.html.ep:69\nmsgid \"Invite a guest\"\nmsgstr \"Einen Gast einladen\"\n\n#: themes/default/templates/partial/render.js.ep:6\nmsgid \"\"\n\"It seems that the key in your URL is incorrect. Please, verify your URL.\"\nmsgstr \"\"\n\"Es scheint, dass der Schlüssel in Ihrer URL falsch ist. Bitte überprüfen Sie \"\n\"Ihre URL.\"\n\n#: themes/default/templates/index.html.ep:12\nmsgid \"Javascript is disabled. You won't be able to use Lufi.\"\nmsgstr \"Javascript ist deaktiviert. Sie werden Lufi nicht benutzen können.\"\n\n#: themes/default/templates/layouts/default.html.ep:44 themes/default/templates/layouts/default.html.ep:46 themes/default/templates/layouts/default.html.ep:77 themes/default/templates/layouts/default.html.ep:79\nmsgid \"Language\"\nmsgstr \"Sprache\"\n\n#: themes/default/templates/login.html.ep:15\nmsgid \"Login\"\nmsgstr \"Login\"\n\n#: themes/default/templates/layouts/default.html.ep:58 themes/default/templates/layouts/default.html.ep:91\nmsgid \"Logout\"\nmsgstr \"Abmelden\"\n\n#: themes/default/templates/about.html.ep:4\nmsgid \"Lufi is a free (as in free speech) file hosting software.\"\nmsgstr \"\"\n\"Lufi ist eine freie (wie bei der Redefreiheit) Datei-Hosting-Software.\"\n\n#: themes/default/templates/partial/files.js.ep:12\nmsgid \"\"\n\"Lufi recently changed its way to store files information.\\\\n\\\\nNo files have \"\n\"been found in the new localStorage location but we found files in the old \"\n\"one.\\\\nDo you want to import those informations?\\\\n\\\\nPlease note that this \"\n\"is the only time that we will ask you this.\"\nmsgstr \"\"\n\"Die Art und Weise wie Lufi Datei-Informationen speichert, wurde kürzlich \"\n\"geändert.\\\\n\"\n\"\\\\n\"\n\"Am neuen localStorage-Speicherort konnten keine Dateien gefunden werden, \"\n\"allerdings wurden Dateien am alten Speicherort gefunden.\\\\n\"\n\"Wollen Sie diese Informationen importieren?\\\\n\"\n\"\\\\n\"\n\"Bitte beachten Sie, dass diese Meldung nur ein einziges Mal angezeigt wird.\"\n\n#: themes/default/templates/files.html.ep:34\nmsgid \"Mail\"\nmsgstr \"E-Mail\"\n\n#: themes/default/templates/files.html.ep:3 themes/default/templates/layouts/default.html.ep:34 themes/default/templates/layouts/default.html.ep:67\nmsgid \"My files\"\nmsgstr \"Meine Dateien\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:5 themes/default/templates/layouts/default.html.ep:37 themes/default/templates/layouts/default.html.ep:70\nmsgid \"My invitations\"\nmsgstr \"Meine Einladungen\"\n\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:17\nmsgid \"\"\n\"NB: this list includes the list of files that have already been sent to you.\"\nmsgstr \"\"\n\"Hinweis: Diese Liste enthält die Liste der Dateien, die Ihnen bereits \"\n\"zugesandt wurden.\"\n\n#: themes/default/templates/index.html.ep:115\nmsgid \"Name of the zip file\"\nmsgstr \"Name der Zip-Datei\"\n\n#. (format_bytes($json->{size})\n#: lib/Lufi/Controller/Files.pm:108\nmsgid \"No enough space available on the server for this file (size: %1).\"\nmsgstr \"\"\n\"Auf dem Server ist nicht genügend Platz für diese Datei vorhanden (Größe: \"\n\"%1).\"\n\n#: themes/default/templates/partial/files.js.ep:10 themes/default/templates/partial/index.js.ep:28\nmsgid \"No expiration delay\"\nmsgstr \"Keine Ablauffrist\"\n\n#: themes/default/templates/files.html.ep:8\nmsgid \"\"\n\"Only the files sent with this browser will be listed here. This list is \"\n\"stored in localStorage: if you delete your localStorage data, you'll lose \"\n\"this list.\"\nmsgstr \"\"\n\"Nur die mit diesem Browser gesendeten Dateien werden hier aufgelistet. Diese \"\n\"Liste wird in localStorage gespeichert: Wenn Sie Ihre localStorage-Daten \"\n\"löschen, verlieren Sie diese Liste.\"\n\n#: themes/default/templates/index.html.ep:106 themes/default/templates/login.html.ep:21 themes/default/templates/render.html.ep:26\nmsgid \"Password\"\nmsgstr \"Passwort\"\n\n#. (config('contact')\n#: themes/default/templates/about.html.ep:13\nmsgid \"Please contact the administrator: %1\"\nmsgstr \"Bitte kontaktieren Sie den Administrator: %1\"\n\n#: themes/default/templates/render.html.ep:33\nmsgid \"\"\n\"Please wait while we are getting your file. We first need to download and \"\n\"decrypt all parts before you can get it.\"\nmsgstr \"\"\n\"Bitte warten Sie, bis wir Ihre Datei erhalten. Wir müssen zuerst alle Teile \"\n\"herunterladen und entschlüsseln, bevor Sie sie erhalten können.\"\n\n#: lib/Lufi/Controller/Auth.pm:38\nmsgid \"\"\n\"Please, check your credentials or your right to access this service: unable \"\n\"to authenticate.\"\nmsgstr \"\"\n\"Bitte überprüfen Sie Ihre Zugangsdaten oder Ihr Zugangsrecht zu diesem \"\n\"Dienst: keine Authentifizierung möglich.\"\n\n#: themes/default/templates/about.html.ep:5\nmsgid \"Privacy\"\nmsgstr \"Privatsphäre\"\n\n#: themes/default/templates/files.html.ep:13\nmsgid \"Purge expired files from localStorage\"\nmsgstr \"Abgelaufene Dateien aus localStorage bereinigen\"\n\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:20\nmsgid \"Regards,\"\nmsgstr \"Freundliche Grüße,\"\n\n#: themes/default/templates/invitations/invite.mail.ep:15\nmsgid \"Regards.\"\nmsgstr \"Freundliche Grüße.\"\n\n#: themes/default/templates/layouts/default.html.ep:31 themes/default/templates/layouts/default.html.ep:64\nmsgid \"Report file\"\nmsgstr \"Datei melden\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:15\nmsgid \"Resend invitation mail\"\nmsgstr \"Einladungsmail erneut senden\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:9\nmsgid \"Rows in purple mean that the invitations have expired.\"\nmsgstr \"\"\n\"Violett markierte Zeilen bedeuten, dass die Einladungen abgelaufen sind.\"\n\n#: themes/default/templates/files.html.ep:9\nmsgid \"\"\n\"Rows in red mean that the files have expired and are no longer available.\"\nmsgstr \"\"\n\"Rot markierte Zeilen bedeuten, dass die Dateien abgelaufen und nicht mehr \"\n\"verfügbar sind.\"\n\n#: themes/default/templates/partial/index.js.ep:26\nmsgid \"Send all links by email\"\nmsgstr \"Alle Links per E-Mail versenden\"\n\n#: themes/default/templates/invitations/invite.html.ep:50\nmsgid \"Send the invitation\"\nmsgstr \"Einladung senden\"\n\n#: themes/default/templates/mail.html.ep:46\nmsgid \"Send with this server\"\nmsgstr \"Mit diesem Server senden\"\n\n#: themes/default/templates/mail.html.ep:47\nmsgid \"Send with your own mail software\"\nmsgstr \"Mit Ihrer eigenen Mail-Software senden\"\n\n#: themes/default/templates/partial/index.js.ep:29\nmsgid \"\"\n\"Sending part XX1 of XX2. Please, be patient, the progress bar can take a \"\n\"while to move.\"\nmsgstr \"\"\n\"Senden von Teil XX1 von XX2. Bitte haben Sie Geduld, es könnte eine Weile \"\n\"dauern, bis sich der Fortschrittsbalken bewegt.\"\n\n#. (url_for('/')\n#: themes/default/templates/partial/mail.js.ep:48\nmsgid \"Share your files in total privacy on %1\"\nmsgstr \"Teilen Sie Ihre Dateien ganz vertraulich auf %1\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:13 themes/default/templates/partial/invitations.js.ep:9\nmsgid \"Show hidden invitations\"\nmsgstr \"Versteckte Einladungen anzeigen\"\n\n#: themes/default/templates/partial/render.js.ep:11\nmsgid \"Show zip content\"\nmsgstr \"Zip-Inhalt anzeigen\"\n\n#: themes/default/templates/layouts/default.html.ep:40 themes/default/templates/layouts/default.html.ep:73 themes/default/templates/login.html.ep:28 themes/default/templates/logout.html.ep:17\nmsgid \"Signin\"\nmsgstr \"Anmelden\"\n\n#: lib/Lufi/Controller/Invitation.pm:283 themes/default/templates/invitations/exception.html.ep:16\nmsgid \"\"\n\"Sorry, the invitation doesn’t exist. Are you sure you are on the right URL?\"\nmsgstr \"\"\n\"Es tut uns leid, diese Einladung existiert nicht. Sind Sie sicher, dass Sie \"\n\"die richtige URL haben?\"\n\n#: themes/default/templates/index.html.ep:46\nmsgid \"Sorry, the uploading is currently disabled. Please try again later.\"\nmsgstr \"\"\n\"Es tut uns leid, das Hochladen ist derzeit deaktiviert. Bitte versuchen Sie \"\n\"es später noch einmal.\"\n\n#: lib/Lufi/Controller/Files.pm:82\nmsgid \"Sorry, uploading is disabled.\"\nmsgstr \"Es tut uns leid, das Hochladen ist deaktiviert.\"\n\n#: themes/default/templates/invitations/exception.html.ep:7\nmsgid \"Sorry, your invitation has expired or has been deleted.\"\nmsgstr \"Es tut uns leid, Ihre Einladung ist abgelaufen oder wurde gelöscht.\"\n\n#. ($invit->ldap_user_mail)\n#: lib/Lufi/Controller/Files.pm:122\nmsgid \"\"\n\"Sorry, your invitation has expired or has been deleted. Please contact %1 to \"\n\"have another invitation.\"\nmsgstr \"\"\n\"Es tut uns leid, Ihre Einladung ist abgelaufen oder wurde gelöscht. Bitte \"\n\"kontaktieren Sie %1, um eine weitere Einladung zu erhalten.\"\n\n#. ($invitation->ldap_user_mail)\n#: lib/Lufi/Controller/Invitation.pm:276\nmsgid \"The URLs of your files have been sent by email to %1.\"\nmsgstr \"Die URLs Ihrer Dateien wurden per E-Mail an %1 gesendet.\"\n\n#: themes/default/templates/about.html.ep:7\nmsgid \"\"\n\"The administrator can only see the file's name, its size and its mimetype \"\n\"(what kind of file it is: video, text, etc.).\"\nmsgstr \"\"\n\"Der Administrator kann nur den Namen der Datei, ihre Größe und ihren Mimetyp \"\n\"(um welchen Dateityp es sich handelt: Video, Text, etc.) sehen.\"\n\n#: lib/Lufi/Controller/Mail.pm:53\nmsgid \"\"\n\"The body of the mail must contain at least one URL pointing to a file hosted \"\n\"on this instance.\"\nmsgstr \"\"\n\"Der Mailtext muss mindestens eine URL enthalten, die auf eine Datei \"\n\"verweist, die auf dieser Instanz gespeichert ist.\"\n\n#: themes/default/templates/partial/files.js.ep:11\nmsgid \"The data has been successfully imported.\"\nmsgstr \"Die Daten wurden erfolgreich importiert.\"\n\n#: lib/Lufi/Controller/Mail.pm:73\nmsgid \"The email body can't be empty.\"\nmsgstr \"Der E-Mail-Text darf nicht leer sein.\"\n\n#: lib/Lufi/Controller/Mail.pm:72\nmsgid \"The email subject can't be empty.\"\nmsgstr \"Der E-Mail-Betreff darf nicht leer sein.\"\n\n#. ($expire_at, $max_expire_at)\n#: lib/Lufi/Controller/Invitation.pm:51\nmsgid \"The expiration delay (%1) is not between 1 and %2 days.\"\nmsgstr \"Die Ablauffrist (%1) liegt nicht zwischen 1 und %2 Tagen.\"\n\n#: lib/Lufi/Controller/Files.pm:468\nmsgid \"The file has already been deleted\"\nmsgstr \"Die Datei wurde bereits gelöscht\"\n\n#: themes/default/templates/about.html.ep:6\nmsgid \"\"\n\"The files uploaded on a Lufi instance are encrypted before the upload to the \"\n\"server: the administrator of the server can not see the file's content.\"\nmsgstr \"\"\n\"Die auf einer Lufi-Instanz hochgeladenen Dateien werden vor dem Hochladen \"\n\"auf den Server verschlüsselt: Der Administrator des Servers kann den Inhalt \"\n\"der Datei nicht einsehen.\"\n\n#. (join(', ', @bad)\n#: lib/Lufi/Controller/Mail.pm:68\nmsgid \"The following email addresses are not valid: %1\"\nmsgstr \"Die folgenden E-Mail-Adressen sind nicht gültig: %1\"\n\n#. ($guest_mail)\n#: lib/Lufi/Controller/Invitation.pm:48\nmsgid \"The guest email address (%1) is unvalid.\"\nmsgstr \"Die Gast-E-Mail-Adresse (%1) ist ungültig.\"\n\n#. ($i->token, $i->guest_mail)\n#: lib/Lufi/Controller/Invitation.pm:150\nmsgid \"\"\n\"The invitation %1 can’t be resent: %2 has already sent files.<br>Please \"\n\"create a new invitation.\"\nmsgstr \"\"\n\"Die Einladung %1 kann nicht erneut gesendet werden: %2 hat bereits Dateien \"\n\"gesendet.<br>Bitte erstellen Sie eine neue Einladung.\"\n\n#. ($i->token)\n#: lib/Lufi/Controller/Invitation.pm:130\nmsgid \"The invitation %1 has been deleted.\"\nmsgstr \"Die Einladung %1 wurde gelöscht.\"\n\n#. (stash('user_mail')\n#: themes/default/templates/invitations/invite.html.ep:34\nmsgid \"The invitation mail will be send from your email address (%1).\"\nmsgstr \"Die Einladungsmail wird von Ihrer E-Mail-Adresse (%1) gesendet.\"\n\n#: themes/default/templates/partial/index.js.ep:16\nmsgid \"The link(s) has been copied to your clipboard\"\nmsgstr \"Die Links wurden in die Zwischenablage kopiert\"\n\n#. (stash('invitation')\n#: themes/default/templates/index.html.ep:30\nmsgid \"\"\n\"The link(s) of your file(s) will automatically be sent by mail to %1 (%2)\"\nmsgstr \"\"\n\"Die Links Ihrer Dateien werden automatisch per E-Mail an %1 (%2) gesendet\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:11\nmsgid \"The links of your file(s) will automatically be sent by mail to %1.\"\nmsgstr \"Die Links Ihrer Dateien werden automatisch per E-Mail an %1 gesendet.\"\n\n#: lib/Lufi/Controller/Mail.pm:97\nmsgid \"The mail has been sent.\"\nmsgstr \"Die E-Mail wurde gesendet.\"\n\n#: themes/default/templates/about.html.ep:15\nmsgid \"\"\n\"The original (and only for now) author is <a href=\\\"https://fiat-tux.fr\\\" \"\n\"class=\\\"classic\\\">Luc Didry</a>.\"\nmsgstr \"\"\n\"Der ursprüngliche (und vorerst einzige) Autor ist <a href=\\\"https://fiat-tux.\"\n\"fr\\\" class=\\\"classic\\\">Luc Didry</a>.\"\n\n#: lib/Lufi/Controller/Files.pm:236\nmsgid \"\"\n\"The server was unable to find the file record to add your file part to. \"\n\"Please, contact the administrator.\"\nmsgstr \"\"\n\"Der Server konnte den Datensatz nicht finden, um Ihr Dateiteil hinzuzufügen. \"\n\"Bitte wenden Sie sich an den Administrator.\"\n\n#: lib/Lufi/Controller/Files.pm:295\nmsgid \"\"\n\"This file has been deactivated by the admins. Contact them to know why.\"\nmsgstr \"\"\n\"Diese Datei wurde von den Admins deaktiviert. Kontaktieren Sie sie, um zu \"\n\"erfahren, warum.\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:46 themes/default/templates/partial/invitations.js.ep:6\nmsgid \"This invitation is normally hidden\"\nmsgstr \"Diese Einladung ist normalerweise ausgeblendet\"\n\n#. (stash('expires')\n#: themes/default/templates/invitations/invite.mail.ep:13\nmsgid \"This invitation is valid until %1.\"\nmsgstr \"Diese Einladung ist bis %1 gültig.\"\n\n#: themes/default/templates/delays.html.ep:10\nmsgid \"\"\n\"This server sets limitations according to the file size. The expiration \"\n\"delay of your file will be the minimum between what you choose and the \"\n\"following limitations:\"\nmsgstr \"\"\n\"Dieser Server setzt Einschränkungen bezüglich der Dateigröße. Die \"\n\"Ablauffrist Ihrer Datei ist das Minimum zwischen dem, was Sie auswählen, und \"\n\"den folgenden Einschränkungen:\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:16\nmsgid \"Toggle visibility\"\nmsgstr \"Sichtbarkeit umschalten\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:25\nmsgid \"URL\"\nmsgstr \"URL\"\n\n#: themes/default/templates/partial/index.js.ep:17\nmsgid \"Unable to copy the link(s) to your clipboard\"\nmsgstr \"Die Links konnten nicht in die Zwischenablage kopiert werden\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:439\nmsgid \"\"\n\"Unable to get counter for %1. The file does not exists. It will be removed \"\n\"from your localStorage.\"\nmsgstr \"\"\n\"Der Zähler für %1 konnte nicht gefunden werden. Die Datei existiert nicht. \"\n\"Sie wird aus Ihrem localStorage entfernt.\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:429\nmsgid \"Unable to get counter for %1. The token is invalid.\"\nmsgstr \"\"\n\"Der Zähler für %1 konnte nicht gefunden werden. Das Token ist ungültig.\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:449\nmsgid \"Unable to get counter for %1. You are not authenticated.\"\nmsgstr \"\"\n\"Der Zähler für %1 konnte nicht gefunden werden. Sie sind nicht \"\n\"authentifiziert.\"\n\n#: themes/default/templates/layouts/default.html.ep:33 themes/default/templates/layouts/default.html.ep:66\nmsgid \"Upload files\"\nmsgstr \"Dateien hochladen\"\n\n#: themes/default/templates/index.html.ep:145\nmsgid \"Upload generated zip file\"\nmsgstr \"Generierte Zip-Datei hochladen\"\n\n#: themes/default/templates/files.html.ep:31\nmsgid \"Uploaded at\"\nmsgstr \"Hochgeladen am\"\n\n#: themes/default/templates/index.html.ep:153\nmsgid \"Uploaded files\"\nmsgstr \"Hochgeladene Dateien\"\n\n#: themes/default/templates/partial/index.js.ep:30\nmsgid \"Websocket communication error\"\nmsgstr \"Websocket-Kommunikationsfehler\"\n\n#: themes/default/templates/about.html.ep:3\nmsgid \"What is Lufi?\"\nmsgstr \"Was ist Lufi?\"\n\n#: themes/default/templates/about.html.ep:14\nmsgid \"Who wrote this software?\"\nmsgstr \"Wer hat diese Software geschrieben?\"\n\n#: themes/default/templates/partial/index.js.ep:13\nmsgid \"XXX file has been added to upload queue.\"\nmsgstr \"XXX Datei wurde der Upload-Warteschlange hinzugefügt.\"\n\n#: themes/default/templates/invitations/invite.html.ep:30\nmsgid \"\"\n\"You can invite someone to send you files through this Lufi instance even if \"\n\"they don’t have an account on it.\"\nmsgstr \"\"\n\"Sie können jemanden einladen, Ihnen Dateien über diese Lufi-Instanz zu \"\n\"senden, auch wenn diese Person keinen Account hat.\"\n\n#: themes/default/templates/about.html.ep:11\nmsgid \"\"\n\"You can see the list of your files by clicking on the \\\"My files\\\" link at \"\n\"the top right of this page.\"\nmsgstr \"\"\n\"Sie können die Liste Ihrer Dateien einsehen, indem Sie auf den Link \\\"Meine \"\n\"Dateien\\\" oben rechts auf dieser Seite klicken.\"\n\n#: lib/Lufi/Controller/Mail.pm:42\nmsgid \"You can't add URLs that are not related to this instance.\"\nmsgstr \"\"\n\"Sie können keine URL hinzufügen, die nicht mit dieser Instanz verknüpft ist.\"\n\n#: themes/default/templates/about.html.ep:8\nmsgid \"\"\n\"You don't need to register yourself to upload files but be aware that, for \"\n\"legal reasons, your IP address will be stored when you send a file. Don't \"\n\"panic, this is normally the case for all sites on which you send files.\"\nmsgstr \"\"\n\"Sie müssen sich nicht registrieren, um Dateien hochzuladen, aber beachten \"\n\"Sie, dass Ihre IP-Adresse aus rechtlichen Gründen beim Senden einer Datei \"\n\"gespeichert wird. Keine Panik, dies ist der Normalfall bei allen Seiten, auf \"\n\"denen Sie Dateien senden.\"\n\n#: themes/default/templates/partial/render.js.ep:10\nmsgid \"\"\n\"You don't seem to have a key in your URL. You won't be able to decrypt the \"\n\"file. Download canceled.\"\nmsgstr \"\"\n\"Sie scheinen keinen Schlüssel in Ihrer URL zu haben. Sie werden die Datei \"\n\"nicht entschlüsseln können. Der Download wurde abgebrochen.\"\n\n#: themes/default/templates/partial/render.js.ep:7\nmsgid \"\"\n\"You have attempted to leave this page. The download will be canceled. Are \"\n\"you sure?\"\nmsgstr \"\"\n\"Sie haben versucht, diese Seite zu verlassen. Der Download wird abgebrochen. \"\n\"Sind Sie sicher?\"\n\n#: themes/default/templates/partial/index.js.ep:14\nmsgid \"\"\n\"You have attempted to leave this page. The upload will be canceled. Are you \"\n\"sure?\"\nmsgstr \"\"\n\"Sie haben versucht, diese Seite zu verlassen. Das Hochladen wird abgebrochen.\"\n\" Sind Sie sicher?\"\n\n#: themes/default/templates/logout.html.ep:14\nmsgid \"You have been successfully logged out.\"\nmsgstr \"Sie wurden erfolgreich ausgeloggt.\"\n\n#: lib/Lufi/Controller/Mail.pm:71\nmsgid \"You must give email addresses.\"\nmsgstr \"Sie müssen E-Mail-Adressen angeben.\"\n\n#: themes/default/templates/index.html.ep:38\nmsgid \"\"\n\"Your browser does not have enough entropy to generate a strong encryption \"\n\"key. Please wait (it's better if you do things on your computer while \"\n\"waiting).\"\nmsgstr \"\"\n\"Ihr Browser verfügt nicht über genügend Entropie, um einen starken \"\n\"Verschlüsselungscode zu erzeugen. Bitte warten Sie (es ist besser, wenn Sie \"\n\"während des Wartens Sachen auf Ihrem Computer machen).\"\n\n#. (format_bytes($json->{size})\n#: lib/Lufi/Controller/Files.pm:95\nmsgid \"Your file is too big: %1 (maximum size allowed: %2)\"\nmsgstr \"Ihre Datei ist zu groß: %1 (maximal erlaubte Größe: %2)\"\n\n#: lib/Lufi/Controller/Files.pm:351\nmsgid \"Your password is not valid. Please refresh the page to retry.\"\nmsgstr \"\"\n\"Ihr Passwort ist ungültig. Bitte aktualisieren Sie die Seite, um es erneut \"\n\"zu versuchen.\"\n\n#: themes/default/templates/partial/render.js.ep:12\nmsgid \"Zip content:\"\nmsgstr \"Zip-Inhalt:\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:20\nmsgid \"between %1 and %2, the file will be kept %3 day(s).\"\nmsgstr \"zwischen %1 und %2, wird die Datei %3 Tag(e) aufbewahrt.\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:22\nmsgid \"between %1 and %2, the file will be kept forever.\"\nmsgstr \"zwischen %1 und %2, wird die Datei für immer aufbewahrt.\"\n\n#: themes/default/templates/partial/mail.js.ep:42\nmsgid \"deadline: \"\nmsgstr \"Frist: \"\n\n#: themes/default/templates/partial/invitations.js.ep:5\nmsgid \"expires on XXX\"\nmsgstr \"Läuft ab am XXX\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:26\nmsgid \"for %1 and more, the file will be kept %2 day(s)\"\nmsgstr \"für %1 und mehr, wird die Datei %2 Tag(e) aufbewahrt\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:28\nmsgid \"for %1 and more, the file will be kept forever.\"\nmsgstr \"für %1 und mehr, wird die Datei für immer aufbewahrt.\"\n\n#: themes/default/templates/index.html.ep:3\nmsgid \"no time limit\"\nmsgstr \"kein Zeitlimit\"\n\n#: themes/default/templates/index.html.ep:124\nmsgid \"or\"\nmsgstr \"oder\"\n\n#. ($e->{name}, format_bytes($e->{size})\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:12\nmsgid \"— %1 (%2), that will expire on %3\"\nmsgstr \"— %1 (%2), läuft ab am %3\"\n\n#: themes/default/templates/about.html.ep:18\nmsgid \"Get the source code on <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi\\\" class=\\\"classic\\\">the official repository</a> or on its <a href=\\\"https://github.com/ldidry/lufi\\\" class=\\\"classic\\\">Github mirror</a>\"\nmsgstr \"\"\n\"Holen Sie sich den Quellcode vom <a href=\\\"https://framagit.org/fiat-tux/\"\n\"hat-softwares/lufi\\\" class=\\\"classic\\\">offiziellen Repository</a> oder von \"\n\"dessen <a href=\\\"https://github.com/ldidry/lufi\\\" class=\\\"classic\\\">Github \"\n\"mirror</a>\"\n\n#: themes/default/templates/about.html.ep:17\nmsgid \"As Lufi is a free software licensed under of the terms of the <a href=\\\"https://gnu.org/licenses/agpl.html\\\" class=\\\"classic\\\">AGPLv3</a>, you can install it on you own server. Have a look on the <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi/wikis/home\\\" class=\\\"classic\\\">Wiki</a> for the procedure.\"\nmsgstr \"\"\n\"Da es sich bei Lufi um eine freie Software handelt, die unter den \"\n\"Bedingungen der <a href=\\\"https://gnu.org/licenses/agpl.html\\\" class=\\\"\"\n\"classic\\\">AGPLv3</a> lizenziert ist, können Sie sie auf Ihrem eigenen Server \"\n\"installieren. Werfen Sie einen Blick in das <a href=\\\"https://framagit.org/\"\n\"fiat-tux/hat-softwares/lufi/wikis/home\\\" class=\\\"classic\\\">Wiki</a> für das \"\n\"Verfahren.\"\n\n#: themes/default/templates/partial/index.js.ep:24\nmsgid \"File uploaded\"\nmsgstr \"Datei hochgeladen\"\n\n#: themes/default/templates/partial/render.js.ep:9\nmsgid \"File downloaded\"\nmsgstr \"Datei heruntergeladen\"\n\n#. (sprintf('<a href=\"https://framagit.org/fiat-tux/hat-softwares/lufi/-/commit/%s\" class=\"classic\">%s</a>', stash('version')\n#: themes/default/templates/about.html.ep:22\nmsgid \"Latest commit of this instance: %1\"\nmsgstr \"Neueste Änderung dieser Instanz: %1\"\n\n#. (sprintf('<a href=\"https://framagit.org/fiat-tux/hat-softwares/lufi/-/releases/%s\" class=\"classic\">%s</a>', stash('version')\n#: themes/default/templates/about.html.ep:21\nmsgid \"Latest tag of this instance: %1\"\nmsgstr \"Neueste Version dieser Instanz: %1\"\n\n#: themes/default/templates/about.html.ep:20\nmsgid \"Version\"\nmsgstr \"Version\"\n\n#. ($orig_uri)\n#: lib/Lufi/Controller/Mail.pm:43 lib/Lufi/Controller/Mail.pm:59\nmsgid \"You can't add URLs that are not related to this instance (%1).\"\nmsgstr \"\"\n\"Sie können keine URLs hinzufügen, die nicht zu dieser Instanz gehören (%1).\"\n\n#. ($i->token, $c->current_user->{username})\n#: lib/Lufi/Controller/Invitation.pm:136\nmsgid \"The invitation %1 can’t be deleted: it wasn’t created by you (%2).\"\nmsgstr \"\"\n\"Die Einladung %1 kann nicht gelöscht werden: sie wurde nicht von Ihnen \"\n\"erstellt (%2).\"\n\n#. ($i->token, $c->current_user->{username})\n#: lib/Lufi/Controller/Invitation.pm:187\nmsgid \"The invitation %1 can’t be resent: it wasn’t created by you (%2).\"\nmsgstr \"\"\n\"Die Einladung %1 kann nicht erneut verschickt werden: sie wurde nicht von \"\n\"Ihnen erstellt (%2).\"\n\n#: themes/default/templates/partial/render.js.ep:13\nmsgid \"Unable to download the file: too much unsuccessful attempts to open a websocket. Please, contact the administrator.\"\nmsgstr \"\"\n\"Download der Datei nicht möglich: Zu viele erfolglose Versuche, ein \"\n\"Websocket zu öffnen. Bitte kontaktieren Sie den Administrator.\"\n"
  },
  {
    "path": "themes/default/lib/Lufi/I18N/el.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\\n\"\n\"PO-Revision-Date: 2022-02-07 04:27+0000\\n\"\n\"Last-Translator: Dimitrios Glentadakis <dglent@free.fr>\\n\"\n\"Language-Team: Greek <https://weblate.framasoft.org/projects/lufi/\"\n\"default-theme/el/>\\n\"\n\"Language: el\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=n != 1;\\n\"\n\"X-Generator: Weblate 4.10.1\\n\"\n\n#. ($delay)\n#. (max_delay)\n#: themes/default/templates/index.html.ep:56 themes/default/templates/index.html.ep:65 themes/default/templates/index.html.ep:66\nmsgid \"%1 days\"\nmsgstr \"%1 ημέρες\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:2\nmsgid \"%1 invites you to send him/her files\"\nmsgstr \"%1 σας προσκαλεί να του/της στείλετε αρχεία\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:6\nmsgid \"%1 invites you to send him/her files through Lufi.\"\nmsgstr \"%1 σας προσκαλεί να του/της στείλετε αρχεία μέσα από το Lufi.\"\n\n#. (stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:4\nmsgid \"%1 sent you files\"\nmsgstr \"%1 σας έστειλε αρχεία\"\n\n#. (stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:8\nmsgid \"%1 used your invitation to send you files:\"\nmsgstr \"%1 χρησιμοποίησε την πρόσκληση για να σας στείλει αρχεία:\"\n\n#: lib/Lufi/Controller/Invitation.pm:159 lib/Lufi/Controller/Invitation.pm:84 themes/default/templates/invitations/my_invitations.html.ep:51 themes/default/templates/invitations/my_invitations.html.ep:52 themes/default/templates/invitations/my_invitations.html.ep:53 themes/default/templates/invitations/notification_files_sent.mail.ep:12\nmsgid \"%A %d %B %Y at %T\"\nmsgstr \"%A %d %B %Y στις %T\"\n\n#: themes/default/templates/partial/index.js.ep:28\nmsgid \"(max size: XXX)\"\nmsgstr \"(μέγιστο μέγεθος: XXX)\"\n\n#: themes/default/templates/index.html.ep:5\nmsgid \"1 year\"\nmsgstr \"1 έτος\"\n\n#: themes/default/templates/index.html.ep:4 themes/default/templates/index.html.ep:65\nmsgid \"24 hours\"\nmsgstr \"24 ώρες\"\n\n#: themes/default/templates/partial/mail.js.ep:40\nmsgid \":\"\nmsgstr \":\"\n\n#: themes/default/templates/render.html.ep:42\nmsgid \"Abort\"\nmsgstr \"Ακύρωση\"\n\n#: themes/default/templates/layouts/default.html.ep:53 themes/default/templates/layouts/default.html.ep:86\nmsgid \"About\"\nmsgstr \"Σχετικά\"\n\n#: themes/default/templates/index.html.ep:107\nmsgid \"Add a password to file(s)\"\nmsgstr \"Προσθέστε κωδικό στο αρχείο/α\"\n\n#: themes/default/templates/mail.html.ep:16\nmsgid \"Adding URLs not related to this Lufi instance to the mail body or subject is prohibited.\"\nmsgstr \"\"\n\"Δεν επιτρέπεται η προσθήκη στο σώμα ή στο θέμα του μηνύματος συνδέσμων URL \"\n\"που δεν σχετίζονται με αυτό το Lufi .\"\n\n#: themes/default/templates/partial/invitations.js.ep:3\nmsgid \"Are you sure you want to delete the selected invitations?\"\nmsgstr \"Θέλετε σίγουρα να διαγράψετε τις επιλεγμένες προσκλήσεις;\"\n\n#: themes/default/templates/partial/invitations.js.ep:4\nmsgid \"Are you sure you want to resend the invitation mail for the selected invitations?\"\nmsgstr \"\"\n\"Θέλετε σίγουρα να ξαναστείλετε το μήνυμα πρόσκλησης για τις επιλεγμένες \"\n\"προσκλήσεις;\"\n\n#: themes/default/templates/about.html.ep:17\nmsgid \"As Lufi is a free software licensed under of the terms of the <a href=\\\"https://gnu.org/licenses/agpl.html\\\" class=\\\"classic\\\">AGPLv3</a>, you can install it on you own server. Have a look on the <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi/wikis/home\\\" class=\\\"classic\\\">Wiki</a> for the procedure.\"\nmsgstr \"\"\n\"Δεδομένου πως το Lufi είναι ελεύθερο λογισμικό και διέπεται από τους όρους \"\n\"της άδειας <a href=\\\"https://gnu.org/licenses/agpl.html\\\" class=\\\"classic\\\"\"\n\">AGPLv3</a>, μπορείτε να το εγκαταστήσετε στον δικό σας διακομιστή. Δείτε τη \"\n\"διαδικασία στο <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi/\"\n\"wikis/home\\\" class=\\\"classic\\\">Wiki</a>.\"\n\n#. (stash('nbslices')\n#: themes/default/templates/partial/render.js.ep:10\nmsgid \"Asking for file part XX1 of %1\"\nmsgstr \"Ζητώντας το μέρος αρχείου XX1 από %1\"\n\n#: themes/default/templates/about.html.ep:23\nmsgid \"Back to homepage\"\nmsgstr \"Πίσω στην αρχική σελίδα\"\n\n#: lib/Lufi/Controller/Mail.pm:25\nmsgid \"Bad CSRF token!\"\nmsgstr \"Λάθος CSRF token!\"\n\n#: lib/Lufi/Controller/Auth.pm:27 lib/Lufi/Controller/Auth.pm:49\nmsgid \"Bad CSRF token.\"\nmsgstr \"Λάθος CSRF token.\"\n\n#: themes/default/templates/partial/render.js.ep:5\nmsgid \"Click here to refresh the page and restart the download.\"\nmsgstr \"\"\n\"Πατήστε εδώ για να ανανεώσετε τη σελίδα και να επανεκκινήσετε το κατέβασμα.\"\n\n#: themes/default/templates/invitations/invite.mail.ep:8\nmsgid \"Click on the following URL to upload files on Lufi:\"\nmsgstr \"Πατήστε στον ακόλουθο σύνδεσμο URL για να ανεβάσετε αρχεία στο Lufi:\"\n\n#: themes/default/templates/index.html.ep:126\nmsgid \"Click to open the file browser\"\nmsgstr \"Κάντε κλικ για να αναζητήσετε αρχεία\"\n\n#: themes/default/templates/delays.html.ep:38 themes/default/templates/invitations/my_invitations.html.ep:80\nmsgid \"Close\"\nmsgstr \"Κλείσιμο\"\n\n#: themes/default/templates/mail.html.ep:23\nmsgid \"Comma-separated email addresses\"\nmsgstr \"Διευθύνσεις email, χωρισμένες με κόμμα\"\n\n#: themes/default/templates/index.html.ep:140\nmsgid \"Compressing zip file…\"\nmsgstr \"Συμπίεση αρχείου zip…\"\n\n#: themes/default/templates/partial/index.js.ep:15\nmsgid \"Copy all links to clipboard\"\nmsgstr \"Αντιγραφή όλων των συνδέσμων στο πρόχειρο\"\n\n#: themes/default/templates/partial/index.js.ep:18\nmsgid \"Copy to clipboard\"\nmsgstr \"Αντιγραφή στο πρόχειρο\"\n\n#: lib/Lufi/Controller/Files.pm:501\nmsgid \"Could not delete the file. You are not authenticated.\"\nmsgstr \"Δεν μπορεί να διαγραφεί το αρχείο. Δεν είστε πιστοποιημένος/η.\"\n\n#: lib/Lufi/Controller/Files.pm:483\nmsgid \"Could not find the file. Are you sure of the URL and the token?\"\nmsgstr \"Το αρχείο δεν βρέθηκε. Είστε σίγουροι για το σύνδεσμο URL και το token;\"\n\n#: lib/Lufi/Controller/Files.pm:394\nmsgid \"Could not find the file. Are you sure of the URL?\"\nmsgstr \"Το αρχείο δεν βρέθηκε. Είστε σίγουροι για τον σύνδεσμο URL;\"\n\n#: themes/default/templates/files.html.ep:29\nmsgid \"Counter\"\nmsgstr \"Μετρητής\"\n\n#: themes/default/templates/index.html.ep:100\nmsgid \"Create a zip archive with the files before uploading?\"\nmsgstr \"\"\n\"Θέλετε να δημιουργήσετε ένα συμπιεσμένο αρχείο zip με τα αρχεία πριν τα \"\n\"ανεβάσετε;\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:26\nmsgid \"Created at\"\nmsgstr \"Δημιουργήθηκε στις\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:14\nmsgid \"Delete\"\nmsgstr \"Διαγραφή\"\n\n#: themes/default/templates/files.html.ep:30 themes/default/templates/index.html.ep:90\nmsgid \"Delete at first download?\"\nmsgstr \"Διαγραφή στο πρώτο κατέβασμα;\"\n\n#: themes/default/templates/files.html.ep:19\nmsgid \"Delete selected files\"\nmsgstr \"Διαγραφή επιλεγμένων αρχείων\"\n\n#: themes/default/templates/files.html.ep:33 themes/default/templates/partial/index.js.ep:19\nmsgid \"Deletion link\"\nmsgstr \"Σύνδεσμος διαγραφής\"\n\n#: themes/default/templates/delays.html.ep:8\nmsgid \"Don't worry: if a user begins to download the file before the expiration and the download ends after the expiration, he will be able to get the file.\"\nmsgstr \"\"\n\"Μην ανησυχείτε: ένας χρήστης μπορεί να ολοκληρώσει το κατέβασμα του αρχείου \"\n\"μετά τη λήξη, αρκεί να ξεκινήσει να το κατεβάζει πριν τη λήξη.\"\n\n#: themes/default/templates/partial/index.js.ep:21 themes/default/templates/render.html.ep:28\nmsgid \"Download\"\nmsgstr \"Κατέβασμα\"\n\n#: themes/default/templates/partial/render.js.ep:4\nmsgid \"Download aborted.\"\nmsgstr \"Το κατέβασμα ακυρώθηκε.\"\n\n#: themes/default/templates/files.html.ep:28 themes/default/templates/partial/index.js.ep:20\nmsgid \"Download link\"\nmsgstr \"Σύνδεσμος κατεβάσματος\"\n\n#: themes/default/templates/about.html.ep:10\nmsgid \"Drag and drop files in the appropriate area or use the traditional way to send files and the files will be chunked, encrypted and sent to the server. You will get two links per file: a download link, that you give to the people you want to share the file with and a deletion link, allowing you to delete the file whenever you want.\"\nmsgstr \"\"\n\"Σύρετε τα αρχεία στη σχετική περιοχή ή χρησιμοποιήστε τον παραδοσιακό τρόπο \"\n\"επιλογής αρχείων και τα αρχεία θα χωριστούν σε κομμάτια, θα κρυπτογραφηθούν \"\n\"και θα σταλούν στον διακομιστή. Θα σας δοθούν δύο σύνδεσμοι για κάθε αρχείο: \"\n\"ένας σύνδεσμος για κατέβασμα, που θα δώσετε σε εκείνους που θέλετε να \"\n\"κατεβάσουν το αρχείο και ένας σύνδεσμος για διαγραφή, που σας επιτρέπει να \"\n\"το διαγράψετε όποτε θελήσετε.\"\n\n#: themes/default/templates/index.html.ep:122\nmsgid \"Drop files here\"\nmsgstr \"Σύρετε αρχεία εδώ\"\n\n#: themes/default/templates/invitations/invite.html.ep:40\nmsgid \"Email address of your guest\"\nmsgstr \"Διεύθυνση email του καλεσμένου σας\"\n\n#: themes/default/templates/mail.html.ep:39\nmsgid \"Email body\"\nmsgstr \"Σώμα μηνύματος email\"\n\n#: themes/default/templates/mail.html.ep:31\nmsgid \"Email subject\"\nmsgstr \"Θέμα email\"\n\n#: themes/default/templates/mail.html.ep:25 themes/default/templates/mail.html.ep:27\nmsgid \"Emails\"\nmsgstr \"Email\"\n\n#: themes/default/templates/partial/index.js.ep:22\nmsgid \"Encrypting part XX1 of XX2\"\nmsgstr \"Κρυπτογράφηση μέρους XX1 από XX2\"\n\n#: lib/Lufi/Controller/Files.pm:283\nmsgid \"Error: the file existed but was deleted.\"\nmsgstr \"Σφάλμα: το αρχείο υπήρχε αλλά διαγράφηκε.\"\n\n#: lib/Lufi/Controller/Files.pm:363\nmsgid \"Error: the file has not been sent entirely.\"\nmsgstr \"Σφάλμα: δεν στάλθηκε ολόκληρο το αρχείο.\"\n\n#: lib/Lufi/Controller/Files.pm:373\nmsgid \"Error: unable to find the file. Are you sure of your URL?\"\nmsgstr \"Σφάλμα: το αρχείο δεν βρέθηκε. Είστε σίγουροι για τον σύνδεσμο URL;\"\n\n#: themes/default/templates/partial/index.js.ep:23\nmsgid \"Expiration:\"\nmsgstr \"Λήξη:\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:27\nmsgid \"Expire at\"\nmsgstr \"Λήξη στις\"\n\n#: themes/default/templates/files.html.ep:32\nmsgid \"Expires at\"\nmsgstr \"Λήγει στις\"\n\n#: themes/default/templates/files.html.ep:12\nmsgid \"Export localStorage data\"\nmsgstr \"Εξαγωγή δεδομένων localStorage\"\n\n#: lib/Lufi/Controller/Files.pm:465\nmsgid \"File deleted\"\nmsgstr \"Το αρχείο διαγράφηκε\"\n\n#: themes/default/templates/partial/render.js.ep:9\nmsgid \"File downloaded\"\nmsgstr \"Το αρχείο κατέβηκε\"\n\n#: themes/default/templates/files.html.ep:27\nmsgid \"File name\"\nmsgstr \"Όνομα αρχείου\"\n\n#: themes/default/templates/partial/index.js.ep:24\nmsgid \"File uploaded\"\nmsgstr \"Το αρχείο ανέβηκε\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:61\nmsgid \"Files\"\nmsgstr \"Αρχεία\"\n\n#: themes/default/templates/index.html.ep:80\nmsgid \"Files deleted at first download\"\nmsgstr \"Τα αρχεία διαγράφηκαν στο πρώτο κατέβασμα\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:28\nmsgid \"Files sent at\"\nmsgstr \"Τα αρχεία στάλθηκαν στις\"\n\n#: themes/default/templates/partial/invitations.js.ep:8\nmsgid \"Files sent in invitation XX1 by XX2\"\nmsgstr \"Τα αρχεία στάλθηκαν στην πρόσκληση XX1 από XX2\"\n\n#: themes/default/templates/partial/render.js.ep:8\nmsgid \"Get the file\"\nmsgstr \"Λάβε το αρχείο\"\n\n#: themes/default/templates/about.html.ep:18\nmsgid \"Get the source code on <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi\\\" class=\\\"classic\\\">the official repository</a> or on its <a href=\\\"https://github.com/ldidry/lufi\\\" class=\\\"classic\\\">Github mirror</a>\"\nmsgstr \"\"\n\"Λάβετε τον πηγαίο κώδικα από το <a href=\\\"https://framagit.org/fiat-tux/\"\n\"hat-softwares/lufi\\\" class=\\\"classic\\\">επίσημο αποθετήριο</a> ή από τον <a \"\n\"href=\\\"https://github.com/ldidry/lufi\\\" class=\\\"classic\\\">καθρέπτη του στο \"\n\"Github </a>\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:24\nmsgid \"Guest mail\"\nmsgstr \"Email καλεσμένου\"\n\n#. (ucfirst(stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:6\nmsgid \"Hello %1,\"\nmsgstr \"Γεια σου %1,\"\n\n#: themes/default/templates/invitations/invite.mail.ep:4\nmsgid \"Hello,\"\nmsgstr \"Γεια σου,\"\n\n#: themes/default/templates/partial/mail.js.ep:35\nmsgid \"Hello,\\\\n\\\\nHere's some files I want to share with you:\\\\n\"\nmsgstr \"\"\n\"Γεια,\\\\n\"\n\"\\\\n\"\n\"Ορίστε μερικά αρχεία που θέλω να μοιραστώ μαζί σου:\\\\n\"\n\n#: themes/default/templates/mail.html.ep:35\nmsgid \"Here's some files\"\nmsgstr \"Ορίστε μερικά αρχεία\"\n\n#: themes/default/templates/partial/invitations.js.ep:7\nmsgid \"Hide hidden invitations\"\nmsgstr \"Απόκρυψη κρυφών προσκλήσεων\"\n\n#: themes/default/templates/partial/index.js.ep:26\nmsgid \"Hit Enter, then Ctrl+C to copy all the download links\"\nmsgstr \"\"\n\"Πατήστε Enter, μετά Ctrl+C για να αντιγράψετε όλους τους συνδέσμους \"\n\"κατεβάσματος\"\n\n#: themes/default/templates/partial/index.js.ep:25\nmsgid \"Hit Enter, then Ctrl+C to copy the download link\"\nmsgstr \"Πατήστε Enter, μετά Ctrl+C για να αντιγράψετε τον σύνδεσμο κατεβάσματος\"\n\n#: themes/default/templates/about.html.ep:9\nmsgid \"How does it work?\"\nmsgstr \"Πώς δουλεύει;\"\n\n#: themes/default/templates/invitations/invite.html.ep:46\nmsgid \"How many days would you like the invitation to be valid?\"\nmsgstr \"Για πόσες μέρες θα θέλατε να ισχύσει η πρόσκληση;\"\n\n#: themes/default/templates/about.html.ep:16\nmsgid \"How to install the software on my server?\"\nmsgstr \"Πώς εγκαθιστώ το λογισμικό σε δικό μου διακομιστή;\"\n\n#: themes/default/templates/about.html.ep:12\nmsgid \"How to report an illegal file?\"\nmsgstr \"Πώς αναφέρω ένα παράνομο αρχείο;\"\n\n#: themes/default/templates/delays.html.ep:7\nmsgid \"If you choose a delay, the file will be deleted after that delay.\"\nmsgstr \"Αν επιλέξετε μια διάρκεια, το αρχείο θα διαγραφεί μετά το πέρας της.\"\n\n#: themes/default/templates/mail.html.ep:15\nmsgid \"If you send the mail from this server, the links will be sent to the server, which may lower your privacy protection.\"\nmsgstr \"\"\n\"Αν στείλετε email από αυτόν τον διακομιστή, οι σύνδεσμοι θα σταλούν στον \"\n\"διακομιστή, κάτι που μπορεί να περιορίσει την προστασία της ιδιωτικότητάς \"\n\"σας.\"\n\n#: themes/default/templates/files.html.ep:14\nmsgid \"Import localStorage data\"\nmsgstr \"Εισαγωγή δεδομένων localStorage\"\n\n#: themes/default/templates/index.html.ep:53\nmsgid \"Important: more information on delays\"\nmsgstr \"Σημαντικό: περισσότερες πληροφορίες για τις διάρκειες ζωής\"\n\n#: themes/default/templates/delays.html.ep:5\nmsgid \"Information about delays\"\nmsgstr \"Πληροφορίες σχετικά με τις διάρκειες ζωής\"\n\n#: themes/default/templates/files.html.ep:18 themes/default/templates/invitations/my_invitations.html.ep:12\nmsgid \"Invert selection\"\nmsgstr \"Αντιστροφή επιλογής\"\n\n#. ($i->guest_mail, $url)\n#: lib/Lufi/Controller/Invitation.pm:171\nmsgid \"Invitation resent to %1.<br> URL: %2\"\nmsgstr \"Η πρόσκληση προς %1 ξαναστάλθηκε .<br> Σύνδεσμος URL: %2\"\n\n#. ($invitation->guest_mail, $url)\n#: lib/Lufi/Controller/Invitation.pm:87\nmsgid \"Invitation sent to %1.<br> URL: %2\"\nmsgstr \"Η πρόσκληση στάλθηκε στο %1.<br> Σύνδεσμος URL: %2\"\n\n#: themes/default/templates/invitations/invite.html.ep:27 themes/default/templates/layouts/default.html.ep:36 themes/default/templates/layouts/default.html.ep:69\nmsgid \"Invite a guest\"\nmsgstr \"Προσκάλεσε έναν επισκέπτη\"\n\n#: themes/default/templates/partial/render.js.ep:6\nmsgid \"It seems that the key in your URL is incorrect. Please, verify your URL.\"\nmsgstr \"\"\n\"Φαίνεται πως το κλειδί στον σύνδεσμο URL σας είναι λανθασμένο. Παρακαλούμε \"\n\"ελέγξτε τον σύνδεσμο.\"\n\n#: themes/default/templates/index.html.ep:12\nmsgid \"Javascript is disabled. You won't be able to use Lufi.\"\nmsgstr \"\"\n\"Η Javascript είναι απενεργοποιημένη. Δεν θα μπορέσετε να χρησιμοποιήσετε το \"\n\"Lufi.\"\n\n#: themes/default/templates/layouts/default.html.ep:44 themes/default/templates/layouts/default.html.ep:46 themes/default/templates/layouts/default.html.ep:77 themes/default/templates/layouts/default.html.ep:79\nmsgid \"Language\"\nmsgstr \"Γλώσσα\"\n\n#. (sprintf('<a href=\"https://framagit.org/fiat-tux/hat-softwares/lufi/-/commit/%s\" class=\"classic\">%s</a>', stash('version')\n#: themes/default/templates/about.html.ep:22\nmsgid \"Latest commit of this instance: %1\"\nmsgstr \"Πιο πρόσφατο commit αυτής της εγκατάστασης: %1\"\n\n#. (sprintf('<a href=\"https://framagit.org/fiat-tux/hat-softwares/lufi/-/releases/%s\" class=\"classic\">%s</a>', stash('version')\n#: themes/default/templates/about.html.ep:21\nmsgid \"Latest tag of this instance: %1\"\nmsgstr \"Πιο πρόσφατο tag αυτής της εγκατάστασης: %1\"\n\n#: themes/default/templates/login.html.ep:15\nmsgid \"Login\"\nmsgstr \"Είσοδος\"\n\n#: themes/default/templates/layouts/default.html.ep:58 themes/default/templates/layouts/default.html.ep:91\nmsgid \"Logout\"\nmsgstr \"Αποσύνδεση\"\n\n#: themes/default/templates/about.html.ep:4\nmsgid \"Lufi is a free (as in free speech) file hosting software.\"\nmsgstr \"\"\n\"Το Lufi είναι ένα ελεύθερο (όπως ο ελεύθερος λόγος) λογισμικό για φιλοξενία \"\n\"αρχείων.\"\n\n#: themes/default/templates/partial/files.js.ep:12\nmsgid \"Lufi recently changed its way to store files information.\\\\n\\\\nNo files have been found in the new localStorage location but we found files in the old one.\\\\nDo you want to import those informations?\\\\n\\\\nPlease note that this is the only time that we will ask you this.\"\nmsgstr \"\"\n\"Το Lufi άλλαξε πρόσφατα τον τρόπο που αποθηκεύει τις πληροφορίες των αρχείων.\"\n\"\\\\n\"\n\"\\\\n\"\n\"Δεν βρέθηκαν αρχεία στην καινούρια τοποθεσία του localStorage, αλλά βρέθηκαν \"\n\"στην παλιά.\\\\n\"\n\"Θέλετε να γίνει εισαγωγή των πληροφοριών;\\\\n\"\n\"\\\\n\"\n\"Έχετε υπόψιν ότι δεν θα σας ξαναρωτήσουμε.\"\n\n#: themes/default/templates/files.html.ep:34\nmsgid \"Mail\"\nmsgstr \"Mail\"\n\n#: themes/default/templates/files.html.ep:3 themes/default/templates/layouts/default.html.ep:34 themes/default/templates/layouts/default.html.ep:67\nmsgid \"My files\"\nmsgstr \"Τα αρχεία μου\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:5 themes/default/templates/layouts/default.html.ep:37 themes/default/templates/layouts/default.html.ep:70\nmsgid \"My invitations\"\nmsgstr \"Οι προσκλήσεις μου\"\n\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:17\nmsgid \"NB: this list includes the list of files that have already been sent to you.\"\nmsgstr \"Σημείωση: αυτή η λίστα περιλαμβάνει τα αρχεία που σας έχουν ήδη σταλεί.\"\n\n#: themes/default/templates/index.html.ep:115\nmsgid \"Name of the zip file\"\nmsgstr \"Όνομα αρχείου zip\"\n\n#. (format_bytes($json->{size})\n#: lib/Lufi/Controller/Files.pm:109\nmsgid \"No enough space available on the server for this file (size: %1).\"\nmsgstr \"\"\n\"Δεν υπάρχει αρκετός χώρος στον διακομιστή για αυτό το αρχείο (μέγεθος %1).\"\n\n#: themes/default/templates/partial/files.js.ep:10 themes/default/templates/partial/index.js.ep:29\nmsgid \"No expiration delay\"\nmsgstr \"Δεν έχει καθοριστεί διάρκεια ζωής\"\n\n#: themes/default/templates/files.html.ep:8\nmsgid \"Only the files sent with this browser will be listed here. This list is stored in localStorage: if you delete your localStorage data, you'll lose this list.\"\nmsgstr \"\"\n\"Μόνο τα αρχεία που στάλθηκαν με αυτόν τον περιηγητή θα φαίνονται εδώ. Η \"\n\"λίστα αποθηκεύεται στο localStorage: αν σβήσετε τα περιεχόμενα του \"\n\"localStorage, θα χάσετε και τη λίστα.\"\n\n#: themes/default/templates/index.html.ep:106 themes/default/templates/login.html.ep:21 themes/default/templates/render.html.ep:26\nmsgid \"Password\"\nmsgstr \"Κωδικός\"\n\n#. (config('contact')\n#: themes/default/templates/about.html.ep:13\nmsgid \"Please contact the administrator: %1\"\nmsgstr \"Παρακαλώ επικοινωνήστε με το διαχειριστή: %1\"\n\n#: themes/default/templates/render.html.ep:33\nmsgid \"Please wait while we are getting your file. We first need to download and decrypt all parts before you can get it.\"\nmsgstr \"\"\n\"Περιμένετε όσο ετοιμάζουμε το αρχείο σας. Πρέπει πρώτα να κατέβουν και να \"\n\"αποκρυπτογραφηθούν όλα του τα κομμάτια για να το χρησιμοποιήσετε.\"\n\n#: lib/Lufi/Controller/Auth.pm:38\nmsgid \"Please, check your credentials or your right to access this service: unable to authenticate.\"\nmsgstr \"\"\n\"Παρακαλούμε, ελέγξτε τα στοιχεία σας ή το δικαίωμα πρόσβασής σας στην \"\n\"υπηρεσία: η πιστοποίηση απέτυχε.\"\n\n#: themes/default/templates/about.html.ep:5\nmsgid \"Privacy\"\nmsgstr \"Ιδιωτικότητα\"\n\n#: themes/default/templates/files.html.ep:13\nmsgid \"Purge expired files from localStorage\"\nmsgstr \"Διαγραφή ληγμένων αρχείων από το localStorage\"\n\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:20\nmsgid \"Regards,\"\nmsgstr \"Με εκτίμηση,\"\n\n#: themes/default/templates/invitations/invite.mail.ep:15\nmsgid \"Regards.\"\nmsgstr \"Με εκτίμηση.\"\n\n#: themes/default/templates/layouts/default.html.ep:31 themes/default/templates/layouts/default.html.ep:64\nmsgid \"Report file\"\nmsgstr \"Αναφορά αρχείου\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:15\nmsgid \"Resend invitation mail\"\nmsgstr \"Επαναποστολή μηνύματος πρόσκλησης\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:9\nmsgid \"Rows in purple mean that the invitations have expired.\"\nmsgstr \"Οι σειρές με μοβ αντιστοιχούν σε ληγμένες προσκλήσεις.\"\n\n#: themes/default/templates/files.html.ep:9\nmsgid \"Rows in red mean that the files have expired and are no longer available.\"\nmsgstr \"\"\n\"Οι σειρές με κόκκινο αντιστοιχούν σε ληγμένα αρχεία που δεν είναι πια \"\n\"διαθέσιμα.\"\n\n#: themes/default/templates/partial/index.js.ep:27\nmsgid \"Send all links by email\"\nmsgstr \"Αποστολή όλων των συνδέσμων με email\"\n\n#: themes/default/templates/invitations/invite.html.ep:50\nmsgid \"Send the invitation\"\nmsgstr \"Αποστολή της πρόσκλησης\"\n\n#: themes/default/templates/mail.html.ep:46\nmsgid \"Send with this server\"\nmsgstr \"Αποστολή με αυτό το διακομιστή\"\n\n#: themes/default/templates/mail.html.ep:47\nmsgid \"Send with your own mail software\"\nmsgstr \"Αποστολή μέσω δικού σας λογισμικού για email\"\n\n#: themes/default/templates/partial/index.js.ep:30\nmsgid \"Sending part XX1 of XX2. Please, be patient, the progress bar can take a while to move.\"\nmsgstr \"\"\n\"Αποστολή μέρους XX1 από XX2. Παρακαλούμε περιμένετε, η μπάρα μπορεί να \"\n\"χρειαστεί λίγη ώρα να μετακινηθεί.\"\n\n#. (url_for('/')\n#: themes/default/templates/partial/mail.js.ep:48\nmsgid \"Share your files in total privacy on %1\"\nmsgstr \"Μοιραστείτε τα αρχεία σας με πλήρη ιδιωτικότητα στο %1\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:13 themes/default/templates/partial/invitations.js.ep:9\nmsgid \"Show hidden invitations\"\nmsgstr \"Προβολή κρυφών προσκλήσεων\"\n\n#: themes/default/templates/partial/render.js.ep:12\nmsgid \"Show zip content\"\nmsgstr \"Προβολή περιεχομένων zip\"\n\n#: themes/default/templates/layouts/default.html.ep:40 themes/default/templates/layouts/default.html.ep:73 themes/default/templates/login.html.ep:28 themes/default/templates/logout.html.ep:17\nmsgid \"Signin\"\nmsgstr \"Είσοδος\"\n\n#: lib/Lufi/Controller/Invitation.pm:283 themes/default/templates/invitations/exception.html.ep:16\nmsgid \"Sorry, the invitation doesn’t exist. Are you sure you are on the right URL?\"\nmsgstr \"\"\n\"Μας συγχωρείτε, αυτή η πρόσκληση δεν υπάρχει. Είστε σίγουρα στη σωστή σελίδα;\"\n\n#: themes/default/templates/index.html.ep:46\nmsgid \"Sorry, the uploading is currently disabled. Please try again later.\"\nmsgstr \"\"\n\"Μας συγχωρείτε, το ανέβασμα αρχείων είναι προσωρινά απενεργοποιημένο. \"\n\"Παρακαλούμε προσπαθήστε αργότερα.\"\n\n#: lib/Lufi/Controller/Files.pm:82\nmsgid \"Sorry, uploading is disabled.\"\nmsgstr \"Μας συγχωρείτε, το ανέβασμα αρχείων είναι απενεργοποιημένο.\"\n\n#: themes/default/templates/invitations/exception.html.ep:7\nmsgid \"Sorry, your invitation has expired or has been deleted.\"\nmsgstr \"Μας συγχωρείτε, η πρόσκληση έχει λήξει ή έχει διαγραφεί.\"\n\n#. ($invit->ldap_user_mail)\n#: lib/Lufi/Controller/Files.pm:123\nmsgid \"Sorry, your invitation has expired or has been deleted. Please contact %1 to have another invitation.\"\nmsgstr \"\"\n\"Μας συγχωρείτε, η πρόσκληση έχει λήξει ή έχει διαγραφεί. Επικοινωνήστε με το \"\n\"%1 για νέα πρόσκληση.\"\n\n#. ($invitation->ldap_user_mail)\n#: lib/Lufi/Controller/Invitation.pm:276\nmsgid \"The URLs of your files have been sent by email to %1.\"\nmsgstr \"Οι σύνδεσμοι URL των αρχείων σας στάλθηκαν μέσω email στο %1.\"\n\n#: themes/default/templates/about.html.ep:7\nmsgid \"The administrator can only see the file's name, its size and its mimetype (what kind of file it is: video, text, etc.).\"\nmsgstr \"\"\n\"Ο διαχειριστής μπορεί μόνο να δει το όνομα, το μέγεθος, και τον τύπο αρχείου \"\n\"(mimetype, τι είδος αρχείου είναι: βίντεο, κείμενο, κλπ).\"\n\n#: lib/Lufi/Controller/Mail.pm:53\nmsgid \"The body of the mail must contain at least one URL pointing to a file hosted on this instance.\"\nmsgstr \"\"\n\"Το σώμα του email πρέπει να περιέχει τουλάχιστον ένα σύνδεσμο URL που να \"\n\"οδηγεί σε αρχείο που φιλοξενείται εδώ.\"\n\n#: themes/default/templates/partial/files.js.ep:11\nmsgid \"The data has been successfully imported.\"\nmsgstr \"Τα δεδομένα έχουν εισαχθεί επιτυχώς.\"\n\n#: lib/Lufi/Controller/Mail.pm:73\nmsgid \"The email body can't be empty.\"\nmsgstr \"Το σώμα του μηνύματος δεν μπορεί να είναι άδειο.\"\n\n#: lib/Lufi/Controller/Mail.pm:72\nmsgid \"The email subject can't be empty.\"\nmsgstr \"Το θέμα του μηνύματος δεν μπορεί να είναι κενό.\"\n\n#. ($expire_at, $max_expire_at)\n#: lib/Lufi/Controller/Invitation.pm:51\nmsgid \"The expiration delay (%1) is not between 1 and %2 days.\"\nmsgstr \"Η διάρκεια ζωής του αρχείου (%1) δεν είναι από 1 μέχρι %2 ημέρες.\"\n\n#: lib/Lufi/Controller/Files.pm:462\nmsgid \"The file has already been deleted\"\nmsgstr \"Το αρχείο έχει ήδη διαγραφεί\"\n\n#: themes/default/templates/about.html.ep:6\nmsgid \"The files uploaded on a Lufi instance are encrypted before the upload to the server: the administrator of the server can not see the file's content.\"\nmsgstr \"\"\n\"Τα αρχεία που ανεβαίνουν σε ένα Lufi κρυπτογραφούνται πριν ανέβουν στον \"\n\"διακομιστή: ο διαχειριστής του δεν μπορεί να δει τα περιεχόμενά τους.\"\n\n#. (join(', ', @bad)\n#: lib/Lufi/Controller/Mail.pm:68\nmsgid \"The following email addresses are not valid: %1\"\nmsgstr \"Οι ακόλουθες διευθύνσεις email δεν είναι έγκυρες: %1\"\n\n#. ($guest_mail)\n#: lib/Lufi/Controller/Invitation.pm:48\nmsgid \"The guest email address (%1) is unvalid.\"\nmsgstr \"Η διεύθυνση email (%1) δεν είναι έγκυρη.\"\n\n#. ($i->token, $i->guest_mail)\n#: lib/Lufi/Controller/Invitation.pm:150\nmsgid \"The invitation %1 can’t be resent: %2 has already sent files.<br>Please create a new invitation.\"\nmsgstr \"\"\n\"Η πρόσκληση %1 δεν μπορεί να ξανασταλεί: το %2 έχει ήδη στείλει \"\n\"αρχεία.<br>Παρακαλούμε δημιουργήστε μια καινούρια πρόσκληση.\"\n\n#. ($i->token)\n#: lib/Lufi/Controller/Invitation.pm:130\nmsgid \"The invitation %1 has been deleted.\"\nmsgstr \"Η πρόσκληση %1 έχει διαγραφεί.\"\n\n#. (stash('user_mail')\n#: themes/default/templates/invitations/invite.html.ep:34\nmsgid \"The invitation mail will be send from your email address (%1).\"\nmsgstr \"Το email της πρόσκλησης θα σταλεί από τη δική σας διεύθυνση (%1).\"\n\n#: themes/default/templates/partial/index.js.ep:16\nmsgid \"The link(s) has been copied to your clipboard\"\nmsgstr \"Έγινε αντιγραφή του συνδέσμου / των συνδέσμων στο πρόχειρο\"\n\n#. (stash('invitation')\n#: themes/default/templates/index.html.ep:30\nmsgid \"The link(s) of your file(s) will automatically be sent by mail to %1 (%2)\"\nmsgstr \"\"\n\"Θα γίνει αυτόματη αποστολή του συνδέσμου / των συνδέσμων με email προς %1 \"\n\"(%2)\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:11\nmsgid \"The links of your file(s) will automatically be sent by mail to %1.\"\nmsgstr \"\"\n\"Θα γίνει αυτόματη αποστολή του συνδέσμου / των συνδέσμων με email προς %1.\"\n\n#: lib/Lufi/Controller/Mail.pm:97\nmsgid \"The mail has been sent.\"\nmsgstr \"Το μήνυμα έχει σταλεί.\"\n\n#: themes/default/templates/about.html.ep:15\nmsgid \"The original (and only for now) author is <a href=\\\"https://fiat-tux.fr\\\" class=\\\"classic\\\">Luc Didry</a>.\"\nmsgstr \"\"\n\"Ο αρχικός (και μοναδικός προς το παρόν) δημιουργός είναι ο <a href=\\\"https\"\n\"://fiat-tux.fr\\\" class=\\\"classic\\\">Luc Didry</a>.\"\n\n#: lib/Lufi/Controller/Files.pm:230\nmsgid \"The server was unable to find the file record to add your file part to. Please, contact the administrator.\"\nmsgstr \"\"\n\"Ο διακομιστής δεν κατάφερε να βρει το αρχείο όπου πρέπει να προστεθεί αυτό \"\n\"το κομμάτι. Παρακαλούμε, επικοινωνήστε με τον διαχειριστή.\"\n\n#: lib/Lufi/Controller/Files.pm:289\nmsgid \"This file has been deactivated by the admins. Contact them to know why.\"\nmsgstr \"\"\n\"Αυτό το αρχείο έχει απενεργοποιηθεί από τους διαχειριστές. Επικοινωνήστε \"\n\"μαζί τους για να μάθετε το λόγο.\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:46 themes/default/templates/partial/invitations.js.ep:6\nmsgid \"This invitation is normally hidden\"\nmsgstr \"Αυτή η πρόσκληση είναι κρυφή κανονικά\"\n\n#. (stash('expires')\n#: themes/default/templates/invitations/invite.mail.ep:13\nmsgid \"This invitation is valid until %1.\"\nmsgstr \"Αυτή η πρόσκληση είναι έγκυρη μέχρι %1.\"\n\n#: themes/default/templates/delays.html.ep:10\nmsgid \"This server sets limitations according to the file size. The expiration delay of your file will be the minimum between what you choose and the following limitations:\"\nmsgstr \"\"\n\"Ο διακομιστής θέτει περιορισμούς ανάλογα με το μέγεθος του αρχείου. Η \"\n\"διάρκεια ζωής του αρχείου σας θα είναι το ελάχιστο μεταξύ αυτού που \"\n\"επιλέγετε και των ακόλουθων περιορισμών:\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:16\nmsgid \"Toggle visibility\"\nmsgstr \"Εμφάνιση/Απόκρυψη\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:25\nmsgid \"URL\"\nmsgstr \"Σύνδεσμος URL\"\n\n#: themes/default/templates/partial/index.js.ep:17\nmsgid \"Unable to copy the link(s) to your clipboard\"\nmsgstr \"\"\n\"Δεν μπόρεσε να γίνει αντιγραφή του συνδέσμου / των συνδέσμων στο πρόχειρο\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:433\nmsgid \"Unable to get counter for %1. The file does not exists. It will be removed from your localStorage.\"\nmsgstr \"\"\n\"Δεν ήταν δυνατόν να βρεθεί ο μετρητής για το %1. Το αρχείο δεν υπάρχει. Θα \"\n\"αφαιρεθεί από το localStorage.\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:423\nmsgid \"Unable to get counter for %1. The token is invalid.\"\nmsgstr \"\"\n\"Δεν ήταν δυνατόν να βρεθεί ο μετρητής για το %1. Το token δεν είναι έγκυρο.\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:443\nmsgid \"Unable to get counter for %1. You are not authenticated.\"\nmsgstr \"\"\n\"Δεν ήταν δυνατόν να βρεθεί ο μετρητής για το %1. Δεν έχετε πιστοποιηθεί.\"\n\n#: themes/default/templates/layouts/default.html.ep:33 themes/default/templates/layouts/default.html.ep:66\nmsgid \"Upload files\"\nmsgstr \"Ανέβασμα αρχείων\"\n\n#: themes/default/templates/index.html.ep:145\nmsgid \"Upload generated zip file\"\nmsgstr \"Ανέβασμα του αρχείου zip που δημιουργήθηκε\"\n\n#: themes/default/templates/files.html.ep:31\nmsgid \"Uploaded at\"\nmsgstr \"Ανέβηκε στις\"\n\n#: themes/default/templates/index.html.ep:153\nmsgid \"Uploaded files\"\nmsgstr \"Ανεβασμένα αρχεία\"\n\n#: themes/default/templates/about.html.ep:20\nmsgid \"Version\"\nmsgstr \"Έκδοση\"\n\n#: themes/default/templates/partial/index.js.ep:31\nmsgid \"Websocket communication error\"\nmsgstr \"Πρόβλημα επικοινωνίας websocket\"\n\n#: themes/default/templates/about.html.ep:3\nmsgid \"What is Lufi?\"\nmsgstr \"Τι είναι το Lufi;\"\n\n#: themes/default/templates/about.html.ep:14\nmsgid \"Who wrote this software?\"\nmsgstr \"Ποιος έγραψε αυτό το λογισμικό;\"\n\n#: themes/default/templates/partial/index.js.ep:13\nmsgid \"XXX file has been added to upload queue.\"\nmsgstr \"Το αρχείο XXX προστέθηκε στην ουρά για ανέβασμα.\"\n\n#: themes/default/templates/invitations/invite.html.ep:30\nmsgid \"You can invite someone to send you files through this Lufi instance even if they don’t have an account on it.\"\nmsgstr \"\"\n\"Μπορείτε να προσκαλέσετε κάποιον/-α να σας στείλει αρχεία μέσα από αυτό το \"\n\"Lufi, ακόμη κι αν δεν έχει λογαριασμό εδώ.\"\n\n#: themes/default/templates/about.html.ep:11\nmsgid \"You can see the list of your files by clicking on the \\\"My files\\\" link at the top right of this page.\"\nmsgstr \"\"\n\"Μπορείτε να δείτε τη λίστα των αρχείων σας κάνοντας κλικ στο σύνδεσμο \\\"Τα \"\n\"αρχεία μου\\\" στην κορυφή αυτής της σελίδας στα δεξιά.\"\n\n#: lib/Lufi/Controller/Mail.pm:42\nmsgid \"You can't add URLs that are not related to this instance.\"\nmsgstr \"\"\n\"Δεν μπορείτε να προσθέσετε συνδέσμους URL που δεν σχετίζονται με αυτό το \"\n\"Lufi.\"\n\n#: themes/default/templates/about.html.ep:8\nmsgid \"You don't need to register yourself to upload files but be aware that, for legal reasons, your IP address will be stored when you send a file. Don't panic, this is normally the case for all sites on which you send files.\"\nmsgstr \"\"\n\"Δεν χρειάζεται να φτιάξετε λογαριασμό για να ανεβάσετε αρχεία, έχετε όμως \"\n\"υπόψιν σας ότι, για νομικούς λόγους, η διεύθυνση IP σας θα αποθηκευτεί όταν \"\n\"στείλετε ένα αρχείο. Μην πανικοβάλλεστε, αυτό συμβαίνει συνήθως σε όλες τις \"\n\"ιστοσελίδες που σας επιτρέπουν να στέλνετε αρχεία.\"\n\n#: themes/default/templates/partial/render.js.ep:11\nmsgid \"You don't seem to have a key in your URL. You won't be able to decrypt the file. Download canceled.\"\nmsgstr \"\"\n\"Δεν φαίνεται να υπάρχει κλειδί σε αυτόν τον σύνδεσμο URL. Το αρχείο δεν θα \"\n\"μπορέσει να αποκρυπτογραφηθεί. Η λήψη ακυρώθηκε.\"\n\n#: themes/default/templates/partial/render.js.ep:7\nmsgid \"You have attempted to leave this page. The download will be canceled. Are you sure?\"\nmsgstr \"\"\n\"Επιχειρήσατε να φύγετε από τη σελίδα. Η λήψη θα ακυρωθεί. Θέλετε σίγουρα να \"\n\"φύγετε;\"\n\n#: themes/default/templates/partial/index.js.ep:14\nmsgid \"You have attempted to leave this page. The upload will be canceled. Are you sure?\"\nmsgstr \"\"\n\"Επιχειρήσατε να φύγετε από τη σελίδα. Η αποστολή θα ακυρωθεί. Θέλετε σίγουρα \"\n\"να φύγετε;\"\n\n#: themes/default/templates/logout.html.ep:14\nmsgid \"You have been successfully logged out.\"\nmsgstr \"Έχετε αποσυνδεθεί επιτυχώς.\"\n\n#: lib/Lufi/Controller/Mail.pm:71\nmsgid \"You must give email addresses.\"\nmsgstr \"Πρέπει να δώστε τις διευθύνσεις email.\"\n\n#: themes/default/templates/index.html.ep:38\nmsgid \"Your browser does not have enough entropy to generate a strong encryption key. Please wait (it's better if you do things on your computer while waiting).\"\nmsgstr \"\"\n\"Ο περιηγητής σας δεν έχει αρκετή εντροπία για να δημιουργηθεί ένα δυνατό \"\n\"κλειδί κρυπτογράφησης. Παρακαλούμε περιμένετε (είναι καλύτερα αν όσο \"\n\"περιμένετε χρησιμοποιείτε τον υπολογιστή).\"\n\n#. (format_bytes($json->{size})\n#: lib/Lufi/Controller/Files.pm:95\nmsgid \"Your file is too big: %1 (maximum size allowed: %2)\"\nmsgstr \"Το αρχείο είναι πολύ μεγάλο: %1 (μέγιστο επιτρεπόμενο μέγεθος: %2)\"\n\n#: lib/Lufi/Controller/Files.pm:345\nmsgid \"Your password is not valid. Please refresh the page to retry.\"\nmsgstr \"\"\n\"Ο κωδικός δεν είναι έγκυρος. Παρακαλούμε ανανεώστε τη σελίδα για να \"\n\"ξαναδοκιμάσετε.\"\n\n#: themes/default/templates/partial/render.js.ep:13\nmsgid \"Zip content:\"\nmsgstr \"Περιεχόμενα zip:\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:20\nmsgid \"between %1 and %2, the file will be kept %3 day(s).\"\nmsgstr \"μεταξύ %1 και %2, το αρχείο θα διατηρηθεί για %3 ημέρα/-ες.\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:22\nmsgid \"between %1 and %2, the file will be kept forever.\"\nmsgstr \"μεταξύ %1 και %2, το αρχείο θα διατηρηθεί για πάντα.\"\n\n#: themes/default/templates/partial/mail.js.ep:42\nmsgid \"deadline: \"\nmsgstr \"προθεσμία: \"\n\n#: themes/default/templates/partial/invitations.js.ep:5\nmsgid \"expires on XXX\"\nmsgstr \"λήγει στις XXX\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:26\nmsgid \"for %1 and more, the file will be kept %2 day(s)\"\nmsgstr \"για %1 και πάνω, το αρχείο θα διατηρηθεί για %2 ημέρα/-ες\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:28\nmsgid \"for %1 and more, the file will be kept forever.\"\nmsgstr \"για %1 και πάνω, το αρχείο θα διατηρηθεί για πάντα.\"\n\n#: themes/default/templates/index.html.ep:3\nmsgid \"no time limit\"\nmsgstr \"χωρίς χρονικό όριο\"\n\n#: themes/default/templates/index.html.ep:124\nmsgid \"or\"\nmsgstr \"ή\"\n\n#. ($e->{name}, format_bytes($e->{size})\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:12\nmsgid \"— %1 (%2), that will expire on %3\"\nmsgstr \"— %1 (%2), που θα λήξει στις %3\"\n\n#: themes/default/templates/partial/render.js.ep:13\nmsgid \"Unable to download the file: too much unsuccessful attempts to open a websocket. Please, contact the administrator.\"\nmsgstr \"\"\n\"Δεν ήταν δυνατόν να κατέβει το αρχείο: έγιναν υπερβολικά πολλές ανεπιτυχείς \"\n\"προσπάθειες για άνοιγμα ενός websocket. Παρακαλούμε, επικοινωνήστε με τον \"\n\"διαχειριστή.\"\n\n#. ($i->token, $c->current_user->{username})\n#: lib/Lufi/Controller/Invitation.pm:136\nmsgid \"The invitation %1 can’t be deleted: it wasn’t created by you (%2).\"\nmsgstr \"Αδύνατη η διαγραφή της πρόσκλησης %1: δεν δημιουργήθηκε από εσας (%2).\"\n\n#. ($i->token, $c->current_user->{username})\n#: lib/Lufi/Controller/Invitation.pm:187\nmsgid \"The invitation %1 can’t be resent: it wasn’t created by you (%2).\"\nmsgstr \"\"\n\"Αδύνατη η εκ νέου αποστολή της πρόσκλησης %1: δεν δημιουργήθηκε από εσάς \"\n\"(%2).\"\n\n#. ($orig_uri)\n#: lib/Lufi/Controller/Mail.pm:43 lib/Lufi/Controller/Mail.pm:59\nmsgid \"You can't add URLs that are not related to this instance (%1).\"\nmsgstr \"\"\n\"Δεν μπορείτε να προσθέσετε URL που δεν σχετίζονται με αυτήν την υπόσταση \"\n\"(%1).\"\n"
  },
  {
    "path": "themes/default/lib/Lufi/I18N/en.po",
    "content": "# Luc Didry <luc@framasoft.org>, 2018. #zanata\n# Armando <armando@noplanman.ch>, 2019. #zanata\n# Luc Didry <luc@framasoft.org>, 2019. #zanata\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"PO-Revision-Date: 2019-10-10 08:58+0000\\n\"\n\"Last-Translator: Luc Didry <luc@framasoft.org>\\n\"\n\"Language-Team: English\\n\"\n\"Language: en\\n\"\n\"X-Generator: Zanata 4.6.2\\n\"\n\"Plural-Forms: nplurals=2; plural=(n != 1)\\n\"\n\n#. ($delay)\n#. (max_delay)\n#: themes/default/templates/index.html.ep:56 themes/default/templates/index.html.ep:65 themes/default/templates/index.html.ep:66\nmsgid \"%1 days\"\nmsgstr \"%1 days\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:2\nmsgid \"%1 invites you to send him/her files\"\nmsgstr \"%1 invites you to send him/her files\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:6\nmsgid \"%1 invites you to send him/her files through Lufi.\"\nmsgstr \"%1 invites you to send him/her files through Lufi.\"\n\n#. (stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:4\nmsgid \"%1 sent you files\"\nmsgstr \"%1 sent you files\"\n\n#. (stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:8\nmsgid \"%1 used your invitation to send you files:\"\nmsgstr \"%1 used your invitation to send you files:\"\n\n#: lib/Lufi/Controller/Invitation.pm:172 lib/Lufi/Controller/Invitation.pm:85 themes/default/templates/invitations/my_invitations.html.ep:51 themes/default/templates/invitations/my_invitations.html.ep:52 themes/default/templates/invitations/my_invitations.html.ep:53 themes/default/templates/invitations/notification_files_sent.mail.ep:12\nmsgid \"%A %d %B %Y at %T\"\nmsgstr \"%A %d %B %Y at %T\"\n\n#: themes/default/templates/partial/index.js.ep:28\nmsgid \"(max size: XXX)\"\nmsgstr \"(max size: XXX)\"\n\n#: themes/default/templates/index.html.ep:5\nmsgid \"1 year\"\nmsgstr \"1 year\"\n\n#: themes/default/templates/index.html.ep:4 themes/default/templates/index.html.ep:65\nmsgid \"24 hours\"\nmsgstr \"24 hours\"\n\n#: themes/default/templates/partial/mail.js.ep:40\nmsgid \":\"\nmsgstr \":\"\n\n#: themes/default/templates/render.html.ep:42\nmsgid \"Abort\"\nmsgstr \"Abort\"\n\n#: themes/default/templates/layouts/default.html.ep:53 themes/default/templates/layouts/default.html.ep:86\nmsgid \"About\"\nmsgstr \"About\"\n\n#: themes/default/templates/index.html.ep:107\nmsgid \"Add a password to file(s)\"\nmsgstr \"Add a password to file(s)\"\n\n#: themes/default/templates/mail.html.ep:16\nmsgid \"Adding URLs not related to this Lufi instance to the mail body or subject is prohibited.\"\nmsgstr \"Adding URLs not related to this Lufi instance to the mail body or subject is prohibited.\"\n\n#: themes/default/templates/delete_file.html.ep:18\nmsgid \"Are you sure you want to delete that file?\"\nmsgstr \"Are you sure you want to delete that file?\"\n\n#: themes/default/templates/partial/invitations.js.ep:3\nmsgid \"Are you sure you want to delete the selected invitations?\"\nmsgstr \"Are you sure you want to delete the selected invitations?\"\n\n#: themes/default/templates/partial/invitations.js.ep:4\nmsgid \"Are you sure you want to resend the invitation mail for the selected invitations?\"\nmsgstr \"Are you sure you want to resend the invitation mail for the selected invitations?\"\n\n#: themes/default/templates/about.html.ep:17\nmsgid \"As Lufi is a free software licensed under of the terms of the <a href=\\\"https://gnu.org/licenses/agpl.html\\\" class=\\\"classic\\\">AGPLv3</a>, you can install it on you own server. Have a look on the <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi/wikis/home\\\" class=\\\"classic\\\">Wiki</a> for the procedure.\"\nmsgstr \"As Lufi is a free software licensed under of the terms of the <a href=\\\"https://gnu.org/licenses/agpl.html\\\" class=\\\"classic\\\">AGPLv3</a>, you can install it on you own server. Have a look on the <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi/wikis/home\\\" class=\\\"classic\\\">Wiki</a> for the procedure.\"\n\n#. (stash('nbslices')\n#: themes/default/templates/partial/render.js.ep:10\nmsgid \"Asking for file part XX1 of %1\"\nmsgstr \"Asking for file part XX1 of %1\"\n\n#: themes/default/templates/about.html.ep:23\nmsgid \"Back to homepage\"\nmsgstr \"Back to homepage\"\n\n#: lib/Lufi/Controller/Mail.pm:26\nmsgid \"Bad CSRF token!\"\nmsgstr \"Bad CSRF token!\"\n\n#: lib/Lufi/Controller/Auth.pm:38 lib/Lufi/Controller/Auth.pm:60 lib/Lufi/Controller/Files.pm:474\nmsgid \"Bad CSRF token.\"\nmsgstr \"Bad CSRF token.\"\n\n#: themes/default/templates/partial/render.js.ep:5\nmsgid \"Click here to refresh the page and restart the download.\"\nmsgstr \"Click here to refresh the page and restart the download.\"\n\n#: themes/default/templates/invitations/invite.mail.ep:8\nmsgid \"Click on the following URL to upload files on Lufi:\"\nmsgstr \"Click on the following URL to upload files on Lufi:\"\n\n#: themes/default/templates/index.html.ep:126\nmsgid \"Click to open the file browser\"\nmsgstr \"Click to open the file browser\"\n\n#: themes/default/templates/delays.html.ep:42 themes/default/templates/invitations/my_invitations.html.ep:80\nmsgid \"Close\"\nmsgstr \"Close\"\n\n#: themes/default/templates/mail.html.ep:23\nmsgid \"Comma-separated email addresses\"\nmsgstr \"Comma-separated email addresses\"\n\n#: themes/default/templates/index.html.ep:140\nmsgid \"Compressing zip file…\"\nmsgstr \"Compressing zip file…\"\n\n#: themes/default/templates/partial/index.js.ep:15\nmsgid \"Copy all links to clipboard\"\nmsgstr \"Copy all links to clipboard\"\n\n#: themes/default/templates/partial/index.js.ep:18\nmsgid \"Copy to clipboard\"\nmsgstr \"Copy to clipboard\"\n\n#: lib/Lufi/Controller/Files.pm:524\nmsgid \"Could not delete the file. You are not authenticated.\"\nmsgstr \"Could not delete the file. You are not authenticated.\"\n\n#: lib/Lufi/Controller/Files.pm:505\nmsgid \"Could not find the file. Are you sure of the URL and the token?\"\nmsgstr \"Could not find the file. Are you sure of the URL and the token?\"\n\n#: lib/Lufi/Controller/Files.pm:394\nmsgid \"Could not find the file. Are you sure of the URL?\"\nmsgstr \"Could not find the file. Are you sure of the URL?\"\n\n#: themes/default/templates/files.html.ep:29\nmsgid \"Counter\"\nmsgstr \"Counter\"\n\n#: themes/default/templates/index.html.ep:100\nmsgid \"Create a zip archive with the files before uploading?\"\nmsgstr \"Create a zip archive with the files before uploading?\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:26\nmsgid \"Created at\"\nmsgstr \"Created at\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:14\nmsgid \"Delete\"\nmsgstr \"Delete\"\n\n#: themes/default/templates/files.html.ep:30 themes/default/templates/index.html.ep:90\nmsgid \"Delete at first download?\"\nmsgstr \"Delete at first download?\"\n\n#: themes/default/templates/files.html.ep:19\nmsgid \"Delete selected files\"\nmsgstr \"Delete selected files\"\n\n#: themes/default/templates/files.html.ep:33 themes/default/templates/partial/index.js.ep:19\nmsgid \"Deletion link\"\nmsgstr \"Deletion link\"\n\n#: themes/default/templates/delays.html.ep:9\nmsgid \"Don't worry: if a user begins to download the file before the expiration and the download ends after the expiration, he will be able to get the file.\"\nmsgstr \"Don't worry: if a user begins to download the file before the expiration and the download ends after the expiration, he will be able to get the file.\"\n\n#: themes/default/templates/partial/index.js.ep:21 themes/default/templates/render.html.ep:28\nmsgid \"Download\"\nmsgstr \"Download\"\n\n#: themes/default/templates/partial/render.js.ep:4\nmsgid \"Download aborted.\"\nmsgstr \"Download aborted.\"\n\n#: themes/default/templates/files.html.ep:28 themes/default/templates/partial/index.js.ep:20\nmsgid \"Download link\"\nmsgstr \"Download link\"\n\n#: themes/default/templates/about.html.ep:10\nmsgid \"Drag and drop files in the appropriate area or use the traditional way to send files and the files will be chunked, encrypted and sent to the server. You will get two links per file: a download link, that you give to the people you want to share the file with and a deletion link, allowing you to delete the file whenever you want.\"\nmsgstr \"Drag and drop files in the appropriate area or use the traditional way to send files and the files will be chunked, encrypted and sent to the server. You will get two links per file: a download link, that you give to the people you want to share the file with and a deletion link, allowing you to delete the file whenever you want.\"\n\n#: themes/default/templates/index.html.ep:122\nmsgid \"Drop files here\"\nmsgstr \"Drop files here\"\n\n#: themes/default/templates/invitations/invite.html.ep:40\nmsgid \"Email address of your guest\"\nmsgstr \"Email address of your guest\"\n\n#: themes/default/templates/mail.html.ep:39\nmsgid \"Email body\"\nmsgstr \"Email body\"\n\n#: themes/default/templates/mail.html.ep:31\nmsgid \"Email subject\"\nmsgstr \"Email subject\"\n\n#: themes/default/templates/mail.html.ep:25 themes/default/templates/mail.html.ep:27\nmsgid \"Emails\"\nmsgstr \"Emails\"\n\n#: themes/default/templates/partial/index.js.ep:22\nmsgid \"Encrypting part XX1 of XX2\"\nmsgstr \"Encrypting part XX1 of XX2\"\n\n#: lib/Lufi/Controller/Files.pm:283\nmsgid \"Error: the file existed but was deleted.\"\nmsgstr \"Error: the file existed but was deleted.\"\n\n#: lib/Lufi/Controller/Files.pm:363\nmsgid \"Error: the file has not been sent entirely.\"\nmsgstr \"Error: the file has not been sent entirely.\"\n\n#: lib/Lufi/Controller/Files.pm:373\nmsgid \"Error: unable to find the file. Are you sure of your URL?\"\nmsgstr \"Error: unable to find the file. Are you sure of your URL?\"\n\n#: themes/default/templates/partial/index.js.ep:23\nmsgid \"Expiration:\"\nmsgstr \"Expiration:\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:27\nmsgid \"Expire at\"\nmsgstr \"Expire at\"\n\n#: themes/default/templates/files.html.ep:32\nmsgid \"Expires at\"\nmsgstr \"Expires at\"\n\n#: themes/default/templates/files.html.ep:12\nmsgid \"Export localStorage data\"\nmsgstr \"Export localStorage data\"\n\n#: lib/Lufi/Controller/Files.pm:487\nmsgid \"File deleted\"\nmsgstr \"File deleted\"\n\n#: themes/default/templates/partial/render.js.ep:9\nmsgid \"File downloaded\"\nmsgstr \"File downloaded\"\n\n#: themes/default/templates/files.html.ep:27\nmsgid \"File name\"\nmsgstr \"File name\"\n\n#: themes/default/templates/partial/index.js.ep:24\nmsgid \"File uploaded\"\nmsgstr \"File uploaded\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:61\nmsgid \"Files\"\nmsgstr \"Files\"\n\n#: themes/default/templates/index.html.ep:80\nmsgid \"Files deleted at first download\"\nmsgstr \"Files deleted at first download\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:28\nmsgid \"Files sent at\"\nmsgstr \"Files sent at\"\n\n#: themes/default/templates/partial/invitations.js.ep:8\nmsgid \"Files sent in invitation XX1 by XX2\"\nmsgstr \"Files sent in invitation XX1 by XX2\"\n\n#: themes/default/templates/partial/render.js.ep:8\nmsgid \"Get the file\"\nmsgstr \"Get the file\"\n\n#: themes/default/templates/about.html.ep:18\nmsgid \"Get the source code on <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi\\\" class=\\\"classic\\\">the official repository</a> or on its <a href=\\\"https://github.com/ldidry/lufi\\\" class=\\\"classic\\\">Github mirror</a>\"\nmsgstr \"Get the source code on <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi\\\" class=\\\"classic\\\">the official repository</a> or on its <a href=\\\"https://github.com/ldidry/lufi\\\" class=\\\"classic\\\">Github mirror</a>\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:24\nmsgid \"Guest mail\"\nmsgstr \"Guest mail\"\n\n#. (ucfirst(stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:6\nmsgid \"Hello %1,\"\nmsgstr \"Hello %1,\"\n\n#: themes/default/templates/invitations/invite.mail.ep:4\nmsgid \"Hello,\"\nmsgstr \"Hello,\"\n\n#: themes/default/templates/partial/mail.js.ep:35\nmsgid \"Hello,\\\\n\\\\nHere's some files I want to share with you:\\\\n\"\nmsgstr \"Hello,\\\\n\\\\nHere's some files I want to share with you:\\\\n\"\n\n#: themes/default/templates/mail.html.ep:35\nmsgid \"Here's some files\"\nmsgstr \"Here's some files\"\n\n#: themes/default/templates/partial/invitations.js.ep:7\nmsgid \"Hide hidden invitations\"\nmsgstr \"Hide hidden invitations\"\n\n#: themes/default/templates/partial/index.js.ep:26\nmsgid \"Hit Enter, then Ctrl+C to copy all the download links\"\nmsgstr \"Hit Enter, then Ctrl+C to copy all the download links\"\n\n#: themes/default/templates/partial/index.js.ep:25\nmsgid \"Hit Enter, then Ctrl+C to copy the download link\"\nmsgstr \"Hit Enter, then Ctrl+C to copy the download link\"\n\n#: themes/default/templates/about.html.ep:9\nmsgid \"How does it work?\"\nmsgstr \"How does it work?\"\n\n#: themes/default/templates/invitations/invite.html.ep:46\nmsgid \"How many days would you like the invitation to be valid?\"\nmsgstr \"How many days would you like the invitation to be valid?\"\n\n#: themes/default/templates/about.html.ep:16\nmsgid \"How to install the software on my server?\"\nmsgstr \"How to install the software on my server?\"\n\n#: themes/default/templates/about.html.ep:12\nmsgid \"How to report an illegal file?\"\nmsgstr \"How to report an illegal file?\"\n\n#: themes/default/templates/delays.html.ep:8\nmsgid \"If you choose a delay, the file will be deleted after that delay.\"\nmsgstr \"If you choose a delay, the file will be deleted after that delay.\"\n\n#: themes/default/templates/mail.html.ep:15\nmsgid \"If you send the mail from this server, the links will be sent to the server, which may lower your privacy protection.\"\nmsgstr \"If you send the mail from this server, the links will be sent to the server, which may lower your privacy protection.\"\n\n#: themes/default/templates/files.html.ep:14\nmsgid \"Import localStorage data\"\nmsgstr \"Import localStorage data\"\n\n#: themes/default/templates/index.html.ep:53\nmsgid \"Important: more information on delays\"\nmsgstr \"Important: more information on delays\"\n\n#: themes/default/templates/delays.html.ep:5\nmsgid \"Information about delays\"\nmsgstr \"Information about delays\"\n\n#: themes/default/templates/files.html.ep:18 themes/default/templates/invitations/my_invitations.html.ep:12\nmsgid \"Invert selection\"\nmsgstr \"Invert selection\"\n\n#. ($i->guest_mail, $url)\n#: lib/Lufi/Controller/Invitation.pm:184\nmsgid \"Invitation resent to %1.<br> URL: %2\"\nmsgstr \"Invitation resent to %1.<br> URL: %2\"\n\n#. ($invitation->guest_mail, $url)\n#: lib/Lufi/Controller/Invitation.pm:88\nmsgid \"Invitation sent to %1.<br> URL: %2\"\nmsgstr \"Invitation sent to %1.<br> URL: %2\"\n\n#: themes/default/templates/invitations/invite.html.ep:27 themes/default/templates/layouts/default.html.ep:36 themes/default/templates/layouts/default.html.ep:69\nmsgid \"Invite a guest\"\nmsgstr \"Invite a guest\"\n\n#: themes/default/templates/partial/render.js.ep:6\nmsgid \"It seems that the key in your URL is incorrect. Please, verify your URL.\"\nmsgstr \"It seems that the key in your URL is incorrect. Please, verify your URL.\"\n\n#: themes/default/templates/index.html.ep:12\nmsgid \"Javascript is disabled. You won't be able to use Lufi.\"\nmsgstr \"Javascript is disabled. You won't be able to use Lufi.\"\n\n#: themes/default/templates/layouts/default.html.ep:44 themes/default/templates/layouts/default.html.ep:46 themes/default/templates/layouts/default.html.ep:77 themes/default/templates/layouts/default.html.ep:79\nmsgid \"Language\"\nmsgstr \"Language\"\n\n#. (sprintf('<a href=\"https://framagit.org/fiat-tux/hat-softwares/lufi/-/commit/%s\" class=\"classic\">%s</a>', stash('version')\n#: themes/default/templates/about.html.ep:22\nmsgid \"Latest commit of this instance: %1\"\nmsgstr \"Latest commit of this instance: %1\"\n\n#. (sprintf('<a href=\"https://framagit.org/fiat-tux/hat-softwares/lufi/-/releases/%s\" class=\"classic\">%s</a>', stash('version')\n#: themes/default/templates/about.html.ep:21\nmsgid \"Latest tag of this instance: %1\"\nmsgstr \"Latest tag of this instance: %1\"\n\n#: themes/default/templates/login.html.ep:15\nmsgid \"Login\"\nmsgstr \"Login\"\n\n#: themes/default/templates/layouts/default.html.ep:58 themes/default/templates/layouts/default.html.ep:91\nmsgid \"Logout\"\nmsgstr \"Logout\"\n\n#: themes/default/templates/about.html.ep:4\nmsgid \"Lufi is a free (as in free speech) file hosting software.\"\nmsgstr \"Lufi is a free (as in free speech) file hosting software.\"\n\n#: themes/default/templates/partial/files.js.ep:12\nmsgid \"Lufi recently changed its way to store files information.\\\\n\\\\nNo files have been found in the new localStorage location but we found files in the old one.\\\\nDo you want to import those informations?\\\\n\\\\nPlease note that this is the only time that we will ask you this.\"\nmsgstr \"Lufi recently changed its way to store files information.\\\\n\\\\nNo files have been found in the new localStorage location but we found files in the old one.\\\\nDo you want to import those informations?\\\\n\\\\nPlease note that this is the only time that we will ask you this.\"\n\n#: themes/default/templates/files.html.ep:34\nmsgid \"Mail\"\nmsgstr \"Mail\"\n\n#: themes/default/templates/files.html.ep:3 themes/default/templates/layouts/default.html.ep:34 themes/default/templates/layouts/default.html.ep:67\nmsgid \"My files\"\nmsgstr \"My files\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:5 themes/default/templates/layouts/default.html.ep:37 themes/default/templates/layouts/default.html.ep:70\nmsgid \"My invitations\"\nmsgstr \"My invitations\"\n\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:17\nmsgid \"NB: this list includes the list of files that have already been sent to you.\"\nmsgstr \"NB: this list includes the list of files that have already been sent to you.\"\n\n#: themes/default/templates/index.html.ep:115\nmsgid \"Name of the zip file\"\nmsgstr \"Name of the zip file\"\n\n#. (format_bytes($json->{size})\n#: lib/Lufi/Controller/Files.pm:109\nmsgid \"No enough space available on the server for this file (size: %1).\"\nmsgstr \"No enough space available on the server for this file (size: %1).\"\n\n#: themes/default/templates/partial/files.js.ep:10 themes/default/templates/partial/index.js.ep:29\nmsgid \"No expiration delay\"\nmsgstr \"No expiration delay\"\n\n#: themes/default/templates/files.html.ep:8\nmsgid \"Only the files sent with this browser will be listed here. This list is stored in localStorage: if you delete your localStorage data, you'll lose this list.\"\nmsgstr \"Only the files sent with this browser will be listed here. This list is stored in localStorage: if you delete your localStorage data, you'll lose this list.\"\n\n#: themes/default/templates/index.html.ep:106 themes/default/templates/login.html.ep:21 themes/default/templates/render.html.ep:26\nmsgid \"Password\"\nmsgstr \"Password\"\n\n#. (config('contact')\n#: themes/default/templates/about.html.ep:13\nmsgid \"Please contact the administrator: %1\"\nmsgstr \"Please contact the administrator: %1\"\n\n#: themes/default/templates/render.html.ep:33\nmsgid \"Please wait while we are getting your file. We first need to download and decrypt all parts before you can get it.\"\nmsgstr \"Please wait while we are getting your file. We first need to download and decrypt all parts before you can get it.\"\n\n#: lib/Lufi/Controller/Auth.pm:49\nmsgid \"Please, check your credentials or your right to access this service: unable to authenticate.\"\nmsgstr \"Please, check your credentials or your right to access this service: unable to authenticate.\"\n\n#: themes/default/templates/about.html.ep:5\nmsgid \"Privacy\"\nmsgstr \"Privacy\"\n\n#: themes/default/templates/files.html.ep:13\nmsgid \"Purge expired files from localStorage\"\nmsgstr \"Purge expired files from localStorage\"\n\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:20\nmsgid \"Regards,\"\nmsgstr \"Regards,\"\n\n#: themes/default/templates/invitations/invite.mail.ep:15\nmsgid \"Regards.\"\nmsgstr \"Regards.\"\n\n#: themes/default/templates/layouts/default.html.ep:31 themes/default/templates/layouts/default.html.ep:64\nmsgid \"Report file\"\nmsgstr \"Report file\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:15\nmsgid \"Resend invitation mail\"\nmsgstr \"Resend invitation mail\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:9\nmsgid \"Rows in purple mean that the invitations have expired.\"\nmsgstr \"Rows in purple mean that the invitations have expired.\"\n\n#: themes/default/templates/files.html.ep:9\nmsgid \"Rows in red mean that the files have expired and are no longer available.\"\nmsgstr \"Rows in red mean that the files have expired and are no longer available.\"\n\n#: themes/default/templates/partial/index.js.ep:27\nmsgid \"Send all links by email\"\nmsgstr \"Send all links by email\"\n\n#: themes/default/templates/invitations/invite.html.ep:50\nmsgid \"Send the invitation\"\nmsgstr \"Send the invitation\"\n\n#: themes/default/templates/mail.html.ep:47\nmsgid \"Send with this server\"\nmsgstr \"Send with this server\"\n\n#: themes/default/templates/mail.html.ep:49\nmsgid \"Send with your own mail software\"\nmsgstr \"Send with your own mail software\"\n\n#: themes/default/templates/partial/index.js.ep:30\nmsgid \"Sending part XX1 of XX2. Please, be patient, the progress bar can take a while to move.\"\nmsgstr \"Sending part XX1 of XX2. Please, be patient, the progress bar can take a while to move.\"\n\n#. (url_for('/')\n#: themes/default/templates/partial/mail.js.ep:49\nmsgid \"Share your files in total privacy on %1\"\nmsgstr \"Share your files in total privacy on %1\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:13 themes/default/templates/partial/invitations.js.ep:9\nmsgid \"Show hidden invitations\"\nmsgstr \"Show hidden invitations\"\n\n#: themes/default/templates/partial/render.js.ep:12\nmsgid \"Show zip content\"\nmsgstr \"Show zip content\"\n\n#: themes/default/templates/layouts/default.html.ep:40 themes/default/templates/layouts/default.html.ep:73 themes/default/templates/login.html.ep:28 themes/default/templates/logout.html.ep:17\nmsgid \"Signin\"\nmsgstr \"Signin\"\n\n#: lib/Lufi/Controller/Invitation.pm:302 themes/default/templates/invitations/exception.html.ep:16\nmsgid \"Sorry, the invitation doesn’t exist. Are you sure you are on the right URL?\"\nmsgstr \"Sorry, the invitation doesn’t exist. Are you sure you are on the right URL?\"\n\n#: themes/default/templates/index.html.ep:46\nmsgid \"Sorry, the uploading is currently disabled. Please try again later.\"\nmsgstr \"Sorry, the uploading is currently disabled. Please try again later.\"\n\n#: lib/Lufi/Controller/Files.pm:82\nmsgid \"Sorry, uploading is disabled.\"\nmsgstr \"Sorry, uploading is disabled.\"\n\n#: themes/default/templates/invitations/exception.html.ep:7\nmsgid \"Sorry, your invitation has expired or has been deleted.\"\nmsgstr \"Sorry, your invitation has expired or has been deleted.\"\n\n#. ($invit->ldap_user_mail)\n#: lib/Lufi/Controller/Files.pm:123\nmsgid \"Sorry, your invitation has expired or has been deleted. Please contact %1 to have another invitation.\"\nmsgstr \"Sorry, your invitation has expired or has been deleted. Please contact %1 to have another invitation.\"\n\n#. ($invitation->ldap_user_mail)\n#: lib/Lufi/Controller/Invitation.pm:295\nmsgid \"The URLs of your files have been sent by email to %1.\"\nmsgstr \"The URLs of your files have been sent by email to %1.\"\n\n#: themes/default/templates/about.html.ep:7\nmsgid \"The administrator can only see the file's name, its size and its mimetype (what kind of file it is: video, text, etc.).\"\nmsgstr \"The administrator can only see the file's name, its size and its mimetype (what kind of file it is: video, text, etc.).\"\n\n#: lib/Lufi/Controller/Mail.pm:67\nmsgid \"The body of the mail must contain at least one URL pointing to a file hosted on this instance.\"\nmsgstr \"The body of the mail must contain at least one URL pointing to a file hosted on this instance.\"\n\n#: themes/default/templates/partial/files.js.ep:11\nmsgid \"The data has been successfully imported.\"\nmsgstr \"The data has been successfully imported.\"\n\n#: lib/Lufi/Controller/Mail.pm:87\nmsgid \"The email body can't be empty.\"\nmsgstr \"The email body can't be empty.\"\n\n#: lib/Lufi/Controller/Mail.pm:86\nmsgid \"The email subject can't be empty.\"\nmsgstr \"The email subject can't be empty.\"\n\n#. ($expire_at, $max_expire_at)\n#: lib/Lufi/Controller/Invitation.pm:52\nmsgid \"The expiration delay (%1) is not between 1 and %2 days.\"\nmsgstr \"The expiration delay (%1) is not between 1 and %2 days.\"\n\n#: lib/Lufi/Controller/Files.pm:484\nmsgid \"The file has already been deleted\"\nmsgstr \"The file has already been deleted\"\n\n#: themes/default/templates/about.html.ep:6\nmsgid \"The files uploaded on a Lufi instance are encrypted before the upload to the server: the administrator of the server can not see the file's content.\"\nmsgstr \"The files uploaded on a Lufi instance are encrypted before the upload to the server: the administrator of the server can not see the file's content.\"\n\n#. (join(', ', @bad)\n#: lib/Lufi/Controller/Mail.pm:82\nmsgid \"The following email addresses are not valid: %1\"\nmsgstr \"The following email addresses are not valid: %1\"\n\n#. ($guest_mail)\n#: lib/Lufi/Controller/Invitation.pm:49\nmsgid \"The guest email address (%1) is unvalid.\"\nmsgstr \"The guest email address (%1) is unvalid.\"\n\n#. ($i->token, $c->current_user->{username})\n#: lib/Lufi/Controller/Invitation.pm:136\nmsgid \"The invitation %1 can’t be deleted: it wasn’t created by you (%2).\"\nmsgstr \"The invitation %1 can’t be deleted: it wasn’t created by you (%2).\"\n\n#. ($i->token, $i->guest_mail)\n#: lib/Lufi/Controller/Invitation.pm:163\nmsgid \"The invitation %1 can’t be resent: %2 has already sent files.<br>Please create a new invitation.\"\nmsgstr \"The invitation %1 can’t be resent: %2 has already sent files.<br>Please create a new invitation.\"\n\n#. ($i->token, $c->current_user->{username})\n#: lib/Lufi/Controller/Invitation.pm:187\nmsgid \"The invitation %1 can’t be resent: it wasn’t created by you (%2).\"\nmsgstr \"The invitation %1 can’t be resent: it wasn’t created by you (%2).\"\n\n#. ($i->token)\n#: lib/Lufi/Controller/Invitation.pm:134\nmsgid \"The invitation %1 has been deleted.\"\nmsgstr \"The invitation %1 has been deleted.\"\n\n#. (stash('user_mail')\n#: themes/default/templates/invitations/invite.html.ep:34\nmsgid \"The invitation mail will be send from your email address (%1).\"\nmsgstr \"The invitation mail will be sent from your email address (%1).\"\n\n#: themes/default/templates/partial/index.js.ep:16\nmsgid \"The link(s) has been copied to your clipboard\"\nmsgstr \"The link(s) has been copied to your clipboard\"\n\n#. (stash('invitation')\n#: themes/default/templates/index.html.ep:30\nmsgid \"The link(s) of your file(s) will automatically be sent by mail to %1 (%2)\"\nmsgstr \"The link(s) of your file(s) will automatically be sent by mail to %1 (%2)\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:11\nmsgid \"The links of your file(s) will automatically be sent by mail to %1.\"\nmsgstr \"The link(s) of your file(s) will automatically be sent by mail to %1.\"\n\n#: lib/Lufi/Controller/Mail.pm:111\nmsgid \"The mail has been sent.\"\nmsgstr \"The mail has been sent.\"\n\n#: themes/default/templates/about.html.ep:15\nmsgid \"The original (and only for now) author is <a href=\\\"https://fiat-tux.fr\\\" class=\\\"classic\\\">Luc Didry</a>.\"\nmsgstr \"The original (and only for now) author is <a href=\\\"https://fiat-tux.fr\\\" class=\\\"classic\\\">Luc Didry</a>.\"\n\n#: lib/Lufi/Controller/Files.pm:230\nmsgid \"The server was unable to find the file record to add your file part to. Please, contact the administrator.\"\nmsgstr \"The server was unable to find the file record to add your file part to. Please, contact the administrator.\"\n\n#: lib/Lufi/Controller/Files.pm:289\nmsgid \"This file has been deactivated by the admins. Contact them to know why.\"\nmsgstr \"This file has been deactivated by the admins. Contact them to know why.\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:46 themes/default/templates/partial/invitations.js.ep:6\nmsgid \"This invitation is normally hidden\"\nmsgstr \"This invitation is normally hidden\"\n\n#. (stash('expires')\n#: themes/default/templates/invitations/invite.mail.ep:13\nmsgid \"This invitation is valid until %1.\"\nmsgstr \"This invitation is valid until %1.\"\n\n#: themes/default/templates/delays.html.ep:13\nmsgid \"This server sets limitations according to the file size. The expiration delay of your file will be the minimum between what you choose and the following limitations:\"\nmsgstr \"This server sets limitations according to the file size. The expiration delay of your file will be the minimum between what you choose and the following limitations:\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:16\nmsgid \"Toggle visibility\"\nmsgstr \"Toggle visibility\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:25\nmsgid \"URL\"\nmsgstr \"URL\"\n\n#: themes/default/templates/partial/index.js.ep:17\nmsgid \"Unable to copy the link(s) to your clipboard\"\nmsgstr \"Unable to copy the link(s) to your clipboard\"\n\n#: themes/default/templates/partial/render.js.ep:13\nmsgid \"Unable to download the file: too much unsuccessful attempts to open a websocket. Please, contact the administrator.\"\nmsgstr \"Unable to download the file: too much unsuccessful attempts to open a websocket. Please, contact the administrator.\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:433\nmsgid \"Unable to get counter for %1. The file does not exists. It will be removed from your localStorage.\"\nmsgstr \"Unable to get counter for %1. The file does not exists. It will be removed from your localStorage.\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:423\nmsgid \"Unable to get counter for %1. The token is invalid.\"\nmsgstr \"Unable to get counter for %1. The token is invalid.\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:443\nmsgid \"Unable to get counter for %1. You are not authenticated.\"\nmsgstr \"Unable to get counter for %1. You are not authenticated.\"\n\n#: themes/default/templates/layouts/default.html.ep:33 themes/default/templates/layouts/default.html.ep:66\nmsgid \"Upload files\"\nmsgstr \"Upload files\"\n\n#: themes/default/templates/index.html.ep:145\nmsgid \"Upload generated zip file\"\nmsgstr \"Upload generated zip file\"\n\n#: themes/default/templates/files.html.ep:31\nmsgid \"Uploaded at\"\nmsgstr \"Uploaded at\"\n\n#: themes/default/templates/index.html.ep:153\nmsgid \"Uploaded files\"\nmsgstr \"Uploaded files\"\n\n#: themes/default/templates/about.html.ep:20\nmsgid \"Version\"\nmsgstr \"Version\"\n\n#: themes/default/templates/partial/index.js.ep:31\nmsgid \"Websocket communication error\"\nmsgstr \"Websocket communication error\"\n\n#: themes/default/templates/about.html.ep:3\nmsgid \"What is Lufi?\"\nmsgstr \"What is Lufi?\"\n\n#: themes/default/templates/about.html.ep:14\nmsgid \"Who wrote this software?\"\nmsgstr \"Who wrote this software?\"\n\n#: themes/default/templates/partial/index.js.ep:13\nmsgid \"XXX file has been added to upload queue.\"\nmsgstr \"XXX file has been added to upload queue.\"\n\n#: themes/default/templates/invitations/invite.html.ep:30\nmsgid \"You can invite someone to send you files through this Lufi instance even if they don’t have an account on it.\"\nmsgstr \"You can invite someone to send you files through this Lufi instance even if they don’t have an account on it.\"\n\n#: themes/default/templates/about.html.ep:11\nmsgid \"You can see the list of your files by clicking on the \\\"My files\\\" link at the top right of this page.\"\nmsgstr \"You can see the list of your files by clicking on the \\\"My files\\\" link at the top right of this page.\"\n\n#. ($orig_uri)\n#: lib/Lufi/Controller/Mail.pm:43 lib/Lufi/Controller/Mail.pm:59\nmsgid \"You can't add URLs that are not related to this instance (%1).\"\nmsgstr \"You can't add URLs that are not related to this instance (%1).\"\n\n#:\nmsgid \"You can't add URLs that are not related to this instance.\"\nmsgstr \"You can't add URLs that are not related to this instance.\"\n\n#: themes/default/templates/about.html.ep:8\nmsgid \"You don't need to register yourself to upload files but be aware that, for legal reasons, your IP address will be stored when you send a file. Don't panic, this is normally the case for all sites on which you send files.\"\nmsgstr \"You don't need to register yourself to upload files but be aware that, for legal reasons, your IP address will be stored when you send a file. Don't panic, this is normally the case for all sites on which you send files.\"\n\n#: themes/default/templates/partial/render.js.ep:11\nmsgid \"You don't seem to have a key in your URL. You won't be able to decrypt the file. Download canceled.\"\nmsgstr \"You don't seem to have a key in your URL. You won't be able to decrypt the file. Download canceled.\"\n\n#: themes/default/templates/partial/render.js.ep:7\nmsgid \"You have attempted to leave this page. The download will be canceled. Are you sure?\"\nmsgstr \"You have attempted to leave this page. The download will be canceled. Are you sure?\"\n\n#: themes/default/templates/partial/index.js.ep:14\nmsgid \"You have attempted to leave this page. The upload will be canceled. Are you sure?\"\nmsgstr \"You have attempted to leave this page. The upload will be canceled. Are you sure?\"\n\n#: themes/default/templates/logout.html.ep:14\nmsgid \"You have been successfully logged out.\"\nmsgstr \"You have been successfully logged out.\"\n\n#: lib/Lufi/Controller/Mail.pm:85\nmsgid \"You must give email addresses.\"\nmsgstr \"You must give email addresses.\"\n\n#: themes/default/templates/index.html.ep:38\nmsgid \"Your browser does not have enough entropy to generate a strong encryption key. Please wait (it's better if you do things on your computer while waiting).\"\nmsgstr \"Your browser does not have enough entropy to generate a strong encryption key. Please wait (it's better if you do things on your computer while waiting).\"\n\n#. (format_bytes($json->{size})\n#: lib/Lufi/Controller/Files.pm:95\nmsgid \"Your file is too big: %1 (maximum size allowed: %2)\"\nmsgstr \"Your file is too big: %1 (maximum size allowed: %2)\"\n\n#: lib/Lufi/Controller/Files.pm:345\nmsgid \"Your password is not valid. Please refresh the page to retry.\"\nmsgstr \"Your password is not valid. Please refresh the page to retry.\"\n\n#: themes/default/templates/partial/render.js.ep:14\nmsgid \"Zip content:\"\nmsgstr \"Zip content:\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:24\nmsgid \"between %1 and %2, the file will be kept %3 day(s).\"\nmsgstr \"between %1 and %2, the file will be kept %3 day(s).\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:26\nmsgid \"between %1 and %2, the file will be kept forever.\"\nmsgstr \"between %1 and %2, the file will be kept forever.\"\n\n#: themes/default/templates/partial/mail.js.ep:42\nmsgid \"deadline: \"\nmsgstr \"deadline: \"\n\n#: themes/default/templates/partial/invitations.js.ep:5\nmsgid \"expires on XXX\"\nmsgstr \"expires on XXX\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:30\nmsgid \"for %1 and more, the file will be kept %2 day(s)\"\nmsgstr \"for %1 and more, the file will be kept %2 day(s)\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:32\nmsgid \"for %1 and more, the file will be kept forever.\"\nmsgstr \"for %1 and more, the file will be kept forever.\"\n\n#: themes/default/templates/index.html.ep:3\nmsgid \"no time limit\"\nmsgstr \"no time limit\"\n\n#: themes/default/templates/index.html.ep:124\nmsgid \"or\"\nmsgstr \"or\"\n\n#. ($e->{name}, format_bytes($e->{size})\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:12\nmsgid \"— %1 (%2), that will expire on %3\"\nmsgstr \"— %1 (%2), that will expire on %3\"\n"
  },
  {
    "path": "themes/default/lib/Lufi/I18N/es.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\\n\"\n\"PO-Revision-Date: 2022-03-04 11:01+0000\\n\"\n\"Last-Translator: Berto Te <ateira@3fpj.com>\\n\"\n\"Language-Team: Spanish <https://weblate.framasoft.org/projects/lufi/\"\n\"default-theme/es/>\\n\"\n\"Language: es\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=n != 1;\\n\"\n\"X-Generator: Weblate 4.10.1\\n\"\n\n#. ($delay)\n#. (max_delay)\n#: themes/default/templates/index.html.ep:56 themes/default/templates/index.html.ep:65 themes/default/templates/index.html.ep:66\nmsgid \"%1 days\"\nmsgstr \"%1 días\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:2\nmsgid \"%1 invites you to send him/her files\"\nmsgstr \"%1 te invita a enviarle sus archivos\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:6\nmsgid \"%1 invites you to send him/her files through Lufi.\"\nmsgstr \"%1 te invita a enviarle sus archivos a través de Lufi.\"\n\n#. (stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:4\nmsgid \"%1 sent you files\"\nmsgstr \"%1 te envió archivos\"\n\n#. (stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:8\nmsgid \"%1 used your invitation to send you files:\"\nmsgstr \"%1 usó tu invitación para enviarte archivos:\"\n\n#: lib/Lufi/Controller/Invitation.pm:159 lib/Lufi/Controller/Invitation.pm:84 themes/default/templates/invitations/my_invitations.html.ep:51 themes/default/templates/invitations/my_invitations.html.ep:52 themes/default/templates/invitations/my_invitations.html.ep:53 themes/default/templates/invitations/notification_files_sent.mail.ep:12\nmsgid \"%A %d %B %Y at %T\"\nmsgstr \"%A %d %B %Y en %T\"\n\n#: themes/default/templates/partial/index.js.ep:27\nmsgid \"(max size: XXX)\"\nmsgstr \"(tamaño máximo: XXX)\"\n\n#: themes/default/templates/index.html.ep:5\nmsgid \"1 year\"\nmsgstr \"1 año\"\n\n#: themes/default/templates/index.html.ep:4 themes/default/templates/index.html.ep:65\nmsgid \"24 hours\"\nmsgstr \"24 horas\"\n\n#: themes/default/templates/partial/mail.js.ep:40\nmsgid \":\"\nmsgstr \":\"\n\n#: themes/default/templates/render.html.ep:42\nmsgid \"Abort\"\nmsgstr \"aborto\"\n\n#: themes/default/templates/layouts/default.html.ep:53 themes/default/templates/layouts/default.html.ep:86\nmsgid \"About\"\nmsgstr \"Acerca de\"\n\n#: themes/default/templates/index.html.ep:107\nmsgid \"Add a password to file(s)\"\nmsgstr \"Agregue una contraseña a los archivos\"\n\n#: themes/default/templates/mail.html.ep:16\nmsgid \"Adding URLs not related to this Lufi instance to the mail body or subject is prohibited.\"\nmsgstr \"\"\n\"Está prohibido agregar URLs no relacionadas con esta instancia de Lufi al \"\n\"cuerpo o asunto del correo.\"\n\n#: themes/default/templates/partial/invitations.js.ep:3\nmsgid \"Are you sure you want to delete the selected invitations?\"\nmsgstr \"¿Estás seguro de que deseas eliminar las invitaciones seleccionadas?\"\n\n#: themes/default/templates/partial/invitations.js.ep:4\nmsgid \"Are you sure you want to resend the invitation mail for the selected invitations?\"\nmsgstr \"\"\n\"¿Está seguro de que desea reenviar el correo de invitación para las \"\n\"invitaciones seleccionadas?\"\n\n#: themes/default/templates/about.html.ep:17\nmsgid \"As Lufi is a free software licensed under of the terms of the <a href=\\\"https://gnu.org/licenses/agpl.html\\\" class=\\\"classic\\\">AGPLv3</a>, you can install it on you own server. Have a look on the <a href=\\\"https://framagit.org/luc/lufi/wikis/home\\\" class=\\\"classic\\\">Wiki</a> for the procedure.\"\nmsgstr \"\"\n\"Como Lufi es un software gratuito con licencia bajo los términos de la<a \"\n\"href=\\\"https://gnu.org/licenses/agpl.html\\\" class=\\\"classic\\\">AGPLv3</a>, \"\n\"puedes instalarlo en tu propio servidor. Echa un vistazo a la <a href=\\\"\"\n\"https://framagit.org/luc/lufi/wikis/home\\\" class=\\\"classic\\\">Wiki</a> para \"\n\"el procedimiento.\"\n\n#. (stash('nbslices')\n#: themes/default/templates/partial/render.js.ep:9\nmsgid \"Asking for file part XX1 of %1\"\nmsgstr \"Pidiendo archivo parte XX1 de %1\"\n\n#: themes/default/templates/about.html.ep:20\nmsgid \"Back to homepage\"\nmsgstr \"Volver a la página de inicio\"\n\n#: lib/Lufi/Controller/Mail.pm:25\nmsgid \"Bad CSRF token!\"\nmsgstr \"¡Token CSRF incorrecto!\"\n\n#: lib/Lufi/Controller/Auth.pm:27 lib/Lufi/Controller/Auth.pm:49\nmsgid \"Bad CSRF token.\"\nmsgstr \"Token CSRF incorrecto.\"\n\n#: themes/default/templates/partial/render.js.ep:5\nmsgid \"Click here to refresh the page and restart the download.\"\nmsgstr \"Haga clic aquí para actualizar la página y reiniciar la descarga.\"\n\n#: themes/default/templates/invitations/invite.mail.ep:8\nmsgid \"Click on the following URL to upload files on Lufi:\"\nmsgstr \"Haga clic en la siguiente URL para cargar archivos en Lufi:\"\n\n#: themes/default/templates/index.html.ep:126\nmsgid \"Click to open the file browser\"\nmsgstr \"Haga clic para abrir el navegador de archivos\"\n\n#: themes/default/templates/delays.html.ep:38 themes/default/templates/invitations/my_invitations.html.ep:80\nmsgid \"Close\"\nmsgstr \"Cerrar\"\n\n#: themes/default/templates/mail.html.ep:23\nmsgid \"Comma-separated email addresses\"\nmsgstr \"Direcciones de correo electrónico separadas por comas\"\n\n#: themes/default/templates/index.html.ep:140\nmsgid \"Compressing zip file…\"\nmsgstr \"Comprimiendo el archivo zip …\"\n\n#: themes/default/templates/partial/index.js.ep:15\nmsgid \"Copy all links to clipboard\"\nmsgstr \"Copie todos los enlaces al portapapeles\"\n\n#: themes/default/templates/partial/index.js.ep:18\nmsgid \"Copy to clipboard\"\nmsgstr \"Copiar al portapapeles\"\n\n#: lib/Lufi/Controller/Files.pm:507\nmsgid \"Could not delete the file. You are not authenticated.\"\nmsgstr \"No se pudo eliminar el archivo. No estás autenticado.\"\n\n#: lib/Lufi/Controller/Files.pm:489\nmsgid \"Could not find the file. Are you sure of the URL and the token?\"\nmsgstr \"No se pudo encontrar el archivo. ¿Estás seguro de la URL y el token?\"\n\n#: lib/Lufi/Controller/Files.pm:400\nmsgid \"Could not find the file. Are you sure of the URL?\"\nmsgstr \"No se pudo encontrar el archivo. ¿Estás seguro de la URL?\"\n\n#: themes/default/templates/files.html.ep:29\nmsgid \"Counter\"\nmsgstr \"contador\"\n\n#: themes/default/templates/index.html.ep:100\nmsgid \"Create a zip archive with the files before uploading?\"\nmsgstr \"¿Crear un archivo zip con los archivos antes de subirlos?\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:26\nmsgid \"Created at\"\nmsgstr \"Creado en\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:14\nmsgid \"Delete\"\nmsgstr \"Eliminar\"\n\n#: themes/default/templates/files.html.ep:30 themes/default/templates/index.html.ep:90\nmsgid \"Delete at first download?\"\nmsgstr \"¿Eliminar en la primera descarga?\"\n\n#: themes/default/templates/files.html.ep:19\nmsgid \"Delete selected files\"\nmsgstr \"Eliminar archivos seleccionados\"\n\n#: themes/default/templates/files.html.ep:33 themes/default/templates/partial/index.js.ep:19\nmsgid \"Deletion link\"\nmsgstr \"Enlace de borrado\"\n\n#: themes/default/templates/delays.html.ep:8\nmsgid \"Don't worry: if a user begins to download the file before the expiration and the download ends after the expiration, he will be able to get the file.\"\nmsgstr \"\"\n\"No se preocupe: si un usuario comienza a descargar el archivo antes del \"\n\"vencimiento y la descarga finaliza después del vencimiento, podrá obtener el \"\n\"archivo.\"\n\n#: themes/default/templates/partial/index.js.ep:21 themes/default/templates/render.html.ep:28\nmsgid \"Download\"\nmsgstr \"Descargar\"\n\n#: themes/default/templates/partial/render.js.ep:4\nmsgid \"Download aborted.\"\nmsgstr \"Descarga abortada.\"\n\n#: themes/default/templates/files.html.ep:28 themes/default/templates/partial/index.js.ep:20\nmsgid \"Download link\"\nmsgstr \"Enlace de descarga\"\n\n#: themes/default/templates/about.html.ep:10\nmsgid \"Drag and drop files in the appropriate area or use the traditional way to send files and the files will be chunked, encrypted and sent to the server. You will get two links per file: a download link, that you give to the people you want to share the file with and a deletion link, allowing you to delete the file whenever you want.\"\nmsgstr \"\"\n\"Arrastre y suelte archivos en el área apropiada o use la forma tradicional \"\n\"de enviar archivos y los archivos se fragmentarán, cifrarán y enviarán al \"\n\"servidor. Obtendrá dos enlaces por archivo: un enlace de descarga, que le da \"\n\"a las personas con las que desea compartir el archivo y un enlace de \"\n\"eliminación, que le permite eliminar el archivo cuando lo desee.\"\n\n#: themes/default/templates/index.html.ep:122\nmsgid \"Drop files here\"\nmsgstr \"Suelta archivos aquí\"\n\n#: themes/default/templates/invitations/invite.html.ep:40\nmsgid \"Email address of your guest\"\nmsgstr \"Dirección de correo electrónico de su invitado\"\n\n#: themes/default/templates/mail.html.ep:39\nmsgid \"Email body\"\nmsgstr \"Cuerpo del correo electronico\"\n\n#: themes/default/templates/mail.html.ep:31\nmsgid \"Email subject\"\nmsgstr \"Asunto del email\"\n\n#: themes/default/templates/mail.html.ep:25 themes/default/templates/mail.html.ep:27\nmsgid \"Emails\"\nmsgstr \"Correos electrónicos\"\n\n#: themes/default/templates/partial/index.js.ep:22\nmsgid \"Encrypting part XX1 of XX2\"\nmsgstr \"Cifrando parte XX1 de XX2\"\n\n#: lib/Lufi/Controller/Files.pm:289\nmsgid \"Error: the file existed but was deleted.\"\nmsgstr \"Error: el archivo existía pero fue eliminado.\"\n\n#: lib/Lufi/Controller/Files.pm:369\nmsgid \"Error: the file has not been sent entirely.\"\nmsgstr \"Error: el archivo no se ha enviado por completo.\"\n\n#: lib/Lufi/Controller/Files.pm:379\nmsgid \"Error: unable to find the file. Are you sure of your URL?\"\nmsgstr \"Error: no se puede encontrar el archivo. ¿Estás seguro de tu URL?\"\n\n#: themes/default/templates/partial/index.js.ep:23\nmsgid \"Expiration:\"\nmsgstr \"Vencimiento:\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:27\nmsgid \"Expire at\"\nmsgstr \"Caduca a las\"\n\n#: themes/default/templates/files.html.ep:32\nmsgid \"Expires at\"\nmsgstr \"Caduca a las\"\n\n#: themes/default/templates/files.html.ep:12\nmsgid \"Export localStorage data\"\nmsgstr \"Exportar datos de almacenamiento local\"\n\n#: lib/Lufi/Controller/Files.pm:471\nmsgid \"File deleted\"\nmsgstr \"Archivo eliminado\"\n\n#: themes/default/templates/files.html.ep:27\nmsgid \"File name\"\nmsgstr \"Nombre del archivo\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:61\nmsgid \"Files\"\nmsgstr \"Archivos\"\n\n#: themes/default/templates/index.html.ep:80\nmsgid \"Files deleted at first download\"\nmsgstr \"Archivos eliminados en la primera descarga\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:28\nmsgid \"Files sent at\"\nmsgstr \"Archivos enviados a\"\n\n#: themes/default/templates/partial/invitations.js.ep:8\nmsgid \"Files sent in invitation XX1 by XX2\"\nmsgstr \"Archivos enviados en la invitación XX1 por XX2\"\n\n#: themes/default/templates/partial/render.js.ep:8\nmsgid \"Get the file\"\nmsgstr \"Obtén el archivo\"\n\n#: themes/default/templates/about.html.ep:18\nmsgid \"Get the source code on <a href=\\\"https://framagit.org/luc/lufi\\\" class=\\\"classic\\\">the official repository</a> or on its <a href=\\\"https://github.com/ldidry/lufi\\\" class=\\\"classic\\\">Github mirror</a>\"\nmsgstr \"\"\n\"Obtenga el código fuente en <a href=\\\"https://framagit.org/luc/lufi\\\" class=\"\n\"\\\"classic\\\">el repositorio oficial</a>o en su<a href=\\\"https://github.com/\"\n\"ldidry/lufi\\\" class=\\\"classic\\\">Github mirror</a>\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:24\nmsgid \"Guest mail\"\nmsgstr \"Correo de invitado\"\n\n#. (ucfirst(stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:6\nmsgid \"Hello %1,\"\nmsgstr \"Hola %1\"\n\n#: themes/default/templates/invitations/invite.mail.ep:4\nmsgid \"Hello,\"\nmsgstr \"Hola,\"\n\n#: themes/default/templates/partial/mail.js.ep:35\nmsgid \"Hello,\\\\n\\\\nHere's some files I want to share with you:\\\\n\"\nmsgstr \"\"\n\"Hola,\\\\n\"\n\"\\\\n\"\n\" Aquí hay algunos archivos que quiero compartir contigo:\\\\n\"\n\n#: themes/default/templates/mail.html.ep:35\nmsgid \"Here's some files\"\nmsgstr \"Aquí hay algunos archivos\"\n\n#: themes/default/templates/partial/invitations.js.ep:7\nmsgid \"Hide hidden invitations\"\nmsgstr \"Ocultar invitaciones ocultas\"\n\n#: themes/default/templates/partial/index.js.ep:25\nmsgid \"Hit Enter, then Ctrl+C to copy all the download links\"\nmsgstr \"\"\n\"Presiona Enter, luego Ctrl + C para copiar todos los enlaces de descarga\"\n\n#: themes/default/templates/partial/index.js.ep:24\nmsgid \"Hit Enter, then Ctrl+C to copy the download link\"\nmsgstr \"Presiona Enter, luego Ctrl+C para copiar el enlace de descarga\"\n\n#: themes/default/templates/about.html.ep:9\nmsgid \"How does it work?\"\nmsgstr \"¿Como funciona?\"\n\n#: themes/default/templates/invitations/invite.html.ep:46\nmsgid \"How many days would you like the invitation to be valid?\"\nmsgstr \"¿Cuántos días desea que la invitación sea válida?\"\n\n#: themes/default/templates/about.html.ep:16\nmsgid \"How to install the software on my server?\"\nmsgstr \"¿Cómo instalar el software en mi servidor?\"\n\n#: themes/default/templates/about.html.ep:12\nmsgid \"How to report an illegal file?\"\nmsgstr \"¿Cómo denunciar un archivo ilegal?\"\n\n#: themes/default/templates/delays.html.ep:7\nmsgid \"If you choose a delay, the file will be deleted after that delay.\"\nmsgstr \"Si elige un retraso, el archivo se eliminará después de ese retraso.\"\n\n#: themes/default/templates/mail.html.ep:15\nmsgid \"If you send the mail from this server, the links will be sent to the server, which may lower your privacy protection.\"\nmsgstr \"\"\n\"Si envía el correo desde este servidor, los enlaces se enviarán al servidor, \"\n\"lo que puede reducir su protección de privacidad.\"\n\n#: themes/default/templates/files.html.ep:14\nmsgid \"Import localStorage data\"\nmsgstr \"Importar datos de almacenamiento local\"\n\n#: themes/default/templates/index.html.ep:53\nmsgid \"Important: more information on delays\"\nmsgstr \"Importante: más información sobre retrasos\"\n\n#: themes/default/templates/delays.html.ep:5\nmsgid \"Information about delays\"\nmsgstr \"Información sobre retrasos\"\n\n#: themes/default/templates/files.html.ep:18 themes/default/templates/invitations/my_invitations.html.ep:12\nmsgid \"Invert selection\"\nmsgstr \"Invertir selección\"\n\n#. ($i->guest_mail, $url)\n#: lib/Lufi/Controller/Invitation.pm:171\nmsgid \"Invitation resent to %1.<br> URL: %2\"\nmsgstr \"Invitación reenviada a %1. <br> URL: %2\"\n\n#. ($invitation->guest_mail, $url)\n#: lib/Lufi/Controller/Invitation.pm:87\nmsgid \"Invitation sent to %1.<br> URL: %2\"\nmsgstr \"Invitación enviada a%1. <br> URL:%2\"\n\n#: themes/default/templates/invitations/invite.html.ep:27 themes/default/templates/layouts/default.html.ep:36 themes/default/templates/layouts/default.html.ep:69\nmsgid \"Invite a guest\"\nmsgstr \"Invitar a alguien\"\n\n#: themes/default/templates/partial/render.js.ep:6\nmsgid \"It seems that the key in your URL is incorrect. Please, verify your URL.\"\nmsgstr \"\"\n\"Parece que la clave en su URL es incorrecta. Por favor, verifique su URL.\"\n\n#: themes/default/templates/index.html.ep:12\nmsgid \"Javascript is disabled. You won't be able to use Lufi.\"\nmsgstr \"Javascript está deshabilitado. No podrás usar Lufi.\"\n\n#: themes/default/templates/layouts/default.html.ep:44 themes/default/templates/layouts/default.html.ep:46 themes/default/templates/layouts/default.html.ep:77 themes/default/templates/layouts/default.html.ep:79\nmsgid \"Language\"\nmsgstr \"Idioma\"\n\n#: themes/default/templates/login.html.ep:15\nmsgid \"Login\"\nmsgstr \"Iniciar sesión\"\n\n#: themes/default/templates/layouts/default.html.ep:58 themes/default/templates/layouts/default.html.ep:91\nmsgid \"Logout\"\nmsgstr \"Cerrar sesión\"\n\n#: themes/default/templates/about.html.ep:4\nmsgid \"Lufi is a free (as in free speech) file hosting software.\"\nmsgstr \"\"\n\"Lufi es un software de alojamiento de archivos libre (como en la libertad de \"\n\"expresión).\"\n\n#: themes/default/templates/partial/files.js.ep:12\nmsgid \"Lufi recently changed its way to store files information.\\\\n\\\\nNo files have been found in the new localStorage location but we found files in the old one.\\\\nDo you want to import those informations?\\\\n\\\\nPlease note that this is the only time that we will ask you this.\"\nmsgstr \"\"\n\"Lufi cambió recientemente su forma de almacenar información de archivos. \\\\n\"\n\" \\\\n\"\n\"No se han encontrado archivos en la nueva ubicación de almacenamiento local, \"\n\"pero encontramos archivos en la anterior. \\\\n\"\n\" ¿Desea importar esas informaciones? \\\\n\"\n\"\\\\n\"\n\" Tenga en cuenta que esta es la solo tiempo que te preguntaremos esto.\"\n\n#: themes/default/templates/files.html.ep:34\nmsgid \"Mail\"\nmsgstr \"Correo\"\n\n#: themes/default/templates/files.html.ep:3 themes/default/templates/layouts/default.html.ep:34 themes/default/templates/layouts/default.html.ep:67\nmsgid \"My files\"\nmsgstr \"Mis archivos\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:5 themes/default/templates/layouts/default.html.ep:37 themes/default/templates/layouts/default.html.ep:70\nmsgid \"My invitations\"\nmsgstr \"Mis invitaciones\"\n\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:17\nmsgid \"NB: this list includes the list of files that have already been sent to you.\"\nmsgstr \"NB: esta lista incluye la lista de archivos que ya le han enviado.\"\n\n#: themes/default/templates/index.html.ep:115\nmsgid \"Name of the zip file\"\nmsgstr \"Nombre del archivo zip\"\n\n#. (format_bytes($json->{size})\n#: lib/Lufi/Controller/Files.pm:108\nmsgid \"No enough space available on the server for this file (size: %1).\"\nmsgstr \"\"\n\"No hay suficiente espacio disponible en el servidor para este archivo (size: \"\n\"%1).\"\n\n#: themes/default/templates/partial/files.js.ep:10 themes/default/templates/partial/index.js.ep:28\nmsgid \"No expiration delay\"\nmsgstr \"Sin retraso de vencimiento\"\n\n#: themes/default/templates/files.html.ep:8\nmsgid \"Only the files sent with this browser will be listed here. This list is stored in localStorage: if you delete your localStorage data, you'll lose this list.\"\nmsgstr \"\"\n\"Aquí solo se enumerarán los archivos enviados con este navegador. Esta lista \"\n\"se almacena en localStorage: si elimina sus datos de localStorage, perderá \"\n\"esta lista.\"\n\n#: themes/default/templates/index.html.ep:106 themes/default/templates/login.html.ep:21 themes/default/templates/render.html.ep:26\nmsgid \"Password\"\nmsgstr \"Contraseña\"\n\n#. (config('contact')\n#: themes/default/templates/about.html.ep:13\nmsgid \"Please contact the administrator: %1\"\nmsgstr \"Por favor, póngase en contacto con el administrador: %1\"\n\n#: themes/default/templates/render.html.ep:33\nmsgid \"Please wait while we are getting your file. We first need to download and decrypt all parts before you can get it.\"\nmsgstr \"\"\n\"Espere mientras recibimos su archivo. Primero necesitamos descargar y \"\n\"descifrar todas las partes antes de que pueda obtenerlo.\"\n\n#: lib/Lufi/Controller/Auth.pm:38\nmsgid \"Please, check your credentials or your right to access this service: unable to authenticate.\"\nmsgstr \"\"\n\"Por favor, verifique sus credenciales o su derecho a acceder a este servicio:\"\n\" no se puede autenticar.\"\n\n#: themes/default/templates/about.html.ep:5\nmsgid \"Privacy\"\nmsgstr \"Confidencialidad\"\n\n#: themes/default/templates/files.html.ep:13\nmsgid \"Purge expired files from localStorage\"\nmsgstr \"urgar archivos caducados de localStorage\"\n\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:20\nmsgid \"Regards,\"\nmsgstr \"Saludos,\"\n\n#: themes/default/templates/invitations/invite.mail.ep:15\nmsgid \"Regards.\"\nmsgstr \"Saludos.\"\n\n#: themes/default/templates/layouts/default.html.ep:31 themes/default/templates/layouts/default.html.ep:64\nmsgid \"Report file\"\nmsgstr \"Denunciar archivo\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:15\nmsgid \"Resend invitation mail\"\nmsgstr \"Reenviar correo de invitación\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:9\nmsgid \"Rows in purple mean that the invitations have expired.\"\nmsgstr \"Las filas en púrpura significan que las invitaciones han expirado.\"\n\n#: themes/default/templates/files.html.ep:9\nmsgid \"Rows in red mean that the files have expired and are no longer available.\"\nmsgstr \"\"\n\"Las filas en rojo significan que los archivos han caducado y ya no están \"\n\"disponibles.\"\n\n#: themes/default/templates/partial/index.js.ep:26\nmsgid \"Send all links by email\"\nmsgstr \"Enviar todos los enlaces por correo electrónico\"\n\n#: themes/default/templates/invitations/invite.html.ep:50\nmsgid \"Send the invitation\"\nmsgstr \"Enviar la invitación\"\n\n#: themes/default/templates/mail.html.ep:46\nmsgid \"Send with this server\"\nmsgstr \"Enviar con este servidor\"\n\n#: themes/default/templates/mail.html.ep:47\nmsgid \"Send with your own mail software\"\nmsgstr \"Envíe con su propio software de correo\"\n\n#: themes/default/templates/partial/index.js.ep:29\nmsgid \"Sending part XX1 of XX2. Please, be patient, the progress bar can take a while to move.\"\nmsgstr \"\"\n\"Enviando la parte XX1 de XX2. Por favor, sea paciente, la barra de progreso \"\n\"puede tardar un poco en moverse.\"\n\n#. (url_for('/')\n#: themes/default/templates/partial/mail.js.ep:48\nmsgid \"Share your files in total privacy on %1\"\nmsgstr \"Comparte tus archivos con total privacidad en %1\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:13 themes/default/templates/partial/invitations.js.ep:9\nmsgid \"Show hidden invitations\"\nmsgstr \"Mostrar invitaciones ocultas\"\n\n#: themes/default/templates/partial/render.js.ep:11\nmsgid \"Show zip content\"\nmsgstr \"Mostrar contenido zip\"\n\n#: themes/default/templates/layouts/default.html.ep:40 themes/default/templates/layouts/default.html.ep:73 themes/default/templates/login.html.ep:28 themes/default/templates/logout.html.ep:17\nmsgid \"Signin\"\nmsgstr \"Conexión\"\n\n#: lib/Lufi/Controller/Invitation.pm:283 themes/default/templates/invitations/exception.html.ep:16\nmsgid \"Sorry, the invitation doesn’t exist. Are you sure you are on the right URL?\"\nmsgstr \"\"\n\"Lo sentimos, la invitación no existe. ¿Estás seguro de que estás en la URL \"\n\"correcta?\"\n\n#: themes/default/templates/index.html.ep:46\nmsgid \"Sorry, the uploading is currently disabled. Please try again later.\"\nmsgstr \"\"\n\"Lo sentimos, la carga está actualmente deshabilitada. Por favor, inténtelo \"\n\"de nuevo más tarde.\"\n\n#: lib/Lufi/Controller/Files.pm:82\nmsgid \"Sorry, uploading is disabled.\"\nmsgstr \"Lo sentimos, la carga está deshabilitada.\"\n\n#: themes/default/templates/invitations/exception.html.ep:7\nmsgid \"Sorry, your invitation has expired or has been deleted.\"\nmsgstr \"Lo sentimos, tu invitación ha caducado o ha sido eliminada.\"\n\n#. ($invit->ldap_user_mail)\n#: lib/Lufi/Controller/Files.pm:122\nmsgid \"Sorry, your invitation has expired or has been deleted. Please contact %1 to have another invitation.\"\nmsgstr \"\"\n\"Lo sentimos, tu invitación ha caducado o ha sido eliminada. Póngase en \"\n\"contacto con% 1 para recibir otra invitación.\"\n\n#. ($invitation->ldap_user_mail)\n#: lib/Lufi/Controller/Invitation.pm:276\nmsgid \"The URLs of your files have been sent by email to %1.\"\nmsgstr \"Las URL de sus archivos se han enviado por correo electrónico a% 1.\"\n\n#: themes/default/templates/about.html.ep:7\nmsgid \"The administrator can only see the file's name, its size and its mimetype (what kind of file it is: video, text, etc.).\"\nmsgstr \"\"\n\"El administrador solo puede ver el nombre del archivo, su tamaño y su tipo \"\n\"MIME (qué tipo de archivo es: video, texto, etc.).\"\n\n#: lib/Lufi/Controller/Mail.pm:53\nmsgid \"The body of the mail must contain at least one URL pointing to a file hosted on this instance.\"\nmsgstr \"\"\n\"El cuerpo del correo debe contener al menos una URL que apunte a un archivo \"\n\"alojado en esta instancia.\"\n\n#: themes/default/templates/partial/files.js.ep:11\nmsgid \"The data has been successfully imported.\"\nmsgstr \"Los datos se han importado correctamente.\"\n\n#: lib/Lufi/Controller/Mail.pm:73\nmsgid \"The email body can't be empty.\"\nmsgstr \"El cuerpo del correo electrónico no puede estar vacío.\"\n\n#: lib/Lufi/Controller/Mail.pm:72\nmsgid \"The email subject can't be empty.\"\nmsgstr \"El asunto del correo electrónico no puede estar vacío.\"\n\n#. ($expire_at, $max_expire_at)\n#: lib/Lufi/Controller/Invitation.pm:51\nmsgid \"The expiration delay (%1) is not between 1 and %2 days.\"\nmsgstr \"El retraso de vencimiento (% 1) no está entre 1 y% 2 días.\"\n\n#: lib/Lufi/Controller/Files.pm:468\nmsgid \"The file has already been deleted\"\nmsgstr \"El archivo ya ha sido eliminado\"\n\n#: themes/default/templates/about.html.ep:6\nmsgid \"The files uploaded on a Lufi instance are encrypted before the upload to the server: the administrator of the server can not see the file's content.\"\nmsgstr \"\"\n\"Los archivos cargados en una instancia de Lufi se cifran antes de cargarlos \"\n\"en el servidor: el administrador del servidor no puede ver el contenido del \"\n\"archivo.\"\n\n#. (join(', ', @bad)\n#: lib/Lufi/Controller/Mail.pm:68\nmsgid \"The following email addresses are not valid: %1\"\nmsgstr \"Las siguientes direcciones de correo electrónico no son válidas: %1\"\n\n#. ($guest_mail)\n#: lib/Lufi/Controller/Invitation.pm:48\nmsgid \"The guest email address (%1) is unvalid.\"\nmsgstr \"La dirección de correo electrónico del invitado (%1) no es válida.\"\n\n#. ($i->token, $i->guest_mail)\n#: lib/Lufi/Controller/Invitation.pm:150\nmsgid \"The invitation %1 can’t be resent: %2 has already sent files.<br>Please create a new invitation.\"\nmsgstr \"\"\n\"La invitación %1 no se puede reenviar: %2 ya ha enviado archivos. <br> Cree \"\n\"una nueva invitación.\"\n\n#. ($i->token)\n#: lib/Lufi/Controller/Invitation.pm:130\nmsgid \"The invitation %1 has been deleted.\"\nmsgstr \"La invitación %1 ha sido eliminada.\"\n\n#. (stash('user_mail')\n#: themes/default/templates/invitations/invite.html.ep:34\nmsgid \"The invitation mail will be send from your email address (%1).\"\nmsgstr \"\"\n\"El correo de invitación se enviará desde su dirección de correo electrónico \"\n\"(%1).\"\n\n#: themes/default/templates/partial/index.js.ep:16\nmsgid \"The link(s) has been copied to your clipboard\"\nmsgstr \"Los enlaces han sido copiados a su portapapeles\"\n\n#. (stash('invitation')\n#: themes/default/templates/index.html.ep:30\nmsgid \"The link(s) of your file(s) will automatically be sent by mail to %1 (%2)\"\nmsgstr \"\"\n\"Los enlaces de sus archivos se enviarán automáticamente por correo a %1 (%2)\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:11\nmsgid \"The links of your file(s) will automatically be sent by mail to %1.\"\nmsgstr \"\"\n\"Los enlaces de sus archivos se enviarán automáticamente por correo a %1.\"\n\n#: lib/Lufi/Controller/Mail.pm:97\nmsgid \"The mail has been sent.\"\nmsgstr \"El correo ha sido enviado.\"\n\n#: themes/default/templates/about.html.ep:15\nmsgid \"The original (and only for now) author is <a href=\\\"https://fiat-tux.fr\\\" class=\\\"classic\\\">Luc Didry</a>.\"\nmsgstr \"\"\n\"El autor original (y solo por ahora) es <a href=\\\"https://fiat-tux.fr\\\" \"\n\"class=\\\"classic\\\">Luc Didry</a>.\"\n\n#: lib/Lufi/Controller/Files.pm:236\nmsgid \"The server was unable to find the file record to add your file part to. Please, contact the administrator.\"\nmsgstr \"\"\n\"El servidor no pudo encontrar el registro de archivo para agregar su parte \"\n\"de archivo. Por favor, contacte al administrador.\"\n\n#: lib/Lufi/Controller/Files.pm:295\nmsgid \"This file has been deactivated by the admins. Contact them to know why.\"\nmsgstr \"\"\n\"Este archivo ha sido desactivado por los administradores. Contáctalos para \"\n\"saber por qué.\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:46 themes/default/templates/partial/invitations.js.ep:6\nmsgid \"This invitation is normally hidden\"\nmsgstr \"Esta invitación normalmente está oculta\"\n\n#. (stash('expires')\n#: themes/default/templates/invitations/invite.mail.ep:13\nmsgid \"This invitation is valid until %1.\"\nmsgstr \"Esta invitación es válida hasta %1.\"\n\n#: themes/default/templates/delays.html.ep:10\nmsgid \"This server sets limitations according to the file size. The expiration delay of your file will be the minimum between what you choose and the following limitations:\"\nmsgstr \"\"\n\"Este servidor establece limitaciones de acuerdo con el tamaño del archivo. \"\n\"El retraso de vencimiento de su archivo será el mínimo entre lo que elija y \"\n\"las siguientes limitaciones:\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:16\nmsgid \"Toggle visibility\"\nmsgstr \"Alternar visibilidad\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:25\nmsgid \"URL\"\nmsgstr \"URL\"\n\n#: themes/default/templates/partial/index.js.ep:17\nmsgid \"Unable to copy the link(s) to your clipboard\"\nmsgstr \"No se pueden copiar los enlaces a su portapapeles\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:439\nmsgid \"Unable to get counter for %1. The file does not exists. It will be removed from your localStorage.\"\nmsgstr \"\"\n\"No se puede obtener el contador de %1. El archivo no existe. Se eliminará de \"\n\"su almacenamiento local.\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:429\nmsgid \"Unable to get counter for %1. The token is invalid.\"\nmsgstr \"No se puede obtener el contador de% 1. El token no es válido.\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:449\nmsgid \"Unable to get counter for %1. You are not authenticated.\"\nmsgstr \"No se puede obtener el contador de% 1. No estás autenticado.\"\n\n#: themes/default/templates/layouts/default.html.ep:33 themes/default/templates/layouts/default.html.ep:66\nmsgid \"Upload files\"\nmsgstr \"Subir archivos\"\n\n#: themes/default/templates/index.html.ep:145\nmsgid \"Upload generated zip file\"\nmsgstr \"Subir archivo zip generado\"\n\n#: themes/default/templates/files.html.ep:31\nmsgid \"Uploaded at\"\nmsgstr \"Subido a\"\n\n#: themes/default/templates/index.html.ep:153\nmsgid \"Uploaded files\"\nmsgstr \"Archivos subidos\"\n\n#: themes/default/templates/partial/index.js.ep:30\nmsgid \"Websocket communication error\"\nmsgstr \"Error de comunicación de Websocket\"\n\n#: themes/default/templates/about.html.ep:3\nmsgid \"What is Lufi?\"\nmsgstr \"¿Qué es lufi?\"\n\n#: themes/default/templates/about.html.ep:14\nmsgid \"Who wrote this software?\"\nmsgstr \"¿Quién escribió este software?\"\n\n#: themes/default/templates/partial/index.js.ep:13\nmsgid \"XXX file has been added to upload queue.\"\nmsgstr \"Se ha agregado el archivo XXX para cargar la cola.\"\n\n#: themes/default/templates/invitations/invite.html.ep:30\nmsgid \"You can invite someone to send you files through this Lufi instance even if they don’t have an account on it.\"\nmsgstr \"\"\n\"Puede invitar a alguien a enviarle archivos a través de esta instancia de \"\n\"Lufi incluso si no tienen una cuenta en él.\"\n\n#: themes/default/templates/about.html.ep:11\nmsgid \"You can see the list of your files by clicking on the \\\"My files\\\" link at the top right of this page.\"\nmsgstr \"\"\n\"Puede ver la lista de sus archivos haciendo clic en el enlace \\\"Mis \"\n\"archivos\\\" en la parte superior derecha de esta página.\"\n\n#: lib/Lufi/Controller/Mail.pm:42\nmsgid \"You can't add URLs that are not related to this instance.\"\nmsgstr \"No puede agregar URL que no estén relacionadas con esta instancia.\"\n\n#: themes/default/templates/about.html.ep:8\nmsgid \"You don't need to register yourself to upload files but be aware that, for legal reasons, your IP address will be stored when you send a file. Don't panic, this is normally the case for all sites on which you send files.\"\nmsgstr \"\"\n\"No necesita registrarse para cargar archivos, pero tenga en cuenta que, por \"\n\"razones legales, su dirección IP se almacenará cuando envíe un archivo. No \"\n\"entre en pánico, este suele ser el caso para todos los sitios en los que \"\n\"envía archivos.\"\n\n#: themes/default/templates/partial/render.js.ep:10\nmsgid \"You don't seem to have a key in your URL. You won't be able to decrypt the file. Download canceled.\"\nmsgstr \"\"\n\"Parece que no tienes una clave en tu URL. No podrás descifrar el archivo. \"\n\"Descarga cancelada.\"\n\n#: themes/default/templates/partial/render.js.ep:7\nmsgid \"You have attempted to leave this page. The download will be canceled. Are you sure?\"\nmsgstr \"\"\n\"Has intentado salir de esta página. La descarga será cancelada. ¿Estás \"\n\"seguro?\"\n\n#: themes/default/templates/partial/index.js.ep:14\nmsgid \"You have attempted to leave this page. The upload will be canceled. Are you sure?\"\nmsgstr \"\"\n\"Has intentado salir de esta página. La carga será cancelada. ¿Estás seguro?\"\n\n#: themes/default/templates/logout.html.ep:14\nmsgid \"You have been successfully logged out.\"\nmsgstr \"Ha sido desconectado exitosamente.\"\n\n#: lib/Lufi/Controller/Mail.pm:71\nmsgid \"You must give email addresses.\"\nmsgstr \"Debes dar direcciones de correo electrónico.\"\n\n#: themes/default/templates/index.html.ep:38\nmsgid \"Your browser does not have enough entropy to generate a strong encryption key. Please wait (it's better if you do things on your computer while waiting).\"\nmsgstr \"\"\n\"Su navegador no tiene suficiente entropía para generar una clave de cifrado \"\n\"segura. Espere (es mejor si hace cosas en su computadora mientras espera).\"\n\n#. (format_bytes($json->{size})\n#: lib/Lufi/Controller/Files.pm:95\nmsgid \"Your file is too big: %1 (maximum size allowed: %2)\"\nmsgstr \"Su archivo es demasiado grande: %1 (tamaño máximo permitido :%2)\"\n\n#: lib/Lufi/Controller/Files.pm:351\nmsgid \"Your password is not valid. Please refresh the page to retry.\"\nmsgstr \"\"\n\"Su contraseña no es valida Actualice la página para volver a intentarlo.\"\n\n#: themes/default/templates/partial/render.js.ep:12\nmsgid \"Zip content:\"\nmsgstr \"Contenido zip:\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:20\nmsgid \"between %1 and %2, the file will be kept %3 day(s).\"\nmsgstr \"entre %1 y %2, el archivo se mantendrá% 3 día (s).\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:22\nmsgid \"between %1 and %2, the file will be kept forever.\"\nmsgstr \"entre %1 y %2, el archivo se mantendrá para siempre.\"\n\n#: themes/default/templates/partial/mail.js.ep:42\nmsgid \"deadline: \"\nmsgstr \"Último plazo para descargar: \"\n\n#: themes/default/templates/partial/invitations.js.ep:5\nmsgid \"expires on XXX\"\nmsgstr \"caduca el XXX\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:26\nmsgid \"for %1 and more, the file will be kept %2 day(s)\"\nmsgstr \"para %1 y más, el archivo se mantendrá %2 día(s)\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:28\nmsgid \"for %1 and more, the file will be kept forever.\"\nmsgstr \"para %1 y más, el archivo se mantendrá para siempre.\"\n\n#: themes/default/templates/index.html.ep:3\nmsgid \"no time limit\"\nmsgstr \"Sin límite de tiempo\"\n\n#: themes/default/templates/index.html.ep:124\nmsgid \"or\"\nmsgstr \"o\"\n\n#. ($e->{name}, format_bytes($e->{size})\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:12\nmsgid \"— %1 (%2), that will expire on %3\"\nmsgstr \"— %1 (%2), que caducará en %3\"\n\n#: themes/default/templates/about.html.ep:18\nmsgid \"Get the source code on <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi\\\" class=\\\"classic\\\">the official repository</a> or on its <a href=\\\"https://github.com/ldidry/lufi\\\" class=\\\"classic\\\">Github mirror</a>\"\nmsgstr \"\"\n\"Obtenga el código fuente en <a href=\\\"https://framagit.org/fiat-tux/\"\n\"hat-softwares/lufi\\\" class=\\\"classic\\\">el repositorio oficial</a> o en su <a \"\n\"href=\\\"https://github.com/ldidry/lufi\\\" class=\\\"classic\\\">Github mirror</a>\"\n\n#: themes/default/templates/about.html.ep:17\nmsgid \"As Lufi is a free software licensed under of the terms of the <a href=\\\"https://gnu.org/licenses/agpl.html\\\" class=\\\"classic\\\">AGPLv3</a>, you can install it on you own server. Have a look on the <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi/wikis/home\\\" class=\\\"classic\\\">Wiki</a> for the procedure.\"\nmsgstr \"\"\n\"Como Lufi es un software gratuito con licencia bajo los términos de la <a \"\n\"href=\\\"https://gnu.org/licenses/agpl.html\\\" class=\\\"classic\\\">AGPLv3</a>, \"\n\"puedes instalarlo en tu propio servidor. Echa un vistazo a la <a href=\\\"\"\n\"https://framagit.org/fiat-tux/hat-softwares/lufi/wikis/home\\\" class=\\\"\"\n\"classic\\\">Wiki</a> para el procedimiento.\"\n\n#: themes/default/templates/partial/index.js.ep:24\nmsgid \"File uploaded\"\nmsgstr \"Archivo enviado\"\n\n#: themes/default/templates/partial/render.js.ep:9\nmsgid \"File downloaded\"\nmsgstr \"Archivo descargado\"\n\n#: themes/default/templates/about.html.ep:20\nmsgid \"Version\"\nmsgstr \"Versión\"\n\n#. (sprintf('<a href=\"https://framagit.org/fiat-tux/hat-softwares/lufi/-/releases/%s\" class=\"classic\">%s</a>', stash('version')\n#: themes/default/templates/about.html.ep:21\nmsgid \"Latest tag of this instance: %1\"\nmsgstr \"Última etiqueta de esta instancia: %1\"\n\n#. (sprintf('<a href=\"https://framagit.org/fiat-tux/hat-softwares/lufi/-/commit/%s\" class=\"classic\">%s</a>', stash('version')\n#: themes/default/templates/about.html.ep:22\nmsgid \"Latest commit of this instance: %1\"\nmsgstr \"Última confirmación de esta instancia: %1\"\n\n#: themes/default/templates/partial/render.js.ep:13\nmsgid \"Unable to download the file: too much unsuccessful attempts to open a websocket. Please, contact the administrator.\"\nmsgstr \"\"\n\"No se puede descargar el archivo: demasiados intentos fallidos de abrir un \"\n\"\\\"websocket\\\". Comuníquese con el administrador.\"\n\n#. ($orig_uri)\n#: lib/Lufi/Controller/Mail.pm:43 lib/Lufi/Controller/Mail.pm:59\nmsgid \"You can't add URLs that are not related to this instance (%1).\"\nmsgstr \"No puede agregar URL que no estén relacionadas con esta instancia (%1).\"\n\n#. ($i->token, $c->current_user->{username})\n#: lib/Lufi/Controller/Invitation.pm:136\nmsgid \"The invitation %1 can’t be deleted: it wasn’t created by you (%2).\"\nmsgstr \"La invitación %1 no se puede eliminar: usted no la creó (%2).\"\n\n#. ($i->token, $c->current_user->{username})\n#: lib/Lufi/Controller/Invitation.pm:187\nmsgid \"The invitation %1 can’t be resent: it wasn’t created by you (%2).\"\nmsgstr \"No se puede reenviar la invitación %1: no la creó usted (%2).\"\n"
  },
  {
    "path": "themes/default/lib/Lufi/I18N/fa.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\\n\"\n\"PO-Revision-Date: 2023-11-06 07:36+0000\\n\"\n\"Last-Translator: wimo kic <wimokic241@rdluxe.com>\\n\"\n\"Language-Team: Persian <https://weblate.framasoft.org/projects/lufi/\"\n\"default-theme/fa/>\\n\"\n\"Language: fa\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=n > 1;\\n\"\n\"X-Generator: Weblate 5.1.1\\n\"\n\n#. ($delay)\n#. (max_delay)\n#: themes/default/templates/index.html.ep:56 themes/default/templates/index.html.ep:65 themes/default/templates/index.html.ep:66\n#, fuzzy\nmsgid \"%1 days\"\nmsgstr \"%1 روز\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:2\n#, fuzzy\nmsgid \"%1 invites you to send him/her files\"\nmsgstr \"%1 از شما دعوت می‌کند که برای او فایل ارسال کنید\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:6\n#, fuzzy\nmsgid \"%1 invites you to send him/her files through Lufi.\"\nmsgstr \"%1 از شما دعوت می‌کند که برای او از طریق \\\"لوفی\\\" فایل ارسال کنید.\"\n\n#. (stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:4\n#, fuzzy\nmsgid \"%1 sent you files\"\nmsgstr \"%1 برای شما فایل ارسال کرد\"\n\n#. (stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:8\n#, fuzzy\nmsgid \"%1 used your invitation to send you files:\"\nmsgstr \"%1 از دعوت شما برای ارسال فایل استفاده کرد:\"\n\n#: lib/Lufi/Controller/Invitation.pm:172 lib/Lufi/Controller/Invitation.pm:85 themes/default/templates/invitations/my_invitations.html.ep:51 themes/default/templates/invitations/my_invitations.html.ep:52 themes/default/templates/invitations/my_invitations.html.ep:53 themes/default/templates/invitations/notification_files_sent.mail.ep:12\nmsgid \"%A %d %B %Y at %T\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/index.js.ep:28\n#, fuzzy\nmsgid \"(max size: XXX)\"\nmsgstr \"(حداکثر سایز: XXX)\"\n\n#: themes/default/templates/index.html.ep:5\n#, fuzzy\nmsgid \"1 year\"\nmsgstr \"1 سال\"\n\n#: themes/default/templates/index.html.ep:4 themes/default/templates/index.html.ep:65\n#, fuzzy\nmsgid \"24 hours\"\nmsgstr \"24 ساعت\"\n\n#: themes/default/templates/partial/mail.js.ep:40\n#, fuzzy\nmsgid \":\"\nmsgstr \":\"\n\n#: themes/default/templates/render.html.ep:42\n#, fuzzy\nmsgid \"Abort\"\nmsgstr \"لغو کردن\"\n\n#: themes/default/templates/layouts/default.html.ep:53 themes/default/templates/layouts/default.html.ep:86\n#, fuzzy\nmsgid \"About\"\nmsgstr \"درباره\"\n\n#: themes/default/templates/index.html.ep:107\n#, fuzzy\nmsgid \"Add a password to file(s)\"\nmsgstr \"افزودن رمز به فایل\"\n\n#: themes/default/templates/mail.html.ep:16\nmsgid \"Adding URLs not related to this Lufi instance to the mail body or subject is prohibited.\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/invitations.js.ep:3\n#, fuzzy\nmsgid \"Are you sure you want to delete the selected invitations?\"\nmsgstr \"آیا از حذف دعوت‌های انتخاب شده اطمینان دارید؟\"\n\n#: themes/default/templates/partial/invitations.js.ep:4\n#, fuzzy\nmsgid \"Are you sure you want to resend the invitation mail for the selected invitations?\"\nmsgstr \"\"\n\"آیا مطمئنید که می‌خواهید ایمیل دعوت را برای دعوت‌های انتخاب شده دوباره ارسال \"\n\"کنید؟\"\n\n#: themes/default/templates/about.html.ep:17\nmsgid \"As Lufi is a free software licensed under of the terms of the <a href=\\\"https://gnu.org/licenses/agpl.html\\\" class=\\\"classic\\\">AGPLv3</a>, you can install it on you own server. Have a look on the <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi/wikis/home\\\" class=\\\"classic\\\">Wiki</a> for the procedure.\"\nmsgstr \"\"\n\n#. (stash('nbslices')\n#: themes/default/templates/partial/render.js.ep:10\n#, fuzzy\nmsgid \"Asking for file part XX1 of %1\"\nmsgstr \"درخواست بخش XX1 فایل از %1\"\n\n#: themes/default/templates/about.html.ep:23\n#, fuzzy\nmsgid \"Back to homepage\"\nmsgstr \"بازگشت به صفحه اول\"\n\n#: lib/Lufi/Controller/Mail.pm:26\n#, fuzzy\nmsgid \"Bad CSRF token!\"\nmsgstr \"توکن CSRF ناقص!\"\n\n#: lib/Lufi/Controller/Auth.pm:27 lib/Lufi/Controller/Auth.pm:49\n#, fuzzy\nmsgid \"Bad CSRF token.\"\nmsgstr \"توکن CSRF ناقص.\"\n\n#: themes/default/templates/partial/render.js.ep:5\n#, fuzzy\nmsgid \"Click here to refresh the page and restart the download.\"\nmsgstr \"برای تازه‌سازی صفحه و دانلود مجدد اینجا کلیک کنید.\"\n\n#: themes/default/templates/invitations/invite.mail.ep:8\nmsgid \"Click on the following URL to upload files on Lufi:\"\nmsgstr \"\"\n\n#: themes/default/templates/index.html.ep:126\nmsgid \"Click to open the file browser\"\nmsgstr \"\"\n\n#: themes/default/templates/delays.html.ep:42 themes/default/templates/invitations/my_invitations.html.ep:80\nmsgid \"Close\"\nmsgstr \"\"\n\n#: themes/default/templates/mail.html.ep:23\nmsgid \"Comma-separated email addresses\"\nmsgstr \"\"\n\n#: themes/default/templates/index.html.ep:140\nmsgid \"Compressing zip file…\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/index.js.ep:15\nmsgid \"Copy all links to clipboard\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/index.js.ep:18\nmsgid \"Copy to clipboard\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Files.pm:501\nmsgid \"Could not delete the file. You are not authenticated.\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Files.pm:483\nmsgid \"Could not find the file. Are you sure of the URL and the token?\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Files.pm:394\nmsgid \"Could not find the file. Are you sure of the URL?\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:29\nmsgid \"Counter\"\nmsgstr \"\"\n\n#: themes/default/templates/index.html.ep:100\nmsgid \"Create a zip archive with the files before uploading?\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:26\nmsgid \"Created at\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:14\nmsgid \"Delete\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:30 themes/default/templates/index.html.ep:90\nmsgid \"Delete at first download?\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:19\nmsgid \"Delete selected files\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:33 themes/default/templates/partial/index.js.ep:19\nmsgid \"Deletion link\"\nmsgstr \"\"\n\n#: themes/default/templates/delays.html.ep:9\nmsgid \"Don't worry: if a user begins to download the file before the expiration and the download ends after the expiration, he will be able to get the file.\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/index.js.ep:21 themes/default/templates/render.html.ep:28\nmsgid \"Download\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/render.js.ep:4\nmsgid \"Download aborted.\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:28 themes/default/templates/partial/index.js.ep:20\nmsgid \"Download link\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:10\nmsgid \"Drag and drop files in the appropriate area or use the traditional way to send files and the files will be chunked, encrypted and sent to the server. You will get two links per file: a download link, that you give to the people you want to share the file with and a deletion link, allowing you to delete the file whenever you want.\"\nmsgstr \"\"\n\n#: themes/default/templates/index.html.ep:122\nmsgid \"Drop files here\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/invite.html.ep:40\nmsgid \"Email address of your guest\"\nmsgstr \"\"\n\n#: themes/default/templates/mail.html.ep:39\nmsgid \"Email body\"\nmsgstr \"\"\n\n#: themes/default/templates/mail.html.ep:31\nmsgid \"Email subject\"\nmsgstr \"\"\n\n#: themes/default/templates/mail.html.ep:25 themes/default/templates/mail.html.ep:27\nmsgid \"Emails\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/index.js.ep:22\nmsgid \"Encrypting part XX1 of XX2\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Files.pm:283\nmsgid \"Error: the file existed but was deleted.\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Files.pm:363\nmsgid \"Error: the file has not been sent entirely.\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Files.pm:373\nmsgid \"Error: unable to find the file. Are you sure of your URL?\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/index.js.ep:23\nmsgid \"Expiration:\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:27\nmsgid \"Expire at\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:32\nmsgid \"Expires at\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:12\nmsgid \"Export localStorage data\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Files.pm:465\nmsgid \"File deleted\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/render.js.ep:9\nmsgid \"File downloaded\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:27\nmsgid \"File name\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/index.js.ep:24\nmsgid \"File uploaded\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:61\nmsgid \"Files\"\nmsgstr \"\"\n\n#: themes/default/templates/index.html.ep:80\nmsgid \"Files deleted at first download\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:28\nmsgid \"Files sent at\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/invitations.js.ep:8\nmsgid \"Files sent in invitation XX1 by XX2\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/render.js.ep:8\nmsgid \"Get the file\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:18\nmsgid \"Get the source code on <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi\\\" class=\\\"classic\\\">the official repository</a> or on its <a href=\\\"https://github.com/ldidry/lufi\\\" class=\\\"classic\\\">Github mirror</a>\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:24\nmsgid \"Guest mail\"\nmsgstr \"\"\n\n#. (ucfirst(stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:6\nmsgid \"Hello %1,\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/invite.mail.ep:4\nmsgid \"Hello,\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/mail.js.ep:35\nmsgid \"Hello,\\\\n\\\\nHere's some files I want to share with you:\\\\n\"\nmsgstr \"\"\n\n#: themes/default/templates/mail.html.ep:35\nmsgid \"Here's some files\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/invitations.js.ep:7\nmsgid \"Hide hidden invitations\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/index.js.ep:26\nmsgid \"Hit Enter, then Ctrl+C to copy all the download links\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/index.js.ep:25\nmsgid \"Hit Enter, then Ctrl+C to copy the download link\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:9\nmsgid \"How does it work?\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/invite.html.ep:46\nmsgid \"How many days would you like the invitation to be valid?\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:16\nmsgid \"How to install the software on my server?\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:12\nmsgid \"How to report an illegal file?\"\nmsgstr \"\"\n\n#: themes/default/templates/delays.html.ep:8\nmsgid \"If you choose a delay, the file will be deleted after that delay.\"\nmsgstr \"\"\n\n#: themes/default/templates/mail.html.ep:15\nmsgid \"If you send the mail from this server, the links will be sent to the server, which may lower your privacy protection.\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:14\nmsgid \"Import localStorage data\"\nmsgstr \"\"\n\n#: themes/default/templates/index.html.ep:53\nmsgid \"Important: more information on delays\"\nmsgstr \"\"\n\n#: themes/default/templates/delays.html.ep:5\nmsgid \"Information about delays\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:18 themes/default/templates/invitations/my_invitations.html.ep:12\nmsgid \"Invert selection\"\nmsgstr \"\"\n\n#. ($i->guest_mail, $url)\n#: lib/Lufi/Controller/Invitation.pm:184\nmsgid \"Invitation resent to %1.<br> URL: %2\"\nmsgstr \"\"\n\n#. ($invitation->guest_mail, $url)\n#: lib/Lufi/Controller/Invitation.pm:88\nmsgid \"Invitation sent to %1.<br> URL: %2\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/invite.html.ep:27 themes/default/templates/layouts/default.html.ep:36 themes/default/templates/layouts/default.html.ep:69\nmsgid \"Invite a guest\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/render.js.ep:6\nmsgid \"It seems that the key in your URL is incorrect. Please, verify your URL.\"\nmsgstr \"\"\n\n#: themes/default/templates/index.html.ep:12\nmsgid \"Javascript is disabled. You won't be able to use Lufi.\"\nmsgstr \"\"\n\n#: themes/default/templates/layouts/default.html.ep:44 themes/default/templates/layouts/default.html.ep:46 themes/default/templates/layouts/default.html.ep:77 themes/default/templates/layouts/default.html.ep:79\nmsgid \"Language\"\nmsgstr \"\"\n\n#. (sprintf('<a href=\"https://framagit.org/fiat-tux/hat-softwares/lufi/-/commit/%s\" class=\"classic\">%s</a>', stash('version')\n#: themes/default/templates/about.html.ep:22\nmsgid \"Latest commit of this instance: %1\"\nmsgstr \"\"\n\n#. (sprintf('<a href=\"https://framagit.org/fiat-tux/hat-softwares/lufi/-/releases/%s\" class=\"classic\">%s</a>', stash('version')\n#: themes/default/templates/about.html.ep:21\nmsgid \"Latest tag of this instance: %1\"\nmsgstr \"\"\n\n#: themes/default/templates/login.html.ep:15\nmsgid \"Login\"\nmsgstr \"\"\n\n#: themes/default/templates/layouts/default.html.ep:58 themes/default/templates/layouts/default.html.ep:91\nmsgid \"Logout\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:4\nmsgid \"Lufi is a free (as in free speech) file hosting software.\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/files.js.ep:12\nmsgid \"Lufi recently changed its way to store files information.\\\\n\\\\nNo files have been found in the new localStorage location but we found files in the old one.\\\\nDo you want to import those informations?\\\\n\\\\nPlease note that this is the only time that we will ask you this.\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:34\nmsgid \"Mail\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:3 themes/default/templates/layouts/default.html.ep:34 themes/default/templates/layouts/default.html.ep:67\nmsgid \"My files\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:5 themes/default/templates/layouts/default.html.ep:37 themes/default/templates/layouts/default.html.ep:70\nmsgid \"My invitations\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:17\nmsgid \"NB: this list includes the list of files that have already been sent to you.\"\nmsgstr \"\"\n\n#: themes/default/templates/index.html.ep:115\nmsgid \"Name of the zip file\"\nmsgstr \"\"\n\n#. (format_bytes($json->{size})\n#: lib/Lufi/Controller/Files.pm:109\nmsgid \"No enough space available on the server for this file (size: %1).\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/files.js.ep:10 themes/default/templates/partial/index.js.ep:29\nmsgid \"No expiration delay\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:8\nmsgid \"Only the files sent with this browser will be listed here. This list is stored in localStorage: if you delete your localStorage data, you'll lose this list.\"\nmsgstr \"\"\n\n#: themes/default/templates/index.html.ep:106 themes/default/templates/login.html.ep:21 themes/default/templates/render.html.ep:26\nmsgid \"Password\"\nmsgstr \"\"\n\n#. (config('contact')\n#: themes/default/templates/about.html.ep:13\nmsgid \"Please contact the administrator: %1\"\nmsgstr \"\"\n\n#: themes/default/templates/render.html.ep:33\nmsgid \"Please wait while we are getting your file. We first need to download and decrypt all parts before you can get it.\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Auth.pm:38\nmsgid \"Please, check your credentials or your right to access this service: unable to authenticate.\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:5\nmsgid \"Privacy\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:13\nmsgid \"Purge expired files from localStorage\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:20\nmsgid \"Regards,\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/invite.mail.ep:15\nmsgid \"Regards.\"\nmsgstr \"\"\n\n#: themes/default/templates/layouts/default.html.ep:31 themes/default/templates/layouts/default.html.ep:64\nmsgid \"Report file\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:15\nmsgid \"Resend invitation mail\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:9\nmsgid \"Rows in purple mean that the invitations have expired.\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:9\nmsgid \"Rows in red mean that the files have expired and are no longer available.\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/index.js.ep:27\nmsgid \"Send all links by email\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/invite.html.ep:50\nmsgid \"Send the invitation\"\nmsgstr \"\"\n\n#: themes/default/templates/mail.html.ep:47\nmsgid \"Send with this server\"\nmsgstr \"\"\n\n#: themes/default/templates/mail.html.ep:49\nmsgid \"Send with your own mail software\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/index.js.ep:30\nmsgid \"Sending part XX1 of XX2. Please, be patient, the progress bar can take a while to move.\"\nmsgstr \"\"\n\n#. (url_for('/')\n#: themes/default/templates/partial/mail.js.ep:49\nmsgid \"Share your files in total privacy on %1\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:13 themes/default/templates/partial/invitations.js.ep:9\nmsgid \"Show hidden invitations\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/render.js.ep:12\nmsgid \"Show zip content\"\nmsgstr \"\"\n\n#: themes/default/templates/layouts/default.html.ep:40 themes/default/templates/layouts/default.html.ep:73 themes/default/templates/login.html.ep:28 themes/default/templates/logout.html.ep:17\nmsgid \"Signin\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Invitation.pm:302 themes/default/templates/invitations/exception.html.ep:16\nmsgid \"Sorry, the invitation doesn’t exist. Are you sure you are on the right URL?\"\nmsgstr \"\"\n\n#: themes/default/templates/index.html.ep:46\nmsgid \"Sorry, the uploading is currently disabled. Please try again later.\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Files.pm:82\nmsgid \"Sorry, uploading is disabled.\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/exception.html.ep:7\nmsgid \"Sorry, your invitation has expired or has been deleted.\"\nmsgstr \"\"\n\n#. ($invit->ldap_user_mail)\n#: lib/Lufi/Controller/Files.pm:123\nmsgid \"Sorry, your invitation has expired or has been deleted. Please contact %1 to have another invitation.\"\nmsgstr \"\"\n\n#. ($invitation->ldap_user_mail)\n#: lib/Lufi/Controller/Invitation.pm:295\nmsgid \"The URLs of your files have been sent by email to %1.\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:7\nmsgid \"The administrator can only see the file's name, its size and its mimetype (what kind of file it is: video, text, etc.).\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Mail.pm:67\nmsgid \"The body of the mail must contain at least one URL pointing to a file hosted on this instance.\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/files.js.ep:11\nmsgid \"The data has been successfully imported.\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Mail.pm:87\nmsgid \"The email body can't be empty.\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Mail.pm:86\nmsgid \"The email subject can't be empty.\"\nmsgstr \"\"\n\n#. ($expire_at, $max_expire_at)\n#: lib/Lufi/Controller/Invitation.pm:52\nmsgid \"The expiration delay (%1) is not between 1 and %2 days.\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Files.pm:462\nmsgid \"The file has already been deleted\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:6\nmsgid \"The files uploaded on a Lufi instance are encrypted before the upload to the server: the administrator of the server can not see the file's content.\"\nmsgstr \"\"\n\n#. (join(', ', @bad)\n#: lib/Lufi/Controller/Mail.pm:82\nmsgid \"The following email addresses are not valid: %1\"\nmsgstr \"\"\n\n#. ($guest_mail)\n#: lib/Lufi/Controller/Invitation.pm:49\nmsgid \"The guest email address (%1) is unvalid.\"\nmsgstr \"\"\n\n#. ($i->token, $c->current_user->{username})\n#: lib/Lufi/Controller/Invitation.pm:136\nmsgid \"The invitation %1 can’t be deleted: it wasn’t created by you (%2).\"\nmsgstr \"\"\n\n#. ($i->token, $i->guest_mail)\n#: lib/Lufi/Controller/Invitation.pm:163\nmsgid \"The invitation %1 can’t be resent: %2 has already sent files.<br>Please create a new invitation.\"\nmsgstr \"\"\n\n#. ($i->token, $c->current_user->{username})\n#: lib/Lufi/Controller/Invitation.pm:187\nmsgid \"The invitation %1 can’t be resent: it wasn’t created by you (%2).\"\nmsgstr \"\"\n\n#. ($i->token)\n#: lib/Lufi/Controller/Invitation.pm:134\nmsgid \"The invitation %1 has been deleted.\"\nmsgstr \"\"\n\n#. (stash('user_mail')\n#: themes/default/templates/invitations/invite.html.ep:34\nmsgid \"The invitation mail will be send from your email address (%1).\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/index.js.ep:16\nmsgid \"The link(s) has been copied to your clipboard\"\nmsgstr \"\"\n\n#. (stash('invitation')\n#: themes/default/templates/index.html.ep:30\nmsgid \"The link(s) of your file(s) will automatically be sent by mail to %1 (%2)\"\nmsgstr \"\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:11\nmsgid \"The links of your file(s) will automatically be sent by mail to %1.\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Mail.pm:111\nmsgid \"The mail has been sent.\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:15\nmsgid \"The original (and only for now) author is <a href=\\\"https://fiat-tux.fr\\\" class=\\\"classic\\\">Luc Didry</a>.\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Files.pm:230\nmsgid \"The server was unable to find the file record to add your file part to. Please, contact the administrator.\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Files.pm:289\nmsgid \"This file has been deactivated by the admins. Contact them to know why.\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:46 themes/default/templates/partial/invitations.js.ep:6\nmsgid \"This invitation is normally hidden\"\nmsgstr \"\"\n\n#. (stash('expires')\n#: themes/default/templates/invitations/invite.mail.ep:13\nmsgid \"This invitation is valid until %1.\"\nmsgstr \"\"\n\n#: themes/default/templates/delays.html.ep:13\nmsgid \"This server sets limitations according to the file size. The expiration delay of your file will be the minimum between what you choose and the following limitations:\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:16\nmsgid \"Toggle visibility\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:25\nmsgid \"URL\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/index.js.ep:17\nmsgid \"Unable to copy the link(s) to your clipboard\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/render.js.ep:13\nmsgid \"Unable to download the file: too much unsuccessful attempts to open a websocket. Please, contact the administrator.\"\nmsgstr \"\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:433\nmsgid \"Unable to get counter for %1. The file does not exists. It will be removed from your localStorage.\"\nmsgstr \"\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:423\nmsgid \"Unable to get counter for %1. The token is invalid.\"\nmsgstr \"\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:443\nmsgid \"Unable to get counter for %1. You are not authenticated.\"\nmsgstr \"\"\n\n#: themes/default/templates/layouts/default.html.ep:33 themes/default/templates/layouts/default.html.ep:66\nmsgid \"Upload files\"\nmsgstr \"\"\n\n#: themes/default/templates/index.html.ep:145\nmsgid \"Upload generated zip file\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:31\nmsgid \"Uploaded at\"\nmsgstr \"\"\n\n#: themes/default/templates/index.html.ep:153\nmsgid \"Uploaded files\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:20\nmsgid \"Version\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/index.js.ep:31\nmsgid \"Websocket communication error\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:3\nmsgid \"What is Lufi?\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:14\nmsgid \"Who wrote this software?\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/index.js.ep:13\nmsgid \"XXX file has been added to upload queue.\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/invite.html.ep:30\nmsgid \"You can invite someone to send you files through this Lufi instance even if they don’t have an account on it.\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:11\nmsgid \"You can see the list of your files by clicking on the \\\"My files\\\" link at the top right of this page.\"\nmsgstr \"\"\n\n#. ($orig_uri)\n#: lib/Lufi/Controller/Mail.pm:43 lib/Lufi/Controller/Mail.pm:59\nmsgid \"You can't add URLs that are not related to this instance (%1).\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:8\nmsgid \"You don't need to register yourself to upload files but be aware that, for legal reasons, your IP address will be stored when you send a file. Don't panic, this is normally the case for all sites on which you send files.\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/render.js.ep:11\nmsgid \"You don't seem to have a key in your URL. You won't be able to decrypt the file. Download canceled.\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/render.js.ep:7\nmsgid \"You have attempted to leave this page. The download will be canceled. Are you sure?\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/index.js.ep:14\nmsgid \"You have attempted to leave this page. The upload will be canceled. Are you sure?\"\nmsgstr \"\"\n\n#: themes/default/templates/logout.html.ep:14\nmsgid \"You have been successfully logged out.\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Mail.pm:85\nmsgid \"You must give email addresses.\"\nmsgstr \"\"\n\n#: themes/default/templates/index.html.ep:38\nmsgid \"Your browser does not have enough entropy to generate a strong encryption key. Please wait (it's better if you do things on your computer while waiting).\"\nmsgstr \"\"\n\n#. (format_bytes($json->{size})\n#: lib/Lufi/Controller/Files.pm:95\nmsgid \"Your file is too big: %1 (maximum size allowed: %2)\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Files.pm:345\nmsgid \"Your password is not valid. Please refresh the page to retry.\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/render.js.ep:14\nmsgid \"Zip content:\"\nmsgstr \"\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:24\nmsgid \"between %1 and %2, the file will be kept %3 day(s).\"\nmsgstr \"\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:26\nmsgid \"between %1 and %2, the file will be kept forever.\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/mail.js.ep:42\nmsgid \"deadline: \"\nmsgstr \"\"\n\n#: themes/default/templates/partial/invitations.js.ep:5\nmsgid \"expires on XXX\"\nmsgstr \"\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:30\nmsgid \"for %1 and more, the file will be kept %2 day(s)\"\nmsgstr \"\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:32\nmsgid \"for %1 and more, the file will be kept forever.\"\nmsgstr \"\"\n\n#: themes/default/templates/index.html.ep:3\nmsgid \"no time limit\"\nmsgstr \"\"\n\n#: themes/default/templates/index.html.ep:124\nmsgid \"or\"\nmsgstr \"\"\n\n#. ($e->{name}, format_bytes($e->{size})\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:12\nmsgid \"— %1 (%2), that will expire on %3\"\nmsgstr \"\"\n"
  },
  {
    "path": "themes/default/lib/Lufi/I18N/fr.po",
    "content": "# Lufi FR translation\n# Copyright (C) 2015 Luc Didry\n# This file is distributed under the same license as the Lufi package.\n# Luc Didry <luc@didry.org>, 2015.\n# Luc Didry <luc@framasoft.org>, 2018. #zanata\n# Luc Didry <luc@framasoft.org>, 2019. #zanata\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\\n\"\n\"PO-Revision-Date: 2022-01-03 21:23+0000\\n\"\n\"Last-Translator: Jorge Paulo Malveira Pimentel Dos Santos <jpmpds@yahoo.fr>\\n\"\n\"Language-Team: French <https://weblate.framasoft.org/projects/lufi/\"\n\"default-theme/fr/>\\n\"\n\"Language: fr\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=n > 1;\\n\"\n\"X-Generator: Weblate 4.10\\n\"\n\n#. ($delay)\n#. (max_delay)\n#: themes/default/templates/index.html.ep:56 themes/default/templates/index.html.ep:65 themes/default/templates/index.html.ep:66\nmsgid \"%1 days\"\nmsgstr \"%1 jours\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:2\nmsgid \"%1 invites you to send him/her files\"\nmsgstr \"%1 vous invite à lui envoyer des fichiers\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:6\nmsgid \"%1 invites you to send him/her files through Lufi.\"\nmsgstr \"%1 vous invite à lui envoyer des fichiers via Lufi.\"\n\n#. (stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:4\nmsgid \"%1 sent you files\"\nmsgstr \"%1 vous a envoyé des fichiers\"\n\n#. (stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:8\nmsgid \"%1 used your invitation to send you files:\"\nmsgstr \"%1 a utilisé votre invitation pour vous envoyer des fichiers :\"\n\n#: lib/Lufi/Controller/Invitation.pm:172 lib/Lufi/Controller/Invitation.pm:85 themes/default/templates/invitations/my_invitations.html.ep:51 themes/default/templates/invitations/my_invitations.html.ep:52 themes/default/templates/invitations/my_invitations.html.ep:53 themes/default/templates/invitations/notification_files_sent.mail.ep:12\nmsgid \"%A %d %B %Y at %T\"\nmsgstr \"%A %d %B %Y à %T\"\n\n#: themes/default/templates/partial/index.js.ep:28\nmsgid \"(max size: XXX)\"\nmsgstr \"(taille max : XXX)\"\n\n#: themes/default/templates/index.html.ep:5\nmsgid \"1 year\"\nmsgstr \"1 an\"\n\n#: themes/default/templates/index.html.ep:4 themes/default/templates/index.html.ep:65\nmsgid \"24 hours\"\nmsgstr \"24 heures\"\n\n#: themes/default/templates/partial/mail.js.ep:40\nmsgid \":\"\nmsgstr \" :\"\n\n#: themes/default/templates/render.html.ep:42\nmsgid \"Abort\"\nmsgstr \"Abandonner\"\n\n#: themes/default/templates/layouts/default.html.ep:53 themes/default/templates/layouts/default.html.ep:86\nmsgid \"About\"\nmsgstr \"À propos\"\n\n#: themes/default/templates/index.html.ep:107\nmsgid \"Add a password to file(s)\"\nmsgstr \"Ajouter un mot de passe au(x) fichier(s)\"\n\n#: themes/default/templates/mail.html.ep:16\nmsgid \"Adding URLs not related to this Lufi instance to the mail body or subject is prohibited.\"\nmsgstr \"L’ajout d’URL non liées à cette instance Lufi au corps ou au sujet du mail est interdit.\"\n\n#: themes/default/templates/delete_file.html.ep:18\nmsgid \"Are you sure you want to delete that file?\"\nmsgstr \"Voulez-vous vraiment supprimer ce fichier ?\"\n\n#: themes/default/templates/partial/invitations.js.ep:3\nmsgid \"Are you sure you want to delete the selected invitations?\"\nmsgstr \"Êtes-vous sûr·e de vouloir supprimer les invitations sélectionnées ?\"\n\n#: themes/default/templates/partial/invitations.js.ep:4\nmsgid \"Are you sure you want to resend the invitation mail for the selected invitations?\"\nmsgstr \"Êtes-vous sûr·e de vouloir renvoyer le courriel d’invitation pour les invitations sélectionnées ?\"\n\n#: themes/default/templates/about.html.ep:17\nmsgid \"As Lufi is a free software licensed under of the terms of the <a href=\\\"https://gnu.org/licenses/agpl.html\\\" class=\\\"classic\\\">AGPLv3</a>, you can install it on you own server. Have a look on the <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi/wikis/home\\\" class=\\\"classic\\\">Wiki</a> for the procedure.\"\nmsgstr \"Comme Lufi est un logiciel libre soumis aux termes de la licence <a href=\\\"https://gnu.org/licenses/agpl.html\\\" class=\\\"classic\\\">AGPLv3</a>, vous pouvez l’installer sur votre propre serveur. Veuillez consulter le <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi/wikis/home\\\" class=\\\"classic\\\">Wiki</a> pour voir la procédure.\"\n\n#:\nmsgid \"As Lufi is a free software licensed under of the terms of the <a href=\\\"https://gnu.org/licenses/agpl.html\\\" class=\\\"classic\\\">AGPLv3</a>, you can install it on you own server. Have a look on the <a href=\\\"https://framagit.org/luc/lufi/wikis/home\\\" class=\\\"classic\\\">Wiki</a> for the procedure.\"\nmsgstr \"Comme Lufi est un logiciel libre soumis aux termes de la licence <a href=\\\"https://gnu.org/licenses/agpl.html\\\" class=\\\"classic\\\">AGPLv3</a>, vous pouvez l’installer sur votre propre serveur. Veuillez consulter le <a href=\\\"https://framagit.org/luc/lufi/wikis/home\\\" class=\\\"classic\\\">Wiki</a> pour voir la procédure.\"\n\n#. (stash('nbslices')\n#: themes/default/templates/partial/render.js.ep:10\nmsgid \"Asking for file part XX1 of %1\"\nmsgstr \"Demande de récupération du fragment de fichier XX1 sur %1\"\n\n#: themes/default/templates/about.html.ep:23\nmsgid \"Back to homepage\"\nmsgstr \"Retour à la page d’accueil\"\n\n#: lib/Lufi/Controller/Mail.pm:26\nmsgid \"Bad CSRF token!\"\nmsgstr \"Mauvais jeton CSRF !\"\n\n#: lib/Lufi/Controller/Auth.pm:27 lib/Lufi/Controller/Auth.pm:49\nmsgid \"Bad CSRF token.\"\nmsgstr \"Jeton CSRF invalide.\"\n\n#: themes/default/templates/partial/render.js.ep:5\nmsgid \"Click here to refresh the page and restart the download.\"\nmsgstr \"Cliquez ici pour rafraîchir la page et redémarrer le téléchargement.\"\n\n#: themes/default/templates/invitations/invite.mail.ep:8\nmsgid \"Click on the following URL to upload files on Lufi:\"\nmsgstr \"Cliquez sur l’URL suivante pour envoyer des fichiers sur Lufi :\"\n\n#: themes/default/templates/index.html.ep:126\nmsgid \"Click to open the file browser\"\nmsgstr \"Cliquez pour ouvrir le navigateur de fichiers\"\n\n#: themes/default/templates/delays.html.ep:42 themes/default/templates/invitations/my_invitations.html.ep:80\nmsgid \"Close\"\nmsgstr \"Fermer\"\n\n#: themes/default/templates/mail.html.ep:23\nmsgid \"Comma-separated email addresses\"\nmsgstr \"Adresses mail séparées par des virgules\"\n\n#: themes/default/templates/index.html.ep:140\nmsgid \"Compressing zip file…\"\nmsgstr \"Compression du fichier zip…\"\n\n#: themes/default/templates/partial/index.js.ep:15\nmsgid \"Copy all links to clipboard\"\nmsgstr \"Copier tous les liens dans le presse-papiers\"\n\n#: themes/default/templates/partial/index.js.ep:18\nmsgid \"Copy to clipboard\"\nmsgstr \"Copier dans le presse-papiers\"\n\n#: lib/Lufi/Controller/Files.pm:501\nmsgid \"Could not delete the file. You are not authenticated.\"\nmsgstr \"Impossible de supprimer le fichier. Vous n’êtes pas connecté·e.\"\n\n#: lib/Lufi/Controller/Files.pm:483\nmsgid \"Could not find the file. Are you sure of the URL and the token?\"\nmsgstr \"Impossible de retrouver le fichier. Êtes-vous sûr⋅e que l’URL et le jeton sont les bons ?\"\n\n#: lib/Lufi/Controller/Files.pm:394\nmsgid \"Could not find the file. Are you sure of the URL?\"\nmsgstr \"Impossible de retrouver le fichier. Êtes-vous sûr⋅e que l’URL est la bonne ?\"\n\n#: themes/default/templates/files.html.ep:29\nmsgid \"Counter\"\nmsgstr \"Compteur\"\n\n#: themes/default/templates/index.html.ep:100\nmsgid \"Create a zip archive with the files before uploading?\"\nmsgstr \"Créer une archive zip avec les fichiers avant l’envoi ?\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:26\nmsgid \"Created at\"\nmsgstr \"Créée le\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:14\nmsgid \"Delete\"\nmsgstr \"Supprimer\"\n\n#: themes/default/templates/files.html.ep:30 themes/default/templates/index.html.ep:90\nmsgid \"Delete at first download?\"\nmsgstr \"Supprimer après le premier téléchargement ?\"\n\n#: themes/default/templates/files.html.ep:19\nmsgid \"Delete selected files\"\nmsgstr \"Supprimer les fichiers sélectionnés\"\n\n#: themes/default/templates/files.html.ep:33 themes/default/templates/partial/index.js.ep:19\nmsgid \"Deletion link\"\nmsgstr \"Lien de suppression\"\n\n#: themes/default/templates/delays.html.ep:9\nmsgid \"Don't worry: if a user begins to download the file before the expiration and the download ends after the expiration, he will be able to get the file.\"\nmsgstr \"Ne vous inquiétez pas : si un utilisateur commence à télécharger le fichier avant son expiration et que le téléchargement se termine après l’expiration, l’utilisateur pourra quand même récupérer le fichier.\"\n\n#: themes/default/templates/partial/index.js.ep:21 themes/default/templates/render.html.ep:28\nmsgid \"Download\"\nmsgstr \"Télécharger\"\n\n#: themes/default/templates/partial/render.js.ep:4\nmsgid \"Download aborted.\"\nmsgstr \"Téléchargement abandonné.\"\n\n#: themes/default/templates/files.html.ep:28 themes/default/templates/partial/index.js.ep:20\nmsgid \"Download link\"\nmsgstr \"Lien de téléchargement\"\n\n#: themes/default/templates/about.html.ep:10\nmsgid \"Drag and drop files in the appropriate area or use the traditional way to send files and the files will be chunked, encrypted and sent to the server. You will get two links per file: a download link, that you give to the people you want to share the file with and a deletion link, allowing you to delete the file whenever you want.\"\nmsgstr \"Faites glisser des fichiers dans la zone prévue à cet effet ou sélectionnez un fichier de façon classique et les fichiers seront découpés en fragments, chiffrés et envoyés au serveur. Vous récupérerez deux liens par fichier : un lien de téléchargement et un lien pour supprimer le fichier quand vous le souhaitez.\"\n\n#: themes/default/templates/index.html.ep:122\nmsgid \"Drop files here\"\nmsgstr \"Glissez vos fichiers ici\"\n\n#: themes/default/templates/invitations/invite.html.ep:40\nmsgid \"Email address of your guest\"\nmsgstr \"Adresse de courriel de votre invité·e\"\n\n#: themes/default/templates/mail.html.ep:39\nmsgid \"Email body\"\nmsgstr \"Corps du mail\"\n\n#: themes/default/templates/mail.html.ep:31\nmsgid \"Email subject\"\nmsgstr \"Sujet du mail\"\n\n#: themes/default/templates/mail.html.ep:25 themes/default/templates/mail.html.ep:27\nmsgid \"Emails\"\nmsgstr \"Mails\"\n\n#: themes/default/templates/partial/index.js.ep:22\nmsgid \"Encrypting part XX1 of XX2\"\nmsgstr \"Chiffrement du fragment XX1 sur XX2\"\n\n#: lib/Lufi/Controller/Files.pm:283\nmsgid \"Error: the file existed but was deleted.\"\nmsgstr \"Erreur : le fichier existait mais a été supprimé.\"\n\n#: lib/Lufi/Controller/Files.pm:363\nmsgid \"Error: the file has not been sent entirely.\"\nmsgstr \"Erreur : le fichier n’a pas été envoyé dans son intégralité.\"\n\n#: lib/Lufi/Controller/Files.pm:373\nmsgid \"Error: unable to find the file. Are you sure of your URL?\"\nmsgstr \"Erreur : impossible de retrouver le fichier. Êtes-vous sûr⋅e de l’URL ?\"\n\n#: themes/default/templates/partial/index.js.ep:23\nmsgid \"Expiration:\"\nmsgstr \"Expiration :\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:27\nmsgid \"Expire at\"\nmsgstr \"Expire le\"\n\n#: themes/default/templates/files.html.ep:32\nmsgid \"Expires at\"\nmsgstr \"Expire le\"\n\n#: themes/default/templates/files.html.ep:12\nmsgid \"Export localStorage data\"\nmsgstr \"Exporter les données localStorage\"\n\n#: lib/Lufi/Controller/Files.pm:465\nmsgid \"File deleted\"\nmsgstr \"Fichier supprimé\"\n\n#: themes/default/templates/partial/render.js.ep:9\nmsgid \"File downloaded\"\nmsgstr \"Fichier téléchargé\"\n\n#: themes/default/templates/files.html.ep:27\nmsgid \"File name\"\nmsgstr \"Nom du fichier\"\n\n#: themes/default/templates/partial/index.js.ep:24\nmsgid \"File uploaded\"\nmsgstr \"Fichier envoyé\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:61\nmsgid \"Files\"\nmsgstr \"Fichiers\"\n\n#: themes/default/templates/index.html.ep:80\nmsgid \"Files deleted at first download\"\nmsgstr \"Fichiers supprimés au premier téléchargement\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:28\nmsgid \"Files sent at\"\nmsgstr \"Fichiers envoyés le\"\n\n#: themes/default/templates/partial/invitations.js.ep:8\nmsgid \"Files sent in invitation XX1 by XX2\"\nmsgstr \"Fichiers envoyés via l’invitation XX1 par XX2\"\n\n#: themes/default/templates/partial/render.js.ep:8\nmsgid \"Get the file\"\nmsgstr \"Récupérer le fichier\"\n\n#: themes/default/templates/about.html.ep:18\nmsgid \"Get the source code on <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi\\\" class=\\\"classic\\\">the official repository</a> or on its <a href=\\\"https://github.com/ldidry/lufi\\\" class=\\\"classic\\\">Github mirror</a>\"\nmsgstr \"Récupérez le code source sur <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi\\\" class=\\\"classic\\\">le dépôt officiel</a> ou sur son <a href=\\\"https://github.com/ldidry/lufi\\\" class=\\\"classic\\\">miroir Github</a>\"\n\n#:\nmsgid \"Get the source code on <a href=\\\"https://framagit.org/luc/lufi\\\" class=\\\"classic\\\">the official repository</a> or on its <a href=\\\"https://github.com/ldidry/lufi\\\" class=\\\"classic\\\">Github mirror</a>\"\nmsgstr \"Récupérez le code source sur <a href=\\\"https://framagit.org/luc/lufi\\\" class=\\\"classic\\\">le dépôt officiel</a> ou sur son <a href=\\\"https://github.com/ldidry/lufi\\\" class=\\\"classic\\\">miroir Github</a>\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:24\nmsgid \"Guest mail\"\nmsgstr \"Courriel de l’invité·e\"\n\n#. (ucfirst(stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:6\nmsgid \"Hello %1,\"\nmsgstr \"Bonjour %1,\"\n\n#: themes/default/templates/invitations/invite.mail.ep:4\nmsgid \"Hello,\"\nmsgstr \"Bonjour,\"\n\n#: themes/default/templates/partial/mail.js.ep:35\nmsgid \"Hello,\\\\n\\\\nHere's some files I want to share with you:\\\\n\"\nmsgstr \"Bonjour,\\\\n\\\\nVoici quelques fichiers que je souhaite partager avec vous :\\\\n\"\n\n#: themes/default/templates/mail.html.ep:35\nmsgid \"Here's some files\"\nmsgstr \"Voici quelques fichiers\"\n\n#: themes/default/templates/partial/invitations.js.ep:7\nmsgid \"Hide hidden invitations\"\nmsgstr \"Ne pas afficher les invitations cachées\"\n\n#: themes/default/templates/partial/index.js.ep:26\nmsgid \"Hit Enter, then Ctrl+C to copy all the download links\"\nmsgstr \"Appuyez sur la touche Entrée puis faites Ctrl+C pour copier tous les liens de téléchargement\"\n\n#: themes/default/templates/partial/index.js.ep:25\nmsgid \"Hit Enter, then Ctrl+C to copy the download link\"\nmsgstr \"Appuyez sur la touche Entrée puis faites Ctrl+C pour copier le lien de téléchargement\"\n\n#: themes/default/templates/about.html.ep:9\nmsgid \"How does it work?\"\nmsgstr \"Comment ça marche ?\"\n\n#: themes/default/templates/invitations/invite.html.ep:46\nmsgid \"How many days would you like the invitation to be valid?\"\nmsgstr \"Pendant combien de jours souhaitez-vous que votre invitation soit valide ?\"\n\n#: themes/default/templates/about.html.ep:16\nmsgid \"How to install the software on my server?\"\nmsgstr \"Comment installer le logiciel sur mon serveur ?\"\n\n#: themes/default/templates/about.html.ep:12\nmsgid \"How to report an illegal file?\"\nmsgstr \"Comment signaler un fichier illégal ?\"\n\n#: themes/default/templates/delays.html.ep:8\nmsgid \"If you choose a delay, the file will be deleted after that delay.\"\nmsgstr \"Si vous choisissez un délai, le fichier sera supprimé après ce délai.\"\n\n#: themes/default/templates/mail.html.ep:15\nmsgid \"If you send the mail from this server, the links will be sent to the server, which may lower your privacy protection.\"\nmsgstr \"Si vous envoyez le mail depuis ce serveur, les liens seront envoyés au serveur, ce qui peut diminuer la protection de la confidentialité.\"\n\n#: themes/default/templates/files.html.ep:14\nmsgid \"Import localStorage data\"\nmsgstr \"Importer des données localStorage\"\n\n#: themes/default/templates/index.html.ep:53\nmsgid \"Important: more information on delays\"\nmsgstr \"Important : plus d’informations sur les délais\"\n\n#: themes/default/templates/delays.html.ep:5\nmsgid \"Information about delays\"\nmsgstr \"Information sur les délais\"\n\n#: themes/default/templates/files.html.ep:18 themes/default/templates/invitations/my_invitations.html.ep:12\nmsgid \"Invert selection\"\nmsgstr \"Inverser la sélection\"\n\n#. ($i->guest_mail, $url)\n#: lib/Lufi/Controller/Invitation.pm:184\nmsgid \"Invitation resent to %1.<br> URL: %2\"\nmsgstr \"Invitation renvoyée à %1 :<br> URL : %2\"\n\n#. ($invitation->guest_mail, $url)\n#: lib/Lufi/Controller/Invitation.pm:88\nmsgid \"Invitation sent to %1.<br> URL: %2\"\nmsgstr \"Invitation envoyée à %1 :<br> URL : %2\"\n\n#: themes/default/templates/invitations/invite.html.ep:27 themes/default/templates/layouts/default.html.ep:36 themes/default/templates/layouts/default.html.ep:69\nmsgid \"Invite a guest\"\nmsgstr \"Inviter quelqu’un\"\n\n#: themes/default/templates/partial/render.js.ep:6\nmsgid \"It seems that the key in your URL is incorrect. Please, verify your URL.\"\nmsgstr \"Il semble que la clé dans votre URL soit incorrecte. Veuillez vérifier votre URL.\"\n\n#: themes/default/templates/index.html.ep:12\nmsgid \"Javascript is disabled. You won't be able to use Lufi.\"\nmsgstr \"Javascript est désactivé. Lufi ne fonctionnera pas.\"\n\n#: themes/default/templates/layouts/default.html.ep:44 themes/default/templates/layouts/default.html.ep:46 themes/default/templates/layouts/default.html.ep:77 themes/default/templates/layouts/default.html.ep:79\nmsgid \"Language\"\nmsgstr \"Langue\"\n\n#. (sprintf('<a href=\"https://framagit.org/fiat-tux/hat-softwares/lufi/-/commit/%s\" class=\"classic\">%s</a>', stash('version')\n#: themes/default/templates/about.html.ep:22\nmsgid \"Latest commit of this instance: %1\"\nmsgstr \"Dernier commit de cette instance : %1\"\n\n#. (sprintf('<a href=\"https://framagit.org/fiat-tux/hat-softwares/lufi/-/releases/%s\" class=\"classic\">%s</a>', stash('version')\n#: themes/default/templates/about.html.ep:21\nmsgid \"Latest tag of this instance: %1\"\nmsgstr \"Dernière étiquette de cette instance : %1\"\n\n#: themes/default/templates/login.html.ep:15\nmsgid \"Login\"\nmsgstr \"Identifiant\"\n\n#: themes/default/templates/layouts/default.html.ep:58 themes/default/templates/layouts/default.html.ep:91\nmsgid \"Logout\"\nmsgstr \"Déconnexion\"\n\n#: themes/default/templates/about.html.ep:4\nmsgid \"Lufi is a free (as in free speech) file hosting software.\"\nmsgstr \"Lufi est un logiciel libre d’hébergement de fichiers.\"\n\n#: themes/default/templates/partial/files.js.ep:12\nmsgid \"Lufi recently changed its way to store files information.\\\\n\\\\nNo files have been found in the new localStorage location but we found files in the old one.\\\\nDo you want to import those informations?\\\\n\\\\nPlease note that this is the only time that we will ask you this.\"\nmsgstr \"Lufi a récemment changé sa façon de stocker l’information des fichiers.\\\\n\\\\nAucun fichier n’a été trouvé dans le nouvel emplacement localStorage mais nous avons trouvé des fichiers dans l’ancien.\\\\nVoulez-vous importer ces informations ?\\\\n\\\\nVeuillez noter que c’est la seule fois que nous vous poserons cette question.\"\n\n#: themes/default/templates/files.html.ep:34\nmsgid \"Mail\"\nmsgstr \"Mail\"\n\n#: themes/default/templates/files.html.ep:3 themes/default/templates/layouts/default.html.ep:34 themes/default/templates/layouts/default.html.ep:67\nmsgid \"My files\"\nmsgstr \"Mes fichiers\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:5 themes/default/templates/layouts/default.html.ep:37 themes/default/templates/layouts/default.html.ep:70\nmsgid \"My invitations\"\nmsgstr \"Mes invitations\"\n\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:17\nmsgid \"NB: this list includes the list of files that have already been sent to you.\"\nmsgstr \"NB : cette liste inclut la liste des fichiers qui vous a déjà été envoyée.\"\n\n#: themes/default/templates/index.html.ep:115\nmsgid \"Name of the zip file\"\nmsgstr \"Nom du fichier zip\"\n\n#. (format_bytes($json->{size})\n#: lib/Lufi/Controller/Files.pm:109\nmsgid \"No enough space available on the server for this file (size: %1).\"\nmsgstr \"Espace disque insuffisant sur le serveur pour ce fichier (taille du fichier : %1).\"\n\n#: themes/default/templates/partial/files.js.ep:10 themes/default/templates/partial/index.js.ep:29\nmsgid \"No expiration delay\"\nmsgstr \"Pas de délai d’expiration\"\n\n#: themes/default/templates/files.html.ep:8\nmsgid \"Only the files sent with this browser will be listed here. This list is stored in localStorage: if you delete your localStorage data, you'll lose this list.\"\nmsgstr \"Seuls les fichiers envoyés avec ce navigateur web sont listés ici. Les informations sont stockées en localStorage : si vous supprimez vos données localStorage, vous perdrez ces informations.\"\n\n#: themes/default/templates/index.html.ep:106 themes/default/templates/login.html.ep:21 themes/default/templates/render.html.ep:26\nmsgid \"Password\"\nmsgstr \"Mot de passe\"\n\n#. (config('contact')\n#: themes/default/templates/about.html.ep:13\nmsgid \"Please contact the administrator: %1\"\nmsgstr \"Veuillez contacter l’administrateur : %1\"\n\n#: themes/default/templates/render.html.ep:33\nmsgid \"Please wait while we are getting your file. We first need to download and decrypt all parts before you can get it.\"\nmsgstr \"Veuillez patientez pendant la récupération de votre fichier. Nous devons d’abord récupérer et déchiffrer tous les fragments avant que vous puissiez le télécharger.\"\n\n#: lib/Lufi/Controller/Auth.pm:38\nmsgid \"Please, check your credentials or your right to access this service: unable to authenticate.\"\nmsgstr \"Veuillez vérifier vos identifiants ou votre droit d’accès à ce service : impossible de vous authentifier.\"\n\n#: themes/default/templates/about.html.ep:5\nmsgid \"Privacy\"\nmsgstr \"Confidentialité\"\n\n#: themes/default/templates/files.html.ep:13\nmsgid \"Purge expired files from localStorage\"\nmsgstr \"Supprimer du localStorage les fichiers expirés\"\n\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:20\nmsgid \"Regards,\"\nmsgstr \"Cordialement,\"\n\n#: themes/default/templates/invitations/invite.mail.ep:15\nmsgid \"Regards.\"\nmsgstr \"Cordialement.\"\n\n#: themes/default/templates/layouts/default.html.ep:31 themes/default/templates/layouts/default.html.ep:64\nmsgid \"Report file\"\nmsgstr \"Signaler un fichier\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:15\nmsgid \"Resend invitation mail\"\nmsgstr \"Renvoyer le courriel d’invitation\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:9\nmsgid \"Rows in purple mean that the invitations have expired.\"\nmsgstr \"Les lignes en violet indiquent que les invitations ont expiré.\"\n\n#: themes/default/templates/files.html.ep:9\nmsgid \"Rows in red mean that the files have expired and are no longer available.\"\nmsgstr \"Les lignes en rouge indiquent que le fichier a expiré et n’est plus disponible.\"\n\n#: themes/default/templates/partial/index.js.ep:27\nmsgid \"Send all links by email\"\nmsgstr \"Envoyer tous les liens par mail\"\n\n#: themes/default/templates/invitations/invite.html.ep:50\nmsgid \"Send the invitation\"\nmsgstr \"Envoyer l’invitation\"\n\n#: themes/default/templates/mail.html.ep:47\nmsgid \"Send with this server\"\nmsgstr \"Envoyer avec ce serveur\"\n\n#: themes/default/templates/mail.html.ep:49\nmsgid \"Send with your own mail software\"\nmsgstr \"Envoyer avec votre propre logiciel de mail\"\n\n#: themes/default/templates/partial/index.js.ep:30\nmsgid \"Sending part XX1 of XX2. Please, be patient, the progress bar can take a while to move.\"\nmsgstr \"Envoi du fragment XX1 sur XX2. Veuillez patienter, la barre de progression peut mettre du temps avant d’avancer.\"\n\n#. (url_for('/')\n#: themes/default/templates/partial/mail.js.ep:49\nmsgid \"Share your files in total privacy on %1\"\nmsgstr \"Partagez vos fichiers en toute confidentialité sur %1\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:13 themes/default/templates/partial/invitations.js.ep:9\nmsgid \"Show hidden invitations\"\nmsgstr \"Afficher les invitations cachées\"\n\n#: themes/default/templates/partial/render.js.ep:12\nmsgid \"Show zip content\"\nmsgstr \"Afficher le contenu du fichier zip\"\n\n#: themes/default/templates/layouts/default.html.ep:40 themes/default/templates/layouts/default.html.ep:73 themes/default/templates/login.html.ep:28 themes/default/templates/logout.html.ep:17\nmsgid \"Signin\"\nmsgstr \"Connexion\"\n\n#: lib/Lufi/Controller/Invitation.pm:302 themes/default/templates/invitations/exception.html.ep:16\nmsgid \"Sorry, the invitation doesn’t exist. Are you sure you are on the right URL?\"\nmsgstr \"Désolé, l’invitation n’existe pas. Êtes-vous sûr·e d’être sur la bonne URL ?\"\n\n#: themes/default/templates/index.html.ep:46\nmsgid \"Sorry, the uploading is currently disabled. Please try again later.\"\nmsgstr \"Désolé, l’envoi de fichier est actuellement désactivé. Veuillez réessayer plus tard.\"\n\n#: lib/Lufi/Controller/Files.pm:82\nmsgid \"Sorry, uploading is disabled.\"\nmsgstr \"Désolé, l’envoi de fichier est désactivé.\"\n\n#: themes/default/templates/invitations/exception.html.ep:7\nmsgid \"Sorry, your invitation has expired or has been deleted.\"\nmsgstr \"Désolé, votre invitation a expiré ou a été supprimée.\"\n\n#. ($invit->ldap_user_mail)\n#: lib/Lufi/Controller/Files.pm:123\nmsgid \"Sorry, your invitation has expired or has been deleted. Please contact %1 to have another invitation.\"\nmsgstr \"Désolé, votre invitation a expiré ou a été supprimée. Veuillez contacter %1 pour obtenir une nouvelle invitation.\"\n\n#. ($invitation->ldap_user_mail)\n#: lib/Lufi/Controller/Invitation.pm:295\nmsgid \"The URLs of your files have been sent by email to %1.\"\nmsgstr \"Les URL de vos fichiers ont été envoyées par courriel à %1.\"\n\n#: themes/default/templates/about.html.ep:7\nmsgid \"The administrator can only see the file's name, its size and its mimetype (what kind of file it is: video, text, etc.).\"\nmsgstr \"L’administrateur ne peut voir que le nom du fichier, sa taille et son type mime (son type de fichier : vidéo, texte, etc.).\"\n\n#: lib/Lufi/Controller/Mail.pm:67\nmsgid \"The body of the mail must contain at least one URL pointing to a file hosted on this instance.\"\nmsgstr \"Le corps du mail doit contenir au moins une URL pointant vers un fichier hébergé sur cette instance.\"\n\n#: themes/default/templates/partial/files.js.ep:11\nmsgid \"The data has been successfully imported.\"\nmsgstr \"Les données ont été importées avec succès.\"\n\n#: lib/Lufi/Controller/Mail.pm:87\nmsgid \"The email body can't be empty.\"\nmsgstr \"Le corps du mail ne peut être vide.\"\n\n#: lib/Lufi/Controller/Mail.pm:86\nmsgid \"The email subject can't be empty.\"\nmsgstr \"Le sujet du mail ne peut être vide.\"\n\n#. ($expire_at, $max_expire_at)\n#: lib/Lufi/Controller/Invitation.pm:52\nmsgid \"The expiration delay (%1) is not between 1 and %2 days.\"\nmsgstr \"Le délai d’expiration (%1) n’est pas compris entre 1 et %2 jours.\"\n\n#: lib/Lufi/Controller/Files.pm:462\nmsgid \"The file has already been deleted\"\nmsgstr \"Le fichier a déjà été supprimé\"\n\n#: themes/default/templates/about.html.ep:6\nmsgid \"The files uploaded on a Lufi instance are encrypted before the upload to the server: the administrator of the server can not see the file's content.\"\nmsgstr \"Les fichiers envoyés sur une instance de Lufi sont chiffrés avant l’envoi au serveur : l’administrateur du serveur ne peut pas voir le contenu de vos fichiers.\"\n\n#. (join(', ', @bad)\n#: lib/Lufi/Controller/Mail.pm:82\nmsgid \"The following email addresses are not valid: %1\"\nmsgstr \"Les adresses mail suivantes ne sont pas valides : %1\"\n\n#. ($guest_mail)\n#: lib/Lufi/Controller/Invitation.pm:49\nmsgid \"The guest email address (%1) is unvalid.\"\nmsgstr \"L’adresse courriel de l’invité·e (%1) est invalide.\"\n\n#. ($i->token, $c->current_user->{username})\n#: lib/Lufi/Controller/Invitation.pm:136\nmsgid \"The invitation %1 can’t be deleted: it wasn’t created by you (%2).\"\nmsgstr \"L’invitation %1 ne peut être supprimée : vous ne l’avez pas créée (%2).\"\n\n#. ($i->token, $i->guest_mail)\n#: lib/Lufi/Controller/Invitation.pm:163\nmsgid \"The invitation %1 can’t be resent: %2 has already sent files.<br>Please create a new invitation.\"\nmsgstr \"L’invitation %1 ne peut pas être renvoyée : %2 a déjà envoyé des fichiers.<br>Veuillez créer une nouvelle invitation.\"\n\n#. ($i->token, $c->current_user->{username})\n#: lib/Lufi/Controller/Invitation.pm:187\nmsgid \"The invitation %1 can’t be resent: it wasn’t created by you (%2).\"\nmsgstr \"L’invitation %1 ne peut être renvoyée : vous ne l’avez pas créée (%2).\"\n\n#. ($i->token)\n#: lib/Lufi/Controller/Invitation.pm:134\nmsgid \"The invitation %1 has been deleted.\"\nmsgstr \"L’invitation %1 a été supprimée.\"\n\n#. (stash('user_mail')\n#: themes/default/templates/invitations/invite.html.ep:34\nmsgid \"The invitation mail will be send from your email address (%1).\"\nmsgstr \"Le courriel d’invitation sera envoyé de votre adresse de courriel (%1).\"\n\n#: themes/default/templates/partial/index.js.ep:16\nmsgid \"The link(s) has been copied to your clipboard\"\nmsgstr \"Le(s) lien(s) a/ont été copié dans votre presse-papiers\"\n\n#. (stash('invitation')\n#: themes/default/templates/index.html.ep:30\nmsgid \"The link(s) of your file(s) will automatically be sent by mail to %1 (%2)\"\nmsgstr \"Les liens de vos fichiers seront automatiquement envoyés par courriel à %1 (%2)\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:11\nmsgid \"The links of your file(s) will automatically be sent by mail to %1.\"\nmsgstr \"Les liens de vos fichiers seront automatiquement envoyés par courriel à %1.\"\n\n#: lib/Lufi/Controller/Mail.pm:111\nmsgid \"The mail has been sent.\"\nmsgstr \"Le mail a été envoyé.\"\n\n#: themes/default/templates/about.html.ep:15\nmsgid \"The original (and only for now) author is <a href=\\\"https://fiat-tux.fr\\\" class=\\\"classic\\\">Luc Didry</a>.\"\nmsgstr \"L’auteur originel (et pour l’instant, le seul) est <a href=\\\"https://fiat-tux.fr\\\" class=\\\"classic\\\">Luc Didry</a>.\"\n\n#: lib/Lufi/Controller/Files.pm:230\nmsgid \"The server was unable to find the file record to add your file part to. Please, contact the administrator.\"\nmsgstr \"Le serveur a été incapable de retrouver l’enregistrement du fichier auquel ajouter votre fragment de fichier. Veuillez contacter l’administrateur.\"\n\n#: lib/Lufi/Controller/Files.pm:289\nmsgid \"This file has been deactivated by the admins. Contact them to know why.\"\nmsgstr \"\"\n\"Le fichier a été désactivé par les administrateurs ou administratrices. \"\n\"Veuillez les contacter pour savoir pourquoi.\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:46 themes/default/templates/partial/invitations.js.ep:6\nmsgid \"This invitation is normally hidden\"\nmsgstr \"Cette invitation est normalement cachée\"\n\n#. (stash('expires')\n#: themes/default/templates/invitations/invite.mail.ep:13\nmsgid \"This invitation is valid until %1.\"\nmsgstr \"Cette invitation est valide jusqu’au %1.\"\n\n#: themes/default/templates/delays.html.ep:13\nmsgid \"This server sets limitations according to the file size. The expiration delay of your file will be the minimum between what you choose and the following limitations:\"\nmsgstr \"Ce serveur impose des limitations selon la taille des fichiers. Le délai d’expiration de votre fichier sera le minimum entre ce que vous avez choisi et les limites suivantes :\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:16\nmsgid \"Toggle visibility\"\nmsgstr \"Inverser la visibilité\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:25\nmsgid \"URL\"\nmsgstr \"URL\"\n\n#: themes/default/templates/partial/index.js.ep:17\nmsgid \"Unable to copy the link(s) to your clipboard\"\nmsgstr \"Impossible de copier le(s) lien(s) dans votre presse-papiers\"\n\n#: themes/default/templates/partial/render.js.ep:13\nmsgid \"Unable to download the file: too much unsuccessful attempts to open a websocket. Please, contact the administrator.\"\nmsgstr \"Impossible de télécharger le fichier : trop de tentatives infructueuses d’ouverture d’une websocket. Veuillez contacter l’administrateur.\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:433\nmsgid \"Unable to get counter for %1. The file does not exists. It will be removed from your localStorage.\"\nmsgstr \"Impossible de récupérer le compteur pour %1. Le fichier n’existe pas. Il va être supprimé de votre localStorage.\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:423\nmsgid \"Unable to get counter for %1. The token is invalid.\"\nmsgstr \"Impossible de récupérer le compteur pour %1. Le jeton est invalide.\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:443\nmsgid \"Unable to get counter for %1. You are not authenticated.\"\nmsgstr \"Impossible de récupérer le compteur pour %1. Vous n’êtes pas connecté·e.\"\n\n#: themes/default/templates/layouts/default.html.ep:33 themes/default/templates/layouts/default.html.ep:66\nmsgid \"Upload files\"\nmsgstr \"Envoyer des fichiers\"\n\n#: themes/default/templates/index.html.ep:145\nmsgid \"Upload generated zip file\"\nmsgstr \"Envoyer le fichier zip généré\"\n\n#: themes/default/templates/files.html.ep:31\nmsgid \"Uploaded at\"\nmsgstr \"Envoyé le\"\n\n#: themes/default/templates/index.html.ep:153\nmsgid \"Uploaded files\"\nmsgstr \"Fichiers envoyés\"\n\n#: themes/default/templates/about.html.ep:20\nmsgid \"Version\"\nmsgstr \"Version\"\n\n#: themes/default/templates/partial/index.js.ep:31\nmsgid \"Websocket communication error\"\nmsgstr \"Erreur de communication WebSocket\"\n\n#: themes/default/templates/about.html.ep:3\nmsgid \"What is Lufi?\"\nmsgstr \"Qu’est-ce que Lufi ?\"\n\n#: themes/default/templates/about.html.ep:14\nmsgid \"Who wrote this software?\"\nmsgstr \"Qui a écrit ce logiciel ?\"\n\n#: themes/default/templates/partial/index.js.ep:13\nmsgid \"XXX file has been added to upload queue.\"\nmsgstr \"Le fichier XXX a été ajouté à la file d’envoi.\"\n\n#: themes/default/templates/invitations/invite.html.ep:30\nmsgid \"You can invite someone to send you files through this Lufi instance even if they don’t have an account on it.\"\nmsgstr \"Vous pouvez inviter une personne à vous envoyer des fichiers via cette instance Lufi même si cette personne n’y a pas de compte.\"\n\n#: themes/default/templates/about.html.ep:11\nmsgid \"You can see the list of your files by clicking on the \\\"My files\\\" link at the top right of this page.\"\nmsgstr \"Vous pouvez voir la liste de vos fichiers en cliquant sur le lien « Mes fichiers » en haut à droite de cette page.\"\n\n#. ($orig_uri)\n#: lib/Lufi/Controller/Mail.pm:43 lib/Lufi/Controller/Mail.pm:59\nmsgid \"You can't add URLs that are not related to this instance (%1).\"\nmsgstr \"Vous ne pouvez pas ajouter d’URL non relatives à cette instance (%1).\"\n\n#: themes/default/templates/about.html.ep:8\nmsgid \"You don't need to register yourself to upload files but be aware that, for legal reasons, your IP address will be stored when you send a file. Don't panic, this is normally the case for all sites on which you send files.\"\nmsgstr \"Vous n’avez pas besoin de vous enregistrer pour envoyer des fichiers mais notez que, pour des raisons légales, votre adresse IP sera enregistrée quand vous envoyez un fichier. Ne paniquez pas, c’est normalement le cas pour tous les sites où vous envoyez des fichiers.\"\n\n#: themes/default/templates/partial/render.js.ep:11\nmsgid \"You don't seem to have a key in your URL. You won't be able to decrypt the file. Download canceled.\"\nmsgstr \"Il semble que vous n’ayez pas de clé dans votre URL. Vous ne serez pas capable de déchiffrer le fichier. Téléchargement annulé.\"\n\n#: themes/default/templates/partial/render.js.ep:7\nmsgid \"You have attempted to leave this page. The download will be canceled. Are you sure?\"\nmsgstr \"Vous essayez de quitter la page. Le téléchargement sera annulé. Êtes-vous sûr(e) ?\"\n\n#: themes/default/templates/partial/index.js.ep:14\nmsgid \"You have attempted to leave this page. The upload will be canceled. Are you sure?\"\nmsgstr \"Vous essayez de quitter la page. L’envoi sera annulé. Êtes-vous sûr(e) ?\"\n\n#: themes/default/templates/logout.html.ep:14\nmsgid \"You have been successfully logged out.\"\nmsgstr \"Vous avez été déconnecté·e avec succès.\"\n\n#: lib/Lufi/Controller/Mail.pm:85\nmsgid \"You must give email addresses.\"\nmsgstr \"Vous devez envoyer des adresses mail.\"\n\n#: themes/default/templates/index.html.ep:38\nmsgid \"Your browser does not have enough entropy to generate a strong encryption key. Please wait (it's better if you do things on your computer while waiting).\"\nmsgstr \"Votre navigateur n’a pas assez d’entropie pour générer une clé de chiffrement forte. Veuillez attendre (il est préférable que vous fassiez quelque chose sur votre ordinateur en attendant).\"\n\n#. (format_bytes($json->{size})\n#: lib/Lufi/Controller/Files.pm:95\nmsgid \"Your file is too big: %1 (maximum size allowed: %2)\"\nmsgstr \"Votre fichier est trop volumineux : %1 (la taille maximum autorisée est %2)\"\n\n#: lib/Lufi/Controller/Files.pm:345\nmsgid \"Your password is not valid. Please refresh the page to retry.\"\nmsgstr \"Votre mot de passe est invalide. Veuillez rafraîchir la page pour réessayer.\"\n\n#: themes/default/templates/partial/render.js.ep:14\nmsgid \"Zip content:\"\nmsgstr \"Contenu de l’archive zip :\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:24\nmsgid \"between %1 and %2, the file will be kept %3 day(s).\"\nmsgstr \"entre %1 et %2, le fichier sera conservé %3 jour(s).\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:26\nmsgid \"between %1 and %2, the file will be kept forever.\"\nmsgstr \"entre %1 et %2, le fichier sera conservé indéfiniment.\"\n\n#: themes/default/templates/partial/mail.js.ep:42\nmsgid \"deadline: \"\nmsgstr \"dernier délai pour télécharger : \"\n\n#: themes/default/templates/partial/invitations.js.ep:5\nmsgid \"expires on XXX\"\nmsgstr \"expire le XXX\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:30\nmsgid \"for %1 and more, the file will be kept %2 day(s)\"\nmsgstr \"pour %1 et plus, le fichier sera conservé %2 jour(s)\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:32\nmsgid \"for %1 and more, the file will be kept forever.\"\nmsgstr \"pour %1 et plus, le fichier sera conservé indéfiniment.\"\n\n#: themes/default/templates/index.html.ep:3\nmsgid \"no time limit\"\nmsgstr \"Pas de délai d’expiration\"\n\n#: themes/default/templates/index.html.ep:124\nmsgid \"or\"\nmsgstr \"ou\"\n\n#. ($e->{name}, format_bytes($e->{size})\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:12\nmsgid \"— %1 (%2), that will expire on %3\"\nmsgstr \"— %1 (%2), qui expirera le %3\"\n\n#:\nmsgid \"You can't add URLs that are not related to this instance.\"\nmsgstr \"\"\n\"Vous ne pouvez pas ajouter d'URL qui ne sont pas liées à cette instance.\"\n"
  },
  {
    "path": "themes/default/lib/Lufi/I18N/fr_FR.po",
    "content": "# Lufi FR translation\n# Copyright (C) 2015 Luc Didry\n# This file is distributed under the same license as the Lufi package.\n# Luc Didry <luc@didry.org>, 2015.\n# Luc Didry <luc@framasoft.org>, 2018. #zanata\n# Luc Didry <luc@framasoft.org>, 2019. #zanata\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\\n\"\n\"PO-Revision-Date: 2022-01-24 12:56+0000\\n\"\n\"Last-Translator: J. Lavoie <j.lavoie@net-c.ca>\\n\"\n\"Language-Team: French (France) <https://weblate.framasoft.org/projects/lufi/\"\n\"default-theme/fr_FR/>\\n\"\n\"Language: fr_FR\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=n > 1;\\n\"\n\"X-Generator: Weblate 4.10.1\\n\"\n\n#. ($delay)\n#. (max_delay)\n#: themes/default/templates/index.html.ep:56 themes/default/templates/index.html.ep:65 themes/default/templates/index.html.ep:66\nmsgid \"%1 days\"\nmsgstr \"%1 jours\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:2\nmsgid \"%1 invites you to send him/her files\"\nmsgstr \"%1 vous invite à lui envoyer des fichiers\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:6\nmsgid \"%1 invites you to send him/her files through Lufi.\"\nmsgstr \"%1 vous invite à lui envoyer des fichiers via Lufi.\"\n\n#. (stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:4\nmsgid \"%1 sent you files\"\nmsgstr \"%1 vous a envoyé des fichiers\"\n\n#. (stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:8\nmsgid \"%1 used your invitation to send you files:\"\nmsgstr \"%1 a utilisé votre invitation pour vous envoyer des fichiers :\"\n\n#: lib/Lufi/Controller/Invitation.pm:159 lib/Lufi/Controller/Invitation.pm:84 themes/default/templates/invitations/my_invitations.html.ep:51 themes/default/templates/invitations/my_invitations.html.ep:52 themes/default/templates/invitations/my_invitations.html.ep:53 themes/default/templates/invitations/notification_files_sent.mail.ep:12\nmsgid \"%A %d %B %Y at %T\"\nmsgstr \"%A %d %B %Y à %T\"\n\n#: themes/default/templates/partial/index.js.ep:27\nmsgid \"(max size: XXX)\"\nmsgstr \"(taille max : XXX)\"\n\n#: themes/default/templates/index.html.ep:5\nmsgid \"1 year\"\nmsgstr \"1 an\"\n\n#: themes/default/templates/index.html.ep:4 themes/default/templates/index.html.ep:65\nmsgid \"24 hours\"\nmsgstr \"24 heures\"\n\n#: themes/default/templates/partial/mail.js.ep:40\nmsgid \":\"\nmsgstr \" :\"\n\n#: themes/default/templates/render.html.ep:42\nmsgid \"Abort\"\nmsgstr \"Abandonner\"\n\n#: themes/default/templates/layouts/default.html.ep:53 themes/default/templates/layouts/default.html.ep:86\nmsgid \"About\"\nmsgstr \"À propos\"\n\n#: themes/default/templates/index.html.ep:107\nmsgid \"Add a password to file(s)\"\nmsgstr \"Ajouter un mot de passe au(x) fichier(s)\"\n\n#: themes/default/templates/mail.html.ep:16\nmsgid \"\"\n\"Adding URLs not related to this Lufi instance to the mail body or subject is \"\n\"prohibited.\"\nmsgstr \"\"\n\"L’ajout d’URL non liées à cette instance Lufi au corps ou au sujet du mail \"\n\"est interdit.\"\n\n#: themes/default/templates/delete_file.html.ep:18\nmsgid \"Are you sure you want to delete that file?\"\nmsgstr \"Voulez-vous vraiment supprimer ce fichier ?\"\n\n#: themes/default/templates/partial/invitations.js.ep:3\nmsgid \"Are you sure you want to delete the selected invitations?\"\nmsgstr \"Êtes-vous sûr·e de vouloir supprimer les invitations sélectionnées ?\"\n\n#: themes/default/templates/partial/invitations.js.ep:4\nmsgid \"\"\n\"Are you sure you want to resend the invitation mail for the selected \"\n\"invitations?\"\nmsgstr \"\"\n\"Êtes-vous sûr·e de vouloir renvoyer le courriel d’invitation pour les \"\n\"invitations sélectionnées ?\"\n\n#: themes/default/templates/about.html.ep:17\nmsgid \"\"\n\"As Lufi is a free software licensed under of the terms of the <a href=\"\n\"\\\"https://gnu.org/licenses/agpl.html\\\" class=\\\"classic\\\">AGPLv3</a>, you can \"\n\"install it on you own server. Have a look on the <a href=\\\"https://framagit.\"\n\"org/luc/lufi/wikis/home\\\" class=\\\"classic\\\">Wiki</a> for the procedure.\"\nmsgstr \"\"\n\"Comme Lufi est un logiciel libre soumis aux termes de la license <a href=\"\n\"\\\"https://gnu.org/licenses/agpl.html\\\" class=\\\"classic\\\">AGPLv3</a>, vous \"\n\"pouvez l’installer sur votre propre serveur. Veuillez consulter le <a href=\"\n\"\\\"https://framagit.org/luc/lufi/wikis/home\\\" class=\\\"classic\\\">Wiki</a> pour \"\n\"voir la procédure.\"\n\n#. (stash('nbslices')\n#: themes/default/templates/partial/render.js.ep:9\nmsgid \"Asking for file part XX1 of %1\"\nmsgstr \"Demande de récupération du fragment de fichier XX1 sur %1\"\n\n#: themes/default/templates/about.html.ep:20\nmsgid \"Back to homepage\"\nmsgstr \"Retour à la page d’accueil\"\n\n#: lib/Lufi/Controller/Mail.pm:25\nmsgid \"Bad CSRF token!\"\nmsgstr \"Mauvais jeton CSRF !\"\n\n#: lib/Lufi/Controller/Auth.pm:27 lib/Lufi/Controller/Auth.pm:49\nmsgid \"Bad CSRF token.\"\nmsgstr \"Jeton CSRF invalide.\"\n\n#: themes/default/templates/partial/render.js.ep:5\nmsgid \"Click here to refresh the page and restart the download.\"\nmsgstr \"Cliquez ici pour rafraîchir la page et redémarrer le téléchargement.\"\n\n#: themes/default/templates/invitations/invite.mail.ep:8\nmsgid \"Click on the following URL to upload files on Lufi:\"\nmsgstr \"Cliquez sur l’URL suivante pour envoyer des fichiers sur Lufi :\"\n\n#: themes/default/templates/index.html.ep:126\nmsgid \"Click to open the file browser\"\nmsgstr \"Cliquez pour ouvrir le navigateur de fichiers\"\n\n#: themes/default/templates/delays.html.ep:38 themes/default/templates/invitations/my_invitations.html.ep:80\nmsgid \"Close\"\nmsgstr \"Fermer\"\n\n#: themes/default/templates/mail.html.ep:23\nmsgid \"Comma-separated email addresses\"\nmsgstr \"Adresses mails séparées par des virgules\"\n\n#: themes/default/templates/index.html.ep:140\nmsgid \"Compressing zip file…\"\nmsgstr \"Compression du fichier zip…\"\n\n#: themes/default/templates/partial/index.js.ep:15\nmsgid \"Copy all links to clipboard\"\nmsgstr \"Copier tous les liens dans le presse-papier\"\n\n#: themes/default/templates/partial/index.js.ep:18\nmsgid \"Copy to clipboard\"\nmsgstr \"Copier dans le presse-papier\"\n\n#: lib/Lufi/Controller/Files.pm:507\nmsgid \"Could not delete the file. You are not authenticated.\"\nmsgstr \"Impossible de supprimer le fichier. Vous n’êtes pas connecté·e.\"\n\n#: lib/Lufi/Controller/Files.pm:489\nmsgid \"Could not find the file. Are you sure of the URL and the token?\"\nmsgstr \"\"\n\"Impossible de retrouver le fichier. Êtes-vous sûr(e) que l’URL et le jeton \"\n\"sont les bons ?\"\n\n#: lib/Lufi/Controller/Files.pm:400\nmsgid \"Could not find the file. Are you sure of the URL?\"\nmsgstr \"\"\n\"Impossible de retrouver le fichier. Êtes-vous sûr(e) que l’URL est la \"\n\"bonne ?\"\n\n#: themes/default/templates/files.html.ep:29\nmsgid \"Counter\"\nmsgstr \"Compteur\"\n\n#: themes/default/templates/index.html.ep:100\nmsgid \"Create a zip archive with the files before uploading?\"\nmsgstr \"Créer une archive zip avec les fichiers avant l’envoi ?\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:26\nmsgid \"Created at\"\nmsgstr \"Créée le\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:14\nmsgid \"Delete\"\nmsgstr \"Supprimer\"\n\n#: themes/default/templates/files.html.ep:30 themes/default/templates/index.html.ep:90\nmsgid \"Delete at first download?\"\nmsgstr \"Supprimer après le premier téléchargement ?\"\n\n#: themes/default/templates/files.html.ep:19\nmsgid \"Delete selected files\"\nmsgstr \"Supprimer les fichiers sélectionnés\"\n\n#: themes/default/templates/files.html.ep:33 themes/default/templates/partial/index.js.ep:19\nmsgid \"Deletion link\"\nmsgstr \"Lien de suppression\"\n\n#: themes/default/templates/delays.html.ep:8\nmsgid \"\"\n\"Don't worry: if a user begins to download the file before the expiration and \"\n\"the download ends after the expiration, he will be able to get the file.\"\nmsgstr \"\"\n\"Ne vous inquiétez pas : si un utilisateur commence à télécharger le fichier \"\n\"avant son expiration et que le téléchargement se termine après l’expiration, \"\n\"l’utilisateur pourra quand même récupérer le fichier.\"\n\n#: themes/default/templates/partial/index.js.ep:21 themes/default/templates/render.html.ep:28\nmsgid \"Download\"\nmsgstr \"Télécharger\"\n\n#: themes/default/templates/partial/render.js.ep:4\nmsgid \"Download aborted.\"\nmsgstr \"Téléchargement abandonné.\"\n\n#: themes/default/templates/files.html.ep:28 themes/default/templates/partial/index.js.ep:20\nmsgid \"Download link\"\nmsgstr \"Lien de téléchargement\"\n\n#: themes/default/templates/about.html.ep:10\nmsgid \"\"\n\"Drag and drop files in the appropriate area or use the traditional way to \"\n\"send files and the files will be chunked, encrypted and sent to the server. \"\n\"You will get two links per file: a download link, that you give to the \"\n\"people you want to share the file with and a deletion link, allowing you to \"\n\"delete the file whenever you want.\"\nmsgstr \"\"\n\"Faites glisser des fichiers dans la zone prévue à cet effet ou sélectionnez \"\n\"un fichier de façon classique et les fichiers seront découpés en morceaux, \"\n\"chiffrés et envoyés au serveur. Vous récupérerez deux liens par fichier : un \"\n\"lien de téléchargement et un lien pour supprimer le fichier quand vous le \"\n\"souhaitez.\"\n\n#: themes/default/templates/index.html.ep:122\nmsgid \"Drop files here\"\nmsgstr \"Glissez vos fichiers ici\"\n\n#: themes/default/templates/invitations/invite.html.ep:40\nmsgid \"Email address of your guest\"\nmsgstr \"Adresse de courriel de votre invité·e\"\n\n#: themes/default/templates/mail.html.ep:39\nmsgid \"Email body\"\nmsgstr \"Corps du mail\"\n\n#: themes/default/templates/mail.html.ep:31\nmsgid \"Email subject\"\nmsgstr \"Sujet du mail\"\n\n#: themes/default/templates/mail.html.ep:25 themes/default/templates/mail.html.ep:27\nmsgid \"Emails\"\nmsgstr \"Mails\"\n\n#: themes/default/templates/partial/index.js.ep:22\nmsgid \"Encrypting part XX1 of XX2\"\nmsgstr \"Chiffrement du fragment XX1 sur XX2\"\n\n#: lib/Lufi/Controller/Files.pm:289\nmsgid \"Error: the file existed but was deleted.\"\nmsgstr \"Erreur : le fichier existait mais a été supprimé.\"\n\n#: lib/Lufi/Controller/Files.pm:369\nmsgid \"Error: the file has not been sent entirely.\"\nmsgstr \"Erreur : le fichier n’a pas été envoyé dans son intégralité.\"\n\n#: lib/Lufi/Controller/Files.pm:379\nmsgid \"Error: unable to find the file. Are you sure of your URL?\"\nmsgstr \"\"\n\"Erreur : impossible de retrouver le fichier. Êtes-vous sûr(e) de l’URL ?\"\n\n#: themes/default/templates/partial/index.js.ep:23\nmsgid \"Expiration:\"\nmsgstr \"Expiration :\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:27\nmsgid \"Expire at\"\nmsgstr \"Expire le\"\n\n#: themes/default/templates/files.html.ep:32\nmsgid \"Expires at\"\nmsgstr \"Expire le\"\n\n#: themes/default/templates/files.html.ep:12\nmsgid \"Export localStorage data\"\nmsgstr \"Exporter les données localStorage\"\n\n#: lib/Lufi/Controller/Files.pm:471\nmsgid \"File deleted\"\nmsgstr \"Fichier supprimé\"\n\n#: themes/default/templates/files.html.ep:27\nmsgid \"File name\"\nmsgstr \"Nom du fichier\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:61\nmsgid \"Files\"\nmsgstr \"Fichiers\"\n\n#: themes/default/templates/index.html.ep:80\nmsgid \"Files deleted at first download\"\nmsgstr \"Fichiers supprimés au premier téléchargement\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:28\nmsgid \"Files sent at\"\nmsgstr \"Fichiers envoyés le\"\n\n#: themes/default/templates/partial/invitations.js.ep:8\nmsgid \"Files sent in invitation XX1 by XX2\"\nmsgstr \"Fichiers envoyés via l’invitation XX1 par XX2\"\n\n#: themes/default/templates/partial/render.js.ep:8\nmsgid \"Get the file\"\nmsgstr \"Récupérer le fichier\"\n\n#: themes/default/templates/about.html.ep:18\nmsgid \"\"\n\"Get the source code on <a href=\\\"https://framagit.org/luc/lufi\\\" class=\"\n\"\\\"classic\\\">the official repository</a> or on its <a href=\\\"https://github.\"\n\"com/ldidry/lufi\\\" class=\\\"classic\\\">Github mirror</a>\"\nmsgstr \"\"\n\"Récupérez le code source sur <a href=\\\"https://framagit.org/luc/lufi\\\" class=\"\n\"\\\"classic\\\">le dépôt officiel</a> ou sur son <a href=\\\"https://github.com/\"\n\"ldidry/lufi\\\" class=\\\"classic\\\">miroir Github</a>\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:24\nmsgid \"Guest mail\"\nmsgstr \"Courriel de l’invité·e\"\n\n#. (ucfirst(stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:6\nmsgid \"Hello %1,\"\nmsgstr \"Bonjour %1,\"\n\n#: themes/default/templates/invitations/invite.mail.ep:4\nmsgid \"Hello,\"\nmsgstr \"Bonjour,\"\n\n#: themes/default/templates/partial/mail.js.ep:35\nmsgid \"Hello,\\\\n\\\\nHere's some files I want to share with you:\\\\n\"\nmsgstr \"\"\n\"Bonjour,\\\\n\\\\nVoici quelques fichiers que je souhaite partager avec vous :\\\\n\"\n\n#: themes/default/templates/mail.html.ep:35\nmsgid \"Here's some files\"\nmsgstr \"Voici quelques fichiers\"\n\n#: themes/default/templates/partial/invitations.js.ep:7\nmsgid \"Hide hidden invitations\"\nmsgstr \"Ne pas afficher les invitations cachées\"\n\n#: themes/default/templates/partial/index.js.ep:25\nmsgid \"Hit Enter, then Ctrl+C to copy all the download links\"\nmsgstr \"\"\n\"Appuyez sur la touche Entrée puis faites Ctrl+C pour copier tous les liens \"\n\"de téléchargement\"\n\n#: themes/default/templates/partial/index.js.ep:24\nmsgid \"Hit Enter, then Ctrl+C to copy the download link\"\nmsgstr \"\"\n\"Appuyez sur la touche Entrée puis faites Ctrl+C pour copier le lien de \"\n\"téléchargement\"\n\n#: themes/default/templates/about.html.ep:9\nmsgid \"How does it work?\"\nmsgstr \"Comment ça marche ?\"\n\n#: themes/default/templates/invitations/invite.html.ep:46\nmsgid \"How many days would you like the invitation to be valid?\"\nmsgstr \"\"\n\"Pendant combien de jours souhaitez-vous que votre invitation soit valide ?\"\n\n#: themes/default/templates/about.html.ep:16\nmsgid \"How to install the software on my server?\"\nmsgstr \"Comment installer le logiciel sur mon serveur ?\"\n\n#: themes/default/templates/about.html.ep:12\nmsgid \"How to report an illegal file?\"\nmsgstr \"Comment signaler un fichier illégal ?\"\n\n#: themes/default/templates/delays.html.ep:7\nmsgid \"If you choose a delay, the file will be deleted after that delay.\"\nmsgstr \"Si vous choisissez un délai, le fichier sera supprimé après ce délai.\"\n\n#: themes/default/templates/mail.html.ep:15\nmsgid \"\"\n\"If you send the mail from this server, the links will be sent to the server, \"\n\"which may lower your privacy protection.\"\nmsgstr \"\"\n\"Si vous envoyez le mail depuis ce serveur, les liens seront envoyés au \"\n\"serveur, ce qui peut diminuer la protection de la confidentialité.\"\n\n#: themes/default/templates/files.html.ep:14\nmsgid \"Import localStorage data\"\nmsgstr \"Importer des données localStorage\"\n\n#: themes/default/templates/index.html.ep:53\nmsgid \"Important: more information on delays\"\nmsgstr \"Important : plus d’informations sur les délais\"\n\n#: themes/default/templates/delays.html.ep:5\nmsgid \"Information about delays\"\nmsgstr \"Information sur les délais\"\n\n#: themes/default/templates/files.html.ep:18 themes/default/templates/invitations/my_invitations.html.ep:12\nmsgid \"Invert selection\"\nmsgstr \"Inverser la sélection\"\n\n#. ($i->guest_mail, $url)\n#: lib/Lufi/Controller/Invitation.pm:171\nmsgid \"Invitation resent to %1.<br> URL: %2\"\nmsgstr \"Invitation renvoyée à %1 :<br> URL : %2\"\n\n#. ($invitation->guest_mail, $url)\n#: lib/Lufi/Controller/Invitation.pm:87\nmsgid \"Invitation sent to %1.<br> URL: %2\"\nmsgstr \"Invitation envoyée à %1 :<br> URL : %2\"\n\n#: themes/default/templates/invitations/invite.html.ep:27 themes/default/templates/layouts/default.html.ep:36 themes/default/templates/layouts/default.html.ep:69\nmsgid \"Invite a guest\"\nmsgstr \"Inviter quelqu’un\"\n\n#: themes/default/templates/partial/render.js.ep:6\nmsgid \"\"\n\"It seems that the key in your URL is incorrect. Please, verify your URL.\"\nmsgstr \"\"\n\"Il semble que la clé dans votre URL soit incorrecte. Veuillez vérifier votre \"\n\"URL.\"\n\n#: themes/default/templates/index.html.ep:12\nmsgid \"Javascript is disabled. You won't be able to use Lufi.\"\nmsgstr \"Javascript est désactivé. Lufi ne fonctionnera pas.\"\n\n#: themes/default/templates/layouts/default.html.ep:44 themes/default/templates/layouts/default.html.ep:46 themes/default/templates/layouts/default.html.ep:77 themes/default/templates/layouts/default.html.ep:79\nmsgid \"Language\"\nmsgstr \"Langue\"\n\n#: themes/default/templates/login.html.ep:15\nmsgid \"Login\"\nmsgstr \"Identifiant\"\n\n#: themes/default/templates/layouts/default.html.ep:58 themes/default/templates/layouts/default.html.ep:91\nmsgid \"Logout\"\nmsgstr \"Déconnexion\"\n\n#: themes/default/templates/about.html.ep:4\nmsgid \"Lufi is a free (as in free speech) file hosting software.\"\nmsgstr \"Lufi est un logiciel libre d’hébergement de fichiers.\"\n\n#: themes/default/templates/partial/files.js.ep:12\nmsgid \"\"\n\"Lufi recently changed its way to store files information.\\\\n\\\\nNo files have \"\n\"been found in the new localStorage location but we found files in the old \"\n\"one.\\\\nDo you want to import those informations?\\\\n\\\\nPlease note that this \"\n\"is the only time that we will ask you this.\"\nmsgstr \"\"\n\"Lufi a récemment changé sa façon de stocker l’information des fichiers.\"\n\"\\\\n\\\\nAucun fichier n’a été trouvé dans le nouvel emplacement localStorage \"\n\"mais nous avons trouvé des fichiers dans l’ancien.\\\\nVoulez-vous importer \"\n\"ces informations ?\\\\n\\\\nVeuillez noter que c’est la seule fois que nous vous \"\n\"poserons cette question.\"\n\n#: themes/default/templates/files.html.ep:34\nmsgid \"Mail\"\nmsgstr \"Mail\"\n\n#: themes/default/templates/files.html.ep:3 themes/default/templates/layouts/default.html.ep:34 themes/default/templates/layouts/default.html.ep:67\nmsgid \"My files\"\nmsgstr \"Mes fichiers\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:5 themes/default/templates/layouts/default.html.ep:37 themes/default/templates/layouts/default.html.ep:70\nmsgid \"My invitations\"\nmsgstr \"Mes invitations\"\n\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:17\nmsgid \"\"\n\"NB: this list includes the list of files that have already been sent to you.\"\nmsgstr \"\"\n\"NB : cette liste inclue la liste des fichiers qui vous a déjà été envoyée.\"\n\n#: themes/default/templates/index.html.ep:115\nmsgid \"Name of the zip file\"\nmsgstr \"Nom du fichier zip\"\n\n#. (format_bytes($json->{size})\n#: lib/Lufi/Controller/Files.pm:108\nmsgid \"No enough space available on the server for this file (size: %1).\"\nmsgstr \"\"\n\"Espace disque insuffisant sur le serveur pour ce fichier (taille du fichier :\"\n\" %1).\"\n\n#: themes/default/templates/partial/files.js.ep:10 themes/default/templates/partial/index.js.ep:28\nmsgid \"No expiration delay\"\nmsgstr \"Pas de délai d’expiration\"\n\n#: themes/default/templates/files.html.ep:8\nmsgid \"\"\n\"Only the files sent with this browser will be listed here. This list is \"\n\"stored in localStorage: if you delete your localStorage data, you'll lose \"\n\"this list.\"\nmsgstr \"\"\n\"Seuls les fichiers envoyés avec ce navigateur web sont listés ici. Les \"\n\"informations sont stockées en localStorage : si vous supprimez vos données \"\n\"localStorage, vous perdrez ces informations.\"\n\n#: themes/default/templates/index.html.ep:106 themes/default/templates/login.html.ep:21 themes/default/templates/render.html.ep:26\nmsgid \"Password\"\nmsgstr \"Mot de passe\"\n\n#. (config('contact')\n#: themes/default/templates/about.html.ep:13\nmsgid \"Please contact the administrator: %1\"\nmsgstr \"Veuillez contacter l’administrateur : %1\"\n\n#: themes/default/templates/render.html.ep:33\nmsgid \"\"\n\"Please wait while we are getting your file. We first need to download and \"\n\"decrypt all parts before you can get it.\"\nmsgstr \"\"\n\"Veuillez patientez pendant la récupération de votre fichier. Nous devons \"\n\"d’abord récupérer et déchiffrer tous les fragments avant que vous puissiez \"\n\"le télécharger.\"\n\n#: lib/Lufi/Controller/Auth.pm:38\nmsgid \"\"\n\"Please, check your credentials or your right to access this service: unable \"\n\"to authenticate.\"\nmsgstr \"\"\n\"Veuillez vérifier vos identifiants ou votre droit d’accès à ce service : \"\n\"impossible de vous authentifier.\"\n\n#: themes/default/templates/about.html.ep:5\nmsgid \"Privacy\"\nmsgstr \"Confidentialité\"\n\n#: themes/default/templates/files.html.ep:13\nmsgid \"Purge expired files from localStorage\"\nmsgstr \"Supprimer du localStorage les fichiers expirés\"\n\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:20\nmsgid \"Regards,\"\nmsgstr \"Cordialement,\"\n\n#: themes/default/templates/invitations/invite.mail.ep:15\nmsgid \"Regards.\"\nmsgstr \"Cordialement.\"\n\n#: themes/default/templates/layouts/default.html.ep:31 themes/default/templates/layouts/default.html.ep:64\nmsgid \"Report file\"\nmsgstr \"Signaler un fichier\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:15\nmsgid \"Resend invitation mail\"\nmsgstr \"Renvoyer le courriel d’invitation\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:9\nmsgid \"Rows in purple mean that the invitations have expired.\"\nmsgstr \"Les lignes en violet indiquent que les invitations ont expiré.\"\n\n#: themes/default/templates/files.html.ep:9\nmsgid \"\"\n\"Rows in red mean that the files have expired and are no longer available.\"\nmsgstr \"\"\n\"Les lignes en rouge indiquent que le fichier a expiré et n’est plus \"\n\"disponible.\"\n\n#: themes/default/templates/partial/index.js.ep:26\nmsgid \"Send all links by email\"\nmsgstr \"Envoyer tous les liens par mail\"\n\n#: themes/default/templates/invitations/invite.html.ep:50\nmsgid \"Send the invitation\"\nmsgstr \"Envoyer l’invitation\"\n\n#: themes/default/templates/mail.html.ep:46\nmsgid \"Send with this server\"\nmsgstr \"Envoyer avec ce serveur\"\n\n#: themes/default/templates/mail.html.ep:47\nmsgid \"Send with your own mail software\"\nmsgstr \"Envoyer avec votre propre logiciel de mail\"\n\n#: themes/default/templates/partial/index.js.ep:29\nmsgid \"\"\n\"Sending part XX1 of XX2. Please, be patient, the progress bar can take a \"\n\"while to move.\"\nmsgstr \"\"\n\"Envoi du fragment XX1 sur XX2. Veuillez patienter, la barre de progression \"\n\"peut mettre du temps avant d’avancer.\"\n\n#. (url_for('/')\n#: themes/default/templates/partial/mail.js.ep:48\nmsgid \"Share your files in total privacy on %1\"\nmsgstr \"Partagez vos fichiers en toute confidentialité sur %1\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:13 themes/default/templates/partial/invitations.js.ep:9\nmsgid \"Show hidden invitations\"\nmsgstr \"Afficher les invitations cachées\"\n\n#: themes/default/templates/partial/render.js.ep:11\nmsgid \"Show zip content\"\nmsgstr \"Afficher le contenu du fichier zip\"\n\n#: themes/default/templates/layouts/default.html.ep:40 themes/default/templates/layouts/default.html.ep:73 themes/default/templates/login.html.ep:28 themes/default/templates/logout.html.ep:17\nmsgid \"Signin\"\nmsgstr \"Connexion\"\n\n#: lib/Lufi/Controller/Invitation.pm:283 themes/default/templates/invitations/exception.html.ep:16\nmsgid \"\"\n\"Sorry, the invitation doesn’t exist. Are you sure you are on the right URL?\"\nmsgstr \"\"\n\"Désolé, l’invitation n’existe pas. Êtes-vous sûr·e d’être sur la bonne URL ?\"\n\n#: themes/default/templates/index.html.ep:46\nmsgid \"Sorry, the uploading is currently disabled. Please try again later.\"\nmsgstr \"\"\n\"Désolé, l’envoi de fichier est actuellement désactivé. Veuillez réessayer \"\n\"plus tard.\"\n\n#: lib/Lufi/Controller/Files.pm:82\nmsgid \"Sorry, uploading is disabled.\"\nmsgstr \"Désolé, l’envoi de fichier est désactivé.\"\n\n#: themes/default/templates/invitations/exception.html.ep:7\nmsgid \"Sorry, your invitation has expired or has been deleted.\"\nmsgstr \"Désolé, votre invitation a expiré ou a été supprimée.\"\n\n#. ($invit->ldap_user_mail)\n#: lib/Lufi/Controller/Files.pm:122\nmsgid \"\"\n\"Sorry, your invitation has expired or has been deleted. Please contact %1 to \"\n\"have another invitation.\"\nmsgstr \"\"\n\"Désolé, votre invitation a expiré ou a été supprimée. Veuillez contacter %1 \"\n\"pour obtenir une nouvelle invitation.\"\n\n#. ($invitation->ldap_user_mail)\n#: lib/Lufi/Controller/Invitation.pm:276\nmsgid \"The URLs of your files have been sent by email to %1.\"\nmsgstr \"Les URL de vos fichiers ont été envoyées par courriel à %1.\"\n\n#: themes/default/templates/about.html.ep:7\nmsgid \"\"\n\"The administrator can only see the file's name, its size and its mimetype \"\n\"(what kind of file it is: video, text, etc.).\"\nmsgstr \"\"\n\"L’administrateur ne peut voir que le nom du fichier, sa taille et son type \"\n\"mime (son type de fichier : vidéo, texte, etc.).\"\n\n#: lib/Lufi/Controller/Mail.pm:53\nmsgid \"\"\n\"The body of the mail must contain at least one URL pointing to a file hosted \"\n\"on this instance.\"\nmsgstr \"\"\n\"Le corps du mail doit contenir au moins une URL pointant vers un fichier \"\n\"hébergé sur cette instance.\"\n\n#: themes/default/templates/partial/files.js.ep:11\nmsgid \"The data has been successfully imported.\"\nmsgstr \"Les données ont été importées avec succès.\"\n\n#: lib/Lufi/Controller/Mail.pm:73\nmsgid \"The email body can't be empty.\"\nmsgstr \"Le corps du mail ne peut être vide.\"\n\n#: lib/Lufi/Controller/Mail.pm:72\nmsgid \"The email subject can't be empty.\"\nmsgstr \"Le sujet du mail ne peut être vide.\"\n\n#. ($expire_at, $max_expire_at)\n#: lib/Lufi/Controller/Invitation.pm:51\nmsgid \"The expiration delay (%1) is not between 1 and %2 days.\"\nmsgstr \"Le délai d’expiration (%1) n’est pas compris entre 1 et %2 jours.\"\n\n#: lib/Lufi/Controller/Files.pm:468\nmsgid \"The file has already been deleted\"\nmsgstr \"Le fichier a déjà été supprimé\"\n\n#: themes/default/templates/about.html.ep:6\nmsgid \"\"\n\"The files uploaded on a Lufi instance are encrypted before the upload to the \"\n\"server: the administrator of the server can not see the file's content.\"\nmsgstr \"\"\n\"Les fichiers envoyés sur une instance de Lufi sont chiffrés avant l’envoi au \"\n\"serveur : l’administrateur du serveur ne peut pas voir le contenu de vos \"\n\"fichiers.\"\n\n#. (join(', ', @bad)\n#: lib/Lufi/Controller/Mail.pm:68\nmsgid \"The following email addresses are not valid: %1\"\nmsgstr \"Les adresses mail suivantes ne sont pas valides : %1\"\n\n#. ($guest_mail)\n#: lib/Lufi/Controller/Invitation.pm:48\nmsgid \"The guest email address (%1) is unvalid.\"\nmsgstr \"L’adresse courriel de l’invité·e (%1) est invalide.\"\n\n#. ($i->token, $i->guest_mail)\n#: lib/Lufi/Controller/Invitation.pm:150\nmsgid \"\"\n\"The invitation %1 can’t be resent: %2 has already sent files.<br>Please \"\n\"create a new invitation.\"\nmsgstr \"\"\n\"L’invitation %1 ne peut pas être renvoyée : %2 a déjà envoyé des fichiers.\"\n\"<br>Veuillez créer une nouvelle invitation.\"\n\n#. ($i->token)\n#: lib/Lufi/Controller/Invitation.pm:130\nmsgid \"The invitation %1 has been deleted.\"\nmsgstr \"L’invitation %1 a été supprimée.\"\n\n#. (stash('user_mail')\n#: themes/default/templates/invitations/invite.html.ep:34\nmsgid \"The invitation mail will be send from your email address (%1).\"\nmsgstr \"\"\n\"Le courriel d’invitation sera envoyé de votre adresse de courriel (%1).\"\n\n#: themes/default/templates/partial/index.js.ep:16\nmsgid \"The link(s) has been copied to your clipboard\"\nmsgstr \"Le(s) lien(s) a/ont été copié dans votre presse-papier\"\n\n#. (stash('invitation')\n#: themes/default/templates/index.html.ep:30\nmsgid \"\"\n\"The link(s) of your file(s) will automatically be sent by mail to %1 (%2)\"\nmsgstr \"\"\n\"Les liens de vos fichiers seront automatiquement envoyés par courriel à %1 \"\n\"(%2)\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:11\nmsgid \"The links of your file(s) will automatically be sent by mail to %1.\"\nmsgstr \"\"\n\"Les liens de vos fichiers seront automatiquement envoyés par courriel à %1.\"\n\n#: lib/Lufi/Controller/Mail.pm:97\nmsgid \"The mail has been sent.\"\nmsgstr \"Le mail a été envoyé.\"\n\n#: themes/default/templates/about.html.ep:15\nmsgid \"\"\n\"The original (and only for now) author is <a href=\\\"https://fiat-tux.fr\\\" \"\n\"class=\\\"classic\\\">Luc Didry</a>.\"\nmsgstr \"\"\n\"L’auteur originel (et pour l’instant, le seul) est <a href=\\\"https://fiat-\"\n\"tux.fr\\\" class=\\\"classic\\\">Luc Didry</a>.\"\n\n#: lib/Lufi/Controller/Files.pm:236\nmsgid \"\"\n\"The server was unable to find the file record to add your file part to. \"\n\"Please, contact the administrator.\"\nmsgstr \"\"\n\"Le serveur a été incapable de retrouver l’enregistrement du fichier auquel \"\n\"ajouter votre fragment de fichier. Veuillez contacter l’administrateur.\"\n\n#: lib/Lufi/Controller/Files.pm:295\nmsgid \"\"\n\"This file has been deactivated by the admins. Contact them to know why.\"\nmsgstr \"\"\n\"The fichier a été désactivé par les administrateurs ou administratrices. \"\n\"Veuillez les contacter pour savoir pourquoi.\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:46 themes/default/templates/partial/invitations.js.ep:6\nmsgid \"This invitation is normally hidden\"\nmsgstr \"Cette invitation est normalement cachée\"\n\n#. (stash('expires')\n#: themes/default/templates/invitations/invite.mail.ep:13\nmsgid \"This invitation is valid until %1.\"\nmsgstr \"Cette invitation est valide jusqu’au %1.\"\n\n#: themes/default/templates/delays.html.ep:10\nmsgid \"\"\n\"This server sets limitations according to the file size. The expiration \"\n\"delay of your file will be the minimum between what you choose and the \"\n\"following limitations:\"\nmsgstr \"\"\n\"Ce serveur impose des limitations selon la taille des fichiers. Le délai \"\n\"d’expiration de votre fichier sera le minimum entre ce que vous avez choisi \"\n\"et les limites suivantes :\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:16\nmsgid \"Toggle visibility\"\nmsgstr \"Inverser la visibilité\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:25\nmsgid \"URL\"\nmsgstr \"URL\"\n\n#: themes/default/templates/partial/index.js.ep:17\nmsgid \"Unable to copy the link(s) to your clipboard\"\nmsgstr \"Impossible de copier le(s) lien(s) dans votre presse-papier\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:439\nmsgid \"\"\n\"Unable to get counter for %1. The file does not exists. It will be removed \"\n\"from your localStorage.\"\nmsgstr \"\"\n\"Impossible de récupérer le compteur pour %1. Le fichier n’existe pas. Il va \"\n\"être supprimé de votre localStorage.\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:429\nmsgid \"Unable to get counter for %1. The token is invalid.\"\nmsgstr \"Impossible de récupérer le compteur pour %1. Le jeton est invalide.\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:449\nmsgid \"Unable to get counter for %1. You are not authenticated.\"\nmsgstr \"\"\n\"Impossible de récupérer le compteur pour %1. Vous n’êtes pas connecté·e.\"\n\n#: themes/default/templates/layouts/default.html.ep:33 themes/default/templates/layouts/default.html.ep:66\nmsgid \"Upload files\"\nmsgstr \"Envoyer des fichiers\"\n\n#: themes/default/templates/index.html.ep:145\nmsgid \"Upload generated zip file\"\nmsgstr \"Envoyer le fichier zip généré\"\n\n#: themes/default/templates/files.html.ep:31\nmsgid \"Uploaded at\"\nmsgstr \"Envoyé le\"\n\n#: themes/default/templates/index.html.ep:153\nmsgid \"Uploaded files\"\nmsgstr \"Fichiers envoyés\"\n\n#: themes/default/templates/partial/index.js.ep:30\nmsgid \"Websocket communication error\"\nmsgstr \"Erreur de communication WebSocket\"\n\n#: themes/default/templates/about.html.ep:3\nmsgid \"What is Lufi?\"\nmsgstr \"Qu’est-ce que Lufi ?\"\n\n#: themes/default/templates/about.html.ep:14\nmsgid \"Who wrote this software?\"\nmsgstr \"Qui a écrit ce logiciel ?\"\n\n#: themes/default/templates/partial/index.js.ep:13\nmsgid \"XXX file has been added to upload queue.\"\nmsgstr \"Le fichier XXX a été ajouté à la file d’envoi.\"\n\n#: themes/default/templates/invitations/invite.html.ep:30\nmsgid \"\"\n\"You can invite someone to send you files through this Lufi instance even if \"\n\"they don’t have an account on it.\"\nmsgstr \"\"\n\"Vous pouvez inviter une personne à vous envoyer des fichiers via cette \"\n\"instance Lufi même si cette personne n’y a pas de compte.\"\n\n#: themes/default/templates/about.html.ep:11\nmsgid \"\"\n\"You can see the list of your files by clicking on the \\\"My files\\\" link at \"\n\"the top right of this page.\"\nmsgstr \"\"\n\"Vous pouvez voir la liste de vos fichiers en cliquant sur le lien « Mes \"\n\"fichiers » en haut à droite de cette page.\"\n\n#: lib/Lufi/Controller/Mail.pm:42\nmsgid \"You can't add URLs that are not related to this instance.\"\nmsgstr \"Vous ne pouvez pas ajouter d’URL non relatives à cette instance.\"\n\n#: themes/default/templates/about.html.ep:8\nmsgid \"\"\n\"You don't need to register yourself to upload files but be aware that, for \"\n\"legal reasons, your IP address will be stored when you send a file. Don't \"\n\"panic, this is normally the case for all sites on which you send files.\"\nmsgstr \"\"\n\"Vous n’avez pas besoin de vous enregistrer pour envoyer des fichiers mais \"\n\"notez que, pour des raisons légales, votre adresse IP sera enregistrée quand \"\n\"vous envoyez un fichier. Ne paniquez pas, c’est normalement le cas pour tous \"\n\"les sites où vous envoyez des fichiers.\"\n\n#: themes/default/templates/partial/render.js.ep:10\nmsgid \"\"\n\"You don't seem to have a key in your URL. You won't be able to decrypt the \"\n\"file. Download canceled.\"\nmsgstr \"\"\n\"Il semble que vous n’ayez pas de clé dans votre URL. Vous ne serez pas \"\n\"capable de déchiffrer le fichier. Téléchargement annulé.\"\n\n#: themes/default/templates/partial/render.js.ep:7\nmsgid \"\"\n\"You have attempted to leave this page. The download will be canceled. Are \"\n\"you sure?\"\nmsgstr \"\"\n\"Vous essayez de quitter la page. Le téléchargement sera annulé. Êtes-vous \"\n\"sûr(e) ?\"\n\n#: themes/default/templates/partial/index.js.ep:14\nmsgid \"\"\n\"You have attempted to leave this page. The upload will be canceled. Are you \"\n\"sure?\"\nmsgstr \"\"\n\"Vous essayez de quitter la page. L’envoi sera annulé. Êtes-vous sûr(e) ?\"\n\n#: themes/default/templates/logout.html.ep:14\nmsgid \"You have been successfully logged out.\"\nmsgstr \"Vous avez été déconnecté·e avec succès.\"\n\n#: lib/Lufi/Controller/Mail.pm:71\nmsgid \"You must give email addresses.\"\nmsgstr \"Vous devez envoyer des adresses mail.\"\n\n#: themes/default/templates/index.html.ep:38\nmsgid \"\"\n\"Your browser does not have enough entropy to generate a strong encryption \"\n\"key. Please wait (it's better if you do things on your computer while \"\n\"waiting).\"\nmsgstr \"\"\n\"Votre navigateur n’a pas assez d’entropie pour générer une clé de \"\n\"chiffrement forte. Veuillez attendre (il est préférable que vous fassiez \"\n\"quelque chose sur votre ordinateur en attendant).\"\n\n#. (format_bytes($json->{size})\n#: lib/Lufi/Controller/Files.pm:95\nmsgid \"Your file is too big: %1 (maximum size allowed: %2)\"\nmsgstr \"\"\n\"Votre fichier est trop volumineux : %1 (la taille maximum autorisée est %2)\"\n\n#: lib/Lufi/Controller/Files.pm:351\nmsgid \"Your password is not valid. Please refresh the page to retry.\"\nmsgstr \"\"\n\"Votre mot de passe est invalide. Veuillez rafraîchir la page pour réessayer.\"\n\n#: themes/default/templates/partial/render.js.ep:12\nmsgid \"Zip content:\"\nmsgstr \"Contenu de l’archive zip :\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:20\nmsgid \"between %1 and %2, the file will be kept %3 day(s).\"\nmsgstr \"entre %1 et %2, le fichier sera conservé %3 jour(s).\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:22\nmsgid \"between %1 and %2, the file will be kept forever.\"\nmsgstr \"entre %1 et %2, le fichier sera conservé indéfiniment.\"\n\n#: themes/default/templates/partial/mail.js.ep:42\nmsgid \"deadline: \"\nmsgstr \"dernier délai pour télécharger : \"\n\n#: themes/default/templates/partial/invitations.js.ep:5\nmsgid \"expires on XXX\"\nmsgstr \"expire le XXX\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:26\nmsgid \"for %1 and more, the file will be kept %2 day(s)\"\nmsgstr \"pour %1 et plus, le fichier sera conservé %2 jour(s)\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:28\nmsgid \"for %1 and more, the file will be kept forever.\"\nmsgstr \"pour %1 et plus, le fichier sera conservé indéfiniment.\"\n\n#: themes/default/templates/index.html.ep:3\nmsgid \"no time limit\"\nmsgstr \"Pas de délai d’expiration\"\n\n#: themes/default/templates/index.html.ep:124\nmsgid \"or\"\nmsgstr \"ou\"\n\n#. ($e->{name}, format_bytes($e->{size})\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:12\nmsgid \"— %1 (%2), that will expire on %3\"\nmsgstr \"— %1 (%2), qui expirera le %3\"\n\n#: themes/default/templates/about.html.ep:18\nmsgid \"Get the source code on <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi\\\" class=\\\"classic\\\">the official repository</a> or on its <a href=\\\"https://github.com/ldidry/lufi\\\" class=\\\"classic\\\">Github mirror</a>\"\nmsgstr \"\"\n\"Récupérez le code source sur <a href=\\\"https://framagit.org/fiat-tux/\"\n\"hat-softwares/lufi\\\" class=\\\"classic\\\">le dépôt officiel</a> ou sur son <a \"\n\"href=\\\"https://github.com/ldidry/lufi\\\" class=\\\"classic\\\">miroir Github</a>\"\n\n#: themes/default/templates/partial/index.js.ep:24\nmsgid \"File uploaded\"\nmsgstr \"Fichier envoyé\"\n\n#: themes/default/templates/partial/render.js.ep:9\nmsgid \"File downloaded\"\nmsgstr \"Fichier téléchargé\"\n\n#: themes/default/templates/about.html.ep:17\nmsgid \"As Lufi is a free software licensed under of the terms of the <a href=\\\"https://gnu.org/licenses/agpl.html\\\" class=\\\"classic\\\">AGPLv3</a>, you can install it on you own server. Have a look on the <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi/wikis/home\\\" class=\\\"classic\\\">Wiki</a> for the procedure.\"\nmsgstr \"\"\n\"Comme Lufi est un logiciel libre soumis aux termes de la license <a href=\\\"\"\n\"https://gnu.org/licenses/agpl.html\\\" class=\\\"classic\\\">AGPLv3</a>, vous \"\n\"pouvez l’installer sur votre propre serveur. Veuillez consulter le <a href=\\\"\"\n\"https://framagit.org/fiat-tux/hat-softwares/lufi/wikis/home\\\" class=\\\"\"\n\"classic\\\">Wiki</a> pour voir la procédure.\"\n\n#: themes/default/templates/about.html.ep:20\nmsgid \"Version\"\nmsgstr \"Version\"\n\n#. (sprintf('<a href=\"https://framagit.org/fiat-tux/hat-softwares/lufi/-/releases/%s\" class=\"classic\">%s</a>', stash('version')\n#: themes/default/templates/about.html.ep:21\nmsgid \"Latest tag of this instance: %1\"\nmsgstr \"Dernier tag de cette instance : %1\"\n\n#. (sprintf('<a href=\"https://framagit.org/fiat-tux/hat-softwares/lufi/-/commit/%s\" class=\"classic\">%s</a>', stash('version')\n#: themes/default/templates/about.html.ep:22\nmsgid \"Latest commit of this instance: %1\"\nmsgstr \"Dernier commit de cette instance : %1\"\n\n#: themes/default/templates/partial/render.js.ep:13\nmsgid \"Unable to download the file: too much unsuccessful attempts to open a websocket. Please, contact the administrator.\"\nmsgstr \"\"\n\"Impossible de télécharger le fichier : trop de tentatives infructueuses d’\"\n\"ouverture d’une websocket. Veuillez contacter l’administrateur.\"\n\n#. ($i->token, $c->current_user->{username})\n#: lib/Lufi/Controller/Invitation.pm:187\nmsgid \"The invitation %1 can’t be resent: it wasn’t created by you (%2).\"\nmsgstr \"\"\n\"L'invitation %1 ne peut être supprimée : elle n'a pas été créée par vous \"\n\"(%2).\"\n\n#. ($i->token, $c->current_user->{username})\n#: lib/Lufi/Controller/Invitation.pm:136\nmsgid \"The invitation %1 can’t be deleted: it wasn’t created by you (%2).\"\nmsgstr \"\"\n\"L'invitation %1 ne peut être supprimée : elle n'a pas été créée par vous \"\n\"(%2).\"\n\n#. ($orig_uri)\n#: lib/Lufi/Controller/Mail.pm:43 lib/Lufi/Controller/Mail.pm:59\nmsgid \"You can't add URLs that are not related to this instance (%1).\"\nmsgstr \"\"\n\"Vous ne pouvez pas ajouter des URL qui ne sont pas liées à cette instance \"\n\"(%1).\"\n"
  },
  {
    "path": "themes/default/lib/Lufi/I18N/hr.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\\n\"\n\"PO-Revision-Date: 2022-10-20 18:33+0000\\n\"\n\"Last-Translator: Milo Ivir <mail@milotype.de>\\n\"\n\"Language-Team: Croatian <https://weblate.framasoft.org/projects/lufi/\"\n\"default-theme/hr/>\\n\"\n\"Language: hr\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n\"\n\"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\\n\"\n\"X-Generator: Weblate 4.14.1\\n\"\n\n#. ($delay)\n#. (max_delay)\n#: themes/default/templates/index.html.ep:56 themes/default/templates/index.html.ep:65 themes/default/templates/index.html.ep:66\nmsgid \"%1 days\"\nmsgstr \"%1 dana\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:2\nmsgid \"%1 invites you to send him/her files\"\nmsgstr \"%1 te poziva da mu/joj pošalješ datoteke\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:6\nmsgid \"%1 invites you to send him/her files through Lufi.\"\nmsgstr \"%1 te poziva da mu/joj pošalješ datoteke putem Lufia.\"\n\n#. (stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:4\nmsgid \"%1 sent you files\"\nmsgstr \"%1 ti je poslao/la datoteke\"\n\n#. (stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:8\nmsgid \"%1 used your invitation to send you files:\"\nmsgstr \"%1 je koristio/la tvoju pozivnicu za slanje datoteka:\"\n\n#: lib/Lufi/Controller/Invitation.pm:172 lib/Lufi/Controller/Invitation.pm:85 themes/default/templates/invitations/my_invitations.html.ep:51 themes/default/templates/invitations/my_invitations.html.ep:52 themes/default/templates/invitations/my_invitations.html.ep:53 themes/default/templates/invitations/notification_files_sent.mail.ep:12\nmsgid \"%A %d %B %Y at %T\"\nmsgstr \"%A, %d. %m. %Y. u %T\"\n\n#: themes/default/templates/partial/index.js.ep:28\nmsgid \"(max size: XXX)\"\nmsgstr \"(maks. veličina: XXX)\"\n\n#: themes/default/templates/index.html.ep:5\nmsgid \"1 year\"\nmsgstr \"1 godina\"\n\n#: themes/default/templates/index.html.ep:4 themes/default/templates/index.html.ep:65\nmsgid \"24 hours\"\nmsgstr \"24 sata\"\n\n#: themes/default/templates/partial/mail.js.ep:40\nmsgid \":\"\nmsgstr \":\"\n\n#: themes/default/templates/render.html.ep:42\nmsgid \"Abort\"\nmsgstr \"Prekini\"\n\n#: themes/default/templates/layouts/default.html.ep:53 themes/default/templates/layouts/default.html.ep:86\nmsgid \"About\"\nmsgstr \"O\"\n\n#: themes/default/templates/index.html.ep:107\nmsgid \"Add a password to file(s)\"\nmsgstr \"Dodaj datotekama lozinku\"\n\n#: themes/default/templates/mail.html.ep:16\nmsgid \"Adding URLs not related to this Lufi instance to the mail body or subject is prohibited.\"\nmsgstr \"\"\n\"Dodavanje URL-ova koji nisu povezani s ovom LUFI instancom, sa sadržajem ili \"\n\"predmetom e-maila je zabranjeno.\"\n\n#: themes/default/templates/partial/invitations.js.ep:3\nmsgid \"Are you sure you want to delete the selected invitations?\"\nmsgstr \"Stvarno želiš izbrisati odabranu pozivnicu?\"\n\n#: themes/default/templates/partial/invitations.js.ep:4\nmsgid \"Are you sure you want to resend the invitation mail for the selected invitations?\"\nmsgstr \"Stvarno želiš ponovo poslati e-mail pozivnicu za odabrane pozivnice?\"\n\n#: themes/default/templates/about.html.ep:17\nmsgid \"As Lufi is a free software licensed under of the terms of the <a href=\\\"https://gnu.org/licenses/agpl.html\\\" class=\\\"classic\\\">AGPLv3</a>, you can install it on you own server. Have a look on the <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi/wikis/home\\\" class=\\\"classic\\\">Wiki</a> for the procedure.\"\nmsgstr \"\"\n\"Budući da je Lufi slobodan softver licenciran pod <a href=\\\"https://gnu.org/\"\n\"licenses/agpl.html\\\" class=\\\"classic\\\">AGPLv3</a> uvjetima, možeš ga \"\n\"instalirati na vlastiti poslužitelj. Pogledaj <a href=\\\"https://framagit.org/\"\n\"fiat-tux/hat-softwares/lufi/wikis/home\\\" class=\\\"classic\\\">Wiki</a> za \"\n\"postupak.\"\n\n#. (stash('nbslices')\n#: themes/default/templates/partial/render.js.ep:10\nmsgid \"Asking for file part XX1 of %1\"\nmsgstr \"Traži se dio datoteke XX1 od %1\"\n\n#: themes/default/templates/about.html.ep:23\nmsgid \"Back to homepage\"\nmsgstr \"Natrag na web-stranicu\"\n\n#: lib/Lufi/Controller/Mail.pm:26\nmsgid \"Bad CSRF token!\"\nmsgstr \"Neispravan CSRF token!\"\n\n#: lib/Lufi/Controller/Auth.pm:27 lib/Lufi/Controller/Auth.pm:49\nmsgid \"Bad CSRF token.\"\nmsgstr \"Neispravan CSRF token.\"\n\n#: themes/default/templates/partial/render.js.ep:5\nmsgid \"Click here to refresh the page and restart the download.\"\nmsgstr \"\"\n\"Pritisni ovdje za aktualiziranje stranice i ponovno pokretanje preuzimanja.\"\n\n#: themes/default/templates/invitations/invite.mail.ep:8\nmsgid \"Click on the following URL to upload files on Lufi:\"\nmsgstr \"Pritisni sljedeći URL za prijenos datoteka na Lufi:\"\n\n#: themes/default/templates/index.html.ep:126\nmsgid \"Click to open the file browser\"\nmsgstr \"Pritisni za otvaranje preglednika datoteka\"\n\n#: themes/default/templates/delays.html.ep:42 themes/default/templates/invitations/my_invitations.html.ep:80\nmsgid \"Close\"\nmsgstr \"Zatvori\"\n\n#: themes/default/templates/mail.html.ep:23\nmsgid \"Comma-separated email addresses\"\nmsgstr \"Zarezom odvojene e-mail adrese\"\n\n#: themes/default/templates/index.html.ep:140\nmsgid \"Compressing zip file…\"\nmsgstr \"Komprimiranje zip datoteke …\"\n\n#: themes/default/templates/partial/index.js.ep:15\nmsgid \"Copy all links to clipboard\"\nmsgstr \"Kopiraj sve poveznice u međuspremnik\"\n\n#: themes/default/templates/partial/index.js.ep:18\nmsgid \"Copy to clipboard\"\nmsgstr \"Kopiraj u međuspremnik\"\n\n#: lib/Lufi/Controller/Files.pm:501\nmsgid \"Could not delete the file. You are not authenticated.\"\nmsgstr \"Nije moguće izbrisati datoteku. Nisi autentificiran/a.\"\n\n#: lib/Lufi/Controller/Files.pm:483\nmsgid \"Could not find the file. Are you sure of the URL and the token?\"\nmsgstr \"Nije moguće pronaći datoteku. Jesu li URL i token ispravni?\"\n\n#: lib/Lufi/Controller/Files.pm:394\nmsgid \"Could not find the file. Are you sure of the URL?\"\nmsgstr \"Nije moguće pronaći datoteku. Je li URL ispravan?\"\n\n#: themes/default/templates/files.html.ep:29\nmsgid \"Counter\"\nmsgstr \"Brojač\"\n\n#: themes/default/templates/index.html.ep:100\nmsgid \"Create a zip archive with the files before uploading?\"\nmsgstr \"Stvoriti zip arhivu s datotekama prije prijenosa?\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:26\nmsgid \"Created at\"\nmsgstr \"Stvoreno\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:14\nmsgid \"Delete\"\nmsgstr \"Izbriši\"\n\n#: themes/default/templates/files.html.ep:30 themes/default/templates/index.html.ep:90\nmsgid \"Delete at first download?\"\nmsgstr \"Izbrisati pri prvom preuzimanju?\"\n\n#: themes/default/templates/files.html.ep:19\nmsgid \"Delete selected files\"\nmsgstr \"Izbriši odabrane datoteke\"\n\n#: themes/default/templates/files.html.ep:33 themes/default/templates/partial/index.js.ep:19\nmsgid \"Deletion link\"\nmsgstr \"Poveznica za brisanje\"\n\n#: themes/default/templates/delays.html.ep:9\nmsgid \"Don't worry: if a user begins to download the file before the expiration and the download ends after the expiration, he will be able to get the file.\"\nmsgstr \"\"\n\"Ne brini: ako osoba počne preuzimati datoteku prije isteka i preuzimanje \"\n\"završi nakon isteka, ona će moći dobiti datoteku.\"\n\n#: themes/default/templates/partial/index.js.ep:21 themes/default/templates/render.html.ep:28\nmsgid \"Download\"\nmsgstr \"Preuzmi\"\n\n#: themes/default/templates/partial/render.js.ep:4\nmsgid \"Download aborted.\"\nmsgstr \"Preuzimanje je prekinuto.\"\n\n#: themes/default/templates/files.html.ep:28 themes/default/templates/partial/index.js.ep:20\nmsgid \"Download link\"\nmsgstr \"Poveznica za preuzimanje\"\n\n#: themes/default/templates/about.html.ep:10\nmsgid \"Drag and drop files in the appropriate area or use the traditional way to send files and the files will be chunked, encrypted and sent to the server. You will get two links per file: a download link, that you give to the people you want to share the file with and a deletion link, allowing you to delete the file whenever you want.\"\nmsgstr \"\"\n\"Povuci i ispusti datoteke u odgovarajućem području ili koristi tradicionalni \"\n\"način slanja datoteka. Datoteke će se rastaviti na dijelove, šifrirat će se \"\n\"te će se poslati na poslužitelj. Za svaku datoteku ćeš dobiti dvije \"\n\"poveznice: poveznicu za preuzimanje koju šalješ ljudima s kojima želiš \"\n\"dijeliti datoteku i poveznicu za brisanje koja omogućuje brisanje datoteke \"\n\"kad god želiš.\"\n\n#: themes/default/templates/index.html.ep:122\nmsgid \"Drop files here\"\nmsgstr \"Ispusti datoteke ovdje\"\n\n#: themes/default/templates/invitations/invite.html.ep:40\nmsgid \"Email address of your guest\"\nmsgstr \"E-mail adrese tvog gosta\"\n\n#: themes/default/templates/mail.html.ep:39\nmsgid \"Email body\"\nmsgstr \"Tekst e-maila\"\n\n#: themes/default/templates/mail.html.ep:31\nmsgid \"Email subject\"\nmsgstr \"Predmet e-maila\"\n\n#: themes/default/templates/mail.html.ep:25 themes/default/templates/mail.html.ep:27\nmsgid \"Emails\"\nmsgstr \"E-mailovi\"\n\n#: themes/default/templates/partial/index.js.ep:22\nmsgid \"Encrypting part XX1 of XX2\"\nmsgstr \"Šifrara se dio XX1 od XX2\"\n\n#: lib/Lufi/Controller/Files.pm:283\nmsgid \"Error: the file existed but was deleted.\"\nmsgstr \"Greška: datoteka je postojala ali je izbrisana.\"\n\n#: lib/Lufi/Controller/Files.pm:363\nmsgid \"Error: the file has not been sent entirely.\"\nmsgstr \"Greška: datoteka nije u potpunosti poslana.\"\n\n#: lib/Lufi/Controller/Files.pm:373\nmsgid \"Error: unable to find the file. Are you sure of your URL?\"\nmsgstr \"Greška: nije moguće pronaći datoteku. Je li tvoj URL ispravan?\"\n\n#: themes/default/templates/partial/index.js.ep:23\nmsgid \"Expiration:\"\nmsgstr \"Istek:\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:27\nmsgid \"Expire at\"\nmsgstr \"Isteču\"\n\n#: themes/default/templates/files.html.ep:32\nmsgid \"Expires at\"\nmsgstr \"Isteče\"\n\n#: themes/default/templates/files.html.ep:12\nmsgid \"Export localStorage data\"\nmsgstr \"Izvezi podatke lokalnog spremišta\"\n\n#: lib/Lufi/Controller/Files.pm:465\nmsgid \"File deleted\"\nmsgstr \"Datoteka je izbrisana\"\n\n#: themes/default/templates/partial/render.js.ep:9\nmsgid \"File downloaded\"\nmsgstr \"Datoteka je preuzeta\"\n\n#: themes/default/templates/files.html.ep:27\nmsgid \"File name\"\nmsgstr \"Ime datoteke\"\n\n#: themes/default/templates/partial/index.js.ep:24\nmsgid \"File uploaded\"\nmsgstr \"Datoteka je prenesena\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:61\nmsgid \"Files\"\nmsgstr \"Datoteke\"\n\n#: themes/default/templates/index.html.ep:80\nmsgid \"Files deleted at first download\"\nmsgstr \"Datoteke su izbrisane pri prvom preuzimanju\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:28\nmsgid \"Files sent at\"\nmsgstr \"Datoteke su poslane na\"\n\n#: themes/default/templates/partial/invitations.js.ep:8\nmsgid \"Files sent in invitation XX1 by XX2\"\nmsgstr \"Datoteke su poslane u pozivnici XX1 od XX2\"\n\n#: themes/default/templates/partial/render.js.ep:8\nmsgid \"Get the file\"\nmsgstr \"Preuzmi datoteku\"\n\n#: themes/default/templates/about.html.ep:18\nmsgid \"Get the source code on <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi\\\" class=\\\"classic\\\">the official repository</a> or on its <a href=\\\"https://github.com/ldidry/lufi\\\" class=\\\"classic\\\">Github mirror</a>\"\nmsgstr \"\"\n\"Preuzmi izvorni kod sa <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/\"\n\"lufi\\\" class=\\\"classic\\\">službenog repozitorija</a> ili s njegovog <a href=\"\n\"\\\"https://github.com/ldidry/lufi\\\" class=\\\"classic\\\">Github zrcala</a>\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:24\nmsgid \"Guest mail\"\nmsgstr \"E-mail adrese gosta\"\n\n#. (ucfirst(stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:6\nmsgid \"Hello %1,\"\nmsgstr \"Zdravo %1,\"\n\n#: themes/default/templates/invitations/invite.mail.ep:4\nmsgid \"Hello,\"\nmsgstr \"Zdravo,\"\n\n#: themes/default/templates/partial/mail.js.ep:35\nmsgid \"Hello,\\\\n\\\\nHere's some files I want to share with you:\\\\n\"\nmsgstr \"\"\n\"Zdravo,\\\\n\"\n\"\\\\n\"\n\"Evo par datoteka koje s tobom želim dijeliti:\\\\n\"\n\n#: themes/default/templates/mail.html.ep:35\nmsgid \"Here's some files\"\nmsgstr \"Evo par datoteka\"\n\n#: themes/default/templates/partial/invitations.js.ep:7\nmsgid \"Hide hidden invitations\"\nmsgstr \"Sakrij skrivene pozivnice\"\n\n#: themes/default/templates/partial/index.js.ep:26\nmsgid \"Hit Enter, then Ctrl+C to copy all the download links\"\nmsgstr \"\"\n\"Za kopiranje svih poveznica za preuzimanje pritisni Enter, a zatim Ctrl+C\"\n\n#: themes/default/templates/partial/index.js.ep:25\nmsgid \"Hit Enter, then Ctrl+C to copy the download link\"\nmsgstr \"Za kopiranje poveznice za preuzimanje pritisni Enter, a zatim Ctrl+C\"\n\n#: themes/default/templates/about.html.ep:9\nmsgid \"How does it work?\"\nmsgstr \"Kako radi?\"\n\n#: themes/default/templates/invitations/invite.html.ep:46\nmsgid \"How many days would you like the invitation to be valid?\"\nmsgstr \"Koliko dana želiš da pozivnica valja?\"\n\n#: themes/default/templates/about.html.ep:16\nmsgid \"How to install the software on my server?\"\nmsgstr \"Kako instalirati softver na moj poslužitelj?\"\n\n#: themes/default/templates/about.html.ep:12\nmsgid \"How to report an illegal file?\"\nmsgstr \"Kako prijaviti ilegalnu sliku?\"\n\n#: themes/default/templates/delays.html.ep:8\nmsgid \"If you choose a delay, the file will be deleted after that delay.\"\nmsgstr \"Ako odabereš odgađanje, datoteka će se izbrisati nakon tog odgađanja.\"\n\n#: themes/default/templates/mail.html.ep:15\nmsgid \"If you send the mail from this server, the links will be sent to the server, which may lower your privacy protection.\"\nmsgstr \"\"\n\"Ako pošalješ e-mail s ovog poslužitelja, poveznice će se poslati na \"\n\"poslužitelj, što može smanjiti zaštitu tvoje privatnosti.\"\n\n#: themes/default/templates/files.html.ep:14\nmsgid \"Import localStorage data\"\nmsgstr \"Uvezi podatke lokalnog spremišta\"\n\n#: themes/default/templates/index.html.ep:53\nmsgid \"Important: more information on delays\"\nmsgstr \"Važno: više informacija o odgađanjima\"\n\n#: themes/default/templates/delays.html.ep:5\nmsgid \"Information about delays\"\nmsgstr \"Informacije o odgađanjima\"\n\n#: themes/default/templates/files.html.ep:18 themes/default/templates/invitations/my_invitations.html.ep:12\nmsgid \"Invert selection\"\nmsgstr \"Preokreni odabir\"\n\n#. ($i->guest_mail, $url)\n#: lib/Lufi/Controller/Invitation.pm:184\nmsgid \"Invitation resent to %1.<br> URL: %2\"\nmsgstr \"Pozivnica ponovo poslana za %1.<br> URL: %2\"\n\n#. ($invitation->guest_mail, $url)\n#: lib/Lufi/Controller/Invitation.pm:88\nmsgid \"Invitation sent to %1.<br> URL: %2\"\nmsgstr \"Pozivnica poslana za %1.<br> URL: %2\"\n\n#: themes/default/templates/invitations/invite.html.ep:27 themes/default/templates/layouts/default.html.ep:36 themes/default/templates/layouts/default.html.ep:69\nmsgid \"Invite a guest\"\nmsgstr \"Pozovi gosta\"\n\n#: themes/default/templates/partial/render.js.ep:6\nmsgid \"It seems that the key in your URL is incorrect. Please, verify your URL.\"\nmsgstr \"Čini se da je ključ u tvom URL-u netočan. Provjeri svoj URL.\"\n\n#: themes/default/templates/index.html.ep:12\nmsgid \"Javascript is disabled. You won't be able to use Lufi.\"\nmsgstr \"JavaScript je isključen. Nećeš moći koristiti Lufi.\"\n\n#: themes/default/templates/layouts/default.html.ep:44 themes/default/templates/layouts/default.html.ep:46 themes/default/templates/layouts/default.html.ep:77 themes/default/templates/layouts/default.html.ep:79\nmsgid \"Language\"\nmsgstr \"Jezik\"\n\n#. (sprintf('<a href=\"https://framagit.org/fiat-tux/hat-softwares/lufi/-/commit/%s\" class=\"classic\">%s</a>', stash('version')\n#: themes/default/templates/about.html.ep:22\nmsgid \"Latest commit of this instance: %1\"\nmsgstr \"Zadnja izmjena ove instance: %1\"\n\n#. (sprintf('<a href=\"https://framagit.org/fiat-tux/hat-softwares/lufi/-/releases/%s\" class=\"classic\">%s</a>', stash('version')\n#: themes/default/templates/about.html.ep:21\nmsgid \"Latest tag of this instance: %1\"\nmsgstr \"Zadnja oznaka ove instance: %1\"\n\n#: themes/default/templates/login.html.ep:15\nmsgid \"Login\"\nmsgstr \"Prijava\"\n\n#: themes/default/templates/layouts/default.html.ep:58 themes/default/templates/layouts/default.html.ep:91\nmsgid \"Logout\"\nmsgstr \"Odjava\"\n\n#: themes/default/templates/about.html.ep:4\nmsgid \"Lufi is a free (as in free speech) file hosting software.\"\nmsgstr \"Lufi je slobodan softver za hosting datoteka.\"\n\n#: themes/default/templates/partial/files.js.ep:12\nmsgid \"Lufi recently changed its way to store files information.\\\\n\\\\nNo files have been found in the new localStorage location but we found files in the old one.\\\\nDo you want to import those informations?\\\\n\\\\nPlease note that this is the only time that we will ask you this.\"\nmsgstr \"\"\n\"Lufi je nedavno promijenio način spremanja podataka datoteka.\\\\n\"\n\"\\\\n\"\n\"Nijedna datoteka nije pronađene u novom lokalnom spremištu, ali smo pronašli \"\n\"datoteke u starom.\\\\n\"\n\"Želiš li uvesti te podatke?\\\\n\"\n\"\\\\n\"\n\"Imaj na umu da jćemo te ovo pitati samo jedanput.\"\n\n#: themes/default/templates/files.html.ep:34\nmsgid \"Mail\"\nmsgstr \"Pošta\"\n\n#: themes/default/templates/files.html.ep:3 themes/default/templates/layouts/default.html.ep:34 themes/default/templates/layouts/default.html.ep:67\nmsgid \"My files\"\nmsgstr \"Moje datoteke\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:5 themes/default/templates/layouts/default.html.ep:37 themes/default/templates/layouts/default.html.ep:70\nmsgid \"My invitations\"\nmsgstr \"Moje pozivnice\"\n\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:17\nmsgid \"NB: this list includes the list of files that have already been sent to you.\"\nmsgstr \"\"\n\"Ne zaboravi: Ovaj popis uključuje popis datoteka koje su ti već poslane.\"\n\n#: themes/default/templates/index.html.ep:115\nmsgid \"Name of the zip file\"\nmsgstr \"Ime zip datoteke\"\n\n#. (format_bytes($json->{size})\n#: lib/Lufi/Controller/Files.pm:109\nmsgid \"No enough space available on the server for this file (size: %1).\"\nmsgstr \"\"\n\"Poslužitelj nema dovoljnu količinu memorije za ovu datoteku (veličina: %1).\"\n\n#: themes/default/templates/partial/files.js.ep:10 themes/default/templates/partial/index.js.ep:29\nmsgid \"No expiration delay\"\nmsgstr \"Bez odgađanja isteka\"\n\n#: themes/default/templates/files.html.ep:8\nmsgid \"Only the files sent with this browser will be listed here. This list is stored in localStorage: if you delete your localStorage data, you'll lose this list.\"\nmsgstr \"\"\n\"Ovdje će se navesti samo datoteke koje su poslane s ovim preglednikom. Ovaj \"\n\"se popis sprema u lokalno spremište: ako izbrišeš svoje podatke lokalnog \"\n\"spremišta, izgubit ćeš ovaj popis.\"\n\n#: themes/default/templates/index.html.ep:106 themes/default/templates/login.html.ep:21 themes/default/templates/render.html.ep:26\nmsgid \"Password\"\nmsgstr \"Lozinka\"\n\n#. (config('contact')\n#: themes/default/templates/about.html.ep:13\nmsgid \"Please contact the administrator: %1\"\nmsgstr \"Kontaktiraj administratora: %1\"\n\n#: themes/default/templates/render.html.ep:33\nmsgid \"Please wait while we are getting your file. We first need to download and decrypt all parts before you can get it.\"\nmsgstr \"\"\n\"Pričekaj dok preuzimamo tvoju datoteku. Prije nego što je možeš preuzeti, \"\n\"moramo je najprije preuzeti i dešifrirati sve dijelove.\"\n\n#: lib/Lufi/Controller/Auth.pm:38\nmsgid \"Please, check your credentials or your right to access this service: unable to authenticate.\"\nmsgstr \"\"\n\"Provjeri svoje podatke za prijavu ili pravo na pristup ovoj usluzi: \"\n\"neuspjela autentifikacija.\"\n\n#: themes/default/templates/about.html.ep:5\nmsgid \"Privacy\"\nmsgstr \"Privatnost\"\n\n#: themes/default/templates/files.html.ep:13\nmsgid \"Purge expired files from localStorage\"\nmsgstr \"Potpuno izbriši istekle datoteke iz lokalonog spremišta\"\n\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:20\nmsgid \"Regards,\"\nmsgstr \"Pozdrav,\"\n\n#: themes/default/templates/invitations/invite.mail.ep:15\nmsgid \"Regards.\"\nmsgstr \"Pozdrav.\"\n\n#: themes/default/templates/layouts/default.html.ep:31 themes/default/templates/layouts/default.html.ep:64\nmsgid \"Report file\"\nmsgstr \"Prijavi datoteku\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:15\nmsgid \"Resend invitation mail\"\nmsgstr \"Ponovo pošalji e-mail pozivnicu\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:9\nmsgid \"Rows in purple mean that the invitations have expired.\"\nmsgstr \"Ljubičasto obojeni redci znače da su pozivnice istekle.\"\n\n#: themes/default/templates/files.html.ep:9\nmsgid \"Rows in red mean that the files have expired and are no longer available.\"\nmsgstr \"\"\n\"Crveno obojeni redci znače da su datoteke istekle i da više nisu dostupne.\"\n\n#: themes/default/templates/partial/index.js.ep:27\nmsgid \"Send all links by email\"\nmsgstr \"Pošalji sve poveznice putem e-maila\"\n\n#: themes/default/templates/invitations/invite.html.ep:50\nmsgid \"Send the invitation\"\nmsgstr \"Pošalji pozivnicu\"\n\n#: themes/default/templates/mail.html.ep:47\nmsgid \"Send with this server\"\nmsgstr \"Pošalji s poslužiteljem\"\n\n#: themes/default/templates/mail.html.ep:49\nmsgid \"Send with your own mail software\"\nmsgstr \"Pošalji s vlastitim e-mail softverom\"\n\n#: themes/default/templates/partial/index.js.ep:30\nmsgid \"Sending part XX1 of XX2. Please, be patient, the progress bar can take a while to move.\"\nmsgstr \"\"\n\"Slanje dijela XX1 od xx2. Strpi se, može potrajati neko vrijeme dok se traka \"\n\"napretka pomakne.\"\n\n#. (url_for('/')\n#: themes/default/templates/partial/mail.js.ep:49\nmsgid \"Share your files in total privacy on %1\"\nmsgstr \"Dijeli svoje datoteke potpuno privatno na %1\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:13 themes/default/templates/partial/invitations.js.ep:9\nmsgid \"Show hidden invitations\"\nmsgstr \"Pokaži skrivene pozivnice\"\n\n#: themes/default/templates/partial/render.js.ep:12\nmsgid \"Show zip content\"\nmsgstr \"Pokaži sadržaj zip datoteke\"\n\n#: themes/default/templates/layouts/default.html.ep:40 themes/default/templates/layouts/default.html.ep:73 themes/default/templates/login.html.ep:28 themes/default/templates/logout.html.ep:17\nmsgid \"Signin\"\nmsgstr \"Registracija\"\n\n#: lib/Lufi/Controller/Invitation.pm:302 themes/default/templates/invitations/exception.html.ep:16\nmsgid \"Sorry, the invitation doesn’t exist. Are you sure you are on the right URL?\"\nmsgstr \"Žao nam je, pozivnica ne postoji. Je li se nalaziš na ispravom URL-u?\"\n\n#: themes/default/templates/index.html.ep:46\nmsgid \"Sorry, the uploading is currently disabled. Please try again later.\"\nmsgstr \"\"\n\"Žao nam je, mogućnost prijenosa je trenutačno isključeno. Pokušaj kasnije \"\n\"ponovo.\"\n\n#: lib/Lufi/Controller/Files.pm:82\nmsgid \"Sorry, uploading is disabled.\"\nmsgstr \"Žao nam je, mogućnost prijenosa je isključeno.\"\n\n#: themes/default/templates/invitations/exception.html.ep:7\nmsgid \"Sorry, your invitation has expired or has been deleted.\"\nmsgstr \"Žao nam je, tvoja je pozivnica istekla ili izbrisana.\"\n\n#. ($invit->ldap_user_mail)\n#: lib/Lufi/Controller/Files.pm:123\nmsgid \"Sorry, your invitation has expired or has been deleted. Please contact %1 to have another invitation.\"\nmsgstr \"\"\n\"Žao nam je, tvoja je pozivnica istekla ili izbrisana. Za dobivanje nove \"\n\"pozivnice kontaktiraj %1.\"\n\n#. ($invitation->ldap_user_mail)\n#: lib/Lufi/Controller/Invitation.pm:295\nmsgid \"The URLs of your files have been sent by email to %1.\"\nmsgstr \"URL-ovi tvojih datoteka poslani su e-mailom na %1.\"\n\n#: themes/default/templates/about.html.ep:7\nmsgid \"The administrator can only see the file's name, its size and its mimetype (what kind of file it is: video, text, etc.).\"\nmsgstr \"\"\n\"Administrator može vidjeti samo ime datoteke, njegovu veličinu i vrstu (\"\n\"video, tekst itd.).\"\n\n#: lib/Lufi/Controller/Mail.pm:67\nmsgid \"The body of the mail must contain at least one URL pointing to a file hosted on this instance.\"\nmsgstr \"\"\n\"Sadržaj e-maila mora sadržati barem jedan URL koji ukazuje na datoteku na \"\n\"ovoj instanci.\"\n\n#: themes/default/templates/partial/files.js.ep:11\nmsgid \"The data has been successfully imported.\"\nmsgstr \"Podaci su uspješno uvezeni.\"\n\n#: lib/Lufi/Controller/Mail.pm:87\nmsgid \"The email body can't be empty.\"\nmsgstr \"Sadržaj e-maila ne smije biti prazan.\"\n\n#: lib/Lufi/Controller/Mail.pm:86\nmsgid \"The email subject can't be empty.\"\nmsgstr \"Predmet e-maila ne smije biti prazan.\"\n\n#. ($expire_at, $max_expire_at)\n#: lib/Lufi/Controller/Invitation.pm:52\nmsgid \"The expiration delay (%1) is not between 1 and %2 days.\"\nmsgstr \"Odgađanja isteka (%1) nije između 1 i %2 dana.\"\n\n#: lib/Lufi/Controller/Files.pm:462\nmsgid \"The file has already been deleted\"\nmsgstr \"Datoteka je već izbrisana\"\n\n#: themes/default/templates/about.html.ep:6\nmsgid \"The files uploaded on a Lufi instance are encrypted before the upload to the server: the administrator of the server can not see the file's content.\"\nmsgstr \"\"\n\"Na Lufi instancu prenesene datoteke se šifriraju prije prenošenja na \"\n\"poslužitelj: administrator poslužitelja ne može vidjeti sadržaj datoteke.\"\n\n#. (join(', ', @bad)\n#: lib/Lufi/Controller/Mail.pm:82\nmsgid \"The following email addresses are not valid: %1\"\nmsgstr \"Sljedeće e-mail adrese nisu ispravne: %1\"\n\n#. ($guest_mail)\n#: lib/Lufi/Controller/Invitation.pm:49\nmsgid \"The guest email address (%1) is unvalid.\"\nmsgstr \"E-mail adresa gosta (%1) je neispravna.\"\n\n#. ($i->token, $c->current_user->{username})\n#: lib/Lufi/Controller/Invitation.pm:136\nmsgid \"The invitation %1 can’t be deleted: it wasn’t created by you (%2).\"\nmsgstr \"Pozivnica %1 se ne može izbrisati: nisi autor pozivnice ( %2).\"\n\n#. ($i->token, $i->guest_mail)\n#: lib/Lufi/Controller/Invitation.pm:163\nmsgid \"The invitation %1 can’t be resent: %2 has already sent files.<br>Please create a new invitation.\"\nmsgstr \"\"\n\"Pozivnica %1 se ne može ponovo poslati: %2 je već poslao datoteke.<br>Stvori \"\n\"novu pozivnicu.\"\n\n#. ($i->token, $c->current_user->{username})\n#: lib/Lufi/Controller/Invitation.pm:187\nmsgid \"The invitation %1 can’t be resent: it wasn’t created by you (%2).\"\nmsgstr \"Pozivnica %1 se ne može ponovo poslati: nisi autor pozivnice ( %2).\"\n\n#. ($i->token)\n#: lib/Lufi/Controller/Invitation.pm:134\nmsgid \"The invitation %1 has been deleted.\"\nmsgstr \"Pozivnica %1 je izbrisana.\"\n\n#. (stash('user_mail')\n#: themes/default/templates/invitations/invite.html.ep:34\nmsgid \"The invitation mail will be send from your email address (%1).\"\nmsgstr \"E-mail pozivnica će se poslati s tvoje e-mail adrese (%1).\"\n\n#: themes/default/templates/partial/index.js.ep:16\nmsgid \"The link(s) has been copied to your clipboard\"\nmsgstr \"Poveznice su kopirane u međuspremnik\"\n\n#. (stash('invitation')\n#: themes/default/templates/index.html.ep:30\nmsgid \"The link(s) of your file(s) will automatically be sent by mail to %1 (%2)\"\nmsgstr \"Poveznice tvojih datoteka će se automatski poslati e-mailom na %1 ( %2)\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:11\nmsgid \"The links of your file(s) will automatically be sent by mail to %1.\"\nmsgstr \"Poveznice tvojih datoteka će se automatski poslati e-mailom na %1.\"\n\n#: lib/Lufi/Controller/Mail.pm:111\nmsgid \"The mail has been sent.\"\nmsgstr \"Ovaj e-mail je poslan.\"\n\n#: themes/default/templates/about.html.ep:15\nmsgid \"The original (and only for now) author is <a href=\\\"https://fiat-tux.fr\\\" class=\\\"classic\\\">Luc Didry</a>.\"\nmsgstr \"\"\n\"Izvorni (i samo za sada) autor je <a href=\\\"https://fiat-tux.fr\\\" class=\"\n\"\\\"classic\\\">Luc Didry</a>.\"\n\n#: lib/Lufi/Controller/Files.pm:230\nmsgid \"The server was unable to find the file record to add your file part to. Please, contact the administrator.\"\nmsgstr \"\"\n\"Poslužitelj nije uspio pronaći zapis datoteke za dodavanje tvog dijela \"\n\"datoteke. Kontaktiraj administratora.\"\n\n#: lib/Lufi/Controller/Files.pm:289\nmsgid \"This file has been deactivated by the admins. Contact them to know why.\"\nmsgstr \"\"\n\"Administratori su deaktivirali ovu datoteku. Kontaktiraj ih i saznaj zašto.\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:46 themes/default/templates/partial/invitations.js.ep:6\nmsgid \"This invitation is normally hidden\"\nmsgstr \"Ovaj je poziv obično skriven\"\n\n#. (stash('expires')\n#: themes/default/templates/invitations/invite.mail.ep:13\nmsgid \"This invitation is valid until %1.\"\nmsgstr \"Ovaj je poziv valjan do %1.\"\n\n#: themes/default/templates/delays.html.ep:13\nmsgid \"This server sets limitations according to the file size. The expiration delay of your file will be the minimum between what you choose and the following limitations:\"\nmsgstr \"\"\n\"Ovaj poslužitelj postavlja ograničenja u skladu s veličinom datoteke. \"\n\"Odgađanja isteka tvoje datoteke bit će minimum između onoga što odabereš i \"\n\"sljedećih ograničenja:\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:16\nmsgid \"Toggle visibility\"\nmsgstr \"Uključi/isključi vidljivost\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:25\nmsgid \"URL\"\nmsgstr \"URL\"\n\n#: themes/default/templates/partial/index.js.ep:17\nmsgid \"Unable to copy the link(s) to your clipboard\"\nmsgstr \"Neuspjelo kopiranje poveznica u međuspremnik\"\n\n#: themes/default/templates/partial/render.js.ep:13\nmsgid \"Unable to download the file: too much unsuccessful attempts to open a websocket. Please, contact the administrator.\"\nmsgstr \"\"\n\"Neuspjelo preuzimanje datoteke: previše neuspjelih pokušaja otvaranja \"\n\"websocket protokola. Kontaktiraj administratora.\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:433\nmsgid \"Unable to get counter for %1. The file does not exists. It will be removed from your localStorage.\"\nmsgstr \"\"\n\"Neuspjelo dobivanje brojača za %1. Datoteka ne postoji. Uklonit će se iz \"\n\"tvog lokalnog spremišta.\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:423\nmsgid \"Unable to get counter for %1. The token is invalid.\"\nmsgstr \"Neuspjelo dobivanje brojača za %1. Token nije ispravan.\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:443\nmsgid \"Unable to get counter for %1. You are not authenticated.\"\nmsgstr \"Neuspjelo dobivanje brojača za %1. Nisi autentificiran/a..\"\n\n#: themes/default/templates/layouts/default.html.ep:33 themes/default/templates/layouts/default.html.ep:66\nmsgid \"Upload files\"\nmsgstr \"Prenesi datoteke\"\n\n#: themes/default/templates/index.html.ep:145\nmsgid \"Upload generated zip file\"\nmsgstr \"Prenesi generiranu zip datoteku\"\n\n#: themes/default/templates/files.html.ep:31\nmsgid \"Uploaded at\"\nmsgstr \"Preneseno\"\n\n#: themes/default/templates/index.html.ep:153\nmsgid \"Uploaded files\"\nmsgstr \"Prenesene datoteke\"\n\n#: themes/default/templates/about.html.ep:20\nmsgid \"Version\"\nmsgstr \"Verzija\"\n\n#: themes/default/templates/partial/index.js.ep:31\nmsgid \"Websocket communication error\"\nmsgstr \"Greška u komunikaciji websocket protokola\"\n\n#: themes/default/templates/about.html.ep:3\nmsgid \"What is Lufi?\"\nmsgstr \"Što je Lufi?\"\n\n#: themes/default/templates/about.html.ep:14\nmsgid \"Who wrote this software?\"\nmsgstr \"Tko je napisao ovaj softver?\"\n\n#: themes/default/templates/partial/index.js.ep:13\nmsgid \"XXX file has been added to upload queue.\"\nmsgstr \"XXX datoteka je dodana u red za prijenos.\"\n\n#: themes/default/templates/invitations/invite.html.ep:30\nmsgid \"You can invite someone to send you files through this Lufi instance even if they don’t have an account on it.\"\nmsgstr \"\"\n\"Možeš pozvati osobe da ti pošalju datoteke putem ove Lufi instance, čak i \"\n\"ako nemaju račun za Lufi instancu.\"\n\n#: themes/default/templates/about.html.ep:11\nmsgid \"You can see the list of your files by clicking on the \\\"My files\\\" link at the top right of this page.\"\nmsgstr \"\"\n\"Popis datoteka možeš vidjeti pritiskom poveznice „Moje datoteke” u gornjem \"\n\"desnom kutu ove stranice.\"\n\n#. ($orig_uri)\n#: lib/Lufi/Controller/Mail.pm:43 lib/Lufi/Controller/Mail.pm:59\nmsgid \"You can't add URLs that are not related to this instance (%1).\"\nmsgstr \"Ne možeš dodati URL-ove koji nisu povezani s ovom instancom (%1).\"\n\n#: themes/default/templates/about.html.ep:8\nmsgid \"You don't need to register yourself to upload files but be aware that, for legal reasons, your IP address will be stored when you send a file. Don't panic, this is normally the case for all sites on which you send files.\"\nmsgstr \"\"\n\"Za prenošenje datoteka se ne moraš registrirati, međutim, iz pravnih \"\n\"razloga, tvoja IP adresa će se spremiti prilikom slanja datoteke. Nemoj \"\n\"paničariti, to obično vrijedi za sve web-stranice na kojima šalješ datoteke.\"\n\n#: themes/default/templates/partial/render.js.ep:11\nmsgid \"You don't seem to have a key in your URL. You won't be able to decrypt the file. Download canceled.\"\nmsgstr \"\"\n\"Čini se da nemaš ključ u svom URL-u. Nećeš moći dešifrirati datoteku. \"\n\"Preuzimanje je prekinuto.\"\n\n#: themes/default/templates/partial/render.js.ep:7\nmsgid \"You have attempted to leave this page. The download will be canceled. Are you sure?\"\nmsgstr \"\"\n\"Pokušao/la si napustiti ovu stranicu. Preuzimanje će se prekinuti. Stvarno \"\n\"to želiš?\"\n\n#: themes/default/templates/partial/index.js.ep:14\nmsgid \"You have attempted to leave this page. The upload will be canceled. Are you sure?\"\nmsgstr \"\"\n\"Pokušao/la si napustiti ovu stranicu. Prenošenje će se prekinuti. Stvarno to \"\n\"želiš?\"\n\n#: themes/default/templates/logout.html.ep:14\nmsgid \"You have been successfully logged out.\"\nmsgstr \"Uspješno si odjevljen/a.\"\n\n#: lib/Lufi/Controller/Mail.pm:85\nmsgid \"You must give email addresses.\"\nmsgstr \"Moraš upisati e-mail adrese.\"\n\n#: themes/default/templates/index.html.ep:38\nmsgid \"Your browser does not have enough entropy to generate a strong encryption key. Please wait (it's better if you do things on your computer while waiting).\"\nmsgstr \"\"\n\"Tvoj preglednik nema dovoljno entropije za generiranje snažnog ključa za \"\n\"šifriranje. Pričekaj (bolje je ako radiš stvari na računalu dok čekaš).\"\n\n#. (format_bytes($json->{size})\n#: lib/Lufi/Controller/Files.pm:95\nmsgid \"Your file is too big: %1 (maximum size allowed: %2)\"\nmsgstr \"Tvoja je datoteka prevelika: %1 (maksimalna dozvoljena veličina: %2)\"\n\n#: lib/Lufi/Controller/Files.pm:345\nmsgid \"Your password is not valid. Please refresh the page to retry.\"\nmsgstr \"Tvoja lozinka nije valjana. Aktualiziraj stranicu za ponovni pokušaj.\"\n\n#: themes/default/templates/partial/render.js.ep:14\nmsgid \"Zip content:\"\nmsgstr \"Sadržaj zip datoteke:\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:24\nmsgid \"between %1 and %2, the file will be kept %3 day(s).\"\nmsgstr \"između %1 i %2, datoteka će se zadržati %3 dan(a).\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:26\nmsgid \"between %1 and %2, the file will be kept forever.\"\nmsgstr \"između %1 i %2, datoteka će se zadržati zauvijek.\"\n\n#: themes/default/templates/partial/mail.js.ep:42\nmsgid \"deadline: \"\nmsgstr \"rok: \"\n\n#: themes/default/templates/partial/invitations.js.ep:5\nmsgid \"expires on XXX\"\nmsgstr \"isteče XXX\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:30\nmsgid \"for %1 and more, the file will be kept %2 day(s)\"\nmsgstr \"za %1 i više, datoteka će se zadržati %2 dan(a).\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:32\nmsgid \"for %1 and more, the file will be kept forever.\"\nmsgstr \"za %1 i više, datoteka će se zadržati zauvijek.\"\n\n#: themes/default/templates/index.html.ep:3\nmsgid \"no time limit\"\nmsgstr \"bez vremenskog ograničenja\"\n\n#: themes/default/templates/index.html.ep:124\nmsgid \"or\"\nmsgstr \"ili\"\n\n#. ($e->{name}, format_bytes($e->{size})\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:12\nmsgid \"— %1 (%2), that will expire on %3\"\nmsgstr \"– %1 (%2), isteči će %3\"\n\n#:\nmsgid \"You can't add URLs that are not related to this instance.\"\nmsgstr \"Ne možeš dodati URL-ove koji nisu povezani s ovom instancom.\"\n"
  },
  {
    "path": "themes/default/lib/Lufi/I18N/it.po",
    "content": "# Lufi IT translation\n# Copyright (C) 2015 Luc Didry\n# This file is distributed under the same license as the Lufi package.\n# Luc Didry <luc@didry.org>, 2015.\n# Luc Didry <luc@framasoft.org>, 2018. #zanata\n# Luc Didry <luc@framasoft.org>, 2019. #zanata\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\\n\"\n\"PO-Revision-Date: 2023-03-09 05:34+0000\\n\"\n\"Last-Translator: lost_geographer <david@chionne.eu>\\n\"\n\"Language-Team: Italian <https://weblate.framasoft.org/projects/lufi/\"\n\"default-theme/it/>\\n\"\n\"Language: it\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=(n > 1);\\n\"\n\"X-Generator: Weblate 4.15.2\\n\"\n\n#. ($delay)\n#. (max_delay)\n#: themes/default/templates/index.html.ep:56 themes/default/templates/index.html.ep:65 themes/default/templates/index.html.ep:66\nmsgid \"%1 days\"\nmsgstr \"%1 giorni\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:2\nmsgid \"%1 invites you to send him/her files\"\nmsgstr \"%1 ti invita a inviargli/le i file\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:6\nmsgid \"%1 invites you to send him/her files through Lufi.\"\nmsgstr \"%1 ti invita a inviargli/le i file attraverso Lufi.\"\n\n#. (stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:4\nmsgid \"%1 sent you files\"\nmsgstr \"%1 ti ha inviato i file\"\n\n#. (stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:8\nmsgid \"%1 used your invitation to send you files:\"\nmsgstr \"%1 ha utilizzato il tuoi invito per inviarti questi file:\"\n\n#: lib/Lufi/Controller/Invitation.pm:159 lib/Lufi/Controller/Invitation.pm:84 themes/default/templates/invitations/my_invitations.html.ep:51 themes/default/templates/invitations/my_invitations.html.ep:52 themes/default/templates/invitations/my_invitations.html.ep:53 themes/default/templates/invitations/notification_files_sent.mail.ep:12\nmsgid \"%A %d %B %Y at %T\"\nmsgstr \"%A %d %B %Y a %T\"\n\n#: themes/default/templates/partial/index.js.ep:27\nmsgid \"(max size: XXX)\"\nmsgstr \"(dimensione massima: XXX)\"\n\n#: themes/default/templates/index.html.ep:5\nmsgid \"1 year\"\nmsgstr \"1 anno\"\n\n#: themes/default/templates/index.html.ep:4 themes/default/templates/index.html.ep:65\nmsgid \"24 hours\"\nmsgstr \"24 ore\"\n\n#: themes/default/templates/partial/mail.js.ep:40\nmsgid \":\"\nmsgstr \"A :\"\n\n#: themes/default/templates/render.html.ep:42\nmsgid \"Abort\"\nmsgstr \"Annulla\"\n\n#: themes/default/templates/layouts/default.html.ep:53 themes/default/templates/layouts/default.html.ep:86\nmsgid \"About\"\nmsgstr \"A proposito\"\n\n#: themes/default/templates/index.html.ep:107\nmsgid \"Add a password to file(s)\"\nmsgstr \"Aggiungi una password ai file\"\n\n#: themes/default/templates/mail.html.ep:16\nmsgid \"\"\n\"Adding URLs not related to this Lufi instance to the mail body or subject is \"\n\"prohibited.\"\nmsgstr \"\"\n\"È vietata l'aggiunta di URL non collegati a questa istanza di Lufi nel corpo \"\n\"o nell'oggetto della mail.\"\n\n#: themes/default/templates/partial/invitations.js.ep:3\nmsgid \"Are you sure you want to delete the selected invitations?\"\nmsgstr \"Vuoi veramente eliminare gli inviti selezionati?\"\n\n#: themes/default/templates/partial/invitations.js.ep:4\nmsgid \"\"\n\"Are you sure you want to resend the invitation mail for the selected \"\n\"invitations?\"\nmsgstr \"\"\n\"Sei sicuro di voler inviare di nuovo la mail di invito per gli inviti \"\n\"selezionati?\"\n\n#: themes/default/templates/about.html.ep:17\nmsgid \"\"\n\"As Lufi is a free software licensed under of the terms of the <a href=\"\n\"\\\"https://gnu.org/licenses/agpl.html\\\" class=\\\"classic\\\">AGPLv3</a>, you can \"\n\"install it on you own server. Have a look on the <a href=\\\"https://framagit.\"\n\"org/luc/lufi/wikis/home\\\" class=\\\"classic\\\">Wiki</a> for the procedure.\"\nmsgstr \"\"\n\"Poiché Lufi è un software libero soggetto ai termini della licenza <a href=\"\n\"\\\"https://gnu.org/licenses/agpl.html\\\" class=\\\"classic\\\">AGPLv3</a>, potete \"\n\"installarlo sul vostro  server. Si consulti <a href=\\\"https://framagit.org/\"\n\"luc/lufi/wikis/home\\\" class=\\\"classic\\\">Wiki</a> per vedere la procedura.\"\n\n#. (stash('nbslices')\n#: themes/default/templates/partial/render.js.ep:9\nmsgid \"Asking for file part XX1 of %1\"\nmsgstr \"Recupero della porzione del file XX1 su %1\"\n\n#: themes/default/templates/about.html.ep:20\nmsgid \"Back to homepage\"\nmsgstr \"Ritorna all'homepage\"\n\n#: lib/Lufi/Controller/Mail.pm:25\nmsgid \"Bad CSRF token!\"\nmsgstr \"Token CSRF errato!\"\n\n#: lib/Lufi/Controller/Auth.pm:27 lib/Lufi/Controller/Auth.pm:49\nmsgid \"Bad CSRF token.\"\nmsgstr \"Token CSFR non valido.\"\n\n#: themes/default/templates/partial/render.js.ep:5\nmsgid \"Click here to refresh the page and restart the download.\"\nmsgstr \"Click qui per aggiornare la pagina e ricominciare il download.\"\n\n#: themes/default/templates/invitations/invite.mail.ep:8\nmsgid \"Click on the following URL to upload files on Lufi:\"\nmsgstr \"Clicca sul seguente URL per caricare dei file su Lufi:\"\n\n#: themes/default/templates/index.html.ep:126\nmsgid \"Click to open the file browser\"\nmsgstr \"Click per aprire il file browser\"\n\n#: themes/default/templates/delays.html.ep:38 themes/default/templates/invitations/my_invitations.html.ep:80\nmsgid \"Close\"\nmsgstr \"Chiudi\"\n\n#: themes/default/templates/mail.html.ep:23\nmsgid \"Comma-separated email addresses\"\nmsgstr \"Indirizzi email separati da virgole\"\n\n#: themes/default/templates/index.html.ep:140\nmsgid \"Compressing zip file…\"\nmsgstr \"Compressione in corso del file zip…\"\n\n#: themes/default/templates/partial/index.js.ep:15\nmsgid \"Copy all links to clipboard\"\nmsgstr \"Copiare tutti i link negli appunti\"\n\n#: themes/default/templates/partial/index.js.ep:18\nmsgid \"Copy to clipboard\"\nmsgstr \"Copiare negli appunti\"\n\n#: lib/Lufi/Controller/Files.pm:507\nmsgid \"Could not delete the file. You are not authenticated.\"\nmsgstr \"Impossibile cancellare il file. Non siete autenticati.\"\n\n#: lib/Lufi/Controller/Files.pm:489\nmsgid \"Could not find the file. Are you sure of the URL and the token?\"\nmsgstr \"\"\n\"Impossibile trovare il file. Sei sicuro che URL e token siano corretti ?\"\n\n#: lib/Lufi/Controller/Files.pm:400\nmsgid \"Could not find the file. Are you sure of the URL?\"\nmsgstr \"Impossibile trovare il file. Sei sicuro che l'URL sia corretto?\"\n\n#: themes/default/templates/files.html.ep:29\nmsgid \"Counter\"\nmsgstr \"Contatore\"\n\n#: themes/default/templates/index.html.ep:100\nmsgid \"Create a zip archive with the files before uploading?\"\nmsgstr \"Crea un file zip con i file prima dell'invio?\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:26\nmsgid \"Created at\"\nmsgstr \"Creato il\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:14\nmsgid \"Delete\"\nmsgstr \"Elimina\"\n\n#: themes/default/templates/files.html.ep:30 themes/default/templates/index.html.ep:90\nmsgid \"Delete at first download?\"\nmsgstr \"Cancellare al primo download?\"\n\n#: themes/default/templates/files.html.ep:19\nmsgid \"Delete selected files\"\nmsgstr \"Elimina i file selezionati\"\n\n#: themes/default/templates/files.html.ep:33 themes/default/templates/partial/index.js.ep:19\nmsgid \"Deletion link\"\nmsgstr \"Link per l'eliminazione\"\n\n#: themes/default/templates/delays.html.ep:8\nmsgid \"\"\n\"Don't worry: if a user begins to download the file before the expiration and \"\n\"the download ends after the expiration, he will be able to get the file.\"\nmsgstr \"\"\n\"Non preoccuparti: se un utente cominciasse il download del file prima della \"\n\"scadenza ed il download terminasse dopo la scadenza, potrebbe ottenere il \"\n\"file.\"\n\n#: themes/default/templates/partial/index.js.ep:21 themes/default/templates/render.html.ep:28\nmsgid \"Download\"\nmsgstr \"Download\"\n\n#: themes/default/templates/partial/render.js.ep:4\nmsgid \"Download aborted.\"\nmsgstr \"Download annullato.\"\n\n#: themes/default/templates/files.html.ep:28 themes/default/templates/partial/index.js.ep:20\nmsgid \"Download link\"\nmsgstr \"Link per il download\"\n\n#: themes/default/templates/about.html.ep:10\nmsgid \"\"\n\"Drag and drop files in the appropriate area or use the traditional way to \"\n\"send files and the files will be chunked, encrypted and sent to the server. \"\n\"You will get two links per file: a download link, that you give to the \"\n\"people you want to share the file with and a deletion link, allowing you to \"\n\"delete the file whenever you want.\"\nmsgstr \"\"\n\"Trascinare e lasciare il file nell'are prevista o selezionare i file nel \"\n\"modo classico ed i file saranno divisi,cifrati ed inviati al server. \"\n\"Otterrete 2 link per ogni file : uno per il download ed uno per eliminare il \"\n\"file quando vorrete.\"\n\n#: themes/default/templates/index.html.ep:122\nmsgid \"Drop files here\"\nmsgstr \"Lasciare i file qui\"\n\n#: themes/default/templates/invitations/invite.html.ep:40\nmsgid \"Email address of your guest\"\nmsgstr \"Indirizzo email del tuo invitato\"\n\n#: themes/default/templates/mail.html.ep:39\nmsgid \"Email body\"\nmsgstr \"Corpo dell'email\"\n\n#: themes/default/templates/mail.html.ep:31\nmsgid \"Email subject\"\nmsgstr \"Oggetto dell'email\"\n\n#: themes/default/templates/mail.html.ep:25 themes/default/templates/mail.html.ep:27\nmsgid \"Emails\"\nmsgstr \"Email\"\n\n#: themes/default/templates/partial/index.js.ep:22\nmsgid \"Encrypting part XX1 of XX2\"\nmsgstr \"Cifratura della parte XX1 di XX2\"\n\n#: lib/Lufi/Controller/Files.pm:289\nmsgid \"Error: the file existed but was deleted.\"\nmsgstr \"Errore: il file esisteva ma è stato eliminato.\"\n\n#: lib/Lufi/Controller/Files.pm:369\nmsgid \"Error: the file has not been sent entirely.\"\nmsgstr \"Errore: il file non è stato inviato completamente.\"\n\n#: lib/Lufi/Controller/Files.pm:379\nmsgid \"Error: unable to find the file. Are you sure of your URL?\"\nmsgstr \"Errore: impossibile trovare il file. Sei certo dell'URL ?\"\n\n#: themes/default/templates/partial/index.js.ep:23\nmsgid \"Expiration:\"\nmsgstr \"Scadenza:\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:27\nmsgid \"Expire at\"\nmsgstr \"Scade il\"\n\n#: themes/default/templates/files.html.ep:32\nmsgid \"Expires at\"\nmsgstr \"Scadrà il\"\n\n#: themes/default/templates/files.html.ep:12\nmsgid \"Export localStorage data\"\nmsgstr \"Esportare i dati del localStorage\"\n\n#: lib/Lufi/Controller/Files.pm:471\nmsgid \"File deleted\"\nmsgstr \"File cancellato\"\n\n#: themes/default/templates/files.html.ep:27\nmsgid \"File name\"\nmsgstr \"Nome del file\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:61\nmsgid \"Files\"\nmsgstr \"File\"\n\n#: themes/default/templates/index.html.ep:80\nmsgid \"Files deleted at first download\"\nmsgstr \"File cancellati al primo download\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:28\nmsgid \"Files sent at\"\nmsgstr \"File inviati il\"\n\n#: themes/default/templates/partial/invitations.js.ep:8\nmsgid \"Files sent in invitation XX1 by XX2\"\nmsgstr \"File inviati attraverso l'invito XX1 da XX2\"\n\n#: themes/default/templates/partial/render.js.ep:8\nmsgid \"Get the file\"\nmsgstr \"Ottenere il file\"\n\n#: themes/default/templates/about.html.ep:18\nmsgid \"\"\n\"Get the source code on <a href=\\\"https://framagit.org/luc/lufi\\\" class=\"\n\"\\\"classic\\\">the official repository</a> or on its <a href=\\\"https://github.\"\n\"com/ldidry/lufi\\\" class=\\\"classic\\\">Github mirror</a>\"\nmsgstr \"\"\n\"Ottenere il codice sorgente su <a href=\\\"https://framagit.org/luc/lufi\\\" \"\n\"class=\\\"classic\\\">le dÃ©pÃ´t officiel</a> ou sur son <a href=\\\"https://\"\n\"github.com/ldidry/lufi\\\" class=\\\"classic\\\">miroir Github</a>.\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:24\nmsgid \"Guest mail\"\nmsgstr \"Email dell'invitato\"\n\n#. (ucfirst(stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:6\nmsgid \"Hello %1,\"\nmsgstr \"Buongiorno %1,\"\n\n#: themes/default/templates/invitations/invite.mail.ep:4\nmsgid \"Hello,\"\nmsgstr \"Buongiorno,\"\n\n#: themes/default/templates/partial/mail.js.ep:35\nmsgid \"Hello,\\\\n\\\\nHere's some files I want to share with you:\\\\n\"\nmsgstr \"Buongiorno,\\\\n\\\\necco qualche file che vorrei condividere con te:\\\\n\"\n\n#: themes/default/templates/mail.html.ep:35\nmsgid \"Here's some files\"\nmsgstr \"Ecco qualche file\"\n\n#: themes/default/templates/partial/invitations.js.ep:7\nmsgid \"Hide hidden invitations\"\nmsgstr \"Non visualizzare gli inviti nascosti\"\n\n#: themes/default/templates/partial/index.js.ep:25\nmsgid \"Hit Enter, then Ctrl+C to copy all the download links\"\nmsgstr \"Premere Enter, poi Ctrl+C per copiare tutti i link di download\"\n\n#: themes/default/templates/partial/index.js.ep:24\nmsgid \"Hit Enter, then Ctrl+C to copy the download link\"\nmsgstr \"Premere Enter, poi Ctrl+C per copiare il link di download\"\n\n#: themes/default/templates/about.html.ep:9\nmsgid \"How does it work?\"\nmsgstr \"Come funziona?\"\n\n#: themes/default/templates/invitations/invite.html.ep:46\nmsgid \"How many days would you like the invitation to be valid?\"\nmsgstr \"Per quanti giorni vuoi che l'invito resti valido?\"\n\n#: themes/default/templates/about.html.ep:16\nmsgid \"How to install the software on my server?\"\nmsgstr \"Come installare il software sul mio server ?\"\n\n#: themes/default/templates/about.html.ep:12\nmsgid \"How to report an illegal file?\"\nmsgstr \"Come segnalare un file illegale?\"\n\n#: themes/default/templates/delays.html.ep:7\nmsgid \"If you choose a delay, the file will be deleted after that delay.\"\nmsgstr \"\"\n\"Se sceglieste una scadenza, il file sarebbe cancellato dopo tale scadenza.\"\n\n#: themes/default/templates/mail.html.ep:15\nmsgid \"\"\n\"If you send the mail from this server, the links will be sent to the server, \"\n\"which may lower your privacy protection.\"\nmsgstr \"\"\n\"Se inviaste l'email da questo server, i link sarebbero inviati al server, e \"\n\"questo potrebbe diminuire la protezione della riservatezza.\"\n\n#: themes/default/templates/files.html.ep:14\nmsgid \"Import localStorage data\"\nmsgstr \"Importare i dati del localStorage\"\n\n#: themes/default/templates/index.html.ep:53\nmsgid \"Important: more information on delays\"\nmsgstr \"Importante : più informazioni sulle scadenze\"\n\n#: themes/default/templates/delays.html.ep:5\nmsgid \"Information about delays\"\nmsgstr \"Informazione sulle scadenze\"\n\n#: themes/default/templates/files.html.ep:18 themes/default/templates/invitations/my_invitations.html.ep:12\nmsgid \"Invert selection\"\nmsgstr \"Inverti la selezione\"\n\n#. ($i->guest_mail, $url)\n#: lib/Lufi/Controller/Invitation.pm:171\nmsgid \"Invitation resent to %1.<br> URL: %2\"\nmsgstr \"Invito inviato di nuovo a %1.<br> URL: %2\"\n\n#. ($invitation->guest_mail, $url)\n#: lib/Lufi/Controller/Invitation.pm:87\nmsgid \"Invitation sent to %1.<br> URL: %2\"\nmsgstr \"Invito inviato a %1.<br> URL: %2\"\n\n#: themes/default/templates/invitations/invite.html.ep:27 themes/default/templates/layouts/default.html.ep:36 themes/default/templates/layouts/default.html.ep:69\nmsgid \"Invite a guest\"\nmsgstr \"Invita qualcuno\"\n\n#: themes/default/templates/partial/render.js.ep:6\nmsgid \"\"\n\"It seems that the key in your URL is incorrect. Please, verify your URL.\"\nmsgstr \"Sembra che la chiave nel tuo URL sia errata. Controllare il tuo URL.\"\n\n#: themes/default/templates/index.html.ep:12\nmsgid \"Javascript is disabled. You won't be able to use Lufi.\"\nmsgstr \"Javascript è disattivato. Lufi non può funzionare.\"\n\n#: themes/default/templates/layouts/default.html.ep:44 themes/default/templates/layouts/default.html.ep:46 themes/default/templates/layouts/default.html.ep:77 themes/default/templates/layouts/default.html.ep:79\nmsgid \"Language\"\nmsgstr \"Lingua\"\n\n#: themes/default/templates/login.html.ep:15\nmsgid \"Login\"\nmsgstr \"Login\"\n\n#: themes/default/templates/layouts/default.html.ep:58 themes/default/templates/layouts/default.html.ep:91\nmsgid \"Logout\"\nmsgstr \"Disconnessione\"\n\n#: themes/default/templates/about.html.ep:4\nmsgid \"Lufi is a free (as in free speech) file hosting software.\"\nmsgstr \"Lufi è un software libero di file hosting.\"\n\n#: themes/default/templates/partial/files.js.ep:12\nmsgid \"\"\n\"Lufi recently changed its way to store files information.\\\\n\\\\nNo files have \"\n\"been found in the new localStorage location but we found files in the old \"\n\"one.\\\\nDo you want to import those informations?\\\\n\\\\nPlease note that this \"\n\"is the only time that we will ask you this.\"\nmsgstr \"\"\n\"Lufi ha modificato recentemente il suo modo di archiviare le informazioni \"\n\"dei file.\\\\n\"\n\"\\\\n\"\n\"Nessun file è stato trovato nella nuova collocazione del localStorage ma \"\n\"abbiamo trovato dei file nella vecchia collocazione.\\\\n\"\n\"Vuoi importare queste informazioni?\\\\n\"\n\"\\\\n\"\n\"Per favore, ricorda che questa è l'unica volta in cui ti verrà chiesto.\"\n\n#: themes/default/templates/files.html.ep:34\nmsgid \"Mail\"\nmsgstr \"Email\"\n\n#: themes/default/templates/files.html.ep:3 themes/default/templates/layouts/default.html.ep:34 themes/default/templates/layouts/default.html.ep:67\nmsgid \"My files\"\nmsgstr \"I miei file\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:5 themes/default/templates/layouts/default.html.ep:37 themes/default/templates/layouts/default.html.ep:70\nmsgid \"My invitations\"\nmsgstr \"I miei inviti\"\n\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:17\nmsgid \"\"\n\"NB: this list includes the list of files that have already been sent to you.\"\nmsgstr \"\"\n\"NB: questo elenco contiene l'elenco dei file che ti sono già stati inviati.\"\n\n#: themes/default/templates/index.html.ep:115\nmsgid \"Name of the zip file\"\nmsgstr \"Nome del file zip\"\n\n#. (format_bytes($json->{size})\n#: lib/Lufi/Controller/Files.pm:108\nmsgid \"No enough space available on the server for this file (size: %1).\"\nmsgstr \"\"\n\"Spazio disco insufficiente sul server per questo file (dimensione: %1).\"\n\n#: themes/default/templates/partial/files.js.ep:10 themes/default/templates/partial/index.js.ep:28\nmsgid \"No expiration delay\"\nmsgstr \"Nessun ritardo per la scadenza\"\n\n#: themes/default/templates/files.html.ep:8\nmsgid \"\"\n\"Only the files sent with this browser will be listed here. This list is \"\n\"stored in localStorage: if you delete your localStorage data, you'll lose \"\n\"this list.\"\nmsgstr \"\"\n\"Solo i file inviati con questo browser web sono nella lista. Le informazioni \"\n\"sono memorizzate nel localStorage: se cancellaste i dati dal vostro \"\n\"localStorage, perdereste questa lista.\"\n\n#: themes/default/templates/index.html.ep:106 themes/default/templates/login.html.ep:21 themes/default/templates/render.html.ep:26\nmsgid \"Password\"\nmsgstr \"Password\"\n\n#. (config('contact')\n#: themes/default/templates/about.html.ep:13\nmsgid \"Please contact the administrator: %1\"\nmsgstr \"Contattare l'amministratore : %1\"\n\n#: themes/default/templates/render.html.ep:33\nmsgid \"\"\n\"Please wait while we are getting your file. We first need to download and \"\n\"decrypt all parts before you can get it.\"\nmsgstr \"\"\n\"Attendere mentre otteniamo il vostro file. Dobbiamo prima scaricare e \"\n\"decifrare tutte le parti prima che possiate averlo.\"\n\n#: lib/Lufi/Controller/Auth.pm:38\nmsgid \"\"\n\"Please, check your credentials or your right to access this service: unable \"\n\"to authenticate.\"\nmsgstr \"\"\n\"Per favore, controlla le tue credenziali o i diritti di accesso a questo \"\n\"servizio: autenticazione non riuscita.\"\n\n#: themes/default/templates/about.html.ep:5\nmsgid \"Privacy\"\nmsgstr \"Riservatezza\"\n\n#: themes/default/templates/files.html.ep:13\nmsgid \"Purge expired files from localStorage\"\nmsgstr \"Eliminare dal localStorage i file scaduti\"\n\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:20\nmsgid \"Regards,\"\nmsgstr \"Cordiali saluti,\"\n\n#: themes/default/templates/invitations/invite.mail.ep:15\nmsgid \"Regards.\"\nmsgstr \"Cordiali saluti.\"\n\n#: themes/default/templates/layouts/default.html.ep:31 themes/default/templates/layouts/default.html.ep:64\nmsgid \"Report file\"\nmsgstr \"Segnala un file\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:15\nmsgid \"Resend invitation mail\"\nmsgstr \"Invia di nuovo l'email di invito\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:9\nmsgid \"Rows in purple mean that the invitations have expired.\"\nmsgstr \"Le righe in viola significano che gli inviti sono scaduti.\"\n\n#: themes/default/templates/files.html.ep:9\nmsgid \"\"\n\"Rows in red mean that the files have expired and are no longer available.\"\nmsgstr \"\"\n\"Le righe in rosso significano che i file sono scaduti e non sono più \"\n\"disponibili.\"\n\n#: themes/default/templates/partial/index.js.ep:26\nmsgid \"Send all links by email\"\nmsgstr \"Inviare tutti i link tramite email\"\n\n#: themes/default/templates/invitations/invite.html.ep:50\nmsgid \"Send the invitation\"\nmsgstr \"Manda l'invito\"\n\n#: themes/default/templates/mail.html.ep:46\nmsgid \"Send with this server\"\nmsgstr \"Inviare tramite questo server\"\n\n#: themes/default/templates/mail.html.ep:47\nmsgid \"Send with your own mail software\"\nmsgstr \"Inviare tramite il vostro programma di posta\"\n\n#: themes/default/templates/partial/index.js.ep:29\nmsgid \"\"\n\"Sending part XX1 of XX2. Please, be patient, the progress bar can take a \"\n\"while to move.\"\nmsgstr \"\"\n\"Invio della parte XX1 su XX2. Prego attendere, la barra di avanzamento può \"\n\"impiegare del tempo prima di colorarsi.\"\n\n#. (url_for('/')\n#: themes/default/templates/partial/mail.js.ep:48\nmsgid \"Share your files in total privacy on %1\"\nmsgstr \"Condividi tutti i file in totale riservatezza su %1\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:13 themes/default/templates/partial/invitations.js.ep:9\nmsgid \"Show hidden invitations\"\nmsgstr \"Mostra gli inviti nascosti\"\n\n#: themes/default/templates/partial/render.js.ep:11\nmsgid \"Show zip content\"\nmsgstr \"Mostra il contenuto del file zip\"\n\n#: themes/default/templates/layouts/default.html.ep:40 themes/default/templates/layouts/default.html.ep:73 themes/default/templates/login.html.ep:28 themes/default/templates/logout.html.ep:17\nmsgid \"Signin\"\nmsgstr \"Autenticazione\"\n\n#: lib/Lufi/Controller/Invitation.pm:283 themes/default/templates/invitations/exception.html.ep:16\nmsgid \"\"\n\"Sorry, the invitation doesn’t exist. Are you sure you are on the right URL?\"\nmsgstr \"Spiacente, l'invito non esiste. Sei sicuro di essere nell'URL corretto?\"\n\n#: themes/default/templates/index.html.ep:46\nmsgid \"Sorry, the uploading is currently disabled. Please try again later.\"\nmsgstr \"L'invio del file è attualemente disattivato. Riprovare più tardi.\"\n\n#: lib/Lufi/Controller/Files.pm:82\nmsgid \"Sorry, uploading is disabled.\"\nmsgstr \"L'invio del file è attualemente disattivato.\"\n\n#: themes/default/templates/invitations/exception.html.ep:7\nmsgid \"Sorry, your invitation has expired or has been deleted.\"\nmsgstr \"Spiacente, il tuo invito è scaduto o è stato cancellato.\"\n\n#. ($invit->ldap_user_mail)\n#: lib/Lufi/Controller/Files.pm:122\nmsgid \"\"\n\"Sorry, your invitation has expired or has been deleted. Please contact %1 to \"\n\"have another invitation.\"\nmsgstr \"\"\n\"Spiacente, il tuo invito è scaduto o è stato cancellato. Per avere un altro \"\n\"invito contatta per favore %1.\"\n\n#. ($invitation->ldap_user_mail)\n#: lib/Lufi/Controller/Invitation.pm:276\nmsgid \"The URLs of your files have been sent by email to %1.\"\nmsgstr \"L'URL dei tuoi file è stato inviato via email a %1.\"\n\n#: themes/default/templates/about.html.ep:7\nmsgid \"\"\n\"The administrator can only see the file's name, its size and its mimetype \"\n\"(what kind of file it is: video, text, etc.).\"\nmsgstr \"\"\n\"L'amministratore può vedere soltanto il nome, le dimensioni del file e il \"\n\"suo mimetype (che tipo di fileè: video, testo, ecc.).\"\n\n#: lib/Lufi/Controller/Mail.pm:53\nmsgid \"\"\n\"The body of the mail must contain at least one URL pointing to a file hosted \"\n\"on this instance.\"\nmsgstr \"\"\n\"Il corpo della mail deve contenere almeno un URL che punti a un file \"\n\"archiviato in questa istanza.\"\n\n#: themes/default/templates/partial/files.js.ep:11\nmsgid \"The data has been successfully imported.\"\nmsgstr \"I dati sono stati importati correttamente.\"\n\n#: lib/Lufi/Controller/Mail.pm:73\nmsgid \"The email body can't be empty.\"\nmsgstr \"Il corpo dell'email non può essere vuoto.\"\n\n#: lib/Lufi/Controller/Mail.pm:72\nmsgid \"The email subject can't be empty.\"\nmsgstr \"Il soggetto dell'email non può essere vuoto.\"\n\n#. ($expire_at, $max_expire_at)\n#: lib/Lufi/Controller/Invitation.pm:51\nmsgid \"The expiration delay (%1) is not between 1 and %2 days.\"\nmsgstr \"Il termine di scadenza (%1) non è compreso tra 1 e %2 giorni.\"\n\n#: lib/Lufi/Controller/Files.pm:468\nmsgid \"The file has already been deleted\"\nmsgstr \"Il file è già stato cancellato\"\n\n#: themes/default/templates/about.html.ep:6\nmsgid \"\"\n\"The files uploaded on a Lufi instance are encrypted before the upload to the \"\n\"server: the administrator of the server can not see the file's content.\"\nmsgstr \"\"\n\"I file inviati su un istanza di Lufi sono cifrati prima dell'invio al server:\"\n\" l'amministratore del server non può vedere il contenuto dei vostri file.\"\n\n#. (join(', ', @bad)\n#: lib/Lufi/Controller/Mail.pm:68\nmsgid \"The following email addresses are not valid: %1\"\nmsgstr \"I seguenti indirizzi email non sono validi: %1\"\n\n#. ($guest_mail)\n#: lib/Lufi/Controller/Invitation.pm:48\nmsgid \"The guest email address (%1) is unvalid.\"\nmsgstr \"L'indirizzo email dell'invitato (%1) non è valido.\"\n\n#. ($i->token, $i->guest_mail)\n#: lib/Lufi/Controller/Invitation.pm:150\nmsgid \"\"\n\"The invitation %1 can’t be resent: %2 has already sent files.<br>Please \"\n\"create a new invitation.\"\nmsgstr \"\"\n\"L'invito %1 non può essere inviato di nuovo: %2 ha già inviato i file.<br>Si \"\n\"prega di creare un nuovo invito.\"\n\n#. ($i->token)\n#: lib/Lufi/Controller/Invitation.pm:130\nmsgid \"The invitation %1 has been deleted.\"\nmsgstr \"L'invito è stato eliminato.\"\n\n#. (stash('user_mail')\n#: themes/default/templates/invitations/invite.html.ep:34\nmsgid \"The invitation mail will be send from your email address (%1).\"\nmsgstr \"L'invito mail verrà inviato dal tuo indirizzo email (%1).\"\n\n#: themes/default/templates/partial/index.js.ep:16\nmsgid \"The link(s) has been copied to your clipboard\"\nmsgstr \"I link sono stati copiati negli appunti\"\n\n#. (stash('invitation')\n#: themes/default/templates/index.html.ep:30\nmsgid \"\"\n\"The link(s) of your file(s) will automatically be sent by mail to %1 (%2)\"\nmsgstr \"Il link dei tuoi file verrà automaticamente inviato via mail a %1 (%2)\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:11\nmsgid \"The links of your file(s) will automatically be sent by mail to %1.\"\nmsgstr \"I link dei tuoi file verranno automaticamente inviati via mail a %1.\"\n\n#: lib/Lufi/Controller/Mail.pm:97\nmsgid \"The mail has been sent.\"\nmsgstr \"Email inviata.\"\n\n#: themes/default/templates/about.html.ep:15\nmsgid \"\"\n\"The original (and only for now) author is <a href=\\\"https://fiat-tux.fr\\\" \"\n\"class=\\\"classic\\\">Luc Didry</a>.\"\nmsgstr \"\"\n\"L'autore ( e per ora l'unico) è <a href=\\\"https://fiat-tux.fr\\\" class=\"\n\"\\\"classic\\\">Luc Didry</a>.\"\n\n#: lib/Lufi/Controller/Files.pm:236\nmsgid \"\"\n\"The server was unable to find the file record to add your file part to. \"\n\"Please, contact the administrator.\"\nmsgstr \"\"\n\"Il server non è stato in grado di trovare il file record a cui aggiungere la \"\n\"vostra porzione di file. Prego contattare l'amministratore.\"\n\n#: lib/Lufi/Controller/Files.pm:295\nmsgid \"\"\n\"This file has been deactivated by the admins. Contact them to know why.\"\nmsgstr \"\"\n\"Questo file è stato disattivato dagli amministratori. Contattali per \"\n\"conoscere i motivi.\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:46 themes/default/templates/partial/invitations.js.ep:6\nmsgid \"This invitation is normally hidden\"\nmsgstr \"Questo invito normalmente è nascosto\"\n\n#. (stash('expires')\n#: themes/default/templates/invitations/invite.mail.ep:13\nmsgid \"This invitation is valid until %1.\"\nmsgstr \"Questo invito è valido fino a %1.\"\n\n#: themes/default/templates/delays.html.ep:10\nmsgid \"\"\n\"This server sets limitations according to the file size. The expiration \"\n\"delay of your file will be the minimum between what you choose and the \"\n\"following limitations:\"\nmsgstr \"\"\n\"Questo server pone delle limitazioni in base alla dimensione del file.La \"\n\"data di scadenza del tuo file sarà la minore tra quella scelta e queste \"\n\"limitazioni:\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:16\nmsgid \"Toggle visibility\"\nmsgstr \"Commutare la visibilità\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:25\nmsgid \"URL\"\nmsgstr \"URL\"\n\n#: themes/default/templates/partial/index.js.ep:17\nmsgid \"Unable to copy the link(s) to your clipboard\"\nmsgstr \"Impossibile copiare i link negli appunti\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:439\nmsgid \"\"\n\"Unable to get counter for %1. The file does not exists. It will be removed \"\n\"from your localStorage.\"\nmsgstr \"\"\n\"Impossibile recuperare il contatore per %1. Il file non esiste. Il file sarà \"\n\"eliminato dal tuo localStorage.\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:429\nmsgid \"Unable to get counter for %1. The token is invalid.\"\nmsgstr \"Impossibile recuperare il contatore per %1. Il token non è valido.\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:449\nmsgid \"Unable to get counter for %1. You are not authenticated.\"\nmsgstr \"Impossibile recuperare il contatore per %1. Non sei autenticato.\"\n\n#: themes/default/templates/layouts/default.html.ep:33 themes/default/templates/layouts/default.html.ep:66\nmsgid \"Upload files\"\nmsgstr \"Invio dei file\"\n\n#: themes/default/templates/index.html.ep:145\nmsgid \"Upload generated zip file\"\nmsgstr \"Carica il file zip generato\"\n\n#: themes/default/templates/files.html.ep:31\nmsgid \"Uploaded at\"\nmsgstr \"Invio il\"\n\n#: themes/default/templates/index.html.ep:153\nmsgid \"Uploaded files\"\nmsgstr \"File inviati\"\n\n#: themes/default/templates/partial/index.js.ep:30\nmsgid \"Websocket communication error\"\nmsgstr \"Errore di comunicazione WebSocket\"\n\n#: themes/default/templates/about.html.ep:3\nmsgid \"What is Lufi?\"\nmsgstr \"Cos'è Lufi ?\"\n\n#: themes/default/templates/about.html.ep:14\nmsgid \"Who wrote this software?\"\nmsgstr \"Chi ha scritto questo software?\"\n\n#: themes/default/templates/partial/index.js.ep:13\nmsgid \"XXX file has been added to upload queue.\"\nmsgstr \"XXX file è stato aggiunto alla coda di caricamento.\"\n\n#: themes/default/templates/invitations/invite.html.ep:30\nmsgid \"\"\n\"You can invite someone to send you files through this Lufi instance even if \"\n\"they don’t have an account on it.\"\nmsgstr \"\"\n\"Puoi invitare qualcuno a inviarti i file attraverso questa istanza Lufi \"\n\"anche se non ha un account su di essa.\"\n\n#: themes/default/templates/about.html.ep:11\nmsgid \"\"\n\"You can see the list of your files by clicking on the \\\"My files\\\" link at \"\n\"the top right of this page.\"\nmsgstr \"\"\n\"Puoi consultare la lista dei vostri file cliccando sul link « I miei file » \"\n\"in alto a destra in questa pagina.\"\n\n#: lib/Lufi/Controller/Mail.pm:42\nmsgid \"You can't add URLs that are not related to this instance.\"\nmsgstr \"Non puoi aggiungere URL che non siano collegati a questa istanza.\"\n\n#: themes/default/templates/about.html.ep:8\nmsgid \"\"\n\"You don't need to register yourself to upload files but be aware that, for \"\n\"legal reasons, your IP address will be stored when you send a file. Don't \"\n\"panic, this is normally the case for all sites on which you send files.\"\nmsgstr \"\"\n\"Non hai bisogno di registrarti per inviare i file ma devi essere consapevole \"\n\"che, per motivi legali, il tuo indirizzo IP sarà registrato quando invierai \"\n\"un file. Non ti preoccupare, avviene in tutti i siti su cui invii dei file.\"\n\n#: themes/default/templates/partial/render.js.ep:10\nmsgid \"\"\n\"You don't seem to have a key in your URL. You won't be able to decrypt the \"\n\"file. Download canceled.\"\nmsgstr \"\"\n\"Sembra che non ci sia una chiave nel tuo URL. Non sarai in grado di \"\n\"decifrare il file. Download annullato.\"\n\n#: themes/default/templates/partial/render.js.ep:7\nmsgid \"\"\n\"You have attempted to leave this page. The download will be canceled. Are \"\n\"you sure?\"\nmsgstr \"\"\n\"Hai cercato di uscire da questa pagina. Il download sarà cancellato. Sei \"\n\"sicuro?\"\n\n#: themes/default/templates/partial/index.js.ep:14\nmsgid \"\"\n\"You have attempted to leave this page. The upload will be canceled. Are you \"\n\"sure?\"\nmsgstr \"\"\n\"Hai cercato di uscire da questa pagina. L'invio sarà cancellato. Sei sicuro?\"\n\n#: themes/default/templates/logout.html.ep:14\nmsgid \"You have been successfully logged out.\"\nmsgstr \"Logout avvenuto con successo.\"\n\n#: lib/Lufi/Controller/Mail.pm:71\nmsgid \"You must give email addresses.\"\nmsgstr \"Devi fornire gli indirizzi email.\"\n\n#: themes/default/templates/index.html.ep:38\nmsgid \"\"\n\"Your browser does not have enough entropy to generate a strong encryption \"\n\"key. Please wait (it's better if you do things on your computer while \"\n\"waiting).\"\nmsgstr \"\"\n\"Il tuo browser non ha sufficiente entropia per generare una chiave di \"\n\"cifratura forte. Si prega di aspettare (è meglio fare altre cose sul tuo \"\n\"computer mentre aspetti).\"\n\n#. (format_bytes($json->{size})\n#: lib/Lufi/Controller/Files.pm:95\nmsgid \"Your file is too big: %1 (maximum size allowed: %2)\"\nmsgstr \"\"\n\"Il vostro file è troppo grande : %1 (la dimensione massima permessa è %2)\"\n\n#: lib/Lufi/Controller/Files.pm:351\nmsgid \"Your password is not valid. Please refresh the page to retry.\"\nmsgstr \"\"\n\"La tua password non è valida. Per favore ricarica la pagina per riprovare.\"\n\n#: themes/default/templates/partial/render.js.ep:12\nmsgid \"Zip content:\"\nmsgstr \"Contenuto del file zip:\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:20\nmsgid \"between %1 and %2, the file will be kept %3 day(s).\"\nmsgstr \"tra %1 e %2, il file sarà conservato %3 giorno(i).\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:22\nmsgid \"between %1 and %2, the file will be kept forever.\"\nmsgstr \"tra %1 e %2, il file sarà conservato per sempre.\"\n\n#: themes/default/templates/partial/mail.js.ep:42\nmsgid \"deadline: \"\nmsgstr \"scadenza: \"\n\n#: themes/default/templates/partial/invitations.js.ep:5\nmsgid \"expires on XXX\"\nmsgstr \"scade il XXX\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:26\nmsgid \"for %1 and more, the file will be kept %2 day(s)\"\nmsgstr \"per %1 e più, il file sarà conservato %2 giorno(i)\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:28\nmsgid \"for %1 and more, the file will be kept forever.\"\nmsgstr \"per %1 e più, il file sarà conservato per sempre.\"\n\n#: themes/default/templates/index.html.ep:3\nmsgid \"no time limit\"\nmsgstr \"nessuna limitazione temporale\"\n\n#: themes/default/templates/index.html.ep:124\nmsgid \"or\"\nmsgstr \"o\"\n\n#. ($e->{name}, format_bytes($e->{size})\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:12\nmsgid \"— %1 (%2), that will expire on %3\"\nmsgstr \"— %1 (%2), che scadrà il %3\"\n\n#: themes/default/templates/about.html.ep:17\nmsgid \"As Lufi is a free software licensed under of the terms of the <a href=\\\"https://gnu.org/licenses/agpl.html\\\" class=\\\"classic\\\">AGPLv3</a>, you can install it on you own server. Have a look on the <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi/wikis/home\\\" class=\\\"classic\\\">Wiki</a> for the procedure.\"\nmsgstr \"\"\n\"Poiché Lufi è un software libero soggetto ai termini della licenza <a href=\\\"\"\n\"https://gnu.org/licenses/agpl.html\\\" class=\\\"classic\\\">AGPLv3</a>, potete \"\n\"installarlo sul vostro server. Si consulti <a href=\\\"https://framagit.org/\"\n\"fiat-tux/hat-softwares/lufi/wikis/home\\\" class=\\\"classic\\\">Wiki</a> per \"\n\"vedere la procedura.\"\n\n#: themes/default/templates/about.html.ep:18\nmsgid \"Get the source code on <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi\\\" class=\\\"classic\\\">the official repository</a> or on its <a href=\\\"https://github.com/ldidry/lufi\\\" class=\\\"classic\\\">Github mirror</a>\"\nmsgstr \"\"\n\"Ottenere il codice sorgente sul <a href=\\\"https://framagit.org/fiat-tux/\"\n\"hat-softwares/lufi\\\" class=\\\"classic\\\">repository ufficiale</a> o sul suo <a \"\n\"href=\\\"https://github.com/ldidry/lufi\\\" class=\\\"classic\\\">mirror Github</a>\"\n\n#: themes/default/templates/about.html.ep:20\nmsgid \"Version\"\nmsgstr \"Versione\"\n\n#. (sprintf('<a href=\"https://framagit.org/fiat-tux/hat-softwares/lufi/-/releases/%s\" class=\"classic\">%s</a>', stash('version')\n#: themes/default/templates/about.html.ep:21\nmsgid \"Latest tag of this instance: %1\"\nmsgstr \"Ultimo tag di questa istanza: %1\"\n\n#. (sprintf('<a href=\"https://framagit.org/fiat-tux/hat-softwares/lufi/-/commit/%s\" class=\"classic\">%s</a>', stash('version')\n#: themes/default/templates/about.html.ep:22\nmsgid \"Latest commit of this instance: %1\"\nmsgstr \"Ultimo commit di questa istanza: %1\"\n\n#: themes/default/templates/partial/index.js.ep:24\nmsgid \"File uploaded\"\nmsgstr \"File caricato\"\n\n#: themes/default/templates/partial/render.js.ep:9\nmsgid \"File downloaded\"\nmsgstr \"File scaricato\"\n\n#: themes/default/templates/partial/render.js.ep:13\nmsgid \"Unable to download the file: too much unsuccessful attempts to open a websocket. Please, contact the administrator.\"\nmsgstr \"\"\n\"Impossibile scaricare il file: troppi tentativi falliti di aprire un \"\n\"websocket. Per favore, contatta l'amministratore.\"\n\n#. ($i->token, $c->current_user->{username})\n#: lib/Lufi/Controller/Invitation.pm:136\nmsgid \"The invitation %1 can’t be deleted: it wasn’t created by you (%2).\"\nmsgstr \"L'invito %1 non può essere cancellato: non lo hai creato tu (%2).\"\n\n#. ($i->token, $c->current_user->{username})\n#: lib/Lufi/Controller/Invitation.pm:187\nmsgid \"The invitation %1 can’t be resent: it wasn’t created by you (%2).\"\nmsgstr \"L'invito %1 non può essere rispedito: non lo hai creato tu (%2).\"\n\n#. ($orig_uri)\n#: lib/Lufi/Controller/Mail.pm:43 lib/Lufi/Controller/Mail.pm:59\nmsgid \"You can't add URLs that are not related to this instance (%1).\"\nmsgstr \"Non puoi aggiungere URL non correlati a questa istanza (%1).\"\n"
  },
  {
    "path": "themes/default/lib/Lufi/I18N/ja_JP.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: \\n\"\n\"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\\n\"\n\"PO-Revision-Date: 2021-11-02 10:04+0900\\n\"\n\"Language-Team: \\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"X-Generator: Poedit 2.3\\n\"\n\"Last-Translator: \\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\"Language: ja_JP\\n\"\n\"X-Language: ja_JP\\n\"\n\"X-Source-Language: C\\n\"\n\n#. ($delay)(max_delay)\n#: themes/default/templates/index.html.ep:56\n#: themes/default/templates/index.html.ep:65\n#: themes/default/templates/index.html.ep:66\n#, qt-format\nmsgid \"%1 days\"\nmsgstr \"%1日\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:2\n#, qt-format\nmsgid \"%1 invites you to send him/her files\"\nmsgstr \"%1 はあなたにファイルを送信しようとしています\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:6\n#, qt-format\nmsgid \"%1 invites you to send him/her files through Lufi.\"\nmsgstr \"%1 はLufiによってあなたにファイルを送信しようとしています。\"\n\n#. (stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:4\n#, qt-format\nmsgid \"%1 sent you files\"\nmsgstr \"%1 はあなたにファイルを送信しました\"\n\n#. (stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:8\n#, qt-format\nmsgid \"%1 used your invitation to send you files:\"\nmsgstr \"%1は招待を受け、次のファイルを送信しました:\"\n\n#: lib/Lufi/Controller/Invitation.pm:160 lib/Lufi/Controller/Invitation.pm:85\n#: themes/default/templates/invitations/my_invitations.html.ep:51\n#: themes/default/templates/invitations/my_invitations.html.ep:52\n#: themes/default/templates/invitations/my_invitations.html.ep:53\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:12\nmsgid \"%A %d %B %Y at %T\"\nmsgstr \"%A %d %B %Y at %T\"\n\n#: themes/default/templates/partial/index.js.ep:28\nmsgid \"(max size: XXX)\"\nmsgstr \"(最大サイズ: XXX)\"\n\n#: themes/default/templates/index.html.ep:5\nmsgid \"1 year\"\nmsgstr \"1年\"\n\n#: themes/default/templates/index.html.ep:4\n#: themes/default/templates/index.html.ep:65\nmsgid \"24 hours\"\nmsgstr \"24時間\"\n\n#: themes/default/templates/partial/mail.js.ep:40\nmsgid \":\"\nmsgstr \":\"\n\n#: themes/default/templates/render.html.ep:42\nmsgid \"Abort\"\nmsgstr \"中断\"\n\n#: themes/default/templates/layouts/default.html.ep:53\n#: themes/default/templates/layouts/default.html.ep:86\nmsgid \"About\"\nmsgstr \"Lufiについて\"\n\n#: themes/default/templates/index.html.ep:107\nmsgid \"Add a password to file(s)\"\nmsgstr \"ファイルにパスワードをかける\"\n\n#: themes/default/templates/mail.html.ep:16\nmsgid \"\"\n\"Adding URLs not related to this Lufi instance to the mail body or subject is \"\n\"prohibited.\"\nmsgstr \"メールの本文や件名に、このLufiインスタンスに関係のないURLを追加することは禁止されています。\"\n\n#: themes/default/templates/partial/invitations.js.ep:3\nmsgid \"Are you sure you want to delete the selected invitations?\"\nmsgstr \"選択した招待状を削除してもよろしいですか？\"\n\n#: themes/default/templates/partial/invitations.js.ep:4\nmsgid \"\"\n\"Are you sure you want to resend the invitation mail for the selected \"\n\"invitations?\"\nmsgstr \"選択した招待メールを再送してよろしいですか？\"\n\n#: themes/default/templates/about.html.ep:17\nmsgid \"\"\n\"As Lufi is a free software licensed under of the terms of the <a \"\n\"href=\\\"https://gnu.org/licenses/agpl.html\\\" class=\\\"classic\\\">AGPLv3</a>, \"\n\"you can install it on you own server. Have a look on the <a \"\n\"href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi/wikis/home\\\" \"\n\"class=\\\"classic\\\">Wiki</a> for the procedure.\"\nmsgstr \"\"\n\"Lufiは<a href=\\\"https://gnu.org/licenses/agpl.html\\\" \"\n\"class=\\\"classic\\\">AGPLv3</a>に基づきライセンスされたフリーソフトウェアで、あなた自身のサーバーにインストールすることができます。手順は、<a \"\n\"href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi/wikis/home\\\" \"\n\"class=\\\"classic\\\">Wiki</a>をご確認ください。ソースコードは、公式リポジトリまたはGithubミラーから入手できます。\"\n\n#. (stash('nbslices')\n#: themes/default/templates/partial/render.js.ep:10\n#, qt-format\nmsgid \"Asking for file part XX1 of %1\"\nmsgstr \"ファイルのパートXX1 / %1を取得しています\"\n\n#: themes/default/templates/about.html.ep:23\nmsgid \"Back to homepage\"\nmsgstr \"トップページに戻る\"\n\n#: lib/Lufi/Controller/Mail.pm:25\nmsgid \"Bad CSRF token!\"\nmsgstr \"CSRFトークンが無効です！\"\n\n#: lib/Lufi/Controller/Auth.pm:27 lib/Lufi/Controller/Auth.pm:49\nmsgid \"Bad CSRF token.\"\nmsgstr \"CSRFトークンが無効です。\"\n\n#: themes/default/templates/partial/render.js.ep:5\nmsgid \"Click here to refresh the page and restart the download.\"\nmsgstr \"ここをクリックすると、ページが更新されダウンロードが再開されます。\"\n\n#: themes/default/templates/invitations/invite.mail.ep:8\nmsgid \"Click on the following URL to upload files on Lufi:\"\nmsgstr \"次のURLからLufiにファイルをアップロードできます:\"\n\n#: themes/default/templates/index.html.ep:126\nmsgid \"Click to open the file browser\"\nmsgstr \"ファイルを参照\"\n\n#: themes/default/templates/delays.html.ep:42\n#: themes/default/templates/invitations/my_invitations.html.ep:80\nmsgid \"Close\"\nmsgstr \"閉じる\"\n\n#: themes/default/templates/mail.html.ep:23\nmsgid \"Comma-separated email addresses\"\nmsgstr \"メールアドレス(コンマ区切り)\"\n\n#: themes/default/templates/index.html.ep:140\nmsgid \"Compressing zip fileâ¦\"\nmsgstr \"Zipファイルに圧縮中...\"\n\n#: themes/default/templates/partial/index.js.ep:15\nmsgid \"Copy all links to clipboard\"\nmsgstr \"全てのリンクをクリップボードにコピー\"\n\n#: themes/default/templates/partial/index.js.ep:18\nmsgid \"Copy to clipboard\"\nmsgstr \"クリップボードにコピー\"\n\n#: lib/Lufi/Controller/Files.pm:501\nmsgid \"Could not delete the file. You are not authenticated.\"\nmsgstr \"認証されていないためファイルを削除できませんでした。\"\n\n#: lib/Lufi/Controller/Files.pm:483\nmsgid \"Could not find the file. Are you sure of the URL and the token?\"\nmsgstr \"ファイルが見つかりませんでした。URLとトークンが間違っていませんか？\"\n\n#: lib/Lufi/Controller/Files.pm:394\nmsgid \"Could not find the file. Are you sure of the URL?\"\nmsgstr \"ファイルが見つかりませんでした。URLが間違っていませんか？\"\n\n#: themes/default/templates/files.html.ep:29\nmsgid \"Counter\"\nmsgstr \"ダウンロード数\"\n\n#: themes/default/templates/index.html.ep:100\nmsgid \"Create a zip archive with the files before uploading?\"\nmsgstr \"アップロード前にファイルをZip圧縮する\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:26\nmsgid \"Created at\"\nmsgstr \"作成日時\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:14\nmsgid \"Delete\"\nmsgstr \"削除\"\n\n#: themes/default/templates/files.html.ep:30\n#: themes/default/templates/index.html.ep:90\nmsgid \"Delete at first download?\"\nmsgstr \"初回ダウンロード時に削除\"\n\n#: themes/default/templates/files.html.ep:19\nmsgid \"Delete selected files\"\nmsgstr \"選択したファイルを削除\"\n\n#: themes/default/templates/files.html.ep:33\n#: themes/default/templates/partial/index.js.ep:19\nmsgid \"Deletion link\"\nmsgstr \"削除リンク\"\n\n#: themes/default/templates/delays.html.ep:9\nmsgid \"\"\n\"Don't worry: if a user begins to download the file before the expiration and \"\n\"the download ends after the expiration, he will be able to get the file.\"\nmsgstr \"\"\n\"ご安心ください、ユーザーが有効期限前にファイルのダウンロードを開始し、有効期限後にダウンロードが終了した場合は、ファイルを取得することができます。\"\n\n#: themes/default/templates/partial/index.js.ep:21\n#: themes/default/templates/render.html.ep:28\nmsgid \"Download\"\nmsgstr \"ダウンロード\"\n\n#: themes/default/templates/partial/render.js.ep:4\nmsgid \"Download aborted.\"\nmsgstr \"ダウンロードは中断されました。\"\n\n#: themes/default/templates/files.html.ep:28\n#: themes/default/templates/partial/index.js.ep:20\nmsgid \"Download link\"\nmsgstr \"ダウンロードリンク\"\n\n#: themes/default/templates/about.html.ep:10\nmsgid \"\"\n\"Drag and drop files in the appropriate area or use the traditional way to \"\n\"send files and the files will be chunked, encrypted and sent to the server. \"\n\"You will get two links per file: a download link, that you give to the \"\n\"people you want to share the file with and a deletion link, allowing you to \"\n\"delete the file whenever you want.\"\nmsgstr \"\"\n\"ファイルを適切な場所にドラッグ＆ドロップするか、参照してファイルを送信すると、ファイルは分割後、暗号化されてサーバーに送信されます。1つのファイルにつき2つのリンクが表示されます。ダウンロードリンクはファイルを共有したい人に渡すもので、削除リンクを使用すればいつでもファイルを削除することができます。\"\n\n#: themes/default/templates/index.html.ep:122\nmsgid \"Drop files here\"\nmsgstr \"ファイルをここにドロップ\"\n\n#: themes/default/templates/invitations/invite.html.ep:40\nmsgid \"Email address of your guest\"\nmsgstr \"ゲストのメールアドレス\"\n\n#: themes/default/templates/mail.html.ep:39\nmsgid \"Email body\"\nmsgstr \"メール本文\"\n\n#: themes/default/templates/mail.html.ep:31\nmsgid \"Email subject\"\nmsgstr \"メール件名\"\n\n#: themes/default/templates/mail.html.ep:25\n#: themes/default/templates/mail.html.ep:27\nmsgid \"Emails\"\nmsgstr \"メール\"\n\n#: themes/default/templates/partial/index.js.ep:22\nmsgid \"Encrypting part XX1 of XX2\"\nmsgstr \"パートXX1 / XX2を暗号化中\"\n\n#: lib/Lufi/Controller/Files.pm:283\nmsgid \"Error: the file existed but was deleted.\"\nmsgstr \"エラー:ファイルは存在しましたが削除されました。\"\n\n#: lib/Lufi/Controller/Files.pm:363\nmsgid \"Error: the file has not been sent entirely.\"\nmsgstr \"エラー:ファイルが完全に送信されていません。\"\n\n#: lib/Lufi/Controller/Files.pm:373\nmsgid \"Error: unable to find the file. Are you sure of your URL?\"\nmsgstr \"エラー:ファイルが見つかりませんでした。URLが間違っていませんか？\"\n\n#: themes/default/templates/partial/index.js.ep:23\nmsgid \"Expiration:\"\nmsgstr \"失効日時:\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:27\nmsgid \"Expire at\"\nmsgstr \"失効日時\"\n\n#: themes/default/templates/files.html.ep:32\nmsgid \"Expires at\"\nmsgstr \"失効日時\"\n\n#: themes/default/templates/files.html.ep:12\nmsgid \"Export localStorage data\"\nmsgstr \"ローカルストレージのデータをエクスポート\"\n\n#: lib/Lufi/Controller/Files.pm:465\nmsgid \"File deleted\"\nmsgstr \"ファイルは削除されました\"\n\n#: themes/default/templates/partial/render.js.ep:9\nmsgid \"File downloaded\"\nmsgstr \"ファイルはダウンロードされました\"\n\n#: themes/default/templates/files.html.ep:27\nmsgid \"File name\"\nmsgstr \"ファイル名\"\n\n#: themes/default/templates/partial/index.js.ep:24\nmsgid \"File uploaded\"\nmsgstr \"ファイルはアップロードされました\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:61\nmsgid \"Files\"\nmsgstr \"ファイル\"\n\n#: themes/default/templates/index.html.ep:80\nmsgid \"Files deleted at first download\"\nmsgstr \"最初のダウンロードによりファイルは削除されました\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:28\nmsgid \"Files sent at\"\nmsgstr \"ファイルの送信元\"\n\n#: themes/default/templates/partial/invitations.js.ep:8\nmsgid \"Files sent in invitation XX1 by XX2\"\nmsgstr \"ファイルは招待 XX1を介してXX2によって送信されました\"\n\n#: themes/default/templates/partial/render.js.ep:8\nmsgid \"Get the file\"\nmsgstr \"ファイルを取得\"\n\n#: themes/default/templates/about.html.ep:18\nmsgid \"\"\n\"Get the source code on <a \"\n\"href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi\\\" \"\n\"class=\\\"classic\\\">the official repository</a> or on its <a \"\n\"href=\\\"https://github.com/ldidry/lufi\\\" class=\\\"classic\\\">Github mirror</a>\"\nmsgstr \"\"\n\"ソースコードを<a href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi\\\" \"\n\"class=\\\"classic\\\">公式リポジトリ</a>または <a href=\\\"https://github.com/ldidry/lufi\\\" \"\n\"class=\\\"classic\\\">Githubミラー</a>から入手できます\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:24\nmsgid \"Guest mail\"\nmsgstr \"ゲストメール\"\n\n#. (ucfirst(stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:6\n#, qt-format\nmsgid \"Hello %1,\"\nmsgstr \"%1 さん、こんにちは！\"\n\n#: themes/default/templates/invitations/invite.mail.ep:4\nmsgid \"Hello,\"\nmsgstr \"こんにちは。\"\n\n#: themes/default/templates/partial/mail.js.ep:35\nmsgid \"Hello,\\\\n\\\\nHere's some files I want to share with you:\\\\n\"\nmsgstr \"こんにちは。次の共有したいファイルがあります。:\\\\n\"\n\n#: themes/default/templates/mail.html.ep:35\nmsgid \"Here's some files\"\nmsgstr \"次のファイル\"\n\n#: themes/default/templates/partial/invitations.js.ep:7\nmsgid \"Hide hidden invitations\"\nmsgstr \"非表示の招待を隠す\"\n\n#: themes/default/templates/partial/index.js.ep:26\nmsgid \"Hit Enter, then Ctrl+C to copy all the download links\"\nmsgstr \"Enterキーを押した後、Ctrl+Cですべてのダウンロードリンクをコピーします\"\n\n#: themes/default/templates/partial/index.js.ep:25\nmsgid \"Hit Enter, then Ctrl+C to copy the download link\"\nmsgstr \"Enterキーを押した後、Ctrl+Cでダウンロードリンクをコピーします\"\n\n#: themes/default/templates/about.html.ep:9\nmsgid \"How does it work?\"\nmsgstr \"どのように使用しますか？\"\n\n#: themes/default/templates/invitations/invite.html.ep:46\nmsgid \"How many days would you like the invitation to be valid?\"\nmsgstr \"招待の有効期限は何日間ですか？\"\n\n#: themes/default/templates/about.html.ep:16\nmsgid \"How to install the software on my server?\"\nmsgstr \"どうすればLufiを私のサーバーにインストールできますか？\"\n\n#: themes/default/templates/about.html.ep:12\nmsgid \"How to report an illegal file?\"\nmsgstr \"違法なファイルを報告するにはどうすればよいですか？\"\n\n#: themes/default/templates/delays.html.ep:8\nmsgid \"If you choose a delay, the file will be deleted after that delay.\"\nmsgstr \"削除時間を設定した場合、その時間後にファイルは削除されます。\"\n\n#: themes/default/templates/mail.html.ep:15\nmsgid \"\"\n\"If you send the mail from this server, the links will be sent to the server, \"\n\"which may lower your privacy protection.\"\nmsgstr \"このサーバーからメールを送信すると、リンクがサーバーに送信されるため、プライバシーが低下する可能性があります。\"\n\n#: themes/default/templates/files.html.ep:14\nmsgid \"Import localStorage data\"\nmsgstr \"ローカルストレージのデータをインポート\"\n\n#: themes/default/templates/index.html.ep:53\nmsgid \"Important: more information on delays\"\nmsgstr \"重要:削除時間に関する詳細\"\n\n#: themes/default/templates/delays.html.ep:5\nmsgid \"Information about delays\"\nmsgstr \"削除時間に関する情報\"\n\n#: themes/default/templates/files.html.ep:18\n#: themes/default/templates/invitations/my_invitations.html.ep:12\nmsgid \"Invert selection\"\nmsgstr \"選択を反転\"\n\n#. ($i->guest_mail, $url)\n#: lib/Lufi/Controller/Invitation.pm:172\n#, qt-format\nmsgid \"Invitation resent to %1.<br> URL: %2\"\nmsgstr \"招待は%1に再送されました。<br> URL: %2\"\n\n#. ($invitation->guest_mail, $url)\n#: lib/Lufi/Controller/Invitation.pm:88\n#, qt-format\nmsgid \"Invitation sent to %1.<br> URL: %2\"\nmsgstr \"招待は%1に送信されました。<br> URL: %2\"\n\n#: themes/default/templates/invitations/invite.html.ep:27\n#: themes/default/templates/layouts/default.html.ep:36\n#: themes/default/templates/layouts/default.html.ep:69\nmsgid \"Invite a guest\"\nmsgstr \"ゲストを招待\"\n\n#: themes/default/templates/partial/render.js.ep:6\nmsgid \"\"\n\"It seems that the key in your URL is incorrect. Please, verify your URL.\"\nmsgstr \"URL内のキーが間違っているようです。URLが間違ってないかご確認ください。\"\n\n#: themes/default/templates/index.html.ep:12\nmsgid \"Javascript is disabled. You won't be able to use Lufi.\"\nmsgstr \"Javascriptが無効です。有効でないとLufiを使用できません。\"\n\n#: themes/default/templates/layouts/default.html.ep:44\n#: themes/default/templates/layouts/default.html.ep:46\n#: themes/default/templates/layouts/default.html.ep:77\n#: themes/default/templates/layouts/default.html.ep:79\nmsgid \"Language\"\nmsgstr \"言語\"\n\n#. (sprintf('<a href=\"https://framagit.org/fiat-tux/hat-softwares/lufi/-/commit/%s\" class=\"classic\">%s</a>', stash('version')\n#: themes/default/templates/about.html.ep:22\n#, qt-format\nmsgid \"Latest commit of this instance: %1\"\nmsgstr \"このインスタンスの最新のコミット:%1\"\n\n#. (sprintf('<a href=\"https://framagit.org/fiat-tux/hat-softwares/lufi/-/releases/%s\" class=\"classic\">%s</a>', stash('version')\n#: themes/default/templates/about.html.ep:21\n#, qt-format\nmsgid \"Latest tag of this instance: %1\"\nmsgstr \"このインスタンスの最新のタグ:%1\"\n\n#: themes/default/templates/login.html.ep:15\nmsgid \"Login\"\nmsgstr \"ログイン\"\n\n#: themes/default/templates/layouts/default.html.ep:58\n#: themes/default/templates/layouts/default.html.ep:91\nmsgid \"Logout\"\nmsgstr \"ログアウト\"\n\n#: themes/default/templates/about.html.ep:4\nmsgid \"Lufi is a free (as in free speech) file hosting software.\"\nmsgstr \"Lufiは自由なファイルホスティングソフトウェアです。\"\n\n#: themes/default/templates/partial/files.js.ep:12\nmsgid \"\"\n\"Lufi recently changed its way to store files information.\\\\n\\\\nNo files have \"\n\"been found in the new localStorage location but we found files in the old \"\n\"one.\\\\nDo you want to import those informations?\\\\n\\\\nPlease note that this \"\n\"is the only time that we will ask you this.\"\nmsgstr \"\"\n\"Lufi \"\n\"は最近、ファイル情報の保存方法を変更しました。\\\\n\\\\n新しいローカルストレージにはファイルがありませんでしたが、古いローカルストレージにファイルがありました。\\\\nこれらの情報をインポートしますか？\\\\n\\\\nこの質問をするのは今回だけですので、ご了承ください。\"\n\n#: themes/default/templates/files.html.ep:34\nmsgid \"Mail\"\nmsgstr \"メール\"\n\n#: themes/default/templates/files.html.ep:3\n#: themes/default/templates/layouts/default.html.ep:34\n#: themes/default/templates/layouts/default.html.ep:67\nmsgid \"My files\"\nmsgstr \"私のファイル\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:5\n#: themes/default/templates/layouts/default.html.ep:37\n#: themes/default/templates/layouts/default.html.ep:70\nmsgid \"My invitations\"\nmsgstr \"私の招待\"\n\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:17\nmsgid \"\"\n\"NB: this list includes the list of files that have already been sent to you.\"\nmsgstr \"注：このリストには、すでに送信されたファイルのリストが含まれています。\"\n\n#: themes/default/templates/index.html.ep:115\nmsgid \"Name of the zip file\"\nmsgstr \"Zipファイルの名前\"\n\n#. (format_bytes($json->{size})\n#: lib/Lufi/Controller/Files.pm:109\n#, qt-format\nmsgid \"No enough space available on the server for this file (size: %1).\"\nmsgstr \"サーバーにこのファイルのための十分なスペースがありません。(サイズ: %1)\"\n\n#: themes/default/templates/partial/files.js.ep:10\n#: themes/default/templates/partial/index.js.ep:29\nmsgid \"No expiration delay\"\nmsgstr \"削除時間なし\"\n\n#: themes/default/templates/files.html.ep:8\nmsgid \"\"\n\"Only the files sent with this browser will be listed here. This list is \"\n\"stored in localStorage: if you delete your localStorage data, you'll lose \"\n\"this list.\"\nmsgstr \"\"\n\"このブラウザで送信されたファイルのみがここに表示されます。このリストはローカルストレージに保存されています。ローカルストレージのデータを削除すると、このリストも失われます。\"\n\n#: themes/default/templates/index.html.ep:106\n#: themes/default/templates/login.html.ep:21\n#: themes/default/templates/render.html.ep:26\nmsgid \"Password\"\nmsgstr \"パスワード\"\n\n#. (config('contact')\n#: themes/default/templates/about.html.ep:13\n#, qt-format\nmsgid \"Please contact the administrator: %1\"\nmsgstr \"管理者にお問い合わせください:%1\"\n\n#: themes/default/templates/render.html.ep:33\nmsgid \"\"\n\"Please wait while we are getting your file. We first need to download and \"\n\"decrypt all parts before you can get it.\"\nmsgstr \"\"\n\"しばらくお待ちください。あなたのファイルを取得しています。あなたがファイルを入手する前に、まずすべてのパーツを取得して復号する必要があります。\"\n\n#: lib/Lufi/Controller/Auth.pm:38\nmsgid \"\"\n\"Please, check your credentials or your right to access this service: unable \"\n\"to authenticate.\"\nmsgstr \"このサービスにアクセスするための資格をご確認ください:認証できませんでした。\"\n\n#: themes/default/templates/about.html.ep:5\nmsgid \"Privacy\"\nmsgstr \"プライバシー\"\n\n#: themes/default/templates/files.html.ep:13\nmsgid \"Purge expired files from localStorage\"\nmsgstr \"ローカルストレージから期限切れのファイルを削除する\"\n\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:20\nmsgid \"Regards,\"\nmsgstr \"よろしくおねがいします。\"\n\n#: themes/default/templates/invitations/invite.mail.ep:15\nmsgid \"Regards.\"\nmsgstr \"よろしくおねがいします。\"\n\n#: themes/default/templates/layouts/default.html.ep:31\n#: themes/default/templates/layouts/default.html.ep:64\nmsgid \"Report file\"\nmsgstr \"ファイルを報告\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:15\nmsgid \"Resend invitation mail\"\nmsgstr \"招待メールを再送\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:9\nmsgid \"Rows in purple mean that the invitations have expired.\"\nmsgstr \"紫色の行は、招待の有効期限が切れていることを意味します。\"\n\n#: themes/default/templates/files.html.ep:9\nmsgid \"\"\n\"Rows in red mean that the files have expired and are no longer available.\"\nmsgstr \"赤色の行は、ファイルが期限切れで利用できなくなっていることを意味します。\"\n\n#: themes/default/templates/partial/index.js.ep:27\nmsgid \"Send all links by email\"\nmsgstr \"全てのリンクをメールで送信する\"\n\n#: themes/default/templates/invitations/invite.html.ep:50\nmsgid \"Send the invitation\"\nmsgstr \"招待を送信\"\n\n#: themes/default/templates/mail.html.ep:46\nmsgid \"Send with this server\"\nmsgstr \"このサーバーから送信\"\n\n#: themes/default/templates/mail.html.ep:47\nmsgid \"Send with your own mail software\"\nmsgstr \"自身のメールクライアントから送信\"\n\n#: themes/default/templates/partial/index.js.ep:30\nmsgid \"\"\n\"Sending part XX1 of XX2. Please, be patient, the progress bar can take a \"\n\"while to move.\"\nmsgstr \"パートXX1/XX2を送信中です。暫くお待ちください。プログレスバーが動くまでに時間がかかることがあります。\"\n\n#. (url_for('/')\n#: themes/default/templates/partial/mail.js.ep:48\n#, qt-format\nmsgid \"Share your files in total privacy on %1\"\nmsgstr \"%1でファイルを完全なプライバシーで共有する\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:13\n#: themes/default/templates/partial/invitations.js.ep:9\nmsgid \"Show hidden invitations\"\nmsgstr \"非表示の招待を表示する\"\n\n#: themes/default/templates/partial/render.js.ep:12\nmsgid \"Show zip content\"\nmsgstr \"Zipコンテンツを表示する\"\n\n#: themes/default/templates/layouts/default.html.ep:40\n#: themes/default/templates/layouts/default.html.ep:73\n#: themes/default/templates/login.html.ep:28\n#: themes/default/templates/logout.html.ep:17\nmsgid \"Signin\"\nmsgstr \"サインイン\"\n\n#: lib/Lufi/Controller/Invitation.pm:284\n#: themes/default/templates/invitations/exception.html.ep:16\nmsgid \"\"\n\"Sorry, the invitation doesnât exist. Are you sure you are on the right URL?\"\nmsgstr \"招待が見つかりませんでした。正しいURLを入力していますか？\"\n\n#: themes/default/templates/index.html.ep:46\nmsgid \"Sorry, the uploading is currently disabled. Please try again later.\"\nmsgstr \"申し訳ありませんが、現在アップロードができません。後日、再度お試しください。\"\n\n#: lib/Lufi/Controller/Files.pm:82\nmsgid \"Sorry, uploading is disabled.\"\nmsgstr \"申し訳ありません。現在アップロードは無効です。\"\n\n#: themes/default/templates/invitations/exception.html.ep:7\nmsgid \"Sorry, your invitation has expired or has been deleted.\"\nmsgstr \"申し訳ありません。招待は失効したか削除されました。\"\n\n#. ($invit->ldap_user_mail)\n#: lib/Lufi/Controller/Files.pm:123\n#, qt-format\nmsgid \"\"\n\"Sorry, your invitation has expired or has been deleted. Please contact %1 to \"\n\"have another invitation.\"\nmsgstr \"申し訳ありません。招待は失効したか削除されました。%1に連絡して新たに招待を受けてください。\"\n\n#. ($invitation->ldap_user_mail)\n#: lib/Lufi/Controller/Invitation.pm:277\n#, qt-format\nmsgid \"The URLs of your files have been sent by email to %1.\"\nmsgstr \"ファイルの URL は、メールで %1 に送信されました。\"\n\n#: themes/default/templates/about.html.ep:7\nmsgid \"\"\n\"The administrator can only see the file's name, its size and its mimetype \"\n\"(what kind of file it is: video, text, etc.).\"\nmsgstr \"管理者が見ることができるのは、ファイル名、サイズ、MIMEタイプ（ビデオ、テキストなどのファイルの種類）だけです。\"\n\n#: lib/Lufi/Controller/Mail.pm:53\nmsgid \"\"\n\"The body of the mail must contain at least one URL pointing to a file hosted \"\n\"on this instance.\"\nmsgstr \"メールの本文には、このインスタンスでホストされているファイルを指すURLを少なくとも1つ含める必要があります。\"\n\n#: themes/default/templates/partial/files.js.ep:11\nmsgid \"The data has been successfully imported.\"\nmsgstr \"データは正常にインポートされました。\"\n\n#: lib/Lufi/Controller/Mail.pm:73\nmsgid \"The email body can't be empty.\"\nmsgstr \"メール本文は空白にできません。\"\n\n#: lib/Lufi/Controller/Mail.pm:72\nmsgid \"The email subject can't be empty.\"\nmsgstr \"メールの件名は空白にできません。\"\n\n#. ($expire_at, $max_expire_at)\n#: lib/Lufi/Controller/Invitation.pm:52\n#, qt-format\nmsgid \"The expiration delay (%1) is not between 1 and %2 days.\"\nmsgstr \"削除期限 (%1) が 1 日から %2 日の間ではありません。\"\n\n#: lib/Lufi/Controller/Files.pm:462\nmsgid \"The file has already been deleted\"\nmsgstr \"ファイルは既に削除されました\"\n\n#: themes/default/templates/about.html.ep:6\nmsgid \"\"\n\"The files uploaded on a Lufi instance are encrypted before the upload to the \"\n\"server: the administrator of the server can not see the file's content.\"\nmsgstr \"Lufi インスタンスにアップロードされるファイルは、サーバーに送信される前に暗号化されます。\"\n\n#. (join(', ', @bad)\n#: lib/Lufi/Controller/Mail.pm:68\n#, qt-format\nmsgid \"The following email addresses are not valid: %1\"\nmsgstr \"次のメールアドレスは無効です: %1\"\n\n#. ($guest_mail)\n#: lib/Lufi/Controller/Invitation.pm:49\n#, qt-format\nmsgid \"The guest email address (%1) is unvalid.\"\nmsgstr \"ゲストのメールアドレス(%1)は無効です。\"\n\n#. ($i->token, $i->guest_mail)\n#: lib/Lufi/Controller/Invitation.pm:151\n#, qt-format\nmsgid \"\"\n\"The invitation %1 canât be resent: %2 has already sent files.<br>Please \"\n\"create a new invitation.\"\nmsgstr \"招待 %1 は再送できません: %2 は既に送信済みのファイルです。<br>新しく招待を作成してください。\"\n\n#. ($i->token)\n#: lib/Lufi/Controller/Invitation.pm:131\n#, qt-format\nmsgid \"The invitation %1 has been deleted.\"\nmsgstr \"招待 %1 は削除されました。\"\n\n#. (stash('user_mail')\n#: themes/default/templates/invitations/invite.html.ep:34\n#, qt-format\nmsgid \"The invitation mail will be send from your email address (%1).\"\nmsgstr \"招待はあなたのメールアドレス(%1)から送信されます。\"\n\n#: themes/default/templates/partial/index.js.ep:16\nmsgid \"The link(s) has been copied to your clipboard\"\nmsgstr \"リンクはクリップボードにコピーされました\"\n\n#. (stash('invitation')\n#: themes/default/templates/index.html.ep:30\n#, qt-format\nmsgid \"\"\n\"The link(s) of your file(s) will automatically be sent by mail to %1 (%2)\"\nmsgstr \"あなたのファイルのリンクは、自動的に %1 (%2) にメールで送信されます\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:11\n#, qt-format\nmsgid \"The links of your file(s) will automatically be sent by mail to %1.\"\nmsgstr \"あなたのファイルのリンクは、自動的に%1にメールで送信されます。\"\n\n#: lib/Lufi/Controller/Mail.pm:97\nmsgid \"The mail has been sent.\"\nmsgstr \"メールは送信されました。\"\n\n#: themes/default/templates/about.html.ep:15\nmsgid \"\"\n\"The original (and only for now) author is <a href=\\\"https://fiat-tux.fr\\\" \"\n\"class=\\\"classic\\\">Luc Didry</a>.\"\nmsgstr \"\"\n\"このソフトウェアの原作者は<a href=\\\"https://fiat-tux.fr\\\" class=\\\"classic\\\">Luc \"\n\"Didry</a>です。\"\n\n#: lib/Lufi/Controller/Files.pm:230\nmsgid \"\"\n\"The server was unable to find the file record to add your file part to. \"\n\"Please, contact the administrator.\"\nmsgstr \"ファイルパーツを追加するファイルレコードがサーバーに見つかりませんでした。お手数ですが、管理者にお問い合わせください。\"\n\n#: lib/Lufi/Controller/Files.pm:289\nmsgid \"This file has been deactivated by the admins. Contact them to know why.\"\nmsgstr \"このファイルは管理者によって無効にされています。理由については管理者にお問い合わせください。\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:46\n#: themes/default/templates/partial/invitations.js.ep:6\nmsgid \"This invitation is normally hidden\"\nmsgstr \"この招待は通常は非表示です\"\n\n#. (stash('expires')\n#: themes/default/templates/invitations/invite.mail.ep:13\n#, qt-format\nmsgid \"This invitation is valid until %1.\"\nmsgstr \"この招待は %1 まで有効です。\"\n\n#: themes/default/templates/delays.html.ep:13\nmsgid \"\"\n\"This server sets limitations according to the file size. The expiration \"\n\"delay of your file will be the minimum between what you choose and the \"\n\"following limitations:\"\nmsgstr \"このサーバーでは、ファイルサイズに応じて制限を設けています。ファイルの有効期限は、あなたが選択されたものと次の制限との間の最小値となります:\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:16\nmsgid \"Toggle visibility\"\nmsgstr \"可視性を切り替え\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:25\nmsgid \"URL\"\nmsgstr \"URL\"\n\n#: themes/default/templates/partial/index.js.ep:17\nmsgid \"Unable to copy the link(s) to your clipboard\"\nmsgstr \"リンクをクリップボードにコピーできませんでした\"\n\n#: themes/default/templates/partial/render.js.ep:13\nmsgid \"\"\n\"Unable to download the file: too much unsuccessful attempts to open a \"\n\"websocket. Please, contact the administrator.\"\nmsgstr \"ファイルをダウンロードできませんでした:Websocketを開くのに何度も失敗しました。管理者にお問い合わせください。\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:433\n#, qt-format\nmsgid \"\"\n\"Unable to get counter for %1. The file does not exists. It will be removed \"\n\"from your localStorage.\"\nmsgstr \"%1のダウンロード数を取得できませんでした。ファイルが存在しないかローカルストレージから削除されています。\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:423\n#, qt-format\nmsgid \"Unable to get counter for %1. The token is invalid.\"\nmsgstr \"%1のダウンロード数を取得できませんでした。トークンが無効です。\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:443\n#, qt-format\nmsgid \"Unable to get counter for %1. You are not authenticated.\"\nmsgstr \"%1のダウンロード数を取得できませんでした。あなたは認証されていません。\"\n\n#: themes/default/templates/layouts/default.html.ep:33\n#: themes/default/templates/layouts/default.html.ep:66\nmsgid \"Upload files\"\nmsgstr \"ファイルをアップロード\"\n\n#: themes/default/templates/index.html.ep:145\nmsgid \"Upload generated zip file\"\nmsgstr \"生成されたZipファイルをアップロード\"\n\n#: themes/default/templates/files.html.ep:31\nmsgid \"Uploaded at\"\nmsgstr \"アップロード日時\"\n\n#: themes/default/templates/index.html.ep:153\nmsgid \"Uploaded files\"\nmsgstr \"アップロードされたファイル\"\n\n#: themes/default/templates/about.html.ep:20\nmsgid \"Version\"\nmsgstr \"バージョン\"\n\n#: themes/default/templates/partial/index.js.ep:31\nmsgid \"Websocket communication error\"\nmsgstr \"Websocket通信エラー\"\n\n#: themes/default/templates/about.html.ep:3\nmsgid \"What is Lufi?\"\nmsgstr \"Lufiとは何ですか？\"\n\n#: themes/default/templates/about.html.ep:14\nmsgid \"Who wrote this software?\"\nmsgstr \"誰がこのソフトウェアを作っていますか？\"\n\n#: themes/default/templates/partial/index.js.ep:13\nmsgid \"XXX file has been added to upload queue.\"\nmsgstr \"XXX 個のファイルがアップロードのキューに追加されました。\"\n\n#: themes/default/templates/invitations/invite.html.ep:30\nmsgid \"\"\n\"You can invite someone to send you files through this Lufi instance even if \"\n\"they donât have an account on it.\"\nmsgstr \"相手がLufiのアカウントを持っていなくても、このLufiインスタンスを通してファイルを送るように招待することができます。\"\n\n#: themes/default/templates/about.html.ep:11\nmsgid \"\"\n\"You can see the list of your files by clicking on the \\\"My files\\\" link at \"\n\"the top right of this page.\"\nmsgstr \"このページの右上にある「私のファイル」のリンクをクリックすると、自分のファイルの一覧が表示されます。\"\n\n#: lib/Lufi/Controller/Mail.pm:42\nmsgid \"You can't add URLs that are not related to this instance.\"\nmsgstr \"このインスタンスに関係のないURLを追加することはできません。\"\n\n#: themes/default/templates/about.html.ep:8\nmsgid \"\"\n\"You don't need to register yourself to upload files but be aware that, for \"\n\"legal reasons, your IP address will be stored when you send a file. Don't \"\n\"panic, this is normally the case for all sites on which you send files.\"\nmsgstr \"\"\n\"ファイルをアップロードするために登録する必要はありませんが、法律上の理由から、ファイルを送信する際にあなたのIPアドレスが記録されますのでご注意ください。これは通常、ファイルを送信するすべてのサイトに当てはまります。\"\n\n#: themes/default/templates/partial/render.js.ep:11\nmsgid \"\"\n\"You don't seem to have a key in your URL. You won't be able to decrypt the \"\n\"file. Download canceled.\"\nmsgstr \"URLにキーが入っていないようです。ファイルの復号化ができません。ダウンロードを中止しました。\"\n\n#: themes/default/templates/partial/render.js.ep:7\nmsgid \"\"\n\"You have attempted to leave this page. The download will be canceled. Are \"\n\"you sure?\"\nmsgstr \"このページから離れると、ダウンロードはキャンセルされます。本当に宜しいですか？\"\n\n#: themes/default/templates/partial/index.js.ep:14\nmsgid \"\"\n\"You have attempted to leave this page. The upload will be canceled. Are you \"\n\"sure?\"\nmsgstr \"このページから離れると、アップロードはキャンセルされます。本当に宜しいですか？\"\n\n#: themes/default/templates/logout.html.ep:14\nmsgid \"You have been successfully logged out.\"\nmsgstr \"正常にログアウトされました。\"\n\n#: lib/Lufi/Controller/Mail.pm:71\nmsgid \"You must give email addresses.\"\nmsgstr \"メールアドレスを指定する必要があります。\"\n\n#: themes/default/templates/index.html.ep:38\nmsgid \"\"\n\"Your browser does not have enough entropy to generate a strong encryption \"\n\"key. Please wait (it's better if you do things on your computer while \"\n\"waiting).\"\nmsgstr \"\"\n\"お使いのブラウザには、強力な暗号化キーを生成するための十分なエントロピーがありません。しばらくお待ちください（待っている間、コンピュータで何かをするとより良いでしょう）。\"\n\n#. (format_bytes($json->{size})\n#: lib/Lufi/Controller/Files.pm:95\n#, qt-format\nmsgid \"Your file is too big: %1 (maximum size allowed: %2)\"\nmsgstr \"ファイルが大きすぎます: %1 (最大サイズ: %2)\"\n\n#: lib/Lufi/Controller/Files.pm:345\nmsgid \"Your password is not valid. Please refresh the page to retry.\"\nmsgstr \"パスワードが無効です。ページをリロードして再試行してください。\"\n\n#: themes/default/templates/partial/render.js.ep:14\nmsgid \"Zip content:\"\nmsgstr \"Zipコンテンツ:\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:24\n#, qt-format\nmsgid \"between %1 and %2, the file will be kept %3 day(s).\"\nmsgstr \"%1 と %2 の間に設定すると、ファイルは%2 日間保存されます。\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:26\n#, qt-format\nmsgid \"between %1 and %2, the file will be kept forever.\"\nmsgstr \"%1 と %2 の間に設定すると、ファイルは永遠に保存されます。\"\n\n#: themes/default/templates/partial/mail.js.ep:42\nmsgid \"deadline: \"\nmsgstr \"期限: \"\n\n#: themes/default/templates/partial/invitations.js.ep:5\nmsgid \"expires on XXX\"\nmsgstr \"XXX に失効\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:30\n#, qt-format\nmsgid \"for %1 and more, the file will be kept %2 day(s)\"\nmsgstr \"%1 以上にすると、ファイルは%2 日間保存されます。\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:32\n#, qt-format\nmsgid \"for %1 and more, the file will be kept forever.\"\nmsgstr \"%1 以上にすると、ファイルは永遠に保存されます。\"\n\n#: themes/default/templates/index.html.ep:3\nmsgid \"no time limit\"\nmsgstr \"タイムリミットなし\"\n\n#: themes/default/templates/index.html.ep:124\nmsgid \"or\"\nmsgstr \"または\"\n\n#. ($e->{name}, format_bytes($e->{size})\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:12\n#, qt-format\nmsgid \"â %1 (%2), that will expire on %3\"\nmsgstr \"— %1 (%2), は %3で期限切れになります\"\n"
  },
  {
    "path": "themes/default/lib/Lufi/I18N/lufi.pot",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.\n#\n#, fuzzy\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\\n\"\n\"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\\n\"\n\"Last-Translator: FULL NAME <EMAIL@ADDRESS>\\n\"\n\"Language-Team: LANGUAGE <LL@li.org>\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=CHARSET\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\n#. ($delay)\n#. (max_delay)\n#: themes/default/templates/index.html.ep:56 themes/default/templates/index.html.ep:65 themes/default/templates/index.html.ep:66\nmsgid \"%1 days\"\nmsgstr \"\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:2\nmsgid \"%1 invites you to send him/her files\"\nmsgstr \"\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:6\nmsgid \"%1 invites you to send him/her files through Lufi.\"\nmsgstr \"\"\n\n#. (stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:4\nmsgid \"%1 sent you files\"\nmsgstr \"\"\n\n#. (stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:8\nmsgid \"%1 used your invitation to send you files:\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Invitation.pm:172 lib/Lufi/Controller/Invitation.pm:85 themes/default/templates/invitations/my_invitations.html.ep:51 themes/default/templates/invitations/my_invitations.html.ep:52 themes/default/templates/invitations/my_invitations.html.ep:53 themes/default/templates/invitations/notification_files_sent.mail.ep:12\nmsgid \"%A %d %B %Y at %T\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/index.js.ep:28\nmsgid \"(max size: XXX)\"\nmsgstr \"\"\n\n#: themes/default/templates/index.html.ep:5\nmsgid \"1 year\"\nmsgstr \"\"\n\n#: themes/default/templates/index.html.ep:4 themes/default/templates/index.html.ep:65\nmsgid \"24 hours\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/mail.js.ep:40\nmsgid \":\"\nmsgstr \"\"\n\n#: themes/default/templates/render.html.ep:42\nmsgid \"Abort\"\nmsgstr \"\"\n\n#: themes/default/templates/layouts/default.html.ep:53 themes/default/templates/layouts/default.html.ep:86\nmsgid \"About\"\nmsgstr \"\"\n\n#: themes/default/templates/index.html.ep:107\nmsgid \"Add a password to file(s)\"\nmsgstr \"\"\n\n#: themes/default/templates/mail.html.ep:16\nmsgid \"Adding URLs not related to this Lufi instance to the mail body or subject is prohibited.\"\nmsgstr \"\"\n\n#: themes/default/templates/delete_file.html.ep:18\nmsgid \"Are you sure you want to delete that file?\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/invitations.js.ep:3\nmsgid \"Are you sure you want to delete the selected invitations?\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/invitations.js.ep:4\nmsgid \"Are you sure you want to resend the invitation mail for the selected invitations?\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:17\nmsgid \"As Lufi is a free software licensed under of the terms of the <a href=\\\"https://gnu.org/licenses/agpl.html\\\" class=\\\"classic\\\">AGPLv3</a>, you can install it on you own server. Have a look on the <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi/wikis/home\\\" class=\\\"classic\\\">Wiki</a> for the procedure.\"\nmsgstr \"\"\n\n#. (stash('nbslices')\n#: themes/default/templates/partial/render.js.ep:10\nmsgid \"Asking for file part XX1 of %1\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:23\nmsgid \"Back to homepage\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Mail.pm:26\nmsgid \"Bad CSRF token!\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Auth.pm:38 lib/Lufi/Controller/Auth.pm:60 lib/Lufi/Controller/Files.pm:474\nmsgid \"Bad CSRF token.\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/render.js.ep:5\nmsgid \"Click here to refresh the page and restart the download.\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/invite.mail.ep:8\nmsgid \"Click on the following URL to upload files on Lufi:\"\nmsgstr \"\"\n\n#: themes/default/templates/index.html.ep:126\nmsgid \"Click to open the file browser\"\nmsgstr \"\"\n\n#: themes/default/templates/delays.html.ep:42 themes/default/templates/invitations/my_invitations.html.ep:80\nmsgid \"Close\"\nmsgstr \"\"\n\n#: themes/default/templates/mail.html.ep:23\nmsgid \"Comma-separated email addresses\"\nmsgstr \"\"\n\n#: themes/default/templates/index.html.ep:140\nmsgid \"Compressing zip file…\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/index.js.ep:15\nmsgid \"Copy all links to clipboard\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/index.js.ep:18\nmsgid \"Copy to clipboard\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Files.pm:524\nmsgid \"Could not delete the file. You are not authenticated.\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Files.pm:505\nmsgid \"Could not find the file. Are you sure of the URL and the token?\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Files.pm:394\nmsgid \"Could not find the file. Are you sure of the URL?\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:29\nmsgid \"Counter\"\nmsgstr \"\"\n\n#: themes/default/templates/index.html.ep:100\nmsgid \"Create a zip archive with the files before uploading?\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:26\nmsgid \"Created at\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:14\nmsgid \"Delete\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:30 themes/default/templates/index.html.ep:90\nmsgid \"Delete at first download?\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:19\nmsgid \"Delete selected files\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:33 themes/default/templates/partial/index.js.ep:19\nmsgid \"Deletion link\"\nmsgstr \"\"\n\n#: themes/default/templates/delays.html.ep:9\nmsgid \"Don't worry: if a user begins to download the file before the expiration and the download ends after the expiration, he will be able to get the file.\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/index.js.ep:21 themes/default/templates/render.html.ep:28\nmsgid \"Download\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/render.js.ep:4\nmsgid \"Download aborted.\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:28 themes/default/templates/partial/index.js.ep:20\nmsgid \"Download link\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:10\nmsgid \"Drag and drop files in the appropriate area or use the traditional way to send files and the files will be chunked, encrypted and sent to the server. You will get two links per file: a download link, that you give to the people you want to share the file with and a deletion link, allowing you to delete the file whenever you want.\"\nmsgstr \"\"\n\n#: themes/default/templates/index.html.ep:122\nmsgid \"Drop files here\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/invite.html.ep:40\nmsgid \"Email address of your guest\"\nmsgstr \"\"\n\n#: themes/default/templates/mail.html.ep:39\nmsgid \"Email body\"\nmsgstr \"\"\n\n#: themes/default/templates/mail.html.ep:31\nmsgid \"Email subject\"\nmsgstr \"\"\n\n#: themes/default/templates/mail.html.ep:25 themes/default/templates/mail.html.ep:27\nmsgid \"Emails\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/index.js.ep:22\nmsgid \"Encrypting part XX1 of XX2\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Files.pm:283\nmsgid \"Error: the file existed but was deleted.\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Files.pm:363\nmsgid \"Error: the file has not been sent entirely.\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Files.pm:373\nmsgid \"Error: unable to find the file. Are you sure of your URL?\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/index.js.ep:23\nmsgid \"Expiration:\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:27\nmsgid \"Expire at\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:32\nmsgid \"Expires at\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:12\nmsgid \"Export localStorage data\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Files.pm:487\nmsgid \"File deleted\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/render.js.ep:9\nmsgid \"File downloaded\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:27\nmsgid \"File name\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/index.js.ep:24\nmsgid \"File uploaded\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:61\nmsgid \"Files\"\nmsgstr \"\"\n\n#: themes/default/templates/index.html.ep:80\nmsgid \"Files deleted at first download\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:28\nmsgid \"Files sent at\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/invitations.js.ep:8\nmsgid \"Files sent in invitation XX1 by XX2\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/render.js.ep:8\nmsgid \"Get the file\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:18\nmsgid \"Get the source code on <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi\\\" class=\\\"classic\\\">the official repository</a> or on its <a href=\\\"https://github.com/ldidry/lufi\\\" class=\\\"classic\\\">Github mirror</a>\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:24\nmsgid \"Guest mail\"\nmsgstr \"\"\n\n#. (ucfirst(stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:6\nmsgid \"Hello %1,\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/invite.mail.ep:4\nmsgid \"Hello,\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/mail.js.ep:35\nmsgid \"Hello,\\\\n\\\\nHere's some files I want to share with you:\\\\n\"\nmsgstr \"\"\n\n#: themes/default/templates/mail.html.ep:35\nmsgid \"Here's some files\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/invitations.js.ep:7\nmsgid \"Hide hidden invitations\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/index.js.ep:26\nmsgid \"Hit Enter, then Ctrl+C to copy all the download links\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/index.js.ep:25\nmsgid \"Hit Enter, then Ctrl+C to copy the download link\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:9\nmsgid \"How does it work?\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/invite.html.ep:46\nmsgid \"How many days would you like the invitation to be valid?\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:16\nmsgid \"How to install the software on my server?\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:12\nmsgid \"How to report an illegal file?\"\nmsgstr \"\"\n\n#: themes/default/templates/delays.html.ep:8\nmsgid \"If you choose a delay, the file will be deleted after that delay.\"\nmsgstr \"\"\n\n#: themes/default/templates/mail.html.ep:15\nmsgid \"If you send the mail from this server, the links will be sent to the server, which may lower your privacy protection.\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:14\nmsgid \"Import localStorage data\"\nmsgstr \"\"\n\n#: themes/default/templates/index.html.ep:53\nmsgid \"Important: more information on delays\"\nmsgstr \"\"\n\n#: themes/default/templates/delays.html.ep:5\nmsgid \"Information about delays\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:18 themes/default/templates/invitations/my_invitations.html.ep:12\nmsgid \"Invert selection\"\nmsgstr \"\"\n\n#. ($i->guest_mail, $url)\n#: lib/Lufi/Controller/Invitation.pm:184\nmsgid \"Invitation resent to %1.<br> URL: %2\"\nmsgstr \"\"\n\n#. ($invitation->guest_mail, $url)\n#: lib/Lufi/Controller/Invitation.pm:88\nmsgid \"Invitation sent to %1.<br> URL: %2\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/invite.html.ep:27 themes/default/templates/layouts/default.html.ep:36 themes/default/templates/layouts/default.html.ep:69\nmsgid \"Invite a guest\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/render.js.ep:6\nmsgid \"It seems that the key in your URL is incorrect. Please, verify your URL.\"\nmsgstr \"\"\n\n#: themes/default/templates/index.html.ep:12\nmsgid \"Javascript is disabled. You won't be able to use Lufi.\"\nmsgstr \"\"\n\n#: themes/default/templates/layouts/default.html.ep:44 themes/default/templates/layouts/default.html.ep:46 themes/default/templates/layouts/default.html.ep:77 themes/default/templates/layouts/default.html.ep:79\nmsgid \"Language\"\nmsgstr \"\"\n\n#. (sprintf('<a href=\"https://framagit.org/fiat-tux/hat-softwares/lufi/-/commit/%s\" class=\"classic\">%s</a>', stash('version')\n#: themes/default/templates/about.html.ep:22\nmsgid \"Latest commit of this instance: %1\"\nmsgstr \"\"\n\n#. (sprintf('<a href=\"https://framagit.org/fiat-tux/hat-softwares/lufi/-/releases/%s\" class=\"classic\">%s</a>', stash('version')\n#: themes/default/templates/about.html.ep:21\nmsgid \"Latest tag of this instance: %1\"\nmsgstr \"\"\n\n#: themes/default/templates/login.html.ep:15\nmsgid \"Login\"\nmsgstr \"\"\n\n#: themes/default/templates/layouts/default.html.ep:58 themes/default/templates/layouts/default.html.ep:91\nmsgid \"Logout\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:4\nmsgid \"Lufi is a free (as in free speech) file hosting software.\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/files.js.ep:12\nmsgid \"Lufi recently changed its way to store files information.\\\\n\\\\nNo files have been found in the new localStorage location but we found files in the old one.\\\\nDo you want to import those informations?\\\\n\\\\nPlease note that this is the only time that we will ask you this.\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:34\nmsgid \"Mail\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:3 themes/default/templates/layouts/default.html.ep:34 themes/default/templates/layouts/default.html.ep:67\nmsgid \"My files\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:5 themes/default/templates/layouts/default.html.ep:37 themes/default/templates/layouts/default.html.ep:70\nmsgid \"My invitations\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:17\nmsgid \"NB: this list includes the list of files that have already been sent to you.\"\nmsgstr \"\"\n\n#: themes/default/templates/index.html.ep:115\nmsgid \"Name of the zip file\"\nmsgstr \"\"\n\n#. (format_bytes($json->{size})\n#: lib/Lufi/Controller/Files.pm:109\nmsgid \"No enough space available on the server for this file (size: %1).\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/files.js.ep:10 themes/default/templates/partial/index.js.ep:29\nmsgid \"No expiration delay\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:8\nmsgid \"Only the files sent with this browser will be listed here. This list is stored in localStorage: if you delete your localStorage data, you'll lose this list.\"\nmsgstr \"\"\n\n#: themes/default/templates/index.html.ep:106 themes/default/templates/login.html.ep:21 themes/default/templates/render.html.ep:26\nmsgid \"Password\"\nmsgstr \"\"\n\n#. (config('contact')\n#: themes/default/templates/about.html.ep:13\nmsgid \"Please contact the administrator: %1\"\nmsgstr \"\"\n\n#: themes/default/templates/render.html.ep:33\nmsgid \"Please wait while we are getting your file. We first need to download and decrypt all parts before you can get it.\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Auth.pm:49\nmsgid \"Please, check your credentials or your right to access this service: unable to authenticate.\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:5\nmsgid \"Privacy\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:13\nmsgid \"Purge expired files from localStorage\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:20\nmsgid \"Regards,\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/invite.mail.ep:15\nmsgid \"Regards.\"\nmsgstr \"\"\n\n#: themes/default/templates/layouts/default.html.ep:31 themes/default/templates/layouts/default.html.ep:64\nmsgid \"Report file\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:15\nmsgid \"Resend invitation mail\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:9\nmsgid \"Rows in purple mean that the invitations have expired.\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:9\nmsgid \"Rows in red mean that the files have expired and are no longer available.\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/index.js.ep:27\nmsgid \"Send all links by email\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/invite.html.ep:50\nmsgid \"Send the invitation\"\nmsgstr \"\"\n\n#: themes/default/templates/mail.html.ep:47\nmsgid \"Send with this server\"\nmsgstr \"\"\n\n#: themes/default/templates/mail.html.ep:49\nmsgid \"Send with your own mail software\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/index.js.ep:30\nmsgid \"Sending part XX1 of XX2. Please, be patient, the progress bar can take a while to move.\"\nmsgstr \"\"\n\n#. (url_for('/')\n#: themes/default/templates/partial/mail.js.ep:49\nmsgid \"Share your files in total privacy on %1\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:13 themes/default/templates/partial/invitations.js.ep:9\nmsgid \"Show hidden invitations\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/render.js.ep:12\nmsgid \"Show zip content\"\nmsgstr \"\"\n\n#: themes/default/templates/layouts/default.html.ep:40 themes/default/templates/layouts/default.html.ep:73 themes/default/templates/login.html.ep:28 themes/default/templates/logout.html.ep:17\nmsgid \"Signin\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Invitation.pm:302 themes/default/templates/invitations/exception.html.ep:16\nmsgid \"Sorry, the invitation doesn’t exist. Are you sure you are on the right URL?\"\nmsgstr \"\"\n\n#: themes/default/templates/index.html.ep:46\nmsgid \"Sorry, the uploading is currently disabled. Please try again later.\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Files.pm:82\nmsgid \"Sorry, uploading is disabled.\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/exception.html.ep:7\nmsgid \"Sorry, your invitation has expired or has been deleted.\"\nmsgstr \"\"\n\n#. ($invit->ldap_user_mail)\n#: lib/Lufi/Controller/Files.pm:123\nmsgid \"Sorry, your invitation has expired or has been deleted. Please contact %1 to have another invitation.\"\nmsgstr \"\"\n\n#. ($invitation->ldap_user_mail)\n#: lib/Lufi/Controller/Invitation.pm:295\nmsgid \"The URLs of your files have been sent by email to %1.\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:7\nmsgid \"The administrator can only see the file's name, its size and its mimetype (what kind of file it is: video, text, etc.).\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Mail.pm:67\nmsgid \"The body of the mail must contain at least one URL pointing to a file hosted on this instance.\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/files.js.ep:11\nmsgid \"The data has been successfully imported.\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Mail.pm:87\nmsgid \"The email body can't be empty.\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Mail.pm:86\nmsgid \"The email subject can't be empty.\"\nmsgstr \"\"\n\n#. ($expire_at, $max_expire_at)\n#: lib/Lufi/Controller/Invitation.pm:52\nmsgid \"The expiration delay (%1) is not between 1 and %2 days.\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Files.pm:484\nmsgid \"The file has already been deleted\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:6\nmsgid \"The files uploaded on a Lufi instance are encrypted before the upload to the server: the administrator of the server can not see the file's content.\"\nmsgstr \"\"\n\n#. (join(', ', @bad)\n#: lib/Lufi/Controller/Mail.pm:82\nmsgid \"The following email addresses are not valid: %1\"\nmsgstr \"\"\n\n#. ($guest_mail)\n#: lib/Lufi/Controller/Invitation.pm:49\nmsgid \"The guest email address (%1) is unvalid.\"\nmsgstr \"\"\n\n#. ($i->token, $c->current_user->{username})\n#: lib/Lufi/Controller/Invitation.pm:136\nmsgid \"The invitation %1 can’t be deleted: it wasn’t created by you (%2).\"\nmsgstr \"\"\n\n#. ($i->token, $i->guest_mail)\n#: lib/Lufi/Controller/Invitation.pm:163\nmsgid \"The invitation %1 can’t be resent: %2 has already sent files.<br>Please create a new invitation.\"\nmsgstr \"\"\n\n#. ($i->token, $c->current_user->{username})\n#: lib/Lufi/Controller/Invitation.pm:187\nmsgid \"The invitation %1 can’t be resent: it wasn’t created by you (%2).\"\nmsgstr \"\"\n\n#. ($i->token)\n#: lib/Lufi/Controller/Invitation.pm:134\nmsgid \"The invitation %1 has been deleted.\"\nmsgstr \"\"\n\n#. (stash('user_mail')\n#: themes/default/templates/invitations/invite.html.ep:34\nmsgid \"The invitation mail will be send from your email address (%1).\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/index.js.ep:16\nmsgid \"The link(s) has been copied to your clipboard\"\nmsgstr \"\"\n\n#. (stash('invitation')\n#: themes/default/templates/index.html.ep:30\nmsgid \"The link(s) of your file(s) will automatically be sent by mail to %1 (%2)\"\nmsgstr \"\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:11\nmsgid \"The links of your file(s) will automatically be sent by mail to %1.\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Mail.pm:111\nmsgid \"The mail has been sent.\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:15\nmsgid \"The original (and only for now) author is <a href=\\\"https://fiat-tux.fr\\\" class=\\\"classic\\\">Luc Didry</a>.\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Files.pm:230\nmsgid \"The server was unable to find the file record to add your file part to. Please, contact the administrator.\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Files.pm:289\nmsgid \"This file has been deactivated by the admins. Contact them to know why.\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:46 themes/default/templates/partial/invitations.js.ep:6\nmsgid \"This invitation is normally hidden\"\nmsgstr \"\"\n\n#. (stash('expires')\n#: themes/default/templates/invitations/invite.mail.ep:13\nmsgid \"This invitation is valid until %1.\"\nmsgstr \"\"\n\n#: themes/default/templates/delays.html.ep:13\nmsgid \"This server sets limitations according to the file size. The expiration delay of your file will be the minimum between what you choose and the following limitations:\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:16\nmsgid \"Toggle visibility\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:25\nmsgid \"URL\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/index.js.ep:17\nmsgid \"Unable to copy the link(s) to your clipboard\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/render.js.ep:13\nmsgid \"Unable to download the file: too much unsuccessful attempts to open a websocket. Please, contact the administrator.\"\nmsgstr \"\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:433\nmsgid \"Unable to get counter for %1. The file does not exists. It will be removed from your localStorage.\"\nmsgstr \"\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:423\nmsgid \"Unable to get counter for %1. The token is invalid.\"\nmsgstr \"\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:443\nmsgid \"Unable to get counter for %1. You are not authenticated.\"\nmsgstr \"\"\n\n#: themes/default/templates/layouts/default.html.ep:33 themes/default/templates/layouts/default.html.ep:66\nmsgid \"Upload files\"\nmsgstr \"\"\n\n#: themes/default/templates/index.html.ep:145\nmsgid \"Upload generated zip file\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:31\nmsgid \"Uploaded at\"\nmsgstr \"\"\n\n#: themes/default/templates/index.html.ep:153\nmsgid \"Uploaded files\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:20\nmsgid \"Version\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/index.js.ep:31\nmsgid \"Websocket communication error\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:3\nmsgid \"What is Lufi?\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:14\nmsgid \"Who wrote this software?\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/index.js.ep:13\nmsgid \"XXX file has been added to upload queue.\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/invite.html.ep:30\nmsgid \"You can invite someone to send you files through this Lufi instance even if they don’t have an account on it.\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:11\nmsgid \"You can see the list of your files by clicking on the \\\"My files\\\" link at the top right of this page.\"\nmsgstr \"\"\n\n#. ($orig_uri)\n#: lib/Lufi/Controller/Mail.pm:43 lib/Lufi/Controller/Mail.pm:59\nmsgid \"You can't add URLs that are not related to this instance (%1).\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:8\nmsgid \"You don't need to register yourself to upload files but be aware that, for legal reasons, your IP address will be stored when you send a file. Don't panic, this is normally the case for all sites on which you send files.\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/render.js.ep:11\nmsgid \"You don't seem to have a key in your URL. You won't be able to decrypt the file. Download canceled.\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/render.js.ep:7\nmsgid \"You have attempted to leave this page. The download will be canceled. Are you sure?\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/index.js.ep:14\nmsgid \"You have attempted to leave this page. The upload will be canceled. Are you sure?\"\nmsgstr \"\"\n\n#: themes/default/templates/logout.html.ep:14\nmsgid \"You have been successfully logged out.\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Mail.pm:85\nmsgid \"You must give email addresses.\"\nmsgstr \"\"\n\n#: themes/default/templates/index.html.ep:38\nmsgid \"Your browser does not have enough entropy to generate a strong encryption key. Please wait (it's better if you do things on your computer while waiting).\"\nmsgstr \"\"\n\n#. (format_bytes($json->{size})\n#: lib/Lufi/Controller/Files.pm:95\nmsgid \"Your file is too big: %1 (maximum size allowed: %2)\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Files.pm:345\nmsgid \"Your password is not valid. Please refresh the page to retry.\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/render.js.ep:14\nmsgid \"Zip content:\"\nmsgstr \"\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:24\nmsgid \"between %1 and %2, the file will be kept %3 day(s).\"\nmsgstr \"\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:26\nmsgid \"between %1 and %2, the file will be kept forever.\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/mail.js.ep:42\nmsgid \"deadline: \"\nmsgstr \"\"\n\n#: themes/default/templates/partial/invitations.js.ep:5\nmsgid \"expires on XXX\"\nmsgstr \"\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:30\nmsgid \"for %1 and more, the file will be kept %2 day(s)\"\nmsgstr \"\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:32\nmsgid \"for %1 and more, the file will be kept forever.\"\nmsgstr \"\"\n\n#: themes/default/templates/index.html.ep:3\nmsgid \"no time limit\"\nmsgstr \"\"\n\n#: themes/default/templates/index.html.ep:124\nmsgid \"or\"\nmsgstr \"\"\n\n#. ($e->{name}, format_bytes($e->{size})\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:12\nmsgid \"— %1 (%2), that will expire on %3\"\nmsgstr \"\"\n"
  },
  {
    "path": "themes/default/lib/Lufi/I18N/nl.po",
    "content": "# Luc Didry <luc@framasoft.org>, 2018. #zanata\n# Luc Didry <luc@framasoft.org>, 2019. #zanata\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\\n\"\n\"PO-Revision-Date: 2020-03-22 18:29+0000\\n\"\n\"Last-Translator: Luc Didry <luc@framasoft.org>\\n\"\n\"Language-Team: Dutch <https://weblate.framasoft.org/projects/lufi/\"\n\"default-theme/nl/>\\n\"\n\"Language: nl\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=n != 1;\\n\"\n\"X-Generator: Weblate 3.11.2\\n\"\n\n#. ($delay)\n#. (max_delay)\n#: themes/default/templates/index.html.ep:56 themes/default/templates/index.html.ep:65 themes/default/templates/index.html.ep:66\nmsgid \"%1 days\"\nmsgstr \"%1 dagen\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:2\nmsgid \"%1 invites you to send him/her files\"\nmsgstr \"\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:6\nmsgid \"%1 invites you to send him/her files through Lufi.\"\nmsgstr \"\"\n\n#. (stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:4\nmsgid \"%1 sent you files\"\nmsgstr \"\"\n\n#. (stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:8\nmsgid \"%1 used your invitation to send you files:\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Invitation.pm:159 lib/Lufi/Controller/Invitation.pm:84 themes/default/templates/invitations/my_invitations.html.ep:51 themes/default/templates/invitations/my_invitations.html.ep:52 themes/default/templates/invitations/my_invitations.html.ep:53 themes/default/templates/invitations/notification_files_sent.mail.ep:12\nmsgid \"%A %d %B %Y at %T\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/index.js.ep:27\nmsgid \"(max size: XXX)\"\nmsgstr \"\"\n\n#: themes/default/templates/index.html.ep:5\nmsgid \"1 year\"\nmsgstr \"1 jaar\"\n\n#: themes/default/templates/index.html.ep:4 themes/default/templates/index.html.ep:65\nmsgid \"24 hours\"\nmsgstr \"24 uur\"\n\n#: themes/default/templates/partial/mail.js.ep:40\nmsgid \":\"\nmsgstr \":\"\n\n#: themes/default/templates/render.html.ep:42\nmsgid \"Abort\"\nmsgstr \"Annuleren\"\n\n#: themes/default/templates/layouts/default.html.ep:53 themes/default/templates/layouts/default.html.ep:86\nmsgid \"About\"\nmsgstr \"Over\"\n\n#: themes/default/templates/index.html.ep:107\nmsgid \"Add a password to file(s)\"\nmsgstr \"\"\n\n#: themes/default/templates/mail.html.ep:16\nmsgid \"\"\n\"Adding URLs not related to this Lufi instance to the mail body or subject is \"\n\"prohibited.\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/invitations.js.ep:3\nmsgid \"Are you sure you want to delete the selected invitations?\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/invitations.js.ep:4\nmsgid \"\"\n\"Are you sure you want to resend the invitation mail for the selected \"\n\"invitations?\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:17\nmsgid \"\"\n\"As Lufi is a free software licensed under of the terms of the <a href=\"\n\"\\\"https://gnu.org/licenses/agpl.html\\\" class=\\\"classic\\\">AGPLv3</a>, you can \"\n\"install it on you own server. Have a look on the <a href=\\\"https://framagit.\"\n\"org/luc/lufi/wikis/home\\\" class=\\\"classic\\\">Wiki</a> for the procedure.\"\nmsgstr \"\"\n\"Aangezien Lufi een gratis software id die gelicentieerd staat onder de \"\n\"voorwaarden van <a href=\\\"https://gnu.org/licenses/agpl.html\\\" class=\"\n\"\\\"classic\\\">AGPLv3</a>, kan je het installeren op je eigen server. Bekijk <a \"\n\"href=\\\"https://framagit.org/luc/lufi/wikis/home\\\" class=\\\"classic\\\">Wiki</a> \"\n\"voor de procedure.\"\n\n#. (stash('nbslices')\n#: themes/default/templates/partial/render.js.ep:9\nmsgid \"Asking for file part XX1 of %1\"\nmsgstr \"Deel XX1 van %1 wordt opgehaald\"\n\n#: themes/default/templates/about.html.ep:20\nmsgid \"Back to homepage\"\nmsgstr \"Terug naar home\"\n\n#: lib/Lufi/Controller/Mail.pm:25\nmsgid \"Bad CSRF token!\"\nmsgstr \"Verkeerde CSRF token!\"\n\n#: lib/Lufi/Controller/Auth.pm:27 lib/Lufi/Controller/Auth.pm:49\nmsgid \"Bad CSRF token.\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/render.js.ep:5\nmsgid \"Click here to refresh the page and restart the download.\"\nmsgstr \"Klik hier om de pagina te verversen en opnieuw te downloaden.\"\n\n#: themes/default/templates/invitations/invite.mail.ep:8\nmsgid \"Click on the following URL to upload files on Lufi:\"\nmsgstr \"\"\n\n#: themes/default/templates/index.html.ep:126\nmsgid \"Click to open the file browser\"\nmsgstr \"Klik voor bestandbrowser\"\n\n#: themes/default/templates/delays.html.ep:38 themes/default/templates/invitations/my_invitations.html.ep:80\nmsgid \"Close\"\nmsgstr \"Sluiten\"\n\n#: themes/default/templates/mail.html.ep:23\nmsgid \"Comma-separated email addresses\"\nmsgstr \"Komma gescheiden email adressen\"\n\n#: themes/default/templates/index.html.ep:140\nmsgid \"Compressing zip file…\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/index.js.ep:15\nmsgid \"Copy all links to clipboard\"\nmsgstr \"Kopieer alle links naar klembord\"\n\n#: themes/default/templates/partial/index.js.ep:18\nmsgid \"Copy to clipboard\"\nmsgstr \"Kopieer naar klembord\"\n\n#: lib/Lufi/Controller/Files.pm:507\nmsgid \"Could not delete the file. You are not authenticated.\"\nmsgstr \"Kan het bestand niet verwijderen. Je bent niet geautoriseerd.\"\n\n#: lib/Lufi/Controller/Files.pm:489\nmsgid \"Could not find the file. Are you sure of the URL and the token?\"\nmsgstr \"Kan het bestand niet vinden. Klopt de URL en token wel?\"\n\n#: lib/Lufi/Controller/Files.pm:400\nmsgid \"Could not find the file. Are you sure of the URL?\"\nmsgstr \"Kan het bestand niet vinden. Klopt de URL?\"\n\n#: themes/default/templates/files.html.ep:29\nmsgid \"Counter\"\nmsgstr \"Teller\"\n\n#: themes/default/templates/index.html.ep:100\nmsgid \"Create a zip archive with the files before uploading?\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:26\nmsgid \"Created at\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:14\nmsgid \"Delete\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:30 themes/default/templates/index.html.ep:90\nmsgid \"Delete at first download?\"\nmsgstr \"Verwijder na eerste download?\"\n\n#: themes/default/templates/files.html.ep:19\nmsgid \"Delete selected files\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:33 themes/default/templates/partial/index.js.ep:19\nmsgid \"Deletion link\"\nmsgstr \"Verwijderingslink\"\n\n#: themes/default/templates/delays.html.ep:8\nmsgid \"\"\n\"Don't worry: if a user begins to download the file before the expiration and \"\n\"the download ends after the expiration, he will be able to get the file.\"\nmsgstr \"\"\n\"Geen zorgen: als een gebruiker de download start voor de vervaldatum, dan \"\n\"zal die het bestand kunnen binnenhalen.\"\n\n#: themes/default/templates/partial/index.js.ep:21 themes/default/templates/render.html.ep:28\nmsgid \"Download\"\nmsgstr \"Download\"\n\n#: themes/default/templates/partial/render.js.ep:4\nmsgid \"Download aborted.\"\nmsgstr \"Download geannuleerd.\"\n\n#: themes/default/templates/files.html.ep:28 themes/default/templates/partial/index.js.ep:20\nmsgid \"Download link\"\nmsgstr \"Download link\"\n\n#: themes/default/templates/about.html.ep:10\nmsgid \"\"\n\"Drag and drop files in the appropriate area or use the traditional way to \"\n\"send files and the files will be chunked, encrypted and sent to the server. \"\n\"You will get two links per file: a download link, that you give to the \"\n\"people you want to share the file with and a deletion link, allowing you to \"\n\"delete the file whenever you want.\"\nmsgstr \"\"\n\"Drag and drop bestanden in de daarvoor bestemde locatie of gebruik de \"\n\"traditionele weg om bestanden encrypted op te sturen naar server. Je zal 2 \"\n\"linkjes per bestand krijgen: een download link, die stuur je naar personen \"\n\"waarmee je het bestand wilt delen en een verwijderings link, waarmee je het \"\n\"bestand kan verwijderen wanneer je dat wilt.\"\n\n#: themes/default/templates/index.html.ep:122\nmsgid \"Drop files here\"\nmsgstr \"Sleep bestand(en) naar dit venster\"\n\n#: themes/default/templates/invitations/invite.html.ep:40\nmsgid \"Email address of your guest\"\nmsgstr \"\"\n\n#: themes/default/templates/mail.html.ep:39\nmsgid \"Email body\"\nmsgstr \"Email inhoud\"\n\n#: themes/default/templates/mail.html.ep:31\nmsgid \"Email subject\"\nmsgstr \"Onderwerp\"\n\n#: themes/default/templates/mail.html.ep:25 themes/default/templates/mail.html.ep:27\nmsgid \"Emails\"\nmsgstr \"Emails\"\n\n#: themes/default/templates/partial/index.js.ep:22\nmsgid \"Encrypting part XX1 of XX2\"\nmsgstr \"Encrypten deel XX1 van XX2\"\n\n#: lib/Lufi/Controller/Files.pm:289\nmsgid \"Error: the file existed but was deleted.\"\nmsgstr \"Fout: het bestand bestond wel maar is verwijderd.\"\n\n#: lib/Lufi/Controller/Files.pm:369\nmsgid \"Error: the file has not been sent entirely.\"\nmsgstr \"Fout: het bestand is niet volledig opgestuurd.\"\n\n#: lib/Lufi/Controller/Files.pm:379\nmsgid \"Error: unable to find the file. Are you sure of your URL?\"\nmsgstr \"Fout: kan het bestand niet vinden. Is de URL juist?\"\n\n#: themes/default/templates/partial/index.js.ep:23\nmsgid \"Expiration:\"\nmsgstr \"Vervaldatum:\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:27\nmsgid \"Expire at\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:32\nmsgid \"Expires at\"\nmsgstr \"Vervalt op\"\n\n#: themes/default/templates/files.html.ep:12\nmsgid \"Export localStorage data\"\nmsgstr \"Exporteer opgeslagen data\"\n\n#: lib/Lufi/Controller/Files.pm:471\nmsgid \"File deleted\"\nmsgstr \"Bestand verwijderd\"\n\n#: themes/default/templates/files.html.ep:27\nmsgid \"File name\"\nmsgstr \"Bestandsnaam\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:61\nmsgid \"Files\"\nmsgstr \"\"\n\n#: themes/default/templates/index.html.ep:80\nmsgid \"Files deleted at first download\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:28\nmsgid \"Files sent at\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/invitations.js.ep:8\nmsgid \"Files sent in invitation XX1 by XX2\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/render.js.ep:8\nmsgid \"Get the file\"\nmsgstr \"Download bestand\"\n\n#: themes/default/templates/about.html.ep:18\nmsgid \"\"\n\"Get the source code on <a href=\\\"https://framagit.org/luc/lufi\\\" class=\"\n\"\\\"classic\\\">the official repository</a> or on its <a href=\\\"https://github.\"\n\"com/ldidry/lufi\\\" class=\\\"classic\\\">Github mirror</a>\"\nmsgstr \"\"\n\"Krijg de broncode op <a href=\\\"https://framagit.org/luc/lufi\\\" class=\"\n\"\\\"classic\\\">de officiële repository</a> of op <a href=\\\"https://github.com/\"\n\"ldidry/lufi\\\" class=\\\"classic\\\">Github mirror</a>\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:24\nmsgid \"Guest mail\"\nmsgstr \"\"\n\n#. (ucfirst(stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:6\nmsgid \"Hello %1,\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/invite.mail.ep:4\nmsgid \"Hello,\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/mail.js.ep:35\nmsgid \"Hello,\\\\n\\\\nHere's some files I want to share with you:\\\\n\"\nmsgstr \"\"\n\"Hallo,\\\\n\"\n\"\\\\n\"\n\"Hier zijn enkele bestanden die ik met je wil delen:\\\\n\"\n\n#: themes/default/templates/mail.html.ep:35\nmsgid \"Here's some files\"\nmsgstr \"Hier zijn enkele bestanden\"\n\n#: themes/default/templates/partial/invitations.js.ep:7\nmsgid \"Hide hidden invitations\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/index.js.ep:25\nmsgid \"Hit Enter, then Ctrl+C to copy all the download links\"\nmsgstr \"Druk Enter, vervolgens CTRL+C om alle download links te kopieeren\"\n\n#: themes/default/templates/partial/index.js.ep:24\nmsgid \"Hit Enter, then Ctrl+C to copy the download link\"\nmsgstr \"Druk Enter, vervolgens CTRL+C om de download link te kopieeren\"\n\n#: themes/default/templates/about.html.ep:9\nmsgid \"How does it work?\"\nmsgstr \"Hoe werkt het?\"\n\n#: themes/default/templates/invitations/invite.html.ep:46\nmsgid \"How many days would you like the invitation to be valid?\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:16\nmsgid \"How to install the software on my server?\"\nmsgstr \"Hoe installeer ik de software op mijn server?\"\n\n#: themes/default/templates/about.html.ep:12\nmsgid \"How to report an illegal file?\"\nmsgstr \"Hoe rapporteer ik een verdachte bestand?\"\n\n#: themes/default/templates/delays.html.ep:7\nmsgid \"If you choose a delay, the file will be deleted after that delay.\"\nmsgstr \"\"\n\"Als je een uitstel kiest, zal het bestand na die uitstel tijd verwijderd \"\n\"worden.\"\n\n#: themes/default/templates/mail.html.ep:15\nmsgid \"\"\n\"If you send the mail from this server, the links will be sent to the server, \"\n\"which may lower your privacy protection.\"\nmsgstr \"\"\n\"Als je een mail via de server verstuurt, zullen links naar de server \"\n\"verstuurd worden waardoor je lagere privacy protection zal hebben.\"\n\n#: themes/default/templates/files.html.ep:14\nmsgid \"Import localStorage data\"\nmsgstr \"Importeer opgeslagen data\"\n\n#: themes/default/templates/index.html.ep:53\nmsgid \"Important: more information on delays\"\nmsgstr \"Belangrijk: meer informatie over uitstel\"\n\n#: themes/default/templates/delays.html.ep:5\nmsgid \"Information about delays\"\nmsgstr \"Informatie over uitstel\"\n\n#: themes/default/templates/files.html.ep:18 themes/default/templates/invitations/my_invitations.html.ep:12\nmsgid \"Invert selection\"\nmsgstr \"\"\n\n#. ($i->guest_mail, $url)\n#: lib/Lufi/Controller/Invitation.pm:171\nmsgid \"Invitation resent to %1.<br> URL: %2\"\nmsgstr \"\"\n\n#. ($invitation->guest_mail, $url)\n#: lib/Lufi/Controller/Invitation.pm:87\nmsgid \"Invitation sent to %1.<br> URL: %2\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/invite.html.ep:27 themes/default/templates/layouts/default.html.ep:36 themes/default/templates/layouts/default.html.ep:69\nmsgid \"Invite a guest\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/render.js.ep:6\nmsgid \"\"\n\"It seems that the key in your URL is incorrect. Please, verify your URL.\"\nmsgstr \"\"\n\"Het lijkt er op dat de sleutel in je URL niet klopt. Controleer je URL.\"\n\n#: themes/default/templates/index.html.ep:12\nmsgid \"Javascript is disabled. You won't be able to use Lufi.\"\nmsgstr \"Javascript is uitgeschakeld. Je kan geen gebruik maken van Lufi.\"\n\n#: themes/default/templates/layouts/default.html.ep:44 themes/default/templates/layouts/default.html.ep:46 themes/default/templates/layouts/default.html.ep:77 themes/default/templates/layouts/default.html.ep:79\nmsgid \"Language\"\nmsgstr \"\"\n\n#: themes/default/templates/login.html.ep:15\nmsgid \"Login\"\nmsgstr \"Login\"\n\n#: themes/default/templates/layouts/default.html.ep:58 themes/default/templates/layouts/default.html.ep:91\nmsgid \"Logout\"\nmsgstr \"Logout\"\n\n#: themes/default/templates/about.html.ep:4\nmsgid \"Lufi is a free (as in free speech) file hosting software.\"\nmsgstr \"Lufi is een gratis bestand hosting software.\"\n\n#: themes/default/templates/partial/files.js.ep:12\nmsgid \"\"\n\"Lufi recently changed its way to store files information.\\\\n\\\\nNo files have \"\n\"been found in the new localStorage location but we found files in the old \"\n\"one.\\\\nDo you want to import those informations?\\\\n\\\\nPlease note that this \"\n\"is the only time that we will ask you this.\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:34\nmsgid \"Mail\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:3 themes/default/templates/layouts/default.html.ep:34 themes/default/templates/layouts/default.html.ep:67\nmsgid \"My files\"\nmsgstr \"Mijn bestanden\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:5 themes/default/templates/layouts/default.html.ep:37 themes/default/templates/layouts/default.html.ep:70\nmsgid \"My invitations\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:17\nmsgid \"\"\n\"NB: this list includes the list of files that have already been sent to you.\"\nmsgstr \"\"\n\n#: themes/default/templates/index.html.ep:115\nmsgid \"Name of the zip file\"\nmsgstr \"\"\n\n#. (format_bytes($json->{size})\n#: lib/Lufi/Controller/Files.pm:108\nmsgid \"No enough space available on the server for this file (size: %1).\"\nmsgstr \"Geen genoeg ruimte op de server voor deze bestand (grootte: %1).\"\n\n#: themes/default/templates/partial/files.js.ep:10 themes/default/templates/partial/index.js.ep:28\nmsgid \"No expiration delay\"\nmsgstr \"Geen verloop uitstel\"\n\n#: themes/default/templates/files.html.ep:8\nmsgid \"\"\n\"Only the files sent with this browser will be listed here. This list is \"\n\"stored in localStorage: if you delete your localStorage data, you'll lose \"\n\"this list.\"\nmsgstr \"\"\n\"Alleen bestanden die via deze browser zijn verstuurd zijn hier zichtbaar. \"\n\"Deze lijst is opgeslagen: als je opgeslagen data verwijderd, zal je deze \"\n\"lijst verlizen.\"\n\n#: themes/default/templates/index.html.ep:106 themes/default/templates/login.html.ep:21 themes/default/templates/render.html.ep:26\nmsgid \"Password\"\nmsgstr \"Wachtwoord\"\n\n#. (config('contact')\n#: themes/default/templates/about.html.ep:13\nmsgid \"Please contact the administrator: %1\"\nmsgstr \"Neem contact op met administrator: %1\"\n\n#: themes/default/templates/render.html.ep:33\nmsgid \"\"\n\"Please wait while we are getting your file. We first need to download and \"\n\"decrypt all parts before you can get it.\"\nmsgstr \"\"\n\"Een ogenblik geduld, we pakken je bestand er bij. We moeten alle delen \"\n\"downloaden en decrypten voordat je het kan downloaden.\"\n\n#: lib/Lufi/Controller/Auth.pm:38\nmsgid \"\"\n\"Please, check your credentials or your right to access this service: unable \"\n\"to authenticate.\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:5\nmsgid \"Privacy\"\nmsgstr \"Privacy\"\n\n#: themes/default/templates/files.html.ep:13\nmsgid \"Purge expired files from localStorage\"\nmsgstr \"Verwijder verlopen data\"\n\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:20\nmsgid \"Regards,\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/invite.mail.ep:15\nmsgid \"Regards.\"\nmsgstr \"\"\n\n#: themes/default/templates/layouts/default.html.ep:31 themes/default/templates/layouts/default.html.ep:64\nmsgid \"Report file\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:15\nmsgid \"Resend invitation mail\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:9\nmsgid \"Rows in purple mean that the invitations have expired.\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:9\nmsgid \"\"\n\"Rows in red mean that the files have expired and are no longer available.\"\nmsgstr \"Rode rijen betekenen dat deze bestanden verlopen en verwijderd zijn.\"\n\n#: themes/default/templates/partial/index.js.ep:26\nmsgid \"Send all links by email\"\nmsgstr \"Verstuur alle links via mail\"\n\n#: themes/default/templates/invitations/invite.html.ep:50\nmsgid \"Send the invitation\"\nmsgstr \"\"\n\n#: themes/default/templates/mail.html.ep:46\nmsgid \"Send with this server\"\nmsgstr \"Verstuur via deze server\"\n\n#: themes/default/templates/mail.html.ep:47\nmsgid \"Send with your own mail software\"\nmsgstr \"Verstuur via eigen mail software\"\n\n#: themes/default/templates/partial/index.js.ep:29\nmsgid \"\"\n\"Sending part XX1 of XX2. Please, be patient, the progress bar can take a \"\n\"while to move.\"\nmsgstr \"Versturen deel XX1 van XX2. Een ogenblik geduld...\"\n\n#. (url_for('/')\n#: themes/default/templates/partial/mail.js.ep:48\nmsgid \"Share your files in total privacy on %1\"\nmsgstr \"Deel je bestanden met volledige privacy op %1\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:13 themes/default/templates/partial/invitations.js.ep:9\nmsgid \"Show hidden invitations\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/render.js.ep:11\nmsgid \"Show zip content\"\nmsgstr \"\"\n\n#: themes/default/templates/layouts/default.html.ep:40 themes/default/templates/layouts/default.html.ep:73 themes/default/templates/login.html.ep:28 themes/default/templates/logout.html.ep:17\nmsgid \"Signin\"\nmsgstr \"Inloggen\"\n\n#: lib/Lufi/Controller/Invitation.pm:283 themes/default/templates/invitations/exception.html.ep:16\nmsgid \"\"\n\"Sorry, the invitation doesn’t exist. Are you sure you are on the right URL?\"\nmsgstr \"\"\n\n#: themes/default/templates/index.html.ep:46\nmsgid \"Sorry, the uploading is currently disabled. Please try again later.\"\nmsgstr \"\"\n\"Sorry, uploaden is momenteel uitgeschakeld. Probeer het later nogmaals.\"\n\n#: lib/Lufi/Controller/Files.pm:82\nmsgid \"Sorry, uploading is disabled.\"\nmsgstr \"SOrry, uploaden is uitgeschakeld.\"\n\n#: themes/default/templates/invitations/exception.html.ep:7\nmsgid \"Sorry, your invitation has expired or has been deleted.\"\nmsgstr \"\"\n\n#. ($invit->ldap_user_mail)\n#: lib/Lufi/Controller/Files.pm:122\nmsgid \"\"\n\"Sorry, your invitation has expired or has been deleted. Please contact %1 to \"\n\"have another invitation.\"\nmsgstr \"\"\n\n#. ($invitation->ldap_user_mail)\n#: lib/Lufi/Controller/Invitation.pm:276\nmsgid \"The URLs of your files have been sent by email to %1.\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:7\nmsgid \"\"\n\"The administrator can only see the file's name, its size and its mimetype \"\n\"(what kind of file it is: video, text, etc.).\"\nmsgstr \"\"\n\"Beheerders zien alleen bestandsnamen, grootte en mimetype (wat voor soort \"\n\"bestand het is: video, tekst etc.).\"\n\n#: lib/Lufi/Controller/Mail.pm:53\nmsgid \"\"\n\"The body of the mail must contain at least one URL pointing to a file hosted \"\n\"on this instance.\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/files.js.ep:11\nmsgid \"The data has been successfully imported.\"\nmsgstr \"Data is succesvol geimporteerd.\"\n\n#: lib/Lufi/Controller/Mail.pm:73\nmsgid \"The email body can't be empty.\"\nmsgstr \"Mail inhoud kan niet leeg zijn.\"\n\n#: lib/Lufi/Controller/Mail.pm:72\nmsgid \"The email subject can't be empty.\"\nmsgstr \"Onderwerp kan niet leeg zijn.\"\n\n#. ($expire_at, $max_expire_at)\n#: lib/Lufi/Controller/Invitation.pm:51\nmsgid \"The expiration delay (%1) is not between 1 and %2 days.\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Files.pm:468\nmsgid \"The file has already been deleted\"\nmsgstr \"Bestand is reeds verwijderd\"\n\n#: themes/default/templates/about.html.ep:6\nmsgid \"\"\n\"The files uploaded on a Lufi instance are encrypted before the upload to the \"\n\"server: the administrator of the server can not see the file's content.\"\nmsgstr \"\"\n\"Bestanden die geupload zijn naar Lufi worden voor de upload versleuteld: \"\n\"beheerders van de server kunnen de inhoud van het bestand niet zien.\"\n\n#. (join(', ', @bad)\n#: lib/Lufi/Controller/Mail.pm:68\nmsgid \"The following email addresses are not valid: %1\"\nmsgstr \"Volgende email adressen zijn niet geldig: %1\"\n\n#. ($guest_mail)\n#: lib/Lufi/Controller/Invitation.pm:48\nmsgid \"The guest email address (%1) is unvalid.\"\nmsgstr \"\"\n\n#. ($i->token, $i->guest_mail)\n#: lib/Lufi/Controller/Invitation.pm:150\nmsgid \"\"\n\"The invitation %1 can’t be resent: %2 has already sent files.<br>Please \"\n\"create a new invitation.\"\nmsgstr \"\"\n\n#. ($i->token)\n#: lib/Lufi/Controller/Invitation.pm:130\nmsgid \"The invitation %1 has been deleted.\"\nmsgstr \"\"\n\n#. (stash('user_mail')\n#: themes/default/templates/invitations/invite.html.ep:34\nmsgid \"The invitation mail will be send from your email address (%1).\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/index.js.ep:16\nmsgid \"The link(s) has been copied to your clipboard\"\nmsgstr \"De link is gekopieerd naar je klembord\"\n\n#. (stash('invitation')\n#: themes/default/templates/index.html.ep:30\nmsgid \"\"\n\"The link(s) of your file(s) will automatically be sent by mail to %1 (%2)\"\nmsgstr \"\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:11\nmsgid \"The links of your file(s) will automatically be sent by mail to %1.\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Mail.pm:97\nmsgid \"The mail has been sent.\"\nmsgstr \"Email is verzonden.\"\n\n#: themes/default/templates/about.html.ep:15\nmsgid \"\"\n\"The original (and only for now) author is <a href=\\\"https://fiat-tux.fr\\\" \"\n\"class=\\\"classic\\\">Luc Didry</a>.\"\nmsgstr \"\"\n\"De oorspronkelijke auteur is <a href=\\\"https://fiat-tux.fr\\\" class=\"\n\"\\\"classic\\\">Luc Didry</a>.\"\n\n#: lib/Lufi/Controller/Files.pm:236\nmsgid \"\"\n\"The server was unable to find the file record to add your file part to. \"\n\"Please, contact the administrator.\"\nmsgstr \"\"\n\"Server kon een deel van het bestand niet vinden. Neem contact op met \"\n\"beheerder.\"\n\n#: lib/Lufi/Controller/Files.pm:295\nmsgid \"\"\n\"This file has been deactivated by the admins. Contact them to know why.\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:46 themes/default/templates/partial/invitations.js.ep:6\nmsgid \"This invitation is normally hidden\"\nmsgstr \"\"\n\n#. (stash('expires')\n#: themes/default/templates/invitations/invite.mail.ep:13\nmsgid \"This invitation is valid until %1.\"\nmsgstr \"\"\n\n#: themes/default/templates/delays.html.ep:10\nmsgid \"\"\n\"This server sets limitations according to the file size. The expiration \"\n\"delay of your file will be the minimum between what you choose and the \"\n\"following limitations:\"\nmsgstr \"\"\n\"Deze server stelt beperkingen vast volgens de bestandsgrootte. De \"\n\"vervaldatum van uw bestand zal het minimum zijn tussen wat u kiest en de \"\n\"volgende beperkingen:\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:16\nmsgid \"Toggle visibility\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:25\nmsgid \"URL\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/index.js.ep:17\nmsgid \"Unable to copy the link(s) to your clipboard\"\nmsgstr \"Kan de link(s) niet naar je klembord kopieeren\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:439\nmsgid \"\"\n\"Unable to get counter for %1. The file does not exists. It will be removed \"\n\"from your localStorage.\"\nmsgstr \"\"\n\"Kan geen teller verkrijgen voor %1. Bestand bestaat niet. Het zal verwijderd \"\n\"worden van opgeslagen data.\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:429\nmsgid \"Unable to get counter for %1. The token is invalid.\"\nmsgstr \"Kan geen teller verkrijgen voor %1. De token is ongeldig.\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:449\nmsgid \"Unable to get counter for %1. You are not authenticated.\"\nmsgstr \"Kan geen teller verkrijgen voor %1. Je bent niet geauthenticeerd.\"\n\n#: themes/default/templates/layouts/default.html.ep:33 themes/default/templates/layouts/default.html.ep:66\nmsgid \"Upload files\"\nmsgstr \"Upload bestanden\"\n\n#: themes/default/templates/index.html.ep:145\nmsgid \"Upload generated zip file\"\nmsgstr \"\"\n\n#: themes/default/templates/files.html.ep:31\nmsgid \"Uploaded at\"\nmsgstr \"Geupload op\"\n\n#: themes/default/templates/index.html.ep:153\nmsgid \"Uploaded files\"\nmsgstr \"Geuploade bestanden\"\n\n#: themes/default/templates/partial/index.js.ep:30\nmsgid \"Websocket communication error\"\nmsgstr \"Websocket communicatie fout\"\n\n#: themes/default/templates/about.html.ep:3\nmsgid \"What is Lufi?\"\nmsgstr \"Wat is Lufi?\"\n\n#: themes/default/templates/about.html.ep:14\nmsgid \"Who wrote this software?\"\nmsgstr \"Wie heeft deze software geschreven?\"\n\n#: themes/default/templates/partial/index.js.ep:13\nmsgid \"XXX file has been added to upload queue.\"\nmsgstr \"\"\n\n#: themes/default/templates/invitations/invite.html.ep:30\nmsgid \"\"\n\"You can invite someone to send you files through this Lufi instance even if \"\n\"they don’t have an account on it.\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:11\nmsgid \"\"\n\"You can see the list of your files by clicking on the \\\"My files\\\" link at \"\n\"the top right of this page.\"\nmsgstr \"\"\n\"Je kan een lijst van je eigen bestanden zien door op \\\"Mijn bestanden\\\" link \"\n\"rechts boven te klikken.\"\n\n#: lib/Lufi/Controller/Mail.pm:42\nmsgid \"You can't add URLs that are not related to this instance.\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:8\nmsgid \"\"\n\"You don't need to register yourself to upload files but be aware that, for \"\n\"legal reasons, your IP address will be stored when you send a file. Don't \"\n\"panic, this is normally the case for all sites on which you send files.\"\nmsgstr \"\"\n\"U hoeft zich niet te registreren om bestanden te uploaden, maar wees ervan \"\n\"bewust dat uw IP-adres om juridische redenen zal worden opgeslagen wanneer u \"\n\"een bestand verzendt. Geen paniek, dit is normaal gesproken het geval voor \"\n\"alle sites waarnaar u bestanden verzendt.\"\n\n#: themes/default/templates/partial/render.js.ep:10\nmsgid \"\"\n\"You don't seem to have a key in your URL. You won't be able to decrypt the \"\n\"file. Download canceled.\"\nmsgstr \"\"\n\"Je hebt geen sleutel in je URL. Je kan het bestand niet decrypten. Download \"\n\"geannuleerd.\"\n\n#: themes/default/templates/partial/render.js.ep:7\nmsgid \"\"\n\"You have attempted to leave this page. The download will be canceled. Are \"\n\"you sure?\"\nmsgstr \"\"\n\"Je verlaat deze pagina. Download zal geannuleerd worden. Weet je het zeker?\"\n\n#: themes/default/templates/partial/index.js.ep:14\nmsgid \"\"\n\"You have attempted to leave this page. The upload will be canceled. Are you \"\n\"sure?\"\nmsgstr \"\"\n\"Je verlaat deze pagina. Upload zal geannuleerd worden. Weet je het zeker?\"\n\n#: themes/default/templates/logout.html.ep:14\nmsgid \"You have been successfully logged out.\"\nmsgstr \"Je bent succesvol uitgelogd.\"\n\n#: lib/Lufi/Controller/Mail.pm:71\nmsgid \"You must give email addresses.\"\nmsgstr \"Je moet een mail adres opgeven.\"\n\n#: themes/default/templates/index.html.ep:38\nmsgid \"\"\n\"Your browser does not have enough entropy to generate a strong encryption \"\n\"key. Please wait (it's better if you do things on your computer while \"\n\"waiting).\"\nmsgstr \"\"\n\n#. (format_bytes($json->{size})\n#: lib/Lufi/Controller/Files.pm:95\nmsgid \"Your file is too big: %1 (maximum size allowed: %2)\"\nmsgstr \"Je bestand is te groot: %1 (max: %2)\"\n\n#: lib/Lufi/Controller/Files.pm:351\nmsgid \"Your password is not valid. Please refresh the page to retry.\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/render.js.ep:12\nmsgid \"Zip content:\"\nmsgstr \"\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:20\nmsgid \"between %1 and %2, the file will be kept %3 day(s).\"\nmsgstr \"tussen %1 en %2, bestand zal bewaard worden voor %3 dag(en).\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:22\nmsgid \"between %1 and %2, the file will be kept forever.\"\nmsgstr \"tussen %1 en %2, bestand zal voor altijd bewaard worden.\"\n\n#: themes/default/templates/partial/mail.js.ep:42\nmsgid \"deadline: \"\nmsgstr \"deadline: \"\n\n#: themes/default/templates/partial/invitations.js.ep:5\nmsgid \"expires on XXX\"\nmsgstr \"\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:26\nmsgid \"for %1 and more, the file will be kept %2 day(s)\"\nmsgstr \"voor %1 en meer, bestand zal bewaard worden voor %2 dag(en)\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:28\nmsgid \"for %1 and more, the file will be kept forever.\"\nmsgstr \"voor %1 en meer, bestand zal voor altijd bewaard worden.\"\n\n#: themes/default/templates/index.html.ep:3\nmsgid \"no time limit\"\nmsgstr \"geen tijdslimiet\"\n\n#: themes/default/templates/index.html.ep:124\nmsgid \"or\"\nmsgstr \"of\"\n\n#. ($e->{name}, format_bytes($e->{size})\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:12\nmsgid \"— %1 (%2), that will expire on %3\"\nmsgstr \"\"\n\n#: themes/default/templates/about.html.ep:18\nmsgid \"Get the source code on <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi\\\" class=\\\"classic\\\">the official repository</a> or on its <a href=\\\"https://github.com/ldidry/lufi\\\" class=\\\"classic\\\">Github mirror</a>\"\nmsgstr \"\"\n\"Krijg de broncode op <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/\"\n\"lufi\\\" class=\\\"classic\\\">de officiële repository</a> of op <a href=\\\"\"\n\"https://github.com/ldidry/lufi\\\" class=\\\"classic\\\">Github mirror</a>\"\n\n#: themes/default/templates/about.html.ep:17\nmsgid \"As Lufi is a free software licensed under of the terms of the <a href=\\\"https://gnu.org/licenses/agpl.html\\\" class=\\\"classic\\\">AGPLv3</a>, you can install it on you own server. Have a look on the <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi/wikis/home\\\" class=\\\"classic\\\">Wiki</a> for the procedure.\"\nmsgstr \"\"\n\"Aangezien Lufi een gratis software id die gelicentieerd staat onder de \"\n\"voorwaarden van <a href=\\\"https://gnu.org/licenses/agpl.html\\\" class=\\\"\"\n\"classic\\\">AGPLv3</a>, kan je het installeren op je eigen server. Bekijk <a \"\n\"href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi/wikis/home\\\" class=\\\"\"\n\"classic\\\">Wiki</a> voor de procedure.\"\n"
  },
  {
    "path": "themes/default/lib/Lufi/I18N/oc.po",
    "content": "# Lufi OC translation\n# Copyright (C) 2015 Luc Didry\n# This file is distributed under the same license as the Lufi package.\n# Luc Didry <luc@didry.org>, 2015.\n# Cédric VALMARY <cvalmary@yahoo.fr>, 2016.\n# Luc Didry <luc@framasoft.org>, 2018. #zanata\n# Quentí, 2018. #zanata\n# Luc Didry <luc@framasoft.org>, 2019. #zanata\n# Quentí, 2019. #zanata\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\\n\"\n\"PO-Revision-Date: 2021-11-03 19:33+0000\\n\"\n\"Last-Translator: Quentin PAGÈS <quentinantonin@free.fr>\\n\"\n\"Language-Team: Occitan <https://weblate.framasoft.org/projects/lufi/\"\n\"default-theme/oc/>\\n\"\n\"Language: oc\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=n > 1;\\n\"\n\"X-Generator: Weblate 4.8.1\\n\"\n\n#. ($delay)\n#. (max_delay)\n#: themes/default/templates/index.html.ep:56 themes/default/templates/index.html.ep:65 themes/default/templates/index.html.ep:66\nmsgid \"%1 days\"\nmsgstr \"%1 jorns\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:2\nmsgid \"%1 invites you to send him/her files\"\nmsgstr \"%1 vos convida a li mandar de fichièrs\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:6\nmsgid \"%1 invites you to send him/her files through Lufi.\"\nmsgstr \"%1 vos convida a li mandar de fichièrs per Lufi.\"\n\n#. (stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:4\nmsgid \"%1 sent you files\"\nmsgstr \"%1 vos mandèt de fichièrs\"\n\n#. (stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:8\nmsgid \"%1 used your invitation to send you files:\"\nmsgstr \"%1 utilizèt vòstra invitacion per vos mandar de fichièrs :\"\n\n#: lib/Lufi/Controller/Invitation.pm:159 lib/Lufi/Controller/Invitation.pm:84 themes/default/templates/invitations/my_invitations.html.ep:51 themes/default/templates/invitations/my_invitations.html.ep:52 themes/default/templates/invitations/my_invitations.html.ep:53 themes/default/templates/invitations/notification_files_sent.mail.ep:12\nmsgid \"%A %d %B %Y at %T\"\nmsgstr \"%A %d %B %Y a %T\"\n\n#: themes/default/templates/partial/index.js.ep:27\nmsgid \"(max size: XXX)\"\nmsgstr \"(talha max : XXX)\"\n\n#: themes/default/templates/index.html.ep:5\nmsgid \"1 year\"\nmsgstr \"1 an\"\n\n#: themes/default/templates/index.html.ep:4 themes/default/templates/index.html.ep:65\nmsgid \"24 hours\"\nmsgstr \"24 oras\"\n\n#: themes/default/templates/partial/mail.js.ep:40\nmsgid \":\"\nmsgstr \" :\"\n\n#: themes/default/templates/render.html.ep:42\nmsgid \"Abort\"\nmsgstr \"Anullar\"\n\n#: themes/default/templates/layouts/default.html.ep:53 themes/default/templates/layouts/default.html.ep:86\nmsgid \"About\"\nmsgstr \"A prepaus\"\n\n#: themes/default/templates/index.html.ep:107\nmsgid \"Add a password to file(s)\"\nmsgstr \"Apondre un senhal al(s) fichièr(s)\"\n\n#: themes/default/templates/mail.html.ep:16\nmsgid \"\"\n\"Adding URLs not related to this Lufi instance to the mail body or subject is \"\n\"prohibited.\"\nmsgstr \"\"\n\"Ajustar d’URL pas ligadas a aquesta instància pel còr o subjècte d’un \"\n\"corrièl es defendut.\"\n\n#: themes/default/templates/partial/invitations.js.ep:3\nmsgid \"Are you sure you want to delete the selected invitations?\"\nmsgstr \"Volètz vertadièrament suprimir l’invitacion seleccionada ?\"\n\n#: themes/default/templates/partial/invitations.js.ep:4\nmsgid \"\"\n\"Are you sure you want to resend the invitation mail for the selected \"\n\"invitations?\"\nmsgstr \"\"\n\"Volètz vertadièrament tornar mandar lo corrièl d’invitacion per las \"\n\"invitacions seleccionadas ?\"\n\n#: themes/default/templates/about.html.ep:17\nmsgid \"\"\n\"As Lufi is a free software licensed under of the terms of the <a href=\"\n\"\\\"https://gnu.org/licenses/agpl.html\\\" class=\\\"classic\\\">AGPLv3</a>, you can \"\n\"install it on you own server. Have a look on the <a href=\\\"https://framagit.\"\n\"org/luc/lufi/wikis/home\\\" class=\\\"classic\\\">Wiki</a> for the procedure.\"\nmsgstr \"\"\n\"Ja que Lufi es un logicial liure somés als tèrmes de la licéncia <a href=\"\n\"\\\"https://gnu.org/licenses/agpl.html\\\" class=\\\"classic\\\">AGPLv3</a>, podètz \"\n\"l’installar sus vòstre pròpri servidor. Mercés de consultar lo <a href=\"\n\"\\\"https://framagit.org/luc/lufi/wikis/home\\\" class=\\\"classic\\\">Wiki</a> per \"\n\"veire la procedura.\"\n\n#. (stash('nbslices')\n#: themes/default/templates/partial/render.js.ep:9\nmsgid \"Asking for file part XX1 of %1\"\nmsgstr \"Demanda del tròç XX1 sus %1 del fichièr\"\n\n#: themes/default/templates/about.html.ep:20\nmsgid \"Back to homepage\"\nmsgstr \"Tornar a la pagina d’acuèlh\"\n\n#: lib/Lufi/Controller/Mail.pm:25\nmsgid \"Bad CSRF token!\"\nmsgstr \"Marrit geton CSRF !\"\n\n#: lib/Lufi/Controller/Auth.pm:27 lib/Lufi/Controller/Auth.pm:49\nmsgid \"Bad CSRF token.\"\nmsgstr \"Marrit geton CSRF.\"\n\n#: themes/default/templates/partial/render.js.ep:5\nmsgid \"Click here to refresh the page and restart the download.\"\nmsgstr \"\"\n\"Clicatz aquí per actualizar la pagina e tornar començar lo telecargament.\"\n\n#: themes/default/templates/invitations/invite.mail.ep:8\nmsgid \"Click on the following URL to upload files on Lufi:\"\nmsgstr \"Clicatz l’URL seguenta per mandar de fichièrs sus Lufi :\"\n\n#: themes/default/templates/index.html.ep:126\nmsgid \"Click to open the file browser\"\nmsgstr \"Clicatz per dobrir lo navigador de fichièr\"\n\n#: themes/default/templates/delays.html.ep:38 themes/default/templates/invitations/my_invitations.html.ep:80\nmsgid \"Close\"\nmsgstr \"Tampar\"\n\n#: themes/default/templates/mail.html.ep:23\nmsgid \"Comma-separated email addresses\"\nmsgstr \"Adreças de corrièl separadas per de virgulas\"\n\n#: themes/default/templates/index.html.ep:140\nmsgid \"Compressing zip file…\"\nmsgstr \"Compression del fichièr zip…\"\n\n#: themes/default/templates/partial/index.js.ep:15\nmsgid \"Copy all links to clipboard\"\nmsgstr \"Copiar totes los ligams al quicha-papièrs\"\n\n#: themes/default/templates/partial/index.js.ep:18\nmsgid \"Copy to clipboard\"\nmsgstr \"Copiar al quicha-papièrs\"\n\n#: lib/Lufi/Controller/Files.pm:507\nmsgid \"Could not delete the file. You are not authenticated.\"\nmsgstr \"Impossible de suprimir lo fichièr. Sètz pas connectat-ada.\"\n\n#: lib/Lufi/Controller/Files.pm:489\nmsgid \"Could not find the file. Are you sure of the URL and the token?\"\nmsgstr \"\"\n\"Impossible de trobar lo fichièr. Sètz segur-a que l’URL e lo geton son \"\n\"bons ?\"\n\n#: lib/Lufi/Controller/Files.pm:400\nmsgid \"Could not find the file. Are you sure of the URL?\"\nmsgstr \"Impossible de trobar lo fichièr. Sètz segur-a que l’URL es bona ?\"\n\n#: themes/default/templates/files.html.ep:29\nmsgid \"Counter\"\nmsgstr \"Comptador\"\n\n#: themes/default/templates/index.html.ep:100\nmsgid \"Create a zip archive with the files before uploading?\"\nmsgstr \"Crear un archiu zip amb los fichièr abans lo mandadís ?\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:26\nmsgid \"Created at\"\nmsgstr \"Creada lo\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:14\nmsgid \"Delete\"\nmsgstr \"Suprimir\"\n\n#: themes/default/templates/files.html.ep:30 themes/default/templates/index.html.ep:90\nmsgid \"Delete at first download?\"\nmsgstr \"Suprimir aprèp lo primièr telecargament ?\"\n\n#: themes/default/templates/files.html.ep:19\nmsgid \"Delete selected files\"\nmsgstr \"Suprimir los fichièrs seleccionats\"\n\n#: themes/default/templates/files.html.ep:33 themes/default/templates/partial/index.js.ep:19\nmsgid \"Deletion link\"\nmsgstr \"Ligam de supression\"\n\n#: themes/default/templates/delays.html.ep:8\nmsgid \"\"\n\"Don't worry: if a user begins to download the file before the expiration and \"\n\"the download ends after the expiration, he will be able to get the file.\"\nmsgstr \"\"\n\"Vos copetz pas lo cap : se un utilizaire comença a telecargar lo fichièr \"\n\"abans son expiracion e que lo telecargament s’acaba aprèp l’expiracion, \"\n\"utilizaire poirà recuperar lo fichièr.\"\n\n#: themes/default/templates/partial/index.js.ep:21 themes/default/templates/render.html.ep:28\nmsgid \"Download\"\nmsgstr \"Telecargar\"\n\n#: themes/default/templates/partial/render.js.ep:4\nmsgid \"Download aborted.\"\nmsgstr \"Telecargament abandonat.\"\n\n#: themes/default/templates/files.html.ep:28 themes/default/templates/partial/index.js.ep:20\nmsgid \"Download link\"\nmsgstr \"Ligam de telecargament\"\n\n#: themes/default/templates/about.html.ep:10\nmsgid \"\"\n\"Drag and drop files in the appropriate area or use the traditional way to \"\n\"send files and the files will be chunked, encrypted and sent to the server. \"\n\"You will get two links per file: a download link, that you give to the \"\n\"people you want to share the file with and a deletion link, allowing you to \"\n\"delete the file whenever you want.\"\nmsgstr \"\"\n\"Fasètz lisar de fichièrs dins la zòna prevista per aquò far o seleccionatz \"\n\"un fichièr de faiçon classica e los fichièrs seràn descopats a tròces, \"\n\"chifrats e mandats al servidor. Recuperaretz dos ligams per fichièr : un \"\n\"ligam de telecargament e un ligam per suprimir lo fichièr quand o volètz.\"\n\n#: themes/default/templates/index.html.ep:122\nmsgid \"Drop files here\"\nmsgstr \"Lisatz vòstres fichièrs aquí\"\n\n#: themes/default/templates/invitations/invite.html.ep:40\nmsgid \"Email address of your guest\"\nmsgstr \"Adreça electronica de vòstre convidat\"\n\n#: themes/default/templates/mail.html.ep:39\nmsgid \"Email body\"\nmsgstr \"Còs del corrièl\"\n\n#: themes/default/templates/mail.html.ep:31\nmsgid \"Email subject\"\nmsgstr \"Subjècte del corrièl\"\n\n#: themes/default/templates/mail.html.ep:25 themes/default/templates/mail.html.ep:27\nmsgid \"Emails\"\nmsgstr \"Corrièl\"\n\n#: themes/default/templates/partial/index.js.ep:22\nmsgid \"Encrypting part XX1 of XX2\"\nmsgstr \"Chiframent del tròç XX1 sus XX2\"\n\n#: lib/Lufi/Controller/Files.pm:289\nmsgid \"Error: the file existed but was deleted.\"\nmsgstr \"Error : lo fichièr existissiá mas es estat suprimit.\"\n\n#: lib/Lufi/Controller/Files.pm:369\nmsgid \"Error: the file has not been sent entirely.\"\nmsgstr \"Error : lo fichièr es pas estat mandat completament.\"\n\n#: lib/Lufi/Controller/Files.pm:379\nmsgid \"Error: unable to find the file. Are you sure of your URL?\"\nmsgstr \"Error : impossible de trobar lo fichièr. Sètz segur-a de l’URL ?\"\n\n#: themes/default/templates/partial/index.js.ep:23\nmsgid \"Expiration:\"\nmsgstr \"Expiracion :\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:27\nmsgid \"Expire at\"\nmsgstr \"Expira lo\"\n\n#: themes/default/templates/files.html.ep:32\nmsgid \"Expires at\"\nmsgstr \"Expira lo\"\n\n#: themes/default/templates/files.html.ep:12\nmsgid \"Export localStorage data\"\nmsgstr \"Exportar las donadas localStorage\"\n\n#: lib/Lufi/Controller/Files.pm:471\nmsgid \"File deleted\"\nmsgstr \"Fichièr suprimit\"\n\n#: themes/default/templates/files.html.ep:27\nmsgid \"File name\"\nmsgstr \"Nom del fichièr\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:61\nmsgid \"Files\"\nmsgstr \"Fichièrs\"\n\n#: themes/default/templates/index.html.ep:80\nmsgid \"Files deleted at first download\"\nmsgstr \"Fichièr suprimit al primièr telecargament\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:28\nmsgid \"Files sent at\"\nmsgstr \"Fichièrs mandats a\"\n\n#: themes/default/templates/partial/invitations.js.ep:8\nmsgid \"Files sent in invitation XX1 by XX2\"\nmsgstr \"Fichièrs mandats dins l’invitacion XX1 per XX2\"\n\n#: themes/default/templates/partial/render.js.ep:8\nmsgid \"Get the file\"\nmsgstr \"Recuperar lo fichièr\"\n\n#: themes/default/templates/about.html.ep:18\nmsgid \"\"\n\"Get the source code on <a href=\\\"https://framagit.org/luc/lufi\\\" class=\"\n\"\\\"classic\\\">the official repository</a> or on its <a href=\\\"https://github.\"\n\"com/ldidry/lufi\\\" class=\\\"classic\\\">Github mirror</a>\"\nmsgstr \"\"\n\"Recuperatz lo còdi font sul <a href=\\\"https://framagit.org/luc/lufi\\\" class=\"\n\"\\\"classic\\\">depaus oficial</a> o sus son <a href=\\\"https://github.com/ldidry/\"\n\"lufi\\\" class=\\\"classic\\\">miralh Github</a>\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:24\nmsgid \"Guest mail\"\nmsgstr \"Corrièl del convidat\"\n\n#. (ucfirst(stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:6\nmsgid \"Hello %1,\"\nmsgstr \"Adiu %1,\"\n\n#: themes/default/templates/invitations/invite.mail.ep:4\nmsgid \"Hello,\"\nmsgstr \"Adiu,\"\n\n#: themes/default/templates/partial/mail.js.ep:35\nmsgid \"Hello,\\\\n\\\\nHere's some files I want to share with you:\\\\n\"\nmsgstr \"Bonjorn,\\\\n\\\\nVaquí qualques fichièrs que desiri partejar amb tu :\\\\n\"\n\n#: themes/default/templates/mail.html.ep:35\nmsgid \"Here's some files\"\nmsgstr \"Vaquí qualques fichièrs\"\n\n#: themes/default/templates/partial/invitations.js.ep:7\nmsgid \"Hide hidden invitations\"\nmsgstr \"Amagar las invitacions amagadas\"\n\n#: themes/default/templates/partial/index.js.ep:25\nmsgid \"Hit Enter, then Ctrl+C to copy all the download links\"\nmsgstr \"\"\n\"Quichatz Entrada puèi fasètz Ctrl+C per copiar totes los ligams per \"\n\"telecargar\"\n\n#: themes/default/templates/partial/index.js.ep:24\nmsgid \"Hit Enter, then Ctrl+C to copy the download link\"\nmsgstr \"\"\n\"Quichatz Entrada puèi fasètz Ctrl+C per copiar lo ligam per telecargar\"\n\n#: themes/default/templates/about.html.ep:9\nmsgid \"How does it work?\"\nmsgstr \"Cossí aquò fonciona ?\"\n\n#: themes/default/templates/invitations/invite.html.ep:46\nmsgid \"How many days would you like the invitation to be valid?\"\nmsgstr \"Quant de jorns volriatz que l’invitacion siá valida ?\"\n\n#: themes/default/templates/about.html.ep:16\nmsgid \"How to install the software on my server?\"\nmsgstr \"Cossí installar lo logicial sus mon servidor ?\"\n\n#: themes/default/templates/about.html.ep:12\nmsgid \"How to report an illegal file?\"\nmsgstr \"Cossí senhalar un fichièr illegal ?\"\n\n#: themes/default/templates/delays.html.ep:7\nmsgid \"If you choose a delay, the file will be deleted after that delay.\"\nmsgstr \"\"\n\"S’avètz causit un relambi, lo fichièr serà suprimit aprèp aqueste relambi.\"\n\n#: themes/default/templates/mail.html.ep:15\nmsgid \"\"\n\"If you send the mail from this server, the links will be sent to the server, \"\n\"which may lower your privacy protection.\"\nmsgstr \"\"\n\"Se mandatz lo corrièl d’aqueste servidor, los ligams seràn mandat al \"\n\"servidor, aquò pòt demesir vòstra proteccion de la confidencialitat.\"\n\n#: themes/default/templates/files.html.ep:14\nmsgid \"Import localStorage data\"\nmsgstr \"Importar las donadas localStorage\"\n\n#: themes/default/templates/index.html.ep:53\nmsgid \"Important: more information on delays\"\nmsgstr \"Important : mai d’informacions suls relambis\"\n\n#: themes/default/templates/delays.html.ep:5\nmsgid \"Information about delays\"\nmsgstr \"Informacion suls relambis\"\n\n#: themes/default/templates/files.html.ep:18 themes/default/templates/invitations/my_invitations.html.ep:12\nmsgid \"Invert selection\"\nmsgstr \"Invertir la seleccion\"\n\n#. ($i->guest_mail, $url)\n#: lib/Lufi/Controller/Invitation.pm:171\nmsgid \"Invitation resent to %1.<br> URL: %2\"\nmsgstr \"Invitacion mandada tornamai a %1.<br> URL : %2\"\n\n#. ($invitation->guest_mail, $url)\n#: lib/Lufi/Controller/Invitation.pm:87\nmsgid \"Invitation sent to %1.<br> URL: %2\"\nmsgstr \"Invitacion mandada a %1.<br> URL : %2\"\n\n#: themes/default/templates/invitations/invite.html.ep:27 themes/default/templates/layouts/default.html.ep:36 themes/default/templates/layouts/default.html.ep:69\nmsgid \"Invite a guest\"\nmsgstr \"Convidar qualqu’un\"\n\n#: themes/default/templates/partial/render.js.ep:6\nmsgid \"\"\n\"It seems that the key in your URL is incorrect. Please, verify your URL.\"\nmsgstr \"\"\n\"Sembla que la clau dins vòstra URL siá incorrècta. Mercés de verificar \"\n\"vòstra URL.\"\n\n#: themes/default/templates/index.html.ep:12\nmsgid \"Javascript is disabled. You won't be able to use Lufi.\"\nmsgstr \"Javascript es desactivat. Lufi foncionarà pas.\"\n\n#: themes/default/templates/layouts/default.html.ep:44 themes/default/templates/layouts/default.html.ep:46 themes/default/templates/layouts/default.html.ep:77 themes/default/templates/layouts/default.html.ep:79\nmsgid \"Language\"\nmsgstr \"Lenga\"\n\n#: themes/default/templates/login.html.ep:15\nmsgid \"Login\"\nmsgstr \"Identificant\"\n\n#: themes/default/templates/layouts/default.html.ep:58 themes/default/templates/layouts/default.html.ep:91\nmsgid \"Logout\"\nmsgstr \"Desconnexion\"\n\n#: themes/default/templates/about.html.ep:4\nmsgid \"Lufi is a free (as in free speech) file hosting software.\"\nmsgstr \"Lufi es un logicial liure d’albèrgament de fichièrs.\"\n\n#: themes/default/templates/partial/files.js.ep:12\nmsgid \"\"\n\"Lufi recently changed its way to store files information.\\\\n\\\\nNo files have \"\n\"been found in the new localStorage location but we found files in the old \"\n\"one.\\\\nDo you want to import those informations?\\\\n\\\\nPlease note that this \"\n\"is the only time that we will ask you this.\"\nmsgstr \"\"\n\"Lufi cambièt recentament son biais de gardar las informacions dels fichièrs.\"\n\"\\\\n\\\\nCap de fichièr es estat trobat dins ’emplaçament del novèl \"\n\"localStorage mas avèm trobat de fichièrs dins l’ancian.\\\\nVolètz importar \"\n\"aquelas informacions ?\\\\n\\\\nNotatz que serà lo sol còp que vos demandarem \"\n\"aquò.\"\n\n#: themes/default/templates/files.html.ep:34\nmsgid \"Mail\"\nmsgstr \"Corrièl\"\n\n#: themes/default/templates/files.html.ep:3 themes/default/templates/layouts/default.html.ep:34 themes/default/templates/layouts/default.html.ep:67\nmsgid \"My files\"\nmsgstr \"Mos fichièrs\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:5 themes/default/templates/layouts/default.html.ep:37 themes/default/templates/layouts/default.html.ep:70\nmsgid \"My invitations\"\nmsgstr \"Mas invitacions\"\n\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:17\nmsgid \"\"\n\"NB: this list includes the list of files that have already been sent to you.\"\nmsgstr \"\"\n\"NB : aquesta lista inclutz la lista dels fichièrs que vos son estats mandats.\"\n\"\"\n\n#: themes/default/templates/index.html.ep:115\nmsgid \"Name of the zip file\"\nmsgstr \"Nom del fichièr zip\"\n\n#. (format_bytes($json->{size})\n#: lib/Lufi/Controller/Files.pm:108\nmsgid \"No enough space available on the server for this file (size: %1).\"\nmsgstr \"\"\n\"Espaci disc insufisent sul servidor per aqueste fichièr (talha del fichièr :\"\n\" \\\"%1).\"\n\n#: themes/default/templates/partial/files.js.ep:10 themes/default/templates/partial/index.js.ep:28\nmsgid \"No expiration delay\"\nmsgstr \"Pas cap de relambi d’expiracion\"\n\n#: themes/default/templates/files.html.ep:8\nmsgid \"\"\n\"Only the files sent with this browser will be listed here. This list is \"\n\"stored in localStorage: if you delete your localStorage data, you'll lose \"\n\"this list.\"\nmsgstr \"\"\n\"Sols los fichièrs mandats amb aqueste navigador web son listats aicí. Las \"\n\"informacions son gardadas en localStorage : se suprimissètz vòstras donadas \"\n\"localStorage, perdretz aquelas informacions.\"\n\n#: themes/default/templates/index.html.ep:106 themes/default/templates/login.html.ep:21 themes/default/templates/render.html.ep:26\nmsgid \"Password\"\nmsgstr \"Senhal\"\n\n#. (config('contact')\n#: themes/default/templates/about.html.ep:13\nmsgid \"Please contact the administrator: %1\"\nmsgstr \"Mercés de contactar l’administrator : %1\"\n\n#: themes/default/templates/render.html.ep:33\nmsgid \"\"\n\"Please wait while we are getting your file. We first need to download and \"\n\"decrypt all parts before you can get it.\"\nmsgstr \"\"\n\"Mercés d’esperar pendent la recuperacion de vòstre fichièr. Nos cal d’en \"\n\"primièr recuperar e deschifrar totes los tròces abans que poscatz o \"\n\"telecargar.\"\n\n#: lib/Lufi/Controller/Auth.pm:38\nmsgid \"\"\n\"Please, check your credentials or your right to access this service: unable \"\n\"to authenticate.\"\nmsgstr \"\"\n\"Mercés de verificar vòstres identificants o vòstres dreches d’accès a \"\n\"aqueste servici : autentificacion impossibla.\"\n\n#: themes/default/templates/about.html.ep:5\nmsgid \"Privacy\"\nmsgstr \"Confidencialitat\"\n\n#: themes/default/templates/files.html.ep:13\nmsgid \"Purge expired files from localStorage\"\nmsgstr \"Suprimir del localStorage los fichièrs expirats\"\n\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:20\nmsgid \"Regards,\"\nmsgstr \"Coralament,\"\n\n#: themes/default/templates/invitations/invite.mail.ep:15\nmsgid \"Regards.\"\nmsgstr \"Coralament.\"\n\n#: themes/default/templates/layouts/default.html.ep:31 themes/default/templates/layouts/default.html.ep:64\nmsgid \"Report file\"\nmsgstr \"Senhalar un fichièr\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:15\nmsgid \"Resend invitation mail\"\nmsgstr \"Tornar mandar lo corrièl d’invitacion\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:9\nmsgid \"Rows in purple mean that the invitations have expired.\"\nmsgstr \"Las linhas en violet representan las invitacions expiradas.\"\n\n#: themes/default/templates/files.html.ep:9\nmsgid \"\"\n\"Rows in red mean that the files have expired and are no longer available.\"\nmsgstr \"\"\n\"Las linhas en roge indican que lo fichièr a expirat e es pas mai disponible.\"\n\n#: themes/default/templates/partial/index.js.ep:26\nmsgid \"Send all links by email\"\nmsgstr \"Mandar totes los ligams per corrièl\"\n\n#: themes/default/templates/invitations/invite.html.ep:50\nmsgid \"Send the invitation\"\nmsgstr \"Mandar l’invitacion\"\n\n#: themes/default/templates/mail.html.ep:46\nmsgid \"Send with this server\"\nmsgstr \"Mandar amb aqueste servidor\"\n\n#: themes/default/templates/mail.html.ep:47\nmsgid \"Send with your own mail software\"\nmsgstr \"Mandar amb vòstre pròpri logicial de corrièl\"\n\n#: themes/default/templates/partial/index.js.ep:29\nmsgid \"\"\n\"Sending part XX1 of XX2. Please, be patient, the progress bar can take a \"\n\"while to move.\"\nmsgstr \"\"\n\"Mandadís del tròç XX1 sus XX2. Pacientatz, la barra de progression pòt metre \"\n\"de temps abans d’avançar.\"\n\n#. (url_for('/')\n#: themes/default/templates/partial/mail.js.ep:48\nmsgid \"Share your files in total privacy on %1\"\nmsgstr \"Partejatz vòstres fichièrs en tota confidencialitat sus %1\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:13 themes/default/templates/partial/invitations.js.ep:9\nmsgid \"Show hidden invitations\"\nmsgstr \"Far veire las invitacions amagadas\"\n\n#: themes/default/templates/partial/render.js.ep:11\nmsgid \"Show zip content\"\nmsgstr \"Mostrar lo contengut del zip\"\n\n#: themes/default/templates/layouts/default.html.ep:40 themes/default/templates/layouts/default.html.ep:73 themes/default/templates/login.html.ep:28 themes/default/templates/logout.html.ep:17\nmsgid \"Signin\"\nmsgstr \"Connexion\"\n\n#: lib/Lufi/Controller/Invitation.pm:283 themes/default/templates/invitations/exception.html.ep:16\nmsgid \"\"\n\"Sorry, the invitation doesn’t exist. Are you sure you are on the right URL?\"\nmsgstr \"O planhèm, l’invitacion existís pas. Avètz utilizat la bona URL ?\"\n\n#: themes/default/templates/index.html.ep:46\nmsgid \"Sorry, the uploading is currently disabled. Please try again later.\"\nmsgstr \"\"\n\"O planhèm, la foncion per mandar de fichièr es desactivada pel moment. \"\n\"Mercés de tornar ensajar mai tard.\"\n\n#: lib/Lufi/Controller/Files.pm:82\nmsgid \"Sorry, uploading is disabled.\"\nmsgstr \"O planhèm, la foncion per mandar de fichièr es desactivada.\"\n\n#: themes/default/templates/invitations/exception.html.ep:7\nmsgid \"Sorry, your invitation has expired or has been deleted.\"\nmsgstr \"O planhèm, vòstra invitacion a expirada o es estada suprimida.\"\n\n#. ($invit->ldap_user_mail)\n#: lib/Lufi/Controller/Files.pm:122\nmsgid \"\"\n\"Sorry, your invitation has expired or has been deleted. Please contact %1 to \"\n\"have another invitation.\"\nmsgstr \"\"\n\"O planhèm, vòstra invitacion a expirada o es estada suprimida. Contactatz %1 \"\n\"per n’aver una autra.\"\n\n#. ($invitation->ldap_user_mail)\n#: lib/Lufi/Controller/Invitation.pm:276\nmsgid \"The URLs of your files have been sent by email to %1.\"\nmsgstr \"Las URL de vòstres fichièrs son estadas mandadas per corrièl a %1.\"\n\n#: themes/default/templates/about.html.ep:7\nmsgid \"\"\n\"The administrator can only see the file's name, its size and its mimetype \"\n\"(what kind of file it is: video, text, etc.).\"\nmsgstr \"\"\n\"L’administrator pòt pas que veire lo nom del fichièr, sa talha e son \"\n\"mimetype (Quina mena de fichièr es : vidèo, tèxte, etc.).\"\n\n#: lib/Lufi/Controller/Mail.pm:53\nmsgid \"\"\n\"The body of the mail must contain at least one URL pointing to a file hosted \"\n\"on this instance.\"\nmsgstr \"\"\n\"Lo còr del messatge deu conténer almens una URL menant a un fichièr albergat \"\n\"a aquesta instància.\"\n\n#: themes/default/templates/partial/files.js.ep:11\nmsgid \"The data has been successfully imported.\"\nmsgstr \"Las donadas son ben estadas importadas.\"\n\n#: lib/Lufi/Controller/Mail.pm:73\nmsgid \"The email body can't be empty.\"\nmsgstr \"Lo contengut del corrièl pòt pas èsser void.\"\n\n#: lib/Lufi/Controller/Mail.pm:72\nmsgid \"The email subject can't be empty.\"\nmsgstr \"Lo subjècte del corrièl pòt pas èsser void.\"\n\n#. ($expire_at, $max_expire_at)\n#: lib/Lufi/Controller/Invitation.pm:51\nmsgid \"The expiration delay (%1) is not between 1 and %2 days.\"\nmsgstr \"Lo relambi d’expiracion (%1) es pas entre 1 e %2 jorns.\"\n\n#: lib/Lufi/Controller/Files.pm:468\nmsgid \"The file has already been deleted\"\nmsgstr \"Lo fichièr es ja estat suprimit\"\n\n#: themes/default/templates/about.html.ep:6\nmsgid \"\"\n\"The files uploaded on a Lufi instance are encrypted before the upload to the \"\n\"server: the administrator of the server can not see the file's content.\"\nmsgstr \"\"\n\"Los fichièrs mandats amb una instància Lufi son chifrats abans la mandadís \"\n\"al servidor : l’administrator del servidor pòt pas veire lo contengut dels \"\n\"fichièrs.\"\n\n#. (join(', ', @bad)\n#: lib/Lufi/Controller/Mail.pm:68\nmsgid \"The following email addresses are not valid: %1\"\nmsgstr \"Las adreças de corrièl seguentas son pas validas : %1\"\n\n#. ($guest_mail)\n#: lib/Lufi/Controller/Invitation.pm:48\nmsgid \"The guest email address (%1) is unvalid.\"\nmsgstr \"L’adreça del convida (%1) es pas valida.\"\n\n#. ($i->token, $i->guest_mail)\n#: lib/Lufi/Controller/Invitation.pm:150\nmsgid \"\"\n\"The invitation %1 can’t be resent: %2 has already sent files.<br>Please \"\n\"create a new invitation.\"\nmsgstr \"\"\n\"L’invitacion %1 pòt pas èsser tornada manda : %2 mandèt ja de fichièrs.\"\n\"<br>Volgatz crear una nòva invitacion.\"\n\n#. ($i->token)\n#: lib/Lufi/Controller/Invitation.pm:130\nmsgid \"The invitation %1 has been deleted.\"\nmsgstr \"L’invitacion %1 es estada suprimida.\"\n\n#. (stash('user_mail')\n#: themes/default/templates/invitations/invite.html.ep:34\nmsgid \"The invitation mail will be send from your email address (%1).\"\nmsgstr \"Lo messatge d’invitacion serà mandat a vòstra adreça electronica (%1).\"\n\n#: themes/default/templates/partial/index.js.ep:16\nmsgid \"The link(s) has been copied to your clipboard\"\nmsgstr \"Lo(s) ligam(s) es/son estat(s) copiat(s) al quicha-papièrs\"\n\n#. (stash('invitation')\n#: themes/default/templates/index.html.ep:30\nmsgid \"\"\n\"The link(s) of your file(s) will automatically be sent by mail to %1 (%2)\"\nmsgstr \"\"\n\"Los ligams de vòstre(s) fichièr(s) seràn automaticament mandats per corrièl \"\n\"a %1 (%2)\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:11\nmsgid \"The links of your file(s) will automatically be sent by mail to %1.\"\nmsgstr \"\"\n\"Los ligams de vòstre(s) fichièr(s) seràn automaticament mandats per corrièl \"\n\"a %1.\"\n\n#: lib/Lufi/Controller/Mail.pm:97\nmsgid \"The mail has been sent.\"\nmsgstr \"Lo corrièl es estat mandat.\"\n\n#: themes/default/templates/about.html.ep:15\nmsgid \"\"\n\"The original (and only for now) author is <a href=\\\"https://fiat-tux.fr\\\" \"\n\"class=\\\"classic\\\">Luc Didry</a>.\"\nmsgstr \"\"\n\"L’autor original (e pel moment, lo sol) es <a href=\\\"https://fiat-tux.fr\\\" \"\n\"class=\\\"classic\\\">Luc Didry</a>.\"\n\n#: lib/Lufi/Controller/Files.pm:236\nmsgid \"\"\n\"The server was unable to find the file record to add your file part to. \"\n\"Please, contact the administrator.\"\nmsgstr \"\"\n\"Lo servidor es pas estat capable de retrobar l’enregistrament del fichièr \"\n\"que li cal ajustar vòstre tròç de fichièr. Mercés de contactar \"\n\"l’administrator.\"\n\n#: lib/Lufi/Controller/Files.pm:295\nmsgid \"\"\n\"This file has been deactivated by the admins. Contact them to know why.\"\nmsgstr \"\"\n\"Aqueste fichièr es estat desactivat pels administrators. Contactatz-los per \"\n\"saber perque.\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:46 themes/default/templates/partial/invitations.js.ep:6\nmsgid \"This invitation is normally hidden\"\nmsgstr \"Aquesta invitacion es normalament amagada\"\n\n#. (stash('expires')\n#: themes/default/templates/invitations/invite.mail.ep:13\nmsgid \"This invitation is valid until %1.\"\nmsgstr \"L’invitacion es valida fins al %1.\"\n\n#: themes/default/templates/delays.html.ep:10\nmsgid \"\"\n\"This server sets limitations according to the file size. The expiration \"\n\"delay of your file will be the minimum between what you choose and the \"\n\"following limitations:\"\nmsgstr \"\"\n\"Aqueste servidor impausa de limitacions segon la talha dels fichièrs. Lo \"\n\"relambi d’expiracion de vòstre fichièr serà lo minimum entre çò qu’avètz \"\n\"causit e los limits seguents :\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:16\nmsgid \"Toggle visibility\"\nmsgstr \"Bascular la visibilitat\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:25\nmsgid \"URL\"\nmsgstr \"URL\"\n\n#: themes/default/templates/partial/index.js.ep:17\nmsgid \"Unable to copy the link(s) to your clipboard\"\nmsgstr \"Impossible de copiar lo(s) ligams(s) al quicha-papièrs\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:439\nmsgid \"\"\n\"Unable to get counter for %1. The file does not exists. It will be removed \"\n\"from your localStorage.\"\nmsgstr \"\"\n\"Impossible de recuperar lo comptador per %1. Lo fichièr existís pas. Serà \"\n\"levat de vòstre localStorage.\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:429\nmsgid \"Unable to get counter for %1. The token is invalid.\"\nmsgstr \"Impossible de recuperar lo comptador per %1. Lo geton es invalid.\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:449\nmsgid \"Unable to get counter for %1. You are not authenticated.\"\nmsgstr \"Impossible de recuperar lo comptador per %1. Sètz pas connectat·ada.\"\n\n#: themes/default/templates/layouts/default.html.ep:33 themes/default/templates/layouts/default.html.ep:66\nmsgid \"Upload files\"\nmsgstr \"Mandar de fichièrs\"\n\n#: themes/default/templates/index.html.ep:145\nmsgid \"Upload generated zip file\"\nmsgstr \"Mandar lo fichièr zip generat\"\n\n#: themes/default/templates/files.html.ep:31\nmsgid \"Uploaded at\"\nmsgstr \"Mandat lo\"\n\n#: themes/default/templates/index.html.ep:153\nmsgid \"Uploaded files\"\nmsgstr \"Fichièrs mandats\"\n\n#: themes/default/templates/partial/index.js.ep:30\nmsgid \"Websocket communication error\"\nmsgstr \"Error de comunicacion WebSocket\"\n\n#: themes/default/templates/about.html.ep:3\nmsgid \"What is Lufi?\"\nmsgstr \"Qu’es aquò Lufi ?\"\n\n#: themes/default/templates/about.html.ep:14\nmsgid \"Who wrote this software?\"\nmsgstr \"Qual escriguèt aqueste logicial ?\"\n\n#: themes/default/templates/partial/index.js.ep:13\nmsgid \"XXX file has been added to upload queue.\"\nmsgstr \"XXX fichièrs son estats ajustats a la fila de mandadís.\"\n\n#: themes/default/templates/invitations/invite.html.ep:30\nmsgid \"\"\n\"You can invite someone to send you files through this Lufi instance even if \"\n\"they don’t have an account on it.\"\nmsgstr \"\"\n\"Podètz convidar qualqu’un per que vos mande de fichièrs per aquesta \"\n\"instància Lufi encara qu’ajan pas de compte sus aquela d’aquí.\"\n\n#: themes/default/templates/about.html.ep:11\nmsgid \"\"\n\"You can see the list of your files by clicking on the \\\"My files\\\" link at \"\n\"the top right of this page.\"\nmsgstr \"\"\n\"Podètz veire la lista de vòstres fichièrs en clicant sul ligam « Mos \"\n\"fichièrs » amont a man drecha d’aquesta pagina.\"\n\n#: lib/Lufi/Controller/Mail.pm:42\nmsgid \"You can't add URLs that are not related to this instance.\"\nmsgstr \"Podètz pas ajustar d’URL que son pas ligadas a aquesta instància.\"\n\n#: themes/default/templates/about.html.ep:8\nmsgid \"\"\n\"You don't need to register yourself to upload files but be aware that, for \"\n\"legal reasons, your IP address will be stored when you send a file. Don't \"\n\"panic, this is normally the case for all sites on which you send files.\"\nmsgstr \"\"\n\"Avètz pas besonh de vos enregistrar per mandar de fichièrs mas notatz que, \"\n\"per de rasons legalas, vòstra adreça IP serà enregistrada quand mandatz un \"\n\"fichièr. Paniquetz pas, es normalament lo cas per totes los sites ont \"\n\"mandatz de fichièrs.\"\n\n#: themes/default/templates/partial/render.js.ep:10\nmsgid \"\"\n\"You don't seem to have a key in your URL. You won't be able to decrypt the \"\n\"file. Download canceled.\"\nmsgstr \"\"\n\"Sembla qu’avètz pas la bona clau dins l’URL. Poiretz pas deschifrar lo \"\n\"fichièr. Telecargament anullat.\"\n\n#: themes/default/templates/partial/render.js.ep:7\nmsgid \"\"\n\"You have attempted to leave this page. The download will be canceled. Are \"\n\"you sure?\"\nmsgstr \"\"\n\"Ensajatz de partir de la pagina. Lo telecargament serà anullat. Sètz segur-\"\n\"a ?\"\n\n#: themes/default/templates/partial/index.js.ep:14\nmsgid \"\"\n\"You have attempted to leave this page. The upload will be canceled. Are you \"\n\"sure?\"\nmsgstr \"\"\n\"Ensajatz de partir de la pagina. Lo mandadís serà anullat. Sètz segur-a ?\"\n\n#: themes/default/templates/logout.html.ep:14\nmsgid \"You have been successfully logged out.\"\nmsgstr \"Sètz ben estat desconnectat.\"\n\n#: lib/Lufi/Controller/Mail.pm:71\nmsgid \"You must give email addresses.\"\nmsgstr \"Vos cal donar d’adreças.\"\n\n#: themes/default/templates/index.html.ep:38\nmsgid \"\"\n\"Your browser does not have enough entropy to generate a strong encryption \"\n\"key. Please wait (it's better if you do things on your computer while \"\n\"waiting).\"\nmsgstr \"\"\n\"Vòstre navigador a pas pro d’entropia per generar una clau de chiframent \"\n\"fòrta. Mercés d’esperar (es de bon far de realizar de causas a l’ordenador \"\n\"d’aquel temps).\"\n\n#. (format_bytes($json->{size})\n#: lib/Lufi/Controller/Files.pm:95\nmsgid \"Your file is too big: %1 (maximum size allowed: %2)\"\nmsgstr \"\"\n\"Vòstre fichièr es tròp voluminós : %1 (la talha maximum autorizada es %2)\"\n\n#: lib/Lufi/Controller/Files.pm:351\nmsgid \"Your password is not valid. Please refresh the page to retry.\"\nmsgstr \"\"\n\"Lo senhal es pas valid. Mercés d’actualizar la pagina e ensajar tornamai.\"\n\n#: themes/default/templates/partial/render.js.ep:12\nmsgid \"Zip content:\"\nmsgstr \"Contengut ZIP :\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:20\nmsgid \"between %1 and %2, the file will be kept %3 day(s).\"\nmsgstr \"entre %1 e %2, lo fichièr serà gardat %3 jorn(s).\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:22\nmsgid \"between %1 and %2, the file will be kept forever.\"\nmsgstr \"entre %1 e %2, lo fichièr serà gardat per totjorn.\"\n\n#: themes/default/templates/partial/mail.js.ep:42\nmsgid \"deadline: \"\nmsgstr \"darrièr relambi per telecargar : \"\n\n#: themes/default/templates/partial/invitations.js.ep:5\nmsgid \"expires on XXX\"\nmsgstr \"expira lo XXX\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:26\nmsgid \"for %1 and more, the file will be kept %2 day(s)\"\nmsgstr \"per %1 e mai, lo fichièr serà gardat %2 jorn(s)\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:28\nmsgid \"for %1 and more, the file will be kept forever.\"\nmsgstr \"per %1 e mai, lo fichièr serà gardat per totjorn.\"\n\n#: themes/default/templates/index.html.ep:3\nmsgid \"no time limit\"\nmsgstr \"Pas cap de relambi d’expiracion\"\n\n#: themes/default/templates/index.html.ep:124\nmsgid \"or\"\nmsgstr \"o\"\n\n#. ($e->{name}, format_bytes($e->{size})\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:12\nmsgid \"— %1 (%2), that will expire on %3\"\nmsgstr \"— %1 (%2), qu’expirarà lo %3\"\n\n#: themes/default/templates/about.html.ep:18\nmsgid \"Get the source code on <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi\\\" class=\\\"classic\\\">the official repository</a> or on its <a href=\\\"https://github.com/ldidry/lufi\\\" class=\\\"classic\\\">Github mirror</a>\"\nmsgstr \"\"\n\"Recuperatz lo còdi font sul <a href=\\\"https://framagit.org/fiat-tux/\"\n\"hat-softwares/lufi\\\" class=\\\"classic\\\">depaus oficial</a> o sus son <a href=\"\n\"\\\"https://github.com/ldidry/lufi\\\" class=\\\"classic\\\">miralh Github</a>\"\n\n#: themes/default/templates/about.html.ep:17\nmsgid \"As Lufi is a free software licensed under of the terms of the <a href=\\\"https://gnu.org/licenses/agpl.html\\\" class=\\\"classic\\\">AGPLv3</a>, you can install it on you own server. Have a look on the <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi/wikis/home\\\" class=\\\"classic\\\">Wiki</a> for the procedure.\"\nmsgstr \"\"\n\"Ja que Lufi es un logicial liure somés als tèrmes de la licéncia <a href=\\\"\"\n\"https://gnu.org/licenses/agpl.html\\\" class=\\\"classic\\\">AGPLv3</a>, podètz l’\"\n\"installar sus vòstre pròpri servidor. Mercés de consultar lo <a href=\\\"\"\n\"https://framagit.org/fiat-tux/hat-softwares/lufi/wikis/home\\\" class=\\\"\"\n\"classic\\\">Wiki</a> per veire la procedura.\"\n\n#: themes/default/templates/partial/index.js.ep:24\nmsgid \"File uploaded\"\nmsgstr \"Fichièr mandat\"\n\n#: themes/default/templates/partial/render.js.ep:9\nmsgid \"File downloaded\"\nmsgstr \"Fichièr telecargat\"\n\n#: themes/default/templates/about.html.ep:20\nmsgid \"Version\"\nmsgstr \"Version\"\n\n#. (sprintf('<a href=\"https://framagit.org/fiat-tux/hat-softwares/lufi/-/releases/%s\" class=\"classic\">%s</a>', stash('version')\n#: themes/default/templates/about.html.ep:21\nmsgid \"Latest tag of this instance: %1\"\nmsgstr \"Darrièra etiqueta d’aquesta instància : %1\"\n\n#. (sprintf('<a href=\"https://framagit.org/fiat-tux/hat-softwares/lufi/-/commit/%s\" class=\"classic\">%s</a>', stash('version')\n#: themes/default/templates/about.html.ep:22\nmsgid \"Latest commit of this instance: %1\"\nmsgstr \"Darrièr commit d’aquesta instància : %1\"\n\n#: themes/default/templates/partial/render.js.ep:13\nmsgid \"Unable to download the file: too much unsuccessful attempts to open a websocket. Please, contact the administrator.\"\nmsgstr \"\"\n\"Telecargament del fichièr impossible : tròp d’ensages infructuóses de \"\n\"dobertura de connector de tipe websocket. Mercés de contactar \"\n\"l’administrator.\"\n\n#. ($i->token, $c->current_user->{username})\n#: lib/Lufi/Controller/Invitation.pm:187\nmsgid \"The invitation %1 can’t be resent: it wasn’t created by you (%2).\"\nmsgstr \"L'invitacion %1 se pòt pas tornar enviar : la creèretz pas vos (%2).\"\n\n#. ($orig_uri)\n#: lib/Lufi/Controller/Mail.pm:43 lib/Lufi/Controller/Mail.pm:59\nmsgid \"You can't add URLs that are not related to this instance (%1).\"\nmsgstr \"Podètz pas apondre d'URL que son pas ligadas a aquesta instància (%1).\"\n\n#. ($i->token, $c->current_user->{username})\n#: lib/Lufi/Controller/Invitation.pm:136\nmsgid \"The invitation %1 can’t be deleted: it wasn’t created by you (%2).\"\nmsgstr \"L'invitacion %1 se pòt pas suprimir : la creèretz pas vos (%2).\"\n"
  },
  {
    "path": "themes/default/lib/Lufi/I18N/pl.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\\n\"\n\"PO-Revision-Date: 2023-07-24 13:27+0000\\n\"\n\"Last-Translator: Jacek Pazur <jacek.pazur@gmail.com>\\n\"\n\"Language-Team: Polish <https://weblate.framasoft.org/projects/lufi/\"\n\"default-theme/pl/>\\n\"\n\"Language: pl\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 \"\n\"|| n%100>=20) ? 1 : 2;\\n\"\n\"X-Generator: Weblate 4.18.2\\n\"\n\n#. ($delay)\n#. (max_delay)\n#: themes/default/templates/index.html.ep:56 themes/default/templates/index.html.ep:65 themes/default/templates/index.html.ep:66\nmsgid \"%1 days\"\nmsgstr \"%1 dni\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:2\nmsgid \"%1 invites you to send him/her files\"\nmsgstr \"%1 zaprasza do przesłania jej/jemu plików\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:6\nmsgid \"%1 invites you to send him/her files through Lufi.\"\nmsgstr \"%1 zaprasza do przesłania jej/jemu plików poprzez Lufi.\"\n\n#. (stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:4\nmsgid \"%1 sent you files\"\nmsgstr \"%1 wysłał ci pliki\"\n\n#. (stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:8\nmsgid \"%1 used your invitation to send you files:\"\nmsgstr \"%1 wykorzystał twoje zaproszenie do wysłania plików:\"\n\n#: lib/Lufi/Controller/Invitation.pm:172 lib/Lufi/Controller/Invitation.pm:85 themes/default/templates/invitations/my_invitations.html.ep:51 themes/default/templates/invitations/my_invitations.html.ep:52 themes/default/templates/invitations/my_invitations.html.ep:53 themes/default/templates/invitations/notification_files_sent.mail.ep:12\nmsgid \"%A %d %B %Y at %T\"\nmsgstr \"%A %d %B %Y o %T\"\n\n#: themes/default/templates/partial/index.js.ep:28\nmsgid \"(max size: XXX)\"\nmsgstr \"(maksymalny rozmiar: XXX)\"\n\n#: themes/default/templates/index.html.ep:5\nmsgid \"1 year\"\nmsgstr \"1 rok\"\n\n#: themes/default/templates/index.html.ep:4 themes/default/templates/index.html.ep:65\nmsgid \"24 hours\"\nmsgstr \"24 godziny\"\n\n#: themes/default/templates/partial/mail.js.ep:40\nmsgid \":\"\nmsgstr \":\"\n\n#: themes/default/templates/render.html.ep:42\nmsgid \"Abort\"\nmsgstr \"Anuluj\"\n\n#: themes/default/templates/layouts/default.html.ep:53 themes/default/templates/layouts/default.html.ep:86\nmsgid \"About\"\nmsgstr \"O\"\n\n#: themes/default/templates/index.html.ep:107\nmsgid \"Add a password to file(s)\"\nmsgstr \"Dodaj hasło do pliku(-ów)\"\n\n#: themes/default/templates/mail.html.ep:16\nmsgid \"Adding URLs not related to this Lufi instance to the mail body or subject is prohibited.\"\nmsgstr \"\"\n\"Dodawanie adresów URL nie powiązanych z Lufi do treści wiadomości lub tematu \"\n\"jest zabronione.\"\n\n#: themes/default/templates/partial/invitations.js.ep:3\nmsgid \"Are you sure you want to delete the selected invitations?\"\nmsgstr \"Czy na pewno chcesz usunąć wybrane zaproszenia?\"\n\n#: themes/default/templates/partial/invitations.js.ep:4\nmsgid \"Are you sure you want to resend the invitation mail for the selected invitations?\"\nmsgstr \"\"\n\"Czy na pewno chcesz ponownie wysłać e-mail z zaproszeniem dla wybranych \"\n\"zaproszeń?\"\n\n#: themes/default/templates/about.html.ep:17\nmsgid \"As Lufi is a free software licensed under of the terms of the <a href=\\\"https://gnu.org/licenses/agpl.html\\\" class=\\\"classic\\\">AGPLv3</a>, you can install it on you own server. Have a look on the <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi/wikis/home\\\" class=\\\"classic\\\">Wiki</a> for the procedure.\"\nmsgstr \"\"\n\"Lufi jest wolnym oprogramowaniem licencjonowanym zgodnie z warunkami <a href=\"\n\"\\\"https://gnu.org/licenses/agpl.html\\\" class=\\\"classic\\\">AGPLv3</a>, możesz \"\n\"zainstalować go na własnym serwerze. Zajrzyj na <a href=\\\"https://framagit.\"\n\"org/fiat-tux/hat-softwares/lufi/wikis/home\\\" class=\\\"classic\\\">Wiki</a> po \"\n\"instrukcję.\"\n\n#. (stash('nbslices')\n#: themes/default/templates/partial/render.js.ep:10\nmsgid \"Asking for file part XX1 of %1\"\nmsgstr \"Pytanie o część pliku XX1 z %1\"\n\n#: themes/default/templates/about.html.ep:23\nmsgid \"Back to homepage\"\nmsgstr \"Powrót do strony głównej\"\n\n#: lib/Lufi/Controller/Mail.pm:26\nmsgid \"Bad CSRF token!\"\nmsgstr \"Zły token CSRF!\"\n\n#: lib/Lufi/Controller/Auth.pm:27 lib/Lufi/Controller/Auth.pm:49\nmsgid \"Bad CSRF token.\"\nmsgstr \"Zły token CSRF.\"\n\n#: themes/default/templates/partial/render.js.ep:5\nmsgid \"Click here to refresh the page and restart the download.\"\nmsgstr \"Kliknij tutaj, aby odświeżyć stronę i wznowić pobieranie.\"\n\n#: themes/default/templates/invitations/invite.mail.ep:8\nmsgid \"Click on the following URL to upload files on Lufi:\"\nmsgstr \"Kliknij następujący adres URL, aby przesłać pliki na Lufi:\"\n\n#: themes/default/templates/index.html.ep:126\nmsgid \"Click to open the file browser\"\nmsgstr \"Kliknij, aby otworzyć przeglądarkę plików\"\n\n#: themes/default/templates/delays.html.ep:42 themes/default/templates/invitations/my_invitations.html.ep:80\nmsgid \"Close\"\nmsgstr \"Zamknij\"\n\n#: themes/default/templates/mail.html.ep:23\nmsgid \"Comma-separated email addresses\"\nmsgstr \"Adresy e-mail oddzielone przecinkami\"\n\n#: themes/default/templates/index.html.ep:140\nmsgid \"Compressing zip file…\"\nmsgstr \"Kompresowanie pliku zip…\"\n\n#: themes/default/templates/partial/index.js.ep:15\nmsgid \"Copy all links to clipboard\"\nmsgstr \"Skopiuj wszystkie linki do schowka\"\n\n#: themes/default/templates/partial/index.js.ep:18\nmsgid \"Copy to clipboard\"\nmsgstr \"Kopiuj do schowka\"\n\n#: lib/Lufi/Controller/Files.pm:501\nmsgid \"Could not delete the file. You are not authenticated.\"\nmsgstr \"Nie można usunąć pliku. Nie jesteś uwierzytelniony.\"\n\n#: lib/Lufi/Controller/Files.pm:483\nmsgid \"Could not find the file. Are you sure of the URL and the token?\"\nmsgstr \"Nie można znaleźć pliku. Czy jesteś pewien adresu URL i tokena?\"\n\n#: lib/Lufi/Controller/Files.pm:394\nmsgid \"Could not find the file. Are you sure of the URL?\"\nmsgstr \"Nie można znaleźć pliku. Czy jesteś pewien adresu URL?\"\n\n#: themes/default/templates/files.html.ep:29\nmsgid \"Counter\"\nmsgstr \"Licznik\"\n\n#: themes/default/templates/index.html.ep:100\nmsgid \"Create a zip archive with the files before uploading?\"\nmsgstr \"Utworzyć archiwum zip z plikami przed przesłaniem?\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:26\nmsgid \"Created at\"\nmsgstr \"Utworzono w\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:14\nmsgid \"Delete\"\nmsgstr \"Usunąć\"\n\n#: themes/default/templates/files.html.ep:30 themes/default/templates/index.html.ep:90\nmsgid \"Delete at first download?\"\nmsgstr \"Usunąć po pierwszym pobraniu?\"\n\n#: themes/default/templates/files.html.ep:19\nmsgid \"Delete selected files\"\nmsgstr \"Usuń zaznaczone pliki\"\n\n#: themes/default/templates/files.html.ep:33 themes/default/templates/partial/index.js.ep:19\nmsgid \"Deletion link\"\nmsgstr \"Link do usuwania\"\n\n#: themes/default/templates/delays.html.ep:9\nmsgid \"Don't worry: if a user begins to download the file before the expiration and the download ends after the expiration, he will be able to get the file.\"\nmsgstr \"\"\n\"Bez obaw: jeśli użytkownik rozpocznie pobieranie pliku przed wygaśnięciem, a \"\n\"pobieranie zakończy się po wygaśnięciu, będzie mógł pobrać plik.\"\n\n#: themes/default/templates/partial/index.js.ep:21 themes/default/templates/render.html.ep:28\nmsgid \"Download\"\nmsgstr \"Pobierz\"\n\n#: themes/default/templates/partial/render.js.ep:4\nmsgid \"Download aborted.\"\nmsgstr \"Pobieranie przerwane.\"\n\n#: themes/default/templates/files.html.ep:28 themes/default/templates/partial/index.js.ep:20\nmsgid \"Download link\"\nmsgstr \"Link do pobrania\"\n\n#: themes/default/templates/about.html.ep:10\nmsgid \"Drag and drop files in the appropriate area or use the traditional way to send files and the files will be chunked, encrypted and sent to the server. You will get two links per file: a download link, that you give to the people you want to share the file with and a deletion link, allowing you to delete the file whenever you want.\"\nmsgstr \"\"\n\"Przeciągnij i upuść pliki w odpowiednim obszarze lub użyj tradycyjnego \"\n\"sposobu wysyłania plików, a pliki zostaną podzielone na fragmenty, \"\n\"zaszyfrowane i wysłane na serwer. Otrzymasz dwa linki do każdego pliku: link \"\n\"do pobrania, który udostępnisz osobom, którym chcesz udostępnić plik, oraz \"\n\"link do usunięcia, umożliwiający usunięcie pliku w dowolnym momencie.\"\n\n#: themes/default/templates/index.html.ep:122\nmsgid \"Drop files here\"\nmsgstr \"Upuść pliki tutaj\"\n\n#: themes/default/templates/invitations/invite.html.ep:40\nmsgid \"Email address of your guest\"\nmsgstr \"Adres e-mail gościa\"\n\n#: themes/default/templates/mail.html.ep:39\nmsgid \"Email body\"\nmsgstr \"Treść wiadomości email\"\n\n#: themes/default/templates/mail.html.ep:31\nmsgid \"Email subject\"\nmsgstr \"Temat wiadomości e-mail\"\n\n#: themes/default/templates/mail.html.ep:25 themes/default/templates/mail.html.ep:27\nmsgid \"Emails\"\nmsgstr \"E-maile\"\n\n#: themes/default/templates/partial/index.js.ep:22\nmsgid \"Encrypting part XX1 of XX2\"\nmsgstr \"Szyfrowanie części XX1 z XX2\"\n\n#: lib/Lufi/Controller/Files.pm:283\nmsgid \"Error: the file existed but was deleted.\"\nmsgstr \"Błąd: plik istniał, ale został usunięty.\"\n\n#: lib/Lufi/Controller/Files.pm:363\nmsgid \"Error: the file has not been sent entirely.\"\nmsgstr \"Błąd: plik nie został wysłany w całości.\"\n\n#: lib/Lufi/Controller/Files.pm:373\nmsgid \"Error: unable to find the file. Are you sure of your URL?\"\nmsgstr \"Błąd: nie można znaleźć pliku. Czy jesteś pewien adresu URL?\"\n\n#: themes/default/templates/partial/index.js.ep:23\nmsgid \"Expiration:\"\nmsgstr \"Wygaśnięcie:\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:27\nmsgid \"Expire at\"\nmsgstr \"Wygasa w\"\n\n#: themes/default/templates/files.html.ep:32\nmsgid \"Expires at\"\nmsgstr \"Wygasa z dniem\"\n\n#: themes/default/templates/files.html.ep:12\nmsgid \"Export localStorage data\"\nmsgstr \"Eksportuj dane z localStorage\"\n\n#: lib/Lufi/Controller/Files.pm:465\nmsgid \"File deleted\"\nmsgstr \"Plik usunięty\"\n\n#: themes/default/templates/partial/render.js.ep:9\nmsgid \"File downloaded\"\nmsgstr \"Pobrany plik\"\n\n#: themes/default/templates/files.html.ep:27\nmsgid \"File name\"\nmsgstr \"Nazwa pliku\"\n\n#: themes/default/templates/partial/index.js.ep:24\nmsgid \"File uploaded\"\nmsgstr \"Przesłany plik\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:61\nmsgid \"Files\"\nmsgstr \"Pliki\"\n\n#: themes/default/templates/index.html.ep:80\nmsgid \"Files deleted at first download\"\nmsgstr \"Pliki usunięte po pierwszym pobraniu\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:28\nmsgid \"Files sent at\"\nmsgstr \"Pliki wysłane o\"\n\n#: themes/default/templates/partial/invitations.js.ep:8\nmsgid \"Files sent in invitation XX1 by XX2\"\nmsgstr \"Pliki przesłane w zaproszeniu XX1 przez XX2\"\n\n#: themes/default/templates/partial/render.js.ep:8\nmsgid \"Get the file\"\nmsgstr \"Pobierz plik\"\n\n#: themes/default/templates/about.html.ep:18\nmsgid \"Get the source code on <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi\\\" class=\\\"classic\\\">the official repository</a> or on its <a href=\\\"https://github.com/ldidry/lufi\\\" class=\\\"classic\\\">Github mirror</a>\"\nmsgstr \"\"\n\"Pobierz kod źródłowy z <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/\"\n\"lufi\\\" class=\\\"classic\\\">oficjalnego repozytorium</a> lub z <a href=\\\"https\"\n\"://github.com/ldidry/lufi\\\" class=\\\"classic\\\">Github mirror</a>\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:24\nmsgid \"Guest mail\"\nmsgstr \"Email gościa\"\n\n#. (ucfirst(stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:6\nmsgid \"Hello %1,\"\nmsgstr \"Witaj %1,\"\n\n#: themes/default/templates/invitations/invite.mail.ep:4\nmsgid \"Hello,\"\nmsgstr \"Witaj,\"\n\n#: themes/default/templates/partial/mail.js.ep:35\nmsgid \"Hello,\\\\n\\\\nHere's some files I want to share with you:\\\\n\"\nmsgstr \"\"\n\"Witaj,\\\\n\"\n\"\\\\n\"\n\"Oto kilka plików, którymi chcę się z Tobą podzielić:\\\\n\"\n\n#: themes/default/templates/mail.html.ep:35\nmsgid \"Here's some files\"\nmsgstr \"Oto kilka plików\"\n\n#: themes/default/templates/partial/invitations.js.ep:7\nmsgid \"Hide hidden invitations\"\nmsgstr \"Ukryj ukryte zaproszenia\"\n\n#: themes/default/templates/partial/index.js.ep:26\nmsgid \"Hit Enter, then Ctrl+C to copy all the download links\"\nmsgstr \"\"\n\"Naciśnij Enter, a następnie Ctrl + C, aby skopiować wszystkie linki \"\n\"pobierania\"\n\n#: themes/default/templates/partial/index.js.ep:25\nmsgid \"Hit Enter, then Ctrl+C to copy the download link\"\nmsgstr \"Naciśnij Enter, a następnie Ctrl + C, aby skopiować link pobierania\"\n\n#: themes/default/templates/about.html.ep:9\nmsgid \"How does it work?\"\nmsgstr \"Jak to działa?\"\n\n#: themes/default/templates/invitations/invite.html.ep:46\nmsgid \"How many days would you like the invitation to be valid?\"\nmsgstr \"Ile dni chcesz, aby zaproszenie było ważne?\"\n\n#: themes/default/templates/about.html.ep:16\nmsgid \"How to install the software on my server?\"\nmsgstr \"Jak zainstalować oprogramowanie na moim serwerze?\"\n\n#: themes/default/templates/about.html.ep:12\nmsgid \"How to report an illegal file?\"\nmsgstr \"Jak zgłosić nielegalny plik?\"\n\n#: themes/default/templates/delays.html.ep:8\nmsgid \"If you choose a delay, the file will be deleted after that delay.\"\nmsgstr \"Jeśli wybierzesz opóźnienie, plik zostanie usunięty po tym opóźnieniu.\"\n\n#: themes/default/templates/mail.html.ep:15\nmsgid \"If you send the mail from this server, the links will be sent to the server, which may lower your privacy protection.\"\nmsgstr \"\"\n\"Jeśli wyślesz e-mail z tego serwera, linki zostaną wysłane na serwer, co \"\n\"może obniżyć ochronę Twojej prywatności.\"\n\n#: themes/default/templates/files.html.ep:14\nmsgid \"Import localStorage data\"\nmsgstr \"Importuj dane z localStorage\"\n\n#: themes/default/templates/index.html.ep:53\nmsgid \"Important: more information on delays\"\nmsgstr \"Ważne: więcej informacji o opóźnieniach\"\n\n#: themes/default/templates/delays.html.ep:5\nmsgid \"Information about delays\"\nmsgstr \"Informacje o opóźnieniach\"\n\n#: themes/default/templates/files.html.ep:18 themes/default/templates/invitations/my_invitations.html.ep:12\nmsgid \"Invert selection\"\nmsgstr \"Odwróć wybór\"\n\n#. ($i->guest_mail, $url)\n#: lib/Lufi/Controller/Invitation.pm:184\nmsgid \"Invitation resent to %1.<br> URL: %2\"\nmsgstr \"Zaproszenie ponownie wysłane do %1.<br> URL: %2\"\n\n#. ($invitation->guest_mail, $url)\n#: lib/Lufi/Controller/Invitation.pm:88\nmsgid \"Invitation sent to %1.<br> URL: %2\"\nmsgstr \"Zaproszenie wysłane do %1.<br> URL: %2\"\n\n#: themes/default/templates/invitations/invite.html.ep:27 themes/default/templates/layouts/default.html.ep:36 themes/default/templates/layouts/default.html.ep:69\nmsgid \"Invite a guest\"\nmsgstr \"Zaproś gościa\"\n\n#: themes/default/templates/partial/render.js.ep:6\nmsgid \"It seems that the key in your URL is incorrect. Please, verify your URL.\"\nmsgstr \"\"\n\"Wygląda na to, że klucz w adresie URL jest nieprawidłowy. Zweryfikuj swój \"\n\"adres URL.\"\n\n#: themes/default/templates/index.html.ep:12\nmsgid \"Javascript is disabled. You won't be able to use Lufi.\"\nmsgstr \"JavaScript jest wyłączony. Nie będziesz mógł używać Lufi.\"\n\n#: themes/default/templates/layouts/default.html.ep:44 themes/default/templates/layouts/default.html.ep:46 themes/default/templates/layouts/default.html.ep:77 themes/default/templates/layouts/default.html.ep:79\nmsgid \"Language\"\nmsgstr \"Język\"\n\n#. (sprintf('<a href=\"https://framagit.org/fiat-tux/hat-softwares/lufi/-/commit/%s\" class=\"classic\">%s</a>', stash('version')\n#: themes/default/templates/about.html.ep:22\nmsgid \"Latest commit of this instance: %1\"\nmsgstr \"Ostatnie zatwierdzenie tej instancji: %1\"\n\n#. (sprintf('<a href=\"https://framagit.org/fiat-tux/hat-softwares/lufi/-/releases/%s\" class=\"classic\">%s</a>', stash('version')\n#: themes/default/templates/about.html.ep:21\nmsgid \"Latest tag of this instance: %1\"\nmsgstr \"Najnowszy tag tej instancji: %1\"\n\n#: themes/default/templates/login.html.ep:15\nmsgid \"Login\"\nmsgstr \"Logowanie\"\n\n#: themes/default/templates/layouts/default.html.ep:58 themes/default/templates/layouts/default.html.ep:91\nmsgid \"Logout\"\nmsgstr \"Wyloguj\"\n\n#: themes/default/templates/about.html.ep:4\nmsgid \"Lufi is a free (as in free speech) file hosting software.\"\nmsgstr \"\"\n\"Lufi to darmowe (podobnie jak w przypadku wolności słowa) oprogramowanie do \"\n\"hostingu plików.\"\n\n#: themes/default/templates/partial/files.js.ep:12\nmsgid \"Lufi recently changed its way to store files information.\\\\n\\\\nNo files have been found in the new localStorage location but we found files in the old one.\\\\nDo you want to import those informations?\\\\n\\\\nPlease note that this is the only time that we will ask you this.\"\nmsgstr \"\"\n\"Lufi niedawno zmieniła sposób przechowywania informacji o plikach.\\\\n\"\n\"\\\\n\"\n\"W nowej lokalizacji localStorage nie znaleziono żadnych plików, ale \"\n\"znaleźliśmy pliki w starej.\\\\n\"\n\"Czy chcesz zaimportować te informacje?\\\\n\"\n\"\\\\n\"\n\"Pamiętaj, że jest to jedyny raz, kiedy o to poprosimy.\"\n\n#: themes/default/templates/files.html.ep:34\nmsgid \"Mail\"\nmsgstr \"E-mail\"\n\n#: themes/default/templates/files.html.ep:3 themes/default/templates/layouts/default.html.ep:34 themes/default/templates/layouts/default.html.ep:67\nmsgid \"My files\"\nmsgstr \"Moje pliki\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:5 themes/default/templates/layouts/default.html.ep:37 themes/default/templates/layouts/default.html.ep:70\nmsgid \"My invitations\"\nmsgstr \"Moje zaproszenia\"\n\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:17\nmsgid \"NB: this list includes the list of files that have already been sent to you.\"\nmsgstr \"\"\n\"Uwaga: ta lista zawiera listę plików, które zostały już do Ciebie wysłane.\"\n\n#: themes/default/templates/index.html.ep:115\nmsgid \"Name of the zip file\"\nmsgstr \"Nazwa pliku zip\"\n\n#. (format_bytes($json->{size})\n#: lib/Lufi/Controller/Files.pm:109\nmsgid \"No enough space available on the server for this file (size: %1).\"\nmsgstr \"\"\n\"Brak wystarczającej ilości miejsca na serwerze dla tego pliku (wielkość \"\n\"pliku: %1).\"\n\n#: themes/default/templates/partial/files.js.ep:10 themes/default/templates/partial/index.js.ep:29\nmsgid \"No expiration delay\"\nmsgstr \"Brak opóźnienia wygaśnięcia\"\n\n#: themes/default/templates/files.html.ep:8\nmsgid \"Only the files sent with this browser will be listed here. This list is stored in localStorage: if you delete your localStorage data, you'll lose this list.\"\nmsgstr \"\"\n\"Tutaj zostaną wyświetlone tylko pliki przesłane za pomocą tej przeglądarki. \"\n\"Ta lista jest przechowywana w localStorage: jeśli usuniesz swoje dane \"\n\"localStorage, utracisz tę listę.\"\n\n#: themes/default/templates/index.html.ep:106 themes/default/templates/login.html.ep:21 themes/default/templates/render.html.ep:26\nmsgid \"Password\"\nmsgstr \"Hasło\"\n\n#. (config('contact')\n#: themes/default/templates/about.html.ep:13\nmsgid \"Please contact the administrator: %1\"\nmsgstr \"Skontaktuj się z administratorem: %1\"\n\n#: themes/default/templates/render.html.ep:33\nmsgid \"Please wait while we are getting your file. We first need to download and decrypt all parts before you can get it.\"\nmsgstr \"\"\n\"Proszę czekać, pobieramy Twój plik. Najpierw musimy pobrać i odszyfrować \"\n\"wszystkie części, zanim będzie można je pobrać.\"\n\n#: lib/Lufi/Controller/Auth.pm:38\nmsgid \"Please, check your credentials or your right to access this service: unable to authenticate.\"\nmsgstr \"\"\n\"Sprawdź swoje dane uwierzytelniające lub prawo dostępu do tej usługi: nie \"\n\"można uwierzytelnić.\"\n\n#: themes/default/templates/about.html.ep:5\nmsgid \"Privacy\"\nmsgstr \"Prywatność\"\n\n#: themes/default/templates/files.html.ep:13\nmsgid \"Purge expired files from localStorage\"\nmsgstr \"Wyczyść wygasłe pliki z localStorage\"\n\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:20\nmsgid \"Regards,\"\nmsgstr \"Pozdrowienia,\"\n\n#: themes/default/templates/invitations/invite.mail.ep:15\nmsgid \"Regards.\"\nmsgstr \"Pozdrowienia.\"\n\n#: themes/default/templates/layouts/default.html.ep:31 themes/default/templates/layouts/default.html.ep:64\nmsgid \"Report file\"\nmsgstr \"Plik raportu\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:15\nmsgid \"Resend invitation mail\"\nmsgstr \"Wyślij ponownie e-mail z zaproszeniem\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:9\nmsgid \"Rows in purple mean that the invitations have expired.\"\nmsgstr \"Wiersze w kolorze fioletowym oznaczają, że zaproszenia wygasły.\"\n\n#: themes/default/templates/files.html.ep:9\nmsgid \"Rows in red mean that the files have expired and are no longer available.\"\nmsgstr \"\"\n\"Wiersze w kolorze czerwonym oznaczają, że pliki straciły ważność i nie są \"\n\"już dostępne.\"\n\n#: themes/default/templates/partial/index.js.ep:27\nmsgid \"Send all links by email\"\nmsgstr \"Wyślij wszystkie linki e-mailem\"\n\n#: themes/default/templates/invitations/invite.html.ep:50\nmsgid \"Send the invitation\"\nmsgstr \"Wyślij zaproszenie\"\n\n#: themes/default/templates/mail.html.ep:47\nmsgid \"Send with this server\"\nmsgstr \"Wyślij za pomocą tego serwera\"\n\n#: themes/default/templates/mail.html.ep:49\nmsgid \"Send with your own mail software\"\nmsgstr \"Wysyłaj za pomocą własnego oprogramowania pocztowego\"\n\n#: themes/default/templates/partial/index.js.ep:30\nmsgid \"Sending part XX1 of XX2. Please, be patient, the progress bar can take a while to move.\"\nmsgstr \"\"\n\"Wysyłanie części XX1 z XX2. Prosimy o cierpliwość, zmiana paska postępu może \"\n\"trochę potrwać.\"\n\n#. (url_for('/')\n#: themes/default/templates/partial/mail.js.ep:49\nmsgid \"Share your files in total privacy on %1\"\nmsgstr \"Udostępnij swoje pliki całkowicie prywatnie na %1\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:13 themes/default/templates/partial/invitations.js.ep:9\nmsgid \"Show hidden invitations\"\nmsgstr \"Pokaż ukryte zaproszenia\"\n\n#: themes/default/templates/partial/render.js.ep:12\nmsgid \"Show zip content\"\nmsgstr \"Pokaż zawartość ZIP\"\n\n#: themes/default/templates/layouts/default.html.ep:40 themes/default/templates/layouts/default.html.ep:73 themes/default/templates/login.html.ep:28 themes/default/templates/logout.html.ep:17\nmsgid \"Signin\"\nmsgstr \"Zaloguj\"\n\n#: lib/Lufi/Controller/Invitation.pm:302 themes/default/templates/invitations/exception.html.ep:16\nmsgid \"Sorry, the invitation doesn’t exist. Are you sure you are on the right URL?\"\nmsgstr \"\"\n\"Przepraszamy, zaproszenie nie istnieje. Czy na pewno użyłeś właściwego \"\n\"adresu URL?\"\n\n#: themes/default/templates/index.html.ep:46\nmsgid \"Sorry, the uploading is currently disabled. Please try again later.\"\nmsgstr \"\"\n\"Przepraszamy, przesyłanie jest obecnie wyłączone. Spróbuj ponownie później.\"\n\n#: lib/Lufi/Controller/Files.pm:82\nmsgid \"Sorry, uploading is disabled.\"\nmsgstr \"Przepraszamy, przesyłanie jest wyłączone.\"\n\n#: themes/default/templates/invitations/exception.html.ep:7\nmsgid \"Sorry, your invitation has expired or has been deleted.\"\nmsgstr \"Przepraszamy, Twoje zaproszenie wygasło lub zostało usunięte.\"\n\n#. ($invit->ldap_user_mail)\n#: lib/Lufi/Controller/Files.pm:123\nmsgid \"Sorry, your invitation has expired or has been deleted. Please contact %1 to have another invitation.\"\nmsgstr \"\"\n\"Przepraszamy, Twoje zaproszenie wygasło lub zostało usunięte. Skontaktuj się \"\n\"z %1, aby otrzymać kolejne zaproszenie.\"\n\n#. ($invitation->ldap_user_mail)\n#: lib/Lufi/Controller/Invitation.pm:295\nmsgid \"The URLs of your files have been sent by email to %1.\"\nmsgstr \"Adresy URL Twoich plików zostały wysłane e-mailem na adres %1.\"\n\n#: themes/default/templates/about.html.ep:7\nmsgid \"The administrator can only see the file's name, its size and its mimetype (what kind of file it is: video, text, etc.).\"\nmsgstr \"\"\n\"Administrator widzi tylko nazwę pliku, jego rozmiar i typ MIME (jaki to plik:\"\n\" wideo, tekst itp.).\"\n\n#: lib/Lufi/Controller/Mail.pm:67\nmsgid \"The body of the mail must contain at least one URL pointing to a file hosted on this instance.\"\nmsgstr \"\"\n\"Treść wiadomości musi zawierać co najmniej jeden adres URL wskazujący plik \"\n\"hostowany w tej instancji.\"\n\n#: themes/default/templates/partial/files.js.ep:11\nmsgid \"The data has been successfully imported.\"\nmsgstr \"Dane zostały pomyślnie zaimportowane.\"\n\n#: lib/Lufi/Controller/Mail.pm:87\nmsgid \"The email body can't be empty.\"\nmsgstr \"Treść e-maila nie może być pusta.\"\n\n#: lib/Lufi/Controller/Mail.pm:86\nmsgid \"The email subject can't be empty.\"\nmsgstr \"Temat e-maila nie może być pusty.\"\n\n#. ($expire_at, $max_expire_at)\n#: lib/Lufi/Controller/Invitation.pm:52\nmsgid \"The expiration delay (%1) is not between 1 and %2 days.\"\nmsgstr \"Opóźnienie wygaśnięcia (%1) nie mieści się w przedziale od 1 do %2 dni.\"\n\n#: lib/Lufi/Controller/Files.pm:462\nmsgid \"The file has already been deleted\"\nmsgstr \"Plik został już usunięty\"\n\n#: themes/default/templates/about.html.ep:6\nmsgid \"The files uploaded on a Lufi instance are encrypted before the upload to the server: the administrator of the server can not see the file's content.\"\nmsgstr \"\"\n\"Pliki przesyłane na Lufi są szyfrowane przed przesłaniem na serwer: \"\n\"administrator serwera nie może zobaczyć zawartości pliku.\"\n\n#. (join(', ', @bad)\n#: lib/Lufi/Controller/Mail.pm:82\nmsgid \"The following email addresses are not valid: %1\"\nmsgstr \"Następujące adresy e-mail są nieprawidłowe: %1\"\n\n#. ($guest_mail)\n#: lib/Lufi/Controller/Invitation.pm:49\nmsgid \"The guest email address (%1) is unvalid.\"\nmsgstr \"Adres e-mail gościa (%1) jest nieprawidłowy.\"\n\n#. ($i->token, $c->current_user->{username})\n#: lib/Lufi/Controller/Invitation.pm:136\nmsgid \"The invitation %1 can’t be deleted: it wasn’t created by you (%2).\"\nmsgstr \"\"\n\"Zaproszenie %1 nie może zostać usunięte: nie zostało utworzone przez Ciebie \"\n\"(%2).\"\n\n#. ($i->token, $i->guest_mail)\n#: lib/Lufi/Controller/Invitation.pm:163\nmsgid \"The invitation %1 can’t be resent: %2 has already sent files.<br>Please create a new invitation.\"\nmsgstr \"\"\n\"Zaproszenia %1 nie można wysłać ponownie: %2 wysłał już pliki.<br>Utwórz \"\n\"nowe zaproszenie.\"\n\n#. ($i->token, $c->current_user->{username})\n#: lib/Lufi/Controller/Invitation.pm:187\nmsgid \"The invitation %1 can’t be resent: it wasn’t created by you (%2).\"\nmsgstr \"\"\n\"Zaproszenia %1 nie można wysłać ponownie: nie zostało utworzone przez Ciebie \"\n\"(%2).\"\n\n#. ($i->token)\n#: lib/Lufi/Controller/Invitation.pm:134\nmsgid \"The invitation %1 has been deleted.\"\nmsgstr \"Zaproszenie %1 zostało usunięte.\"\n\n#. (stash('user_mail')\n#: themes/default/templates/invitations/invite.html.ep:34\nmsgid \"The invitation mail will be send from your email address (%1).\"\nmsgstr \"Wiadomość z zaproszeniem zostanie wysłana z Twojego adresu e-mail (%1).\"\n\n#: themes/default/templates/partial/index.js.ep:16\nmsgid \"The link(s) has been copied to your clipboard\"\nmsgstr \"Linki zostały skopiowane do schowka\"\n\n#. (stash('invitation')\n#: themes/default/templates/index.html.ep:30\nmsgid \"The link(s) of your file(s) will automatically be sent by mail to %1 (%2)\"\nmsgstr \"\"\n\"Linki do twoich plików zostaną automatycznie wysłane pocztą na adres %1 (%2)\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:11\nmsgid \"The links of your file(s) will automatically be sent by mail to %1.\"\nmsgstr \"\"\n\"Linki do Twoich plików zostaną automatycznie wysłane pocztą na adres %1.\"\n\n#: lib/Lufi/Controller/Mail.pm:111\nmsgid \"The mail has been sent.\"\nmsgstr \"E-mail został wysłany.\"\n\n#: themes/default/templates/about.html.ep:15\nmsgid \"The original (and only for now) author is <a href=\\\"https://fiat-tux.fr\\\" class=\\\"classic\\\">Luc Didry</a>.\"\nmsgstr \"\"\n\"Oryginalnym (i tylko na razie) autorem jest <a href=\\\"https://fiat-tux.fr\\\" \"\n\"class=\\\"classic\\\">Luc Didry</a>.\"\n\n#: lib/Lufi/Controller/Files.pm:230\nmsgid \"The server was unable to find the file record to add your file part to. Please, contact the administrator.\"\nmsgstr \"\"\n\"Serwer nie mógł znaleźć rekordu pliku, do którego można dodać część pliku. \"\n\"Prosimy o kontakt z administratorem.\"\n\n#: lib/Lufi/Controller/Files.pm:289\nmsgid \"This file has been deactivated by the admins. Contact them to know why.\"\nmsgstr \"\"\n\"Ten plik został dezaktywowany przez administratorów. Skontaktuj się z nimi, \"\n\"aby dowiedzieć się dlaczego.\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:46 themes/default/templates/partial/invitations.js.ep:6\nmsgid \"This invitation is normally hidden\"\nmsgstr \"To zaproszenie jest zwykle ukryte\"\n\n#. (stash('expires')\n#: themes/default/templates/invitations/invite.mail.ep:13\nmsgid \"This invitation is valid until %1.\"\nmsgstr \"To zaproszenie jest ważne do %1.\"\n\n#: themes/default/templates/delays.html.ep:13\nmsgid \"This server sets limitations according to the file size. The expiration delay of your file will be the minimum between what you choose and the following limitations:\"\nmsgstr \"\"\n\"Ten serwer ustawia ograniczenia w zależności od rozmiaru pliku. Opóźnienie \"\n\"wygaśnięcia Twojego pliku będzie stanowić minimum między tym, co wybierzesz, \"\n\"a następującymi ograniczeniami:\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:16\nmsgid \"Toggle visibility\"\nmsgstr \"Przełączanie widoczności\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:25\nmsgid \"URL\"\nmsgstr \"URL\"\n\n#: themes/default/templates/partial/index.js.ep:17\nmsgid \"Unable to copy the link(s) to your clipboard\"\nmsgstr \"Nie można skopiować linków do schowka\"\n\n#: themes/default/templates/partial/render.js.ep:13\nmsgid \"Unable to download the file: too much unsuccessful attempts to open a websocket. Please, contact the administrator.\"\nmsgstr \"\"\n\"Nie można pobrać pliku: zbyt wiele nieudanych prób otwarcia połączenia \"\n\"sieciowego. Prosimy o kontakt z administratorem.\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:433\nmsgid \"Unable to get counter for %1. The file does not exists. It will be removed from your localStorage.\"\nmsgstr \"\"\n\"Nie można pobrać stanu licznika dla %1. Plik nie istnieje. Zostanie usunięty \"\n\"z twojego localStorage.\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:423\nmsgid \"Unable to get counter for %1. The token is invalid.\"\nmsgstr \"Nie można pobrać stanu licznika dla %1. Token jest nieprawidłowy.\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:443\nmsgid \"Unable to get counter for %1. You are not authenticated.\"\nmsgstr \"Nie można pobrać stanu licznika dla %1. Nie jesteś uwierzytelniony.\"\n\n#: themes/default/templates/layouts/default.html.ep:33 themes/default/templates/layouts/default.html.ep:66\nmsgid \"Upload files\"\nmsgstr \"Prześlij pliki\"\n\n#: themes/default/templates/index.html.ep:145\nmsgid \"Upload generated zip file\"\nmsgstr \"Prześlij wygenerowany plik ZIP\"\n\n#: themes/default/templates/files.html.ep:31\nmsgid \"Uploaded at\"\nmsgstr \"Przesłane o\"\n\n#: themes/default/templates/index.html.ep:153\nmsgid \"Uploaded files\"\nmsgstr \"Przesłane pliki\"\n\n#: themes/default/templates/about.html.ep:20\nmsgid \"Version\"\nmsgstr \"Wersja\"\n\n#: themes/default/templates/partial/index.js.ep:31\nmsgid \"Websocket communication error\"\nmsgstr \"Błąd komunikacji WebSocket\"\n\n#: themes/default/templates/about.html.ep:3\nmsgid \"What is Lufi?\"\nmsgstr \"Co to jest Lufi?\"\n\n#: themes/default/templates/about.html.ep:14\nmsgid \"Who wrote this software?\"\nmsgstr \"Kto napisał to oprogramowanie?\"\n\n#: themes/default/templates/partial/index.js.ep:13\nmsgid \"XXX file has been added to upload queue.\"\nmsgstr \"Plik XXX został dodany do kolejki przesyłania.\"\n\n#: themes/default/templates/invitations/invite.html.ep:30\nmsgid \"You can invite someone to send you files through this Lufi instance even if they don’t have an account on it.\"\nmsgstr \"\"\n\"Możesz zaprosić kogoś do przesłania Ci plików przez tę Lufi, nawet jeśli ta \"\n\"osoba nie ma na niej konta.\"\n\n#: themes/default/templates/about.html.ep:11\nmsgid \"You can see the list of your files by clicking on the \\\"My files\\\" link at the top right of this page.\"\nmsgstr \"\"\n\"Możesz zobaczyć listę swoich plików, klikając link „Moje pliki” w prawym \"\n\"górnym rogu tej strony.\"\n\n#. ($orig_uri)\n#: lib/Lufi/Controller/Mail.pm:43 lib/Lufi/Controller/Mail.pm:59\nmsgid \"You can't add URLs that are not related to this instance (%1).\"\nmsgstr \"Nie możesz dodawać adresów URL, które nie są powiązane z tym Lufi (%1).\"\n\n#: themes/default/templates/about.html.ep:8\nmsgid \"You don't need to register yourself to upload files but be aware that, for legal reasons, your IP address will be stored when you send a file. Don't panic, this is normally the case for all sites on which you send files.\"\nmsgstr \"\"\n\"Nie musisz się rejestrować, aby przesyłać pliki, ale pamiętaj, że ze \"\n\"względów prawnych Twój adres IP zostanie zapisany podczas wysyłania pliku. \"\n\"Nie panikuj, zwykle dotyczy to wszystkich witryn, do których wysyłasz pliki.\"\n\n#: themes/default/templates/partial/render.js.ep:11\nmsgid \"You don't seem to have a key in your URL. You won't be able to decrypt the file. Download canceled.\"\nmsgstr \"\"\n\"Wygląda na to, że nie masz klucza w adresie URL. Nie będzie można \"\n\"odszyfrować pliku. Pobieranie anulowane.\"\n\n#: themes/default/templates/partial/render.js.ep:7\nmsgid \"You have attempted to leave this page. The download will be canceled. Are you sure?\"\nmsgstr \"\"\n\"Próbowałeś opuścić tę stronę. Pobieranie zostanie anulowane. Jesteś pewny?\"\n\n#: themes/default/templates/partial/index.js.ep:14\nmsgid \"You have attempted to leave this page. The upload will be canceled. Are you sure?\"\nmsgstr \"\"\n\"Próbowałeś opuścić tę stronę. Przesyłanie zostanie anulowane. Jesteś pewny?\"\n\n#: themes/default/templates/logout.html.ep:14\nmsgid \"You have been successfully logged out.\"\nmsgstr \"Wylogowałeś się poprawnie.\"\n\n#: lib/Lufi/Controller/Mail.pm:85\nmsgid \"You must give email addresses.\"\nmsgstr \"Musisz podać adresy e-mail.\"\n\n#: themes/default/templates/index.html.ep:38\nmsgid \"Your browser does not have enough entropy to generate a strong encryption key. Please wait (it's better if you do things on your computer while waiting).\"\nmsgstr \"\"\n\"Twoja przeglądarka nie ma wystarczającej entropii, aby wygenerować silny \"\n\"klucz szyfrujący. Proszę czekać (lepiej będzie jak zajmiesz się innymi \"\n\"rzeczami na komputerze podczas oczekiwania).\"\n\n#. (format_bytes($json->{size})\n#: lib/Lufi/Controller/Files.pm:95\nmsgid \"Your file is too big: %1 (maximum size allowed: %2)\"\nmsgstr \"Twój plik jest za duży: %1 (maksymalny dozwolony rozmiar: %2)\"\n\n#: lib/Lufi/Controller/Files.pm:345\nmsgid \"Your password is not valid. Please refresh the page to retry.\"\nmsgstr \"Twoje hasło jest nieprawidłowe. Odśwież stronę, aby spróbować ponownie.\"\n\n#: themes/default/templates/partial/render.js.ep:14\nmsgid \"Zip content:\"\nmsgstr \"Zawartość ZIP-a:\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:24\nmsgid \"between %1 and %2, the file will be kept %3 day(s).\"\nmsgstr \"między %1 a %2, plik będzie przechowywany przez %3 dni.\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:26\nmsgid \"between %1 and %2, the file will be kept forever.\"\nmsgstr \"między %1 a %2, plik będzie przechowywany na zawsze.\"\n\n#: themes/default/templates/partial/mail.js.ep:42\nmsgid \"deadline: \"\nmsgstr \"termin ostateczny: \"\n\n#: themes/default/templates/partial/invitations.js.ep:5\nmsgid \"expires on XXX\"\nmsgstr \"wygasa XXX\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:30\nmsgid \"for %1 and more, the file will be kept %2 day(s)\"\nmsgstr \"dla %1 i więcej, plik będzie przechowywany przez %2 dni\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:32\nmsgid \"for %1 and more, the file will be kept forever.\"\nmsgstr \"dla %1 i więcej plik będzie przechowywany na zawsze.\"\n\n#: themes/default/templates/index.html.ep:3\nmsgid \"no time limit\"\nmsgstr \"bez limitu czasu\"\n\n#: themes/default/templates/index.html.ep:124\nmsgid \"or\"\nmsgstr \"lub\"\n\n#. ($e->{name}, format_bytes($e->{size})\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:12\nmsgid \"— %1 (%2), that will expire on %3\"\nmsgstr \"— %1 (%2), który wygaśnie %3\"\n\n#:\nmsgid \"You can't add URLs that are not related to this instance.\"\nmsgstr \"Nie możesz dodawać adresów URL, które nie są powiązane z tym Lufi.\"\n"
  },
  {
    "path": "themes/default/lib/Lufi/I18N/pt.po",
    "content": "# Lufi PT translation\n# Copyright (C) 2015 Luc Didry\n# This file is distributed under the same license as the Lufi package.\n# Luc Didry <luc@didry.org>, 2015.\n# Jéssica Da Cunha <dacunhajessica@hotmail.com>, 2017.\n# Luc Didry <luc@framasoft.org>, 2018. #zanata\n# Luc Didry <luc@framasoft.org>, 2019. #zanata\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\\n\"\n\"PO-Revision-Date: 2022-01-03 21:23+0000\\n\"\n\"Last-Translator: Jorge Paulo Malveira Pimentel Dos Santos <jpmpds@yahoo.fr>\\n\"\n\"Language-Team: Portuguese <https://weblate.framasoft.org/projects/lufi/\"\n\"default-theme/pt/>\\n\"\n\"Language: pt\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=n > 1;\\n\"\n\"X-Generator: Weblate 4.10\\n\"\n\n#. ($delay)\n#. (max_delay)\n#: themes/default/templates/index.html.ep:56 themes/default/templates/index.html.ep:65 themes/default/templates/index.html.ep:66\nmsgid \"%1 days\"\nmsgstr \"%1 dias\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:2\nmsgid \"%1 invites you to send him/her files\"\nmsgstr \"%1 convida você a enviar arquivos para ele\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:6\nmsgid \"%1 invites you to send him/her files through Lufi.\"\nmsgstr \"%1convida você a enviar arquivos para ele via Lufi.\"\n\n#. (stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:4\nmsgid \"%1 sent you files\"\nmsgstr \"enviou arquivos para você\"\n\n#. (stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:8\nmsgid \"%1 used your invitation to send you files:\"\nmsgstr \"%1 usou seu convite para enviar arquivos a você:\"\n\n#: lib/Lufi/Controller/Invitation.pm:159 lib/Lufi/Controller/Invitation.pm:84 themes/default/templates/invitations/my_invitations.html.ep:51 themes/default/templates/invitations/my_invitations.html.ep:52 themes/default/templates/invitations/my_invitations.html.ep:53 themes/default/templates/invitations/notification_files_sent.mail.ep:12\nmsgid \"%A %d %B %Y at %T\"\nmsgstr \"%A %d %B %Y à %T\"\n\n#: themes/default/templates/partial/index.js.ep:27\nmsgid \"(max size: XXX)\"\nmsgstr \"(tamanho máximo: XXX)\"\n\n#: themes/default/templates/index.html.ep:5\nmsgid \"1 year\"\nmsgstr \"1 ano\"\n\n#: themes/default/templates/index.html.ep:4 themes/default/templates/index.html.ep:65\nmsgid \"24 hours\"\nmsgstr \"24 horas\"\n\n#: themes/default/templates/partial/mail.js.ep:40\nmsgid \":\"\nmsgstr \" :\"\n\n#: themes/default/templates/render.html.ep:42\nmsgid \"Abort\"\nmsgstr \"Interromper\"\n\n#: themes/default/templates/layouts/default.html.ep:53 themes/default/templates/layouts/default.html.ep:86\nmsgid \"About\"\nmsgstr \"Sobre\"\n\n#: themes/default/templates/index.html.ep:107\nmsgid \"Add a password to file(s)\"\nmsgstr \"Adicione uma palavra-passe ao (s) arquivo (s)\"\n\n#: themes/default/templates/mail.html.ep:16\nmsgid \"\"\n\"Adding URLs not related to this Lufi instance to the mail body or subject is \"\n\"prohibited.\"\nmsgstr \"\"\n\"Adicionar URLs não relacionados a esta instância Lufi ao corpo ou assunto do \"\n\"e-mail é proibido.\"\n\n#: themes/default/templates/partial/invitations.js.ep:3\nmsgid \"Are you sure you want to delete the selected invitations?\"\nmsgstr \"Tem certeza de que deseja excluir os convites selecionados?\"\n\n#: themes/default/templates/partial/invitations.js.ep:4\nmsgid \"\"\n\"Are you sure you want to resend the invitation mail for the selected \"\n\"invitations?\"\nmsgstr \"\"\n\"Tem certeza de que deseja reenviar o e-mail de convite para os convites \"\n\"selecionados?\"\n\n#: themes/default/templates/about.html.ep:17\nmsgid \"\"\n\"As Lufi is a free software licensed under of the terms of the <a href=\"\n\"\\\"https://gnu.org/licenses/agpl.html\\\" class=\\\"classic\\\">AGPLv3</a>, you can \"\n\"install it on you own server. Have a look on the <a href=\\\"https://framagit.\"\n\"org/luc/lufi/wikis/home\\\" class=\\\"classic\\\">Wiki</a> for the procedure.\"\nmsgstr \"\"\n\"Como Lufi é um programa livre sob os termos da licença <a href=\\\"https://gnu.\"\n\"org/licenses/agpl.html\\\" class=\\\"classic\\\">AGPLv3</a>, pode instalar-lo no \"\n\"seu prórpio servidor. Para saber mais clique aqui <a href=\\\"https://framagit.\"\n\"org/luc/lufi/wikis/home\\\" class=\\\"classic\\\">Wiki</a> para ver o procedimento.\"\n\"\"\n\n#. (stash('nbslices')\n#: themes/default/templates/partial/render.js.ep:9\nmsgid \"Asking for file part XX1 of %1\"\nmsgstr \"Pedido de recuperação de um fragmento do ficheiro XX1 de %1\"\n\n#: themes/default/templates/about.html.ep:20\nmsgid \"Back to homepage\"\nmsgstr \"Voltar à página inicial\"\n\n#: lib/Lufi/Controller/Mail.pm:25\nmsgid \"Bad CSRF token!\"\nmsgstr \"Símbolo errado CSRF !\"\n\n#: lib/Lufi/Controller/Auth.pm:27 lib/Lufi/Controller/Auth.pm:49\nmsgid \"Bad CSRF token.\"\nmsgstr \"Token CSRF inválido.\"\n\n#: themes/default/templates/partial/render.js.ep:5\nmsgid \"Click here to refresh the page and restart the download.\"\nmsgstr \"Clique aqui para atualizar a página e começar o download.\"\n\n#: themes/default/templates/invitations/invite.mail.ep:8\nmsgid \"Click on the following URL to upload files on Lufi:\"\nmsgstr \"Clique no seguinte URL para enviar arquivos para a Lufi:\"\n\n#: themes/default/templates/index.html.ep:126\nmsgid \"Click to open the file browser\"\nmsgstr \"Clique para abrir o navegador de ficheiros\"\n\n#: themes/default/templates/delays.html.ep:38 themes/default/templates/invitations/my_invitations.html.ep:80\nmsgid \"Close\"\nmsgstr \"Fechar\"\n\n#: themes/default/templates/mail.html.ep:23\nmsgid \"Comma-separated email addresses\"\nmsgstr \"Os e-mails devem ser separados por vírgulas\"\n\n#: themes/default/templates/index.html.ep:140\nmsgid \"Compressing zip file…\"\nmsgstr \"A compactar o arquivo zip …\"\n\n#: themes/default/templates/partial/index.js.ep:15\nmsgid \"Copy all links to clipboard\"\nmsgstr \"Copiar todos os links para a área de transferência\"\n\n#: themes/default/templates/partial/index.js.ep:18\nmsgid \"Copy to clipboard\"\nmsgstr \"Copiar para a área de transferência\"\n\n#: lib/Lufi/Controller/Files.pm:507\nmsgid \"Could not delete the file. You are not authenticated.\"\nmsgstr \"Impossível apagar o ficheiro. Não está conectado.\"\n\n#: lib/Lufi/Controller/Files.pm:489\nmsgid \"Could not find the file. Are you sure of the URL and the token?\"\nmsgstr \"\"\n\"Impossível encontrar o ficheiro.Tem a certeza que o URL e os símbolos estão \"\n\"corretos?\"\n\n#: lib/Lufi/Controller/Files.pm:400\nmsgid \"Could not find the file. Are you sure of the URL?\"\nmsgstr \"\"\n\"Impossível encontar o ficheiro. Tem a certeza de que o URL está correto?\"\n\n#: themes/default/templates/files.html.ep:29\nmsgid \"Counter\"\nmsgstr \"Contador\"\n\n#: themes/default/templates/index.html.ep:100\nmsgid \"Create a zip archive with the files before uploading?\"\nmsgstr \"Criar um arquivo zip, antes de enviar os arquivos ?\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:26\nmsgid \"Created at\"\nmsgstr \"Criado em\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:14\nmsgid \"Delete\"\nmsgstr \"Remover\"\n\n#: themes/default/templates/files.html.ep:30 themes/default/templates/index.html.ep:90\nmsgid \"Delete at first download?\"\nmsgstr \"Apagar após o primeiro download?\"\n\n#: themes/default/templates/files.html.ep:19\nmsgid \"Delete selected files\"\nmsgstr \"Excluir arquivos selecionados\"\n\n#: themes/default/templates/files.html.ep:33 themes/default/templates/partial/index.js.ep:19\nmsgid \"Deletion link\"\nmsgstr \"Eliminar o link\"\n\n#: themes/default/templates/delays.html.ep:8\nmsgid \"\"\n\"Don't worry: if a user begins to download the file before the expiration and \"\n\"the download ends after the expiration, he will be able to get the file.\"\nmsgstr \"\"\n\"Não se preocupe: se um utilizador começa a descarregar um ficheiro antes a \"\n\"sua expiração e que o descarregamento acaba após a sua expiração, o \"\n\"utilizador pode ainda assim recuperar o ficheiro.\"\n\n#: themes/default/templates/partial/index.js.ep:21 themes/default/templates/render.html.ep:28\nmsgid \"Download\"\nmsgstr \"Download\"\n\n#: themes/default/templates/partial/render.js.ep:4\nmsgid \"Download aborted.\"\nmsgstr \"Download interrompido.\"\n\n#: themes/default/templates/files.html.ep:28 themes/default/templates/partial/index.js.ep:20\nmsgid \"Download link\"\nmsgstr \"Link para o download\"\n\n#: themes/default/templates/about.html.ep:10\nmsgid \"\"\n\"Drag and drop files in the appropriate area or use the traditional way to \"\n\"send files and the files will be chunked, encrypted and sent to the server. \"\n\"You will get two links per file: a download link, that you give to the \"\n\"people you want to share the file with and a deletion link, allowing you to \"\n\"delete the file whenever you want.\"\nmsgstr \"\"\n\"Deslize os ficheiros na zona própria e esse efeito ou selecione um ficheiro \"\n\"de forma tradicional, e os ficheiros serão fragmentados, codificados e \"\n\"enviados ao servidor. Vai receber dois links por ficheiro: um é de download \"\n\"e o outro para poder apagar o ficheiro quando quiser.\"\n\n#: themes/default/templates/index.html.ep:122\nmsgid \"Drop files here\"\nmsgstr \"Arraste seus arquivos aqui\"\n\n#: themes/default/templates/invitations/invite.html.ep:40\nmsgid \"Email address of your guest\"\nmsgstr \"Endereço de e-mail do seu convidado\"\n\n#: themes/default/templates/mail.html.ep:39\nmsgid \"Email body\"\nmsgstr \"Conteúdo do e-mail\"\n\n#: themes/default/templates/mail.html.ep:31\nmsgid \"Email subject\"\nmsgstr \"Assunto do e-mail\"\n\n#: themes/default/templates/mail.html.ep:25 themes/default/templates/mail.html.ep:27\nmsgid \"Emails\"\nmsgstr \"E-mails\"\n\n#: themes/default/templates/partial/index.js.ep:22\nmsgid \"Encrypting part XX1 of XX2\"\nmsgstr \"Codificação do fragmento XX1 de XX2\"\n\n#: lib/Lufi/Controller/Files.pm:289\nmsgid \"Error: the file existed but was deleted.\"\nmsgstr \"Erro: o ficheiro existia mas foi apagado.\"\n\n#: lib/Lufi/Controller/Files.pm:369\nmsgid \"Error: the file has not been sent entirely.\"\nmsgstr \"Erro: o ficheiro não foi enviado na totalidade.\"\n\n#: lib/Lufi/Controller/Files.pm:379\nmsgid \"Error: unable to find the file. Are you sure of your URL?\"\nmsgstr \"Erro: impossível encontrar o ficheiro. Tem a certeza do URL?\"\n\n#: themes/default/templates/partial/index.js.ep:23\nmsgid \"Expiration:\"\nmsgstr \"Expiração:\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:27\nmsgid \"Expire at\"\nmsgstr \"Expira em\"\n\n#: themes/default/templates/files.html.ep:32\nmsgid \"Expires at\"\nmsgstr \"Expira no\"\n\n#: themes/default/templates/files.html.ep:12\nmsgid \"Export localStorage data\"\nmsgstr \"Exportar os dados localStorage\"\n\n#: lib/Lufi/Controller/Files.pm:471\nmsgid \"File deleted\"\nmsgstr \"Ficheiro apagado\"\n\n#: themes/default/templates/files.html.ep:27\nmsgid \"File name\"\nmsgstr \"Nome do ficheiro\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:61\nmsgid \"Files\"\nmsgstr \"Arquivos\"\n\n#: themes/default/templates/index.html.ep:80\nmsgid \"Files deleted at first download\"\nmsgstr \"Arquivos excluídos no primeiro descarregamento (download)\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:28\nmsgid \"Files sent at\"\nmsgstr \"Arquivos enviados em\"\n\n#: themes/default/templates/partial/invitations.js.ep:8\nmsgid \"Files sent in invitation XX1 by XX2\"\nmsgstr \"Arquivos enviados via convite XX1 por XX2\"\n\n#: themes/default/templates/partial/render.js.ep:8\nmsgid \"Get the file\"\nmsgstr \"Recuperar o ficheiro\"\n\n#: themes/default/templates/about.html.ep:18\nmsgid \"\"\n\"Get the source code on <a href=\\\"https://framagit.org/luc/lufi\\\" class=\"\n\"\\\"classic\\\">the official repository</a> or on its <a href=\\\"https://github.\"\n\"com/ldidry/lufi\\\" class=\\\"classic\\\">Github mirror</a>\"\nmsgstr \"\"\n\"Recupere o código-fonte no <a href=\\\"https://framagit.org/luc/lufi\\\" class=\"\n\"\\\"classic\\\">o depósito oficial</a> ou então <a href=\\\"https://github.com/\"\n\"ldidry/lufi\\\" class=\\\"classic\\\">réplicas Github</a>.\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:24\nmsgid \"Guest mail\"\nmsgstr \"Correio de convidado (Email)\"\n\n#. (ucfirst(stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:6\nmsgid \"Hello %1,\"\nmsgstr \"Olá %1,\"\n\n#: themes/default/templates/invitations/invite.mail.ep:4\nmsgid \"Hello,\"\nmsgstr \"Olá,\"\n\n#: themes/default/templates/partial/mail.js.ep:35\nmsgid \"Hello,\\\\n\\\\nHere's some files I want to share with you:\\\\n\"\nmsgstr \"\"\n\"Olá,\\\\n\\\\nAqui estão alguns ficheiros que gostaria de partilhar contigo:\\\\n\"\n\n#: themes/default/templates/mail.html.ep:35\nmsgid \"Here's some files\"\nmsgstr \"Aqui estão alguns ficheiros\"\n\n#: themes/default/templates/partial/invitations.js.ep:7\nmsgid \"Hide hidden invitations\"\nmsgstr \"Não mostrar convites ocultos\"\n\n#: themes/default/templates/partial/index.js.ep:25\nmsgid \"Hit Enter, then Ctrl+C to copy all the download links\"\nmsgstr \"\"\n\"Clique no Enter e depois Ctrl+C para copiar todos os links de download\"\n\n#: themes/default/templates/partial/index.js.ep:24\nmsgid \"Hit Enter, then Ctrl+C to copy the download link\"\nmsgstr \"Clique no Enter e depois Ctrl+C para copiar o link de download\"\n\n#: themes/default/templates/about.html.ep:9\nmsgid \"How does it work?\"\nmsgstr \"Como funciona?\"\n\n#: themes/default/templates/invitations/invite.html.ep:46\nmsgid \"How many days would you like the invitation to be valid?\"\nmsgstr \"Por quantos dias você deseja que seu convite seja válido?\"\n\n#: themes/default/templates/about.html.ep:16\nmsgid \"How to install the software on my server?\"\nmsgstr \"Como instalar o software no meu servidor?\"\n\n#: themes/default/templates/about.html.ep:12\nmsgid \"How to report an illegal file?\"\nmsgstr \"Como assinalar um ficheiro ilegal?\"\n\n#: themes/default/templates/delays.html.ep:7\nmsgid \"If you choose a delay, the file will be deleted after that delay.\"\nmsgstr \"Se escolher um prazo, o ficheiro será apagado após esse prazo.\"\n\n#: themes/default/templates/mail.html.ep:15\nmsgid \"\"\n\"If you send the mail from this server, the links will be sent to the server, \"\n\"which may lower your privacy protection.\"\nmsgstr \"\"\n\"Se enviar um e-mail a partir deste servidor, os links serão enviados ao \"\n\"servidor, o que poderá diminuir a proteção da confidencia.\"\n\n#: themes/default/templates/files.html.ep:14\nmsgid \"Import localStorage data\"\nmsgstr \"Importar os dados localStorage\"\n\n#: themes/default/templates/index.html.ep:53\nmsgid \"Important: more information on delays\"\nmsgstr \"Importante: mais informações sobre os prazos\"\n\n#: themes/default/templates/delays.html.ep:5\nmsgid \"Information about delays\"\nmsgstr \"Informação sobre os prazos\"\n\n#: themes/default/templates/files.html.ep:18 themes/default/templates/invitations/my_invitations.html.ep:12\nmsgid \"Invert selection\"\nmsgstr \"Seleção invertida\"\n\n#. ($i->guest_mail, $url)\n#: lib/Lufi/Controller/Invitation.pm:171\nmsgid \"Invitation resent to %1.<br> URL: %2\"\nmsgstr \"Convite reenviado para %1.<br> URL: %2\"\n\n#. ($invitation->guest_mail, $url)\n#: lib/Lufi/Controller/Invitation.pm:87\nmsgid \"Invitation sent to %1.<br> URL: %2\"\nmsgstr \"Convite enviado para %1.<br> URL: %2\"\n\n#: themes/default/templates/invitations/invite.html.ep:27 themes/default/templates/layouts/default.html.ep:36 themes/default/templates/layouts/default.html.ep:69\nmsgid \"Invite a guest\"\nmsgstr \"Convidar alguém\"\n\n#: themes/default/templates/partial/render.js.ep:6\nmsgid \"\"\n\"It seems that the key in your URL is incorrect. Please, verify your URL.\"\nmsgstr \"\"\n\"Parece que a chave do seu URL está incorreta.Por favor, verifique o seu URL.\"\n\n#: themes/default/templates/index.html.ep:12\nmsgid \"Javascript is disabled. You won't be able to use Lufi.\"\nmsgstr \"Javascript está desativado. Lufi não funcionará.\"\n\n#: themes/default/templates/layouts/default.html.ep:44 themes/default/templates/layouts/default.html.ep:46 themes/default/templates/layouts/default.html.ep:77 themes/default/templates/layouts/default.html.ep:79\nmsgid \"Language\"\nmsgstr \"Idioma\"\n\n#: themes/default/templates/login.html.ep:15\nmsgid \"Login\"\nmsgstr \"Utilizador\"\n\n#: themes/default/templates/layouts/default.html.ep:58 themes/default/templates/layouts/default.html.ep:91\nmsgid \"Logout\"\nmsgstr \"Encerrar sessão\"\n\n#: themes/default/templates/about.html.ep:4\nmsgid \"Lufi is a free (as in free speech) file hosting software.\"\nmsgstr \"\"\n\"Lufi é um programa de reserva gratuita (como na liberdade de expressão) de \"\n\"ficheiros.\"\n\n#: themes/default/templates/partial/files.js.ep:12\nmsgid \"\"\n\"Lufi recently changed its way to store files information.\\\\n\\\\nNo files have \"\n\"been found in the new localStorage location but we found files in the old \"\n\"one.\\\\nDo you want to import those informations?\\\\n\\\\nPlease note that this \"\n\"is the only time that we will ask you this.\"\nmsgstr \"\"\n\"Lufi mudou recentemente a forma como armazena as informações dos arquivos.\\\\n\"\n\"\\\\n\"\n\"Nenhum arquivo foi encontrado no novo local. localStorage mas encontramos \"\n\"arquivos no antigo \\\\n\"\n\"Você deseja importar essas informações?\\\\n\"\n\"\\\\n\"\n\"Por favor, observe que esta é a única vez que faremos esta pergunta.\"\n\n#: themes/default/templates/files.html.ep:34\nmsgid \"Mail\"\nmsgstr \"Email\"\n\n#: themes/default/templates/files.html.ep:3 themes/default/templates/layouts/default.html.ep:34 themes/default/templates/layouts/default.html.ep:67\nmsgid \"My files\"\nmsgstr \"Meus ficheiros\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:5 themes/default/templates/layouts/default.html.ep:37 themes/default/templates/layouts/default.html.ep:70\nmsgid \"My invitations\"\nmsgstr \"Os meus convites\"\n\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:17\nmsgid \"\"\n\"NB: this list includes the list of files that have already been sent to you.\"\nmsgstr \"\"\n\"NB: esta lista inclui a lista de arquivos que já foram enviados para você.\"\n\n#: themes/default/templates/index.html.ep:115\nmsgid \"Name of the zip file\"\nmsgstr \"Nome do arquivo zip\"\n\n#. (format_bytes($json->{size})\n#: lib/Lufi/Controller/Files.pm:108\nmsgid \"No enough space available on the server for this file (size: %1).\"\nmsgstr \"\"\n\"O servidor não tem espaço suficiente para este ficheiro (tamanho: %1).\"\n\n#: themes/default/templates/partial/files.js.ep:10 themes/default/templates/partial/index.js.ep:28\nmsgid \"No expiration delay\"\nmsgstr \"Não tem prazo de expiração\"\n\n#: themes/default/templates/files.html.ep:8\nmsgid \"\"\n\"Only the files sent with this browser will be listed here. This list is \"\n\"stored in localStorage: if you delete your localStorage data, you'll lose \"\n\"this list.\"\nmsgstr \"\"\n\"Apenas os ficheiros enviados com este navegador web estão listados aqui. As \"\n\"informações são armazenadas no localStorage : se apagar os seus dados no \"\n\"LocalStorage, poedrá perder essa informação.\"\n\n#: themes/default/templates/index.html.ep:106 themes/default/templates/login.html.ep:21 themes/default/templates/render.html.ep:26\nmsgid \"Password\"\nmsgstr \"Palavra-passe\"\n\n#. (config('contact')\n#: themes/default/templates/about.html.ep:13\nmsgid \"Please contact the administrator: %1\"\nmsgstr \"Contacte o administrador: %1\"\n\n#: themes/default/templates/render.html.ep:33\nmsgid \"\"\n\"Please wait while we are getting your file. We first need to download and \"\n\"decrypt all parts before you can get it.\"\nmsgstr \"\"\n\"Por favor aguarde durante a recuperação do seu ficheiro. Primeiro devemos \"\n\"recuperar e descodificar todos os fragmentos e depois poderá descarregar o \"\n\"ficheiro.\"\n\n#: lib/Lufi/Controller/Auth.pm:38\nmsgid \"\"\n\"Please, check your credentials or your right to access this service: unable \"\n\"to authenticate.\"\nmsgstr \"\"\n\"Por favor, verifique as suas credenciais ou o seu direito de acesso a este \"\n\"serviço: não foi possível autenticar.\"\n\n#: themes/default/templates/about.html.ep:5\nmsgid \"Privacy\"\nmsgstr \"Privacidade\"\n\n#: themes/default/templates/files.html.ep:13\nmsgid \"Purge expired files from localStorage\"\nmsgstr \"Apagar do localStorage os ficheiros expirados\"\n\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:20\nmsgid \"Regards,\"\nmsgstr \"Cumprimentos,\"\n\n#: themes/default/templates/invitations/invite.mail.ep:15\nmsgid \"Regards.\"\nmsgstr \"Cumprimentos.\"\n\n#: themes/default/templates/layouts/default.html.ep:31 themes/default/templates/layouts/default.html.ep:64\nmsgid \"Report file\"\nmsgstr \"Arquivo de relatório\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:15\nmsgid \"Resend invitation mail\"\nmsgstr \"Reenviar e-mail de convite\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:9\nmsgid \"Rows in purple mean that the invitations have expired.\"\nmsgstr \"As linhas em roxo significam que os convites expiraram.\"\n\n#: themes/default/templates/files.html.ep:9\nmsgid \"\"\n\"Rows in red mean that the files have expired and are no longer available.\"\nmsgstr \"\"\n\"As linhas a vermelho indicam que o ficheiro expirou e já não está disponível.\"\n\"\"\n\n#: themes/default/templates/partial/index.js.ep:26\nmsgid \"Send all links by email\"\nmsgstr \"Enviar todos os links por e-mail\"\n\n#: themes/default/templates/invitations/invite.html.ep:50\nmsgid \"Send the invitation\"\nmsgstr \"Enviar um convite\"\n\n#: themes/default/templates/mail.html.ep:46\nmsgid \"Send with this server\"\nmsgstr \"Enviar com este servidor\"\n\n#: themes/default/templates/mail.html.ep:47\nmsgid \"Send with your own mail software\"\nmsgstr \"Enviar com o seu e-mail pessoal\"\n\n#: themes/default/templates/partial/index.js.ep:29\nmsgid \"\"\n\"Sending part XX1 of XX2. Please, be patient, the progress bar can take a \"\n\"while to move.\"\nmsgstr \"\"\n\"Envio do fragmento XX1 de XX2. Por favor aguarde, a barra de progressão pode \"\n\"levar algum tempo antes de avançar.\"\n\n#. (url_for('/')\n#: themes/default/templates/partial/mail.js.ep:48\nmsgid \"Share your files in total privacy on %1\"\nmsgstr \"Partilhe os seus ficheiros com toda a privacidade em %1\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:13 themes/default/templates/partial/invitations.js.ep:9\nmsgid \"Show hidden invitations\"\nmsgstr \"Mostrar convites ocultos\"\n\n#: themes/default/templates/partial/render.js.ep:11\nmsgid \"Show zip content\"\nmsgstr \"Mostrar conteúdo do arquivo zip\"\n\n#: themes/default/templates/layouts/default.html.ep:40 themes/default/templates/layouts/default.html.ep:73 themes/default/templates/login.html.ep:28 themes/default/templates/logout.html.ep:17\nmsgid \"Signin\"\nmsgstr \"Conexão\"\n\n#: lib/Lufi/Controller/Invitation.pm:283 themes/default/templates/invitations/exception.html.ep:16\nmsgid \"\"\n\"Sorry, the invitation doesn’t exist. Are you sure you are on the right URL?\"\nmsgstr \"Desculpe, o convite não existe. Tem certeza de que está no URL correto?\"\n\n#: themes/default/templates/index.html.ep:46\nmsgid \"Sorry, the uploading is currently disabled. Please try again later.\"\nmsgstr \"\"\n\"Desculpe, o envio do ficheiro está atualmente desativado. Tente mais tarde.\"\n\n#: lib/Lufi/Controller/Files.pm:82\nmsgid \"Sorry, uploading is disabled.\"\nmsgstr \"Desculpe, o envio do ficheiro está desativado.\"\n\n#: themes/default/templates/invitations/exception.html.ep:7\nmsgid \"Sorry, your invitation has expired or has been deleted.\"\nmsgstr \"Desculpe, seu convite expirou ou foi excluído.\"\n\n#. ($invit->ldap_user_mail)\n#: lib/Lufi/Controller/Files.pm:122\nmsgid \"\"\n\"Sorry, your invitation has expired or has been deleted. Please contact %1 to \"\n\"have another invitation.\"\nmsgstr \"\"\n\"Desculpe, seu convite expirou ou foi excluído. Por favor contate %1 para \"\n\"obter outro convite.\"\n\n#. ($invitation->ldap_user_mail)\n#: lib/Lufi/Controller/Invitation.pm:276\nmsgid \"The URLs of your files have been sent by email to %1.\"\nmsgstr \"Os URLs dos seus arquivos foram enviados por e-mail para %1.\"\n\n#: themes/default/templates/about.html.ep:7\nmsgid \"\"\n\"The administrator can only see the file's name, its size and its mimetype \"\n\"(what kind of file it is: video, text, etc.).\"\nmsgstr \"\"\n\"O administrador pode apenas ver o nome do ficheiro, o seu tamanho e o tipo \"\n\"de mime (o tipo de ficheiro: texto, vídeo, etc.).\"\n\n#: lib/Lufi/Controller/Mail.pm:53\nmsgid \"\"\n\"The body of the mail must contain at least one URL pointing to a file hosted \"\n\"on this instance.\"\nmsgstr \"\"\n\"O corpo do e-mail deve conter pelo menos um URL apontando para um arquivo \"\n\"hospedado nesta instância.\"\n\n#: themes/default/templates/partial/files.js.ep:11\nmsgid \"The data has been successfully imported.\"\nmsgstr \"Os dados foram importados com sucesso.\"\n\n#: lib/Lufi/Controller/Mail.pm:73\nmsgid \"The email body can't be empty.\"\nmsgstr \"A mensagem do e-mail não pode estar vazia.\"\n\n#: lib/Lufi/Controller/Mail.pm:72\nmsgid \"The email subject can't be empty.\"\nmsgstr \"O assunto do e-mail não pode estar vazio.\"\n\n#. ($expire_at, $max_expire_at)\n#: lib/Lufi/Controller/Invitation.pm:51\nmsgid \"The expiration delay (%1) is not between 1 and %2 days.\"\nmsgstr \"O prazo de expiração (%1) não está entre 1 e %2 dias.\"\n\n#: lib/Lufi/Controller/Files.pm:468\nmsgid \"The file has already been deleted\"\nmsgstr \"O ficheiro já foi apagado\"\n\n#: themes/default/templates/about.html.ep:6\nmsgid \"\"\n\"The files uploaded on a Lufi instance are encrypted before the upload to the \"\n\"server: the administrator of the server can not see the file's content.\"\nmsgstr \"\"\n\"Os ficheiros enviados no Lufi são codificados antes de serem enviados ao \"\n\"servidor: o administrador do servidor não pode ver o conteúdo dos ficheiros.\"\n\n#. (join(', ', @bad)\n#: lib/Lufi/Controller/Mail.pm:68\nmsgid \"The following email addresses are not valid: %1\"\nmsgstr \"Os e-mails seguintes não são válidos: %1\"\n\n#. ($guest_mail)\n#: lib/Lufi/Controller/Invitation.pm:48\nmsgid \"The guest email address (%1) is unvalid.\"\nmsgstr \"O endereço de e-mail do convidado (%1) é inválido.\"\n\n#. ($i->token, $i->guest_mail)\n#: lib/Lufi/Controller/Invitation.pm:150\nmsgid \"\"\n\"The invitation %1 can’t be resent: %2 has already sent files.<br>Please \"\n\"create a new invitation.\"\nmsgstr \"\"\n\"O convite %1 não pode ser reenviado :%2 já enviou arquivos.<br>Por favor, \"\n\"crie um novo convite.\"\n\n#. ($i->token)\n#: lib/Lufi/Controller/Invitation.pm:130\nmsgid \"The invitation %1 has been deleted.\"\nmsgstr \"O convite %1 foi deletado.\"\n\n#. (stash('user_mail')\n#: themes/default/templates/invitations/invite.html.ep:34\nmsgid \"The invitation mail will be send from your email address (%1).\"\nmsgstr \"O correio de convite será enviado do seu endereço de e-mail (%1).\"\n\n#: themes/default/templates/partial/index.js.ep:16\nmsgid \"The link(s) has been copied to your clipboard\"\nmsgstr \"O(s) link(s) foi/foram copiados para a área de transferência\"\n\n#. (stash('invitation')\n#: themes/default/templates/index.html.ep:30\nmsgid \"\"\n\"The link(s) of your file(s) will automatically be sent by mail to %1 (%2)\"\nmsgstr \"\"\n\"O(s) link(s) do(s) seu(s) arquivo(s) serão automaticamente enviados por e-\"\n\"mail para %1 (%2)\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:11\nmsgid \"The links of your file(s) will automatically be sent by mail to %1.\"\nmsgstr \"\"\n\"O(s) link(s) do(s) seu(s) arquivo(s) serão enviado(s) automaticamente por e-\"\n\"mail para %1.\"\n\n#: lib/Lufi/Controller/Mail.pm:97\nmsgid \"The mail has been sent.\"\nmsgstr \"O e-mail foi enviado.\"\n\n#: themes/default/templates/about.html.ep:15\nmsgid \"\"\n\"The original (and only for now) author is <a href=\\\"https://fiat-tux.fr\\\" \"\n\"class=\\\"classic\\\">Luc Didry</a>.\"\nmsgstr \"\"\n\"O autor original (e por agora, o único) é <a href=\\\"https://fiat-tux.fr\\\" \"\n\"class=\\\"classic\\\">Luc Didry</a>.\"\n\n#: lib/Lufi/Controller/Files.pm:236\nmsgid \"\"\n\"The server was unable to find the file record to add your file part to. \"\n\"Please, contact the administrator.\"\nmsgstr \"\"\n\"O servidor foi incapaz de encontrar o registo do ficheiro no qual devia-se \"\n\"juntar o fragmento do seu ficheiro. Contacte o administrador.\"\n\n#: lib/Lufi/Controller/Files.pm:295\nmsgid \"\"\n\"This file has been deactivated by the admins. Contact them to know why.\"\nmsgstr \"\"\n\"O arquivo foi desabilitado pelos administradores(as). Entre em contato com \"\n\"eles(as) para descobrir o porquê.\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:46 themes/default/templates/partial/invitations.js.ep:6\nmsgid \"This invitation is normally hidden\"\nmsgstr \"Este convite normalmente está oculto\"\n\n#. (stash('expires')\n#: themes/default/templates/invitations/invite.mail.ep:13\nmsgid \"This invitation is valid until %1.\"\nmsgstr \"Este convite é válido até %1.\"\n\n#: themes/default/templates/delays.html.ep:10\nmsgid \"\"\n\"This server sets limitations according to the file size. The expiration \"\n\"delay of your file will be the minimum between what you choose and the \"\n\"following limitations:\"\nmsgstr \"\"\n\"O servidor exige limites segundo o tamanho dos ficheiros. O prazo de \"\n\"expiração dos seu ficheiro sera o minimo entre o que você escolheu e os \"\n\"limites seguintes:\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:16\nmsgid \"Toggle visibility\"\nmsgstr \"Alternar visibilidade\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:25\nmsgid \"URL\"\nmsgstr \"URL\"\n\n#: themes/default/templates/partial/index.js.ep:17\nmsgid \"Unable to copy the link(s) to your clipboard\"\nmsgstr \"Impossível copiar o(s) link(s) na sua área de transferência\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:439\nmsgid \"\"\n\"Unable to get counter for %1. The file does not exists. It will be removed \"\n\"from your localStorage.\"\nmsgstr \"\"\n\"Impossível recuperar o contador para %1. O ficheiro não existe. Isso vai \"\n\"apagar a sua localStorage.\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:429\nmsgid \"Unable to get counter for %1. The token is invalid.\"\nmsgstr \"Impossível recuperar o contador para %1. O símbolo é inválido.\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:449\nmsgid \"Unable to get counter for %1. You are not authenticated.\"\nmsgstr \"Impossível recuperar o contador para %1. Não está conectado.\"\n\n#: themes/default/templates/layouts/default.html.ep:33 themes/default/templates/layouts/default.html.ep:66\nmsgid \"Upload files\"\nmsgstr \"Enviar os ficheiros\"\n\n#: themes/default/templates/index.html.ep:145\nmsgid \"Upload generated zip file\"\nmsgstr \"Enviar arquivo zip gerado\"\n\n#: themes/default/templates/files.html.ep:31\nmsgid \"Uploaded at\"\nmsgstr \"Enviar a\"\n\n#: themes/default/templates/index.html.ep:153\nmsgid \"Uploaded files\"\nmsgstr \"Ficheiros enviados\"\n\n#: themes/default/templates/partial/index.js.ep:30\nmsgid \"Websocket communication error\"\nmsgstr \"Erro de comunicação com WebSocket\"\n\n#: themes/default/templates/about.html.ep:3\nmsgid \"What is Lufi?\"\nmsgstr \"O que é o Lufi?\"\n\n#: themes/default/templates/about.html.ep:14\nmsgid \"Who wrote this software?\"\nmsgstr \"Quem escreveu este software?\"\n\n#: themes/default/templates/partial/index.js.ep:13\nmsgid \"XXX file has been added to upload queue.\"\nmsgstr \"O arquivo XXX foi adicionado à fila de envio.\"\n\n#: themes/default/templates/invitations/invite.html.ep:30\nmsgid \"\"\n\"You can invite someone to send you files through this Lufi instance even if \"\n\"they don’t have an account on it.\"\nmsgstr \"\"\n\"Você pode convidar alguém para enviar arquivos para você por meio desta \"\n\"instância do Lufi, mesmo que essa pessoa não tenha uma conta nele.\"\n\n#: themes/default/templates/about.html.ep:11\nmsgid \"\"\n\"You can see the list of your files by clicking on the \\\"My files\\\" link at \"\n\"the top right of this page.\"\nmsgstr \"\"\n\"Pode ver a lista dos seus ficheiros clicando no link « Meus ficheiros » em \"\n\"cima da página à direita.\"\n\n#: lib/Lufi/Controller/Mail.pm:42\nmsgid \"You can't add URLs that are not related to this instance.\"\nmsgstr \"\"\n\"Você não pode adicionar URLs que não estejam relacionados a esta instância.\"\n\n#: themes/default/templates/about.html.ep:8\nmsgid \"\"\n\"You don't need to register yourself to upload files but be aware that, for \"\n\"legal reasons, your IP address will be stored when you send a file. Don't \"\n\"panic, this is normally the case for all sites on which you send files.\"\nmsgstr \"\"\n\"Não precisa registar-se para enviar ficheiros mas saiba que, por razões \"\n\"legais, o seu endereço IP ficará registrado quando envia um ficheiro. Não \"\n\"entre em pânico, é algo comum a todos os sites onde envia ficheiros.\"\n\n#: themes/default/templates/partial/render.js.ep:10\nmsgid \"\"\n\"You don't seem to have a key in your URL. You won't be able to decrypt the \"\n\"file. Download canceled.\"\nmsgstr \"\"\n\"Parece que não tem a chave no seu URL. Não poderá descodificar o ficheiro. \"\n\"Download anulado.\"\n\n#: themes/default/templates/partial/render.js.ep:7\nmsgid \"\"\n\"You have attempted to leave this page. The download will be canceled. Are \"\n\"you sure?\"\nmsgstr \"Está a tentar sair da página. O download será anulado. Tem a certeza?\"\n\n#: themes/default/templates/partial/index.js.ep:14\nmsgid \"\"\n\"You have attempted to leave this page. The upload will be canceled. Are you \"\n\"sure?\"\nmsgstr \"Está a tentar sair da página. O envio será anulado. Tem a certeza?\"\n\n#: themes/default/templates/logout.html.ep:14\nmsgid \"You have been successfully logged out.\"\nmsgstr \"Foi desconectado com sucesso.\"\n\n#: lib/Lufi/Controller/Mail.pm:71\nmsgid \"You must give email addresses.\"\nmsgstr \"Deve escrever os e-mails.\"\n\n#: themes/default/templates/index.html.ep:38\nmsgid \"\"\n\"Your browser does not have enough entropy to generate a strong encryption \"\n\"key. Please wait (it's better if you do things on your computer while \"\n\"waiting).\"\nmsgstr \"\"\n\"Seu navegador não tem entropia suficiente para gerar uma chave de \"\n\"criptografia forte. Aguarde (é melhor fazer algumas coisas no computador \"\n\"enquanto espera).\"\n\n#. (format_bytes($json->{size})\n#: lib/Lufi/Controller/Files.pm:95\nmsgid \"Your file is too big: %1 (maximum size allowed: %2)\"\nmsgstr \"\"\n\"O seu ficheiro é grande de mais: %1 (o tamanho máximo autorizado é de %2)\"\n\n#: lib/Lufi/Controller/Files.pm:351\nmsgid \"Your password is not valid. Please refresh the page to retry.\"\nmsgstr \"Sua senha não é válida. Atualize a página para tentar novamente.\"\n\n#: themes/default/templates/partial/render.js.ep:12\nmsgid \"Zip content:\"\nmsgstr \"Conteúdo do arquivo zip:\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:20\nmsgid \"between %1 and %2, the file will be kept %3 day(s).\"\nmsgstr \"entre %1 e %2, o ficheiro será conservado %3 dia(s).\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:22\nmsgid \"between %1 and %2, the file will be kept forever.\"\nmsgstr \"entre %1 e %2, o ficheiro será conservado por um tempo indeterminado.\"\n\n#: themes/default/templates/partial/mail.js.ep:42\nmsgid \"deadline: \"\nmsgstr \"Data-limite: \"\n\n#: themes/default/templates/partial/invitations.js.ep:5\nmsgid \"expires on XXX\"\nmsgstr \"expira em XXX\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:26\nmsgid \"for %1 and more, the file will be kept %2 day(s)\"\nmsgstr \"para %1 e mais, o ficheiro será conservado %2 dia(s).\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:28\nmsgid \"for %1 and more, the file will be kept forever.\"\nmsgstr \"\"\n\"para %1 e mais, o ficheiro será conservado por um tempo indeterminado.\"\n\n#: themes/default/templates/index.html.ep:3\nmsgid \"no time limit\"\nmsgstr \"Não tem limite de expiração\"\n\n#: themes/default/templates/index.html.ep:124\nmsgid \"or\"\nmsgstr \"ou\"\n\n#. ($e->{name}, format_bytes($e->{size})\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:12\nmsgid \"— %1 (%2), that will expire on %3\"\nmsgstr \"— %1 (%2), que irá expirar em %3\"\n\n#: themes/default/templates/about.html.ep:18\nmsgid \"Get the source code on <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi\\\" class=\\\"classic\\\">the official repository</a> or on its <a href=\\\"https://github.com/ldidry/lufi\\\" class=\\\"classic\\\">Github mirror</a>\"\nmsgstr \"\"\n\"Recupere o código-fonte no <a href=\\\"https://framagit.org/fiat-tux/\"\n\"hat-softwares/lufi\\\" class=\\\"classic\\\">o depósito oficial</a> ou então <a \"\n\"href=\\\"https://github.com/ldidry/lufi\\\" class=\\\"classic\\\">réplicas Github</a>\"\n\n#: themes/default/templates/about.html.ep:17\nmsgid \"As Lufi is a free software licensed under of the terms of the <a href=\\\"https://gnu.org/licenses/agpl.html\\\" class=\\\"classic\\\">AGPLv3</a>, you can install it on you own server. Have a look on the <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi/wikis/home\\\" class=\\\"classic\\\">Wiki</a> for the procedure.\"\nmsgstr \"\"\n\"Como Lufi é um programa livre sob os termos da licença <a href=\\\"https://gnu.\"\n\"org/licenses/agpl.html\\\" class=\\\"classic\\\">AGPLv3</a>, pode instalar-lo no \"\n\"seu prórpio servidor. Para saber mais clique aqui <a href=\\\"https://framagit.\"\n\"org/fiat-tux/hat-softwares/lufi/wikis/home\\\" class=\\\"classic\\\">Wiki</a> para \"\n\"ver o procedimento.\"\n\n#. ($i->token, $c->current_user->{username})\n#: lib/Lufi/Controller/Invitation.pm:136\nmsgid \"The invitation %1 can’t be deleted: it wasn’t created by you (%2).\"\nmsgstr \"O convite %1 não pode ser excluído: não foi você quem o criou (%2).\"\n\n#. ($i->token, $c->current_user->{username})\n#: lib/Lufi/Controller/Invitation.pm:187\nmsgid \"The invitation %1 can’t be resent: it wasn’t created by you (%2).\"\nmsgstr \"O convite %1 não pode ser reenviado: não foi voçê quem o criou (%2).\"\n\n#. ($orig_uri)\n#: lib/Lufi/Controller/Mail.pm:43 lib/Lufi/Controller/Mail.pm:59\nmsgid \"You can't add URLs that are not related to this instance (%1).\"\nmsgstr \"\"\n\"Você não pode adicionar URLs que não estejam relacionados a esta instância \"\n\"(%1).\"\n\n#: themes/default/templates/partial/render.js.ep:13\nmsgid \"Unable to download the file: too much unsuccessful attempts to open a websocket. Please, contact the administrator.\"\nmsgstr \"\"\n\"Incapaz de baixar o arquivo: muitas tentativas mal sucedidas para abrir um \"\n\"\\\"websocket\\\". Entre em contato com o administrador.\"\n\n#: themes/default/templates/about.html.ep:20\nmsgid \"Version\"\nmsgstr \"Versão\"\n\n#. (sprintf('<a href=\"https://framagit.org/fiat-tux/hat-softwares/lufi/-/releases/%s\" class=\"classic\">%s</a>', stash('version')\n#: themes/default/templates/about.html.ep:21\nmsgid \"Latest tag of this instance: %1\"\nmsgstr \"Último rótulo desta instância: %1\"\n\n#. (sprintf('<a href=\"https://framagit.org/fiat-tux/hat-softwares/lufi/-/commit/%s\" class=\"classic\">%s</a>', stash('version')\n#: themes/default/templates/about.html.ep:22\nmsgid \"Latest commit of this instance: %1\"\nmsgstr \"Última confirmação desta instância %1\"\n\n#: themes/default/templates/partial/render.js.ep:9\nmsgid \"File downloaded\"\nmsgstr \"Arquivo baixado\"\n\n#: themes/default/templates/partial/index.js.ep:24\nmsgid \"File uploaded\"\nmsgstr \"Arquivo enviado\"\n"
  },
  {
    "path": "themes/default/lib/Lufi/I18N/ru.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\\n\"\n\"PO-Revision-Date: 2022-07-20 05:50+0000\\n\"\n\"Last-Translator: AHOHNMYC <cajico4400@runfons.com>\\n\"\n\"Language-Team: Russian <https://weblate.framasoft.org/projects/lufi/\"\n\"default-theme/ru/>\\n\"\n\"Language: ru\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n\"\n\"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\\n\"\n\"X-Generator: Weblate 4.13.1\\n\"\n\n#. ($delay)\n#. (max_delay)\n#: themes/default/templates/index.html.ep:56 themes/default/templates/index.html.ep:65 themes/default/templates/index.html.ep:66\nmsgid \"%1 days\"\nmsgstr \"%1 дней\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:2\nmsgid \"%1 invites you to send him/her files\"\nmsgstr \"%1 приглашает тебя отослать ему/ей файлы\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:6\nmsgid \"%1 invites you to send him/her files through Lufi.\"\nmsgstr \"%1 приглашает тебя отослать ему/ей файлы через Lufi.\"\n\n#. (stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:4\nmsgid \"%1 sent you files\"\nmsgstr \"%1 прислал(а) тебе файлы\"\n\n#. (stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:8\nmsgid \"%1 used your invitation to send you files:\"\nmsgstr \"%1 воспользовался/-лась твоим приглашением, чтобы отправить файлы:\"\n\n#: lib/Lufi/Controller/Invitation.pm:159 lib/Lufi/Controller/Invitation.pm:84 themes/default/templates/invitations/my_invitations.html.ep:51 themes/default/templates/invitations/my_invitations.html.ep:52 themes/default/templates/invitations/my_invitations.html.ep:53 themes/default/templates/invitations/notification_files_sent.mail.ep:12\nmsgid \"%A %d %B %Y at %T\"\nmsgstr \"%A %d %B %Y в %T\"\n\n#: themes/default/templates/partial/index.js.ep:28\nmsgid \"(max size: XXX)\"\nmsgstr \"(макс. размер: XXX)\"\n\n#: themes/default/templates/index.html.ep:5\nmsgid \"1 year\"\nmsgstr \"1 год\"\n\n#: themes/default/templates/index.html.ep:4 themes/default/templates/index.html.ep:65\nmsgid \"24 hours\"\nmsgstr \"24 часа\"\n\n#: themes/default/templates/partial/mail.js.ep:40\nmsgid \":\"\nmsgstr \":\"\n\n#: themes/default/templates/render.html.ep:42\nmsgid \"Abort\"\nmsgstr \"Отменить\"\n\n#: themes/default/templates/layouts/default.html.ep:53 themes/default/templates/layouts/default.html.ep:86\nmsgid \"About\"\nmsgstr \"О нас\"\n\n#: themes/default/templates/index.html.ep:107\nmsgid \"Add a password to file(s)\"\nmsgstr \"Добавить пароль к файлам\"\n\n#: themes/default/templates/mail.html.ep:16\nmsgid \"Adding URLs not related to this Lufi instance to the mail body or subject is prohibited.\"\nmsgstr \"\"\n\"Добавление сторонних ссылок, не имеющих отношения к этому экземпляру Lufi, в \"\n\"теме или теле письма запрещено.\"\n\n#: themes/default/templates/partial/invitations.js.ep:3\nmsgid \"Are you sure you want to delete the selected invitations?\"\nmsgstr \"Уверены, что хотите удалить выбранные приглашения?\"\n\n#: themes/default/templates/partial/invitations.js.ep:4\nmsgid \"Are you sure you want to resend the invitation mail for the selected invitations?\"\nmsgstr \"\"\n\"Уверены, что хотите повторно выслать пригласительные письмо для выбранных \"\n\"приглашений?\"\n\n#: themes/default/templates/about.html.ep:17\nmsgid \"As Lufi is a free software licensed under of the terms of the <a href=\\\"https://gnu.org/licenses/agpl.html\\\" class=\\\"classic\\\">AGPLv3</a>, you can install it on you own server. Have a look on the <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi/wikis/home\\\" class=\\\"classic\\\">Wiki</a> for the procedure.\"\nmsgstr \"\"\n\"Lufi — свободное ПО, и лицензирован по условиям <a href=\\\"https://gnu.org/\"\n\"licenses/agpl.html\\\" class=\\\"classic\\\">AGPLv3</a>, вы можете установить его \"\n\"у себя на сервере. Взгляните на <a href=\\\"https://framagit.org/fiat-tux/\"\n\"hat-softwares/lufi/wikis/home\\\" class=\\\"classic\\\">Вики</a>, там есть \"\n\"описание процедуры.\"\n\n#. (stash('nbslices')\n#: themes/default/templates/partial/render.js.ep:10\nmsgid \"Asking for file part XX1 of %1\"\nmsgstr \"Запрашиваю часть файла XX1 из %1\"\n\n#: themes/default/templates/about.html.ep:23\nmsgid \"Back to homepage\"\nmsgstr \"Назад на главную\"\n\n#: lib/Lufi/Controller/Mail.pm:25\nmsgid \"Bad CSRF token!\"\nmsgstr \"Неверный CSRF-токен!\"\n\n#: lib/Lufi/Controller/Auth.pm:27 lib/Lufi/Controller/Auth.pm:49\nmsgid \"Bad CSRF token.\"\nmsgstr \"Неверный CSRF-токен.\"\n\n#: themes/default/templates/partial/render.js.ep:5\nmsgid \"Click here to refresh the page and restart the download.\"\nmsgstr \"Нажмите тут, чтобы перезагрузить страницу и по новой начать скачивание.\"\n\n#: themes/default/templates/invitations/invite.mail.ep:8\nmsgid \"Click on the following URL to upload files on Lufi:\"\nmsgstr \"Нажмите на этот URL, чтобы загрузить файлы на Lufi:\"\n\n#: themes/default/templates/index.html.ep:126\nmsgid \"Click to open the file browser\"\nmsgstr \"Нажми, чтобы открыть файловый браузер\"\n\n#: themes/default/templates/delays.html.ep:38 themes/default/templates/invitations/my_invitations.html.ep:80\nmsgid \"Close\"\nmsgstr \"Закрыть\"\n\n#: themes/default/templates/mail.html.ep:23\nmsgid \"Comma-separated email addresses\"\nmsgstr \"Эл. адреса разделённые запятыми\"\n\n#: themes/default/templates/index.html.ep:140\nmsgid \"Compressing zip file…\"\nmsgstr \"Сжимаю zip-файл…\"\n\n#: themes/default/templates/partial/index.js.ep:15\nmsgid \"Copy all links to clipboard\"\nmsgstr \"Скопировать все ссылки в буфер обмена\"\n\n#: themes/default/templates/partial/index.js.ep:18\nmsgid \"Copy to clipboard\"\nmsgstr \"Скопировать в буфер обмена\"\n\n#: lib/Lufi/Controller/Files.pm:501\nmsgid \"Could not delete the file. You are not authenticated.\"\nmsgstr \"Не удалось удалить файл. Вы не залогинены.\"\n\n#: lib/Lufi/Controller/Files.pm:483\nmsgid \"Could not find the file. Are you sure of the URL and the token?\"\nmsgstr \"Не получилось найти файл. Вы уверены насчет ссылки и токена?\"\n\n#: lib/Lufi/Controller/Files.pm:394\nmsgid \"Could not find the file. Are you sure of the URL?\"\nmsgstr \"Не получилось найти файл. Вы уверены насчет ссылки?\"\n\n#: themes/default/templates/files.html.ep:29\nmsgid \"Counter\"\nmsgstr \"Счётчик\"\n\n#: themes/default/templates/index.html.ep:100\nmsgid \"Create a zip archive with the files before uploading?\"\nmsgstr \"Сделать zip архив с файлами перед загрузкой?\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:26\nmsgid \"Created at\"\nmsgstr \"Создано\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:14\nmsgid \"Delete\"\nmsgstr \"Удалить\"\n\n#: themes/default/templates/files.html.ep:30 themes/default/templates/index.html.ep:90\nmsgid \"Delete at first download?\"\nmsgstr \"Удалить при первом скачивании?\"\n\n#: themes/default/templates/files.html.ep:19\nmsgid \"Delete selected files\"\nmsgstr \"Удалить выбранные файлы\"\n\n#: themes/default/templates/files.html.ep:33 themes/default/templates/partial/index.js.ep:19\nmsgid \"Deletion link\"\nmsgstr \"Ссылка на удаление\"\n\n#: themes/default/templates/delays.html.ep:8\nmsgid \"Don't worry: if a user begins to download the file before the expiration and the download ends after the expiration, he will be able to get the file.\"\nmsgstr \"\"\n\"Не волнуйся: если пользователь начнет скачивание до истечения срока, а \"\n\"закончит после, он(а) всё еще получит файл.\"\n\n#: themes/default/templates/partial/index.js.ep:21 themes/default/templates/render.html.ep:28\nmsgid \"Download\"\nmsgstr \"Скачать\"\n\n#: themes/default/templates/partial/render.js.ep:4\nmsgid \"Download aborted.\"\nmsgstr \"Скачивание прервалось.\"\n\n#: themes/default/templates/files.html.ep:28 themes/default/templates/partial/index.js.ep:20\nmsgid \"Download link\"\nmsgstr \"Ссылка на скачивание\"\n\n#: themes/default/templates/about.html.ep:10\nmsgid \"Drag and drop files in the appropriate area or use the traditional way to send files and the files will be chunked, encrypted and sent to the server. You will get two links per file: a download link, that you give to the people you want to share the file with and a deletion link, allowing you to delete the file whenever you want.\"\nmsgstr \"\"\n\"Перетащите файлы в обозначенную область или выберите их традиционным \"\n\"способом; файлы будут разбиты, зашифрованы и отправлены на сервер. Вы \"\n\"получите две ссылки на файл: ссылку на скачивание, которой можете поделиться \"\n\"с людьми; и ссылку на удаление, по которой сможете удалить файл в любое \"\n\"время.\"\n\n#: themes/default/templates/index.html.ep:122\nmsgid \"Drop files here\"\nmsgstr \"Перетащи файлы сюда\"\n\n#: themes/default/templates/invitations/invite.html.ep:40\nmsgid \"Email address of your guest\"\nmsgstr \"Эл. адрес твоего гостя\"\n\n#: themes/default/templates/mail.html.ep:39\nmsgid \"Email body\"\nmsgstr \"Текст письма\"\n\n#: themes/default/templates/mail.html.ep:31\nmsgid \"Email subject\"\nmsgstr \"Тема письма\"\n\n#: themes/default/templates/mail.html.ep:25 themes/default/templates/mail.html.ep:27\nmsgid \"Emails\"\nmsgstr \"Электронные адреса\"\n\n#: themes/default/templates/partial/index.js.ep:22\nmsgid \"Encrypting part XX1 of XX2\"\nmsgstr \"Зашифровываю часть XX1 из XX2\"\n\n#: lib/Lufi/Controller/Files.pm:283\nmsgid \"Error: the file existed but was deleted.\"\nmsgstr \"Ошибка: Файл был тут, но его удалили.\"\n\n#: lib/Lufi/Controller/Files.pm:363\nmsgid \"Error: the file has not been sent entirely.\"\nmsgstr \"Ошибка: Файл не был отправлен в целиком.\"\n\n#: lib/Lufi/Controller/Files.pm:373\nmsgid \"Error: unable to find the file. Are you sure of your URL?\"\nmsgstr \"Ошибка: не получилось найти файл. Точно ли ссылка правильная?\"\n\n#: themes/default/templates/partial/index.js.ep:23\nmsgid \"Expiration:\"\nmsgstr \"Истекает:\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:27\nmsgid \"Expire at\"\nmsgstr \"Истекает\"\n\n#: themes/default/templates/files.html.ep:32\nmsgid \"Expires at\"\nmsgstr \"Истекает\"\n\n#: themes/default/templates/files.html.ep:12\nmsgid \"Export localStorage data\"\nmsgstr \"Экспорт данных из localStorage\"\n\n#: lib/Lufi/Controller/Files.pm:465\nmsgid \"File deleted\"\nmsgstr \"Файл удалён\"\n\n#: themes/default/templates/partial/render.js.ep:9\nmsgid \"File downloaded\"\nmsgstr \"Файл скачан\"\n\n#: themes/default/templates/files.html.ep:27\nmsgid \"File name\"\nmsgstr \"Название файла\"\n\n#: themes/default/templates/partial/index.js.ep:24\nmsgid \"File uploaded\"\nmsgstr \"Файл закачан\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:61\nmsgid \"Files\"\nmsgstr \"Файлы\"\n\n#: themes/default/templates/index.html.ep:80\nmsgid \"Files deleted at first download\"\nmsgstr \"Удалённые при первом скачивании файлы\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:28\nmsgid \"Files sent at\"\nmsgstr \"Файлы были отправлены\"\n\n#: themes/default/templates/partial/invitations.js.ep:8\nmsgid \"Files sent in invitation XX1 by XX2\"\nmsgstr \"Файлы, которые были отправлены в приглашении XX1 из XX2\"\n\n#: themes/default/templates/partial/render.js.ep:8\nmsgid \"Get the file\"\nmsgstr \"Скачать файл\"\n\n#: themes/default/templates/about.html.ep:18\nmsgid \"Get the source code on <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi\\\" class=\\\"classic\\\">the official repository</a> or on its <a href=\\\"https://github.com/ldidry/lufi\\\" class=\\\"classic\\\">Github mirror</a>\"\nmsgstr \"\"\n\"Взять исходный код из <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/\"\n\"lufi\\\" class=\\\"classic\\\">официального репозитория</a> или <a href=\\\"https\"\n\"://github.com/ldidry/lufi\\\" class=\\\"classic\\\">зеркала на Github</a>\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:24\nmsgid \"Guest mail\"\nmsgstr \"Эл. адрес гостя\"\n\n#. (ucfirst(stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:6\nmsgid \"Hello %1,\"\nmsgstr \"Привет, %1,\"\n\n#: themes/default/templates/invitations/invite.mail.ep:4\nmsgid \"Hello,\"\nmsgstr \"Привет,\"\n\n#: themes/default/templates/partial/mail.js.ep:35\nmsgid \"Hello,\\\\n\\\\nHere's some files I want to share with you:\\\\n\"\nmsgstr \"\"\n\"Привет,\\\\n\"\n\"\\\\n\"\n\"Тут парочка файлов, которыми я хотел с тобой поделиться:\\\\n\"\n\n#: themes/default/templates/mail.html.ep:35\nmsgid \"Here's some files\"\nmsgstr \"Тут несколько файлов\"\n\n#: themes/default/templates/partial/invitations.js.ep:7\nmsgid \"Hide hidden invitations\"\nmsgstr \"Скрыть спрятанные приглашения\"\n\n#: themes/default/templates/partial/index.js.ep:26\nmsgid \"Hit Enter, then Ctrl+C to copy all the download links\"\nmsgstr \"Нажми Enter, затем Ctrl+C, чтобы скопировать все ссылки на скачивание\"\n\n#: themes/default/templates/partial/index.js.ep:25\nmsgid \"Hit Enter, then Ctrl+C to copy the download link\"\nmsgstr \"Нажми Enter, затем Ctrl+C, чтобы скопировать ссылку на скачивание\"\n\n#: themes/default/templates/about.html.ep:9\nmsgid \"How does it work?\"\nmsgstr \"Как это работает?\"\n\n#: themes/default/templates/invitations/invite.html.ep:46\nmsgid \"How many days would you like the invitation to be valid?\"\nmsgstr \"На сколько дней приглашение должно быть действительным?\"\n\n#: themes/default/templates/about.html.ep:16\nmsgid \"How to install the software on my server?\"\nmsgstr \"Как установить эту программу на своем сервере?\"\n\n#: themes/default/templates/about.html.ep:12\nmsgid \"How to report an illegal file?\"\nmsgstr \"Как сообщить о нелегальном файле?\"\n\n#: themes/default/templates/delays.html.ep:7\nmsgid \"If you choose a delay, the file will be deleted after that delay.\"\nmsgstr \"Если выберите срок, тогда файл будет удален по его истечению.\"\n\n#: themes/default/templates/mail.html.ep:15\nmsgid \"If you send the mail from this server, the links will be sent to the server, which may lower your privacy protection.\"\nmsgstr \"\"\n\"Если выслать письма с этого сервера, то ссылки будут отправлены на сервер, \"\n\"что может негативно повлиять на конфиденциальность.\"\n\n#: themes/default/templates/files.html.ep:14\nmsgid \"Import localStorage data\"\nmsgstr \"Импортировать данные localStorage\"\n\n#: themes/default/templates/index.html.ep:53\nmsgid \"Important: more information on delays\"\nmsgstr \"Важно: подробнее о сроках\"\n\n#: themes/default/templates/delays.html.ep:5\nmsgid \"Information about delays\"\nmsgstr \"Информация о сроках истечения\"\n\n#: themes/default/templates/files.html.ep:18 themes/default/templates/invitations/my_invitations.html.ep:12\nmsgid \"Invert selection\"\nmsgstr \"Инвертировать выбор\"\n\n#. ($i->guest_mail, $url)\n#: lib/Lufi/Controller/Invitation.pm:171\nmsgid \"Invitation resent to %1.<br> URL: %2\"\nmsgstr \"Приглашение переотправлено на %1.<br> Ссылка: %2\"\n\n#. ($invitation->guest_mail, $url)\n#: lib/Lufi/Controller/Invitation.pm:87\nmsgid \"Invitation sent to %1.<br> URL: %2\"\nmsgstr \"Приглашение отправлено на %1.<br> Ссылка: %2\"\n\n#: themes/default/templates/invitations/invite.html.ep:27 themes/default/templates/layouts/default.html.ep:36 themes/default/templates/layouts/default.html.ep:69\nmsgid \"Invite a guest\"\nmsgstr \"Пригласить гостя\"\n\n#: themes/default/templates/partial/render.js.ep:6\nmsgid \"It seems that the key in your URL is incorrect. Please, verify your URL.\"\nmsgstr \"\"\n\"Похоже, что ключ в твоей ссылке неправилен. Пожалуйста, перепроверь ссылку.\"\n\n#: themes/default/templates/index.html.ep:12\nmsgid \"Javascript is disabled. You won't be able to use Lufi.\"\nmsgstr \"Javascript отключен. Без него не получится пользоваться Lufi.\"\n\n#: themes/default/templates/layouts/default.html.ep:44 themes/default/templates/layouts/default.html.ep:46 themes/default/templates/layouts/default.html.ep:77 themes/default/templates/layouts/default.html.ep:79\nmsgid \"Language\"\nmsgstr \"Язык\"\n\n#. (sprintf('<a href=\"https://framagit.org/fiat-tux/hat-softwares/lufi/-/commit/%s\" class=\"classic\">%s</a>', stash('version')\n#: themes/default/templates/about.html.ep:22\nmsgid \"Latest commit of this instance: %1\"\nmsgstr \"Последний коммит этого экземпляра: %1\"\n\n#. (sprintf('<a href=\"https://framagit.org/fiat-tux/hat-softwares/lufi/-/releases/%s\" class=\"classic\">%s</a>', stash('version')\n#: themes/default/templates/about.html.ep:21\nmsgid \"Latest tag of this instance: %1\"\nmsgstr \"Последний тег этого экземпляра: %1\"\n\n#: themes/default/templates/login.html.ep:15\nmsgid \"Login\"\nmsgstr \"Войти\"\n\n#: themes/default/templates/layouts/default.html.ep:58 themes/default/templates/layouts/default.html.ep:91\nmsgid \"Logout\"\nmsgstr \"Выйти\"\n\n#: themes/default/templates/about.html.ep:4\nmsgid \"Lufi is a free (as in free speech) file hosting software.\"\nmsgstr \"\"\n\"Lufi — свободное (как свобода слова) программное обеспечение для хостинга \"\n\"файлов.\"\n\n#: themes/default/templates/partial/files.js.ep:12\nmsgid \"Lufi recently changed its way to store files information.\\\\n\\\\nNo files have been found in the new localStorage location but we found files in the old one.\\\\nDo you want to import those informations?\\\\n\\\\nPlease note that this is the only time that we will ask you this.\"\nmsgstr \"\"\n\"Lufi недавно изменил способ хранения информации о файлах.\\\\n\"\n\"\\\\n\"\n\"Никакие файлы не были обнаружены в новом месте внутри localStorage, но зато \"\n\"какие-то нашлись в старом месте.\\\\n\"\n\"Стоит ли импортировать ту информацию?\\\\n\"\n\"\\\\n\"\n\"Обращаем внимание, что больше мы об этом спрашивать не будем.\"\n\n#: themes/default/templates/files.html.ep:34\nmsgid \"Mail\"\nmsgstr \"Эл. адрес\"\n\n#: themes/default/templates/files.html.ep:3 themes/default/templates/layouts/default.html.ep:34 themes/default/templates/layouts/default.html.ep:67\nmsgid \"My files\"\nmsgstr \"Мои файлы\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:5 themes/default/templates/layouts/default.html.ep:37 themes/default/templates/layouts/default.html.ep:70\nmsgid \"My invitations\"\nmsgstr \"Мои приглашения\"\n\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:17\nmsgid \"NB: this list includes the list of files that have already been sent to you.\"\nmsgstr \"\"\n\"Напоминание: Этот список содержит список файлов, которые уже были тебе \"\n\"отправлены.\"\n\n#: themes/default/templates/index.html.ep:115\nmsgid \"Name of the zip file\"\nmsgstr \"Название zip-файла\"\n\n#. (format_bytes($json->{size})\n#: lib/Lufi/Controller/Files.pm:109\nmsgid \"No enough space available on the server for this file (size: %1).\"\nmsgstr \"На сервере недостаточно места для этого файла (размер: %1).\"\n\n#: themes/default/templates/partial/files.js.ep:10 themes/default/templates/partial/index.js.ep:29\nmsgid \"No expiration delay\"\nmsgstr \"Без срока истечения\"\n\n#: themes/default/templates/files.html.ep:8\nmsgid \"Only the files sent with this browser will be listed here. This list is stored in localStorage: if you delete your localStorage data, you'll lose this list.\"\nmsgstr \"\"\n\"Тут будут показаны только файлы отправленные через этот браузер. Этот список \"\n\"находится в localStorage: если вы очистите данные в localStorage, то список \"\n\"будет удалён.\"\n\n#: themes/default/templates/index.html.ep:106 themes/default/templates/login.html.ep:21 themes/default/templates/render.html.ep:26\nmsgid \"Password\"\nmsgstr \"Пароль\"\n\n#. (config('contact')\n#: themes/default/templates/about.html.ep:13\nmsgid \"Please contact the administrator: %1\"\nmsgstr \"Пожалуйста, свяжитесь с администратором: %1\"\n\n#: themes/default/templates/render.html.ep:33\nmsgid \"Please wait while we are getting your file. We first need to download and decrypt all parts before you can get it.\"\nmsgstr \"\"\n\"Пожалуйста, подождите пока мы не получим ваш файл. Нам сначала надо его \"\n\"скачать и дешифровать все его части, перед тем как вы сможете его получить.\"\n\n#: lib/Lufi/Controller/Auth.pm:38\nmsgid \"Please, check your credentials or your right to access this service: unable to authenticate.\"\nmsgstr \"\"\n\"Пожалуйста, проверь свои данные для входа или права на доступ к сервису: \"\n\"аутентификация не удалась.\"\n\n#: themes/default/templates/about.html.ep:5\nmsgid \"Privacy\"\nmsgstr \"Конфиденциальность\"\n\n#: themes/default/templates/files.html.ep:13\nmsgid \"Purge expired files from localStorage\"\nmsgstr \"Очистить localStorage от истекших файлов\"\n\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:20\nmsgid \"Regards,\"\nmsgstr \"Всего хорошего,\"\n\n#: themes/default/templates/invitations/invite.mail.ep:15\nmsgid \"Regards.\"\nmsgstr \"Всего хорошего.\"\n\n#: themes/default/templates/layouts/default.html.ep:31 themes/default/templates/layouts/default.html.ep:64\nmsgid \"Report file\"\nmsgstr \"Пожаловаться на файл\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:15\nmsgid \"Resend invitation mail\"\nmsgstr \"Переслать пригласительное письмо\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:9\nmsgid \"Rows in purple mean that the invitations have expired.\"\nmsgstr \"Фиолетовые строки означают, что приглашение истекло.\"\n\n#: themes/default/templates/files.html.ep:9\nmsgid \"Rows in red mean that the files have expired and are no longer available.\"\nmsgstr \"Красные строки означают, что файлы истекли и более не доступны.\"\n\n#: themes/default/templates/partial/index.js.ep:27\nmsgid \"Send all links by email\"\nmsgstr \"Отправить все ссылки по почте\"\n\n#: themes/default/templates/invitations/invite.html.ep:50\nmsgid \"Send the invitation\"\nmsgstr \"Отправить приглашение\"\n\n#: themes/default/templates/mail.html.ep:46\nmsgid \"Send with this server\"\nmsgstr \"Отправить с этого сервера\"\n\n#: themes/default/templates/mail.html.ep:47\nmsgid \"Send with your own mail software\"\nmsgstr \"Отправить через свой почтовый клиент\"\n\n#: themes/default/templates/partial/index.js.ep:30\nmsgid \"Sending part XX1 of XX2. Please, be patient, the progress bar can take a while to move.\"\nmsgstr \"\"\n\"Шлю часть XX1 из XX2. Пожалуйста, наберись терпения, индикатор прогресса \"\n\"может долгое время не двигаться.\"\n\n#. (url_for('/')\n#: themes/default/templates/partial/mail.js.ep:48\nmsgid \"Share your files in total privacy on %1\"\nmsgstr \"Поделись своими файлами в полной секретности на %1\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:13 themes/default/templates/partial/invitations.js.ep:9\nmsgid \"Show hidden invitations\"\nmsgstr \"Показать спрятанные приглашения\"\n\n#: themes/default/templates/partial/render.js.ep:12\nmsgid \"Show zip content\"\nmsgstr \"Показать данные в zip\"\n\n#: themes/default/templates/layouts/default.html.ep:40 themes/default/templates/layouts/default.html.ep:73 themes/default/templates/login.html.ep:28 themes/default/templates/logout.html.ep:17\nmsgid \"Signin\"\nmsgstr \"Войти\"\n\n#: lib/Lufi/Controller/Invitation.pm:283 themes/default/templates/invitations/exception.html.ep:16\nmsgid \"Sorry, the invitation doesn’t exist. Are you sure you are on the right URL?\"\nmsgstr \"Извините, этого приглашения не существует. Вы точно на правильном URL?\"\n\n#: themes/default/templates/index.html.ep:46\nmsgid \"Sorry, the uploading is currently disabled. Please try again later.\"\nmsgstr \"Извини, загрузка сейчас отключена. Пожалуйста, попытайся попозже.\"\n\n#: lib/Lufi/Controller/Files.pm:82\nmsgid \"Sorry, uploading is disabled.\"\nmsgstr \"Извини, загрузка отключена.\"\n\n#: themes/default/templates/invitations/exception.html.ep:7\nmsgid \"Sorry, your invitation has expired or has been deleted.\"\nmsgstr \"Извини, твое приглашение истекло или было удалено.\"\n\n#. ($invit->ldap_user_mail)\n#: lib/Lufi/Controller/Files.pm:123\nmsgid \"Sorry, your invitation has expired or has been deleted. Please contact %1 to have another invitation.\"\nmsgstr \"\"\n\"Извини, твое приглашение истекло или было удалено. Пожалуйста, попроси %1 \"\n\"выдать новое приглашение.\"\n\n#. ($invitation->ldap_user_mail)\n#: lib/Lufi/Controller/Invitation.pm:276\nmsgid \"The URLs of your files have been sent by email to %1.\"\nmsgstr \"Ссылки на твои файлы были высланы по почте на %1.\"\n\n#: themes/default/templates/about.html.ep:7\nmsgid \"The administrator can only see the file's name, its size and its mimetype (what kind of file it is: video, text, etc.).\"\nmsgstr \"\"\n\"Администратор только может видеть название файла, размер и его MIME-тип (\"\n\"какой это тип файла: видео, текст и т.п.).\"\n\n#: lib/Lufi/Controller/Mail.pm:53\nmsgid \"The body of the mail must contain at least one URL pointing to a file hosted on this instance.\"\nmsgstr \"\"\n\"Текст письма должен как минимум содержать одну ссылку на файл с этого \"\n\"сервера.\"\n\n#: themes/default/templates/partial/files.js.ep:11\nmsgid \"The data has been successfully imported.\"\nmsgstr \"Данные успешно импортированы.\"\n\n#: lib/Lufi/Controller/Mail.pm:73\nmsgid \"The email body can't be empty.\"\nmsgstr \"Текст письма не может быть пуст.\"\n\n#: lib/Lufi/Controller/Mail.pm:72\nmsgid \"The email subject can't be empty.\"\nmsgstr \"Тема письма не может быть пуста.\"\n\n#. ($expire_at, $max_expire_at)\n#: lib/Lufi/Controller/Invitation.pm:51\nmsgid \"The expiration delay (%1) is not between 1 and %2 days.\"\nmsgstr \"Срок истечения (%1) не между 1 и %2 днями.\"\n\n#: lib/Lufi/Controller/Files.pm:462\nmsgid \"The file has already been deleted\"\nmsgstr \"Файл был уже удален\"\n\n#: themes/default/templates/about.html.ep:6\nmsgid \"The files uploaded on a Lufi instance are encrypted before the upload to the server: the administrator of the server can not see the file's content.\"\nmsgstr \"\"\n\"Файлы загружаемые на экземпляры Lufi шифруются перед отправкой на сервер: \"\n\"администратор сервера не сможет увидеть данные внутри файла.\"\n\n#. (join(', ', @bad)\n#: lib/Lufi/Controller/Mail.pm:68\nmsgid \"The following email addresses are not valid: %1\"\nmsgstr \"Следующие эл. адреса недействительны: %1\"\n\n#. ($guest_mail)\n#: lib/Lufi/Controller/Invitation.pm:48\nmsgid \"The guest email address (%1) is unvalid.\"\nmsgstr \"Эл. адрес гостя (%1) недействителен.\"\n\n#. ($i->token, $i->guest_mail)\n#: lib/Lufi/Controller/Invitation.pm:150\nmsgid \"The invitation %1 can’t be resent: %2 has already sent files.<br>Please create a new invitation.\"\nmsgstr \"\"\n\"Приглашение на %1 не может быть отправлено: %2 уже отправлял(а) \"\n\"файлы.<br>Пожалуйста, создай новое приглашение.\"\n\n#. ($i->token)\n#: lib/Lufi/Controller/Invitation.pm:130\nmsgid \"The invitation %1 has been deleted.\"\nmsgstr \"Приглашение %1 было удалено.\"\n\n#. (stash('user_mail')\n#: themes/default/templates/invitations/invite.html.ep:34\nmsgid \"The invitation mail will be send from your email address (%1).\"\nmsgstr \"Письмо с приглашением будет отправлено с твоего эл. адреса (%1).\"\n\n#: themes/default/templates/partial/index.js.ep:16\nmsgid \"The link(s) has been copied to your clipboard\"\nmsgstr \"Ссылка(-и) скопированы в буфер обмена\"\n\n#. (stash('invitation')\n#: themes/default/templates/index.html.ep:30\nmsgid \"The link(s) of your file(s) will automatically be sent by mail to %1 (%2)\"\nmsgstr \"\"\n\"Ссылка(-и) на твой файл(ы) будут автоматически отправлены по почте %1 (%2)\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:11\nmsgid \"The links of your file(s) will automatically be sent by mail to %1.\"\nmsgstr \"Ссылка(-и) на твой файл(ы) будут автоматически отправлены по почте %1.\"\n\n#: lib/Lufi/Controller/Mail.pm:97\nmsgid \"The mail has been sent.\"\nmsgstr \"Письмо было отправлено.\"\n\n#: themes/default/templates/about.html.ep:15\nmsgid \"The original (and only for now) author is <a href=\\\"https://fiat-tux.fr\\\" class=\\\"classic\\\">Luc Didry</a>.\"\nmsgstr \"\"\n\"Изначальный (и пока единственный) автор: <a href=\\\"https://fiat-tux.fr\\\" \"\n\"class=\\\"classic\\\">Luc Didry (Люк Дидри)</a>.\"\n\n#: lib/Lufi/Controller/Files.pm:230\nmsgid \"The server was unable to find the file record to add your file part to. Please, contact the administrator.\"\nmsgstr \"\"\n\"Сервер не смог найти запись о файле, чтобы добавить твою часть файла. \"\n\"Пожалуйста, свяжитесь с администратором.\"\n\n#: lib/Lufi/Controller/Files.pm:289\nmsgid \"This file has been deactivated by the admins. Contact them to know why.\"\nmsgstr \"\"\n\"Файл был деактивирован администратором. Свяжитесь с администратором, чтобы \"\n\"узнать почему.\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:46 themes/default/templates/partial/invitations.js.ep:6\nmsgid \"This invitation is normally hidden\"\nmsgstr \"Это приглашение обычно спрятано\"\n\n#. (stash('expires')\n#: themes/default/templates/invitations/invite.mail.ep:13\nmsgid \"This invitation is valid until %1.\"\nmsgstr \"Приглашение работает до %1.\"\n\n#: themes/default/templates/delays.html.ep:10\nmsgid \"This server sets limitations according to the file size. The expiration delay of your file will be the minimum between what you choose and the following limitations:\"\nmsgstr \"\"\n\"Этот сервер задает ограничения связанные с размером файла. Срок истечения \"\n\"будет тем наименьшим значением, между тем что вы выберете и следующими \"\n\"ограничениями:\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:16\nmsgid \"Toggle visibility\"\nmsgstr \"Переключить видимость\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:25\nmsgid \"URL\"\nmsgstr \"URL\"\n\n#: themes/default/templates/partial/index.js.ep:17\nmsgid \"Unable to copy the link(s) to your clipboard\"\nmsgstr \"Не удалось скопировать ссылку(-и) в буфер обмена\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:433\nmsgid \"Unable to get counter for %1. The file does not exists. It will be removed from your localStorage.\"\nmsgstr \"\"\n\"Не удалось получить счетчик для %1. Этого файла нет. Запись будет удалена из \"\n\"твоего localStorage.\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:423\nmsgid \"Unable to get counter for %1. The token is invalid.\"\nmsgstr \"Не удалось получить счетчик для %1. Токен недействителен.\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:443\nmsgid \"Unable to get counter for %1. You are not authenticated.\"\nmsgstr \"Не удалось получить счетчик для %1. Вы не залогинены.\"\n\n#: themes/default/templates/layouts/default.html.ep:33 themes/default/templates/layouts/default.html.ep:66\nmsgid \"Upload files\"\nmsgstr \"Загрузить файлы\"\n\n#: themes/default/templates/index.html.ep:145\nmsgid \"Upload generated zip file\"\nmsgstr \"Загрузить сгенерированный zip-файл\"\n\n#: themes/default/templates/files.html.ep:31\nmsgid \"Uploaded at\"\nmsgstr \"Загружено\"\n\n#: themes/default/templates/index.html.ep:153\nmsgid \"Uploaded files\"\nmsgstr \"Загруженные файлы\"\n\n#: themes/default/templates/about.html.ep:20\nmsgid \"Version\"\nmsgstr \"Версия\"\n\n#: themes/default/templates/partial/index.js.ep:31\nmsgid \"Websocket communication error\"\nmsgstr \"Ошибка связи Websocket\"\n\n#: themes/default/templates/about.html.ep:3\nmsgid \"What is Lufi?\"\nmsgstr \"Что такое Lufi?\"\n\n#: themes/default/templates/about.html.ep:14\nmsgid \"Who wrote this software?\"\nmsgstr \"Кто написал эту программу?\"\n\n#: themes/default/templates/partial/index.js.ep:13\nmsgid \"XXX file has been added to upload queue.\"\nmsgstr \"XXX файл был добавлен в очередь загрузки.\"\n\n#: themes/default/templates/invitations/invite.html.ep:30\nmsgid \"You can invite someone to send you files through this Lufi instance even if they don’t have an account on it.\"\nmsgstr \"\"\n\"Вы можете пригласить кого-нибудь прислать вам файлы через этот Lufi-сервер, \"\n\"даже если у них нету здесь аккаунта.\"\n\n#: themes/default/templates/about.html.ep:11\nmsgid \"You can see the list of your files by clicking on the \\\"My files\\\" link at the top right of this page.\"\nmsgstr \"\"\n\"Вы можете просмотреть список своих файлов нажав на кнопку \\\"Мои файлы\\\" в \"\n\"правом верхнем углу страницы.\"\n\n#: lib/Lufi/Controller/Mail.pm:42\nmsgid \"You can't add URLs that are not related to this instance.\"\nmsgstr \"Нельзя добавить ссылки, которые не относятся к этому серверу.\"\n\n#: themes/default/templates/about.html.ep:8\nmsgid \"You don't need to register yourself to upload files but be aware that, for legal reasons, your IP address will be stored when you send a file. Don't panic, this is normally the case for all sites on which you send files.\"\nmsgstr \"\"\n\"Тут не нужна регистрация (или СМС) для загрузки файлов, но знай, что по \"\n\"правовым причинам при отправке файлов ваш IP-адрес будет сохраняться. Без \"\n\"паники, это обычно верно для всех сайтов, где вы передаете файлы.\"\n\n#: themes/default/templates/partial/render.js.ep:11\nmsgid \"You don't seem to have a key in your URL. You won't be able to decrypt the file. Download canceled.\"\nmsgstr \"\"\n\"В твоей ссылке вроде нету ключа. Так не удастся расшифровать файл. \"\n\"Скачивание отменено.\"\n\n#: themes/default/templates/partial/render.js.ep:7\nmsgid \"You have attempted to leave this page. The download will be canceled. Are you sure?\"\nmsgstr \"Вы попытались уйти со страницы. Скачивание будет отменено. Уверены?\"\n\n#: themes/default/templates/partial/index.js.ep:14\nmsgid \"You have attempted to leave this page. The upload will be canceled. Are you sure?\"\nmsgstr \"Вы попытались уйти со страницы. Загрузка будет отменена. Уверены?\"\n\n#: themes/default/templates/logout.html.ep:14\nmsgid \"You have been successfully logged out.\"\nmsgstr \"Вы успешно вышли.\"\n\n#: lib/Lufi/Controller/Mail.pm:71\nmsgid \"You must give email addresses.\"\nmsgstr \"Вы должны ввести эл. адреса.\"\n\n#: themes/default/templates/index.html.ep:38\nmsgid \"Your browser does not have enough entropy to generate a strong encryption key. Please wait (it's better if you do things on your computer while waiting).\"\nmsgstr \"\"\n\"У вашего браузера нехватает энтропии для генерации стойкого ключа \"\n\"шифрования. Пожалуйста, подождите (даже лучше если вы пока займётесь чем-\"\n\"нибудь другим на компьютере).\"\n\n#. (format_bytes($json->{size})\n#: lib/Lufi/Controller/Files.pm:95\nmsgid \"Your file is too big: %1 (maximum size allowed: %2)\"\nmsgstr \"Ваш файл слишком большой: %1 (маскимально разрешённый размер: %2)\"\n\n#: lib/Lufi/Controller/Files.pm:345\nmsgid \"Your password is not valid. Please refresh the page to retry.\"\nmsgstr \"\"\n\"Ваш пароль недействителен. Пожалуйста, перезагрузите страницу и попробуйте \"\n\"снова.\"\n\n#: themes/default/templates/partial/render.js.ep:13\nmsgid \"Zip content:\"\nmsgstr \"Данные в Zip:\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:20\nmsgid \"between %1 and %2, the file will be kept %3 day(s).\"\nmsgstr \"между %1 и %2, файл будет храниться %3 день(дней).\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:22\nmsgid \"between %1 and %2, the file will be kept forever.\"\nmsgstr \"между %1 и %2, файл будет храниться вечно.\"\n\n#: themes/default/templates/partial/mail.js.ep:42\nmsgid \"deadline: \"\nmsgstr \"Срок: \"\n\n#: themes/default/templates/partial/invitations.js.ep:5\nmsgid \"expires on XXX\"\nmsgstr \"Истекает XXX\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:26\nmsgid \"for %1 and more, the file will be kept %2 day(s)\"\nmsgstr \"с %1 и выше, файл будет храниться %2 день(дней)\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:28\nmsgid \"for %1 and more, the file will be kept forever.\"\nmsgstr \"с %1 и выше, файл будет храниться вечно.\"\n\n#: themes/default/templates/index.html.ep:3\nmsgid \"no time limit\"\nmsgstr \"без ограничения по времени\"\n\n#: themes/default/templates/index.html.ep:124\nmsgid \"or\"\nmsgstr \"или\"\n\n#. ($e->{name}, format_bytes($e->{size})\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:12\nmsgid \"— %1 (%2), that will expire on %3\"\nmsgstr \"— %1 (%2), истечёт %3\"\n\n#. ($i->token, $c->current_user->{username})\n#: lib/Lufi/Controller/Invitation.pm:136\nmsgid \"The invitation %1 can’t be deleted: it wasn’t created by you (%2).\"\nmsgstr \"Приглашение %1 не может быть удалено: оно было создано не вами (%2).\"\n\n#. ($orig_uri)\n#: lib/Lufi/Controller/Mail.pm:43 lib/Lufi/Controller/Mail.pm:59\nmsgid \"You can't add URLs that are not related to this instance (%1).\"\nmsgstr \"Вы не можете добавлять ссылки, не связанные с этим сервером (%1).\"\n\n#: themes/default/templates/partial/render.js.ep:13\nmsgid \"Unable to download the file: too much unsuccessful attempts to open a websocket. Please, contact the administrator.\"\nmsgstr \"\"\n\"Не удаётся загрузить файл: очень много неуспешных попыток открыть websocket. \"\n\"Пожалуйста, свяжитесь с администратором.\"\n\n#. ($i->token, $c->current_user->{username})\n#: lib/Lufi/Controller/Invitation.pm:187\nmsgid \"The invitation %1 can’t be resent: it wasn’t created by you (%2).\"\nmsgstr \"\"\n\"Приглашение %1 не может быть переотправлено: оно было создано не вами (%2).\"\n"
  },
  {
    "path": "themes/default/lib/Lufi/I18N/sk.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\\n\"\n\"PO-Revision-Date: 2022-05-28 23:55+0000\\n\"\n\"Last-Translator: Jose Riha <jose1711@gmail.com>\\n\"\n\"Language-Team: Slovak <https://weblate.framasoft.org/projects/lufi/\"\n\"default-theme/sk/>\\n\"\n\"Language: sk\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\\n\"\n\"X-Generator: Weblate 4.12\\n\"\n\n#. ($delay)\n#. (max_delay)\n#: themes/default/templates/index.html.ep:56 themes/default/templates/index.html.ep:65 themes/default/templates/index.html.ep:66\nmsgid \"%1 days\"\nmsgstr \"%1 dní\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:2\nmsgid \"%1 invites you to send him/her files\"\nmsgstr \"%1 Vás pozýva, aby ste mu/jej poslali súbory\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:6\nmsgid \"%1 invites you to send him/her files through Lufi.\"\nmsgstr \"%1 Vás pozýva, aby ste mu/jej poslali súbory pomocou Lufi.\"\n\n#. (stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:4\nmsgid \"%1 sent you files\"\nmsgstr \"%1 Vám posiela súbory\"\n\n#. (stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:8\nmsgid \"%1 used your invitation to send you files:\"\nmsgstr \"%1 využil(a) pozvánku a posiela Vám súbory:\"\n\n#: lib/Lufi/Controller/Invitation.pm:172 lib/Lufi/Controller/Invitation.pm:85 themes/default/templates/invitations/my_invitations.html.ep:51 themes/default/templates/invitations/my_invitations.html.ep:52 themes/default/templates/invitations/my_invitations.html.ep:53 themes/default/templates/invitations/notification_files_sent.mail.ep:12\nmsgid \"%A %d %B %Y at %T\"\nmsgstr \"%A %d %B %Y o %T\"\n\n#: themes/default/templates/partial/index.js.ep:28\nmsgid \"(max size: XXX)\"\nmsgstr \"(max. veľkosť: XXX)\"\n\n#: themes/default/templates/index.html.ep:5\nmsgid \"1 year\"\nmsgstr \"1 rok\"\n\n#: themes/default/templates/index.html.ep:4 themes/default/templates/index.html.ep:65\nmsgid \"24 hours\"\nmsgstr \"24 hodín\"\n\n#: themes/default/templates/partial/mail.js.ep:40\nmsgid \":\"\nmsgstr \":\"\n\n#: themes/default/templates/render.html.ep:42\nmsgid \"Abort\"\nmsgstr \"Zrušiť\"\n\n#: themes/default/templates/layouts/default.html.ep:53 themes/default/templates/layouts/default.html.ep:86\nmsgid \"About\"\nmsgstr \"O programe\"\n\n#: themes/default/templates/index.html.ep:107\nmsgid \"Add a password to file(s)\"\nmsgstr \"Pridať heslo pre súbor(y)\"\n\n#: themes/default/templates/mail.html.ep:16\nmsgid \"Adding URLs not related to this Lufi instance to the mail body or subject is prohibited.\"\nmsgstr \"\"\n\"Nie je povolené pridávanie adries URL do tela alebo predmetu e-mailu, ak \"\n\"neodkazujú na túto inštanciu Lufi.\"\n\n#: themes/default/templates/partial/invitations.js.ep:3\nmsgid \"Are you sure you want to delete the selected invitations?\"\nmsgstr \"Naozaj chcete odstrániť vybrané pozvánky?\"\n\n#: themes/default/templates/partial/invitations.js.ep:4\nmsgid \"Are you sure you want to resend the invitation mail for the selected invitations?\"\nmsgstr \"Naozaj chcete opätovné odoslať e-mail s pozvánku pre vybrané pozvánky?\"\n\n#: themes/default/templates/about.html.ep:17\nmsgid \"As Lufi is a free software licensed under of the terms of the <a href=\\\"https://gnu.org/licenses/agpl.html\\\" class=\\\"classic\\\">AGPLv3</a>, you can install it on you own server. Have a look on the <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi/wikis/home\\\" class=\\\"classic\\\">Wiki</a> for the procedure.\"\nmsgstr \"\"\n\"Keďže Lufi je slobodný softvér šírený podľa podmienok <a href=\\\"https://gnu.\"\n\"org/licenses/agpl.html\\\" class=\\\"classic\\\">AGPLv3</a>, môžete ho \"\n\"nainštalovať na Váš vlastný server. Navštívte <a href=\\\"https://framagit.org/\"\n\"fiat-tux/hat-softwares/lufi/wikis/home\\\" class=\\\"classic\\\">Wiki</a>, kde je \"\n\"nájdete postup.\"\n\n#. (stash('nbslices')\n#: themes/default/templates/partial/render.js.ep:10\nmsgid \"Asking for file part XX1 of %1\"\nmsgstr \"Žiadam časť súboru XX1 z %1\"\n\n#: themes/default/templates/about.html.ep:23\nmsgid \"Back to homepage\"\nmsgstr \"Späť na domovskú stránku\"\n\n#: lib/Lufi/Controller/Mail.pm:26\nmsgid \"Bad CSRF token!\"\nmsgstr \"Neplatný CSRF token!\"\n\n#: lib/Lufi/Controller/Auth.pm:27 lib/Lufi/Controller/Auth.pm:49\nmsgid \"Bad CSRF token.\"\nmsgstr \"Neplatný CSRF token.\"\n\n#: themes/default/templates/partial/render.js.ep:5\nmsgid \"Click here to refresh the page and restart the download.\"\nmsgstr \"Kliknite sem pre obnovenie stránky a opätovné spustenie sťahovania.\"\n\n#: themes/default/templates/invitations/invite.mail.ep:8\nmsgid \"Click on the following URL to upload files on Lufi:\"\nmsgstr \"Kliknite na nasledovnú adresu URL pre nahratie súborov do Lufi:\"\n\n#: themes/default/templates/index.html.ep:126\nmsgid \"Click to open the file browser\"\nmsgstr \"Kliknite pre otvorenie prehliadača súborov\"\n\n#: themes/default/templates/delays.html.ep:42 themes/default/templates/invitations/my_invitations.html.ep:80\nmsgid \"Close\"\nmsgstr \"Zavrieť\"\n\n#: themes/default/templates/mail.html.ep:23\nmsgid \"Comma-separated email addresses\"\nmsgstr \"Čiarkou oddelený zoznam e-mailových adries\"\n\n#: themes/default/templates/index.html.ep:140\nmsgid \"Compressing zip file…\"\nmsgstr \"Komprimujem súbor zip…\"\n\n#: themes/default/templates/partial/index.js.ep:15\nmsgid \"Copy all links to clipboard\"\nmsgstr \"Kopírovať všetky odkazy do schránky\"\n\n#: themes/default/templates/partial/index.js.ep:18\nmsgid \"Copy to clipboard\"\nmsgstr \"Kopírovať do schránky\"\n\n#: lib/Lufi/Controller/Files.pm:501\nmsgid \"Could not delete the file. You are not authenticated.\"\nmsgstr \"Nepodarilo sa odstrániť súbor. Nie ste prihlásený.\"\n\n#: lib/Lufi/Controller/Files.pm:483\nmsgid \"Could not find the file. Are you sure of the URL and the token?\"\nmsgstr \"Súbor sa nenašiel. Zadali ste správnu adresu URL a token?\"\n\n#: lib/Lufi/Controller/Files.pm:394\nmsgid \"Could not find the file. Are you sure of the URL?\"\nmsgstr \"Súbor sa nenašiel. Zadali ste správnu adres URL?\"\n\n#: themes/default/templates/files.html.ep:29\nmsgid \"Counter\"\nmsgstr \"Počítadlo\"\n\n#: themes/default/templates/index.html.ep:100\nmsgid \"Create a zip archive with the files before uploading?\"\nmsgstr \"Vytvoriť zip archív so súbormi pred nahratím?\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:26\nmsgid \"Created at\"\nmsgstr \"Vytvorené\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:14\nmsgid \"Delete\"\nmsgstr \"Odstrániť\"\n\n#: themes/default/templates/files.html.ep:30 themes/default/templates/index.html.ep:90\nmsgid \"Delete at first download?\"\nmsgstr \"Odstrániť po prvom stiahnutí?\"\n\n#: themes/default/templates/files.html.ep:19\nmsgid \"Delete selected files\"\nmsgstr \"Odstrániť vybrané súbory\"\n\n#: themes/default/templates/files.html.ep:33 themes/default/templates/partial/index.js.ep:19\nmsgid \"Deletion link\"\nmsgstr \"Odkaz na odstránenie\"\n\n#: themes/default/templates/delays.html.ep:9\nmsgid \"Don't worry: if a user begins to download the file before the expiration and the download ends after the expiration, he will be able to get the file.\"\nmsgstr \"\"\n\"Nerobte si starosti: ak používateľ začne súbor sťahovať pred vypršaním jeho \"\n\"platnosti a sťahovanie skončí po jej skončení, súbor stále získa.\"\n\n#: themes/default/templates/partial/index.js.ep:21 themes/default/templates/render.html.ep:28\nmsgid \"Download\"\nmsgstr \"Stiahnuť\"\n\n#: themes/default/templates/partial/render.js.ep:4\nmsgid \"Download aborted.\"\nmsgstr \"Sťahovanie zrušené.\"\n\n#: themes/default/templates/files.html.ep:28 themes/default/templates/partial/index.js.ep:20\nmsgid \"Download link\"\nmsgstr \"Odkaz na stiahnutie\"\n\n#: themes/default/templates/about.html.ep:10\nmsgid \"Drag and drop files in the appropriate area or use the traditional way to send files and the files will be chunked, encrypted and sent to the server. You will get two links per file: a download link, that you give to the people you want to share the file with and a deletion link, allowing you to delete the file whenever you want.\"\nmsgstr \"\"\n\"Potiahnite do tejto oblasti súbory alebo ich pridajte tradičným spôsobom. \"\n\"Súbory budú následne rozdelené, zašifrované a odoslané na server. Pre každý \"\n\"súbor obdržíte dva odkazy: odkaz na stiahnutie, ktorý odošlete ľuďom, s \"\n\"ktorými chcete zdieľať súbor a odkaz na stiahnutie, ktorý Vám umožní \"\n\"kedykoľvek súbor odstrániť.\"\n\n#: themes/default/templates/index.html.ep:122\nmsgid \"Drop files here\"\nmsgstr \"Potiahnite súbory sem\"\n\n#: themes/default/templates/invitations/invite.html.ep:40\nmsgid \"Email address of your guest\"\nmsgstr \"E-mailová adresa Vášho hosťa\"\n\n#: themes/default/templates/mail.html.ep:39\nmsgid \"Email body\"\nmsgstr \"Telo e-mailu\"\n\n#: themes/default/templates/mail.html.ep:31\nmsgid \"Email subject\"\nmsgstr \"Predmet e-mailu\"\n\n#: themes/default/templates/mail.html.ep:25 themes/default/templates/mail.html.ep:27\nmsgid \"Emails\"\nmsgstr \"E-maily\"\n\n#: themes/default/templates/partial/index.js.ep:22\nmsgid \"Encrypting part XX1 of XX2\"\nmsgstr \"Šifrujem časť XX1 z XX2\"\n\n#: lib/Lufi/Controller/Files.pm:283\nmsgid \"Error: the file existed but was deleted.\"\nmsgstr \"Chyba: súbor existoval, ale bol odstránený.\"\n\n#: lib/Lufi/Controller/Files.pm:363\nmsgid \"Error: the file has not been sent entirely.\"\nmsgstr \"Chyba: súbor nebol odoslaný celý.\"\n\n#: lib/Lufi/Controller/Files.pm:373\nmsgid \"Error: unable to find the file. Are you sure of your URL?\"\nmsgstr \"Chyba: súbor sa nenašiel. Máte správnu adresu URL?\"\n\n#: themes/default/templates/partial/index.js.ep:23\nmsgid \"Expiration:\"\nmsgstr \"Platnosť:\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:27\nmsgid \"Expire at\"\nmsgstr \"Platnosť končí\"\n\n#: themes/default/templates/files.html.ep:32\nmsgid \"Expires at\"\nmsgstr \"Platnosť končí\"\n\n#: themes/default/templates/files.html.ep:12\nmsgid \"Export localStorage data\"\nmsgstr \"Exportovať údaje z localStorage\"\n\n#: lib/Lufi/Controller/Files.pm:465\nmsgid \"File deleted\"\nmsgstr \"Súbol bol odstránený\"\n\n#: themes/default/templates/partial/render.js.ep:9\nmsgid \"File downloaded\"\nmsgstr \"Súbor bol stiahnutý\"\n\n#: themes/default/templates/files.html.ep:27\nmsgid \"File name\"\nmsgstr \"Názov súboru\"\n\n#: themes/default/templates/partial/index.js.ep:24\nmsgid \"File uploaded\"\nmsgstr \"Súbol bol nahratý\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:61\nmsgid \"Files\"\nmsgstr \"Súbory\"\n\n#: themes/default/templates/index.html.ep:80\nmsgid \"Files deleted at first download\"\nmsgstr \"Súbory odstránené po prvom stiahnutí\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:28\nmsgid \"Files sent at\"\nmsgstr \"Súbory odoslané\"\n\n#: themes/default/templates/partial/invitations.js.ep:8\nmsgid \"Files sent in invitation XX1 by XX2\"\nmsgstr \"Súbory odoslané v pozvánke XX1 od XX2\"\n\n#: themes/default/templates/partial/render.js.ep:8\nmsgid \"Get the file\"\nmsgstr \"Stiahnuť súbor\"\n\n#: themes/default/templates/about.html.ep:18\nmsgid \"Get the source code on <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi\\\" class=\\\"classic\\\">the official repository</a> or on its <a href=\\\"https://github.com/ldidry/lufi\\\" class=\\\"classic\\\">Github mirror</a>\"\nmsgstr \"\"\n\"Získajte zdrojový kód z <a href=\\\"https://framagit.org/fiat-tux/\"\n\"hat-softwares/lufi\\\" class=\\\"classic\\\">oficiálneho repozitára</a> alebo z \"\n\"jeho <a href=\\\"https://github.com/ldidry/lufi\\\" class=\\\"classic\\\">kópie na \"\n\"Githube</a>.\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:24\nmsgid \"Guest mail\"\nmsgstr \"E-mail hosťa\"\n\n#. (ucfirst(stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:6\nmsgid \"Hello %1,\"\nmsgstr \"Ahoj %1,\"\n\n#: themes/default/templates/invitations/invite.mail.ep:4\nmsgid \"Hello,\"\nmsgstr \"Ahoj,\"\n\n#: themes/default/templates/partial/mail.js.ep:35\nmsgid \"Hello,\\\\n\\\\nHere's some files I want to share with you:\\\\n\"\nmsgstr \"\"\n\"Ahoj,\\\\n\"\n\"\\\\n\"\n\"Tu je zopár súborov, ktoré chcem s Vami zdieľať:\\\\n\"\n\n#: themes/default/templates/mail.html.ep:35\nmsgid \"Here's some files\"\nmsgstr \"Tu je zopár súborov\"\n\n#: themes/default/templates/partial/invitations.js.ep:7\nmsgid \"Hide hidden invitations\"\nmsgstr \"Skryť skryté pozvánky\"\n\n#: themes/default/templates/partial/index.js.ep:26\nmsgid \"Hit Enter, then Ctrl+C to copy all the download links\"\nmsgstr \"\"\n\"Stlačte Enter a potom použite Ctrl+C na skopírovanie všetkých odkazov na \"\n\"stiahnutie\"\n\n#: themes/default/templates/partial/index.js.ep:25\nmsgid \"Hit Enter, then Ctrl+C to copy the download link\"\nmsgstr \"\"\n\"Stlačte Enter a potom použite Ctrl-C na skopírovanie odkazu na stiahnutie\"\n\n#: themes/default/templates/about.html.ep:9\nmsgid \"How does it work?\"\nmsgstr \"Ako to funguje?\"\n\n#: themes/default/templates/invitations/invite.html.ep:46\nmsgid \"How many days would you like the invitation to be valid?\"\nmsgstr \"Koľko dní má pozvánka platiť?\"\n\n#: themes/default/templates/about.html.ep:16\nmsgid \"How to install the software on my server?\"\nmsgstr \"Ako si nainštalujem softvér na vlastný server?\"\n\n#: themes/default/templates/about.html.ep:12\nmsgid \"How to report an illegal file?\"\nmsgstr \"Ako nahlásiť nelegálny súbor?\"\n\n#: themes/default/templates/delays.html.ep:8\nmsgid \"If you choose a delay, the file will be deleted after that delay.\"\nmsgstr \"Ak vyberiete dobu platnosti, súbor bude po jej uplynutí odstránený.\"\n\n#: themes/default/templates/mail.html.ep:15\nmsgid \"If you send the mail from this server, the links will be sent to the server, which may lower your privacy protection.\"\nmsgstr \"\"\n\"Ak odošlete e-mail z tohto servera, odkazy obdrží aj server, čo môže znížiť \"\n\"ochranu Vášho súkromia.\"\n\n#: themes/default/templates/files.html.ep:14\nmsgid \"Import localStorage data\"\nmsgstr \"Importovať údaje z localStorage\"\n\n#: themes/default/templates/index.html.ep:53\nmsgid \"Important: more information on delays\"\nmsgstr \"Dôležité: viac informácií o obmedzení platnosti\"\n\n#: themes/default/templates/delays.html.ep:5\nmsgid \"Information about delays\"\nmsgstr \"Informácie o dobe platnosti\"\n\n#: themes/default/templates/files.html.ep:18 themes/default/templates/invitations/my_invitations.html.ep:12\nmsgid \"Invert selection\"\nmsgstr \"Obrátiť výber\"\n\n#. ($i->guest_mail, $url)\n#: lib/Lufi/Controller/Invitation.pm:184\nmsgid \"Invitation resent to %1.<br> URL: %2\"\nmsgstr \"Pozvánka znova odoslaná %1.<br> Adresa URL: %2\"\n\n#. ($invitation->guest_mail, $url)\n#: lib/Lufi/Controller/Invitation.pm:88\nmsgid \"Invitation sent to %1.<br> URL: %2\"\nmsgstr \"Pozvánka odoslaná %1.<br> Adresa URL: %2\"\n\n#: themes/default/templates/invitations/invite.html.ep:27 themes/default/templates/layouts/default.html.ep:36 themes/default/templates/layouts/default.html.ep:69\nmsgid \"Invite a guest\"\nmsgstr \"Pozvať hosťa\"\n\n#: themes/default/templates/partial/render.js.ep:6\nmsgid \"It seems that the key in your URL is incorrect. Please, verify your URL.\"\nmsgstr \"\"\n\"Zdá sa, že kľúč vo Vašej adrese URL je neplatný. Prosím, skontrolujte adresu \"\n\"URL.\"\n\n#: themes/default/templates/index.html.ep:12\nmsgid \"Javascript is disabled. You won't be able to use Lufi.\"\nmsgstr \"Javascript je vypnutý. Nebudete môcť použiť Lufi.\"\n\n#: themes/default/templates/layouts/default.html.ep:44 themes/default/templates/layouts/default.html.ep:46 themes/default/templates/layouts/default.html.ep:77 themes/default/templates/layouts/default.html.ep:79\nmsgid \"Language\"\nmsgstr \"Jazyk\"\n\n#. (sprintf('<a href=\"https://framagit.org/fiat-tux/hat-softwares/lufi/-/commit/%s\" class=\"classic\">%s</a>', stash('version')\n#: themes/default/templates/about.html.ep:22\nmsgid \"Latest commit of this instance: %1\"\nmsgstr \"Posledný commit tejto inštancie: %1\"\n\n#. (sprintf('<a href=\"https://framagit.org/fiat-tux/hat-softwares/lufi/-/releases/%s\" class=\"classic\">%s</a>', stash('version')\n#: themes/default/templates/about.html.ep:21\nmsgid \"Latest tag of this instance: %1\"\nmsgstr \"Posledný tag tejto inštancie: %1\"\n\n#: themes/default/templates/login.html.ep:15\nmsgid \"Login\"\nmsgstr \"Prihlásiť sa\"\n\n#: themes/default/templates/layouts/default.html.ep:58 themes/default/templates/layouts/default.html.ep:91\nmsgid \"Logout\"\nmsgstr \"Odhlásiť sa\"\n\n#: themes/default/templates/about.html.ep:4\nmsgid \"Lufi is a free (as in free speech) file hosting software.\"\nmsgstr \"Lufi je slobodný softvér pre poskytovanie súborov.\"\n\n#: themes/default/templates/partial/files.js.ep:12\nmsgid \"Lufi recently changed its way to store files information.\\\\n\\\\nNo files have been found in the new localStorage location but we found files in the old one.\\\\nDo you want to import those informations?\\\\n\\\\nPlease note that this is the only time that we will ask you this.\"\nmsgstr \"\"\n\"Lufi nedávno zmenil spôsob, akým sú ukladané informácie o súboroch.\\\\n\"\n\"\\\\n\"\n\"V novom umiestnení localStorage sa nenašli žiadne súbory, ale našli sme \"\n\"súbory v starom umiestnení\\\\n\"\n\"Chcete importovať tieto informácie?\\\\n\"\n\"\\\\\\n\"\n\"Berte prosím na zreteľ, že sa Vás na toto už viackrát pýtať nebudeme.\"\n\n#: themes/default/templates/files.html.ep:34\nmsgid \"Mail\"\nmsgstr \"E-mail\"\n\n#: themes/default/templates/files.html.ep:3 themes/default/templates/layouts/default.html.ep:34 themes/default/templates/layouts/default.html.ep:67\nmsgid \"My files\"\nmsgstr \"Moje súbory\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:5 themes/default/templates/layouts/default.html.ep:37 themes/default/templates/layouts/default.html.ep:70\nmsgid \"My invitations\"\nmsgstr \"Moje pozvánky\"\n\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:17\nmsgid \"NB: this list includes the list of files that have already been sent to you.\"\nmsgstr \"Pozn.: tento zoznam zahŕňa súbory, ktoré Vám niekto poslal.\"\n\n#: themes/default/templates/index.html.ep:115\nmsgid \"Name of the zip file\"\nmsgstr \"Názov súboru zip\"\n\n#. (format_bytes($json->{size})\n#: lib/Lufi/Controller/Files.pm:109\nmsgid \"No enough space available on the server for this file (size: %1).\"\nmsgstr \"Na serveri nie je dostatok voľného miesta pre súbor (veľkosť: %1).\"\n\n#: themes/default/templates/partial/files.js.ep:10 themes/default/templates/partial/index.js.ep:29\nmsgid \"No expiration delay\"\nmsgstr \"Žiadne zrdržanie\"\n\n#: themes/default/templates/files.html.ep:8\nmsgid \"Only the files sent with this browser will be listed here. This list is stored in localStorage: if you delete your localStorage data, you'll lose this list.\"\nmsgstr \"\"\n\"Tu budú zobrazené iba súbory odoslané týmto prehliadačom. Tento zoznam je \"\n\"uložený v localStorage: ak odstránite údaje localStorage, o tento zoznam \"\n\"prídete.\"\n\n#: themes/default/templates/index.html.ep:106 themes/default/templates/login.html.ep:21 themes/default/templates/render.html.ep:26\nmsgid \"Password\"\nmsgstr \"Heslo\"\n\n#. (config('contact')\n#: themes/default/templates/about.html.ep:13\nmsgid \"Please contact the administrator: %1\"\nmsgstr \"Kontaktujte, prosím, správcu: %1.\"\n\n#: themes/default/templates/render.html.ep:33\nmsgid \"Please wait while we are getting your file. We first need to download and decrypt all parts before you can get it.\"\nmsgstr \"\"\n\"Počkajte, prosím, kým získame Váš súbor. Musíme ho najprv stiahnuť a \"\n\"rozšifrovať všetky jeho časti pred tým, ako ho budete môcť uložiť.\"\n\n#: lib/Lufi/Controller/Auth.pm:38\nmsgid \"Please, check your credentials or your right to access this service: unable to authenticate.\"\nmsgstr \"\"\n\"Skontrolujte, prosím, Vaše prihlasovacie údaje alebo prístupové oprávnenia k \"\n\"tejto službte: nepodarilo sa prihlásiť.\"\n\n#: themes/default/templates/about.html.ep:5\nmsgid \"Privacy\"\nmsgstr \"Súkromie\"\n\n#: themes/default/templates/files.html.ep:13\nmsgid \"Purge expired files from localStorage\"\nmsgstr \"Odstrániť expirované súbory z localStorage\"\n\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:20\nmsgid \"Regards,\"\nmsgstr \"S pozdravom,\"\n\n#: themes/default/templates/invitations/invite.mail.ep:15\nmsgid \"Regards.\"\nmsgstr \"S pozdravom.\"\n\n#: themes/default/templates/layouts/default.html.ep:31 themes/default/templates/layouts/default.html.ep:64\nmsgid \"Report file\"\nmsgstr \"Nahlásiť súbor\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:15\nmsgid \"Resend invitation mail\"\nmsgstr \"Znovu odoslať e-mail s pozvánkou\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:9\nmsgid \"Rows in purple mean that the invitations have expired.\"\nmsgstr \"Fialové riadky označujú pozvánky, ktorým vypršala platnosť.\"\n\n#: themes/default/templates/files.html.ep:9\nmsgid \"Rows in red mean that the files have expired and are no longer available.\"\nmsgstr \"\"\n\"Červené riadky označujú súbory, ktorým vypršala platnosť a nie sú viac \"\n\"dostupné.\"\n\n#: themes/default/templates/partial/index.js.ep:27\nmsgid \"Send all links by email\"\nmsgstr \"Odoslať všetky odkazy e-mailom\"\n\n#: themes/default/templates/invitations/invite.html.ep:50\nmsgid \"Send the invitation\"\nmsgstr \"Odoslať pozvánku\"\n\n#: themes/default/templates/mail.html.ep:47\nmsgid \"Send with this server\"\nmsgstr \"Odoslať prostredníctvom tohto servera\"\n\n#: themes/default/templates/mail.html.ep:49\nmsgid \"Send with your own mail software\"\nmsgstr \"Odoslať pomocou Vášho vlastného e-mailového klienta\"\n\n#: themes/default/templates/partial/index.js.ep:30\nmsgid \"Sending part XX1 of XX2. Please, be patient, the progress bar can take a while to move.\"\nmsgstr \"\"\n\"Odosielam časť XX1 z XX2. Prosím, buďte trpezlivý, kým ukazovateľ priebehu \"\n\"začne ukazovať aktivitu, môže to chvíľku trvať.\"\n\n#. (url_for('/')\n#: themes/default/templates/partial/mail.js.ep:49\nmsgid \"Share your files in total privacy on %1\"\nmsgstr \"Zdieľajte Vaše súbory v úplnom súkromí na %1\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:13 themes/default/templates/partial/invitations.js.ep:9\nmsgid \"Show hidden invitations\"\nmsgstr \"Zobraziť skryté pozvánky\"\n\n#: themes/default/templates/partial/render.js.ep:12\nmsgid \"Show zip content\"\nmsgstr \"Zobraziť obsah archívu zip\"\n\n#: themes/default/templates/layouts/default.html.ep:40 themes/default/templates/layouts/default.html.ep:73 themes/default/templates/login.html.ep:28 themes/default/templates/logout.html.ep:17\nmsgid \"Signin\"\nmsgstr \"Prihlásiť sa\"\n\n#: lib/Lufi/Controller/Invitation.pm:302 themes/default/templates/invitations/exception.html.ep:16\nmsgid \"Sorry, the invitation doesn’t exist. Are you sure you are on the right URL?\"\nmsgstr \"Je mi to ľúto, pozvánka neexistuje. Určite máte správnu adresu URL?\"\n\n#: themes/default/templates/index.html.ep:46\nmsgid \"Sorry, the uploading is currently disabled. Please try again later.\"\nmsgstr \"\"\n\"Je mi to ľúto, nahrávanie je momentálne vypnuté. Skúste to, prosím, neskôr.\"\n\n#: lib/Lufi/Controller/Files.pm:82\nmsgid \"Sorry, uploading is disabled.\"\nmsgstr \"Je mi to ľúto, nahrávanie je vypnuté.\"\n\n#: themes/default/templates/invitations/exception.html.ep:7\nmsgid \"Sorry, your invitation has expired or has been deleted.\"\nmsgstr \"Je mi to ľúto, Vašej pozvánke uplynula platnosť alebo bola odstránená.\"\n\n#. ($invit->ldap_user_mail)\n#: lib/Lufi/Controller/Files.pm:123\nmsgid \"Sorry, your invitation has expired or has been deleted. Please contact %1 to have another invitation.\"\nmsgstr \"\"\n\"Je mi to ľúto, Vašej pozvánke uplynula platnosť alebo bola odstránená. \"\n\"Kontaktujte, prosím, %1 a požiadajte o ďalšiu pozvánku.\"\n\n#. ($invitation->ldap_user_mail)\n#: lib/Lufi/Controller/Invitation.pm:295\nmsgid \"The URLs of your files have been sent by email to %1.\"\nmsgstr \"Adresy URL Vašich súborov boli odoslané e-mailom %1.\"\n\n#: themes/default/templates/about.html.ep:7\nmsgid \"The administrator can only see the file's name, its size and its mimetype (what kind of file it is: video, text, etc.).\"\nmsgstr \"\"\n\"Správca môže vidieť iba názov súboru, jeho veľkosť a typ MIME (o aký typ \"\n\"súboru sa jedná: video, text, atď.).\"\n\n#: lib/Lufi/Controller/Mail.pm:67\nmsgid \"The body of the mail must contain at least one URL pointing to a file hosted on this instance.\"\nmsgstr \"\"\n\"Telo e-mail musí obsahovať aspoň jednu adresu URL, ktorá odkazuje na súbor \"\n\"nachádzajúci sa na tejto inštancii.\"\n\n#: themes/default/templates/partial/files.js.ep:11\nmsgid \"The data has been successfully imported.\"\nmsgstr \"Údaje boli úspešne importované.\"\n\n#: lib/Lufi/Controller/Mail.pm:87\nmsgid \"The email body can't be empty.\"\nmsgstr \"Telo e-mailu nesmie byť prázdne.\"\n\n#: lib/Lufi/Controller/Mail.pm:86\nmsgid \"The email subject can't be empty.\"\nmsgstr \"Predmet e-mailu nesmie byť prázdny.\"\n\n#. ($expire_at, $max_expire_at)\n#: lib/Lufi/Controller/Invitation.pm:52\nmsgid \"The expiration delay (%1) is not between 1 and %2 days.\"\nmsgstr \"Obmedzenie platnosti (%1) bolo nastavené medzi 1 a %2 dňami.\"\n\n#: lib/Lufi/Controller/Files.pm:462\nmsgid \"The file has already been deleted\"\nmsgstr \"Súbor bol už odstránený\"\n\n#: themes/default/templates/about.html.ep:6\nmsgid \"The files uploaded on a Lufi instance are encrypted before the upload to the server: the administrator of the server can not see the file's content.\"\nmsgstr \"\"\n\"Súbory odoslané do inštancie Lufi sú zašifrované pred ich nahraním na server:\"\n\" administrátor servera nevidí obsah súborov.\"\n\n#. (join(', ', @bad)\n#: lib/Lufi/Controller/Mail.pm:82\nmsgid \"The following email addresses are not valid: %1\"\nmsgstr \"Nasledujúce e-mailové adresy nie sú platné: %1\"\n\n#. ($guest_mail)\n#: lib/Lufi/Controller/Invitation.pm:49\nmsgid \"The guest email address (%1) is unvalid.\"\nmsgstr \"E-mailová adresa hosťa (%1) nie je platná.\"\n\n#. ($i->token, $c->current_user->{username})\n#: lib/Lufi/Controller/Invitation.pm:136\nmsgid \"The invitation %1 can’t be deleted: it wasn’t created by you (%2).\"\nmsgstr \"Pozvánku %1 nie je možné odstrániť: nevytvorili ste ju Vy (%2).\"\n\n#. ($i->token, $i->guest_mail)\n#: lib/Lufi/Controller/Invitation.pm:163\nmsgid \"The invitation %1 can’t be resent: %2 has already sent files.<br>Please create a new invitation.\"\nmsgstr \"\"\n\"Pozvánku %1 nie je možné znova odoslať: %2 už odoslal(a) \"\n\"súbory.<br>Vytvorte, prosím, novú pozvánku.\"\n\n#. ($i->token, $c->current_user->{username})\n#: lib/Lufi/Controller/Invitation.pm:187\nmsgid \"The invitation %1 can’t be resent: it wasn’t created by you (%2).\"\nmsgstr \"Pozvánku %1 nie je možné znova odoslať: nevytvorili ste ju Vy (%2).\"\n\n#. ($i->token)\n#: lib/Lufi/Controller/Invitation.pm:134\nmsgid \"The invitation %1 has been deleted.\"\nmsgstr \"Pozvánka %1 bola odstránená.\"\n\n#. (stash('user_mail')\n#: themes/default/templates/invitations/invite.html.ep:34\nmsgid \"The invitation mail will be send from your email address (%1).\"\nmsgstr \"E-mail s pozvánku bude odoslaný z Vašej e-mailovej adresy (%1).\"\n\n#: themes/default/templates/partial/index.js.ep:16\nmsgid \"The link(s) has been copied to your clipboard\"\nmsgstr \"Odkaz(y) bol(i) skopírovaný(é) do Vašej schránky\"\n\n#. (stash('invitation')\n#: themes/default/templates/index.html.ep:30\nmsgid \"The link(s) of your file(s) will automatically be sent by mail to %1 (%2)\"\nmsgstr \"Odkaz(y) na Váš(e) súbor(y) budú automaticky odoslané e-mailom %1 (%2)\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:11\nmsgid \"The links of your file(s) will automatically be sent by mail to %1.\"\nmsgstr \"Odkaz(y) na Váš(e) súbor(y) budú automaticky odoslané e-mailom %1.\"\n\n#: lib/Lufi/Controller/Mail.pm:111\nmsgid \"The mail has been sent.\"\nmsgstr \"E-mail bol odoslaný.\"\n\n#: themes/default/templates/about.html.ep:15\nmsgid \"The original (and only for now) author is <a href=\\\"https://fiat-tux.fr\\\" class=\\\"classic\\\">Luc Didry</a>.\"\nmsgstr \"\"\n\"Pôvodným a (aktuálne jediným) autorom je <a href=\\\"https://fiat-tux.fr\\\" \"\n\"class=\\\"classic\\\">Luc Didry</a>.\"\n\n#: lib/Lufi/Controller/Files.pm:230\nmsgid \"The server was unable to find the file record to add your file part to. Please, contact the administrator.\"\nmsgstr \"\"\n\"Server nedokázal nájsť záznam o súbore, ku ktorému má pridať časť súbory. \"\n\"Kontaktujte, prosím, správcu.\"\n\n#: lib/Lufi/Controller/Files.pm:289\nmsgid \"This file has been deactivated by the admins. Contact them to know why.\"\nmsgstr \"\"\n\"Tento súbor správcovia vypli. Kontaktujte ich, ak sa chcete dozvedieť dôvod.\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:46 themes/default/templates/partial/invitations.js.ep:6\nmsgid \"This invitation is normally hidden\"\nmsgstr \"Táto pozvánka je normálne skrytá\"\n\n#. (stash('expires')\n#: themes/default/templates/invitations/invite.mail.ep:13\nmsgid \"This invitation is valid until %1.\"\nmsgstr \"Táto pozvánka je platná do %1.\"\n\n#: themes/default/templates/delays.html.ep:13\nmsgid \"This server sets limitations according to the file size. The expiration delay of your file will be the minimum between what you choose and the following limitations:\"\nmsgstr \"\"\n\"Tento server nastavuje obmedzenia podľa veľkosti súboru. Doba platnosti \"\n\"Vášho súboru bude nastavená na najnižšiu hodnotu medzi hodnotou, ktorú \"\n\"vyberiete a nasledovnými obmedzeniami:\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:16\nmsgid \"Toggle visibility\"\nmsgstr \"Prepnúť viditeľnosť\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:25\nmsgid \"URL\"\nmsgstr \"Adresa URL\"\n\n#: themes/default/templates/partial/index.js.ep:17\nmsgid \"Unable to copy the link(s) to your clipboard\"\nmsgstr \"Nepodarilo sa skopírovať odkaz(y) do Vašej schránky\"\n\n#: themes/default/templates/partial/render.js.ep:13\nmsgid \"Unable to download the file: too much unsuccessful attempts to open a websocket. Please, contact the administrator.\"\nmsgstr \"\"\n\"Nepodarilo sa stiahnuť súbor: príliš veľa neúspešných pokusov o otvorenie \"\n\"websocketu. Kontaktujte, prosím, správcu.\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:433\nmsgid \"Unable to get counter for %1. The file does not exists. It will be removed from your localStorage.\"\nmsgstr \"\"\n\"Nepodarilo sa získať počítadlo pre %1. Súbor neexistuje. Bude odstránený z \"\n\"Vášho localStorage.\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:423\nmsgid \"Unable to get counter for %1. The token is invalid.\"\nmsgstr \"Nepodarilo sa získať počítadlo pre %1. Token je neplatný.\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:443\nmsgid \"Unable to get counter for %1. You are not authenticated.\"\nmsgstr \"Nepodarilo sa získať počítadlo pre %1. Nie ste prihlásený.\"\n\n#: themes/default/templates/layouts/default.html.ep:33 themes/default/templates/layouts/default.html.ep:66\nmsgid \"Upload files\"\nmsgstr \"Nahrať súbory\"\n\n#: themes/default/templates/index.html.ep:145\nmsgid \"Upload generated zip file\"\nmsgstr \"Nahrať vygenerovaný súbor zip\"\n\n#: themes/default/templates/files.html.ep:31\nmsgid \"Uploaded at\"\nmsgstr \"Nahrané\"\n\n#: themes/default/templates/index.html.ep:153\nmsgid \"Uploaded files\"\nmsgstr \"Nahrané súbory\"\n\n#: themes/default/templates/about.html.ep:20\nmsgid \"Version\"\nmsgstr \"Verzia\"\n\n#: themes/default/templates/partial/index.js.ep:31\nmsgid \"Websocket communication error\"\nmsgstr \"Chyba websocket komunikácie\"\n\n#: themes/default/templates/about.html.ep:3\nmsgid \"What is Lufi?\"\nmsgstr \"Čo je Lufi?\"\n\n#: themes/default/templates/about.html.ep:14\nmsgid \"Who wrote this software?\"\nmsgstr \"Kto napísal tento softvér?\"\n\n#: themes/default/templates/partial/index.js.ep:13\nmsgid \"XXX file has been added to upload queue.\"\nmsgstr \"XXX súbor bol pridaný do poradia nahrávania.\"\n\n#: themes/default/templates/invitations/invite.html.ep:30\nmsgid \"You can invite someone to send you files through this Lufi instance even if they don’t have an account on it.\"\nmsgstr \"\"\n\"Môžete pozvať niekoho, aby Vám odoslal súbory prostredníctvom tejto \"\n\"inštancie Lufi dokonca aj vtedy, keď na nej nemajú vytvorený účet.\"\n\n#: themes/default/templates/about.html.ep:11\nmsgid \"You can see the list of your files by clicking on the \\\"My files\\\" link at the top right of this page.\"\nmsgstr \"\"\n\"Zoznam Vašich súborov zobrazíte po kliknutí na \\\"Moje súbory\\\" v hornej \"\n\"časti tejto stránky.\"\n\n#. ($orig_uri)\n#: lib/Lufi/Controller/Mail.pm:43 lib/Lufi/Controller/Mail.pm:59\nmsgid \"You can't add URLs that are not related to this instance (%1).\"\nmsgstr \"Nemôžete pridať adresy URL, ktoré neodkazujú na túto inštanciu (%1).\"\n\n#: themes/default/templates/about.html.ep:8\nmsgid \"You don't need to register yourself to upload files but be aware that, for legal reasons, your IP address will be stored when you send a file. Don't panic, this is normally the case for all sites on which you send files.\"\nmsgstr \"\"\n\"Pre nahrávanie súborov sa nemusíte registrovať, ale myslite na to, že zo \"\n\"zákonných dôvodov bude Vaša IP adresa uložená, keď súbor odošlete. Nemusíte \"\n\"sa obávať, toto je bežnou praxou pre všetky portály, ktoré umožňujú \"\n\"odosielanie súborov.\"\n\n#: themes/default/templates/partial/render.js.ep:11\nmsgid \"You don't seem to have a key in your URL. You won't be able to decrypt the file. Download canceled.\"\nmsgstr \"\"\n\"Zdá sa, že Vaša adresa URL neobsahuje kľúč. Nebudete môcť dešifrovať súbor. \"\n\"Sťahovanie bolo zrušené.\"\n\n#: themes/default/templates/partial/render.js.ep:7\nmsgid \"You have attempted to leave this page. The download will be canceled. Are you sure?\"\nmsgstr \"\"\n\"Pokúsili ste sa opustiť túto stránku. Sťahovanie bude zrušené. Naozaj to \"\n\"chcete?\"\n\n#: themes/default/templates/partial/index.js.ep:14\nmsgid \"You have attempted to leave this page. The upload will be canceled. Are you sure?\"\nmsgstr \"\"\n\"Pokúsili ste sa opustiť túto stránku. Nahrávanie bude zrušené. Naozaj to \"\n\"chcete?\"\n\n#: themes/default/templates/logout.html.ep:14\nmsgid \"You have been successfully logged out.\"\nmsgstr \"Úspešne ste sa odhlásili.\"\n\n#: lib/Lufi/Controller/Mail.pm:85\nmsgid \"You must give email addresses.\"\nmsgstr \"Musíte zadať e-mailovú adresu.\"\n\n#: themes/default/templates/index.html.ep:38\nmsgid \"Your browser does not have enough entropy to generate a strong encryption key. Please wait (it's better if you do things on your computer while waiting).\"\nmsgstr \"\"\n\"Váš prehliadač nemá dostatok entropie na vygenerovanie silného šifrovacieho \"\n\"kľúča. Počkajte, prosím (pomôže, ak budete počas čakania pracovať na \"\n\"počítači).\"\n\n#. (format_bytes($json->{size})\n#: lib/Lufi/Controller/Files.pm:95\nmsgid \"Your file is too big: %1 (maximum size allowed: %2)\"\nmsgstr \"Váš súbor je príliš veľký: %1 (maximálna povolená veľkosť: %2)\"\n\n#: lib/Lufi/Controller/Files.pm:345\nmsgid \"Your password is not valid. Please refresh the page to retry.\"\nmsgstr \"Vaše heslo je neplatné. Obnovte stránku a skúste to znovu.\"\n\n#: themes/default/templates/partial/render.js.ep:14\nmsgid \"Zip content:\"\nmsgstr \"Obsah zip súboru:\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:24\nmsgid \"between %1 and %2, the file will be kept %3 day(s).\"\nmsgstr \"medzi %1 a %2, súbor bude na serveri ponechaný %3 deň/dní.\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:26\nmsgid \"between %1 and %2, the file will be kept forever.\"\nmsgstr \"medzi %1 a %2, súbor bude na serveri ponechaný navždy.\"\n\n#: themes/default/templates/partial/mail.js.ep:42\nmsgid \"deadline: \"\nmsgstr \"hraničný termín: \"\n\n#: themes/default/templates/partial/invitations.js.ep:5\nmsgid \"expires on XXX\"\nmsgstr \"vyprší XXX\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:30\nmsgid \"for %1 and more, the file will be kept %2 day(s)\"\nmsgstr \"pre %1 a viac bude súbor ponechaný %2 deň/dní.\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:32\nmsgid \"for %1 and more, the file will be kept forever.\"\nmsgstr \"pre %1 a viac bude súbor ponechaný navždy.\"\n\n#: themes/default/templates/index.html.ep:3\nmsgid \"no time limit\"\nmsgstr \"bez časového obmedzenia\"\n\n#: themes/default/templates/index.html.ep:124\nmsgid \"or\"\nmsgstr \"alebo\"\n\n#. ($e->{name}, format_bytes($e->{size})\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:12\nmsgid \"— %1 (%2), that will expire on %3\"\nmsgstr \"— %1 (%2), ktorý expiruje dňa %3\"\n\n#:\nmsgid \"You can't add URLs that are not related to this instance.\"\nmsgstr \"Nemôžete pridávať adresy URL, ktoré neodkazujú na túto inštanciu.\"\n"
  },
  {
    "path": "themes/default/lib/Lufi/I18N/sv.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\\n\"\n\"PO-Revision-Date: 2020-09-27 12:51+0000\\n\"\n\"Last-Translator: Filip Bengtsson <filip@libreradio.org>\\n\"\n\"Language-Team: Swedish <https://weblate.framasoft.org/projects/lufi/\"\n\"default-theme/sv/>\\n\"\n\"Language: sv\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=n != 1;\\n\"\n\"X-Generator: Weblate 4.1\\n\"\n\n#. ($delay)\n#. (max_delay)\n#: themes/default/templates/index.html.ep:56 themes/default/templates/index.html.ep:65 themes/default/templates/index.html.ep:66\nmsgid \"%1 days\"\nmsgstr \"%1 dagar\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:2\nmsgid \"%1 invites you to send him/her files\"\nmsgstr \"%1 bjuder in dig att skicka filer till honom eller henne\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:6\nmsgid \"%1 invites you to send him/her files through Lufi.\"\nmsgstr \"%1 bjuder in dig att skicka filer till honom eller henne via Lufi.\"\n\n#. (stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:4\nmsgid \"%1 sent you files\"\nmsgstr \"% har skickat filer till dig\"\n\n#. (stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:8\nmsgid \"%1 used your invitation to send you files:\"\nmsgstr \"%1 utnyttjade din inbjudan för att skicka filer till dig:\"\n\n#: lib/Lufi/Controller/Invitation.pm:159 lib/Lufi/Controller/Invitation.pm:84 themes/default/templates/invitations/my_invitations.html.ep:51 themes/default/templates/invitations/my_invitations.html.ep:52 themes/default/templates/invitations/my_invitations.html.ep:53 themes/default/templates/invitations/notification_files_sent.mail.ep:12\nmsgid \"%A %d %B %Y at %T\"\nmsgstr \"%A %d %B %Y klockan %T\"\n\n#: themes/default/templates/partial/index.js.ep:27\nmsgid \"(max size: XXX)\"\nmsgstr \"(största tillåtna storlek: XXX)\"\n\n#: themes/default/templates/index.html.ep:5\nmsgid \"1 year\"\nmsgstr \"1 år\"\n\n#: themes/default/templates/index.html.ep:4 themes/default/templates/index.html.ep:65\nmsgid \"24 hours\"\nmsgstr \"24 timmar\"\n\n#: themes/default/templates/partial/mail.js.ep:40\nmsgid \":\"\nmsgstr \":\"\n\n#: themes/default/templates/render.html.ep:42\nmsgid \"Abort\"\nmsgstr \"Avbryt\"\n\n#: themes/default/templates/layouts/default.html.ep:53 themes/default/templates/layouts/default.html.ep:86\nmsgid \"About\"\nmsgstr \"Om\"\n\n#: themes/default/templates/index.html.ep:107\nmsgid \"Add a password to file(s)\"\nmsgstr \"Lösenordsskydda filerna\"\n\n#: themes/default/templates/mail.html.ep:16\nmsgid \"Adding URLs not related to this Lufi instance to the mail body or subject is prohibited.\"\nmsgstr \"\"\n\"Det är inte tillåtet att infoga länkar i ämnesraden eller meddelandet som \"\n\"inte går till den här Lufi-instansen.\"\n\n#: themes/default/templates/partial/invitations.js.ep:3\nmsgid \"Are you sure you want to delete the selected invitations?\"\nmsgstr \"Är du säker på att du vill radera de markerade inbjudningarna?\"\n\n#: themes/default/templates/partial/invitations.js.ep:4\nmsgid \"Are you sure you want to resend the invitation mail for the selected invitations?\"\nmsgstr \"Är du säker på att du vill skicka ut de markerade inbjudningarna igen?\"\n\n#: themes/default/templates/about.html.ep:17\nmsgid \"As Lufi is a free software licensed under of the terms of the <a href=\\\"https://gnu.org/licenses/agpl.html\\\" class=\\\"classic\\\">AGPLv3</a>, you can install it on you own server. Have a look on the <a href=\\\"https://framagit.org/luc/lufi/wikis/home\\\" class=\\\"classic\\\">Wiki</a> for the procedure.\"\nmsgstr \"\"\n\"Du kan installera Lufi på din egen server eftersom det är en fri mjukvara \"\n\"publicerad under licensen <a href=\\\"https://gnu.org/licenses/agpl.html\\\" \"\n\"class=\\\"classic\\\">AGPLv3</a>. Ta en titt på <a href=\\\"https://framagit.org/\"\n\"luc/lufi/wikis/home\\\" class=\\\"classic\\\">wikin</a> för att se hur.\"\n\n#. (stash('nbslices')\n#: themes/default/templates/partial/render.js.ep:9\nmsgid \"Asking for file part XX1 of %1\"\nmsgstr \"Frågar efter del XX1 av filen %1\"\n\n#: themes/default/templates/about.html.ep:20\nmsgid \"Back to homepage\"\nmsgstr \"Tillbaka till hemsidan\"\n\n#: lib/Lufi/Controller/Mail.pm:25\nmsgid \"Bad CSRF token!\"\nmsgstr \"Ogiltig CSRF-token!\"\n\n#: lib/Lufi/Controller/Auth.pm:27 lib/Lufi/Controller/Auth.pm:49\nmsgid \"Bad CSRF token.\"\nmsgstr \"Ogiltig CSRF-token.\"\n\n#: themes/default/templates/partial/render.js.ep:5\nmsgid \"Click here to refresh the page and restart the download.\"\nmsgstr \"Klicka här för att uppdatera sidan och starta om nerladdningen.\"\n\n#: themes/default/templates/invitations/invite.mail.ep:8\nmsgid \"Click on the following URL to upload files on Lufi:\"\nmsgstr \"Klicka på följande länk för att ladda upp filer till Lufi:\"\n\n#: themes/default/templates/index.html.ep:126\nmsgid \"Click to open the file browser\"\nmsgstr \"Klicka för att öppna filhanteraren\"\n\n#: themes/default/templates/delays.html.ep:38 themes/default/templates/invitations/my_invitations.html.ep:80\nmsgid \"Close\"\nmsgstr \"Stäng\"\n\n#: themes/default/templates/mail.html.ep:23\nmsgid \"Comma-separated email addresses\"\nmsgstr \"E-postadresser åtskilda av kommatecken\"\n\n#: themes/default/templates/index.html.ep:140\nmsgid \"Compressing zip file…\"\nmsgstr \"Komprimerar ZIP-arkiv …\"\n\n#: themes/default/templates/partial/index.js.ep:15\nmsgid \"Copy all links to clipboard\"\nmsgstr \"Kopiera alla länkar till urklipp\"\n\n#: themes/default/templates/partial/index.js.ep:18\nmsgid \"Copy to clipboard\"\nmsgstr \"Kopiera till urklipp\"\n\n#: lib/Lufi/Controller/Files.pm:507\nmsgid \"Could not delete the file. You are not authenticated.\"\nmsgstr \"Kunde inte radera filen. Du är inte behörig.\"\n\n#: lib/Lufi/Controller/Files.pm:489\nmsgid \"Could not find the file. Are you sure of the URL and the token?\"\nmsgstr \"Kunde inte hitta filen. Är du säker på att det är rätt länk och token?\"\n\n#: lib/Lufi/Controller/Files.pm:400\nmsgid \"Could not find the file. Are you sure of the URL?\"\nmsgstr \"Kunde inte hitta filen. Är du säker på att det är rätt länk?\"\n\n#: themes/default/templates/files.html.ep:29\nmsgid \"Counter\"\nmsgstr \"Räknare\"\n\n#: themes/default/templates/index.html.ep:100\nmsgid \"Create a zip archive with the files before uploading?\"\nmsgstr \"Vill du skapa göra filerna till ett ZIP-arkiv innan de laddas upp?\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:26\nmsgid \"Created at\"\nmsgstr \"Skapad\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:14\nmsgid \"Delete\"\nmsgstr \"Radera\"\n\n#: themes/default/templates/files.html.ep:30 themes/default/templates/index.html.ep:90\nmsgid \"Delete at first download?\"\nmsgstr \"Radera efter första nerladdningen?\"\n\n#: themes/default/templates/files.html.ep:19\nmsgid \"Delete selected files\"\nmsgstr \"Radera markerade filer\"\n\n#: themes/default/templates/files.html.ep:33 themes/default/templates/partial/index.js.ep:19\nmsgid \"Deletion link\"\nmsgstr \"Länk för radering\"\n\n#: themes/default/templates/delays.html.ep:8\nmsgid \"Don't worry: if a user begins to download the file before the expiration and the download ends after the expiration, he will be able to get the file.\"\nmsgstr \"\"\n\"Oroa dig inte! Om en användare börjar ladda ner en fil innan dess \"\n\"utgångsdatum kommer hela filen kunna laddas ner, även om den skulle gå ut \"\n\"under tiden.\"\n\n#: themes/default/templates/partial/index.js.ep:21 themes/default/templates/render.html.ep:28\nmsgid \"Download\"\nmsgstr \"Ladda ner\"\n\n#: themes/default/templates/partial/render.js.ep:4\nmsgid \"Download aborted.\"\nmsgstr \"Nerladdning avbruten.\"\n\n#: themes/default/templates/files.html.ep:28 themes/default/templates/partial/index.js.ep:20\nmsgid \"Download link\"\nmsgstr \"Nerladdningslänk\"\n\n#: themes/default/templates/about.html.ep:10\nmsgid \"Drag and drop files in the appropriate area or use the traditional way to send files and the files will be chunked, encrypted and sent to the server. You will get two links per file: a download link, that you give to the people you want to share the file with and a deletion link, allowing you to delete the file whenever you want.\"\nmsgstr \"\"\n\"Drag och släpp filerna på ytan eller skicka dem på det traditionella viset, \"\n\"så kommer de buntas ihop, krypteras och skickas till servern. Du kommer få \"\n\"två länkar per fil: en nerladdningslänk att ge till dem du vill dela filen \"\n\"med och en länk för att radera filen, så att du kan ta bort den när du vill.\"\n\n#: themes/default/templates/index.html.ep:122\nmsgid \"Drop files here\"\nmsgstr \"Släpp filer här\"\n\n#: themes/default/templates/invitations/invite.html.ep:40\nmsgid \"Email address of your guest\"\nmsgstr \"E-postadress till din gäst\"\n\n#: themes/default/templates/mail.html.ep:39\nmsgid \"Email body\"\nmsgstr \"E-postmeddelande\"\n\n#: themes/default/templates/mail.html.ep:31\nmsgid \"Email subject\"\nmsgstr \"Ämnesrad för e-post\"\n\n#: themes/default/templates/mail.html.ep:25 themes/default/templates/mail.html.ep:27\nmsgid \"Emails\"\nmsgstr \"E-postmeddelanden\"\n\n#: themes/default/templates/partial/index.js.ep:22\nmsgid \"Encrypting part XX1 of XX2\"\nmsgstr \"Krypterar del XX1 av XX1\"\n\n#: lib/Lufi/Controller/Files.pm:289\nmsgid \"Error: the file existed but was deleted.\"\nmsgstr \"Fel: filen fanns men har raderats nu.\"\n\n#: lib/Lufi/Controller/Files.pm:369\nmsgid \"Error: the file has not been sent entirely.\"\nmsgstr \"Fel: hela filen har inte överförts.\"\n\n#: lib/Lufi/Controller/Files.pm:379\nmsgid \"Error: unable to find the file. Are you sure of your URL?\"\nmsgstr \"Fel: kunde inte hitta filen. Är du säker på att du har rätt länk?\"\n\n#: themes/default/templates/partial/index.js.ep:23\nmsgid \"Expiration:\"\nmsgstr \"Går ut:\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:27\nmsgid \"Expire at\"\nmsgstr \"Förfaller\"\n\n#: themes/default/templates/files.html.ep:32\nmsgid \"Expires at\"\nmsgstr \"Förfaller\"\n\n#: themes/default/templates/files.html.ep:12\nmsgid \"Export localStorage data\"\nmsgstr \"Exportera localStorage-data\"\n\n#: lib/Lufi/Controller/Files.pm:471\nmsgid \"File deleted\"\nmsgstr \"Filen har raderats\"\n\n#: themes/default/templates/files.html.ep:27\nmsgid \"File name\"\nmsgstr \"Filnamn\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:61\nmsgid \"Files\"\nmsgstr \"Filer\"\n\n#: themes/default/templates/index.html.ep:80\nmsgid \"Files deleted at first download\"\nmsgstr \"Filer raderade efter första nerladdning\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:28\nmsgid \"Files sent at\"\nmsgstr \"Filer skickade\"\n\n#: themes/default/templates/partial/invitations.js.ep:8\nmsgid \"Files sent in invitation XX1 by XX2\"\nmsgstr \"Filer skickade i inbjudan XX1 av XX2\"\n\n#: themes/default/templates/partial/render.js.ep:8\nmsgid \"Get the file\"\nmsgstr \"Hämta filen\"\n\n#: themes/default/templates/about.html.ep:18\nmsgid \"Get the source code on <a href=\\\"https://framagit.org/luc/lufi\\\" class=\\\"classic\\\">the official repository</a> or on its <a href=\\\"https://github.com/ldidry/lufi\\\" class=\\\"classic\\\">Github mirror</a>\"\nmsgstr \"\"\n\"Hämta källkoden från <a href=\\\"https://framagit.org/luc/lufi\\\" class=\\\"\"\n\"classic\\\">det officiella arkivet</a> eller från <a href=\\\"https://github.com/\"\n\"ldidry/lufi\\\" class=\\\"classic\\\">spegelsidan på Github</a>\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:24\nmsgid \"Guest mail\"\nmsgstr \"E-postadress till gäst\"\n\n#. (ucfirst(stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:6\nmsgid \"Hello %1,\"\nmsgstr \"Hej %1,\"\n\n#: themes/default/templates/invitations/invite.mail.ep:4\nmsgid \"Hello,\"\nmsgstr \"Hej,\"\n\n#: themes/default/templates/partial/mail.js.ep:35\nmsgid \"Hello,\\\\n\\\\nHere's some files I want to share with you:\\\\n\"\nmsgstr \"\"\n\"Hej,\\\\n\"\n\"\\\\n\"\n\"Här är några filer jag vill dela med dig:\\\\n\"\n\n#: themes/default/templates/mail.html.ep:35\nmsgid \"Here's some files\"\nmsgstr \"Här är några filer\"\n\n#: themes/default/templates/partial/invitations.js.ep:7\nmsgid \"Hide hidden invitations\"\nmsgstr \"Visa inte dolda inbjudningar\"\n\n#: themes/default/templates/partial/index.js.ep:25\nmsgid \"Hit Enter, then Ctrl+C to copy all the download links\"\nmsgstr \"\"\n\"Tryck Enter och sedan Crtl+C för att kopiera samtliga nerladdningslänkar\"\n\n#: themes/default/templates/partial/index.js.ep:24\nmsgid \"Hit Enter, then Ctrl+C to copy the download link\"\nmsgstr \"Tryck Enter och sedan Crtl+C för att kopiera nerladdningslänken\"\n\n#: themes/default/templates/about.html.ep:9\nmsgid \"How does it work?\"\nmsgstr \"Hur fungerar det?\"\n\n#: themes/default/templates/invitations/invite.html.ep:46\nmsgid \"How many days would you like the invitation to be valid?\"\nmsgstr \"Hur många dagar vill du att inbjudningen ska gälla?\"\n\n#: themes/default/templates/about.html.ep:16\nmsgid \"How to install the software on my server?\"\nmsgstr \"Hur kan jag installera den här mjukvaran på min server?\"\n\n#: themes/default/templates/about.html.ep:12\nmsgid \"How to report an illegal file?\"\nmsgstr \"Kan jag anmäla en olaglig fil?\"\n\n#: themes/default/templates/delays.html.ep:7\nmsgid \"If you choose a delay, the file will be deleted after that delay.\"\nmsgstr \"Om du anger en fördröjning kommer filen raderas när den tiden gått ut.\"\n\n#: themes/default/templates/mail.html.ep:15\nmsgid \"If you send the mail from this server, the links will be sent to the server, which may lower your privacy protection.\"\nmsgstr \"\"\n\"Om du skickar meddelandet från den här servern måste länkarna skickas till \"\n\"servern, vilket kan försämra skyddet av din identitet.\"\n\n#: themes/default/templates/files.html.ep:14\nmsgid \"Import localStorage data\"\nmsgstr \"Importera localStorage-data\"\n\n#: themes/default/templates/index.html.ep:53\nmsgid \"Important: more information on delays\"\nmsgstr \"Viktigt: mer information om fördröjningar\"\n\n#: themes/default/templates/delays.html.ep:5\nmsgid \"Information about delays\"\nmsgstr \"Information om fördröjningar\"\n\n#: themes/default/templates/files.html.ep:18 themes/default/templates/invitations/my_invitations.html.ep:12\nmsgid \"Invert selection\"\nmsgstr \"Omvänt val\"\n\n#. ($i->guest_mail, $url)\n#: lib/Lufi/Controller/Invitation.pm:171\nmsgid \"Invitation resent to %1.<br> URL: %2\"\nmsgstr \"Inbjudan har skickats till %1 igen.<br> Länk: %2\"\n\n#. ($invitation->guest_mail, $url)\n#: lib/Lufi/Controller/Invitation.pm:87\nmsgid \"Invitation sent to %1.<br> URL: %2\"\nmsgstr \"Inbjudan har skickats till %1.<br> Länk: %2\"\n\n#: themes/default/templates/invitations/invite.html.ep:27 themes/default/templates/layouts/default.html.ep:36 themes/default/templates/layouts/default.html.ep:69\nmsgid \"Invite a guest\"\nmsgstr \"Bjud in en gäst\"\n\n#: themes/default/templates/partial/render.js.ep:6\nmsgid \"It seems that the key in your URL is incorrect. Please, verify your URL.\"\nmsgstr \"\"\n\"Det verkar som att nyckeln i adressen är ogiltig. Kontrollera gärna din länk.\"\n\n#: themes/default/templates/index.html.ep:12\nmsgid \"Javascript is disabled. You won't be able to use Lufi.\"\nmsgstr \"Javascript är inte påslaget, så du kommer inte kunna använda Lufi.\"\n\n#: themes/default/templates/layouts/default.html.ep:44 themes/default/templates/layouts/default.html.ep:46 themes/default/templates/layouts/default.html.ep:77 themes/default/templates/layouts/default.html.ep:79\nmsgid \"Language\"\nmsgstr \"Språk\"\n\n#: themes/default/templates/login.html.ep:15\nmsgid \"Login\"\nmsgstr \"Logga in\"\n\n#: themes/default/templates/layouts/default.html.ep:58 themes/default/templates/layouts/default.html.ep:91\nmsgid \"Logout\"\nmsgstr \"Logga ut\"\n\n#: themes/default/templates/about.html.ep:4\nmsgid \"Lufi is a free (as in free speech) file hosting software.\"\nmsgstr \"Lufi är en fri (som i frihet) mjukvara för att dela filer.\"\n\n#: themes/default/templates/partial/files.js.ep:12\nmsgid \"Lufi recently changed its way to store files information.\\\\n\\\\nNo files have been found in the new localStorage location but we found files in the old one.\\\\nDo you want to import those informations?\\\\n\\\\nPlease note that this is the only time that we will ask you this.\"\nmsgstr \"\"\n\"Lufi har nyligen ändrat hur filinformation sparas.\\\\n\"\n\"\\\\n\"\n\"Inga filer har hittats på den nya localStorage-positionen men vi har hittat \"\n\"filer på den gamla.\\\\n\"\n\"Vill du importera dem?\\\\n\"\n\"\\\\n\"\n\"Observera att detta är den sista gången vi kommer fråga dig om detta.\"\n\n#: themes/default/templates/files.html.ep:34\nmsgid \"Mail\"\nmsgstr \"E-post\"\n\n#: themes/default/templates/files.html.ep:3 themes/default/templates/layouts/default.html.ep:34 themes/default/templates/layouts/default.html.ep:67\nmsgid \"My files\"\nmsgstr \"Mina filer\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:5 themes/default/templates/layouts/default.html.ep:37 themes/default/templates/layouts/default.html.ep:70\nmsgid \"My invitations\"\nmsgstr \"Mina inbjudningar\"\n\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:17\nmsgid \"NB: this list includes the list of files that have already been sent to you.\"\nmsgstr \"\"\n\"OBS: den här listan innehåller även den lista med filer som redan har \"\n\"skickats till dig.\"\n\n#: themes/default/templates/index.html.ep:115\nmsgid \"Name of the zip file\"\nmsgstr \"ZIP-arkivets namn\"\n\n#. (format_bytes($json->{size})\n#: lib/Lufi/Controller/Files.pm:108\nmsgid \"No enough space available on the server for this file (size: %1).\"\nmsgstr \"\"\n\"Servern har inte tillräckligt med ledigt utrymme för den här filen (storlek: \"\n\"%1).\"\n\n#: themes/default/templates/partial/files.js.ep:10 themes/default/templates/partial/index.js.ep:28\nmsgid \"No expiration delay\"\nmsgstr \"Ingen utgångsfördröjning\"\n\n#: themes/default/templates/files.html.ep:8\nmsgid \"Only the files sent with this browser will be listed here. This list is stored in localStorage: if you delete your localStorage data, you'll lose this list.\"\nmsgstr \"\"\n\"Det är bara filer som har skickats med den här webbläsaren som visas här. \"\n\"Den här listan sparas i localStorage, så om du raderar dina localStorage-\"\n\"data kommer listan tömmas.\"\n\n#: themes/default/templates/index.html.ep:106 themes/default/templates/login.html.ep:21 themes/default/templates/render.html.ep:26\nmsgid \"Password\"\nmsgstr \"Lösenord\"\n\n#. (config('contact')\n#: themes/default/templates/about.html.ep:13\nmsgid \"Please contact the administrator: %1\"\nmsgstr \"Kontakta gärna administratören: %1\"\n\n#: themes/default/templates/render.html.ep:33\nmsgid \"Please wait while we are getting your file. We first need to download and decrypt all parts before you can get it.\"\nmsgstr \"\"\n\"Vänta här under tiden vi hämtar din fil. Vi måste först ladda ner och \"\n\"dekryptera alla delar innan vi kan ge dig den.\"\n\n#: lib/Lufi/Controller/Auth.pm:38\nmsgid \"Please, check your credentials or your right to access this service: unable to authenticate.\"\nmsgstr \"\"\n\"Kunde inte logga in. Kontrollera dina inloggningsuppgifter och dina \"\n\"behörigheter för tjänsten.\"\n\n#: themes/default/templates/about.html.ep:5\nmsgid \"Privacy\"\nmsgstr \"Personuppgiftsskydd\"\n\n#: themes/default/templates/files.html.ep:13\nmsgid \"Purge expired files from localStorage\"\nmsgstr \"Ta bort gamla filer från localStorage\"\n\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:20\nmsgid \"Regards,\"\nmsgstr \"Med vänliga hälsningar,\"\n\n#: themes/default/templates/invitations/invite.mail.ep:15\nmsgid \"Regards.\"\nmsgstr \"Med vänliga hälsningar.\"\n\n#: themes/default/templates/layouts/default.html.ep:31 themes/default/templates/layouts/default.html.ep:64\nmsgid \"Report file\"\nmsgstr \"Anmäl fil\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:15\nmsgid \"Resend invitation mail\"\nmsgstr \"Skicka inbjudning igen\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:9\nmsgid \"Rows in purple mean that the invitations have expired.\"\nmsgstr \"Lila rad betyder att inbjudningen har gått ut.\"\n\n#: themes/default/templates/files.html.ep:9\nmsgid \"Rows in red mean that the files have expired and are no longer available.\"\nmsgstr \"\"\n\"Röd rad betyder att filen har gått ut och inte finns tillgänglig längre.\"\n\n#: themes/default/templates/partial/index.js.ep:26\nmsgid \"Send all links by email\"\nmsgstr \"Skicka alla länkar via e-post\"\n\n#: themes/default/templates/invitations/invite.html.ep:50\nmsgid \"Send the invitation\"\nmsgstr \"Skicka inbjudningen\"\n\n#: themes/default/templates/mail.html.ep:46\nmsgid \"Send with this server\"\nmsgstr \"Skicka från den här servern\"\n\n#: themes/default/templates/mail.html.ep:47\nmsgid \"Send with your own mail software\"\nmsgstr \"Skicka från din egen e-posttjänst\"\n\n#: themes/default/templates/partial/index.js.ep:29\nmsgid \"Sending part XX1 of XX2. Please, be patient, the progress bar can take a while to move.\"\nmsgstr \"\"\n\"Överför del XX1 av XX2. Det kan ta en stund innan statsindikatorn börjar \"\n\"röra sig.\"\n\n#. (url_for('/')\n#: themes/default/templates/partial/mail.js.ep:48\nmsgid \"Share your files in total privacy on %1\"\nmsgstr \"Dela dina filer helt skyddat med %1\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:13 themes/default/templates/partial/invitations.js.ep:9\nmsgid \"Show hidden invitations\"\nmsgstr \"Visa dolda inbjudningar\"\n\n#: themes/default/templates/partial/render.js.ep:11\nmsgid \"Show zip content\"\nmsgstr \"Visa ZIP-arkivets innehåll\"\n\n#: themes/default/templates/layouts/default.html.ep:40 themes/default/templates/layouts/default.html.ep:73 themes/default/templates/login.html.ep:28 themes/default/templates/logout.html.ep:17\nmsgid \"Signin\"\nmsgstr \"Logga in\"\n\n#: lib/Lufi/Controller/Invitation.pm:283 themes/default/templates/invitations/exception.html.ep:16\nmsgid \"Sorry, the invitation doesn’t exist. Are you sure you are on the right URL?\"\nmsgstr \"\"\n\"Den här inbjudan existerar tyvärr inte. Är du säker på att du har kommit \"\n\"till rätt adress?\"\n\n#: themes/default/templates/index.html.ep:46\nmsgid \"Sorry, the uploading is currently disabled. Please try again later.\"\nmsgstr \"Uppladdning är inte tillåtet för tillfället. Försök gärna igen senare.\"\n\n#: lib/Lufi/Controller/Files.pm:82\nmsgid \"Sorry, uploading is disabled.\"\nmsgstr \"Det går tyvärr inte att ladda upp för tillfället.\"\n\n#: themes/default/templates/invitations/exception.html.ep:7\nmsgid \"Sorry, your invitation has expired or has been deleted.\"\nmsgstr \"Din inbjudan har antingen gått ut eller raderats.\"\n\n#. ($invit->ldap_user_mail)\n#: lib/Lufi/Controller/Files.pm:122\nmsgid \"Sorry, your invitation has expired or has been deleted. Please contact %1 to have another invitation.\"\nmsgstr \"\"\n\"Din inbjudan har dessvärre gått ut eller raderats. Du kan kontakta %1 för \"\n\"att få en ny inbjudan.\"\n\n#. ($invitation->ldap_user_mail)\n#: lib/Lufi/Controller/Invitation.pm:276\nmsgid \"The URLs of your files have been sent by email to %1.\"\nmsgstr \"Länken till dina filer har skickats med e-post till %1.\"\n\n#: themes/default/templates/about.html.ep:7\nmsgid \"The administrator can only see the file's name, its size and its mimetype (what kind of file it is: video, text, etc.).\"\nmsgstr \"\"\n\"Administratören kan endast se filens namn, storlek och mime-typ (om det är \"\n\"en video, textfil eller något annat).\"\n\n#: lib/Lufi/Controller/Mail.pm:53\nmsgid \"The body of the mail must contain at least one URL pointing to a file hosted on this instance.\"\nmsgstr \"\"\n\"E-postmeddelandet måste innehålla minst en länk till en fil som lagras på \"\n\"den här instansen.\"\n\n#: themes/default/templates/partial/files.js.ep:11\nmsgid \"The data has been successfully imported.\"\nmsgstr \"All data har importerats.\"\n\n#: lib/Lufi/Controller/Mail.pm:73\nmsgid \"The email body can't be empty.\"\nmsgstr \"E-postmeddelandet får inte lämnas tomt.\"\n\n#: lib/Lufi/Controller/Mail.pm:72\nmsgid \"The email subject can't be empty.\"\nmsgstr \"Ämnesraden får inte lämnas tom.\"\n\n#. ($expire_at, $max_expire_at)\n#: lib/Lufi/Controller/Invitation.pm:51\nmsgid \"The expiration delay (%1) is not between 1 and %2 days.\"\nmsgstr \"Livslängden (%1) måste vara mellan 1 och %2 dagar.\"\n\n#: lib/Lufi/Controller/Files.pm:468\nmsgid \"The file has already been deleted\"\nmsgstr \"Filen har redan raderats\"\n\n#: themes/default/templates/about.html.ep:6\nmsgid \"The files uploaded on a Lufi instance are encrypted before the upload to the server: the administrator of the server can not see the file's content.\"\nmsgstr \"\"\n\"Filerna krypteras innan de laddas upp till Lufi-serveren. Därför kan inte \"\n\"ens serverns administratör se filens innehåll.\"\n\n#. (join(', ', @bad)\n#: lib/Lufi/Controller/Mail.pm:68\nmsgid \"The following email addresses are not valid: %1\"\nmsgstr \"Följande e-postadresser är inte giltiga: %1\"\n\n#. ($guest_mail)\n#: lib/Lufi/Controller/Invitation.pm:48\nmsgid \"The guest email address (%1) is unvalid.\"\nmsgstr \"Gästens e-postadress (%1) är ogiltig.\"\n\n#. ($i->token, $i->guest_mail)\n#: lib/Lufi/Controller/Invitation.pm:150\nmsgid \"The invitation %1 can’t be resent: %2 has already sent files.<br>Please create a new invitation.\"\nmsgstr \"\"\n\"Inbjudan %1 kan inte skickas igen eftersom %2 redan har skickat filer.<br>Du \"\n\"kan skapa en ny inbjudan om du vill.\"\n\n#. ($i->token)\n#: lib/Lufi/Controller/Invitation.pm:130\nmsgid \"The invitation %1 has been deleted.\"\nmsgstr \"Inbjudan %1 har raderats.\"\n\n#. (stash('user_mail')\n#: themes/default/templates/invitations/invite.html.ep:34\nmsgid \"The invitation mail will be send from your email address (%1).\"\nmsgstr \"Inbjudan kommer skickas från din e-postadress (%1).\"\n\n#: themes/default/templates/partial/index.js.ep:16\nmsgid \"The link(s) has been copied to your clipboard\"\nmsgstr \"Länkarna har kopierats till urklipp\"\n\n#. (stash('invitation')\n#: themes/default/templates/index.html.ep:30\nmsgid \"The link(s) of your file(s) will automatically be sent by mail to %1 (%2)\"\nmsgstr \"\"\n\"Länkarna till dina filer kommer skickas per e-post till %1 (%2) automatiskt\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:11\nmsgid \"The links of your file(s) will automatically be sent by mail to %1.\"\nmsgstr \"Länkarna till dina filer kommer skickas till %1 automatiskt.\"\n\n#: lib/Lufi/Controller/Mail.pm:97\nmsgid \"The mail has been sent.\"\nmsgstr \"E-postmeddelandet har skickats.\"\n\n#: themes/default/templates/about.html.ep:15\nmsgid \"The original (and only for now) author is <a href=\\\"https://fiat-tux.fr\\\" class=\\\"classic\\\">Luc Didry</a>.\"\nmsgstr \"\"\n\"Den ursprungliga upphovsmannen (den enda än så länge) är <a href=\\\"https\"\n\"://fiat-tux.fr\\\" class=\\\"classic\\\">Luc Didry</a>.\"\n\n#: lib/Lufi/Controller/Files.pm:236\nmsgid \"The server was unable to find the file record to add your file part to. Please, contact the administrator.\"\nmsgstr \"\"\n\"Servern kunde inte hitta en lista att lägga till din fil i. Kontakta gärna \"\n\"administratören.\"\n\n#: lib/Lufi/Controller/Files.pm:295\nmsgid \"This file has been deactivated by the admins. Contact them to know why.\"\nmsgstr \"\"\n\"Den här filen har avaktiverats av administratörerna. Kontakta dem för att få \"\n\"veta anledningen.\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:46 themes/default/templates/partial/invitations.js.ep:6\nmsgid \"This invitation is normally hidden\"\nmsgstr \"Inbjudan är vanligen dold\"\n\n#. (stash('expires')\n#: themes/default/templates/invitations/invite.mail.ep:13\nmsgid \"This invitation is valid until %1.\"\nmsgstr \"Den här inbjudan är giltig tills %1.\"\n\n#: themes/default/templates/delays.html.ep:10\nmsgid \"This server sets limitations according to the file size. The expiration delay of your file will be the minimum between what you choose and the following limitations:\"\nmsgstr \"\"\n\"Den här servern har en gräns för filers storlek. Din fils livslängd kommer \"\n\"bli det minsta av det du väljer eller följande:\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:16\nmsgid \"Toggle visibility\"\nmsgstr \"Visa eller dölj\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:25\nmsgid \"URL\"\nmsgstr \"Länk\"\n\n#: themes/default/templates/partial/index.js.ep:17\nmsgid \"Unable to copy the link(s) to your clipboard\"\nmsgstr \"Kunde inte kopiera länkarna till urklipp\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:439\nmsgid \"Unable to get counter for %1. The file does not exists. It will be removed from your localStorage.\"\nmsgstr \"\"\n\"Kunde inte hämta räknaren för %1 eftersom filen inte existerar. Den kommer \"\n\"tas bort från ditt localStorage.\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:429\nmsgid \"Unable to get counter for %1. The token is invalid.\"\nmsgstr \"Kunde inte ladda in räknaren för %1. Ogiltig token.\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:449\nmsgid \"Unable to get counter for %1. You are not authenticated.\"\nmsgstr \"Kunde inte ladda in räknaren för %1. Du är inte behörig.\"\n\n#: themes/default/templates/layouts/default.html.ep:33 themes/default/templates/layouts/default.html.ep:66\nmsgid \"Upload files\"\nmsgstr \"Ladda upp filer\"\n\n#: themes/default/templates/index.html.ep:145\nmsgid \"Upload generated zip file\"\nmsgstr \"Ladda upp det genererade ZIP-arkivet\"\n\n#: themes/default/templates/files.html.ep:31\nmsgid \"Uploaded at\"\nmsgstr \"Uppladdad\"\n\n#: themes/default/templates/index.html.ep:153\nmsgid \"Uploaded files\"\nmsgstr \"Uppladdade filer\"\n\n#: themes/default/templates/partial/index.js.ep:30\nmsgid \"Websocket communication error\"\nmsgstr \"Kommunikationsfel (websocket)\"\n\n#: themes/default/templates/about.html.ep:3\nmsgid \"What is Lufi?\"\nmsgstr \"Vad är Lufi?\"\n\n#: themes/default/templates/about.html.ep:14\nmsgid \"Who wrote this software?\"\nmsgstr \"Vem skrev den här mjukvaran?\"\n\n#: themes/default/templates/partial/index.js.ep:13\nmsgid \"XXX file has been added to upload queue.\"\nmsgstr \"Filen XXX har lagts till i uppladdningskön.\"\n\n#: themes/default/templates/invitations/invite.html.ep:30\nmsgid \"You can invite someone to send you files through this Lufi instance even if they don’t have an account on it.\"\nmsgstr \"\"\n\"Du kan bjuda in andra att skicka filer till dig via den här Lufi-instansen \"\n\"även om de inte har ett konto här.\"\n\n#: themes/default/templates/about.html.ep:11\nmsgid \"You can see the list of your files by clicking on the \\\"My files\\\" link at the top right of this page.\"\nmsgstr \"\"\n\"Du kan se en lista över dina filer genom att klicka på länken ”Mina filer” \"\n\"längst upp till höger på den här sidan.\"\n\n#: lib/Lufi/Controller/Mail.pm:42\nmsgid \"You can't add URLs that are not related to this instance.\"\nmsgstr \"Du kan inte lägga in länkar som inte går till den här instansen.\"\n\n#: themes/default/templates/about.html.ep:8\nmsgid \"You don't need to register yourself to upload files but be aware that, for legal reasons, your IP address will be stored when you send a file. Don't panic, this is normally the case for all sites on which you send files.\"\nmsgstr \"\"\n\"Du behöver inte registrera dig för att ladda upp filer men tänk på att vi, \"\n\"av rättsliga skäl, måste spara din IP-adress när du skickar en fil. Detta är \"\n\"inte skäl att gripas av panik, utan är helt normalt för alla webbplatser som \"\n\"låter dig överföra filer.\"\n\n#: themes/default/templates/partial/render.js.ep:10\nmsgid \"You don't seem to have a key in your URL. You won't be able to decrypt the file. Download canceled.\"\nmsgstr \"\"\n\"Det verkar som att du inte har en nyckel i din länk, så du kommer inte kunna \"\n\"dekryptera filen. Nerladdningen har avbrutits.\"\n\n#: themes/default/templates/partial/render.js.ep:7\nmsgid \"You have attempted to leave this page. The download will be canceled. Are you sure?\"\nmsgstr \"\"\n\"Du har försökt lämna sidan, vilket skulle avbryta nerladdningen. Är du säker?\"\n\n#: themes/default/templates/partial/index.js.ep:14\nmsgid \"You have attempted to leave this page. The upload will be canceled. Are you sure?\"\nmsgstr \"\"\n\"Du har försökt lämna sidan, vilket skulle avbryta uppladdningen. Är du säker?\"\n\n#: themes/default/templates/logout.html.ep:14\nmsgid \"You have been successfully logged out.\"\nmsgstr \"Du har loggats ut.\"\n\n#: lib/Lufi/Controller/Mail.pm:71\nmsgid \"You must give email addresses.\"\nmsgstr \"Du måste uppge en e-postadress.\"\n\n#: themes/default/templates/index.html.ep:38\nmsgid \"Your browser does not have enough entropy to generate a strong encryption key. Please wait (it's better if you do things on your computer while waiting).\"\nmsgstr \"\"\n\n#. (format_bytes($json->{size})\n#: lib/Lufi/Controller/Files.pm:95\nmsgid \"Your file is too big: %1 (maximum size allowed: %2)\"\nmsgstr \"\"\n\n#: lib/Lufi/Controller/Files.pm:351\nmsgid \"Your password is not valid. Please refresh the page to retry.\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/render.js.ep:12\nmsgid \"Zip content:\"\nmsgstr \"\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:20\nmsgid \"between %1 and %2, the file will be kept %3 day(s).\"\nmsgstr \"\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:22\nmsgid \"between %1 and %2, the file will be kept forever.\"\nmsgstr \"\"\n\n#: themes/default/templates/partial/mail.js.ep:42\nmsgid \"deadline: \"\nmsgstr \"\"\n\n#: themes/default/templates/partial/invitations.js.ep:5\nmsgid \"expires on XXX\"\nmsgstr \"Går ut den XXX\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:26\nmsgid \"for %1 and more, the file will be kept %2 day(s)\"\nmsgstr \"\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:28\nmsgid \"for %1 and more, the file will be kept forever.\"\nmsgstr \"\"\n\n#: themes/default/templates/index.html.ep:3\nmsgid \"no time limit\"\nmsgstr \"ingen tidsbegränsning\"\n\n#: themes/default/templates/index.html.ep:124\nmsgid \"or\"\nmsgstr \"eller\"\n\n#. ($e->{name}, format_bytes($e->{size})\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:12\nmsgid \"— %1 (%2), that will expire on %3\"\nmsgstr \"— %1 (%2), som går ut den %3\"\n\n#: themes/default/templates/about.html.ep:18\nmsgid \"Get the source code on <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi\\\" class=\\\"classic\\\">the official repository</a> or on its <a href=\\\"https://github.com/ldidry/lufi\\\" class=\\\"classic\\\">Github mirror</a>\"\nmsgstr \"\"\n\"Hämta källkoden från <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/\"\n\"lufi\\\" class=\\\"classic\\\">det officiella arkivet</a> eller från <a href=\\\"\"\n\"https://github.com/ldidry/lufi\\\" class=\\\"classic\\\">spegelsidan på Github</a>\"\n\n#: themes/default/templates/about.html.ep:17\nmsgid \"As Lufi is a free software licensed under of the terms of the <a href=\\\"https://gnu.org/licenses/agpl.html\\\" class=\\\"classic\\\">AGPLv3</a>, you can install it on you own server. Have a look on the <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi/wikis/home\\\" class=\\\"classic\\\">Wiki</a> for the procedure.\"\nmsgstr \"\"\n\"Du kan installera Lufi på din egen server eftersom det är en fri mjukvara \"\n\"publicerad under licensen <a href=\\\"https://gnu.org/licenses/agpl.html\\\" \"\n\"class=\\\"classic\\\">AGPLv3</a>. Ta en titt på <a href=\\\"https://framagit.org/\"\n\"fiat-tux/hat-softwares/lufi/wikis/home\\\" class=\\\"classic\\\">wikin</a> för att \"\n\"se hur.\"\n\n#: themes/default/templates/about.html.ep:20\nmsgid \"Version\"\nmsgstr \"Version\"\n\n#. (sprintf('<a href=\"https://framagit.org/fiat-tux/hat-softwares/lufi/-/releases/%s\" class=\"classic\">%s</a>', stash('version')\n#: themes/default/templates/about.html.ep:21\nmsgid \"Latest tag of this instance: %1\"\nmsgstr \"Senaste taggen på den här instansen: %1\"\n\n#. (sprintf('<a href=\"https://framagit.org/fiat-tux/hat-softwares/lufi/-/commit/%s\" class=\"classic\">%s</a>', stash('version')\n#: themes/default/templates/about.html.ep:22\nmsgid \"Latest commit of this instance: %1\"\nmsgstr \"Senaste bidraget till den här instansen: %1\"\n\n#: themes/default/templates/partial/index.js.ep:24\nmsgid \"File uploaded\"\nmsgstr \"Filen har laddats upp\"\n\n#: themes/default/templates/partial/render.js.ep:9\nmsgid \"File downloaded\"\nmsgstr \"Filen har laddats ner\"\n"
  },
  {
    "path": "themes/default/lib/Lufi/I18N/zh_Hans.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\\n\"\n\"PO-Revision-Date: 2022-03-01 21:25+0000\\n\"\n\"Last-Translator: deluxghost <deluxghost@gmail.com>\\n\"\n\"Language-Team: Chinese (Simplified) <https://weblate.framasoft.org/projects/\"\n\"lufi/default-theme/zh_Hans/>\\n\"\n\"Language: zh_Hans\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\"X-Generator: Weblate 4.10.1\\n\"\n\n#. ($delay)\n#. (max_delay)\n#: themes/default/templates/index.html.ep:56 themes/default/templates/index.html.ep:65 themes/default/templates/index.html.ep:66\nmsgid \"%1 days\"\nmsgstr \"%1 天\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:2\nmsgid \"%1 invites you to send him/her files\"\nmsgstr \"%1 邀请您给他发送文件\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:6\nmsgid \"%1 invites you to send him/her files through Lufi.\"\nmsgstr \"%1 邀请您通过 Lufi 给他发送文件。\"\n\n#. (stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:4\nmsgid \"%1 sent you files\"\nmsgstr \"%1 向您发送了一个文件\"\n\n#. (stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:8\nmsgid \"%1 used your invitation to send you files:\"\nmsgstr \"%1 通过邀请向您发送了文件：\"\n\n#: lib/Lufi/Controller/Invitation.pm:160 lib/Lufi/Controller/Invitation.pm:85 themes/default/templates/invitations/my_invitations.html.ep:51 themes/default/templates/invitations/my_invitations.html.ep:52 themes/default/templates/invitations/my_invitations.html.ep:53 themes/default/templates/invitations/notification_files_sent.mail.ep:12\nmsgid \"%A %d %B %Y at %T\"\nmsgstr \"%A %d %B %Y %T\"\n\n#: themes/default/templates/partial/index.js.ep:28\nmsgid \"(max size: XXX)\"\nmsgstr \"（大小上限：XXX）\"\n\n#: themes/default/templates/index.html.ep:5\nmsgid \"1 year\"\nmsgstr \"1 年\"\n\n#: themes/default/templates/index.html.ep:4 themes/default/templates/index.html.ep:65\nmsgid \"24 hours\"\nmsgstr \"24 小时\"\n\n#: themes/default/templates/partial/mail.js.ep:40\nmsgid \":\"\nmsgstr \"：\"\n\n#: themes/default/templates/render.html.ep:42\nmsgid \"Abort\"\nmsgstr \"中止\"\n\n#: themes/default/templates/layouts/default.html.ep:53 themes/default/templates/layouts/default.html.ep:86\nmsgid \"About\"\nmsgstr \"关于\"\n\n#: themes/default/templates/index.html.ep:107\nmsgid \"Add a password to file(s)\"\nmsgstr \"为文件设置密码\"\n\n#: themes/default/templates/mail.html.ep:16\nmsgid \"Adding URLs not related to this Lufi instance to the mail body or subject is prohibited.\"\nmsgstr \"严禁将与此 Lufi 实例无关的网址加入到邮件正文或主题中。\"\n\n#: themes/default/templates/partial/invitations.js.ep:3\nmsgid \"Are you sure you want to delete the selected invitations?\"\nmsgstr \"您确定要删除选中的邀请吗？\"\n\n#: themes/default/templates/partial/invitations.js.ep:4\nmsgid \"Are you sure you want to resend the invitation mail for the selected invitations?\"\nmsgstr \"您确定要为选中的邀请重新发送邮件吗？\"\n\n#: themes/default/templates/about.html.ep:17\nmsgid \"As Lufi is a free software licensed under of the terms of the <a href=\\\"https://gnu.org/licenses/agpl.html\\\" class=\\\"classic\\\">AGPLv3</a>, you can install it on you own server. Have a look on the <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi/wikis/home\\\" class=\\\"classic\\\">Wiki</a> for the procedure.\"\nmsgstr \"\"\n\"Lufi 是基于 <a href=\\\"https://gnu.org/licenses/agpl.html\\\" class=\\\"classic\\\"\"\n\">AGPLv3</a> 协议的自由软件，您可以将其安装在自己的服务器上。请查看 <a href=\\\"https://framagit.org/\"\n\"fiat-tux/hat-softwares/lufi/wikis/home\\\" class=\\\"classic\\\">Wiki</a> 以了解详细信息。\"\n\n#. (stash('nbslices')\n#: themes/default/templates/partial/render.js.ep:10\nmsgid \"Asking for file part XX1 of %1\"\nmsgstr \"正在请求文件第 XX1 / %1 部分\"\n\n#: themes/default/templates/about.html.ep:23\nmsgid \"Back to homepage\"\nmsgstr \"回到主页\"\n\n#: lib/Lufi/Controller/Mail.pm:25\nmsgid \"Bad CSRF token!\"\nmsgstr \"损坏的 CSRF 令牌！\"\n\n#: lib/Lufi/Controller/Auth.pm:27 lib/Lufi/Controller/Auth.pm:49\nmsgid \"Bad CSRF token.\"\nmsgstr \"错误的 CSRF 令牌。\"\n\n#: themes/default/templates/partial/render.js.ep:5\nmsgid \"Click here to refresh the page and restart the download.\"\nmsgstr \"点击这里刷新页面并重新下载。\"\n\n#: themes/default/templates/invitations/invite.mail.ep:8\nmsgid \"Click on the following URL to upload files on Lufi:\"\nmsgstr \"点击此链接上传文件到 Lufi：\"\n\n#: themes/default/templates/index.html.ep:126\nmsgid \"Click to open the file browser\"\nmsgstr \"点击打开文件浏览器\"\n\n#: themes/default/templates/delays.html.ep:42 themes/default/templates/invitations/my_invitations.html.ep:80\nmsgid \"Close\"\nmsgstr \"关闭\"\n\n#: themes/default/templates/mail.html.ep:23\nmsgid \"Comma-separated email addresses\"\nmsgstr \"电子邮件地址，以逗号分隔\"\n\n#: themes/default/templates/index.html.ep:140\nmsgid \"Compressing zip file…\"\nmsgstr \"正在压缩为 zip 文件…\"\n\n#: themes/default/templates/partial/index.js.ep:15\nmsgid \"Copy all links to clipboard\"\nmsgstr \"复制所有链接到剪贴板\"\n\n#: themes/default/templates/partial/index.js.ep:18\nmsgid \"Copy to clipboard\"\nmsgstr \"复制到剪贴板\"\n\n#: lib/Lufi/Controller/Files.pm:501\nmsgid \"Could not delete the file. You are not authenticated.\"\nmsgstr \"无法删除文件。您尚未认证。\"\n\n#: lib/Lufi/Controller/Files.pm:483\nmsgid \"Could not find the file. Are you sure of the URL and the token?\"\nmsgstr \"找不到文件。您确定网址及令牌无误吗？\"\n\n#: lib/Lufi/Controller/Files.pm:394\nmsgid \"Could not find the file. Are you sure of the URL?\"\nmsgstr \"找不到文件。您确定网址无误吗？\"\n\n#: themes/default/templates/files.html.ep:29\nmsgid \"Counter\"\nmsgstr \"下载次数\"\n\n#: themes/default/templates/index.html.ep:100\nmsgid \"Create a zip archive with the files before uploading?\"\nmsgstr \"在上传前先将文件压缩成 zip 格式？\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:26\nmsgid \"Created at\"\nmsgstr \"创建时间\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:14\nmsgid \"Delete\"\nmsgstr \"删除\"\n\n#: themes/default/templates/files.html.ep:30 themes/default/templates/index.html.ep:90\nmsgid \"Delete at first download?\"\nmsgstr \"第一次下载后删除？\"\n\n#: themes/default/templates/files.html.ep:19\nmsgid \"Delete selected files\"\nmsgstr \"删除选中文件\"\n\n#: themes/default/templates/files.html.ep:33 themes/default/templates/partial/index.js.ep:19\nmsgid \"Deletion link\"\nmsgstr \"删除链接\"\n\n#: themes/default/templates/delays.html.ep:9\nmsgid \"Don't worry: if a user begins to download the file before the expiration and the download ends after the expiration, he will be able to get the file.\"\nmsgstr \"无需担心：如果用户在失效前开始下载，并在失效后才下载完毕，他仍然能取得该文件。\"\n\n#: themes/default/templates/partial/index.js.ep:21 themes/default/templates/render.html.ep:28\nmsgid \"Download\"\nmsgstr \"下载\"\n\n#: themes/default/templates/partial/render.js.ep:4\nmsgid \"Download aborted.\"\nmsgstr \"下载已中止。\"\n\n#: themes/default/templates/files.html.ep:28 themes/default/templates/partial/index.js.ep:20\nmsgid \"Download link\"\nmsgstr \"下载链接\"\n\n#: themes/default/templates/about.html.ep:10\nmsgid \"Drag and drop files in the appropriate area or use the traditional way to send files and the files will be chunked, encrypted and sent to the server. You will get two links per file: a download link, that you give to the people you want to share the file with and a deletion link, allowing you to delete the file whenever you want.\"\nmsgstr \"\"\n\"拖动文件到指定区域或通过传统方式发送文件，文件会被分块、加密然后发送到服务器。每一个文件都会产生一条下载链接，用于分享给其他人下载文件，和一条删除链接，用\"\n\"于随时删除该文件。\"\n\n#: themes/default/templates/index.html.ep:122\nmsgid \"Drop files here\"\nmsgstr \"拖动文件到这里\"\n\n#: themes/default/templates/invitations/invite.html.ep:40\nmsgid \"Email address of your guest\"\nmsgstr \"邀请对象的电子邮件地址\"\n\n#: themes/default/templates/mail.html.ep:39\nmsgid \"Email body\"\nmsgstr \"邮件正文\"\n\n#: themes/default/templates/mail.html.ep:31\nmsgid \"Email subject\"\nmsgstr \"邮件主题\"\n\n#: themes/default/templates/mail.html.ep:25 themes/default/templates/mail.html.ep:27\nmsgid \"Emails\"\nmsgstr \"电子邮件\"\n\n#: themes/default/templates/partial/index.js.ep:22\nmsgid \"Encrypting part XX1 of XX2\"\nmsgstr \"正在加密第 XX1 / XX2 部分\"\n\n#: lib/Lufi/Controller/Files.pm:283\nmsgid \"Error: the file existed but was deleted.\"\nmsgstr \"错误：文件存在但已被删除。\"\n\n#: lib/Lufi/Controller/Files.pm:363\nmsgid \"Error: the file has not been sent entirely.\"\nmsgstr \"错误：文件尚未完整发送。\"\n\n#: lib/Lufi/Controller/Files.pm:373\nmsgid \"Error: unable to find the file. Are you sure of your URL?\"\nmsgstr \"错误：找不到文件。您确定网址无误吗？\"\n\n#: themes/default/templates/partial/index.js.ep:23\nmsgid \"Expiration:\"\nmsgstr \"有效期至：\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:27\nmsgid \"Expire at\"\nmsgstr \"有效期至\"\n\n#: themes/default/templates/files.html.ep:32\nmsgid \"Expires at\"\nmsgstr \"有效期至\"\n\n#: themes/default/templates/files.html.ep:12\nmsgid \"Export localStorage data\"\nmsgstr \"导出本地存储数据\"\n\n#: lib/Lufi/Controller/Files.pm:465\nmsgid \"File deleted\"\nmsgstr \"文件已删除\"\n\n#: themes/default/templates/partial/render.js.ep:9\nmsgid \"File downloaded\"\nmsgstr \"文件已下载\"\n\n#: themes/default/templates/files.html.ep:27\nmsgid \"File name\"\nmsgstr \"文件名称\"\n\n#: themes/default/templates/partial/index.js.ep:24\nmsgid \"File uploaded\"\nmsgstr \"文件已上传\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:61\nmsgid \"Files\"\nmsgstr \"文件\"\n\n#: themes/default/templates/index.html.ep:80\nmsgid \"Files deleted at first download\"\nmsgstr \"文件已在第一次下载后删除\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:28\nmsgid \"Files sent at\"\nmsgstr \"文件发送自\"\n\n#: themes/default/templates/partial/invitations.js.ep:8\nmsgid \"Files sent in invitation XX1 by XX2\"\nmsgstr \"文件由 XX2 通过 XX1 邀请发送\"\n\n#: themes/default/templates/partial/render.js.ep:8\nmsgid \"Get the file\"\nmsgstr \"获取文件\"\n\n#: themes/default/templates/about.html.ep:18\nmsgid \"Get the source code on <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi\\\" class=\\\"classic\\\">the official repository</a> or on its <a href=\\\"https://github.com/ldidry/lufi\\\" class=\\\"classic\\\">Github mirror</a>\"\nmsgstr \"\"\n\"在<a href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi\\\" class=\\\"classic\"\n\"\\\">官方仓库</a>或 <a href=\\\"https://github.com/ldidry/lufi\\\" class=\\\"classic\\\"\"\n\">Github 镜像</a>上获取源代码\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:24\nmsgid \"Guest mail\"\nmsgstr \"邀请对象邮件\"\n\n#. (ucfirst(stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:6\nmsgid \"Hello %1,\"\nmsgstr \"您好 %1，\"\n\n#: themes/default/templates/invitations/invite.mail.ep:4\nmsgid \"Hello,\"\nmsgstr \"您好，\"\n\n#: themes/default/templates/partial/mail.js.ep:35\nmsgid \"Hello,\\\\n\\\\nHere's some files I want to share with you:\\\\n\"\nmsgstr \"\"\n\"您好，\\\\n\"\n\"\\\\n\"\n\"我希望与您分享一些文件：\\\\n\"\n\n#: themes/default/templates/mail.html.ep:35\nmsgid \"Here's some files\"\nmsgstr \"与您分享的文件\"\n\n#: themes/default/templates/partial/invitations.js.ep:7\nmsgid \"Hide hidden invitations\"\nmsgstr \"不显示隐藏的邀请\"\n\n#: themes/default/templates/partial/index.js.ep:26\nmsgid \"Hit Enter, then Ctrl+C to copy all the download links\"\nmsgstr \"按下回车键，然后按 Ctrl+C 复制所有下载链接\"\n\n#: themes/default/templates/partial/index.js.ep:25\nmsgid \"Hit Enter, then Ctrl+C to copy the download link\"\nmsgstr \"按下回车键，然后按 Ctrl+C 复制下载链接\"\n\n#: themes/default/templates/about.html.ep:9\nmsgid \"How does it work?\"\nmsgstr \"它如何运作？\"\n\n#: themes/default/templates/invitations/invite.html.ep:46\nmsgid \"How many days would you like the invitation to be valid?\"\nmsgstr \"您希望邀请的有效期限为多少天？\"\n\n#: themes/default/templates/about.html.ep:16\nmsgid \"How to install the software on my server?\"\nmsgstr \"怎样在我的服务器上安装此软件？\"\n\n#: themes/default/templates/about.html.ep:12\nmsgid \"How to report an illegal file?\"\nmsgstr \"怎样举报非法文件？\"\n\n#: themes/default/templates/delays.html.ep:8\nmsgid \"If you choose a delay, the file will be deleted after that delay.\"\nmsgstr \"如果您选择了有效期，则文件会在有效期限后删除。\"\n\n#: themes/default/templates/mail.html.ep:15\nmsgid \"If you send the mail from this server, the links will be sent to the server, which may lower your privacy protection.\"\nmsgstr \"如果您从此服务器寄出邮件，那么链接将会被发送到此服务器上，这会减弱您的隐私防护。\"\n\n#: themes/default/templates/files.html.ep:14\nmsgid \"Import localStorage data\"\nmsgstr \"导入本地存储数据\"\n\n#: themes/default/templates/index.html.ep:53\nmsgid \"Important: more information on delays\"\nmsgstr \"重要：关于有效期的更多信息\"\n\n#: themes/default/templates/delays.html.ep:5\nmsgid \"Information about delays\"\nmsgstr \"有效期信息\"\n\n#: themes/default/templates/files.html.ep:18 themes/default/templates/invitations/my_invitations.html.ep:12\nmsgid \"Invert selection\"\nmsgstr \"反向选择\"\n\n#. ($i->guest_mail, $url)\n#: lib/Lufi/Controller/Invitation.pm:172\nmsgid \"Invitation resent to %1.<br> URL: %2\"\nmsgstr \"重新寄给 %1 的邀请。<br>网址：%2\"\n\n#. ($invitation->guest_mail, $url)\n#: lib/Lufi/Controller/Invitation.pm:88\nmsgid \"Invitation sent to %1.<br> URL: %2\"\nmsgstr \"寄给 %1 的邀请。<br>网址：%2\"\n\n#: themes/default/templates/invitations/invite.html.ep:27 themes/default/templates/layouts/default.html.ep:36 themes/default/templates/layouts/default.html.ep:69\nmsgid \"Invite a guest\"\nmsgstr \"邀请对象\"\n\n#: themes/default/templates/partial/render.js.ep:6\nmsgid \"It seems that the key in your URL is incorrect. Please, verify your URL.\"\nmsgstr \"您网址包含的密钥似乎不正确。请检查您的网址。\"\n\n#: themes/default/templates/index.html.ep:12\nmsgid \"Javascript is disabled. You won't be able to use Lufi.\"\nmsgstr \"Javascript 被禁用。您无法使用 Lufi。\"\n\n#: themes/default/templates/layouts/default.html.ep:44 themes/default/templates/layouts/default.html.ep:46 themes/default/templates/layouts/default.html.ep:77 themes/default/templates/layouts/default.html.ep:79\nmsgid \"Language\"\nmsgstr \"语言\"\n\n#. (sprintf('<a href=\"https://framagit.org/fiat-tux/hat-softwares/lufi/-/commit/%s\" class=\"classic\">%s</a>', stash('version')\n#: themes/default/templates/about.html.ep:22\nmsgid \"Latest commit of this instance: %1\"\nmsgstr \"这个实例最近一次提交：%1\"\n\n#. (sprintf('<a href=\"https://framagit.org/fiat-tux/hat-softwares/lufi/-/releases/%s\" class=\"classic\">%s</a>', stash('version')\n#: themes/default/templates/about.html.ep:21\nmsgid \"Latest tag of this instance: %1\"\nmsgstr \"这个实例最近一个标签：%1\"\n\n#: themes/default/templates/login.html.ep:15\nmsgid \"Login\"\nmsgstr \"登录\"\n\n#: themes/default/templates/layouts/default.html.ep:58 themes/default/templates/layouts/default.html.ep:91\nmsgid \"Logout\"\nmsgstr \"注销\"\n\n#: themes/default/templates/about.html.ep:4\nmsgid \"Lufi is a free (as in free speech) file hosting software.\"\nmsgstr \"Lufi 是一款自由的文件托管软件。\"\n\n#: themes/default/templates/partial/files.js.ep:12\nmsgid \"Lufi recently changed its way to store files information.\\\\n\\\\nNo files have been found in the new localStorage location but we found files in the old one.\\\\nDo you want to import those informations?\\\\n\\\\nPlease note that this is the only time that we will ask you this.\"\nmsgstr \"\"\n\"Lufi 最近变更了保存文件信息的方式。\\\\n\"\n\"\\\\n\"\n\"在新的本地存储数据中找不到文件，但在旧的数据中发现文件。\\\\n\"\n\"您是否想导入这些信息？\\\\n\"\n\"\\\\n\"\n\"请注意我们只会问您一次这个问题。\"\n\n#: themes/default/templates/files.html.ep:34\nmsgid \"Mail\"\nmsgstr \"寄信\"\n\n#: themes/default/templates/files.html.ep:3 themes/default/templates/layouts/default.html.ep:34 themes/default/templates/layouts/default.html.ep:67\nmsgid \"My files\"\nmsgstr \"我的文件\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:5 themes/default/templates/layouts/default.html.ep:37 themes/default/templates/layouts/default.html.ep:70\nmsgid \"My invitations\"\nmsgstr \"我的邀请\"\n\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:17\nmsgid \"NB: this list includes the list of files that have already been sent to you.\"\nmsgstr \"注意：这份列表包含发送给您的文件。\"\n\n#: themes/default/templates/index.html.ep:115\nmsgid \"Name of the zip file\"\nmsgstr \"Zip 压缩文件的名称\"\n\n#. (format_bytes($json->{size})\n#: lib/Lufi/Controller/Files.pm:109\nmsgid \"No enough space available on the server for this file (size: %1).\"\nmsgstr \"服务器没有足够的空间存放此文件（大小：%1）。\"\n\n#: themes/default/templates/partial/files.js.ep:10 themes/default/templates/partial/index.js.ep:29\nmsgid \"No expiration delay\"\nmsgstr \"不设有效期\"\n\n#: themes/default/templates/files.html.ep:8\nmsgid \"Only the files sent with this browser will be listed here. This list is stored in localStorage: if you delete your localStorage data, you'll lose this list.\"\nmsgstr \"只有经当前浏览器发送的文件会被列在这里。这份列表仅存储在本地：若您删除了本地存储数据，就会丢失此列表。\"\n\n#: themes/default/templates/index.html.ep:106 themes/default/templates/login.html.ep:21 themes/default/templates/render.html.ep:26\nmsgid \"Password\"\nmsgstr \"密码\"\n\n#. (config('contact')\n#: themes/default/templates/about.html.ep:13\nmsgid \"Please contact the administrator: %1\"\nmsgstr \"请联系管理员：%1\"\n\n#: themes/default/templates/render.html.ep:33\nmsgid \"Please wait while we are getting your file. We first need to download and decrypt all parts before you can get it.\"\nmsgstr \"请耐心等候，在您收到文件之前我们先要下载并解密文件的所有部分。\"\n\n#: lib/Lufi/Controller/Auth.pm:38\nmsgid \"Please, check your credentials or your right to access this service: unable to authenticate.\"\nmsgstr \"请检查您的凭据或对于此服务的访问权限：无法验证身份。\"\n\n#: themes/default/templates/about.html.ep:5\nmsgid \"Privacy\"\nmsgstr \"隐私\"\n\n#: themes/default/templates/files.html.ep:13\nmsgid \"Purge expired files from localStorage\"\nmsgstr \"清除本地存储数据中的过期文件\"\n\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:20\nmsgid \"Regards,\"\nmsgstr \"祝好，\"\n\n#: themes/default/templates/invitations/invite.mail.ep:15\nmsgid \"Regards.\"\nmsgstr \"祝好。\"\n\n#: themes/default/templates/layouts/default.html.ep:31 themes/default/templates/layouts/default.html.ep:64\nmsgid \"Report file\"\nmsgstr \"举报文件\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:15\nmsgid \"Resend invitation mail\"\nmsgstr \"重新发送邀请邮件\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:9\nmsgid \"Rows in purple mean that the invitations have expired.\"\nmsgstr \"紫色行表示邀请已经过期。\"\n\n#: themes/default/templates/files.html.ep:9\nmsgid \"Rows in red mean that the files have expired and are no longer available.\"\nmsgstr \"红色行表示文件已经过期，无法再获取。\"\n\n#: themes/default/templates/partial/index.js.ep:27\nmsgid \"Send all links by email\"\nmsgstr \"通过电子邮件发送所有链接\"\n\n#: themes/default/templates/invitations/invite.html.ep:50\nmsgid \"Send the invitation\"\nmsgstr \"发送邀请\"\n\n#: themes/default/templates/mail.html.ep:46\nmsgid \"Send with this server\"\nmsgstr \"通过此服务器发送\"\n\n#: themes/default/templates/mail.html.ep:47\nmsgid \"Send with your own mail software\"\nmsgstr \"通过您自己的邮件软件发送\"\n\n#: themes/default/templates/partial/index.js.ep:30\nmsgid \"Sending part XX1 of XX2. Please, be patient, the progress bar can take a while to move.\"\nmsgstr \"正在发送第 XX1 / XX2 部分。请耐心等候，进度条可能需要一点时间才会变化。\"\n\n#. (url_for('/')\n#: themes/default/templates/partial/mail.js.ep:48\nmsgid \"Share your files in total privacy on %1\"\nmsgstr \"在 %1 私密地分享您的文件\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:13 themes/default/templates/partial/invitations.js.ep:9\nmsgid \"Show hidden invitations\"\nmsgstr \"显示隐藏的邀请\"\n\n#: themes/default/templates/partial/render.js.ep:12\nmsgid \"Show zip content\"\nmsgstr \"显示 zip 文件内容\"\n\n#: themes/default/templates/layouts/default.html.ep:40 themes/default/templates/layouts/default.html.ep:73 themes/default/templates/login.html.ep:28 themes/default/templates/logout.html.ep:17\nmsgid \"Signin\"\nmsgstr \"登录\"\n\n#: lib/Lufi/Controller/Invitation.pm:284 themes/default/templates/invitations/exception.html.ep:16\nmsgid \"Sorry, the invitation doesn’t exist. Are you sure you are on the right URL?\"\nmsgstr \"抱歉，邀请不存在。您确定网址无误吗？\"\n\n#: themes/default/templates/index.html.ep:46\nmsgid \"Sorry, the uploading is currently disabled. Please try again later.\"\nmsgstr \"抱歉，上传暂时被禁用。请稍后再试。\"\n\n#: lib/Lufi/Controller/Files.pm:82\nmsgid \"Sorry, uploading is disabled.\"\nmsgstr \"抱歉，上传被禁用。\"\n\n#: themes/default/templates/invitations/exception.html.ep:7\nmsgid \"Sorry, your invitation has expired or has been deleted.\"\nmsgstr \"抱歉，您的邀请已过期或已被删除。\"\n\n#. ($invit->ldap_user_mail)\n#: lib/Lufi/Controller/Files.pm:123\nmsgid \"Sorry, your invitation has expired or has been deleted. Please contact %1 to have another invitation.\"\nmsgstr \"抱歉，您的邀请已过期或已被删除。请联系 %1 获取新邀请。\"\n\n#. ($invitation->ldap_user_mail)\n#: lib/Lufi/Controller/Invitation.pm:277\nmsgid \"The URLs of your files have been sent by email to %1.\"\nmsgstr \"您的文件网址已通过电子邮件发送给 %1。\"\n\n#: themes/default/templates/about.html.ep:7\nmsgid \"The administrator can only see the file's name, its size and its mimetype (what kind of file it is: video, text, etc.).\"\nmsgstr \"管理员只能够看到文件的名称、大小以及媒体类型（视频、文本文件等）。\"\n\n#: lib/Lufi/Controller/Mail.pm:53\nmsgid \"The body of the mail must contain at least one URL pointing to a file hosted on this instance.\"\nmsgstr \"邮件正文至少要包含一个网址指向托管在当前实例的文件。\"\n\n#: themes/default/templates/partial/files.js.ep:11\nmsgid \"The data has been successfully imported.\"\nmsgstr \"已成功导入数据。\"\n\n#: lib/Lufi/Controller/Mail.pm:73\nmsgid \"The email body can't be empty.\"\nmsgstr \"邮件正文不能为空。\"\n\n#: lib/Lufi/Controller/Mail.pm:72\nmsgid \"The email subject can't be empty.\"\nmsgstr \"邮件主题不能为空。\"\n\n#. ($expire_at, $max_expire_at)\n#: lib/Lufi/Controller/Invitation.pm:52\nmsgid \"The expiration delay (%1) is not between 1 and %2 days.\"\nmsgstr \"有效期（%1）不在 1 到 %2 天之间。\"\n\n#: lib/Lufi/Controller/Files.pm:462\nmsgid \"The file has already been deleted\"\nmsgstr \"文件已经被删除\"\n\n#: themes/default/templates/about.html.ep:6\nmsgid \"The files uploaded on a Lufi instance are encrypted before the upload to the server: the administrator of the server can not see the file's content.\"\nmsgstr \"上传到 Lufi 实例的文件在上传之前会先加密：服务器管理员无法查看文件内容。\"\n\n#. (join(', ', @bad)\n#: lib/Lufi/Controller/Mail.pm:68\nmsgid \"The following email addresses are not valid: %1\"\nmsgstr \"下列电子邮件地址无效：%1\"\n\n#. ($guest_mail)\n#: lib/Lufi/Controller/Invitation.pm:49\nmsgid \"The guest email address (%1) is unvalid.\"\nmsgstr \"邀请对象的电子邮件地址（%1）无效。\"\n\n#. ($i->token, $i->guest_mail)\n#: lib/Lufi/Controller/Invitation.pm:151\nmsgid \"The invitation %1 can’t be resent: %2 has already sent files.<br>Please create a new invitation.\"\nmsgstr \"邀请 %1 无法重新发送：%2 已经发送文件。<br>请创建一份新邀请。\"\n\n#. ($i->token)\n#: lib/Lufi/Controller/Invitation.pm:131\nmsgid \"The invitation %1 has been deleted.\"\nmsgstr \"邀请 %1 已被删除。\"\n\n#. (stash('user_mail')\n#: themes/default/templates/invitations/invite.html.ep:34\nmsgid \"The invitation mail will be send from your email address (%1).\"\nmsgstr \"邀请邮件会从您的电子邮件地址（%1）发出。\"\n\n#: themes/default/templates/partial/index.js.ep:16\nmsgid \"The link(s) has been copied to your clipboard\"\nmsgstr \"链接已经复制到您的剪贴板\"\n\n#. (stash('invitation')\n#: themes/default/templates/index.html.ep:30\nmsgid \"The link(s) of your file(s) will automatically be sent by mail to %1 (%2)\"\nmsgstr \"您的文件链接会自动通过邮件发送给 %1（%2）\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:11\nmsgid \"The links of your file(s) will automatically be sent by mail to %1.\"\nmsgstr \"您的文件的链接会自动通过邮件发送给 %1。\"\n\n#: lib/Lufi/Controller/Mail.pm:97\nmsgid \"The mail has been sent.\"\nmsgstr \"邮件已发送。\"\n\n#: themes/default/templates/about.html.ep:15\nmsgid \"The original (and only for now) author is <a href=\\\"https://fiat-tux.fr\\\" class=\\\"classic\\\">Luc Didry</a>.\"\nmsgstr \"\"\n\"最初（亦是至今唯一）的作者为 <a href=\\\"https://fiat-tux.fr\\\" class=\\\"classic\\\">Luc \"\n\"Didry</a>。\"\n\n#: lib/Lufi/Controller/Files.pm:230\nmsgid \"The server was unable to find the file record to add your file part to. Please, contact the administrator.\"\nmsgstr \"服务器找不到相应的文件记录来加入您的文件块。请联系管理员。\"\n\n#: lib/Lufi/Controller/Files.pm:289\nmsgid \"This file has been deactivated by the admins. Contact them to know why.\"\nmsgstr \"此文件已被管理员封禁。请联系他们了解详细信息。\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:46 themes/default/templates/partial/invitations.js.ep:6\nmsgid \"This invitation is normally hidden\"\nmsgstr \"此邀请通常会被隐藏\"\n\n#. (stash('expires')\n#: themes/default/templates/invitations/invite.mail.ep:13\nmsgid \"This invitation is valid until %1.\"\nmsgstr \"此邀请会一直有效直到 %1。\"\n\n#: themes/default/templates/delays.html.ep:13\nmsgid \"This server sets limitations according to the file size. The expiration delay of your file will be the minimum between what you choose and the following limitations:\"\nmsgstr \"此服务器根据文件大小设置了上限。文件的有效期会被设置为您所选取选项与该上限间两者的最小值：\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:16\nmsgid \"Toggle visibility\"\nmsgstr \"开关隐藏邀请\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:25\nmsgid \"URL\"\nmsgstr \"网址\"\n\n#: themes/default/templates/partial/index.js.ep:17\nmsgid \"Unable to copy the link(s) to your clipboard\"\nmsgstr \"无法复制链接到您的剪贴板\"\n\n#: themes/default/templates/partial/render.js.ep:13\nmsgid \"Unable to download the file: too much unsuccessful attempts to open a websocket. Please, contact the administrator.\"\nmsgstr \"无法下载文件：多次尝试开启 websocket 失败。请联系管理员。\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:433\nmsgid \"Unable to get counter for %1. The file does not exists. It will be removed from your localStorage.\"\nmsgstr \"无法获取 %1 的下载次数。该文件不存在。其将会从您的本地存储数据中移除。\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:423\nmsgid \"Unable to get counter for %1. The token is invalid.\"\nmsgstr \"无法获取 %1 的下载次数。令牌无效。\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:443\nmsgid \"Unable to get counter for %1. You are not authenticated.\"\nmsgstr \"无法获取 %1 的下载次数。您尚未验证身份。\"\n\n#: themes/default/templates/layouts/default.html.ep:33 themes/default/templates/layouts/default.html.ep:66\nmsgid \"Upload files\"\nmsgstr \"上传文件\"\n\n#: themes/default/templates/index.html.ep:145\nmsgid \"Upload generated zip file\"\nmsgstr \"上传生成的 zip 压缩文件\"\n\n#: themes/default/templates/files.html.ep:31\nmsgid \"Uploaded at\"\nmsgstr \"上传时间\"\n\n#: themes/default/templates/index.html.ep:153\nmsgid \"Uploaded files\"\nmsgstr \"已上传文件\"\n\n#: themes/default/templates/about.html.ep:20\nmsgid \"Version\"\nmsgstr \"版本\"\n\n#: themes/default/templates/partial/index.js.ep:31\nmsgid \"Websocket communication error\"\nmsgstr \"Websocket 通信错误\"\n\n#: themes/default/templates/about.html.ep:3\nmsgid \"What is Lufi?\"\nmsgstr \"Lufi 是什么？\"\n\n#: themes/default/templates/about.html.ep:14\nmsgid \"Who wrote this software?\"\nmsgstr \"谁编写了这个软件？\"\n\n#: themes/default/templates/partial/index.js.ep:13\nmsgid \"XXX file has been added to upload queue.\"\nmsgstr \"XXX 文件已被加入上传队列。\"\n\n#: themes/default/templates/invitations/invite.html.ep:30\nmsgid \"You can invite someone to send you files through this Lufi instance even if they don’t have an account on it.\"\nmsgstr \"您可以邀请其他人通过此 Lufi 实例给您发送文件，而不需要注册帐号。\"\n\n#: themes/default/templates/about.html.ep:11\nmsgid \"You can see the list of your files by clicking on the \\\"My files\\\" link at the top right of this page.\"\nmsgstr \"您可以点击「我的文件」选项查看您的文件列表。\"\n\n#: lib/Lufi/Controller/Mail.pm:42\nmsgid \"You can't add URLs that are not related to this instance.\"\nmsgstr \"您无法添加与当前实例无关的网址。\"\n\n#: themes/default/templates/about.html.ep:8\nmsgid \"You don't need to register yourself to upload files but be aware that, for legal reasons, your IP address will be stored when you send a file. Don't panic, this is normally the case for all sites on which you send files.\"\nmsgstr \"您无需注册即可上传文件，但需要注意，鉴于法律原因，在发送文件时您的 IP 地址会被记录。不必担忧，通常所有允许您发送文件的网站都会这样做。\"\n\n#: themes/default/templates/partial/render.js.ep:11\nmsgid \"You don't seem to have a key in your URL. You won't be able to decrypt the file. Download canceled.\"\nmsgstr \"您的网址似乎没有包含密钥。您无法解密此文件。下载已取消。\"\n\n#: themes/default/templates/partial/render.js.ep:7\nmsgid \"You have attempted to leave this page. The download will be canceled. Are you sure?\"\nmsgstr \"您正试图离开此页面。下载将会被取消。您确定要这样做？\"\n\n#: themes/default/templates/partial/index.js.ep:14\nmsgid \"You have attempted to leave this page. The upload will be canceled. Are you sure?\"\nmsgstr \"您正试图离开此页面。上传将会被取消。您确定要这样做？\"\n\n#: themes/default/templates/logout.html.ep:14\nmsgid \"You have been successfully logged out.\"\nmsgstr \"您已成功注销。\"\n\n#: lib/Lufi/Controller/Mail.pm:71\nmsgid \"You must give email addresses.\"\nmsgstr \"您必须填写电子邮件地址。\"\n\n#: themes/default/templates/index.html.ep:38\nmsgid \"Your browser does not have enough entropy to generate a strong encryption key. Please wait (it's better if you do things on your computer while waiting).\"\nmsgstr \"您的浏览器没有足够的信息熵来生成高强度密钥。请耐心等候（最好在等待时用电脑做点其它事情）。\"\n\n#. (format_bytes($json->{size})\n#: lib/Lufi/Controller/Files.pm:95\nmsgid \"Your file is too big: %1 (maximum size allowed: %2)\"\nmsgstr \"您的文件太大：%1（大小上限：%2）\"\n\n#: lib/Lufi/Controller/Files.pm:345\nmsgid \"Your password is not valid. Please refresh the page to retry.\"\nmsgstr \"您的密码无效。请刷新页面重新尝试。\"\n\n#: themes/default/templates/partial/render.js.ep:14\nmsgid \"Zip content:\"\nmsgstr \"Zip 文件内容：\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:24\nmsgid \"between %1 and %2, the file will be kept %3 day(s).\"\nmsgstr \"在 %1 至 %2 之间，文件会保留 %3 天。\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:26\nmsgid \"between %1 and %2, the file will be kept forever.\"\nmsgstr \"在 %1 至 %2 之间，文件会永久保留。\"\n\n#: themes/default/templates/partial/mail.js.ep:42\nmsgid \"deadline: \"\nmsgstr \"有效期至： \"\n\n#: themes/default/templates/partial/invitations.js.ep:5\nmsgid \"expires on XXX\"\nmsgstr \"在 XXX 到期\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:30\nmsgid \"for %1 and more, the file will be kept %2 day(s)\"\nmsgstr \"在 %1 及以上，文件会保留 %2 天\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:32\nmsgid \"for %1 and more, the file will be kept forever.\"\nmsgstr \"在 %1 及以上，文件会永久保留。\"\n\n#: themes/default/templates/index.html.ep:3\nmsgid \"no time limit\"\nmsgstr \"没有时间限制\"\n\n#: themes/default/templates/index.html.ep:124\nmsgid \"or\"\nmsgstr \"或\"\n\n#. ($e->{name}, format_bytes($e->{size})\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:12\nmsgid \"— %1 (%2), that will expire on %3\"\nmsgstr \"— %1（%2），会在 %3 到期\"\n\n#. ($i->token, $c->current_user->{username})\n#: lib/Lufi/Controller/Invitation.pm:136\nmsgid \"The invitation %1 can’t be deleted: it wasn’t created by you (%2).\"\nmsgstr \"邀请 %1 无法被删除：它并非由您（%2）创建。\"\n\n#. ($i->token, $c->current_user->{username})\n#: lib/Lufi/Controller/Invitation.pm:187\nmsgid \"The invitation %1 can’t be resent: it wasn’t created by you (%2).\"\nmsgstr \"邀请 %1 无法重新发送：它并非由您（%2）创建。\"\n\n#. ($orig_uri)\n#: lib/Lufi/Controller/Mail.pm:43 lib/Lufi/Controller/Mail.pm:59\nmsgid \"You can't add URLs that are not related to this instance (%1).\"\nmsgstr \"您无法添加与当前实例无关的网址（%1）。\"\n"
  },
  {
    "path": "themes/default/lib/Lufi/I18N/zh_Hant.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\\n\"\n\"PO-Revision-Date: 2022-12-26 01:38+0000\\n\"\n\"Last-Translator: 李奕寯 <eugenelego88@gmail.com>\\n\"\n\"Language-Team: Chinese (Traditional) <https://weblate.framasoft.org/projects/\"\n\"lufi/default-theme/zh_Hant/>\\n\"\n\"Language: zh_Hant\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\"X-Generator: Weblate 4.14.1\\n\"\n\n#. ($delay)\n#. (max_delay)\n#: themes/default/templates/index.html.ep:56 themes/default/templates/index.html.ep:65 themes/default/templates/index.html.ep:66\nmsgid \"%1 days\"\nmsgstr \"%1 日\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:2\nmsgid \"%1 invites you to send him/her files\"\nmsgstr \"%1 邀請您給他傳送檔案\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:6\nmsgid \"%1 invites you to send him/her files through Lufi.\"\nmsgstr \"%1 邀請您透過 Lufi 給他傳送檔案。\"\n\n#. (stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:4\nmsgid \"%1 sent you files\"\nmsgstr \"%1 傳送了一個檔案給您\"\n\n#. (stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:8\nmsgid \"%1 used your invitation to send you files:\"\nmsgstr \"%1 利用您的邀請傳送檔案給您：\"\n\n#: lib/Lufi/Controller/Invitation.pm:159 lib/Lufi/Controller/Invitation.pm:84 themes/default/templates/invitations/my_invitations.html.ep:51 themes/default/templates/invitations/my_invitations.html.ep:52 themes/default/templates/invitations/my_invitations.html.ep:53 themes/default/templates/invitations/notification_files_sent.mail.ep:12\nmsgid \"%A %d %B %Y at %T\"\nmsgstr \"%A %d %B %Y %T\"\n\n#: themes/default/templates/partial/index.js.ep:28\nmsgid \"(max size: XXX)\"\nmsgstr \"（大小上限：XXX）\"\n\n#: themes/default/templates/index.html.ep:5\nmsgid \"1 year\"\nmsgstr \"1 年\"\n\n#: themes/default/templates/index.html.ep:4 themes/default/templates/index.html.ep:65\nmsgid \"24 hours\"\nmsgstr \"24 小時\"\n\n#: themes/default/templates/partial/mail.js.ep:40\nmsgid \":\"\nmsgstr \"：\"\n\n#: themes/default/templates/render.html.ep:42\nmsgid \"Abort\"\nmsgstr \"捨棄\"\n\n#: themes/default/templates/layouts/default.html.ep:53 themes/default/templates/layouts/default.html.ep:86\nmsgid \"About\"\nmsgstr \"關於\"\n\n#: themes/default/templates/index.html.ep:107\nmsgid \"Add a password to file(s)\"\nmsgstr \"爲檔案加設密碼\"\n\n#: themes/default/templates/mail.html.ep:16\nmsgid \"Adding URLs not related to this Lufi instance to the mail body or subject is prohibited.\"\nmsgstr \"嚴禁將與此 Lufi 實例無關的網址加入到郵件內文或主旨中。\"\n\n#: themes/default/templates/partial/invitations.js.ep:3\nmsgid \"Are you sure you want to delete the selected invitations?\"\nmsgstr \"您確定要刪除選中的邀請嗎？\"\n\n#: themes/default/templates/partial/invitations.js.ep:4\nmsgid \"Are you sure you want to resend the invitation mail for the selected invitations?\"\nmsgstr \"您確定要爲選中的邀請重新寄出郵件嗎？\"\n\n#: themes/default/templates/about.html.ep:17\nmsgid \"As Lufi is a free software licensed under of the terms of the <a href=\\\"https://gnu.org/licenses/agpl.html\\\" class=\\\"classic\\\">AGPLv3</a>, you can install it on you own server. Have a look on the <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi/wikis/home\\\" class=\\\"classic\\\">Wiki</a> for the procedure.\"\nmsgstr \"\"\n\"Lufi 是基於 <a href=\\\"https://gnu.org/licenses/agpl.html\\\" class=\\\"classic\\\"\"\n\">AGPLv3</a> 特許條款的自由軟件，您可以將其安裝在自己的伺服器上。請檢視 <a href=\\\"https://framagit.org/\"\n\"fiat-tux/hat-softwares/lufi/wikis/home\\\" class=\\\"classic\\\">Wiki</a> 以瞭解詳細資訊。\"\n\n#. (stash('nbslices')\n#: themes/default/templates/partial/render.js.ep:10\nmsgid \"Asking for file part XX1 of %1\"\nmsgstr \"正在請求檔案第 XX1 / %1 部分\"\n\n#: themes/default/templates/about.html.ep:23\nmsgid \"Back to homepage\"\nmsgstr \"回到首頁\"\n\n#: lib/Lufi/Controller/Mail.pm:25\nmsgid \"Bad CSRF token!\"\nmsgstr \"損毀的 CSRF 權杖！\"\n\n#: lib/Lufi/Controller/Auth.pm:27 lib/Lufi/Controller/Auth.pm:49\nmsgid \"Bad CSRF token.\"\nmsgstr \"損毀的 CSRF 權杖。\"\n\n#: themes/default/templates/partial/render.js.ep:5\nmsgid \"Click here to refresh the page and restart the download.\"\nmsgstr \"點一下刷新頁面並重新下載。\"\n\n#: themes/default/templates/invitations/invite.mail.ep:8\nmsgid \"Click on the following URL to upload files on Lufi:\"\nmsgstr \"點一下下列網址上傳檔案到 Lufi：\"\n\n#: themes/default/templates/index.html.ep:126\nmsgid \"Click to open the file browser\"\nmsgstr \"點一下開啓檔案瀏覽器\"\n\n#: themes/default/templates/delays.html.ep:38 themes/default/templates/invitations/my_invitations.html.ep:80\nmsgid \"Close\"\nmsgstr \"關閉\"\n\n#: themes/default/templates/mail.html.ep:23\nmsgid \"Comma-separated email addresses\"\nmsgstr \"電子郵件地址，以逗號分隔\"\n\n#: themes/default/templates/index.html.ep:140\nmsgid \"Compressing zip file…\"\nmsgstr \"正在壓縮爲 zip 檔案…\"\n\n#: themes/default/templates/partial/index.js.ep:15\nmsgid \"Copy all links to clipboard\"\nmsgstr \"複製所有連結到剪貼簿\"\n\n#: themes/default/templates/partial/index.js.ep:18\nmsgid \"Copy to clipboard\"\nmsgstr \"複製到剪貼簿\"\n\n#: lib/Lufi/Controller/Files.pm:501\nmsgid \"Could not delete the file. You are not authenticated.\"\nmsgstr \"無法刪除檔案。您尚未認證。\"\n\n#: lib/Lufi/Controller/Files.pm:483\nmsgid \"Could not find the file. Are you sure of the URL and the token?\"\nmsgstr \"找不到檔案。您確定網址及權杖無誤嗎？\"\n\n#: lib/Lufi/Controller/Files.pm:394\nmsgid \"Could not find the file. Are you sure of the URL?\"\nmsgstr \"找不到檔案。您確定網址無誤嗎？\"\n\n#: themes/default/templates/files.html.ep:29\nmsgid \"Counter\"\nmsgstr \"下載次數\"\n\n#: themes/default/templates/index.html.ep:100\nmsgid \"Create a zip archive with the files before uploading?\"\nmsgstr \"在上傳前先將檔案壓縮成 zip 格式？\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:26\nmsgid \"Created at\"\nmsgstr \"建立時間\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:14\nmsgid \"Delete\"\nmsgstr \"刪除\"\n\n#: themes/default/templates/files.html.ep:30 themes/default/templates/index.html.ep:90\nmsgid \"Delete at first download?\"\nmsgstr \"第一次下載後刪除？\"\n\n#: themes/default/templates/files.html.ep:19\nmsgid \"Delete selected files\"\nmsgstr \"刪除選中檔案\"\n\n#: themes/default/templates/files.html.ep:33 themes/default/templates/partial/index.js.ep:19\nmsgid \"Deletion link\"\nmsgstr \"刪除連結\"\n\n#: themes/default/templates/delays.html.ep:8\nmsgid \"Don't worry: if a user begins to download the file before the expiration and the download ends after the expiration, he will be able to get the file.\"\nmsgstr \"毋需担心：如果使用者在有效期截至前開始下載，而要一直到有效期過後方能下載完成，他仍然能取得該檔案。\"\n\n#: themes/default/templates/partial/index.js.ep:21 themes/default/templates/render.html.ep:28\nmsgid \"Download\"\nmsgstr \"下載\"\n\n#: themes/default/templates/partial/render.js.ep:4\nmsgid \"Download aborted.\"\nmsgstr \"已捨棄下載。\"\n\n#: themes/default/templates/files.html.ep:28 themes/default/templates/partial/index.js.ep:20\nmsgid \"Download link\"\nmsgstr \"下載連結\"\n\n#: themes/default/templates/about.html.ep:10\nmsgid \"Drag and drop files in the appropriate area or use the traditional way to send files and the files will be chunked, encrypted and sent to the server. You will get two links per file: a download link, that you give to the people you want to share the file with and a deletion link, allowing you to delete the file whenever you want.\"\nmsgstr \"\"\n\"透過拖曳或傳統方式送出檔案，檔案會被分塊、加密然後傳送到伺服器。每一個成功送出的檔案都會產生一條下載連結和一條刪除連結。您可以將下載連結分享給其他人。在瀏\"\n\"覽器開啓下載連結可以下載該檔案，而開啓刪除連結則會刪除該檔案。\"\n\n#: themes/default/templates/index.html.ep:122\nmsgid \"Drop files here\"\nmsgstr \"拖曳檔案到這裏\"\n\n#: themes/default/templates/invitations/invite.html.ep:40\nmsgid \"Email address of your guest\"\nmsgstr \"邀請對象的電子郵件地址\"\n\n#: themes/default/templates/mail.html.ep:39\nmsgid \"Email body\"\nmsgstr \"郵件內文\"\n\n#: themes/default/templates/mail.html.ep:31\nmsgid \"Email subject\"\nmsgstr \"郵件主旨\"\n\n#: themes/default/templates/mail.html.ep:25 themes/default/templates/mail.html.ep:27\nmsgid \"Emails\"\nmsgstr \"電子郵件\"\n\n#: themes/default/templates/partial/index.js.ep:22\nmsgid \"Encrypting part XX1 of XX2\"\nmsgstr \"正在加密第 XX1 / XX2 部分\"\n\n#: lib/Lufi/Controller/Files.pm:283\nmsgid \"Error: the file existed but was deleted.\"\nmsgstr \"錯誤：檔案存在但已被刪除。\"\n\n#: lib/Lufi/Controller/Files.pm:363\nmsgid \"Error: the file has not been sent entirely.\"\nmsgstr \"錯誤：檔案尚未傳送完全。\"\n\n#: lib/Lufi/Controller/Files.pm:373\nmsgid \"Error: unable to find the file. Are you sure of your URL?\"\nmsgstr \"錯誤：找不到檔案。您確定您的網址無誤嗎？\"\n\n#: themes/default/templates/partial/index.js.ep:23\nmsgid \"Expiration:\"\nmsgstr \"有效期至：\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:27\nmsgid \"Expire at\"\nmsgstr \"有效期至\"\n\n#: themes/default/templates/files.html.ep:32\nmsgid \"Expires at\"\nmsgstr \"有效期至\"\n\n#: themes/default/templates/files.html.ep:12\nmsgid \"Export localStorage data\"\nmsgstr \"匯出本機存儲數據\"\n\n#: lib/Lufi/Controller/Files.pm:465\nmsgid \"File deleted\"\nmsgstr \"檔案已刪除\"\n\n#: themes/default/templates/partial/render.js.ep:9\nmsgid \"File downloaded\"\nmsgstr \"檔案已下載\"\n\n#: themes/default/templates/files.html.ep:27\nmsgid \"File name\"\nmsgstr \"檔案名稱\"\n\n#: themes/default/templates/partial/index.js.ep:24\nmsgid \"File uploaded\"\nmsgstr \"檔案已上傳\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:61\nmsgid \"Files\"\nmsgstr \"檔案\"\n\n#: themes/default/templates/index.html.ep:80\nmsgid \"Files deleted at first download\"\nmsgstr \"檔案已在第一次下載後刪除\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:28\nmsgid \"Files sent at\"\nmsgstr \"檔案傳送自\"\n\n#: themes/default/templates/partial/invitations.js.ep:8\nmsgid \"Files sent in invitation XX1 by XX2\"\nmsgstr \"檔案由 XX2 透過 XX1 邀請傳送\"\n\n#: themes/default/templates/partial/render.js.ep:8\nmsgid \"Get the file\"\nmsgstr \"取得檔案\"\n\n#: themes/default/templates/about.html.ep:18\nmsgid \"Get the source code on <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi\\\" class=\\\"classic\\\">the official repository</a> or on its <a href=\\\"https://github.com/ldidry/lufi\\\" class=\\\"classic\\\">Github mirror</a>\"\nmsgstr \"\"\n\"在 <a href=\\\"https://framagit.org/fiat-tux/hat-softwares/lufi\\\" class=\"\n\"\\\"classic\\\">官方倉庫</a> 或其 <a href=\\\"https://github.com/ldidry/lufi\\\" class=\"\n\"\\\"classic\\\">Github 鏡像</a> 上取得原始碼\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:24\nmsgid \"Guest mail\"\nmsgstr \"邀請對象郵件\"\n\n#. (ucfirst(stash('invitation')\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:6\nmsgid \"Hello %1,\"\nmsgstr \"您好 %1,\"\n\n#: themes/default/templates/invitations/invite.mail.ep:4\nmsgid \"Hello,\"\nmsgstr \"您好，\"\n\n#: themes/default/templates/partial/mail.js.ep:35\nmsgid \"Hello,\\\\n\\\\nHere's some files I want to share with you:\\\\n\"\nmsgstr \"\"\n\"您好，\\\\n\"\n\"\\\\n\"\n\"這裏有一些檔案我希望與您分享：\\\\n\"\n\n#: themes/default/templates/mail.html.ep:35\nmsgid \"Here's some files\"\nmsgstr \"有檔案與您分享\"\n\n#: themes/default/templates/partial/invitations.js.ep:7\nmsgid \"Hide hidden invitations\"\nmsgstr \"不顯示隱藏的邀請\"\n\n#: themes/default/templates/partial/index.js.ep:26\nmsgid \"Hit Enter, then Ctrl+C to copy all the download links\"\nmsgstr \"按一下回車鍵，然後按 Ctrl+C 複製所有下載連結\"\n\n#: themes/default/templates/partial/index.js.ep:25\nmsgid \"Hit Enter, then Ctrl+C to copy the download link\"\nmsgstr \"按一下回車鍵，然後按 Ctrl+C 複製下載連結\"\n\n#: themes/default/templates/about.html.ep:9\nmsgid \"How does it work?\"\nmsgstr \"它如何運作？\"\n\n#: themes/default/templates/invitations/invite.html.ep:46\nmsgid \"How many days would you like the invitation to be valid?\"\nmsgstr \"您希望邀請的有效期限爲多少天？\"\n\n#: themes/default/templates/about.html.ep:16\nmsgid \"How to install the software on my server?\"\nmsgstr \"怎樣在我的伺服器上安裝此軟件？\"\n\n#: themes/default/templates/about.html.ep:12\nmsgid \"How to report an illegal file?\"\nmsgstr \"怎樣回報非法檔案？\"\n\n#: themes/default/templates/delays.html.ep:7\nmsgid \"If you choose a delay, the file will be deleted after that delay.\"\nmsgstr \"如果您選擇了一個有效期，則檔案會在有效期過後刪除。\"\n\n#: themes/default/templates/mail.html.ep:15\nmsgid \"If you send the mail from this server, the links will be sent to the server, which may lower your privacy protection.\"\nmsgstr \"如果您從這臺伺服器寄出郵件，那麼所有連結都將會被傳送到伺服器上，這會減弱您的私隱防護。\"\n\n#: themes/default/templates/files.html.ep:14\nmsgid \"Import localStorage data\"\nmsgstr \"匯入本機存儲數據\"\n\n#: themes/default/templates/index.html.ep:53\nmsgid \"Important: more information on delays\"\nmsgstr \"重要：更多資訊關於有效期\"\n\n#: themes/default/templates/delays.html.ep:5\nmsgid \"Information about delays\"\nmsgstr \"有效期詳解\"\n\n#: themes/default/templates/files.html.ep:18 themes/default/templates/invitations/my_invitations.html.ep:12\nmsgid \"Invert selection\"\nmsgstr \"反向選取\"\n\n#. ($i->guest_mail, $url)\n#: lib/Lufi/Controller/Invitation.pm:171\nmsgid \"Invitation resent to %1.<br> URL: %2\"\nmsgstr \"重新寄給 %1 的邀請。<br>網址：%2\"\n\n#. ($invitation->guest_mail, $url)\n#: lib/Lufi/Controller/Invitation.pm:87\nmsgid \"Invitation sent to %1.<br> URL: %2\"\nmsgstr \"寄給 %1 的邀請。<br>網址：%2\"\n\n#: themes/default/templates/invitations/invite.html.ep:27 themes/default/templates/layouts/default.html.ep:36 themes/default/templates/layouts/default.html.ep:69\nmsgid \"Invite a guest\"\nmsgstr \"邀請對象\"\n\n#: themes/default/templates/partial/render.js.ep:6\nmsgid \"It seems that the key in your URL is incorrect. Please, verify your URL.\"\nmsgstr \"您網址包含的密鑰似乎不正確。請核驗您的網址。\"\n\n#: themes/default/templates/index.html.ep:12\nmsgid \"Javascript is disabled. You won't be able to use Lufi.\"\nmsgstr \"Javascript 被禁用。您無法使用 Lufi。\"\n\n#: themes/default/templates/layouts/default.html.ep:44 themes/default/templates/layouts/default.html.ep:46 themes/default/templates/layouts/default.html.ep:77 themes/default/templates/layouts/default.html.ep:79\nmsgid \"Language\"\nmsgstr \"語言\"\n\n#. (sprintf('<a href=\"https://framagit.org/fiat-tux/hat-softwares/lufi/-/commit/%s\" class=\"classic\">%s</a>', stash('version')\n#: themes/default/templates/about.html.ep:22\nmsgid \"Latest commit of this instance: %1\"\nmsgstr \"這個實例最近一次提交：%1\"\n\n#. (sprintf('<a href=\"https://framagit.org/fiat-tux/hat-softwares/lufi/-/releases/%s\" class=\"classic\">%s</a>', stash('version')\n#: themes/default/templates/about.html.ep:21\nmsgid \"Latest tag of this instance: %1\"\nmsgstr \"這個實例最近一個標籤：%1\"\n\n#: themes/default/templates/login.html.ep:15\nmsgid \"Login\"\nmsgstr \"登入\"\n\n#: themes/default/templates/layouts/default.html.ep:58 themes/default/templates/layouts/default.html.ep:91\nmsgid \"Logout\"\nmsgstr \"登出\"\n\n#: themes/default/templates/about.html.ep:4\nmsgid \"Lufi is a free (as in free speech) file hosting software.\"\nmsgstr \"Lufi 是一歀自由的檔案託管軟件。\"\n\n#: themes/default/templates/partial/files.js.ep:12\nmsgid \"Lufi recently changed its way to store files information.\\\\n\\\\nNo files have been found in the new localStorage location but we found files in the old one.\\\\nDo you want to import those informations?\\\\n\\\\nPlease note that this is the only time that we will ask you this.\"\nmsgstr \"\"\n\"Lufi 近來變更了儲存檔案資訊的方式。\\\\n\"\n\"\\\\n\"\n\"在新的本機存儲數據中找不到檔案，但在舊的數據中有發現檔案。\\\\n\"\n\"您是否想匯入這些資訊？\\\\n\"\n\"\\\\n\"\n\"請註意這個問題只會問這一次。\"\n\n#: themes/default/templates/files.html.ep:34\nmsgid \"Mail\"\nmsgstr \"寄信\"\n\n#: themes/default/templates/files.html.ep:3 themes/default/templates/layouts/default.html.ep:34 themes/default/templates/layouts/default.html.ep:67\nmsgid \"My files\"\nmsgstr \"我的檔案\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:5 themes/default/templates/layouts/default.html.ep:37 themes/default/templates/layouts/default.html.ep:70\nmsgid \"My invitations\"\nmsgstr \"我的邀請\"\n\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:17\nmsgid \"NB: this list includes the list of files that have already been sent to you.\"\nmsgstr \"注意：這份列表包含了您送出過的檔案。\"\n\n#: themes/default/templates/index.html.ep:115\nmsgid \"Name of the zip file\"\nmsgstr \"Zip 壓縮檔案的名稱\"\n\n#. (format_bytes($json->{size})\n#: lib/Lufi/Controller/Files.pm:109\nmsgid \"No enough space available on the server for this file (size: %1).\"\nmsgstr \"伺服器没有足夠空間存放此檔案（大小：%1）。\"\n\n#: themes/default/templates/partial/files.js.ep:10 themes/default/templates/partial/index.js.ep:29\nmsgid \"No expiration delay\"\nmsgstr \"不設有效期\"\n\n#: themes/default/templates/files.html.ep:8\nmsgid \"Only the files sent with this browser will be listed here. This list is stored in localStorage: if you delete your localStorage data, you'll lose this list.\"\nmsgstr \"只有經這個瀏覽器送出的檔案才會被列在這裏。這份列表僅存於本機：若您刪除了本機存儲數據，此列表亦會隨之而去。\"\n\n#: themes/default/templates/index.html.ep:106 themes/default/templates/login.html.ep:21 themes/default/templates/render.html.ep:26\nmsgid \"Password\"\nmsgstr \"密碼\"\n\n#. (config('contact')\n#: themes/default/templates/about.html.ep:13\nmsgid \"Please contact the administrator: %1\"\nmsgstr \"請聯絡管理員：%1\"\n\n#: themes/default/templates/render.html.ep:33\nmsgid \"Please wait while we are getting your file. We first need to download and decrypt all parts before you can get it.\"\nmsgstr \"請耐心等候，在您收到檔案之前我們先要下載並解密檔案的所有部分。\"\n\n#: lib/Lufi/Controller/Auth.pm:38\nmsgid \"Please, check your credentials or your right to access this service: unable to authenticate.\"\nmsgstr \"請檢查您的驗證資訊或對於此服務的存取權限：無法驗證。\"\n\n#: themes/default/templates/about.html.ep:5\nmsgid \"Privacy\"\nmsgstr \"私隱\"\n\n#: themes/default/templates/files.html.ep:13\nmsgid \"Purge expired files from localStorage\"\nmsgstr \"清除本機存儲數據中的過期檔案\"\n\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:20\nmsgid \"Regards,\"\nmsgstr \"保重，\"\n\n#: themes/default/templates/invitations/invite.mail.ep:15\nmsgid \"Regards.\"\nmsgstr \"保重。\"\n\n#: themes/default/templates/layouts/default.html.ep:31 themes/default/templates/layouts/default.html.ep:64\nmsgid \"Report file\"\nmsgstr \"回報檔案\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:15\nmsgid \"Resend invitation mail\"\nmsgstr \"重新寄出邀請郵件\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:9\nmsgid \"Rows in purple mean that the invitations have expired.\"\nmsgstr \"紫色行表示邀請已經過期。\"\n\n#: themes/default/templates/files.html.ep:9\nmsgid \"Rows in red mean that the files have expired and are no longer available.\"\nmsgstr \"紅色行表示檔案已經過期，無法再取得。\"\n\n#: themes/default/templates/partial/index.js.ep:27\nmsgid \"Send all links by email\"\nmsgstr \"透過電子郵件寄出所有連結\"\n\n#: themes/default/templates/invitations/invite.html.ep:50\nmsgid \"Send the invitation\"\nmsgstr \"寄出邀請\"\n\n#: themes/default/templates/mail.html.ep:46\nmsgid \"Send with this server\"\nmsgstr \"透過這臺伺服器寄出\"\n\n#: themes/default/templates/mail.html.ep:47\nmsgid \"Send with your own mail software\"\nmsgstr \"透過您自己的電郵軟件寄出\"\n\n#: themes/default/templates/partial/index.js.ep:30\nmsgid \"Sending part XX1 of XX2. Please, be patient, the progress bar can take a while to move.\"\nmsgstr \"正在傳送 XX1 / XX2 部分。請耐心等候，進度條可能需要一點時間才會變化。\"\n\n#. (url_for('/')\n#: themes/default/templates/partial/mail.js.ep:48\nmsgid \"Share your files in total privacy on %1\"\nmsgstr \"在 %1 私密地分享您的檔案\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:13 themes/default/templates/partial/invitations.js.ep:9\nmsgid \"Show hidden invitations\"\nmsgstr \"顯示隱藏的邀請\"\n\n#: themes/default/templates/partial/render.js.ep:12\nmsgid \"Show zip content\"\nmsgstr \"顯示 zip 檔案內容\"\n\n#: themes/default/templates/layouts/default.html.ep:40 themes/default/templates/layouts/default.html.ep:73 themes/default/templates/login.html.ep:28 themes/default/templates/logout.html.ep:17\nmsgid \"Signin\"\nmsgstr \"登入\"\n\n#: lib/Lufi/Controller/Invitation.pm:283 themes/default/templates/invitations/exception.html.ep:16\nmsgid \"Sorry, the invitation doesn’t exist. Are you sure you are on the right URL?\"\nmsgstr \"抱歉，邀請不存在。您確定您的網址無誤嗎？\"\n\n#: themes/default/templates/index.html.ep:46\nmsgid \"Sorry, the uploading is currently disabled. Please try again later.\"\nmsgstr \"抱歉，上傳暫時被禁用。請稍後再試。\"\n\n#: lib/Lufi/Controller/Files.pm:82\nmsgid \"Sorry, uploading is disabled.\"\nmsgstr \"抱歉，上傳被禁用。\"\n\n#: themes/default/templates/invitations/exception.html.ep:7\nmsgid \"Sorry, your invitation has expired or has been deleted.\"\nmsgstr \"抱歉，您的邀請已過期或是已經被刪除。\"\n\n#. ($invit->ldap_user_mail)\n#: lib/Lufi/Controller/Files.pm:123\nmsgid \"Sorry, your invitation has expired or has been deleted. Please contact %1 to have another invitation.\"\nmsgstr \"抱歉，您的邀請已過期或是已經被刪除。請聯絡 %1 取得另外的邀請。\"\n\n#. ($invitation->ldap_user_mail)\n#: lib/Lufi/Controller/Invitation.pm:276\nmsgid \"The URLs of your files have been sent by email to %1.\"\nmsgstr \"您的檔案的網址已經透過郵件寄給 %1。\"\n\n#: themes/default/templates/about.html.ep:7\nmsgid \"The administrator can only see the file's name, its size and its mimetype (what kind of file it is: video, text, etc.).\"\nmsgstr \"管理員只能夠看到檔案的名稱、大小以及媒體類型（視訊、文字檔案等）。\"\n\n#: lib/Lufi/Controller/Mail.pm:53\nmsgid \"The body of the mail must contain at least one URL pointing to a file hosted on this instance.\"\nmsgstr \"郵件內文至少要包含一個網址指向託管在這個實例的檔案。\"\n\n#: themes/default/templates/partial/files.js.ep:11\nmsgid \"The data has been successfully imported.\"\nmsgstr \"已成功匯入數據。\"\n\n#: lib/Lufi/Controller/Mail.pm:73\nmsgid \"The email body can't be empty.\"\nmsgstr \"郵件內文不能爲空。\"\n\n#: lib/Lufi/Controller/Mail.pm:72\nmsgid \"The email subject can't be empty.\"\nmsgstr \"郵件主旨不能爲空。\"\n\n#. ($expire_at, $max_expire_at)\n#: lib/Lufi/Controller/Invitation.pm:51\nmsgid \"The expiration delay (%1) is not between 1 and %2 days.\"\nmsgstr \"有效期 (%1) 不在 1 至 %2 日之間。\"\n\n#: lib/Lufi/Controller/Files.pm:462\nmsgid \"The file has already been deleted\"\nmsgstr \"檔案已經被刪除\"\n\n#: themes/default/templates/about.html.ep:6\nmsgid \"The files uploaded on a Lufi instance are encrypted before the upload to the server: the administrator of the server can not see the file's content.\"\nmsgstr \"上傳到 Lufi 實例的檔案在上傳之前會先加密：伺服器管理員無法檢視檔案內容。\"\n\n#. (join(', ', @bad)\n#: lib/Lufi/Controller/Mail.pm:68\nmsgid \"The following email addresses are not valid: %1\"\nmsgstr \"下列的電子郵件地址無效：%1\"\n\n#. ($guest_mail)\n#: lib/Lufi/Controller/Invitation.pm:48\nmsgid \"The guest email address (%1) is unvalid.\"\nmsgstr \"邀請對象的電子郵件地址（%1）無效。\"\n\n#. ($i->token, $i->guest_mail)\n#: lib/Lufi/Controller/Invitation.pm:150\nmsgid \"The invitation %1 can’t be resent: %2 has already sent files.<br>Please create a new invitation.\"\nmsgstr \"邀請 %1 無法重寄：%2 已經送出檔案。<br>請發一份新邀請。\"\n\n#. ($i->token)\n#: lib/Lufi/Controller/Invitation.pm:130\nmsgid \"The invitation %1 has been deleted.\"\nmsgstr \"邀請 %1 已經被刪除。\"\n\n#. (stash('user_mail')\n#: themes/default/templates/invitations/invite.html.ep:34\nmsgid \"The invitation mail will be send from your email address (%1).\"\nmsgstr \"邀請郵件會從您的電子郵件地址（%1）寄出。\"\n\n#: themes/default/templates/partial/index.js.ep:16\nmsgid \"The link(s) has been copied to your clipboard\"\nmsgstr \"連結已經複製到您的剪貼簿\"\n\n#. (stash('invitation')\n#: themes/default/templates/index.html.ep:30\nmsgid \"The link(s) of your file(s) will automatically be sent by mail to %1 (%2)\"\nmsgstr \"您的檔案的連結會自動透過郵件寄給 %1（%2）\"\n\n#. (stash('ldap_user')\n#: themes/default/templates/invitations/invite.mail.ep:11\nmsgid \"The links of your file(s) will automatically be sent by mail to %1.\"\nmsgstr \"您的檔案的連結會自動透過郵件寄給 %1。\"\n\n#: lib/Lufi/Controller/Mail.pm:97\nmsgid \"The mail has been sent.\"\nmsgstr \"郵件已寄出。\"\n\n#: themes/default/templates/about.html.ep:15\nmsgid \"The original (and only for now) author is <a href=\\\"https://fiat-tux.fr\\\" class=\\\"classic\\\">Luc Didry</a>.\"\nmsgstr \"\"\n\"最初的作者（亦是至今唯一）爲 <a href=\\\"https://fiat-tux.fr\\\" class=\\\"classic\\\">Luc \"\n\"Didry</a>。\"\n\n#: lib/Lufi/Controller/Files.pm:230\nmsgid \"The server was unable to find the file record to add your file part to. Please, contact the administrator.\"\nmsgstr \"伺服器找不到相應的檔案紀錄來加入您的檔案塊。請聯絡管理員。\"\n\n#: lib/Lufi/Controller/Files.pm:289\nmsgid \"This file has been deactivated by the admins. Contact them to know why.\"\nmsgstr \"這份檔案已經被管理員封禁。請聯絡他們瞭解詳細資訊。\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:46 themes/default/templates/partial/invitations.js.ep:6\nmsgid \"This invitation is normally hidden\"\nmsgstr \"這個邀請在平時會被隱藏\"\n\n#. (stash('expires')\n#: themes/default/templates/invitations/invite.mail.ep:13\nmsgid \"This invitation is valid until %1.\"\nmsgstr \"這個邀請會一直有效至 %1。\"\n\n#: themes/default/templates/delays.html.ep:10\nmsgid \"This server sets limitations according to the file size. The expiration delay of your file will be the minimum between what you choose and the following limitations:\"\nmsgstr \"這臺伺服器根據檔案大小設定了不同上限。檔案的有效期會被設定為您所選取選項與下列上限間兩者之最小值：\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:16\nmsgid \"Toggle visibility\"\nmsgstr \"開關隱藏邀請\"\n\n#: themes/default/templates/invitations/my_invitations.html.ep:25\nmsgid \"URL\"\nmsgstr \"網址\"\n\n#: themes/default/templates/partial/index.js.ep:17\nmsgid \"Unable to copy the link(s) to your clipboard\"\nmsgstr \"無法複製連結到您的剪貼簿\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:433\nmsgid \"Unable to get counter for %1. The file does not exists. It will be removed from your localStorage.\"\nmsgstr \"無法取得 %1 的下載次數。該檔案不存在。其將會從您的本機存儲數據中移除。\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:423\nmsgid \"Unable to get counter for %1. The token is invalid.\"\nmsgstr \"無法取得 %1 的下載次數。權杖無效。\"\n\n#. ($short)\n#: lib/Lufi/Controller/Files.pm:443\nmsgid \"Unable to get counter for %1. You are not authenticated.\"\nmsgstr \"無法取得 %1 的下載次數。您未驗證身份。\"\n\n#: themes/default/templates/layouts/default.html.ep:33 themes/default/templates/layouts/default.html.ep:66\nmsgid \"Upload files\"\nmsgstr \"上傳檔案\"\n\n#: themes/default/templates/index.html.ep:145\nmsgid \"Upload generated zip file\"\nmsgstr \"上傳生成的 zip 壓縮檔案\"\n\n#: themes/default/templates/files.html.ep:31\nmsgid \"Uploaded at\"\nmsgstr \"上傳時間\"\n\n#: themes/default/templates/index.html.ep:153\nmsgid \"Uploaded files\"\nmsgstr \"已上傳檔案\"\n\n#: themes/default/templates/about.html.ep:20\nmsgid \"Version\"\nmsgstr \"版本\"\n\n#: themes/default/templates/partial/index.js.ep:31\nmsgid \"Websocket communication error\"\nmsgstr \"WebSocket 交換錯誤\"\n\n#: themes/default/templates/about.html.ep:3\nmsgid \"What is Lufi?\"\nmsgstr \"Lufi 是什麼？\"\n\n#: themes/default/templates/about.html.ep:14\nmsgid \"Who wrote this software?\"\nmsgstr \"誰寫了這個軟件？\"\n\n#: themes/default/templates/partial/index.js.ep:13\nmsgid \"XXX file has been added to upload queue.\"\nmsgstr \"檔案 XXX 已經被加入上傳佇列。\"\n\n#: themes/default/templates/invitations/invite.html.ep:30\nmsgid \"You can invite someone to send you files through this Lufi instance even if they don’t have an account on it.\"\nmsgstr \"您可以邀請其他人透過這個 Lufi 實例傳送檔案給您，他們不需要有帳號。\"\n\n#: themes/default/templates/about.html.ep:11\nmsgid \"You can see the list of your files by clicking on the \\\"My files\\\" link at the top right of this page.\"\nmsgstr \"您可以點一下「我的檔案」選項來檢視您的檔案列表。\"\n\n#: lib/Lufi/Controller/Mail.pm:42\nmsgid \"You can't add URLs that are not related to this instance.\"\nmsgstr \"您無法加入與此實例無關的網址。\"\n\n#: themes/default/templates/about.html.ep:8\nmsgid \"You don't need to register yourself to upload files but be aware that, for legal reasons, your IP address will be stored when you send a file. Don't panic, this is normally the case for all sites on which you send files.\"\nmsgstr \"您毋須註冊即可上傳檔案，但需要註意，鑑於法律原因，在您傳送檔案時您的 IP 地址會被記錄。毋需擔憂，通常所有容許您傳送檔案的網站都會這樣做。\"\n\n#: themes/default/templates/partial/render.js.ep:11\nmsgid \"You don't seem to have a key in your URL. You won't be able to decrypt the file. Download canceled.\"\nmsgstr \"您的網址似乎没有包含密鑰。您無法解密此檔案。下載取消。\"\n\n#: themes/default/templates/partial/render.js.ep:7\nmsgid \"You have attempted to leave this page. The download will be canceled. Are you sure?\"\nmsgstr \"您正試圖離開此頁面。下載將會被取消。您確定要這樣做？\"\n\n#: themes/default/templates/partial/index.js.ep:14\nmsgid \"You have attempted to leave this page. The upload will be canceled. Are you sure?\"\nmsgstr \"您正試圖離開此頁面。上傳將會被取消。您確定要這樣做？\"\n\n#: themes/default/templates/logout.html.ep:14\nmsgid \"You have been successfully logged out.\"\nmsgstr \"您已成功登出。\"\n\n#: lib/Lufi/Controller/Mail.pm:71\nmsgid \"You must give email addresses.\"\nmsgstr \"您必須填寫電子郵件地址。\"\n\n#: themes/default/templates/index.html.ep:38\nmsgid \"Your browser does not have enough entropy to generate a strong encryption key. Please wait (it's better if you do things on your computer while waiting).\"\nmsgstr \"您的瀏覽器没有足夠的資訊熵來生成高強度密鑰。請耐心等候（最好在等待時用電腦做點其它事情）。\"\n\n#. (format_bytes($json->{size})\n#: lib/Lufi/Controller/Files.pm:95\nmsgid \"Your file is too big: %1 (maximum size allowed: %2)\"\nmsgstr \"您的檔案太大：%1（大小上限：%2）\"\n\n#: lib/Lufi/Controller/Files.pm:345\nmsgid \"Your password is not valid. Please refresh the page to retry.\"\nmsgstr \"您的密碼無效。請刷新頁面重新嘗試。\"\n\n#: themes/default/templates/partial/render.js.ep:13\nmsgid \"Zip content:\"\nmsgstr \"Zip 檔案內容：\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:20\nmsgid \"between %1 and %2, the file will be kept %3 day(s).\"\nmsgstr \"在 %1 至 %2 之間，檔案會保留 %3 日。\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:22\nmsgid \"between %1 and %2, the file will be kept forever.\"\nmsgstr \"在 %1 至 %2 之間，檔案會一直保留。\"\n\n#: themes/default/templates/partial/mail.js.ep:42\nmsgid \"deadline: \"\nmsgstr \"有效期至： \"\n\n#: themes/default/templates/partial/invitations.js.ep:5\nmsgid \"expires on XXX\"\nmsgstr \"在 XXX 到期\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:26\nmsgid \"for %1 and more, the file will be kept %2 day(s)\"\nmsgstr \"在 %1 及以上，檔案會保留 %2 日\"\n\n#. (format_bytes($keys[$i])\n#: themes/default/templates/delays.html.ep:28\nmsgid \"for %1 and more, the file will be kept forever.\"\nmsgstr \"在 %1 及以上，檔案會一直保留。\"\n\n#: themes/default/templates/index.html.ep:3\nmsgid \"no time limit\"\nmsgstr \"没有時間限制\"\n\n#: themes/default/templates/index.html.ep:124\nmsgid \"or\"\nmsgstr \"或\"\n\n#. ($e->{name}, format_bytes($e->{size})\n#: themes/default/templates/invitations/notification_files_sent.mail.ep:12\nmsgid \"— %1 (%2), that will expire on %3\"\nmsgstr \"— %1 (%2), 會在 %3 到期\"\n\n#: themes/default/templates/partial/render.js.ep:13\nmsgid \"Unable to download the file: too much unsuccessful attempts to open a websocket. Please, contact the administrator.\"\nmsgstr \"無法下載檔案：太多不必要的開啓 websocket 嘗試。請聯絡管理員。\"\n\n#. ($orig_uri)\n#: lib/Lufi/Controller/Mail.pm:43 lib/Lufi/Controller/Mail.pm:59\nmsgid \"You can't add URLs that are not related to this instance (%1).\"\nmsgstr \"您無法加入與此實例 (%1) 無關的網址。\"\n"
  },
  {
    "path": "themes/default/lib/Lufi/I18N.pm",
    "content": "package Lufi::I18N;\n\nuse base 'Locale::Maketext';\nuse File::Basename qw/dirname/;\nuse Locale::Maketext::Lexicon {\n    _auto => 1,\n    _decode => 1,\n    _style  => 'gettext',\n    '*' => [Gettext => dirname(__FILE__) . '/I18N/*.po']\n};\n\n1;\n"
  },
  {
    "path": "themes/default/public/MATERIALIZE_LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2014-2015 Materialize\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "themes/default/public/css/cover.css",
    "content": "/*\n * Globals\n */\n\n/* Links */\na,\na:focus,\na:hover {\n  color: #888;\n}\n\n/* Custom default button */\n.btn-default,\n.btn-default:hover,\n.btn-default:focus {\n  color: #333;\n  text-shadow: none; /* Prevent inheritance from `body` */\n  background-color: #fff;\n  border: 1px solid #fff;\n}\n\n\n/*\n * Base structure\n */\n\nhtml,\nbody {\n  height: 100%;\n}\nbody {\n  color: #888;\n  text-align: center;\n  /*text-shadow: 0 1px 3px rgba(0,0,0,.3);*/\n}\n\n/* Extra markup and styles for table-esque vertical and horizontal centering */\n.site-wrapper {\n  display: table;\n  width: 100%;\n  height: 100%; /* For at least Firefox */\n  min-height: 100%;\n  /*-webkit-box-shadow: inset 0 0 100px rgba(0,0,0,.5);\n          box-shadow: inset 0 0 100px rgba(0,0,0,.5);*/\n}\n.site-wrapper-inner {\n  display: table-cell;\n  vertical-align: top;\n}\n.cover-container {\n  margin-right: auto;\n  margin-left: auto;\n}\n\n/* Padding for spacing */\n.inner {\n  padding: 30px;\n}\n\n\n/*\n * Header\n */\n.masthead-brand {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n\n.masthead-nav > li {\n  display: inline-block;\n}\n.masthead-nav > li + li {\n  margin-left: 20px;\n}\n.masthead-nav > li > a {\n  padding-right: 0;\n  padding-left: 0;\n  font-size: 16px;\n  font-weight: bold;\n  color: #888; /* IE8 proofing */\n  color: rgba(136,136,136,.75);\n  border-bottom: 2px solid transparent;\n  /*text-shadow: 0 1px 3px rgba(0,0,0,.2);*/\n}\n.masthead-nav > li > a:hover,\n.masthead-nav > li > a:focus {\n  background-color: transparent;\n  border-bottom-color: #a9a9a9;\n  border-bottom-color: rgba(136,136,136,.25);\n}\n.masthead-nav > .active > a,\n.masthead-nav > .active > a:hover,\n.masthead-nav > .active > a:focus {\n  color: #888;\n  border-bottom-color: #888;\n}\n\n@media (min-width: 768px) {\n  .masthead-brand {\n    float: left;\n  }\n  .masthead-nav {\n    float: right;\n  }\n}\n\n\n/*\n * Cover\n */\n\n.cover {\n  padding: 0 20px;\n}\n.cover .btn-lg {\n  padding: 10px 20px;\n  font-weight: bold;\n}\n\n\n/*\n * Footer\n */\n\n.mastfoot {\n  color: #888; /* IE8 proofing */\n  color: rgba(136,136,136,.5);\n}\n\n\n/*\n * Affix and center\n */\n\n@media (min-width: 768px) {\n  .cover {\n    margin-top: 90px;\n  }\n  .cover.render {\n    margin-top: 90px;\n  }\n  /* Pull out the header and footer */\n  .masthead {\n    position: fixed;\n    top: 0;\n  }\n  .mastfoot {\n    position: fixed;\n    bottom: 0;\n  }\n  /* Start the vertical centering */\n  .site-wrapper-inner {\n    vertical-align: middle;\n  }\n  /* Handle the widths */\n  .masthead,\n  .mastfoot,\n  .cover-container {\n    width: 100%; /* Must be percentage or pixels for horizontal alignment */\n  }\n}\n\n@media (min-width: 992px) {\n  .masthead,\n  .mastfoot,\n  .cover-container {\n    width: 90%;\n  }\n}\n"
  },
  {
    "path": "themes/default/public/css/lufi.css",
    "content": "body {\n    background-color: #ffffff;\n}\n#files {\n    border: 2px dashed #BBB;\n    border-radius: 5px;\n    padding: 25px 25px 41px 25px;\n    text-align: center;\n    color: #888;\n}\n#files label {\n    padding: 6px 0;\n    color: #FFF;\n    font-weight: bold;\n    margin: 20px auto;\n    width: 100%;\n}\n#files label span {\n    cursor: pointer;\n}\n#files input {\n    width: 100%;\n    background: rgba(150,225,150,0.0);\n    vertical-align: middle;\n    text-align: center;\n    padding: 0 50%;\n    margin-top: -206px;\n    color: #FFF;\n    font-weight: bold;\n    font-size: 200px;\n    opacity: 0;\n}\n.progress-info {\n    text-shadow: initial;\n    font-weight: bold;\n}\n#results {\n    display: none;\n}\na.classic,\na.classic:hover,\na.classic:focus {\n    color: #337AB7;\n}\n.left-mg {\n    margin-left: 10px;\n    margin-right: 10px;\n}\n@-moz-document url-prefix() {\n    fieldset { display: table-cell; }\n}\n#render-image {\n    max-width: 100%;\n    max-height: 200px;\n    margin-left: auto;\n    margin-right: auto;\n}\n.input-field .big-prefix {\n    width: 6rem;\n}\n.input-field .big-prefix ~ input,\n.input-field .big-prefix ~ textarea,\n.input-field .big-prefix ~ label,\n.input-field .big-prefix ~ div.select-wrapper  {\n    margin-left: 6rem;\n    width: 92%;\n    width: calc(100% - 6rem);\n}\n@media only screen and (max-width : 992px) {\n    .input-field .big-prefix ~ input {\n        width: 82%;\n        width: calc(100% - 6rem);\n    }\n}\n@media only screen and (max-width : 600px) {\n    .input-field .big-prefix ~ input {\n        width: 60%;\n        width: calc(100% - 6rem);\n    }\n}\n.file-field .btn.left-mg {\n    height: 36px;\n    line-height: 36px;\n}\n.textarea-hidden {\n    position: fixed;\n    top: 0;\n    left: 0;\n    width: 2em;\n    height: 2em;\n    padding: 0;\n    border: none;\n    outline: none;\n    box-shadow: none;\n    background: transparent;\n}\n.hiddendiv.common {\n    min-height: 170px;\n}\n.title-filename {\n    white-space: nowrap;\n    overflow: hidden;\n    text-overflow: ellipsis;\n}\n.files-buttons a {\n    margin-bottom: 10px;\n}\n.no_border {\n    border: 0;\n}\n.like-label {\n    color: #9e9e9e;\n    font-size: 1.5rem;\n}\n.select-lang .select-wrapper span.caret {\n    top: -10px;\n    color: #FFF;\n}\n.select-lang .select-wrapper input.select-dropdown {\n    margin-top: 10px;\n    margin-bottom: 0;\n    border-bottom: 0;\n}\n.select-lang-mobile .select-wrapper input.select-dropdown {\n    color: #444;\n    border-bottom: 0;\n}\n.select-lang-mobile .select-wrapper span.caret {\n    top: -10px;\n}\n.select-lang,\n.select-lang-mobile {\n    padding-left: 15px !important;\n    padding-right: 15px !important;\n}\nnav .btn-flat {\n    color: #fff !important;\n    text-transform: initial !important;\n}\nnav .btn-flat:focus {\n    background-color: rgba(0,0,0,0.1) !important;\n}\n\n/* pulse animation from Materialize CSS 1.0.0 */\nbutton.pulse {\n    margin-left: 1em;\n}\n.pulse {\n    overflow: initial;\n    position: relative;\n}\n.pulse::before {\n    content: '';\n    display: block;\n    position: absolute;\n    width: 100%;\n    height: 100%;\n    top: 0;\n    left: 0;\n    background-color: inherit;\n    border-radius: inherit;\n    -webkit-transition: opacity .3s, -webkit-transform .3s;\n    transition: opacity .3s, -webkit-transform .3s;\n    transition: opacity .3s, transform .3s;\n    transition: opacity .3s, transform .3s, -webkit-transform .3s;\n    -webkit-animation: pulse-animation 1s cubic-bezier(0.24, 0, 0.38, 1) infinite;\n    animation: pulse-animation 1s cubic-bezier(0.24, 0, 0.38, 1) infinite;\n    z-index: -1;\n}\n\n@-webkit-keyframes pulse-animation {\n    0% {\n        opacity: 1;\n        -webkit-transform: scale(1);\n        transform: scale(1);\n    }\n    50% {\n        opacity: 0;\n        -webkit-transform: scale(1.5);\n        transform: scale(1.5);\n    }\n    100% {\n        opacity: 0;\n        -webkit-transform: scale(1.5);\n        transform: scale(1.5);\n    }\n}\n\n@keyframes pulse-animation {\n    0% {\n        opacity: 1;\n        -webkit-transform: scale(1);\n        transform: scale(1);\n    }\n    50% {\n        opacity: 0;\n        -webkit-transform: scale(1.5);\n        transform: scale(1.5);\n    }\n    100% {\n        opacity: 0;\n        -webkit-transform: scale(1.5);\n        transform: scale(1.5);\n    }\n}\n.margin-bottom-35 {\n    margin-bottom: 35px;\n}\n.toast.teal.accent-3,\n.toast.red.accent-2 {\n    color: black;\n}\n.offscreen {\n    clip-path: inset(100%);\n    clip: rect(1px 1px 1px 1px); /* IE 6/7 */\n    clip: rect(1px, 1px, 1px, 1px);\n    height: 1px;\n    overflow: hidden;\n    position: absolute;\n    white-space: nowrap; /* added line */\n    width: 1px;\n}\n.small-h1 {\n    font-size: 2.2rem;\n}\n\n@media only screen and (max-width: 1800px) {\n  ul.hide-on-med-and-down {\n    display: none !important;\n  }\n  nav a.button-collapse {\n    display: block !important;\n  }\n  nav .brand-logo {\n    left: 50%;\n    transform: translateX(-50%);\n  }\n  nav .brand-logo.left, nav .brand-logo.right {\n    padding: 0;\n    transform: none;\n  }\n  nav .brand-logo.left {\n    left: 0.5rem;\n  }\n  nav .brand-logo.right {\n    right: 0.5rem;\n    left: auto;\n  }\n}\n\n.side-nav .btn-flat {\n    color: #444 !important;\n    padding: 0 1rem;\n    text-transform: initial !important;\n}\n\ntable.highlight > tbody > tr:hover {\n    background-color: #c6d4ee;\n}\n\n.white-background {\n    background-color: #FFF;\n}\n.width-0 { width: 0%; }\n.width-0-1 { width: 0.1%; }\n.width-0-2 { width: 0.2%; }\n.width-0-3 { width: 0.3%; }\n.width-0-4 { width: 0.4%; }\n.width-0-5 { width: 0.5%; }\n.width-0-6 { width: 0.6%; }\n.width-0-7 { width: 0.7%; }\n.width-0-8 { width: 0.8%; }\n.width-0-9 { width: 0.9%; }\n.width-1 { width: 1%; }\n.width-1-1 { width: 1.1%; }\n.width-1-2 { width: 1.2%; }\n.width-1-3 { width: 1.3%; }\n.width-1-4 { width: 1.4%; }\n.width-1-5 { width: 1.5%; }\n.width-1-6 { width: 1.6%; }\n.width-1-7 { width: 1.7%; }\n.width-1-8 { width: 1.8%; }\n.width-1-9 { width: 1.9%; }\n.width-2 { width: 2%; }\n.width-2-1 { width: 2.1%; }\n.width-2-2 { width: 2.2%; }\n.width-2-3 { width: 2.3%; }\n.width-2-4 { width: 2.4%; }\n.width-2-5 { width: 2.5%; }\n.width-2-6 { width: 2.6%; }\n.width-2-7 { width: 2.7%; }\n.width-2-8 { width: 2.8%; }\n.width-2-9 { width: 2.9%; }\n.width-3 { width: 3%; }\n.width-3-1 { width: 3.1%; }\n.width-3-2 { width: 3.2%; }\n.width-3-3 { width: 3.3%; }\n.width-3-4 { width: 3.4%; }\n.width-3-5 { width: 3.5%; }\n.width-3-6 { width: 3.6%; }\n.width-3-7 { width: 3.7%; }\n.width-3-8 { width: 3.8%; }\n.width-3-9 { width: 3.9%; }\n.width-4 { width: 4%; }\n.width-4-1 { width: 4.1%; }\n.width-4-2 { width: 4.2%; }\n.width-4-3 { width: 4.3%; }\n.width-4-4 { width: 4.4%; }\n.width-4-5 { width: 4.5%; }\n.width-4-6 { width: 4.6%; }\n.width-4-7 { width: 4.7%; }\n.width-4-8 { width: 4.8%; }\n.width-4-9 { width: 4.9%; }\n.width-5 { width: 5%; }\n.width-5-1 { width: 5.1%; }\n.width-5-2 { width: 5.2%; }\n.width-5-3 { width: 5.3%; }\n.width-5-4 { width: 5.4%; }\n.width-5-5 { width: 5.5%; }\n.width-5-6 { width: 5.6%; }\n.width-5-7 { width: 5.7%; }\n.width-5-8 { width: 5.8%; }\n.width-5-9 { width: 5.9%; }\n.width-6 { width: 6%; }\n.width-6-1 { width: 6.1%; }\n.width-6-2 { width: 6.2%; }\n.width-6-3 { width: 6.3%; }\n.width-6-4 { width: 6.4%; }\n.width-6-5 { width: 6.5%; }\n.width-6-6 { width: 6.6%; }\n.width-6-7 { width: 6.7%; }\n.width-6-8 { width: 6.8%; }\n.width-6-9 { width: 6.9%; }\n.width-7 { width: 7%; }\n.width-7-1 { width: 7.1%; }\n.width-7-2 { width: 7.2%; }\n.width-7-3 { width: 7.3%; }\n.width-7-4 { width: 7.4%; }\n.width-7-5 { width: 7.5%; }\n.width-7-6 { width: 7.6%; }\n.width-7-7 { width: 7.7%; }\n.width-7-8 { width: 7.8%; }\n.width-7-9 { width: 7.9%; }\n.width-8 { width: 8%; }\n.width-8-1 { width: 8.1%; }\n.width-8-2 { width: 8.2%; }\n.width-8-3 { width: 8.3%; }\n.width-8-4 { width: 8.4%; }\n.width-8-5 { width: 8.5%; }\n.width-8-6 { width: 8.6%; }\n.width-8-7 { width: 8.7%; }\n.width-8-8 { width: 8.8%; }\n.width-8-9 { width: 8.9%; }\n.width-9 { width: 9%; }\n.width-9-1 { width: 9.1%; }\n.width-9-2 { width: 9.2%; }\n.width-9-3 { width: 9.3%; }\n.width-9-4 { width: 9.4%; }\n.width-9-5 { width: 9.5%; }\n.width-9-6 { width: 9.6%; }\n.width-9-7 { width: 9.7%; }\n.width-9-8 { width: 9.8%; }\n.width-9-9 { width: 9.9%; }\n.width-10 { width: 10%; }\n.width-10-1 { width: 10.1%; }\n.width-10-2 { width: 10.2%; }\n.width-10-3 { width: 10.3%; }\n.width-10-4 { width: 10.4%; }\n.width-10-5 { width: 10.5%; }\n.width-10-6 { width: 10.6%; }\n.width-10-7 { width: 10.7%; }\n.width-10-8 { width: 10.8%; }\n.width-10-9 { width: 10.9%; }\n.width-11 { width: 11%; }\n.width-11-1 { width: 11.1%; }\n.width-11-2 { width: 11.2%; }\n.width-11-3 { width: 11.3%; }\n.width-11-4 { width: 11.4%; }\n.width-11-5 { width: 11.5%; }\n.width-11-6 { width: 11.6%; }\n.width-11-7 { width: 11.7%; }\n.width-11-8 { width: 11.8%; }\n.width-11-9 { width: 11.9%; }\n.width-12 { width: 12%; }\n.width-12-1 { width: 12.1%; }\n.width-12-2 { width: 12.2%; }\n.width-12-3 { width: 12.3%; }\n.width-12-4 { width: 12.4%; }\n.width-12-5 { width: 12.5%; }\n.width-12-6 { width: 12.6%; }\n.width-12-7 { width: 12.7%; }\n.width-12-8 { width: 12.8%; }\n.width-12-9 { width: 12.9%; }\n.width-13 { width: 13%; }\n.width-13-1 { width: 13.1%; }\n.width-13-2 { width: 13.2%; }\n.width-13-3 { width: 13.3%; }\n.width-13-4 { width: 13.4%; }\n.width-13-5 { width: 13.5%; }\n.width-13-6 { width: 13.6%; }\n.width-13-7 { width: 13.7%; }\n.width-13-8 { width: 13.8%; }\n.width-13-9 { width: 13.9%; }\n.width-14 { width: 14%; }\n.width-14-1 { width: 14.1%; }\n.width-14-2 { width: 14.2%; }\n.width-14-3 { width: 14.3%; }\n.width-14-4 { width: 14.4%; }\n.width-14-5 { width: 14.5%; }\n.width-14-6 { width: 14.6%; }\n.width-14-7 { width: 14.7%; }\n.width-14-8 { width: 14.8%; }\n.width-14-9 { width: 14.9%; }\n.width-15 { width: 15%; }\n.width-15-1 { width: 15.1%; }\n.width-15-2 { width: 15.2%; }\n.width-15-3 { width: 15.3%; }\n.width-15-4 { width: 15.4%; }\n.width-15-5 { width: 15.5%; }\n.width-15-6 { width: 15.6%; }\n.width-15-7 { width: 15.7%; }\n.width-15-8 { width: 15.8%; }\n.width-15-9 { width: 15.9%; }\n.width-16 { width: 16%; }\n.width-16-1 { width: 16.1%; }\n.width-16-2 { width: 16.2%; }\n.width-16-3 { width: 16.3%; }\n.width-16-4 { width: 16.4%; }\n.width-16-5 { width: 16.5%; }\n.width-16-6 { width: 16.6%; }\n.width-16-7 { width: 16.7%; }\n.width-16-8 { width: 16.8%; }\n.width-16-9 { width: 16.9%; }\n.width-17 { width: 17%; }\n.width-17-1 { width: 17.1%; }\n.width-17-2 { width: 17.2%; }\n.width-17-3 { width: 17.3%; }\n.width-17-4 { width: 17.4%; }\n.width-17-5 { width: 17.5%; }\n.width-17-6 { width: 17.6%; }\n.width-17-7 { width: 17.7%; }\n.width-17-8 { width: 17.8%; }\n.width-17-9 { width: 17.9%; }\n.width-18 { width: 18%; }\n.width-18-1 { width: 18.1%; }\n.width-18-2 { width: 18.2%; }\n.width-18-3 { width: 18.3%; }\n.width-18-4 { width: 18.4%; }\n.width-18-5 { width: 18.5%; }\n.width-18-6 { width: 18.6%; }\n.width-18-7 { width: 18.7%; }\n.width-18-8 { width: 18.8%; }\n.width-18-9 { width: 18.9%; }\n.width-19 { width: 19%; }\n.width-19-1 { width: 19.1%; }\n.width-19-2 { width: 19.2%; }\n.width-19-3 { width: 19.3%; }\n.width-19-4 { width: 19.4%; }\n.width-19-5 { width: 19.5%; }\n.width-19-6 { width: 19.6%; }\n.width-19-7 { width: 19.7%; }\n.width-19-8 { width: 19.8%; }\n.width-19-9 { width: 19.9%; }\n.width-20 { width: 20%; }\n.width-20-1 { width: 20.1%; }\n.width-20-2 { width: 20.2%; }\n.width-20-3 { width: 20.3%; }\n.width-20-4 { width: 20.4%; }\n.width-20-5 { width: 20.5%; }\n.width-20-6 { width: 20.6%; }\n.width-20-7 { width: 20.7%; }\n.width-20-8 { width: 20.8%; }\n.width-20-9 { width: 20.9%; }\n.width-21 { width: 21%; }\n.width-21-1 { width: 21.1%; }\n.width-21-2 { width: 21.2%; }\n.width-21-3 { width: 21.3%; }\n.width-21-4 { width: 21.4%; }\n.width-21-5 { width: 21.5%; }\n.width-21-6 { width: 21.6%; }\n.width-21-7 { width: 21.7%; }\n.width-21-8 { width: 21.8%; }\n.width-21-9 { width: 21.9%; }\n.width-22 { width: 22%; }\n.width-22-1 { width: 22.1%; }\n.width-22-2 { width: 22.2%; }\n.width-22-3 { width: 22.3%; }\n.width-22-4 { width: 22.4%; }\n.width-22-5 { width: 22.5%; }\n.width-22-6 { width: 22.6%; }\n.width-22-7 { width: 22.7%; }\n.width-22-8 { width: 22.8%; }\n.width-22-9 { width: 22.9%; }\n.width-23 { width: 23%; }\n.width-23-1 { width: 23.1%; }\n.width-23-2 { width: 23.2%; }\n.width-23-3 { width: 23.3%; }\n.width-23-4 { width: 23.4%; }\n.width-23-5 { width: 23.5%; }\n.width-23-6 { width: 23.6%; }\n.width-23-7 { width: 23.7%; }\n.width-23-8 { width: 23.8%; }\n.width-23-9 { width: 23.9%; }\n.width-24 { width: 24%; }\n.width-24-1 { width: 24.1%; }\n.width-24-2 { width: 24.2%; }\n.width-24-3 { width: 24.3%; }\n.width-24-4 { width: 24.4%; }\n.width-24-5 { width: 24.5%; }\n.width-24-6 { width: 24.6%; }\n.width-24-7 { width: 24.7%; }\n.width-24-8 { width: 24.8%; }\n.width-24-9 { width: 24.9%; }\n.width-25 { width: 25%; }\n.width-25-1 { width: 25.1%; }\n.width-25-2 { width: 25.2%; }\n.width-25-3 { width: 25.3%; }\n.width-25-4 { width: 25.4%; }\n.width-25-5 { width: 25.5%; }\n.width-25-6 { width: 25.6%; }\n.width-25-7 { width: 25.7%; }\n.width-25-8 { width: 25.8%; }\n.width-25-9 { width: 25.9%; }\n.width-26 { width: 26%; }\n.width-26-1 { width: 26.1%; }\n.width-26-2 { width: 26.2%; }\n.width-26-3 { width: 26.3%; }\n.width-26-4 { width: 26.4%; }\n.width-26-5 { width: 26.5%; }\n.width-26-6 { width: 26.6%; }\n.width-26-7 { width: 26.7%; }\n.width-26-8 { width: 26.8%; }\n.width-26-9 { width: 26.9%; }\n.width-27 { width: 27%; }\n.width-27-1 { width: 27.1%; }\n.width-27-2 { width: 27.2%; }\n.width-27-3 { width: 27.3%; }\n.width-27-4 { width: 27.4%; }\n.width-27-5 { width: 27.5%; }\n.width-27-6 { width: 27.6%; }\n.width-27-7 { width: 27.7%; }\n.width-27-8 { width: 27.8%; }\n.width-27-9 { width: 27.9%; }\n.width-28 { width: 28%; }\n.width-28-1 { width: 28.1%; }\n.width-28-2 { width: 28.2%; }\n.width-28-3 { width: 28.3%; }\n.width-28-4 { width: 28.4%; }\n.width-28-5 { width: 28.5%; }\n.width-28-6 { width: 28.6%; }\n.width-28-7 { width: 28.7%; }\n.width-28-8 { width: 28.8%; }\n.width-28-9 { width: 28.9%; }\n.width-29 { width: 29%; }\n.width-29-1 { width: 29.1%; }\n.width-29-2 { width: 29.2%; }\n.width-29-3 { width: 29.3%; }\n.width-29-4 { width: 29.4%; }\n.width-29-5 { width: 29.5%; }\n.width-29-6 { width: 29.6%; }\n.width-29-7 { width: 29.7%; }\n.width-29-8 { width: 29.8%; }\n.width-29-9 { width: 29.9%; }\n.width-30 { width: 30%; }\n.width-30-1 { width: 30.1%; }\n.width-30-2 { width: 30.2%; }\n.width-30-3 { width: 30.3%; }\n.width-30-4 { width: 30.4%; }\n.width-30-5 { width: 30.5%; }\n.width-30-6 { width: 30.6%; }\n.width-30-7 { width: 30.7%; }\n.width-30-8 { width: 30.8%; }\n.width-30-9 { width: 30.9%; }\n.width-31 { width: 31%; }\n.width-31-1 { width: 31.1%; }\n.width-31-2 { width: 31.2%; }\n.width-31-3 { width: 31.3%; }\n.width-31-4 { width: 31.4%; }\n.width-31-5 { width: 31.5%; }\n.width-31-6 { width: 31.6%; }\n.width-31-7 { width: 31.7%; }\n.width-31-8 { width: 31.8%; }\n.width-31-9 { width: 31.9%; }\n.width-32 { width: 32%; }\n.width-32-1 { width: 32.1%; }\n.width-32-2 { width: 32.2%; }\n.width-32-3 { width: 32.3%; }\n.width-32-4 { width: 32.4%; }\n.width-32-5 { width: 32.5%; }\n.width-32-6 { width: 32.6%; }\n.width-32-7 { width: 32.7%; }\n.width-32-8 { width: 32.8%; }\n.width-32-9 { width: 32.9%; }\n.width-33 { width: 33%; }\n.width-33-1 { width: 33.1%; }\n.width-33-2 { width: 33.2%; }\n.width-33-3 { width: 33.3%; }\n.width-33-4 { width: 33.4%; }\n.width-33-5 { width: 33.5%; }\n.width-33-6 { width: 33.6%; }\n.width-33-7 { width: 33.7%; }\n.width-33-8 { width: 33.8%; }\n.width-33-9 { width: 33.9%; }\n.width-34 { width: 34%; }\n.width-34-1 { width: 34.1%; }\n.width-34-2 { width: 34.2%; }\n.width-34-3 { width: 34.3%; }\n.width-34-4 { width: 34.4%; }\n.width-34-5 { width: 34.5%; }\n.width-34-6 { width: 34.6%; }\n.width-34-7 { width: 34.7%; }\n.width-34-8 { width: 34.8%; }\n.width-34-9 { width: 34.9%; }\n.width-35 { width: 35%; }\n.width-35-1 { width: 35.1%; }\n.width-35-2 { width: 35.2%; }\n.width-35-3 { width: 35.3%; }\n.width-35-4 { width: 35.4%; }\n.width-35-5 { width: 35.5%; }\n.width-35-6 { width: 35.6%; }\n.width-35-7 { width: 35.7%; }\n.width-35-8 { width: 35.8%; }\n.width-35-9 { width: 35.9%; }\n.width-36 { width: 36%; }\n.width-36-1 { width: 36.1%; }\n.width-36-2 { width: 36.2%; }\n.width-36-3 { width: 36.3%; }\n.width-36-4 { width: 36.4%; }\n.width-36-5 { width: 36.5%; }\n.width-36-6 { width: 36.6%; }\n.width-36-7 { width: 36.7%; }\n.width-36-8 { width: 36.8%; }\n.width-36-9 { width: 36.9%; }\n.width-37 { width: 37%; }\n.width-37-1 { width: 37.1%; }\n.width-37-2 { width: 37.2%; }\n.width-37-3 { width: 37.3%; }\n.width-37-4 { width: 37.4%; }\n.width-37-5 { width: 37.5%; }\n.width-37-6 { width: 37.6%; }\n.width-37-7 { width: 37.7%; }\n.width-37-8 { width: 37.8%; }\n.width-37-9 { width: 37.9%; }\n.width-38 { width: 38%; }\n.width-38-1 { width: 38.1%; }\n.width-38-2 { width: 38.2%; }\n.width-38-3 { width: 38.3%; }\n.width-38-4 { width: 38.4%; }\n.width-38-5 { width: 38.5%; }\n.width-38-6 { width: 38.6%; }\n.width-38-7 { width: 38.7%; }\n.width-38-8 { width: 38.8%; }\n.width-38-9 { width: 38.9%; }\n.width-39 { width: 39%; }\n.width-39-1 { width: 39.1%; }\n.width-39-2 { width: 39.2%; }\n.width-39-3 { width: 39.3%; }\n.width-39-4 { width: 39.4%; }\n.width-39-5 { width: 39.5%; }\n.width-39-6 { width: 39.6%; }\n.width-39-7 { width: 39.7%; }\n.width-39-8 { width: 39.8%; }\n.width-39-9 { width: 39.9%; }\n.width-40 { width: 40%; }\n.width-40-1 { width: 40.1%; }\n.width-40-2 { width: 40.2%; }\n.width-40-3 { width: 40.3%; }\n.width-40-4 { width: 40.4%; }\n.width-40-5 { width: 40.5%; }\n.width-40-6 { width: 40.6%; }\n.width-40-7 { width: 40.7%; }\n.width-40-8 { width: 40.8%; }\n.width-40-9 { width: 40.9%; }\n.width-41 { width: 41%; }\n.width-41-1 { width: 41.1%; }\n.width-41-2 { width: 41.2%; }\n.width-41-3 { width: 41.3%; }\n.width-41-4 { width: 41.4%; }\n.width-41-5 { width: 41.5%; }\n.width-41-6 { width: 41.6%; }\n.width-41-7 { width: 41.7%; }\n.width-41-8 { width: 41.8%; }\n.width-41-9 { width: 41.9%; }\n.width-42 { width: 42%; }\n.width-42-1 { width: 42.1%; }\n.width-42-2 { width: 42.2%; }\n.width-42-3 { width: 42.3%; }\n.width-42-4 { width: 42.4%; }\n.width-42-5 { width: 42.5%; }\n.width-42-6 { width: 42.6%; }\n.width-42-7 { width: 42.7%; }\n.width-42-8 { width: 42.8%; }\n.width-42-9 { width: 42.9%; }\n.width-43 { width: 43%; }\n.width-43-1 { width: 43.1%; }\n.width-43-2 { width: 43.2%; }\n.width-43-3 { width: 43.3%; }\n.width-43-4 { width: 43.4%; }\n.width-43-5 { width: 43.5%; }\n.width-43-6 { width: 43.6%; }\n.width-43-7 { width: 43.7%; }\n.width-43-8 { width: 43.8%; }\n.width-43-9 { width: 43.9%; }\n.width-44 { width: 44%; }\n.width-44-1 { width: 44.1%; }\n.width-44-2 { width: 44.2%; }\n.width-44-3 { width: 44.3%; }\n.width-44-4 { width: 44.4%; }\n.width-44-5 { width: 44.5%; }\n.width-44-6 { width: 44.6%; }\n.width-44-7 { width: 44.7%; }\n.width-44-8 { width: 44.8%; }\n.width-44-9 { width: 44.9%; }\n.width-45 { width: 45%; }\n.width-45-1 { width: 45.1%; }\n.width-45-2 { width: 45.2%; }\n.width-45-3 { width: 45.3%; }\n.width-45-4 { width: 45.4%; }\n.width-45-5 { width: 45.5%; }\n.width-45-6 { width: 45.6%; }\n.width-45-7 { width: 45.7%; }\n.width-45-8 { width: 45.8%; }\n.width-45-9 { width: 45.9%; }\n.width-46 { width: 46%; }\n.width-46-1 { width: 46.1%; }\n.width-46-2 { width: 46.2%; }\n.width-46-3 { width: 46.3%; }\n.width-46-4 { width: 46.4%; }\n.width-46-5 { width: 46.5%; }\n.width-46-6 { width: 46.6%; }\n.width-46-7 { width: 46.7%; }\n.width-46-8 { width: 46.8%; }\n.width-46-9 { width: 46.9%; }\n.width-47 { width: 47%; }\n.width-47-1 { width: 47.1%; }\n.width-47-2 { width: 47.2%; }\n.width-47-3 { width: 47.3%; }\n.width-47-4 { width: 47.4%; }\n.width-47-5 { width: 47.5%; }\n.width-47-6 { width: 47.6%; }\n.width-47-7 { width: 47.7%; }\n.width-47-8 { width: 47.8%; }\n.width-47-9 { width: 47.9%; }\n.width-48 { width: 48%; }\n.width-48-1 { width: 48.1%; }\n.width-48-2 { width: 48.2%; }\n.width-48-3 { width: 48.3%; }\n.width-48-4 { width: 48.4%; }\n.width-48-5 { width: 48.5%; }\n.width-48-6 { width: 48.6%; }\n.width-48-7 { width: 48.7%; }\n.width-48-8 { width: 48.8%; }\n.width-48-9 { width: 48.9%; }\n.width-49 { width: 49%; }\n.width-49-1 { width: 49.1%; }\n.width-49-2 { width: 49.2%; }\n.width-49-3 { width: 49.3%; }\n.width-49-4 { width: 49.4%; }\n.width-49-5 { width: 49.5%; }\n.width-49-6 { width: 49.6%; }\n.width-49-7 { width: 49.7%; }\n.width-49-8 { width: 49.8%; }\n.width-49-9 { width: 49.9%; }\n.width-50 { width: 50%; }\n.width-50-1 { width: 50.1%; }\n.width-50-2 { width: 50.2%; }\n.width-50-3 { width: 50.3%; }\n.width-50-4 { width: 50.4%; }\n.width-50-5 { width: 50.5%; }\n.width-50-6 { width: 50.6%; }\n.width-50-7 { width: 50.7%; }\n.width-50-8 { width: 50.8%; }\n.width-50-9 { width: 50.9%; }\n.width-51 { width: 51%; }\n.width-51-1 { width: 51.1%; }\n.width-51-2 { width: 51.2%; }\n.width-51-3 { width: 51.3%; }\n.width-51-4 { width: 51.4%; }\n.width-51-5 { width: 51.5%; }\n.width-51-6 { width: 51.6%; }\n.width-51-7 { width: 51.7%; }\n.width-51-8 { width: 51.8%; }\n.width-51-9 { width: 51.9%; }\n.width-52 { width: 52%; }\n.width-52-1 { width: 52.1%; }\n.width-52-2 { width: 52.2%; }\n.width-52-3 { width: 52.3%; }\n.width-52-4 { width: 52.4%; }\n.width-52-5 { width: 52.5%; }\n.width-52-6 { width: 52.6%; }\n.width-52-7 { width: 52.7%; }\n.width-52-8 { width: 52.8%; }\n.width-52-9 { width: 52.9%; }\n.width-53 { width: 53%; }\n.width-53-1 { width: 53.1%; }\n.width-53-2 { width: 53.2%; }\n.width-53-3 { width: 53.3%; }\n.width-53-4 { width: 53.4%; }\n.width-53-5 { width: 53.5%; }\n.width-53-6 { width: 53.6%; }\n.width-53-7 { width: 53.7%; }\n.width-53-8 { width: 53.8%; }\n.width-53-9 { width: 53.9%; }\n.width-54 { width: 54%; }\n.width-54-1 { width: 54.1%; }\n.width-54-2 { width: 54.2%; }\n.width-54-3 { width: 54.3%; }\n.width-54-4 { width: 54.4%; }\n.width-54-5 { width: 54.5%; }\n.width-54-6 { width: 54.6%; }\n.width-54-7 { width: 54.7%; }\n.width-54-8 { width: 54.8%; }\n.width-54-9 { width: 54.9%; }\n.width-55 { width: 55%; }\n.width-55-1 { width: 55.1%; }\n.width-55-2 { width: 55.2%; }\n.width-55-3 { width: 55.3%; }\n.width-55-4 { width: 55.4%; }\n.width-55-5 { width: 55.5%; }\n.width-55-6 { width: 55.6%; }\n.width-55-7 { width: 55.7%; }\n.width-55-8 { width: 55.8%; }\n.width-55-9 { width: 55.9%; }\n.width-56 { width: 56%; }\n.width-56-1 { width: 56.1%; }\n.width-56-2 { width: 56.2%; }\n.width-56-3 { width: 56.3%; }\n.width-56-4 { width: 56.4%; }\n.width-56-5 { width: 56.5%; }\n.width-56-6 { width: 56.6%; }\n.width-56-7 { width: 56.7%; }\n.width-56-8 { width: 56.8%; }\n.width-56-9 { width: 56.9%; }\n.width-57 { width: 57%; }\n.width-57-1 { width: 57.1%; }\n.width-57-2 { width: 57.2%; }\n.width-57-3 { width: 57.3%; }\n.width-57-4 { width: 57.4%; }\n.width-57-5 { width: 57.5%; }\n.width-57-6 { width: 57.6%; }\n.width-57-7 { width: 57.7%; }\n.width-57-8 { width: 57.8%; }\n.width-57-9 { width: 57.9%; }\n.width-58 { width: 58%; }\n.width-58-1 { width: 58.1%; }\n.width-58-2 { width: 58.2%; }\n.width-58-3 { width: 58.3%; }\n.width-58-4 { width: 58.4%; }\n.width-58-5 { width: 58.5%; }\n.width-58-6 { width: 58.6%; }\n.width-58-7 { width: 58.7%; }\n.width-58-8 { width: 58.8%; }\n.width-58-9 { width: 58.9%; }\n.width-59 { width: 59%; }\n.width-59-1 { width: 59.1%; }\n.width-59-2 { width: 59.2%; }\n.width-59-3 { width: 59.3%; }\n.width-59-4 { width: 59.4%; }\n.width-59-5 { width: 59.5%; }\n.width-59-6 { width: 59.6%; }\n.width-59-7 { width: 59.7%; }\n.width-59-8 { width: 59.8%; }\n.width-59-9 { width: 59.9%; }\n.width-60 { width: 60%; }\n.width-60-1 { width: 60.1%; }\n.width-60-2 { width: 60.2%; }\n.width-60-3 { width: 60.3%; }\n.width-60-4 { width: 60.4%; }\n.width-60-5 { width: 60.5%; }\n.width-60-6 { width: 60.6%; }\n.width-60-7 { width: 60.7%; }\n.width-60-8 { width: 60.8%; }\n.width-60-9 { width: 60.9%; }\n.width-61 { width: 61%; }\n.width-61-1 { width: 61.1%; }\n.width-61-2 { width: 61.2%; }\n.width-61-3 { width: 61.3%; }\n.width-61-4 { width: 61.4%; }\n.width-61-5 { width: 61.5%; }\n.width-61-6 { width: 61.6%; }\n.width-61-7 { width: 61.7%; }\n.width-61-8 { width: 61.8%; }\n.width-61-9 { width: 61.9%; }\n.width-62 { width: 62%; }\n.width-62-1 { width: 62.1%; }\n.width-62-2 { width: 62.2%; }\n.width-62-3 { width: 62.3%; }\n.width-62-4 { width: 62.4%; }\n.width-62-5 { width: 62.5%; }\n.width-62-6 { width: 62.6%; }\n.width-62-7 { width: 62.7%; }\n.width-62-8 { width: 62.8%; }\n.width-62-9 { width: 62.9%; }\n.width-63 { width: 63%; }\n.width-63-1 { width: 63.1%; }\n.width-63-2 { width: 63.2%; }\n.width-63-3 { width: 63.3%; }\n.width-63-4 { width: 63.4%; }\n.width-63-5 { width: 63.5%; }\n.width-63-6 { width: 63.6%; }\n.width-63-7 { width: 63.7%; }\n.width-63-8 { width: 63.8%; }\n.width-63-9 { width: 63.9%; }\n.width-64 { width: 64%; }\n.width-64-1 { width: 64.1%; }\n.width-64-2 { width: 64.2%; }\n.width-64-3 { width: 64.3%; }\n.width-64-4 { width: 64.4%; }\n.width-64-5 { width: 64.5%; }\n.width-64-6 { width: 64.6%; }\n.width-64-7 { width: 64.7%; }\n.width-64-8 { width: 64.8%; }\n.width-64-9 { width: 64.9%; }\n.width-65 { width: 65%; }\n.width-65-1 { width: 65.1%; }\n.width-65-2 { width: 65.2%; }\n.width-65-3 { width: 65.3%; }\n.width-65-4 { width: 65.4%; }\n.width-65-5 { width: 65.5%; }\n.width-65-6 { width: 65.6%; }\n.width-65-7 { width: 65.7%; }\n.width-65-8 { width: 65.8%; }\n.width-65-9 { width: 65.9%; }\n.width-66 { width: 66%; }\n.width-66-1 { width: 66.1%; }\n.width-66-2 { width: 66.2%; }\n.width-66-3 { width: 66.3%; }\n.width-66-4 { width: 66.4%; }\n.width-66-5 { width: 66.5%; }\n.width-66-6 { width: 66.6%; }\n.width-66-7 { width: 66.7%; }\n.width-66-8 { width: 66.8%; }\n.width-66-9 { width: 66.9%; }\n.width-67 { width: 67%; }\n.width-67-1 { width: 67.1%; }\n.width-67-2 { width: 67.2%; }\n.width-67-3 { width: 67.3%; }\n.width-67-4 { width: 67.4%; }\n.width-67-5 { width: 67.5%; }\n.width-67-6 { width: 67.6%; }\n.width-67-7 { width: 67.7%; }\n.width-67-8 { width: 67.8%; }\n.width-67-9 { width: 67.9%; }\n.width-68 { width: 68%; }\n.width-68-1 { width: 68.1%; }\n.width-68-2 { width: 68.2%; }\n.width-68-3 { width: 68.3%; }\n.width-68-4 { width: 68.4%; }\n.width-68-5 { width: 68.5%; }\n.width-68-6 { width: 68.6%; }\n.width-68-7 { width: 68.7%; }\n.width-68-8 { width: 68.8%; }\n.width-68-9 { width: 68.9%; }\n.width-69 { width: 69%; }\n.width-69-1 { width: 69.1%; }\n.width-69-2 { width: 69.2%; }\n.width-69-3 { width: 69.3%; }\n.width-69-4 { width: 69.4%; }\n.width-69-5 { width: 69.5%; }\n.width-69-6 { width: 69.6%; }\n.width-69-7 { width: 69.7%; }\n.width-69-8 { width: 69.8%; }\n.width-69-9 { width: 69.9%; }\n.width-70 { width: 70%; }\n.width-70-1 { width: 70.1%; }\n.width-70-2 { width: 70.2%; }\n.width-70-3 { width: 70.3%; }\n.width-70-4 { width: 70.4%; }\n.width-70-5 { width: 70.5%; }\n.width-70-6 { width: 70.6%; }\n.width-70-7 { width: 70.7%; }\n.width-70-8 { width: 70.8%; }\n.width-70-9 { width: 70.9%; }\n.width-71 { width: 71%; }\n.width-71-1 { width: 71.1%; }\n.width-71-2 { width: 71.2%; }\n.width-71-3 { width: 71.3%; }\n.width-71-4 { width: 71.4%; }\n.width-71-5 { width: 71.5%; }\n.width-71-6 { width: 71.6%; }\n.width-71-7 { width: 71.7%; }\n.width-71-8 { width: 71.8%; }\n.width-71-9 { width: 71.9%; }\n.width-72 { width: 72%; }\n.width-72-1 { width: 72.1%; }\n.width-72-2 { width: 72.2%; }\n.width-72-3 { width: 72.3%; }\n.width-72-4 { width: 72.4%; }\n.width-72-5 { width: 72.5%; }\n.width-72-6 { width: 72.6%; }\n.width-72-7 { width: 72.7%; }\n.width-72-8 { width: 72.8%; }\n.width-72-9 { width: 72.9%; }\n.width-73 { width: 73%; }\n.width-73-1 { width: 73.1%; }\n.width-73-2 { width: 73.2%; }\n.width-73-3 { width: 73.3%; }\n.width-73-4 { width: 73.4%; }\n.width-73-5 { width: 73.5%; }\n.width-73-6 { width: 73.6%; }\n.width-73-7 { width: 73.7%; }\n.width-73-8 { width: 73.8%; }\n.width-73-9 { width: 73.9%; }\n.width-74 { width: 74%; }\n.width-74-1 { width: 74.1%; }\n.width-74-2 { width: 74.2%; }\n.width-74-3 { width: 74.3%; }\n.width-74-4 { width: 74.4%; }\n.width-74-5 { width: 74.5%; }\n.width-74-6 { width: 74.6%; }\n.width-74-7 { width: 74.7%; }\n.width-74-8 { width: 74.8%; }\n.width-74-9 { width: 74.9%; }\n.width-75 { width: 75%; }\n.width-75-1 { width: 75.1%; }\n.width-75-2 { width: 75.2%; }\n.width-75-3 { width: 75.3%; }\n.width-75-4 { width: 75.4%; }\n.width-75-5 { width: 75.5%; }\n.width-75-6 { width: 75.6%; }\n.width-75-7 { width: 75.7%; }\n.width-75-8 { width: 75.8%; }\n.width-75-9 { width: 75.9%; }\n.width-76 { width: 76%; }\n.width-76-1 { width: 76.1%; }\n.width-76-2 { width: 76.2%; }\n.width-76-3 { width: 76.3%; }\n.width-76-4 { width: 76.4%; }\n.width-76-5 { width: 76.5%; }\n.width-76-6 { width: 76.6%; }\n.width-76-7 { width: 76.7%; }\n.width-76-8 { width: 76.8%; }\n.width-76-9 { width: 76.9%; }\n.width-77 { width: 77%; }\n.width-77-1 { width: 77.1%; }\n.width-77-2 { width: 77.2%; }\n.width-77-3 { width: 77.3%; }\n.width-77-4 { width: 77.4%; }\n.width-77-5 { width: 77.5%; }\n.width-77-6 { width: 77.6%; }\n.width-77-7 { width: 77.7%; }\n.width-77-8 { width: 77.8%; }\n.width-77-9 { width: 77.9%; }\n.width-78 { width: 78%; }\n.width-78-1 { width: 78.1%; }\n.width-78-2 { width: 78.2%; }\n.width-78-3 { width: 78.3%; }\n.width-78-4 { width: 78.4%; }\n.width-78-5 { width: 78.5%; }\n.width-78-6 { width: 78.6%; }\n.width-78-7 { width: 78.7%; }\n.width-78-8 { width: 78.8%; }\n.width-78-9 { width: 78.9%; }\n.width-79 { width: 79%; }\n.width-79-1 { width: 79.1%; }\n.width-79-2 { width: 79.2%; }\n.width-79-3 { width: 79.3%; }\n.width-79-4 { width: 79.4%; }\n.width-79-5 { width: 79.5%; }\n.width-79-6 { width: 79.6%; }\n.width-79-7 { width: 79.7%; }\n.width-79-8 { width: 79.8%; }\n.width-79-9 { width: 79.9%; }\n.width-80 { width: 80%; }\n.width-80-1 { width: 80.1%; }\n.width-80-2 { width: 80.2%; }\n.width-80-3 { width: 80.3%; }\n.width-80-4 { width: 80.4%; }\n.width-80-5 { width: 80.5%; }\n.width-80-6 { width: 80.6%; }\n.width-80-7 { width: 80.7%; }\n.width-80-8 { width: 80.8%; }\n.width-80-9 { width: 80.9%; }\n.width-81 { width: 81%; }\n.width-81-1 { width: 81.1%; }\n.width-81-2 { width: 81.2%; }\n.width-81-3 { width: 81.3%; }\n.width-81-4 { width: 81.4%; }\n.width-81-5 { width: 81.5%; }\n.width-81-6 { width: 81.6%; }\n.width-81-7 { width: 81.7%; }\n.width-81-8 { width: 81.8%; }\n.width-81-9 { width: 81.9%; }\n.width-82 { width: 82%; }\n.width-82-1 { width: 82.1%; }\n.width-82-2 { width: 82.2%; }\n.width-82-3 { width: 82.3%; }\n.width-82-4 { width: 82.4%; }\n.width-82-5 { width: 82.5%; }\n.width-82-6 { width: 82.6%; }\n.width-82-7 { width: 82.7%; }\n.width-82-8 { width: 82.8%; }\n.width-82-9 { width: 82.9%; }\n.width-83 { width: 83%; }\n.width-83-1 { width: 83.1%; }\n.width-83-2 { width: 83.2%; }\n.width-83-3 { width: 83.3%; }\n.width-83-4 { width: 83.4%; }\n.width-83-5 { width: 83.5%; }\n.width-83-6 { width: 83.6%; }\n.width-83-7 { width: 83.7%; }\n.width-83-8 { width: 83.8%; }\n.width-83-9 { width: 83.9%; }\n.width-84 { width: 84%; }\n.width-84-1 { width: 84.1%; }\n.width-84-2 { width: 84.2%; }\n.width-84-3 { width: 84.3%; }\n.width-84-4 { width: 84.4%; }\n.width-84-5 { width: 84.5%; }\n.width-84-6 { width: 84.6%; }\n.width-84-7 { width: 84.7%; }\n.width-84-8 { width: 84.8%; }\n.width-84-9 { width: 84.9%; }\n.width-85 { width: 85%; }\n.width-85-1 { width: 85.1%; }\n.width-85-2 { width: 85.2%; }\n.width-85-3 { width: 85.3%; }\n.width-85-4 { width: 85.4%; }\n.width-85-5 { width: 85.5%; }\n.width-85-6 { width: 85.6%; }\n.width-85-7 { width: 85.7%; }\n.width-85-8 { width: 85.8%; }\n.width-85-9 { width: 85.9%; }\n.width-86 { width: 86%; }\n.width-86-1 { width: 86.1%; }\n.width-86-2 { width: 86.2%; }\n.width-86-3 { width: 86.3%; }\n.width-86-4 { width: 86.4%; }\n.width-86-5 { width: 86.5%; }\n.width-86-6 { width: 86.6%; }\n.width-86-7 { width: 86.7%; }\n.width-86-8 { width: 86.8%; }\n.width-86-9 { width: 86.9%; }\n.width-87 { width: 87%; }\n.width-87-1 { width: 87.1%; }\n.width-87-2 { width: 87.2%; }\n.width-87-3 { width: 87.3%; }\n.width-87-4 { width: 87.4%; }\n.width-87-5 { width: 87.5%; }\n.width-87-6 { width: 87.6%; }\n.width-87-7 { width: 87.7%; }\n.width-87-8 { width: 87.8%; }\n.width-87-9 { width: 87.9%; }\n.width-88 { width: 88%; }\n.width-88-1 { width: 88.1%; }\n.width-88-2 { width: 88.2%; }\n.width-88-3 { width: 88.3%; }\n.width-88-4 { width: 88.4%; }\n.width-88-5 { width: 88.5%; }\n.width-88-6 { width: 88.6%; }\n.width-88-7 { width: 88.7%; }\n.width-88-8 { width: 88.8%; }\n.width-88-9 { width: 88.9%; }\n.width-89 { width: 89%; }\n.width-89-1 { width: 89.1%; }\n.width-89-2 { width: 89.2%; }\n.width-89-3 { width: 89.3%; }\n.width-89-4 { width: 89.4%; }\n.width-89-5 { width: 89.5%; }\n.width-89-6 { width: 89.6%; }\n.width-89-7 { width: 89.7%; }\n.width-89-8 { width: 89.8%; }\n.width-89-9 { width: 89.9%; }\n.width-90 { width: 90%; }\n.width-90-1 { width: 90.1%; }\n.width-90-2 { width: 90.2%; }\n.width-90-3 { width: 90.3%; }\n.width-90-4 { width: 90.4%; }\n.width-90-5 { width: 90.5%; }\n.width-90-6 { width: 90.6%; }\n.width-90-7 { width: 90.7%; }\n.width-90-8 { width: 90.8%; }\n.width-90-9 { width: 90.9%; }\n.width-91 { width: 91%; }\n.width-91-1 { width: 91.1%; }\n.width-91-2 { width: 91.2%; }\n.width-91-3 { width: 91.3%; }\n.width-91-4 { width: 91.4%; }\n.width-91-5 { width: 91.5%; }\n.width-91-6 { width: 91.6%; }\n.width-91-7 { width: 91.7%; }\n.width-91-8 { width: 91.8%; }\n.width-91-9 { width: 91.9%; }\n.width-92 { width: 92%; }\n.width-92-1 { width: 92.1%; }\n.width-92-2 { width: 92.2%; }\n.width-92-3 { width: 92.3%; }\n.width-92-4 { width: 92.4%; }\n.width-92-5 { width: 92.5%; }\n.width-92-6 { width: 92.6%; }\n.width-92-7 { width: 92.7%; }\n.width-92-8 { width: 92.8%; }\n.width-92-9 { width: 92.9%; }\n.width-93 { width: 93%; }\n.width-93-1 { width: 93.1%; }\n.width-93-2 { width: 93.2%; }\n.width-93-3 { width: 93.3%; }\n.width-93-4 { width: 93.4%; }\n.width-93-5 { width: 93.5%; }\n.width-93-6 { width: 93.6%; }\n.width-93-7 { width: 93.7%; }\n.width-93-8 { width: 93.8%; }\n.width-93-9 { width: 93.9%; }\n.width-94 { width: 94%; }\n.width-94-1 { width: 94.1%; }\n.width-94-2 { width: 94.2%; }\n.width-94-3 { width: 94.3%; }\n.width-94-4 { width: 94.4%; }\n.width-94-5 { width: 94.5%; }\n.width-94-6 { width: 94.6%; }\n.width-94-7 { width: 94.7%; }\n.width-94-8 { width: 94.8%; }\n.width-94-9 { width: 94.9%; }\n.width-95 { width: 95%; }\n.width-95-1 { width: 95.1%; }\n.width-95-2 { width: 95.2%; }\n.width-95-3 { width: 95.3%; }\n.width-95-4 { width: 95.4%; }\n.width-95-5 { width: 95.5%; }\n.width-95-6 { width: 95.6%; }\n.width-95-7 { width: 95.7%; }\n.width-95-8 { width: 95.8%; }\n.width-95-9 { width: 95.9%; }\n.width-96 { width: 96%; }\n.width-96-1 { width: 96.1%; }\n.width-96-2 { width: 96.2%; }\n.width-96-3 { width: 96.3%; }\n.width-96-4 { width: 96.4%; }\n.width-96-5 { width: 96.5%; }\n.width-96-6 { width: 96.6%; }\n.width-96-7 { width: 96.7%; }\n.width-96-8 { width: 96.8%; }\n.width-96-9 { width: 96.9%; }\n.width-97 { width: 97%; }\n.width-97-1 { width: 97.1%; }\n.width-97-2 { width: 97.2%; }\n.width-97-3 { width: 97.3%; }\n.width-97-4 { width: 97.4%; }\n.width-97-5 { width: 97.5%; }\n.width-97-6 { width: 97.6%; }\n.width-97-7 { width: 97.7%; }\n.width-97-8 { width: 97.8%; }\n.width-97-9 { width: 97.9%; }\n.width-98 { width: 98%; }\n.width-98-1 { width: 98.1%; }\n.width-98-2 { width: 98.2%; }\n.width-98-3 { width: 98.3%; }\n.width-98-4 { width: 98.4%; }\n.width-98-5 { width: 98.5%; }\n.width-98-6 { width: 98.6%; }\n.width-98-7 { width: 98.7%; }\n.width-98-8 { width: 98.8%; }\n.width-98-9 { width: 98.9%; }\n.width-99 { width: 99%; }\n.width-99-1 { width: 99.1%; }\n.width-99-2 { width: 99.2%; }\n.width-99-3 { width: 99.3%; }\n.width-99-4 { width: 99.4%; }\n.width-99-5 { width: 99.5%; }\n.width-99-6 { width: 99.6%; }\n.width-99-7 { width: 99.7%; }\n.width-99-8 { width: 99.8%; }\n.width-99-9 { width: 99.9%; }\n.width-100 { width: 100%; }\n"
  },
  {
    "path": "themes/default/public/css/materialize.css",
    "content": ".materialize-red.lighten-5 {\n  background-color: #fdeaeb !important;\n}\n\n.materialize-red-text.text-lighten-5 {\n  color: #fdeaeb !important;\n}\n\n.materialize-red.lighten-4 {\n  background-color: #f8c1c3 !important;\n}\n\n.materialize-red-text.text-lighten-4 {\n  color: #f8c1c3 !important;\n}\n\n.materialize-red.lighten-3 {\n  background-color: #f3989b !important;\n}\n\n.materialize-red-text.text-lighten-3 {\n  color: #f3989b !important;\n}\n\n.materialize-red.lighten-2 {\n  background-color: #ee6e73 !important;\n}\n\n.materialize-red-text.text-lighten-2 {\n  color: #ee6e73 !important;\n}\n\n.materialize-red.lighten-1 {\n  background-color: #ea454b !important;\n}\n\n.materialize-red-text.text-lighten-1 {\n  color: #ea454b !important;\n}\n\n.materialize-red {\n  background-color: #e51c23 !important;\n}\n\n.materialize-red-text {\n  color: #e51c23 !important;\n}\n\n.materialize-red.darken-1 {\n  background-color: #d0181e !important;\n}\n\n.materialize-red-text.text-darken-1 {\n  color: #d0181e !important;\n}\n\n.materialize-red.darken-2 {\n  background-color: #b9151b !important;\n}\n\n.materialize-red-text.text-darken-2 {\n  color: #b9151b !important;\n}\n\n.materialize-red.darken-3 {\n  background-color: #a21318 !important;\n}\n\n.materialize-red-text.text-darken-3 {\n  color: #a21318 !important;\n}\n\n.materialize-red.darken-4 {\n  background-color: #8b1014 !important;\n}\n\n.materialize-red-text.text-darken-4 {\n  color: #8b1014 !important;\n}\n\n.red.lighten-5 {\n  background-color: #FFEBEE !important;\n}\n\n.red-text.text-lighten-5 {\n  color: #FFEBEE !important;\n}\n\n.red.lighten-4 {\n  background-color: #FFCDD2 !important;\n}\n\n.red-text.text-lighten-4 {\n  color: #FFCDD2 !important;\n}\n\n.red.lighten-3 {\n  background-color: #EF9A9A !important;\n}\n\n.red-text.text-lighten-3 {\n  color: #EF9A9A !important;\n}\n\n.red.lighten-2 {\n  background-color: #E57373 !important;\n}\n\n.red-text.text-lighten-2 {\n  color: #E57373 !important;\n}\n\n.red.lighten-1 {\n  background-color: #EF5350 !important;\n}\n\n.red-text.text-lighten-1 {\n  color: #EF5350 !important;\n}\n\n.red {\n  background-color: #F44336 !important;\n}\n\n.red-text {\n  color: #F44336 !important;\n}\n\n.red.darken-1 {\n  background-color: #E53935 !important;\n}\n\n.red-text.text-darken-1 {\n  color: #E53935 !important;\n}\n\n.red.darken-2 {\n  background-color: #D32F2F !important;\n}\n\n.red-text.text-darken-2 {\n  color: #D32F2F !important;\n}\n\n.red.darken-3 {\n  background-color: #C62828 !important;\n}\n\n.red-text.text-darken-3 {\n  color: #C62828 !important;\n}\n\n.red.darken-4 {\n  background-color: #B71C1C !important;\n}\n\n.red-text.text-darken-4 {\n  color: #B71C1C !important;\n}\n\n.red.accent-1 {\n  background-color: #FF8A80 !important;\n}\n\n.red-text.text-accent-1 {\n  color: #FF8A80 !important;\n}\n\n.red.accent-2 {\n  background-color: #FF5252 !important;\n}\n\n.red-text.text-accent-2 {\n  color: #FF5252 !important;\n}\n\n.red.accent-3 {\n  background-color: #FF1744 !important;\n}\n\n.red-text.text-accent-3 {\n  color: #FF1744 !important;\n}\n\n.red.accent-4 {\n  background-color: #D50000 !important;\n}\n\n.red-text.text-accent-4 {\n  color: #D50000 !important;\n}\n\n.pink.lighten-5 {\n  background-color: #fce4ec !important;\n}\n\n.pink-text.text-lighten-5 {\n  color: #fce4ec !important;\n}\n\n.pink.lighten-4 {\n  background-color: #f8bbd0 !important;\n}\n\n.pink-text.text-lighten-4 {\n  color: #f8bbd0 !important;\n}\n\n.pink.lighten-3 {\n  background-color: #f48fb1 !important;\n}\n\n.pink-text.text-lighten-3 {\n  color: #f48fb1 !important;\n}\n\n.pink.lighten-2 {\n  background-color: #f06292 !important;\n}\n\n.pink-text.text-lighten-2 {\n  color: #f06292 !important;\n}\n\n.pink.lighten-1 {\n  background-color: #ec407a !important;\n}\n\n.pink-text.text-lighten-1 {\n  color: #ec407a !important;\n}\n\n.pink {\n  background-color: #e91e63 !important;\n}\n\n.pink-text {\n  color: #e91e63 !important;\n}\n\n.pink.darken-1 {\n  background-color: #d81b60 !important;\n}\n\n.pink-text.text-darken-1 {\n  color: #d81b60 !important;\n}\n\n.pink.darken-2 {\n  background-color: #c2185b !important;\n}\n\n.pink-text.text-darken-2 {\n  color: #c2185b !important;\n}\n\n.pink.darken-3 {\n  background-color: #ad1457 !important;\n}\n\n.pink-text.text-darken-3 {\n  color: #ad1457 !important;\n}\n\n.pink.darken-4 {\n  background-color: #880e4f !important;\n}\n\n.pink-text.text-darken-4 {\n  color: #880e4f !important;\n}\n\n.pink.accent-1 {\n  background-color: #ff80ab !important;\n}\n\n.pink-text.text-accent-1 {\n  color: #ff80ab !important;\n}\n\n.pink.accent-2 {\n  background-color: #ff4081 !important;\n}\n\n.pink-text.text-accent-2 {\n  color: #ff4081 !important;\n}\n\n.pink.accent-3 {\n  background-color: #f50057 !important;\n}\n\n.pink-text.text-accent-3 {\n  color: #f50057 !important;\n}\n\n.pink.accent-4 {\n  background-color: #c51162 !important;\n}\n\n.pink-text.text-accent-4 {\n  color: #c51162 !important;\n}\n\n.purple.lighten-5 {\n  background-color: #f3e5f5 !important;\n}\n\n.purple-text.text-lighten-5 {\n  color: #f3e5f5 !important;\n}\n\n.purple.lighten-4 {\n  background-color: #e1bee7 !important;\n}\n\n.purple-text.text-lighten-4 {\n  color: #e1bee7 !important;\n}\n\n.purple.lighten-3 {\n  background-color: #ce93d8 !important;\n}\n\n.purple-text.text-lighten-3 {\n  color: #ce93d8 !important;\n}\n\n.purple.lighten-2 {\n  background-color: #ba68c8 !important;\n}\n\n.purple-text.text-lighten-2 {\n  color: #ba68c8 !important;\n}\n\n.purple.lighten-1 {\n  background-color: #ab47bc !important;\n}\n\n.purple-text.text-lighten-1 {\n  color: #ab47bc !important;\n}\n\n.purple {\n  background-color: #9c27b0 !important;\n}\n\n.purple-text {\n  color: #9c27b0 !important;\n}\n\n.purple.darken-1 {\n  background-color: #8e24aa !important;\n}\n\n.purple-text.text-darken-1 {\n  color: #8e24aa !important;\n}\n\n.purple.darken-2 {\n  background-color: #7b1fa2 !important;\n}\n\n.purple-text.text-darken-2 {\n  color: #7b1fa2 !important;\n}\n\n.purple.darken-3 {\n  background-color: #6a1b9a !important;\n}\n\n.purple-text.text-darken-3 {\n  color: #6a1b9a !important;\n}\n\n.purple.darken-4 {\n  background-color: #4a148c !important;\n}\n\n.purple-text.text-darken-4 {\n  color: #4a148c !important;\n}\n\n.purple.accent-1 {\n  background-color: #ea80fc !important;\n}\n\n.purple-text.text-accent-1 {\n  color: #ea80fc !important;\n}\n\n.purple.accent-2 {\n  background-color: #e040fb !important;\n}\n\n.purple-text.text-accent-2 {\n  color: #e040fb !important;\n}\n\n.purple.accent-3 {\n  background-color: #d500f9 !important;\n}\n\n.purple-text.text-accent-3 {\n  color: #d500f9 !important;\n}\n\n.purple.accent-4 {\n  background-color: #aa00ff !important;\n}\n\n.purple-text.text-accent-4 {\n  color: #aa00ff !important;\n}\n\n.deep-purple.lighten-5 {\n  background-color: #ede7f6 !important;\n}\n\n.deep-purple-text.text-lighten-5 {\n  color: #ede7f6 !important;\n}\n\n.deep-purple.lighten-4 {\n  background-color: #d1c4e9 !important;\n}\n\n.deep-purple-text.text-lighten-4 {\n  color: #d1c4e9 !important;\n}\n\n.deep-purple.lighten-3 {\n  background-color: #b39ddb !important;\n}\n\n.deep-purple-text.text-lighten-3 {\n  color: #b39ddb !important;\n}\n\n.deep-purple.lighten-2 {\n  background-color: #9575cd !important;\n}\n\n.deep-purple-text.text-lighten-2 {\n  color: #9575cd !important;\n}\n\n.deep-purple.lighten-1 {\n  background-color: #7e57c2 !important;\n}\n\n.deep-purple-text.text-lighten-1 {\n  color: #7e57c2 !important;\n}\n\n.deep-purple {\n  background-color: #673ab7 !important;\n}\n\n.deep-purple-text {\n  color: #673ab7 !important;\n}\n\n.deep-purple.darken-1 {\n  background-color: #5e35b1 !important;\n}\n\n.deep-purple-text.text-darken-1 {\n  color: #5e35b1 !important;\n}\n\n.deep-purple.darken-2 {\n  background-color: #512da8 !important;\n}\n\n.deep-purple-text.text-darken-2 {\n  color: #512da8 !important;\n}\n\n.deep-purple.darken-3 {\n  background-color: #4527a0 !important;\n}\n\n.deep-purple-text.text-darken-3 {\n  color: #4527a0 !important;\n}\n\n.deep-purple.darken-4 {\n  background-color: #311b92 !important;\n}\n\n.deep-purple-text.text-darken-4 {\n  color: #311b92 !important;\n}\n\n.deep-purple.accent-1 {\n  background-color: #b388ff !important;\n}\n\n.deep-purple-text.text-accent-1 {\n  color: #b388ff !important;\n}\n\n.deep-purple.accent-2 {\n  background-color: #7c4dff !important;\n}\n\n.deep-purple-text.text-accent-2 {\n  color: #7c4dff !important;\n}\n\n.deep-purple.accent-3 {\n  background-color: #651fff !important;\n}\n\n.deep-purple-text.text-accent-3 {\n  color: #651fff !important;\n}\n\n.deep-purple.accent-4 {\n  background-color: #6200ea !important;\n}\n\n.deep-purple-text.text-accent-4 {\n  color: #6200ea !important;\n}\n\n.indigo.lighten-5 {\n  background-color: #e8eaf6 !important;\n}\n\n.indigo-text.text-lighten-5 {\n  color: #e8eaf6 !important;\n}\n\n.indigo.lighten-4 {\n  background-color: #c5cae9 !important;\n}\n\n.indigo-text.text-lighten-4 {\n  color: #c5cae9 !important;\n}\n\n.indigo.lighten-3 {\n  background-color: #9fa8da !important;\n}\n\n.indigo-text.text-lighten-3 {\n  color: #9fa8da !important;\n}\n\n.indigo.lighten-2 {\n  background-color: #7986cb !important;\n}\n\n.indigo-text.text-lighten-2 {\n  color: #7986cb !important;\n}\n\n.indigo.lighten-1 {\n  background-color: #5c6bc0 !important;\n}\n\n.indigo-text.text-lighten-1 {\n  color: #5c6bc0 !important;\n}\n\n.indigo {\n  background-color: #3f51b5 !important;\n}\n\n.indigo-text {\n  color: #3f51b5 !important;\n}\n\n.indigo.darken-1 {\n  background-color: #3949ab !important;\n}\n\n.indigo-text.text-darken-1 {\n  color: #3949ab !important;\n}\n\n.indigo.darken-2 {\n  background-color: #303f9f !important;\n}\n\n.indigo-text.text-darken-2 {\n  color: #303f9f !important;\n}\n\n.indigo.darken-3 {\n  background-color: #283593 !important;\n}\n\n.indigo-text.text-darken-3 {\n  color: #283593 !important;\n}\n\n.indigo.darken-4 {\n  background-color: #1a237e !important;\n}\n\n.indigo-text.text-darken-4 {\n  color: #1a237e !important;\n}\n\n.indigo.accent-1 {\n  background-color: #8c9eff !important;\n}\n\n.indigo-text.text-accent-1 {\n  color: #8c9eff !important;\n}\n\n.indigo.accent-2 {\n  background-color: #536dfe !important;\n}\n\n.indigo-text.text-accent-2 {\n  color: #536dfe !important;\n}\n\n.indigo.accent-3 {\n  background-color: #3d5afe !important;\n}\n\n.indigo-text.text-accent-3 {\n  color: #3d5afe !important;\n}\n\n.indigo.accent-4 {\n  background-color: #304ffe !important;\n}\n\n.indigo-text.text-accent-4 {\n  color: #304ffe !important;\n}\n\n.blue.lighten-5 {\n  background-color: #E3F2FD !important;\n}\n\n.blue-text.text-lighten-5 {\n  color: #E3F2FD !important;\n}\n\n.blue.lighten-4 {\n  background-color: #BBDEFB !important;\n}\n\n.blue-text.text-lighten-4 {\n  color: #BBDEFB !important;\n}\n\n.blue.lighten-3 {\n  background-color: #90CAF9 !important;\n}\n\n.blue-text.text-lighten-3 {\n  color: #90CAF9 !important;\n}\n\n.blue.lighten-2 {\n  background-color: #64B5F6 !important;\n}\n\n.blue-text.text-lighten-2 {\n  color: #64B5F6 !important;\n}\n\n.blue.lighten-1 {\n  background-color: #42A5F5 !important;\n}\n\n.blue-text.text-lighten-1 {\n  color: #42A5F5 !important;\n}\n\n.blue {\n  background-color: #2196F3 !important;\n}\n\n.blue-text {\n  color: #2196F3 !important;\n}\n\n.blue.darken-1 {\n  background-color: #1E88E5 !important;\n}\n\n.blue-text.text-darken-1 {\n  color: #1E88E5 !important;\n}\n\n.blue.darken-2 {\n  background-color: #1976D2 !important;\n}\n\n.blue-text.text-darken-2 {\n  color: #1976D2 !important;\n}\n\n.blue.darken-3 {\n  background-color: #1565C0 !important;\n}\n\n.blue-text.text-darken-3 {\n  color: #1565C0 !important;\n}\n\n.blue.darken-4 {\n  background-color: #0D47A1 !important;\n}\n\n.blue-text.text-darken-4 {\n  color: #0D47A1 !important;\n}\n\n.blue.accent-1 {\n  background-color: #82B1FF !important;\n}\n\n.blue-text.text-accent-1 {\n  color: #82B1FF !important;\n}\n\n.blue.accent-2 {\n  background-color: #448AFF !important;\n}\n\n.blue-text.text-accent-2 {\n  color: #448AFF !important;\n}\n\n.blue.accent-3 {\n  background-color: #2979FF !important;\n}\n\n.blue-text.text-accent-3 {\n  color: #2979FF !important;\n}\n\n.blue.accent-4 {\n  background-color: #2962FF !important;\n}\n\n.blue-text.text-accent-4 {\n  color: #2962FF !important;\n}\n\n.light-blue.lighten-5 {\n  background-color: #e1f5fe !important;\n}\n\n.light-blue-text.text-lighten-5 {\n  color: #e1f5fe !important;\n}\n\n.light-blue.lighten-4 {\n  background-color: #b3e5fc !important;\n}\n\n.light-blue-text.text-lighten-4 {\n  color: #b3e5fc !important;\n}\n\n.light-blue.lighten-3 {\n  background-color: #81d4fa !important;\n}\n\n.light-blue-text.text-lighten-3 {\n  color: #81d4fa !important;\n}\n\n.light-blue.lighten-2 {\n  background-color: #4fc3f7 !important;\n}\n\n.light-blue-text.text-lighten-2 {\n  color: #4fc3f7 !important;\n}\n\n.light-blue.lighten-1 {\n  background-color: #29b6f6 !important;\n}\n\n.light-blue-text.text-lighten-1 {\n  color: #29b6f6 !important;\n}\n\n.light-blue {\n  background-color: #03a9f4 !important;\n}\n\n.light-blue-text {\n  color: #03a9f4 !important;\n}\n\n.light-blue.darken-1 {\n  background-color: #039be5 !important;\n}\n\n.light-blue-text.text-darken-1 {\n  color: #039be5 !important;\n}\n\n.light-blue.darken-2 {\n  background-color: #0288d1 !important;\n}\n\n.light-blue-text.text-darken-2 {\n  color: #0288d1 !important;\n}\n\n.light-blue.darken-3 {\n  background-color: #0277bd !important;\n}\n\n.light-blue-text.text-darken-3 {\n  color: #0277bd !important;\n}\n\n.light-blue.darken-4 {\n  background-color: #01579b !important;\n}\n\n.light-blue-text.text-darken-4 {\n  color: #01579b !important;\n}\n\n.light-blue.accent-1 {\n  background-color: #80d8ff !important;\n}\n\n.light-blue-text.text-accent-1 {\n  color: #80d8ff !important;\n}\n\n.light-blue.accent-2 {\n  background-color: #40c4ff !important;\n}\n\n.light-blue-text.text-accent-2 {\n  color: #40c4ff !important;\n}\n\n.light-blue.accent-3 {\n  background-color: #00b0ff !important;\n}\n\n.light-blue-text.text-accent-3 {\n  color: #00b0ff !important;\n}\n\n.light-blue.accent-4 {\n  background-color: #0091ea !important;\n}\n\n.light-blue-text.text-accent-4 {\n  color: #0091ea !important;\n}\n\n.cyan.lighten-5 {\n  background-color: #e0f7fa !important;\n}\n\n.cyan-text.text-lighten-5 {\n  color: #e0f7fa !important;\n}\n\n.cyan.lighten-4 {\n  background-color: #b2ebf2 !important;\n}\n\n.cyan-text.text-lighten-4 {\n  color: #b2ebf2 !important;\n}\n\n.cyan.lighten-3 {\n  background-color: #80deea !important;\n}\n\n.cyan-text.text-lighten-3 {\n  color: #80deea !important;\n}\n\n.cyan.lighten-2 {\n  background-color: #4dd0e1 !important;\n}\n\n.cyan-text.text-lighten-2 {\n  color: #4dd0e1 !important;\n}\n\n.cyan.lighten-1 {\n  background-color: #26c6da !important;\n}\n\n.cyan-text.text-lighten-1 {\n  color: #26c6da !important;\n}\n\n.cyan {\n  background-color: #00bcd4 !important;\n}\n\n.cyan-text {\n  color: #00bcd4 !important;\n}\n\n.cyan.darken-1 {\n  background-color: #00acc1 !important;\n}\n\n.cyan-text.text-darken-1 {\n  color: #00acc1 !important;\n}\n\n.cyan.darken-2 {\n  background-color: #0097a7 !important;\n}\n\n.cyan-text.text-darken-2 {\n  color: #0097a7 !important;\n}\n\n.cyan.darken-3 {\n  background-color: #00838f !important;\n}\n\n.cyan-text.text-darken-3 {\n  color: #00838f !important;\n}\n\n.cyan.darken-4 {\n  background-color: #006064 !important;\n}\n\n.cyan-text.text-darken-4 {\n  color: #006064 !important;\n}\n\n.cyan.accent-1 {\n  background-color: #84ffff !important;\n}\n\n.cyan-text.text-accent-1 {\n  color: #84ffff !important;\n}\n\n.cyan.accent-2 {\n  background-color: #18ffff !important;\n}\n\n.cyan-text.text-accent-2 {\n  color: #18ffff !important;\n}\n\n.cyan.accent-3 {\n  background-color: #00e5ff !important;\n}\n\n.cyan-text.text-accent-3 {\n  color: #00e5ff !important;\n}\n\n.cyan.accent-4 {\n  background-color: #00b8d4 !important;\n}\n\n.cyan-text.text-accent-4 {\n  color: #00b8d4 !important;\n}\n\n.teal.lighten-5 {\n  background-color: #e0f2f1 !important;\n}\n\n.teal-text.text-lighten-5 {\n  color: #e0f2f1 !important;\n}\n\n.teal.lighten-4 {\n  background-color: #b2dfdb !important;\n}\n\n.teal-text.text-lighten-4 {\n  color: #b2dfdb !important;\n}\n\n.teal.lighten-3 {\n  background-color: #80cbc4 !important;\n}\n\n.teal-text.text-lighten-3 {\n  color: #80cbc4 !important;\n}\n\n.teal.lighten-2 {\n  background-color: #4db6ac !important;\n}\n\n.teal-text.text-lighten-2 {\n  color: #4db6ac !important;\n}\n\n.teal.lighten-1 {\n  background-color: #26a69a !important;\n}\n\n.teal-text.text-lighten-1 {\n  color: #26a69a !important;\n}\n\n.teal {\n  background-color: #009688 !important;\n}\n\n.teal-text {\n  color: #009688 !important;\n}\n\n.teal.darken-1 {\n  background-color: #00897b !important;\n}\n\n.teal-text.text-darken-1 {\n  color: #00897b !important;\n}\n\n.teal.darken-2 {\n  background-color: #00796b !important;\n}\n\n.teal-text.text-darken-2 {\n  color: #00796b !important;\n}\n\n.teal.darken-3 {\n  background-color: #00695c !important;\n}\n\n.teal-text.text-darken-3 {\n  color: #00695c !important;\n}\n\n.teal.darken-4 {\n  background-color: #004d40 !important;\n}\n\n.teal-text.text-darken-4 {\n  color: #004d40 !important;\n}\n\n.teal.accent-1 {\n  background-color: #a7ffeb !important;\n}\n\n.teal-text.text-accent-1 {\n  color: #a7ffeb !important;\n}\n\n.teal.accent-2 {\n  background-color: #64ffda !important;\n}\n\n.teal-text.text-accent-2 {\n  color: #64ffda !important;\n}\n\n.teal.accent-3 {\n  background-color: #1de9b6 !important;\n}\n\n.teal-text.text-accent-3 {\n  color: #1de9b6 !important;\n}\n\n.teal.accent-4 {\n  background-color: #00bfa5 !important;\n}\n\n.teal-text.text-accent-4 {\n  color: #00bfa5 !important;\n}\n\n.green.lighten-5 {\n  background-color: #E8F5E9 !important;\n}\n\n.green-text.text-lighten-5 {\n  color: #E8F5E9 !important;\n}\n\n.green.lighten-4 {\n  background-color: #C8E6C9 !important;\n}\n\n.green-text.text-lighten-4 {\n  color: #C8E6C9 !important;\n}\n\n.green.lighten-3 {\n  background-color: #A5D6A7 !important;\n}\n\n.green-text.text-lighten-3 {\n  color: #A5D6A7 !important;\n}\n\n.green.lighten-2 {\n  background-color: #81C784 !important;\n}\n\n.green-text.text-lighten-2 {\n  color: #81C784 !important;\n}\n\n.green.lighten-1 {\n  background-color: #66BB6A !important;\n}\n\n.green-text.text-lighten-1 {\n  color: #66BB6A !important;\n}\n\n.green {\n  background-color: #4CAF50 !important;\n}\n\n.green-text {\n  color: #4CAF50 !important;\n}\n\n.green.darken-1 {\n  background-color: #43A047 !important;\n}\n\n.green-text.text-darken-1 {\n  color: #43A047 !important;\n}\n\n.green.darken-2 {\n  background-color: #388E3C !important;\n}\n\n.green-text.text-darken-2 {\n  color: #388E3C !important;\n}\n\n.green.darken-3 {\n  background-color: #2E7D32 !important;\n}\n\n.green-text.text-darken-3 {\n  color: #2E7D32 !important;\n}\n\n.green.darken-4 {\n  background-color: #1B5E20 !important;\n}\n\n.green-text.text-darken-4 {\n  color: #1B5E20 !important;\n}\n\n.green.accent-1 {\n  background-color: #B9F6CA !important;\n}\n\n.green-text.text-accent-1 {\n  color: #B9F6CA !important;\n}\n\n.green.accent-2 {\n  background-color: #69F0AE !important;\n}\n\n.green-text.text-accent-2 {\n  color: #69F0AE !important;\n}\n\n.green.accent-3 {\n  background-color: #00E676 !important;\n}\n\n.green-text.text-accent-3 {\n  color: #00E676 !important;\n}\n\n.green.accent-4 {\n  background-color: #00C853 !important;\n}\n\n.green-text.text-accent-4 {\n  color: #00C853 !important;\n}\n\n.light-green.lighten-5 {\n  background-color: #f1f8e9 !important;\n}\n\n.light-green-text.text-lighten-5 {\n  color: #f1f8e9 !important;\n}\n\n.light-green.lighten-4 {\n  background-color: #dcedc8 !important;\n}\n\n.light-green-text.text-lighten-4 {\n  color: #dcedc8 !important;\n}\n\n.light-green.lighten-3 {\n  background-color: #c5e1a5 !important;\n}\n\n.light-green-text.text-lighten-3 {\n  color: #c5e1a5 !important;\n}\n\n.light-green.lighten-2 {\n  background-color: #aed581 !important;\n}\n\n.light-green-text.text-lighten-2 {\n  color: #aed581 !important;\n}\n\n.light-green.lighten-1 {\n  background-color: #9ccc65 !important;\n}\n\n.light-green-text.text-lighten-1 {\n  color: #9ccc65 !important;\n}\n\n.light-green {\n  background-color: #8bc34a !important;\n}\n\n.light-green-text {\n  color: #8bc34a !important;\n}\n\n.light-green.darken-1 {\n  background-color: #7cb342 !important;\n}\n\n.light-green-text.text-darken-1 {\n  color: #7cb342 !important;\n}\n\n.light-green.darken-2 {\n  background-color: #689f38 !important;\n}\n\n.light-green-text.text-darken-2 {\n  color: #689f38 !important;\n}\n\n.light-green.darken-3 {\n  background-color: #558b2f !important;\n}\n\n.light-green-text.text-darken-3 {\n  color: #558b2f !important;\n}\n\n.light-green.darken-4 {\n  background-color: #33691e !important;\n}\n\n.light-green-text.text-darken-4 {\n  color: #33691e !important;\n}\n\n.light-green.accent-1 {\n  background-color: #ccff90 !important;\n}\n\n.light-green-text.text-accent-1 {\n  color: #ccff90 !important;\n}\n\n.light-green.accent-2 {\n  background-color: #b2ff59 !important;\n}\n\n.light-green-text.text-accent-2 {\n  color: #b2ff59 !important;\n}\n\n.light-green.accent-3 {\n  background-color: #76ff03 !important;\n}\n\n.light-green-text.text-accent-3 {\n  color: #76ff03 !important;\n}\n\n.light-green.accent-4 {\n  background-color: #64dd17 !important;\n}\n\n.light-green-text.text-accent-4 {\n  color: #64dd17 !important;\n}\n\n.lime.lighten-5 {\n  background-color: #f9fbe7 !important;\n}\n\n.lime-text.text-lighten-5 {\n  color: #f9fbe7 !important;\n}\n\n.lime.lighten-4 {\n  background-color: #f0f4c3 !important;\n}\n\n.lime-text.text-lighten-4 {\n  color: #f0f4c3 !important;\n}\n\n.lime.lighten-3 {\n  background-color: #e6ee9c !important;\n}\n\n.lime-text.text-lighten-3 {\n  color: #e6ee9c !important;\n}\n\n.lime.lighten-2 {\n  background-color: #dce775 !important;\n}\n\n.lime-text.text-lighten-2 {\n  color: #dce775 !important;\n}\n\n.lime.lighten-1 {\n  background-color: #d4e157 !important;\n}\n\n.lime-text.text-lighten-1 {\n  color: #d4e157 !important;\n}\n\n.lime {\n  background-color: #cddc39 !important;\n}\n\n.lime-text {\n  color: #cddc39 !important;\n}\n\n.lime.darken-1 {\n  background-color: #c0ca33 !important;\n}\n\n.lime-text.text-darken-1 {\n  color: #c0ca33 !important;\n}\n\n.lime.darken-2 {\n  background-color: #afb42b !important;\n}\n\n.lime-text.text-darken-2 {\n  color: #afb42b !important;\n}\n\n.lime.darken-3 {\n  background-color: #9e9d24 !important;\n}\n\n.lime-text.text-darken-3 {\n  color: #9e9d24 !important;\n}\n\n.lime.darken-4 {\n  background-color: #827717 !important;\n}\n\n.lime-text.text-darken-4 {\n  color: #827717 !important;\n}\n\n.lime.accent-1 {\n  background-color: #f4ff81 !important;\n}\n\n.lime-text.text-accent-1 {\n  color: #f4ff81 !important;\n}\n\n.lime.accent-2 {\n  background-color: #eeff41 !important;\n}\n\n.lime-text.text-accent-2 {\n  color: #eeff41 !important;\n}\n\n.lime.accent-3 {\n  background-color: #c6ff00 !important;\n}\n\n.lime-text.text-accent-3 {\n  color: #c6ff00 !important;\n}\n\n.lime.accent-4 {\n  background-color: #aeea00 !important;\n}\n\n.lime-text.text-accent-4 {\n  color: #aeea00 !important;\n}\n\n.yellow.lighten-5 {\n  background-color: #fffde7 !important;\n}\n\n.yellow-text.text-lighten-5 {\n  color: #fffde7 !important;\n}\n\n.yellow.lighten-4 {\n  background-color: #fff9c4 !important;\n}\n\n.yellow-text.text-lighten-4 {\n  color: #fff9c4 !important;\n}\n\n.yellow.lighten-3 {\n  background-color: #fff59d !important;\n}\n\n.yellow-text.text-lighten-3 {\n  color: #fff59d !important;\n}\n\n.yellow.lighten-2 {\n  background-color: #fff176 !important;\n}\n\n.yellow-text.text-lighten-2 {\n  color: #fff176 !important;\n}\n\n.yellow.lighten-1 {\n  background-color: #ffee58 !important;\n}\n\n.yellow-text.text-lighten-1 {\n  color: #ffee58 !important;\n}\n\n.yellow {\n  background-color: #ffeb3b !important;\n}\n\n.yellow-text {\n  color: #ffeb3b !important;\n}\n\n.yellow.darken-1 {\n  background-color: #fdd835 !important;\n}\n\n.yellow-text.text-darken-1 {\n  color: #fdd835 !important;\n}\n\n.yellow.darken-2 {\n  background-color: #fbc02d !important;\n}\n\n.yellow-text.text-darken-2 {\n  color: #fbc02d !important;\n}\n\n.yellow.darken-3 {\n  background-color: #f9a825 !important;\n}\n\n.yellow-text.text-darken-3 {\n  color: #f9a825 !important;\n}\n\n.yellow.darken-4 {\n  background-color: #f57f17 !important;\n}\n\n.yellow-text.text-darken-4 {\n  color: #f57f17 !important;\n}\n\n.yellow.accent-1 {\n  background-color: #ffff8d !important;\n}\n\n.yellow-text.text-accent-1 {\n  color: #ffff8d !important;\n}\n\n.yellow.accent-2 {\n  background-color: #ffff00 !important;\n}\n\n.yellow-text.text-accent-2 {\n  color: #ffff00 !important;\n}\n\n.yellow.accent-3 {\n  background-color: #ffea00 !important;\n}\n\n.yellow-text.text-accent-3 {\n  color: #ffea00 !important;\n}\n\n.yellow.accent-4 {\n  background-color: #ffd600 !important;\n}\n\n.yellow-text.text-accent-4 {\n  color: #ffd600 !important;\n}\n\n.amber.lighten-5 {\n  background-color: #fff8e1 !important;\n}\n\n.amber-text.text-lighten-5 {\n  color: #fff8e1 !important;\n}\n\n.amber.lighten-4 {\n  background-color: #ffecb3 !important;\n}\n\n.amber-text.text-lighten-4 {\n  color: #ffecb3 !important;\n}\n\n.amber.lighten-3 {\n  background-color: #ffe082 !important;\n}\n\n.amber-text.text-lighten-3 {\n  color: #ffe082 !important;\n}\n\n.amber.lighten-2 {\n  background-color: #ffd54f !important;\n}\n\n.amber-text.text-lighten-2 {\n  color: #ffd54f !important;\n}\n\n.amber.lighten-1 {\n  background-color: #ffca28 !important;\n}\n\n.amber-text.text-lighten-1 {\n  color: #ffca28 !important;\n}\n\n.amber {\n  background-color: #ffc107 !important;\n}\n\n.amber-text {\n  color: #ffc107 !important;\n}\n\n.amber.darken-1 {\n  background-color: #ffb300 !important;\n}\n\n.amber-text.text-darken-1 {\n  color: #ffb300 !important;\n}\n\n.amber.darken-2 {\n  background-color: #ffa000 !important;\n}\n\n.amber-text.text-darken-2 {\n  color: #ffa000 !important;\n}\n\n.amber.darken-3 {\n  background-color: #ff8f00 !important;\n}\n\n.amber-text.text-darken-3 {\n  color: #ff8f00 !important;\n}\n\n.amber.darken-4 {\n  background-color: #ff6f00 !important;\n}\n\n.amber-text.text-darken-4 {\n  color: #ff6f00 !important;\n}\n\n.amber.accent-1 {\n  background-color: #ffe57f !important;\n}\n\n.amber-text.text-accent-1 {\n  color: #ffe57f !important;\n}\n\n.amber.accent-2 {\n  background-color: #ffd740 !important;\n}\n\n.amber-text.text-accent-2 {\n  color: #ffd740 !important;\n}\n\n.amber.accent-3 {\n  background-color: #ffc400 !important;\n}\n\n.amber-text.text-accent-3 {\n  color: #ffc400 !important;\n}\n\n.amber.accent-4 {\n  background-color: #ffab00 !important;\n}\n\n.amber-text.text-accent-4 {\n  color: #ffab00 !important;\n}\n\n.orange.lighten-5 {\n  background-color: #fff3e0 !important;\n}\n\n.orange-text.text-lighten-5 {\n  color: #fff3e0 !important;\n}\n\n.orange.lighten-4 {\n  background-color: #ffe0b2 !important;\n}\n\n.orange-text.text-lighten-4 {\n  color: #ffe0b2 !important;\n}\n\n.orange.lighten-3 {\n  background-color: #ffcc80 !important;\n}\n\n.orange-text.text-lighten-3 {\n  color: #ffcc80 !important;\n}\n\n.orange.lighten-2 {\n  background-color: #ffb74d !important;\n}\n\n.orange-text.text-lighten-2 {\n  color: #ffb74d !important;\n}\n\n.orange.lighten-1 {\n  background-color: #ffa726 !important;\n}\n\n.orange-text.text-lighten-1 {\n  color: #ffa726 !important;\n}\n\n.orange {\n  background-color: #ff9800 !important;\n}\n\n.orange-text {\n  color: #ff9800 !important;\n}\n\n.orange.darken-1 {\n  background-color: #fb8c00 !important;\n}\n\n.orange-text.text-darken-1 {\n  color: #fb8c00 !important;\n}\n\n.orange.darken-2 {\n  background-color: #f57c00 !important;\n}\n\n.orange-text.text-darken-2 {\n  color: #f57c00 !important;\n}\n\n.orange.darken-3 {\n  background-color: #ef6c00 !important;\n}\n\n.orange-text.text-darken-3 {\n  color: #ef6c00 !important;\n}\n\n.orange.darken-4 {\n  background-color: #e65100 !important;\n}\n\n.orange-text.text-darken-4 {\n  color: #e65100 !important;\n}\n\n.orange.accent-1 {\n  background-color: #ffd180 !important;\n}\n\n.orange-text.text-accent-1 {\n  color: #ffd180 !important;\n}\n\n.orange.accent-2 {\n  background-color: #ffab40 !important;\n}\n\n.orange-text.text-accent-2 {\n  color: #ffab40 !important;\n}\n\n.orange.accent-3 {\n  background-color: #ff9100 !important;\n}\n\n.orange-text.text-accent-3 {\n  color: #ff9100 !important;\n}\n\n.orange.accent-4 {\n  background-color: #ff6d00 !important;\n}\n\n.orange-text.text-accent-4 {\n  color: #ff6d00 !important;\n}\n\n.deep-orange.lighten-5 {\n  background-color: #fbe9e7 !important;\n}\n\n.deep-orange-text.text-lighten-5 {\n  color: #fbe9e7 !important;\n}\n\n.deep-orange.lighten-4 {\n  background-color: #ffccbc !important;\n}\n\n.deep-orange-text.text-lighten-4 {\n  color: #ffccbc !important;\n}\n\n.deep-orange.lighten-3 {\n  background-color: #ffab91 !important;\n}\n\n.deep-orange-text.text-lighten-3 {\n  color: #ffab91 !important;\n}\n\n.deep-orange.lighten-2 {\n  background-color: #ff8a65 !important;\n}\n\n.deep-orange-text.text-lighten-2 {\n  color: #ff8a65 !important;\n}\n\n.deep-orange.lighten-1 {\n  background-color: #ff7043 !important;\n}\n\n.deep-orange-text.text-lighten-1 {\n  color: #ff7043 !important;\n}\n\n.deep-orange {\n  background-color: #ff5722 !important;\n}\n\n.deep-orange-text {\n  color: #ff5722 !important;\n}\n\n.deep-orange.darken-1 {\n  background-color: #f4511e !important;\n}\n\n.deep-orange-text.text-darken-1 {\n  color: #f4511e !important;\n}\n\n.deep-orange.darken-2 {\n  background-color: #e64a19 !important;\n}\n\n.deep-orange-text.text-darken-2 {\n  color: #e64a19 !important;\n}\n\n.deep-orange.darken-3 {\n  background-color: #d84315 !important;\n}\n\n.deep-orange-text.text-darken-3 {\n  color: #d84315 !important;\n}\n\n.deep-orange.darken-4 {\n  background-color: #bf360c !important;\n}\n\n.deep-orange-text.text-darken-4 {\n  color: #bf360c !important;\n}\n\n.deep-orange.accent-1 {\n  background-color: #ff9e80 !important;\n}\n\n.deep-orange-text.text-accent-1 {\n  color: #ff9e80 !important;\n}\n\n.deep-orange.accent-2 {\n  background-color: #ff6e40 !important;\n}\n\n.deep-orange-text.text-accent-2 {\n  color: #ff6e40 !important;\n}\n\n.deep-orange.accent-3 {\n  background-color: #ff3d00 !important;\n}\n\n.deep-orange-text.text-accent-3 {\n  color: #ff3d00 !important;\n}\n\n.deep-orange.accent-4 {\n  background-color: #dd2c00 !important;\n}\n\n.deep-orange-text.text-accent-4 {\n  color: #dd2c00 !important;\n}\n\n.brown.lighten-5 {\n  background-color: #efebe9 !important;\n}\n\n.brown-text.text-lighten-5 {\n  color: #efebe9 !important;\n}\n\n.brown.lighten-4 {\n  background-color: #d7ccc8 !important;\n}\n\n.brown-text.text-lighten-4 {\n  color: #d7ccc8 !important;\n}\n\n.brown.lighten-3 {\n  background-color: #bcaaa4 !important;\n}\n\n.brown-text.text-lighten-3 {\n  color: #bcaaa4 !important;\n}\n\n.brown.lighten-2 {\n  background-color: #a1887f !important;\n}\n\n.brown-text.text-lighten-2 {\n  color: #a1887f !important;\n}\n\n.brown.lighten-1 {\n  background-color: #8d6e63 !important;\n}\n\n.brown-text.text-lighten-1 {\n  color: #8d6e63 !important;\n}\n\n.brown {\n  background-color: #795548 !important;\n}\n\n.brown-text {\n  color: #795548 !important;\n}\n\n.brown.darken-1 {\n  background-color: #6d4c41 !important;\n}\n\n.brown-text.text-darken-1 {\n  color: #6d4c41 !important;\n}\n\n.brown.darken-2 {\n  background-color: #5d4037 !important;\n}\n\n.brown-text.text-darken-2 {\n  color: #5d4037 !important;\n}\n\n.brown.darken-3 {\n  background-color: #4e342e !important;\n}\n\n.brown-text.text-darken-3 {\n  color: #4e342e !important;\n}\n\n.brown.darken-4 {\n  background-color: #3e2723 !important;\n}\n\n.brown-text.text-darken-4 {\n  color: #3e2723 !important;\n}\n\n.blue-grey.lighten-5 {\n  background-color: #eceff1 !important;\n}\n\n.blue-grey-text.text-lighten-5 {\n  color: #eceff1 !important;\n}\n\n.blue-grey.lighten-4 {\n  background-color: #cfd8dc !important;\n}\n\n.blue-grey-text.text-lighten-4 {\n  color: #cfd8dc !important;\n}\n\n.blue-grey.lighten-3 {\n  background-color: #b0bec5 !important;\n}\n\n.blue-grey-text.text-lighten-3 {\n  color: #b0bec5 !important;\n}\n\n.blue-grey.lighten-2 {\n  background-color: #90a4ae !important;\n}\n\n.blue-grey-text.text-lighten-2 {\n  color: #90a4ae !important;\n}\n\n.blue-grey.lighten-1 {\n  background-color: #78909c !important;\n}\n\n.blue-grey-text.text-lighten-1 {\n  color: #78909c !important;\n}\n\n.blue-grey {\n  background-color: #607d8b !important;\n}\n\n.blue-grey-text {\n  color: #607d8b !important;\n}\n\n.blue-grey.darken-1 {\n  background-color: #546e7a !important;\n}\n\n.blue-grey-text.text-darken-1 {\n  color: #546e7a !important;\n}\n\n.blue-grey.darken-2 {\n  background-color: #455a64 !important;\n}\n\n.blue-grey-text.text-darken-2 {\n  color: #455a64 !important;\n}\n\n.blue-grey.darken-3 {\n  background-color: #37474f !important;\n}\n\n.blue-grey-text.text-darken-3 {\n  color: #37474f !important;\n}\n\n.blue-grey.darken-4 {\n  background-color: #263238 !important;\n}\n\n.blue-grey-text.text-darken-4 {\n  color: #263238 !important;\n}\n\n.grey.lighten-5 {\n  background-color: #fafafa !important;\n}\n\n.grey-text.text-lighten-5 {\n  color: #fafafa !important;\n}\n\n.grey.lighten-4 {\n  background-color: #f5f5f5 !important;\n}\n\n.grey-text.text-lighten-4 {\n  color: #f5f5f5 !important;\n}\n\n.grey.lighten-3 {\n  background-color: #eeeeee !important;\n}\n\n.grey-text.text-lighten-3 {\n  color: #eeeeee !important;\n}\n\n.grey.lighten-2 {\n  background-color: #e0e0e0 !important;\n}\n\n.grey-text.text-lighten-2 {\n  color: #e0e0e0 !important;\n}\n\n.grey.lighten-1 {\n  background-color: #bdbdbd !important;\n}\n\n.grey-text.text-lighten-1 {\n  color: #bdbdbd !important;\n}\n\n.grey {\n  background-color: #9e9e9e !important;\n}\n\n.grey-text {\n  color: #9e9e9e !important;\n}\n\n.grey.darken-1 {\n  background-color: #757575 !important;\n}\n\n.grey-text.text-darken-1 {\n  color: #757575 !important;\n}\n\n.grey.darken-2 {\n  background-color: #616161 !important;\n}\n\n.grey-text.text-darken-2 {\n  color: #616161 !important;\n}\n\n.grey.darken-3 {\n  background-color: #424242 !important;\n}\n\n.grey-text.text-darken-3 {\n  color: #424242 !important;\n}\n\n.grey.darken-4 {\n  background-color: #212121 !important;\n}\n\n.grey-text.text-darken-4 {\n  color: #212121 !important;\n}\n\n.shades.black {\n  background-color: #000000 !important;\n}\n\n.shades-text.text-black {\n  color: #000000 !important;\n}\n\n.shades.white {\n  background-color: #FFFFFF !important;\n}\n\n.shades-text.text-white {\n  color: #FFFFFF !important;\n}\n\n.shades.transparent {\n  background-color: transparent !important;\n}\n\n.shades-text.text-transparent {\n  color: transparent !important;\n}\n\n.black {\n  background-color: #000000 !important;\n}\n\n.black-text {\n  color: #000000 !important;\n}\n\n.white {\n  background-color: #FFFFFF !important;\n}\n\n.white-text {\n  color: #FFFFFF !important;\n}\n\n.transparent {\n  background-color: transparent !important;\n}\n\n.transparent-text {\n  color: transparent !important;\n}\n\n/*** Colors ***/\n/*** Badges ***/\n/*** Buttons ***/\n/*** Cards ***/\n/*** Collapsible ***/\n/*** Chips ***/\n/*** Date Picker ***/\n/*** Dropdown ***/\n/*** Fonts ***/\n/*** Forms ***/\n/*** Global ***/\n/*** Navbar ***/\n/*** SideNav ***/\n/*** Photo Slider ***/\n/*** Spinners | Loaders ***/\n/*** Tabs ***/\n/*** Tables ***/\n/*** Toasts ***/\n/*** Typography ***/\n/*** Collections ***/\n/* Progress Bar */\n/*! normalize.css v3.0.2 | MIT License | git.io/normalize */\n/**\n * 1. Set default font family to sans-serif.\n * 2. Prevent iOS text size adjust after orientation change, without disabling\n *    user zoom.\n */\nhtml {\n  font-family: sans-serif;\n  /* 1 */\n  -ms-text-size-adjust: 100%;\n  /* 2 */\n  -webkit-text-size-adjust: 100%;\n  /* 2 */\n}\n\n/**\n * Remove default margin.\n */\nbody {\n  margin: 0;\n}\n\n/* HTML5 display definitions\n   ========================================================================== */\n/**\n * Correct `block` display not defined for any HTML5 element in IE 8/9.\n * Correct `block` display not defined for `details` or `summary` in IE 10/11\n * and Firefox.\n * Correct `block` display not defined for `main` in IE 11.\n */\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n  display: block;\n}\n\n/**\n * 1. Correct `inline-block` display not defined in IE 8/9.\n * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n */\naudio,\ncanvas,\nprogress,\nvideo {\n  display: inline-block;\n  /* 1 */\n  vertical-align: baseline;\n  /* 2 */\n}\n\n/**\n * Prevent modern browsers from displaying `audio` without controls.\n * Remove excess height in iOS 5 devices.\n */\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n\n/**\n * Address `[hidden]` styling not present in IE 8/9/10.\n * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22.\n */\n[hidden],\ntemplate {\n  display: none;\n}\n\n/* Links\n   ========================================================================== */\n/**\n * Remove the gray background color from active links in IE 10.\n */\na {\n  background-color: transparent;\n}\n\n/**\n * Improve readability when focused and also mouse hovered in all browsers.\n */\na:active,\na:hover {\n  outline: 0;\n}\n\n/* Text-level semantics\n   ========================================================================== */\n/**\n * Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n */\nabbr[title] {\n  border-bottom: 1px dotted;\n}\n\n/**\n * Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n */\nb,\nstrong {\n  font-weight: bold;\n}\n\n/**\n * Address styling not present in Safari and Chrome.\n */\ndfn {\n  font-style: italic;\n}\n\n/**\n * Address variable `h1` font-size and margin within `section` and `article`\n * contexts in Firefox 4+, Safari, and Chrome.\n */\nh1 {\n  font-size: 2em;\n  margin: 0.67em 0;\n}\n\n/**\n * Address styling not present in IE 8/9.\n */\nmark {\n  background: #ff0;\n  color: #000;\n}\n\n/**\n * Address inconsistent and variable font size in all browsers.\n */\nsmall {\n  font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` affecting `line-height` in all browsers.\n */\nsub,\nsup {\n  font-size: 75%;\n  line-height: 0;\n  position: relative;\n  vertical-align: baseline;\n}\n\nsup {\n  top: -0.5em;\n}\n\nsub {\n  bottom: -0.25em;\n}\n\n/* Embedded content\n   ========================================================================== */\n/**\n * Remove border when inside `a` element in IE 8/9/10.\n */\nimg {\n  border: 0;\n}\n\n/**\n * Correct overflow not hidden in IE 9/10/11.\n */\nsvg:not(:root) {\n  overflow: hidden;\n}\n\n/* Grouping content\n   ========================================================================== */\n/**\n * Address margin not present in IE 8/9 and Safari.\n */\nfigure {\n  margin: 1em 40px;\n}\n\n/**\n * Address differences between Firefox and other browsers.\n */\nhr {\n  -moz-box-sizing: content-box;\n  box-sizing: content-box;\n  height: 0;\n}\n\n/**\n * Contain overflow in all browsers.\n */\npre {\n  overflow: auto;\n}\n\n/**\n * Address odd `em`-unit font size rendering in all browsers.\n */\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, monospace;\n  font-size: 1em;\n}\n\n/* Forms\n   ========================================================================== */\n/**\n * Known limitation: by default, Chrome and Safari on OS X allow very limited\n * styling of `select`, unless a `border` property is set.\n */\n/**\n * 1. Correct color not being inherited.\n *    Known issue: affects color of disabled elements.\n * 2. Correct font properties not being inherited.\n * 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n */\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n  color: inherit;\n  /* 1 */\n  font: inherit;\n  /* 2 */\n  margin: 0;\n  /* 3 */\n}\n\n/**\n * Address `overflow` set to `hidden` in IE 8/9/10/11.\n */\nbutton {\n  overflow: visible;\n}\n\n/**\n * Address inconsistent `text-transform` inheritance for `button` and `select`.\n * All other form control elements do not inherit `text-transform` values.\n * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n * Correct `select` style inheritance in Firefox.\n */\nbutton,\nselect {\n  text-transform: none;\n}\n\n/**\n * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n *    and `video` controls.\n * 2. Correct inability to style clickable `input` types in iOS.\n * 3. Improve usability and consistency of cursor style between image-type\n *    `input` and others.\n */\n/* 1 */\nhtml input[type=\"button\"],\nbutton,\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  -webkit-appearance: button;\n  /* 2 */\n  cursor: pointer;\n  /* 3 */\n}\n\n/**\n * Re-set default cursor for disabled elements.\n */\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\n\n/**\n * Remove inner padding and border in Firefox 4+.\n */\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  border: 0;\n  padding: 0;\n}\n\n/**\n * Address Firefox 4+ setting `line-height` on `input` using `!important` in\n * the UA stylesheet.\n */\ninput {\n  line-height: normal;\n}\n\n/**\n * It's recommended that you don't attempt to style these elements.\n * Firefox's implementation doesn't respect box-sizing, padding, or width.\n *\n * 1. Address box sizing set to `content-box` in IE 8/9/10.\n * 2. Remove excess padding in IE 8/9/10.\n */\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  box-sizing: border-box;\n  /* 1 */\n  padding: 0;\n  /* 2 */\n}\n\n/**\n * Fix the cursor style for Chrome's increment/decrement buttons. For certain\n * `font-size` values of the `input`, it causes the cursor style of the\n * decrement button to change from `default` to `text`.\n */\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\n\n/**\n * 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n * 2. Address `box-sizing` set to `border-box` in Safari and Chrome\n *    (include `-moz` to future-proof).\n */\ninput[type=\"search\"] {\n  -webkit-appearance: textfield;\n  /* 1 */\n  -moz-box-sizing: content-box;\n  -webkit-box-sizing: content-box;\n  /* 2 */\n  box-sizing: content-box;\n}\n\n/**\n * Remove inner padding and search cancel button in Safari and Chrome on OS X.\n * Safari (but not Chrome) clips the cancel button when the search input has\n * padding (and `textfield` appearance).\n */\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\n/**\n * Define consistent border, margin, and padding.\n */\nfieldset {\n  border: 1px solid #c0c0c0;\n  margin: 0 2px;\n  padding: 0.35em 0.625em 0.75em;\n}\n\n/**\n * 1. Correct `color` not being inherited in IE 8/9/10/11.\n * 2. Remove padding so people aren't caught out if they zero out fieldsets.\n */\nlegend {\n  border: 0;\n  /* 1 */\n  padding: 0;\n  /* 2 */\n}\n\n/**\n * Remove default vertical scrollbar in IE 8/9/10/11.\n */\ntextarea {\n  overflow: auto;\n}\n\n/**\n * Don't inherit the `font-weight` (applied by a rule above).\n * NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n */\noptgroup {\n  font-weight: bold;\n}\n\n/* Tables\n   ========================================================================== */\n/**\n * Remove most spacing between table cells.\n */\ntable {\n  border-collapse: collapse;\n  border-spacing: 0;\n}\n\ntd,\nth {\n  padding: 0;\n}\n\nhtml {\n  box-sizing: border-box;\n}\n\n*, *:before, *:after {\n  box-sizing: inherit;\n}\n\nul {\n  list-style-type: none;\n}\n\na {\n  color: #039be5;\n  text-decoration: none;\n  -webkit-tap-highlight-color: transparent;\n}\n\n.valign-wrapper {\n  display: flex;\n  align-items: center;\n}\n\n.valign-wrapper .valign {\n  display: block;\n}\n\nul {\n  padding: 0;\n}\n\nul li {\n  list-style-type: none;\n}\n\n.clearfix {\n  clear: both;\n}\n\n.z-depth-0 {\n  box-shadow: none !important;\n}\n\n.z-depth-1, nav, .card-panel, .card, .toast, .btn, .btn-large, .btn-floating, .dropdown-content, .collapsible, .side-nav {\n  box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12);\n}\n\n.z-depth-1-half, .btn:hover, .btn-large:hover, .btn-floating:hover {\n  box-shadow: 0 5px 11px 0 rgba(0, 0, 0, 0.18), 0 4px 15px 0 rgba(0, 0, 0, 0.15);\n}\n\n.z-depth-2 {\n  box-shadow: 0 8px 17px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);\n}\n\n.z-depth-3 {\n  box-shadow: 0 12px 15px 0 rgba(0, 0, 0, 0.24), 0 17px 50px 0 rgba(0, 0, 0, 0.19);\n}\n\n.z-depth-4, .modal {\n  box-shadow: 0 16px 28px 0 rgba(0, 0, 0, 0.22), 0 25px 55px 0 rgba(0, 0, 0, 0.21);\n}\n\n.z-depth-5 {\n  box-shadow: 0 27px 24px 0 rgba(0, 0, 0, 0.2), 0 40px 77px 0 rgba(0, 0, 0, 0.22);\n}\n\n.hoverable {\n  transition: box-shadow .25s;\n  box-shadow: 0;\n}\n\n.hoverable:hover {\n  transition: box-shadow .25s;\n  box-shadow: 0 8px 17px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);\n}\n\n.divider {\n  height: 1px;\n  overflow: hidden;\n  background-color: #e0e0e0;\n}\n\nblockquote {\n  margin: 20px 0;\n  padding-left: 1.5rem;\n  border-left: 5px solid #ee6e73;\n}\n\ni {\n  line-height: inherit;\n}\n\ni.left {\n  float: left;\n  margin-right: 15px;\n}\n\ni.right {\n  float: right;\n  margin-left: 15px;\n}\n\ni.tiny {\n  font-size: 1rem;\n}\n\ni.small {\n  font-size: 2rem;\n}\n\ni.medium {\n  font-size: 4rem;\n}\n\ni.large {\n  font-size: 6rem;\n}\n\nimg.responsive-img,\nvideo.responsive-video {\n  max-width: 100%;\n  height: auto;\n}\n\n.pagination li {\n  display: inline-block;\n  font-size: 1.2rem;\n  padding: 0 10px;\n  line-height: 30px;\n  border-radius: 2px;\n  text-align: center;\n}\n\n.pagination li a {\n  color: #444;\n}\n\n.pagination li.active a {\n  color: #fff;\n}\n\n.pagination li.active {\n  background-color: #ee6e73;\n}\n\n.pagination li.disabled a {\n  cursor: default;\n  color: #999;\n}\n\n.pagination li i {\n  font-size: 2.2rem;\n  vertical-align: middle;\n}\n\n.pagination li.pages ul li {\n  display: inline-block;\n  float: none;\n}\n\n@media only screen and (max-width: 992px) {\n  .pagination {\n    width: 100%;\n  }\n  .pagination li.prev,\n  .pagination li.next {\n    width: 10%;\n  }\n  .pagination li.pages {\n    width: 80%;\n    overflow: hidden;\n    white-space: nowrap;\n  }\n}\n\n.breadcrumb {\n  font-size: 18px;\n  color: rgba(255, 255, 255, 0.7);\n}\n\n.breadcrumb i,\n.breadcrumb [class^=\"mdi-\"], .breadcrumb [class*=\"mdi-\"],\n.breadcrumb i.material-icons {\n  display: inline-block;\n  float: left;\n  font-size: 24px;\n}\n\n.breadcrumb:before {\n  content: '\\E5CC';\n  color: rgba(255, 255, 255, 0.7);\n  vertical-align: top;\n  display: inline-block;\n  font-family: 'Material Icons';\n  font-weight: normal;\n  font-style: normal;\n  font-size: 25px;\n  margin: 0 10px 0 8px;\n  -webkit-font-smoothing: antialiased;\n}\n\n.breadcrumb:first-child:before {\n  display: none;\n}\n\n.breadcrumb:last-child {\n  color: #fff;\n}\n\n.parallax-container {\n  position: relative;\n  overflow: hidden;\n  height: 500px;\n}\n\n.parallax {\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  z-index: -1;\n}\n\n.parallax img {\n  display: none;\n  position: absolute;\n  left: 50%;\n  bottom: 0;\n  min-width: 100%;\n  min-height: 100%;\n  -webkit-transform: translate3d(0, 0, 0);\n  transform: translate3d(0, 0, 0);\n  transform: translateX(-50%);\n}\n\n.pin-top, .pin-bottom {\n  position: relative;\n}\n\n.pinned {\n  position: fixed !important;\n}\n\n/*********************\n  Transition Classes\n**********************/\nul.staggered-list li {\n  opacity: 0;\n}\n\n.fade-in {\n  opacity: 0;\n  transform-origin: 0 50%;\n}\n\n/*********************\n  Media Query Classes\n**********************/\n@media only screen and (max-width: 600px) {\n  .hide-on-small-only, .hide-on-small-and-down {\n    display: none !important;\n  }\n}\n\n@media only screen and (max-width: 992px) {\n  .hide-on-med-and-down {\n    display: none !important;\n  }\n}\n\n@media only screen and (min-width: 601px) {\n  .hide-on-med-and-up {\n    display: none !important;\n  }\n}\n\n@media only screen and (min-width: 600px) and (max-width: 992px) {\n  .hide-on-med-only {\n    display: none !important;\n  }\n}\n\n@media only screen and (min-width: 993px) {\n  .hide-on-large-only {\n    display: none !important;\n  }\n}\n\n@media only screen and (min-width: 993px) {\n  .show-on-large {\n    display: block !important;\n  }\n}\n\n@media only screen and (min-width: 600px) and (max-width: 992px) {\n  .show-on-medium {\n    display: block !important;\n  }\n}\n\n@media only screen and (max-width: 600px) {\n  .show-on-small {\n    display: block !important;\n  }\n}\n\n@media only screen and (min-width: 601px) {\n  .show-on-medium-and-up {\n    display: block !important;\n  }\n}\n\n@media only screen and (max-width: 992px) {\n  .show-on-medium-and-down {\n    display: block !important;\n  }\n}\n\n@media only screen and (max-width: 600px) {\n  .center-on-small-only {\n    text-align: center;\n  }\n}\n\nfooter.page-footer {\n  margin-top: 20px;\n  padding-top: 20px;\n  background-color: #ee6e73;\n}\n\nfooter.page-footer .footer-copyright {\n  overflow: hidden;\n  height: 50px;\n  line-height: 50px;\n  color: rgba(255, 255, 255, 0.8);\n  background-color: rgba(51, 51, 51, 0.08);\n}\n\ntable, th, td {\n  border: none;\n}\n\ntable {\n  width: 100%;\n  display: table;\n}\n\ntable.bordered > thead > tr,\ntable.bordered > tbody > tr {\n  border-bottom: 1px solid #d0d0d0;\n}\n\ntable.striped > tbody > tr:nth-child(odd) {\n  background-color: #f2f2f2;\n}\n\ntable.striped > tbody > tr > td {\n  border-radius: 0px;\n}\n\ntable.highlight > tbody > tr {\n  transition: background-color .25s ease;\n}\n\ntable.highlight > tbody > tr:hover {\n  background-color: #f2f2f2;\n}\n\ntable.centered thead tr th, table.centered tbody tr td {\n  text-align: center;\n}\n\nthead {\n  border-bottom: 1px solid #d0d0d0;\n}\n\ntd, th {\n  padding: 15px 5px;\n  display: table-cell;\n  text-align: left;\n  vertical-align: middle;\n  border-radius: 2px;\n}\n\n@media only screen and (max-width: 992px) {\n  table.responsive-table {\n    width: 100%;\n    border-collapse: collapse;\n    border-spacing: 0;\n    display: block;\n    position: relative;\n    /* sort out borders */\n  }\n  table.responsive-table th,\n  table.responsive-table td {\n    margin: 0;\n    vertical-align: top;\n  }\n  table.responsive-table th {\n    text-align: left;\n  }\n  table.responsive-table thead {\n    display: block;\n    float: left;\n  }\n  table.responsive-table thead tr {\n    display: block;\n    padding: 0 10px 0 0;\n  }\n  table.responsive-table thead tr th::before {\n    content: \"\\00a0\";\n  }\n  table.responsive-table tbody {\n    display: block;\n    width: auto;\n    position: relative;\n    overflow-x: auto;\n    white-space: nowrap;\n  }\n  table.responsive-table tbody tr {\n    display: inline-block;\n    vertical-align: top;\n  }\n  table.responsive-table th {\n    display: block;\n    text-align: right;\n  }\n  table.responsive-table td {\n    display: block;\n    min-height: 1.25em;\n    text-align: left;\n  }\n  table.responsive-table tr {\n    padding: 0 10px;\n  }\n  table.responsive-table thead {\n    border: 0;\n    border-right: 1px solid #d0d0d0;\n  }\n  table.responsive-table.bordered th {\n    border-bottom: 0;\n    border-left: 0;\n  }\n  table.responsive-table.bordered td {\n    border-left: 0;\n    border-right: 0;\n    border-bottom: 0;\n  }\n  table.responsive-table.bordered tr {\n    border: 0;\n  }\n  table.responsive-table.bordered tbody tr {\n    border-right: 1px solid #d0d0d0;\n  }\n}\n\n.collection {\n  margin: 0.5rem 0 1rem 0;\n  border: 1px solid #e0e0e0;\n  border-radius: 2px;\n  overflow: hidden;\n  position: relative;\n}\n\n.collection .collection-item {\n  background-color: #fff;\n  line-height: 1.5rem;\n  padding: 10px 20px;\n  margin: 0;\n  border-bottom: 1px solid #e0e0e0;\n}\n\n.collection .collection-item.avatar {\n  min-height: 84px;\n  padding-left: 72px;\n  position: relative;\n}\n\n.collection .collection-item.avatar .circle {\n  position: absolute;\n  width: 42px;\n  height: 42px;\n  overflow: hidden;\n  left: 15px;\n  display: inline-block;\n  vertical-align: middle;\n}\n\n.collection .collection-item.avatar i.circle {\n  font-size: 18px;\n  line-height: 42px;\n  color: #fff;\n  background-color: #999;\n  text-align: center;\n}\n\n.collection .collection-item.avatar .title {\n  font-size: 16px;\n}\n\n.collection .collection-item.avatar p {\n  margin: 0;\n}\n\n.collection .collection-item.avatar .secondary-content {\n  position: absolute;\n  top: 16px;\n  right: 16px;\n}\n\n.collection .collection-item:last-child {\n  border-bottom: none;\n}\n\n.collection .collection-item.active {\n  background-color: #26a69a;\n  color: #eafaf9;\n}\n\n.collection .collection-item.active .secondary-content {\n  color: #fff;\n}\n\n.collection a.collection-item {\n  display: block;\n  transition: .25s;\n  color: #26a69a;\n}\n\n.collection a.collection-item:not(.active):hover {\n  background-color: #ddd;\n}\n\n.collection.with-header .collection-header {\n  background-color: #fff;\n  border-bottom: 1px solid #e0e0e0;\n  padding: 10px 20px;\n}\n\n.collection.with-header .collection-item {\n  padding-left: 30px;\n}\n\n.collection.with-header .collection-item.avatar {\n  padding-left: 72px;\n}\n\n.secondary-content {\n  float: right;\n  color: #26a69a;\n}\n\n.collapsible .collection {\n  margin: 0;\n  border: none;\n}\n\nspan.badge {\n  min-width: 3rem;\n  padding: 0 6px;\n  text-align: center;\n  font-size: 1rem;\n  line-height: inherit;\n  color: #757575;\n  position: absolute;\n  right: 15px;\n  box-sizing: border-box;\n}\n\nspan.badge.new {\n  font-weight: 300;\n  font-size: 0.8rem;\n  color: #fff;\n  background-color: #26a69a;\n  border-radius: 2px;\n}\n\nspan.badge.new:after {\n  content: \" new\";\n}\n\nnav ul a span.badge {\n  position: static;\n  margin-left: 4px;\n  line-height: 0;\n}\n\n.video-container {\n  position: relative;\n  padding-bottom: 56.25%;\n  height: 0;\n  overflow: hidden;\n}\n\n.video-container iframe, .video-container object, .video-container embed {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n}\n\n.progress {\n  position: relative;\n  height: 4px;\n  display: block;\n  width: 100%;\n  background-color: #acece6;\n  border-radius: 2px;\n  margin: 0.5rem 0 1rem 0;\n  overflow: hidden;\n}\n\n.progress .determinate {\n  position: absolute;\n  background-color: inherit;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  background-color: #26a69a;\n  transition: width .3s linear;\n}\n\n.progress .indeterminate {\n  background-color: #26a69a;\n}\n\n.progress .indeterminate:before {\n  content: '';\n  position: absolute;\n  background-color: inherit;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  will-change: left, right;\n  animation: indeterminate 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite;\n}\n\n.progress .indeterminate:after {\n  content: '';\n  position: absolute;\n  background-color: inherit;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  will-change: left, right;\n  animation: indeterminate-short 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) infinite;\n  animation-delay: 1.15s;\n}\n\n@keyframes indeterminate {\n  0% {\n    left: -35%;\n    right: 100%;\n  }\n  60% {\n    left: 100%;\n    right: -90%;\n  }\n  100% {\n    left: 100%;\n    right: -90%;\n  }\n}\n\n@keyframes indeterminate-short {\n  0% {\n    left: -200%;\n    right: 100%;\n  }\n  60% {\n    left: 107%;\n    right: -8%;\n  }\n  100% {\n    left: 107%;\n    right: -8%;\n  }\n}\n\n/*******************\n  Utility Classes\n*******************/\n.hide {\n  display: none !important;\n}\n\n.left-align {\n  text-align: left;\n}\n\n.right-align {\n  text-align: right;\n}\n\n.center, .center-align {\n  text-align: center;\n}\n\n.left {\n  float: left !important;\n}\n\n.right {\n  float: right !important;\n}\n\n.no-select, input[type=range], input[type=range] + .thumb {\n  -webkit-touch-callout: none;\n  -webkit-user-select: none;\n  -khtml-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n\n.circle {\n  border-radius: 50%;\n}\n\n.center-block {\n  display: block;\n  margin-left: auto;\n  margin-right: auto;\n}\n\n.truncate {\n  display: block;\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n\n.no-padding {\n  padding: 0 !important;\n}\n\n/* This is needed for some mobile phones to display the Google Icon font properly */\n.material-icons {\n  text-rendering: optimizeLegibility;\n  font-feature-settings: 'liga';\n}\n\n@font-face {\n  font-family: \"Material-Design-Icons\";\n  src: url(\"../font/material-design-icons/Material-Design-Icons.eot?#iefix\") format(\"embedded-opentype\"), url(\"../font/material-design-icons/Material-Design-Icons.woff2\") format(\"woff2\"), url(\"../font/material-design-icons/Material-Design-Icons.woff\") format(\"woff\"), url(\"../font/material-design-icons/Material-Design-Icons.ttf\") format(\"truetype\"), url(\"../font/material-design-icons/Material-Design-Icons.svg#Material-Design-Icons\") format(\"svg\");\n  font-weight: normal;\n  font-style: normal;\n}\n\n[class^=\"mdi-\"], [class*=\"mdi-\"] {\n  speak: none;\n  display: inline-block;\n  font-family: \"Material-Design-Icons\";\n  font-style: normal;\n  font-weight: normal;\n  font-variant: normal;\n  text-rendering: auto;\n  /* Better Font Rendering =========== */\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  transform: translate(0, 0);\n}\n\n[class^=\"mdi-\"]:before, [class*=\"mdi-\"]:before {\n  display: inline-block;\n  speak: none;\n  text-decoration: inherit;\n}\n\n[class^=\"mdi-\"].pull-left, [class*=\"mdi-\"].pull-left {\n  margin-right: .3em;\n}\n\n[class^=\"mdi-\"].pull-right, [class*=\"mdi-\"].pull-right {\n  margin-left: .3em;\n}\n\n[class^=\"mdi-\"].mdi-lg:before, [class^=\"mdi-\"].mdi-lg:after, [class*=\"mdi-\"].mdi-lg:before, [class*=\"mdi-\"].mdi-lg:after {\n  font-size: 1.33333333em;\n  line-height: 0.75em;\n  vertical-align: -15%;\n}\n\n[class^=\"mdi-\"].mdi-2x:before, [class^=\"mdi-\"].mdi-2x:after, [class*=\"mdi-\"].mdi-2x:before, [class*=\"mdi-\"].mdi-2x:after {\n  font-size: 2em;\n}\n\n[class^=\"mdi-\"].mdi-3x:before, [class^=\"mdi-\"].mdi-3x:after, [class*=\"mdi-\"].mdi-3x:before, [class*=\"mdi-\"].mdi-3x:after {\n  font-size: 3em;\n}\n\n[class^=\"mdi-\"].mdi-4x:before, [class^=\"mdi-\"].mdi-4x:after, [class*=\"mdi-\"].mdi-4x:before, [class*=\"mdi-\"].mdi-4x:after {\n  font-size: 4em;\n}\n\n[class^=\"mdi-\"].mdi-5x:before, [class^=\"mdi-\"].mdi-5x:after, [class*=\"mdi-\"].mdi-5x:before, [class*=\"mdi-\"].mdi-5x:after {\n  font-size: 5em;\n}\n\n[class^=\"mdi-device-signal-cellular-\"]:after,\n[class^=\"mdi-device-battery-\"]:after,\n[class^=\"mdi-device-battery-charging-\"]:after,\n[class^=\"mdi-device-signal-cellular-connected-no-internet-\"]:after,\n[class^=\"mdi-device-signal-wifi-\"]:after,\n[class^=\"mdi-device-signal-wifi-statusbar-not-connected\"]:after,\n.mdi-device-network-wifi:after {\n  opacity: .3;\n  position: absolute;\n  left: 0;\n  top: 0;\n  z-index: 1;\n  display: inline-block;\n  speak: none;\n  text-decoration: inherit;\n}\n\n[class^=\"mdi-device-signal-cellular-\"]:after {\n  content: \"\\e758\";\n}\n\n[class^=\"mdi-device-battery-\"]:after {\n  content: \"\\e735\";\n}\n\n[class^=\"mdi-device-battery-charging-\"]:after {\n  content: \"\\e733\";\n}\n\n[class^=\"mdi-device-signal-cellular-connected-no-internet-\"]:after {\n  content: \"\\e75d\";\n}\n\n[class^=\"mdi-device-signal-wifi-\"]:after, .mdi-device-network-wifi:after {\n  content: \"\\e765\";\n}\n\n[class^=\"mdi-device-signal-wifi-statusbasr-not-connected\"]:after {\n  content: \"\\e8f7\";\n}\n\n.mdi-device-signal-cellular-off:after, .mdi-device-signal-cellular-null:after, .mdi-device-signal-cellular-no-sim:after, .mdi-device-signal-wifi-off:after, .mdi-device-signal-wifi-4-bar:after, .mdi-device-signal-cellular-4-bar:after, .mdi-device-battery-alert:after, .mdi-device-signal-cellular-connected-no-internet-4-bar:after, .mdi-device-battery-std:after, .mdi-device-battery-full .mdi-device-battery-unknown:after {\n  content: \"\";\n}\n\n.mdi-fw {\n  width: 1.28571429em;\n  text-align: center;\n}\n\n.mdi-ul {\n  padding-left: 0;\n  margin-left: 2.14285714em;\n  list-style-type: none;\n}\n\n.mdi-ul > li {\n  position: relative;\n}\n\n.mdi-li {\n  position: absolute;\n  left: -2.14285714em;\n  width: 2.14285714em;\n  top: 0.14285714em;\n  text-align: center;\n}\n\n.mdi-li.mdi-lg {\n  left: -1.85714286em;\n}\n\n.mdi-border {\n  padding: .2em .25em .15em;\n  border: solid 0.08em #eeeeee;\n  border-radius: .1em;\n}\n\n.mdi-spin {\n  -webkit-animation: mdi-spin 2s infinite linear;\n  animation: mdi-spin 2s infinite linear;\n  -webkit-transform-origin: 50% 50%;\n  -moz-transform-origin: 50% 50%;\n  -o-transform-origin: 50% 50%;\n  transform-origin: 50% 50%;\n}\n\n.mdi-pulse {\n  -webkit-animation: mdi-spin 1s steps(8) infinite;\n  animation: mdi-spin 1s steps(8) infinite;\n  -webkit-transform-origin: 50% 50%;\n  -moz-transform-origin: 50% 50%;\n  -o-transform-origin: 50% 50%;\n  transform-origin: 50% 50%;\n}\n\n@-webkit-keyframes mdi-spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(359deg);\n    transform: rotate(359deg);\n  }\n}\n\n@keyframes mdi-spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(359deg);\n    transform: rotate(359deg);\n  }\n}\n\n.mdi-rotate-90 {\n  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1);\n  -webkit-transform: rotate(90deg);\n  -ms-transform: rotate(90deg);\n  transform: rotate(90deg);\n}\n\n.mdi-rotate-180 {\n  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);\n  -webkit-transform: rotate(180deg);\n  -ms-transform: rotate(180deg);\n  transform: rotate(180deg);\n}\n\n.mdi-rotate-270 {\n  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);\n  -webkit-transform: rotate(270deg);\n  -ms-transform: rotate(270deg);\n  transform: rotate(270deg);\n}\n\n.mdi-flip-horizontal {\n  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);\n  -webkit-transform: scale(-1, 1);\n  -ms-transform: scale(-1, 1);\n  transform: scale(-1, 1);\n}\n\n.mdi-flip-vertical {\n  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);\n  -webkit-transform: scale(1, -1);\n  -ms-transform: scale(1, -1);\n  transform: scale(1, -1);\n}\n\n:root .mdi-rotate-90,\n:root .mdi-rotate-180,\n:root .mdi-rotate-270,\n:root .mdi-flip-horizontal,\n:root .mdi-flip-vertical {\n  filter: none;\n}\n\n.mdi-stack {\n  position: relative;\n  display: inline-block;\n  width: 2em;\n  height: 2em;\n  line-height: 2em;\n  vertical-align: middle;\n}\n\n.mdi-stack-1x,\n.mdi-stack-2x {\n  position: absolute;\n  left: 0;\n  width: 100%;\n  text-align: center;\n}\n\n.mdi-stack-1x {\n  line-height: inherit;\n}\n\n.mdi-stack-2x {\n  font-size: 2em;\n}\n\n.mdi-inverse {\n  color: #ffffff;\n}\n\n/* Start Icons */\n.mdi-action-3d-rotation:before {\n  content: \"\\e600\";\n}\n\n.mdi-action-accessibility:before {\n  content: \"\\e601\";\n}\n\n.mdi-action-account-balance-wallet:before {\n  content: \"\\e602\";\n}\n\n.mdi-action-account-balance:before {\n  content: \"\\e603\";\n}\n\n.mdi-action-account-box:before {\n  content: \"\\e604\";\n}\n\n.mdi-action-account-child:before {\n  content: \"\\e605\";\n}\n\n.mdi-action-account-circle:before {\n  content: \"\\e606\";\n}\n\n.mdi-action-add-shopping-cart:before {\n  content: \"\\e607\";\n}\n\n.mdi-action-alarm-add:before {\n  content: \"\\e608\";\n}\n\n.mdi-action-alarm-off:before {\n  content: \"\\e609\";\n}\n\n.mdi-action-alarm-on:before {\n  content: \"\\e60a\";\n}\n\n.mdi-action-alarm:before {\n  content: \"\\e60b\";\n}\n\n.mdi-action-android:before {\n  content: \"\\e60c\";\n}\n\n.mdi-action-announcement:before {\n  content: \"\\e60d\";\n}\n\n.mdi-action-aspect-ratio:before {\n  content: \"\\e60e\";\n}\n\n.mdi-action-assessment:before {\n  content: \"\\e60f\";\n}\n\n.mdi-action-assignment-ind:before {\n  content: \"\\e610\";\n}\n\n.mdi-action-assignment-late:before {\n  content: \"\\e611\";\n}\n\n.mdi-action-assignment-return:before {\n  content: \"\\e612\";\n}\n\n.mdi-action-assignment-returned:before {\n  content: \"\\e613\";\n}\n\n.mdi-action-assignment-turned-in:before {\n  content: \"\\e614\";\n}\n\n.mdi-action-assignment:before {\n  content: \"\\e615\";\n}\n\n.mdi-action-autorenew:before {\n  content: \"\\e616\";\n}\n\n.mdi-action-backup:before {\n  content: \"\\e617\";\n}\n\n.mdi-action-book:before {\n  content: \"\\e618\";\n}\n\n.mdi-action-bookmark-outline:before {\n  content: \"\\e619\";\n}\n\n.mdi-action-bookmark:before {\n  content: \"\\e61a\";\n}\n\n.mdi-action-bug-report:before {\n  content: \"\\e61b\";\n}\n\n.mdi-action-cached:before {\n  content: \"\\e61c\";\n}\n\n.mdi-action-check-circle:before {\n  content: \"\\e61d\";\n}\n\n.mdi-action-class:before {\n  content: \"\\e61e\";\n}\n\n.mdi-action-credit-card:before {\n  content: \"\\e61f\";\n}\n\n.mdi-action-dashboard:before {\n  content: \"\\e620\";\n}\n\n.mdi-action-delete:before {\n  content: \"\\e621\";\n}\n\n.mdi-action-description:before {\n  content: \"\\e622\";\n}\n\n.mdi-action-dns:before {\n  content: \"\\e623\";\n}\n\n.mdi-action-done-all:before {\n  content: \"\\e624\";\n}\n\n.mdi-action-done:before {\n  content: \"\\e625\";\n}\n\n.mdi-action-event:before {\n  content: \"\\e626\";\n}\n\n.mdi-action-exit-to-app:before {\n  content: \"\\e627\";\n}\n\n.mdi-action-explore:before {\n  content: \"\\e628\";\n}\n\n.mdi-action-extension:before {\n  content: \"\\e629\";\n}\n\n.mdi-action-face-unlock:before {\n  content: \"\\e62a\";\n}\n\n.mdi-action-favorite-outline:before {\n  content: \"\\e62b\";\n}\n\n.mdi-action-favorite:before {\n  content: \"\\e62c\";\n}\n\n.mdi-action-find-in-page:before {\n  content: \"\\e62d\";\n}\n\n.mdi-action-find-replace:before {\n  content: \"\\e62e\";\n}\n\n.mdi-action-flip-to-back:before {\n  content: \"\\e62f\";\n}\n\n.mdi-action-flip-to-front:before {\n  content: \"\\e630\";\n}\n\n.mdi-action-get-app:before {\n  content: \"\\e631\";\n}\n\n.mdi-action-grade:before {\n  content: \"\\e632\";\n}\n\n.mdi-action-group-work:before {\n  content: \"\\e633\";\n}\n\n.mdi-action-help:before {\n  content: \"\\e634\";\n}\n\n.mdi-action-highlight-remove:before {\n  content: \"\\e635\";\n}\n\n.mdi-action-history:before {\n  content: \"\\e636\";\n}\n\n.mdi-action-home:before {\n  content: \"\\e637\";\n}\n\n.mdi-action-https:before {\n  content: \"\\e638\";\n}\n\n.mdi-action-info-outline:before {\n  content: \"\\e639\";\n}\n\n.mdi-action-info:before {\n  content: \"\\e63a\";\n}\n\n.mdi-action-input:before {\n  content: \"\\e63b\";\n}\n\n.mdi-action-invert-colors:before {\n  content: \"\\e63c\";\n}\n\n.mdi-action-label-outline:before {\n  content: \"\\e63d\";\n}\n\n.mdi-action-label:before {\n  content: \"\\e63e\";\n}\n\n.mdi-action-language:before {\n  content: \"\\e63f\";\n}\n\n.mdi-action-launch:before {\n  content: \"\\e640\";\n}\n\n.mdi-action-list:before {\n  content: \"\\e641\";\n}\n\n.mdi-action-lock-open:before {\n  content: \"\\e642\";\n}\n\n.mdi-action-lock-outline:before {\n  content: \"\\e643\";\n}\n\n.mdi-action-lock:before {\n  content: \"\\e644\";\n}\n\n.mdi-action-loyalty:before {\n  content: \"\\e645\";\n}\n\n.mdi-action-markunread-mailbox:before {\n  content: \"\\e646\";\n}\n\n.mdi-action-note-add:before {\n  content: \"\\e647\";\n}\n\n.mdi-action-open-in-browser:before {\n  content: \"\\e648\";\n}\n\n.mdi-action-open-in-new:before {\n  content: \"\\e649\";\n}\n\n.mdi-action-open-with:before {\n  content: \"\\e64a\";\n}\n\n.mdi-action-pageview:before {\n  content: \"\\e64b\";\n}\n\n.mdi-action-payment:before {\n  content: \"\\e64c\";\n}\n\n.mdi-action-perm-camera-mic:before {\n  content: \"\\e64d\";\n}\n\n.mdi-action-perm-contact-cal:before {\n  content: \"\\e64e\";\n}\n\n.mdi-action-perm-data-setting:before {\n  content: \"\\e64f\";\n}\n\n.mdi-action-perm-device-info:before {\n  content: \"\\e650\";\n}\n\n.mdi-action-perm-identity:before {\n  content: \"\\e651\";\n}\n\n.mdi-action-perm-media:before {\n  content: \"\\e652\";\n}\n\n.mdi-action-perm-phone-msg:before {\n  content: \"\\e653\";\n}\n\n.mdi-action-perm-scan-wifi:before {\n  content: \"\\e654\";\n}\n\n.mdi-action-picture-in-picture:before {\n  content: \"\\e655\";\n}\n\n.mdi-action-polymer:before {\n  content: \"\\e656\";\n}\n\n.mdi-action-print:before {\n  content: \"\\e657\";\n}\n\n.mdi-action-query-builder:before {\n  content: \"\\e658\";\n}\n\n.mdi-action-question-answer:before {\n  content: \"\\e659\";\n}\n\n.mdi-action-receipt:before {\n  content: \"\\e65a\";\n}\n\n.mdi-action-redeem:before {\n  content: \"\\e65b\";\n}\n\n.mdi-action-reorder:before {\n  content: \"\\e65c\";\n}\n\n.mdi-action-report-problem:before {\n  content: \"\\e65d\";\n}\n\n.mdi-action-restore:before {\n  content: \"\\e65e\";\n}\n\n.mdi-action-room:before {\n  content: \"\\e65f\";\n}\n\n.mdi-action-schedule:before {\n  content: \"\\e660\";\n}\n\n.mdi-action-search:before {\n  content: \"\\e661\";\n}\n\n.mdi-action-settings-applications:before {\n  content: \"\\e662\";\n}\n\n.mdi-action-settings-backup-restore:before {\n  content: \"\\e663\";\n}\n\n.mdi-action-settings-bluetooth:before {\n  content: \"\\e664\";\n}\n\n.mdi-action-settings-cell:before {\n  content: \"\\e665\";\n}\n\n.mdi-action-settings-display:before {\n  content: \"\\e666\";\n}\n\n.mdi-action-settings-ethernet:before {\n  content: \"\\e667\";\n}\n\n.mdi-action-settings-input-antenna:before {\n  content: \"\\e668\";\n}\n\n.mdi-action-settings-input-component:before {\n  content: \"\\e669\";\n}\n\n.mdi-action-settings-input-composite:before {\n  content: \"\\e66a\";\n}\n\n.mdi-action-settings-input-hdmi:before {\n  content: \"\\e66b\";\n}\n\n.mdi-action-settings-input-svideo:before {\n  content: \"\\e66c\";\n}\n\n.mdi-action-settings-overscan:before {\n  content: \"\\e66d\";\n}\n\n.mdi-action-settings-phone:before {\n  content: \"\\e66e\";\n}\n\n.mdi-action-settings-power:before {\n  content: \"\\e66f\";\n}\n\n.mdi-action-settings-remote:before {\n  content: \"\\e670\";\n}\n\n.mdi-action-settings-voice:before {\n  content: \"\\e671\";\n}\n\n.mdi-action-settings:before {\n  content: \"\\e672\";\n}\n\n.mdi-action-shop-two:before {\n  content: \"\\e673\";\n}\n\n.mdi-action-shop:before {\n  content: \"\\e674\";\n}\n\n.mdi-action-shopping-basket:before {\n  content: \"\\e675\";\n}\n\n.mdi-action-shopping-cart:before {\n  content: \"\\e676\";\n}\n\n.mdi-action-speaker-notes:before {\n  content: \"\\e677\";\n}\n\n.mdi-action-spellcheck:before {\n  content: \"\\e678\";\n}\n\n.mdi-action-star-rate:before {\n  content: \"\\e679\";\n}\n\n.mdi-action-stars:before {\n  content: \"\\e67a\";\n}\n\n.mdi-action-store:before {\n  content: \"\\e67b\";\n}\n\n.mdi-action-subject:before {\n  content: \"\\e67c\";\n}\n\n.mdi-action-supervisor-account:before {\n  content: \"\\e67d\";\n}\n\n.mdi-action-swap-horiz:before {\n  content: \"\\e67e\";\n}\n\n.mdi-action-swap-vert-circle:before {\n  content: \"\\e67f\";\n}\n\n.mdi-action-swap-vert:before {\n  content: \"\\e680\";\n}\n\n.mdi-action-system-update-tv:before {\n  content: \"\\e681\";\n}\n\n.mdi-action-tab-unselected:before {\n  content: \"\\e682\";\n}\n\n.mdi-action-tab:before {\n  content: \"\\e683\";\n}\n\n.mdi-action-theaters:before {\n  content: \"\\e684\";\n}\n\n.mdi-action-thumb-down:before {\n  content: \"\\e685\";\n}\n\n.mdi-action-thumb-up:before {\n  content: \"\\e686\";\n}\n\n.mdi-action-thumbs-up-down:before {\n  content: \"\\e687\";\n}\n\n.mdi-action-toc:before {\n  content: \"\\e688\";\n}\n\n.mdi-action-today:before {\n  content: \"\\e689\";\n}\n\n.mdi-action-track-changes:before {\n  content: \"\\e68a\";\n}\n\n.mdi-action-translate:before {\n  content: \"\\e68b\";\n}\n\n.mdi-action-trending-down:before {\n  content: \"\\e68c\";\n}\n\n.mdi-action-trending-neutral:before {\n  content: \"\\e68d\";\n}\n\n.mdi-action-trending-up:before {\n  content: \"\\e68e\";\n}\n\n.mdi-action-turned-in-not:before {\n  content: \"\\e68f\";\n}\n\n.mdi-action-turned-in:before {\n  content: \"\\e690\";\n}\n\n.mdi-action-verified-user:before {\n  content: \"\\e691\";\n}\n\n.mdi-action-view-agenda:before {\n  content: \"\\e692\";\n}\n\n.mdi-action-view-array:before {\n  content: \"\\e693\";\n}\n\n.mdi-action-view-carousel:before {\n  content: \"\\e694\";\n}\n\n.mdi-action-view-column:before {\n  content: \"\\e695\";\n}\n\n.mdi-action-view-day:before {\n  content: \"\\e696\";\n}\n\n.mdi-action-view-headline:before {\n  content: \"\\e697\";\n}\n\n.mdi-action-view-list:before {\n  content: \"\\e698\";\n}\n\n.mdi-action-view-module:before {\n  content: \"\\e699\";\n}\n\n.mdi-action-view-quilt:before {\n  content: \"\\e69a\";\n}\n\n.mdi-action-view-stream:before {\n  content: \"\\e69b\";\n}\n\n.mdi-action-view-week:before {\n  content: \"\\e69c\";\n}\n\n.mdi-action-visibility-off:before {\n  content: \"\\e69d\";\n}\n\n.mdi-action-visibility:before {\n  content: \"\\e69e\";\n}\n\n.mdi-action-wallet-giftcard:before {\n  content: \"\\e69f\";\n}\n\n.mdi-action-wallet-membership:before {\n  content: \"\\e6a0\";\n}\n\n.mdi-action-wallet-travel:before {\n  content: \"\\e6a1\";\n}\n\n.mdi-action-work:before {\n  content: \"\\e6a2\";\n}\n\n.mdi-alert-error:before {\n  content: \"\\e6a3\";\n}\n\n.mdi-alert-warning:before {\n  content: \"\\e6a4\";\n}\n\n.mdi-av-album:before {\n  content: \"\\e6a5\";\n}\n\n.mdi-av-closed-caption:before {\n  content: \"\\e6a6\";\n}\n\n.mdi-av-equalizer:before {\n  content: \"\\e6a7\";\n}\n\n.mdi-av-explicit:before {\n  content: \"\\e6a8\";\n}\n\n.mdi-av-fast-forward:before {\n  content: \"\\e6a9\";\n}\n\n.mdi-av-fast-rewind:before {\n  content: \"\\e6aa\";\n}\n\n.mdi-av-games:before {\n  content: \"\\e6ab\";\n}\n\n.mdi-av-hearing:before {\n  content: \"\\e6ac\";\n}\n\n.mdi-av-high-quality:before {\n  content: \"\\e6ad\";\n}\n\n.mdi-av-loop:before {\n  content: \"\\e6ae\";\n}\n\n.mdi-av-mic-none:before {\n  content: \"\\e6af\";\n}\n\n.mdi-av-mic-off:before {\n  content: \"\\e6b0\";\n}\n\n.mdi-av-mic:before {\n  content: \"\\e6b1\";\n}\n\n.mdi-av-movie:before {\n  content: \"\\e6b2\";\n}\n\n.mdi-av-my-library-add:before {\n  content: \"\\e6b3\";\n}\n\n.mdi-av-my-library-books:before {\n  content: \"\\e6b4\";\n}\n\n.mdi-av-my-library-music:before {\n  content: \"\\e6b5\";\n}\n\n.mdi-av-new-releases:before {\n  content: \"\\e6b6\";\n}\n\n.mdi-av-not-interested:before {\n  content: \"\\e6b7\";\n}\n\n.mdi-av-pause-circle-fill:before {\n  content: \"\\e6b8\";\n}\n\n.mdi-av-pause-circle-outline:before {\n  content: \"\\e6b9\";\n}\n\n.mdi-av-pause:before {\n  content: \"\\e6ba\";\n}\n\n.mdi-av-play-arrow:before {\n  content: \"\\e6bb\";\n}\n\n.mdi-av-play-circle-fill:before {\n  content: \"\\e6bc\";\n}\n\n.mdi-av-play-circle-outline:before {\n  content: \"\\e6bd\";\n}\n\n.mdi-av-play-shopping-bag:before {\n  content: \"\\e6be\";\n}\n\n.mdi-av-playlist-add:before {\n  content: \"\\e6bf\";\n}\n\n.mdi-av-queue-music:before {\n  content: \"\\e6c0\";\n}\n\n.mdi-av-queue:before {\n  content: \"\\e6c1\";\n}\n\n.mdi-av-radio:before {\n  content: \"\\e6c2\";\n}\n\n.mdi-av-recent-actors:before {\n  content: \"\\e6c3\";\n}\n\n.mdi-av-repeat-one:before {\n  content: \"\\e6c4\";\n}\n\n.mdi-av-repeat:before {\n  content: \"\\e6c5\";\n}\n\n.mdi-av-replay:before {\n  content: \"\\e6c6\";\n}\n\n.mdi-av-shuffle:before {\n  content: \"\\e6c7\";\n}\n\n.mdi-av-skip-next:before {\n  content: \"\\e6c8\";\n}\n\n.mdi-av-skip-previous:before {\n  content: \"\\e6c9\";\n}\n\n.mdi-av-snooze:before {\n  content: \"\\e6ca\";\n}\n\n.mdi-av-stop:before {\n  content: \"\\e6cb\";\n}\n\n.mdi-av-subtitles:before {\n  content: \"\\e6cc\";\n}\n\n.mdi-av-surround-sound:before {\n  content: \"\\e6cd\";\n}\n\n.mdi-av-timer:before {\n  content: \"\\e6ce\";\n}\n\n.mdi-av-video-collection:before {\n  content: \"\\e6cf\";\n}\n\n.mdi-av-videocam-off:before {\n  content: \"\\e6d0\";\n}\n\n.mdi-av-videocam:before {\n  content: \"\\e6d1\";\n}\n\n.mdi-av-volume-down:before {\n  content: \"\\e6d2\";\n}\n\n.mdi-av-volume-mute:before {\n  content: \"\\e6d3\";\n}\n\n.mdi-av-volume-off:before {\n  content: \"\\e6d4\";\n}\n\n.mdi-av-volume-up:before {\n  content: \"\\e6d5\";\n}\n\n.mdi-av-web:before {\n  content: \"\\e6d6\";\n}\n\n.mdi-communication-business:before {\n  content: \"\\e6d7\";\n}\n\n.mdi-communication-call-end:before {\n  content: \"\\e6d8\";\n}\n\n.mdi-communication-call-made:before {\n  content: \"\\e6d9\";\n}\n\n.mdi-communication-call-merge:before {\n  content: \"\\e6da\";\n}\n\n.mdi-communication-call-missed:before {\n  content: \"\\e6db\";\n}\n\n.mdi-communication-call-received:before {\n  content: \"\\e6dc\";\n}\n\n.mdi-communication-call-split:before {\n  content: \"\\e6dd\";\n}\n\n.mdi-communication-call:before {\n  content: \"\\e6de\";\n}\n\n.mdi-communication-chat:before {\n  content: \"\\e6df\";\n}\n\n.mdi-communication-clear-all:before {\n  content: \"\\e6e0\";\n}\n\n.mdi-communication-comment:before {\n  content: \"\\e6e1\";\n}\n\n.mdi-communication-contacts:before {\n  content: \"\\e6e2\";\n}\n\n.mdi-communication-dialer-sip:before {\n  content: \"\\e6e3\";\n}\n\n.mdi-communication-dialpad:before {\n  content: \"\\e6e4\";\n}\n\n.mdi-communication-dnd-on:before {\n  content: \"\\e6e5\";\n}\n\n.mdi-communication-email:before {\n  content: \"\\e6e6\";\n}\n\n.mdi-communication-forum:before {\n  content: \"\\e6e7\";\n}\n\n.mdi-communication-import-export:before {\n  content: \"\\e6e8\";\n}\n\n.mdi-communication-invert-colors-off:before {\n  content: \"\\e6e9\";\n}\n\n.mdi-communication-invert-colors-on:before {\n  content: \"\\e6ea\";\n}\n\n.mdi-communication-live-help:before {\n  content: \"\\e6eb\";\n}\n\n.mdi-communication-location-off:before {\n  content: \"\\e6ec\";\n}\n\n.mdi-communication-location-on:before {\n  content: \"\\e6ed\";\n}\n\n.mdi-communication-message:before {\n  content: \"\\e6ee\";\n}\n\n.mdi-communication-messenger:before {\n  content: \"\\e6ef\";\n}\n\n.mdi-communication-no-sim:before {\n  content: \"\\e6f0\";\n}\n\n.mdi-communication-phone:before {\n  content: \"\\e6f1\";\n}\n\n.mdi-communication-portable-wifi-off:before {\n  content: \"\\e6f2\";\n}\n\n.mdi-communication-quick-contacts-dialer:before {\n  content: \"\\e6f3\";\n}\n\n.mdi-communication-quick-contacts-mail:before {\n  content: \"\\e6f4\";\n}\n\n.mdi-communication-ring-volume:before {\n  content: \"\\e6f5\";\n}\n\n.mdi-communication-stay-current-landscape:before {\n  content: \"\\e6f6\";\n}\n\n.mdi-communication-stay-current-portrait:before {\n  content: \"\\e6f7\";\n}\n\n.mdi-communication-stay-primary-landscape:before {\n  content: \"\\e6f8\";\n}\n\n.mdi-communication-stay-primary-portrait:before {\n  content: \"\\e6f9\";\n}\n\n.mdi-communication-swap-calls:before {\n  content: \"\\e6fa\";\n}\n\n.mdi-communication-textsms:before {\n  content: \"\\e6fb\";\n}\n\n.mdi-communication-voicemail:before {\n  content: \"\\e6fc\";\n}\n\n.mdi-communication-vpn-key:before {\n  content: \"\\e6fd\";\n}\n\n.mdi-content-add-box:before {\n  content: \"\\e6fe\";\n}\n\n.mdi-content-add-circle-outline:before {\n  content: \"\\e6ff\";\n}\n\n.mdi-content-add-circle:before {\n  content: \"\\e700\";\n}\n\n.mdi-content-add:before {\n  content: \"\\e701\";\n}\n\n.mdi-content-archive:before {\n  content: \"\\e702\";\n}\n\n.mdi-content-backspace:before {\n  content: \"\\e703\";\n}\n\n.mdi-content-block:before {\n  content: \"\\e704\";\n}\n\n.mdi-content-clear:before {\n  content: \"\\e705\";\n}\n\n.mdi-content-content-copy:before {\n  content: \"\\e706\";\n}\n\n.mdi-content-content-cut:before {\n  content: \"\\e707\";\n}\n\n.mdi-content-content-paste:before {\n  content: \"\\e708\";\n}\n\n.mdi-content-create:before {\n  content: \"\\e709\";\n}\n\n.mdi-content-drafts:before {\n  content: \"\\e70a\";\n}\n\n.mdi-content-filter-list:before {\n  content: \"\\e70b\";\n}\n\n.mdi-content-flag:before {\n  content: \"\\e70c\";\n}\n\n.mdi-content-forward:before {\n  content: \"\\e70d\";\n}\n\n.mdi-content-gesture:before {\n  content: \"\\e70e\";\n}\n\n.mdi-content-inbox:before {\n  content: \"\\e70f\";\n}\n\n.mdi-content-link:before {\n  content: \"\\e710\";\n}\n\n.mdi-content-mail:before {\n  content: \"\\e711\";\n}\n\n.mdi-content-markunread:before {\n  content: \"\\e712\";\n}\n\n.mdi-content-redo:before {\n  content: \"\\e713\";\n}\n\n.mdi-content-remove-circle-outline:before {\n  content: \"\\e714\";\n}\n\n.mdi-content-remove-circle:before {\n  content: \"\\e715\";\n}\n\n.mdi-content-remove:before {\n  content: \"\\e716\";\n}\n\n.mdi-content-reply-all:before {\n  content: \"\\e717\";\n}\n\n.mdi-content-reply:before {\n  content: \"\\e718\";\n}\n\n.mdi-content-report:before {\n  content: \"\\e719\";\n}\n\n.mdi-content-save:before {\n  content: \"\\e71a\";\n}\n\n.mdi-content-select-all:before {\n  content: \"\\e71b\";\n}\n\n.mdi-content-send:before {\n  content: \"\\e71c\";\n}\n\n.mdi-content-sort:before {\n  content: \"\\e71d\";\n}\n\n.mdi-content-text-format:before {\n  content: \"\\e71e\";\n}\n\n.mdi-content-undo:before {\n  content: \"\\e71f\";\n}\n\n.mdi-editor-attach-file:before {\n  content: \"\\e776\";\n}\n\n.mdi-editor-attach-money:before {\n  content: \"\\e777\";\n}\n\n.mdi-editor-border-all:before {\n  content: \"\\e778\";\n}\n\n.mdi-editor-border-bottom:before {\n  content: \"\\e779\";\n}\n\n.mdi-editor-border-clear:before {\n  content: \"\\e77a\";\n}\n\n.mdi-editor-border-color:before {\n  content: \"\\e77b\";\n}\n\n.mdi-editor-border-horizontal:before {\n  content: \"\\e77c\";\n}\n\n.mdi-editor-border-inner:before {\n  content: \"\\e77d\";\n}\n\n.mdi-editor-border-left:before {\n  content: \"\\e77e\";\n}\n\n.mdi-editor-border-outer:before {\n  content: \"\\e77f\";\n}\n\n.mdi-editor-border-right:before {\n  content: \"\\e780\";\n}\n\n.mdi-editor-border-style:before {\n  content: \"\\e781\";\n}\n\n.mdi-editor-border-top:before {\n  content: \"\\e782\";\n}\n\n.mdi-editor-border-vertical:before {\n  content: \"\\e783\";\n}\n\n.mdi-editor-format-align-center:before {\n  content: \"\\e784\";\n}\n\n.mdi-editor-format-align-justify:before {\n  content: \"\\e785\";\n}\n\n.mdi-editor-format-align-left:before {\n  content: \"\\e786\";\n}\n\n.mdi-editor-format-align-right:before {\n  content: \"\\e787\";\n}\n\n.mdi-editor-format-bold:before {\n  content: \"\\e788\";\n}\n\n.mdi-editor-format-clear:before {\n  content: \"\\e789\";\n}\n\n.mdi-editor-format-color-fill:before {\n  content: \"\\e78a\";\n}\n\n.mdi-editor-format-color-reset:before {\n  content: \"\\e78b\";\n}\n\n.mdi-editor-format-color-text:before {\n  content: \"\\e78c\";\n}\n\n.mdi-editor-format-indent-decrease:before {\n  content: \"\\e78d\";\n}\n\n.mdi-editor-format-indent-increase:before {\n  content: \"\\e78e\";\n}\n\n.mdi-editor-format-italic:before {\n  content: \"\\e78f\";\n}\n\n.mdi-editor-format-line-spacing:before {\n  content: \"\\e790\";\n}\n\n.mdi-editor-format-list-bulleted:before {\n  content: \"\\e791\";\n}\n\n.mdi-editor-format-list-numbered:before {\n  content: \"\\e792\";\n}\n\n.mdi-editor-format-paint:before {\n  content: \"\\e793\";\n}\n\n.mdi-editor-format-quote:before {\n  content: \"\\e794\";\n}\n\n.mdi-editor-format-size:before {\n  content: \"\\e795\";\n}\n\n.mdi-editor-format-strikethrough:before {\n  content: \"\\e796\";\n}\n\n.mdi-editor-format-textdirection-l-to-r:before {\n  content: \"\\e797\";\n}\n\n.mdi-editor-format-textdirection-r-to-l:before {\n  content: \"\\e798\";\n}\n\n.mdi-editor-format-underline:before {\n  content: \"\\e799\";\n}\n\n.mdi-editor-functions:before {\n  content: \"\\e79a\";\n}\n\n.mdi-editor-insert-chart:before {\n  content: \"\\e79b\";\n}\n\n.mdi-editor-insert-comment:before {\n  content: \"\\e79c\";\n}\n\n.mdi-editor-insert-drive-file:before {\n  content: \"\\e79d\";\n}\n\n.mdi-editor-insert-emoticon:before {\n  content: \"\\e79e\";\n}\n\n.mdi-editor-insert-invitation:before {\n  content: \"\\e79f\";\n}\n\n.mdi-editor-insert-link:before {\n  content: \"\\e7a0\";\n}\n\n.mdi-editor-insert-photo:before {\n  content: \"\\e7a1\";\n}\n\n.mdi-editor-merge-type:before {\n  content: \"\\e7a2\";\n}\n\n.mdi-editor-mode-comment:before {\n  content: \"\\e7a3\";\n}\n\n.mdi-editor-mode-edit:before {\n  content: \"\\e7a4\";\n}\n\n.mdi-editor-publish:before {\n  content: \"\\e7a5\";\n}\n\n.mdi-editor-vertical-align-bottom:before {\n  content: \"\\e7a6\";\n}\n\n.mdi-editor-vertical-align-center:before {\n  content: \"\\e7a7\";\n}\n\n.mdi-editor-vertical-align-top:before {\n  content: \"\\e7a8\";\n}\n\n.mdi-editor-wrap-text:before {\n  content: \"\\e7a9\";\n}\n\n.mdi-file-attachment:before {\n  content: \"\\e7aa\";\n}\n\n.mdi-file-cloud-circle:before {\n  content: \"\\e7ab\";\n}\n\n.mdi-file-cloud-done:before {\n  content: \"\\e7ac\";\n}\n\n.mdi-file-cloud-download:before {\n  content: \"\\e7ad\";\n}\n\n.mdi-file-cloud-off:before {\n  content: \"\\e7ae\";\n}\n\n.mdi-file-cloud-queue:before {\n  content: \"\\e7af\";\n}\n\n.mdi-file-cloud-upload:before {\n  content: \"\\e7b0\";\n}\n\n.mdi-file-cloud:before {\n  content: \"\\e7b1\";\n}\n\n.mdi-file-file-download:before {\n  content: \"\\e7b2\";\n}\n\n.mdi-file-file-upload:before {\n  content: \"\\e7b3\";\n}\n\n.mdi-file-folder-open:before {\n  content: \"\\e7b4\";\n}\n\n.mdi-file-folder-shared:before {\n  content: \"\\e7b5\";\n}\n\n.mdi-file-folder:before {\n  content: \"\\e7b6\";\n}\n\n.mdi-device-access-alarm:before {\n  content: \"\\e720\";\n}\n\n.mdi-device-access-alarms:before {\n  content: \"\\e721\";\n}\n\n.mdi-device-access-time:before {\n  content: \"\\e722\";\n}\n\n.mdi-device-add-alarm:before {\n  content: \"\\e723\";\n}\n\n.mdi-device-airplanemode-off:before {\n  content: \"\\e724\";\n}\n\n.mdi-device-airplanemode-on:before {\n  content: \"\\e725\";\n}\n\n.mdi-device-battery-20:before {\n  content: \"\\e726\";\n}\n\n.mdi-device-battery-30:before {\n  content: \"\\e727\";\n}\n\n.mdi-device-battery-50:before {\n  content: \"\\e728\";\n}\n\n.mdi-device-battery-60:before {\n  content: \"\\e729\";\n}\n\n.mdi-device-battery-80:before {\n  content: \"\\e72a\";\n}\n\n.mdi-device-battery-90:before {\n  content: \"\\e72b\";\n}\n\n.mdi-device-battery-alert:before {\n  content: \"\\e72c\";\n}\n\n.mdi-device-battery-charging-20:before {\n  content: \"\\e72d\";\n}\n\n.mdi-device-battery-charging-30:before {\n  content: \"\\e72e\";\n}\n\n.mdi-device-battery-charging-50:before {\n  content: \"\\e72f\";\n}\n\n.mdi-device-battery-charging-60:before {\n  content: \"\\e730\";\n}\n\n.mdi-device-battery-charging-80:before {\n  content: \"\\e731\";\n}\n\n.mdi-device-battery-charging-90:before {\n  content: \"\\e732\";\n}\n\n.mdi-device-battery-charging-full:before {\n  content: \"\\e733\";\n}\n\n.mdi-device-battery-full:before {\n  content: \"\\e734\";\n}\n\n.mdi-device-battery-std:before {\n  content: \"\\e735\";\n}\n\n.mdi-device-battery-unknown:before {\n  content: \"\\e736\";\n}\n\n.mdi-device-bluetooth-connected:before {\n  content: \"\\e737\";\n}\n\n.mdi-device-bluetooth-disabled:before {\n  content: \"\\e738\";\n}\n\n.mdi-device-bluetooth-searching:before {\n  content: \"\\e739\";\n}\n\n.mdi-device-bluetooth:before {\n  content: \"\\e73a\";\n}\n\n.mdi-device-brightness-auto:before {\n  content: \"\\e73b\";\n}\n\n.mdi-device-brightness-high:before {\n  content: \"\\e73c\";\n}\n\n.mdi-device-brightness-low:before {\n  content: \"\\e73d\";\n}\n\n.mdi-device-brightness-medium:before {\n  content: \"\\e73e\";\n}\n\n.mdi-device-data-usage:before {\n  content: \"\\e73f\";\n}\n\n.mdi-device-developer-mode:before {\n  content: \"\\e740\";\n}\n\n.mdi-device-devices:before {\n  content: \"\\e741\";\n}\n\n.mdi-device-dvr:before {\n  content: \"\\e742\";\n}\n\n.mdi-device-gps-fixed:before {\n  content: \"\\e743\";\n}\n\n.mdi-device-gps-not-fixed:before {\n  content: \"\\e744\";\n}\n\n.mdi-device-gps-off:before {\n  content: \"\\e745\";\n}\n\n.mdi-device-location-disabled:before {\n  content: \"\\e746\";\n}\n\n.mdi-device-location-searching:before {\n  content: \"\\e747\";\n}\n\n.mdi-device-multitrack-audio:before {\n  content: \"\\e748\";\n}\n\n.mdi-device-network-cell:before {\n  content: \"\\e749\";\n}\n\n.mdi-device-network-wifi:before {\n  content: \"\\e74a\";\n}\n\n.mdi-device-nfc:before {\n  content: \"\\e74b\";\n}\n\n.mdi-device-now-wallpaper:before {\n  content: \"\\e74c\";\n}\n\n.mdi-device-now-widgets:before {\n  content: \"\\e74d\";\n}\n\n.mdi-device-screen-lock-landscape:before {\n  content: \"\\e74e\";\n}\n\n.mdi-device-screen-lock-portrait:before {\n  content: \"\\e74f\";\n}\n\n.mdi-device-screen-lock-rotation:before {\n  content: \"\\e750\";\n}\n\n.mdi-device-screen-rotation:before {\n  content: \"\\e751\";\n}\n\n.mdi-device-sd-storage:before {\n  content: \"\\e752\";\n}\n\n.mdi-device-settings-system-daydream:before {\n  content: \"\\e753\";\n}\n\n.mdi-device-signal-cellular-0-bar:before {\n  content: \"\\e754\";\n}\n\n.mdi-device-signal-cellular-1-bar:before {\n  content: \"\\e755\";\n}\n\n.mdi-device-signal-cellular-2-bar:before {\n  content: \"\\e756\";\n}\n\n.mdi-device-signal-cellular-3-bar:before {\n  content: \"\\e757\";\n}\n\n.mdi-device-signal-cellular-4-bar:before {\n  content: \"\\e758\";\n}\n\n.mdi-signal-wifi-statusbar-connected-no-internet-after:before {\n  content: \"\\e8f6\";\n}\n\n.mdi-device-signal-cellular-connected-no-internet-0-bar:before {\n  content: \"\\e759\";\n}\n\n.mdi-device-signal-cellular-connected-no-internet-1-bar:before {\n  content: \"\\e75a\";\n}\n\n.mdi-device-signal-cellular-connected-no-internet-2-bar:before {\n  content: \"\\e75b\";\n}\n\n.mdi-device-signal-cellular-connected-no-internet-3-bar:before {\n  content: \"\\e75c\";\n}\n\n.mdi-device-signal-cellular-connected-no-internet-4-bar:before {\n  content: \"\\e75d\";\n}\n\n.mdi-device-signal-cellular-no-sim:before {\n  content: \"\\e75e\";\n}\n\n.mdi-device-signal-cellular-null:before {\n  content: \"\\e75f\";\n}\n\n.mdi-device-signal-cellular-off:before {\n  content: \"\\e760\";\n}\n\n.mdi-device-signal-wifi-0-bar:before {\n  content: \"\\e761\";\n}\n\n.mdi-device-signal-wifi-1-bar:before {\n  content: \"\\e762\";\n}\n\n.mdi-device-signal-wifi-2-bar:before {\n  content: \"\\e763\";\n}\n\n.mdi-device-signal-wifi-3-bar:before {\n  content: \"\\e764\";\n}\n\n.mdi-device-signal-wifi-4-bar:before {\n  content: \"\\e765\";\n}\n\n.mdi-device-signal-wifi-off:before {\n  content: \"\\e766\";\n}\n\n.mdi-device-signal-wifi-statusbar-1-bar:before {\n  content: \"\\e767\";\n}\n\n.mdi-device-signal-wifi-statusbar-2-bar:before {\n  content: \"\\e768\";\n}\n\n.mdi-device-signal-wifi-statusbar-3-bar:before {\n  content: \"\\e769\";\n}\n\n.mdi-device-signal-wifi-statusbar-4-bar:before {\n  content: \"\\e76a\";\n}\n\n.mdi-device-signal-wifi-statusbar-connected-no-internet-:before {\n  content: \"\\e76b\";\n}\n\n.mdi-device-signal-wifi-statusbar-connected-no-internet:before {\n  content: \"\\e76f\";\n}\n\n.mdi-device-signal-wifi-statusbar-connected-no-internet-2:before {\n  content: \"\\e76c\";\n}\n\n.mdi-device-signal-wifi-statusbar-connected-no-internet-3:before {\n  content: \"\\e76d\";\n}\n\n.mdi-device-signal-wifi-statusbar-connected-no-internet-4:before {\n  content: \"\\e76e\";\n}\n\n.mdi-signal-wifi-statusbar-not-connected-after:before {\n  content: \"\\e8f7\";\n}\n\n.mdi-device-signal-wifi-statusbar-not-connected:before {\n  content: \"\\e770\";\n}\n\n.mdi-device-signal-wifi-statusbar-null:before {\n  content: \"\\e771\";\n}\n\n.mdi-device-storage:before {\n  content: \"\\e772\";\n}\n\n.mdi-device-usb:before {\n  content: \"\\e773\";\n}\n\n.mdi-device-wifi-lock:before {\n  content: \"\\e774\";\n}\n\n.mdi-device-wifi-tethering:before {\n  content: \"\\e775\";\n}\n\n.mdi-hardware-cast-connected:before {\n  content: \"\\e7b7\";\n}\n\n.mdi-hardware-cast:before {\n  content: \"\\e7b8\";\n}\n\n.mdi-hardware-computer:before {\n  content: \"\\e7b9\";\n}\n\n.mdi-hardware-desktop-mac:before {\n  content: \"\\e7ba\";\n}\n\n.mdi-hardware-desktop-windows:before {\n  content: \"\\e7bb\";\n}\n\n.mdi-hardware-dock:before {\n  content: \"\\e7bc\";\n}\n\n.mdi-hardware-gamepad:before {\n  content: \"\\e7bd\";\n}\n\n.mdi-hardware-headset-mic:before {\n  content: \"\\e7be\";\n}\n\n.mdi-hardware-headset:before {\n  content: \"\\e7bf\";\n}\n\n.mdi-hardware-keyboard-alt:before {\n  content: \"\\e7c0\";\n}\n\n.mdi-hardware-keyboard-arrow-down:before {\n  content: \"\\e7c1\";\n}\n\n.mdi-hardware-keyboard-arrow-left:before {\n  content: \"\\e7c2\";\n}\n\n.mdi-hardware-keyboard-arrow-right:before {\n  content: \"\\e7c3\";\n}\n\n.mdi-hardware-keyboard-arrow-up:before {\n  content: \"\\e7c4\";\n}\n\n.mdi-hardware-keyboard-backspace:before {\n  content: \"\\e7c5\";\n}\n\n.mdi-hardware-keyboard-capslock:before {\n  content: \"\\e7c6\";\n}\n\n.mdi-hardware-keyboard-control:before {\n  content: \"\\e7c7\";\n}\n\n.mdi-hardware-keyboard-hide:before {\n  content: \"\\e7c8\";\n}\n\n.mdi-hardware-keyboard-return:before {\n  content: \"\\e7c9\";\n}\n\n.mdi-hardware-keyboard-tab:before {\n  content: \"\\e7ca\";\n}\n\n.mdi-hardware-keyboard-voice:before {\n  content: \"\\e7cb\";\n}\n\n.mdi-hardware-keyboard:before {\n  content: \"\\e7cc\";\n}\n\n.mdi-hardware-laptop-chromebook:before {\n  content: \"\\e7cd\";\n}\n\n.mdi-hardware-laptop-mac:before {\n  content: \"\\e7ce\";\n}\n\n.mdi-hardware-laptop-windows:before {\n  content: \"\\e7cf\";\n}\n\n.mdi-hardware-laptop:before {\n  content: \"\\e7d0\";\n}\n\n.mdi-hardware-memory:before {\n  content: \"\\e7d1\";\n}\n\n.mdi-hardware-mouse:before {\n  content: \"\\e7d2\";\n}\n\n.mdi-hardware-phone-android:before {\n  content: \"\\e7d3\";\n}\n\n.mdi-hardware-phone-iphone:before {\n  content: \"\\e7d4\";\n}\n\n.mdi-hardware-phonelink-off:before {\n  content: \"\\e7d5\";\n}\n\n.mdi-hardware-phonelink:before {\n  content: \"\\e7d6\";\n}\n\n.mdi-hardware-security:before {\n  content: \"\\e7d7\";\n}\n\n.mdi-hardware-sim-card:before {\n  content: \"\\e7d8\";\n}\n\n.mdi-hardware-smartphone:before {\n  content: \"\\e7d9\";\n}\n\n.mdi-hardware-speaker:before {\n  content: \"\\e7da\";\n}\n\n.mdi-hardware-tablet-android:before {\n  content: \"\\e7db\";\n}\n\n.mdi-hardware-tablet-mac:before {\n  content: \"\\e7dc\";\n}\n\n.mdi-hardware-tablet:before {\n  content: \"\\e7dd\";\n}\n\n.mdi-hardware-tv:before {\n  content: \"\\e7de\";\n}\n\n.mdi-hardware-watch:before {\n  content: \"\\e7df\";\n}\n\n.mdi-image-add-to-photos:before {\n  content: \"\\e7e0\";\n}\n\n.mdi-image-adjust:before {\n  content: \"\\e7e1\";\n}\n\n.mdi-image-assistant-photo:before {\n  content: \"\\e7e2\";\n}\n\n.mdi-image-audiotrack:before {\n  content: \"\\e7e3\";\n}\n\n.mdi-image-blur-circular:before {\n  content: \"\\e7e4\";\n}\n\n.mdi-image-blur-linear:before {\n  content: \"\\e7e5\";\n}\n\n.mdi-image-blur-off:before {\n  content: \"\\e7e6\";\n}\n\n.mdi-image-blur-on:before {\n  content: \"\\e7e7\";\n}\n\n.mdi-image-brightness-1:before {\n  content: \"\\e7e8\";\n}\n\n.mdi-image-brightness-2:before {\n  content: \"\\e7e9\";\n}\n\n.mdi-image-brightness-3:before {\n  content: \"\\e7ea\";\n}\n\n.mdi-image-brightness-4:before {\n  content: \"\\e7eb\";\n}\n\n.mdi-image-brightness-5:before {\n  content: \"\\e7ec\";\n}\n\n.mdi-image-brightness-6:before {\n  content: \"\\e7ed\";\n}\n\n.mdi-image-brightness-7:before {\n  content: \"\\e7ee\";\n}\n\n.mdi-image-brush:before {\n  content: \"\\e7ef\";\n}\n\n.mdi-image-camera-alt:before {\n  content: \"\\e7f0\";\n}\n\n.mdi-image-camera-front:before {\n  content: \"\\e7f1\";\n}\n\n.mdi-image-camera-rear:before {\n  content: \"\\e7f2\";\n}\n\n.mdi-image-camera-roll:before {\n  content: \"\\e7f3\";\n}\n\n.mdi-image-camera:before {\n  content: \"\\e7f4\";\n}\n\n.mdi-image-center-focus-strong:before {\n  content: \"\\e7f5\";\n}\n\n.mdi-image-center-focus-weak:before {\n  content: \"\\e7f6\";\n}\n\n.mdi-image-collections:before {\n  content: \"\\e7f7\";\n}\n\n.mdi-image-color-lens:before {\n  content: \"\\e7f8\";\n}\n\n.mdi-image-colorize:before {\n  content: \"\\e7f9\";\n}\n\n.mdi-image-compare:before {\n  content: \"\\e7fa\";\n}\n\n.mdi-image-control-point-duplicate:before {\n  content: \"\\e7fb\";\n}\n\n.mdi-image-control-point:before {\n  content: \"\\e7fc\";\n}\n\n.mdi-image-crop-3-2:before {\n  content: \"\\e7fd\";\n}\n\n.mdi-image-crop-5-4:before {\n  content: \"\\e7fe\";\n}\n\n.mdi-image-crop-7-5:before {\n  content: \"\\e7ff\";\n}\n\n.mdi-image-crop-16-9:before {\n  content: \"\\e800\";\n}\n\n.mdi-image-crop-din:before {\n  content: \"\\e801\";\n}\n\n.mdi-image-crop-free:before {\n  content: \"\\e802\";\n}\n\n.mdi-image-crop-landscape:before {\n  content: \"\\e803\";\n}\n\n.mdi-image-crop-original:before {\n  content: \"\\e804\";\n}\n\n.mdi-image-crop-portrait:before {\n  content: \"\\e805\";\n}\n\n.mdi-image-crop-square:before {\n  content: \"\\e806\";\n}\n\n.mdi-image-crop:before {\n  content: \"\\e807\";\n}\n\n.mdi-image-dehaze:before {\n  content: \"\\e808\";\n}\n\n.mdi-image-details:before {\n  content: \"\\e809\";\n}\n\n.mdi-image-edit:before {\n  content: \"\\e80a\";\n}\n\n.mdi-image-exposure-minus-1:before {\n  content: \"\\e80b\";\n}\n\n.mdi-image-exposure-minus-2:before {\n  content: \"\\e80c\";\n}\n\n.mdi-image-exposure-plus-1:before {\n  content: \"\\e80d\";\n}\n\n.mdi-image-exposure-plus-2:before {\n  content: \"\\e80e\";\n}\n\n.mdi-image-exposure-zero:before {\n  content: \"\\e80f\";\n}\n\n.mdi-image-exposure:before {\n  content: \"\\e810\";\n}\n\n.mdi-image-filter-1:before {\n  content: \"\\e811\";\n}\n\n.mdi-image-filter-2:before {\n  content: \"\\e812\";\n}\n\n.mdi-image-filter-3:before {\n  content: \"\\e813\";\n}\n\n.mdi-image-filter-4:before {\n  content: \"\\e814\";\n}\n\n.mdi-image-filter-5:before {\n  content: \"\\e815\";\n}\n\n.mdi-image-filter-6:before {\n  content: \"\\e816\";\n}\n\n.mdi-image-filter-7:before {\n  content: \"\\e817\";\n}\n\n.mdi-image-filter-8:before {\n  content: \"\\e818\";\n}\n\n.mdi-image-filter-9-plus:before {\n  content: \"\\e819\";\n}\n\n.mdi-image-filter-9:before {\n  content: \"\\e81a\";\n}\n\n.mdi-image-filter-b-and-w:before {\n  content: \"\\e81b\";\n}\n\n.mdi-image-filter-center-focus:before {\n  content: \"\\e81c\";\n}\n\n.mdi-image-filter-drama:before {\n  content: \"\\e81d\";\n}\n\n.mdi-image-filter-frames:before {\n  content: \"\\e81e\";\n}\n\n.mdi-image-filter-hdr:before {\n  content: \"\\e81f\";\n}\n\n.mdi-image-filter-none:before {\n  content: \"\\e820\";\n}\n\n.mdi-image-filter-tilt-shift:before {\n  content: \"\\e821\";\n}\n\n.mdi-image-filter-vintage:before {\n  content: \"\\e822\";\n}\n\n.mdi-image-filter:before {\n  content: \"\\e823\";\n}\n\n.mdi-image-flare:before {\n  content: \"\\e824\";\n}\n\n.mdi-image-flash-auto:before {\n  content: \"\\e825\";\n}\n\n.mdi-image-flash-off:before {\n  content: \"\\e826\";\n}\n\n.mdi-image-flash-on:before {\n  content: \"\\e827\";\n}\n\n.mdi-image-flip:before {\n  content: \"\\e828\";\n}\n\n.mdi-image-gradient:before {\n  content: \"\\e829\";\n}\n\n.mdi-image-grain:before {\n  content: \"\\e82a\";\n}\n\n.mdi-image-grid-off:before {\n  content: \"\\e82b\";\n}\n\n.mdi-image-grid-on:before {\n  content: \"\\e82c\";\n}\n\n.mdi-image-hdr-off:before {\n  content: \"\\e82d\";\n}\n\n.mdi-image-hdr-on:before {\n  content: \"\\e82e\";\n}\n\n.mdi-image-hdr-strong:before {\n  content: \"\\e82f\";\n}\n\n.mdi-image-hdr-weak:before {\n  content: \"\\e830\";\n}\n\n.mdi-image-healing:before {\n  content: \"\\e831\";\n}\n\n.mdi-image-image-aspect-ratio:before {\n  content: \"\\e832\";\n}\n\n.mdi-image-image:before {\n  content: \"\\e833\";\n}\n\n.mdi-image-iso:before {\n  content: \"\\e834\";\n}\n\n.mdi-image-landscape:before {\n  content: \"\\e835\";\n}\n\n.mdi-image-leak-add:before {\n  content: \"\\e836\";\n}\n\n.mdi-image-leak-remove:before {\n  content: \"\\e837\";\n}\n\n.mdi-image-lens:before {\n  content: \"\\e838\";\n}\n\n.mdi-image-looks-3:before {\n  content: \"\\e839\";\n}\n\n.mdi-image-looks-4:before {\n  content: \"\\e83a\";\n}\n\n.mdi-image-looks-5:before {\n  content: \"\\e83b\";\n}\n\n.mdi-image-looks-6:before {\n  content: \"\\e83c\";\n}\n\n.mdi-image-looks-one:before {\n  content: \"\\e83d\";\n}\n\n.mdi-image-looks-two:before {\n  content: \"\\e83e\";\n}\n\n.mdi-image-looks:before {\n  content: \"\\e83f\";\n}\n\n.mdi-image-loupe:before {\n  content: \"\\e840\";\n}\n\n.mdi-image-movie-creation:before {\n  content: \"\\e841\";\n}\n\n.mdi-image-nature-people:before {\n  content: \"\\e842\";\n}\n\n.mdi-image-nature:before {\n  content: \"\\e843\";\n}\n\n.mdi-image-navigate-before:before {\n  content: \"\\e844\";\n}\n\n.mdi-image-navigate-next:before {\n  content: \"\\e845\";\n}\n\n.mdi-image-palette:before {\n  content: \"\\e846\";\n}\n\n.mdi-image-panorama-fisheye:before {\n  content: \"\\e847\";\n}\n\n.mdi-image-panorama-horizontal:before {\n  content: \"\\e848\";\n}\n\n.mdi-image-panorama-vertical:before {\n  content: \"\\e849\";\n}\n\n.mdi-image-panorama-wide-angle:before {\n  content: \"\\e84a\";\n}\n\n.mdi-image-panorama:before {\n  content: \"\\e84b\";\n}\n\n.mdi-image-photo-album:before {\n  content: \"\\e84c\";\n}\n\n.mdi-image-photo-camera:before {\n  content: \"\\e84d\";\n}\n\n.mdi-image-photo-library:before {\n  content: \"\\e84e\";\n}\n\n.mdi-image-photo:before {\n  content: \"\\e84f\";\n}\n\n.mdi-image-portrait:before {\n  content: \"\\e850\";\n}\n\n.mdi-image-remove-red-eye:before {\n  content: \"\\e851\";\n}\n\n.mdi-image-rotate-left:before {\n  content: \"\\e852\";\n}\n\n.mdi-image-rotate-right:before {\n  content: \"\\e853\";\n}\n\n.mdi-image-slideshow:before {\n  content: \"\\e854\";\n}\n\n.mdi-image-straighten:before {\n  content: \"\\e855\";\n}\n\n.mdi-image-style:before {\n  content: \"\\e856\";\n}\n\n.mdi-image-switch-camera:before {\n  content: \"\\e857\";\n}\n\n.mdi-image-switch-video:before {\n  content: \"\\e858\";\n}\n\n.mdi-image-tag-faces:before {\n  content: \"\\e859\";\n}\n\n.mdi-image-texture:before {\n  content: \"\\e85a\";\n}\n\n.mdi-image-timelapse:before {\n  content: \"\\e85b\";\n}\n\n.mdi-image-timer-3:before {\n  content: \"\\e85c\";\n}\n\n.mdi-image-timer-10:before {\n  content: \"\\e85d\";\n}\n\n.mdi-image-timer-auto:before {\n  content: \"\\e85e\";\n}\n\n.mdi-image-timer-off:before {\n  content: \"\\e85f\";\n}\n\n.mdi-image-timer:before {\n  content: \"\\e860\";\n}\n\n.mdi-image-tonality:before {\n  content: \"\\e861\";\n}\n\n.mdi-image-transform:before {\n  content: \"\\e862\";\n}\n\n.mdi-image-tune:before {\n  content: \"\\e863\";\n}\n\n.mdi-image-wb-auto:before {\n  content: \"\\e864\";\n}\n\n.mdi-image-wb-cloudy:before {\n  content: \"\\e865\";\n}\n\n.mdi-image-wb-incandescent:before {\n  content: \"\\e866\";\n}\n\n.mdi-image-wb-irradescent:before {\n  content: \"\\e867\";\n}\n\n.mdi-image-wb-sunny:before {\n  content: \"\\e868\";\n}\n\n.mdi-maps-beenhere:before {\n  content: \"\\e869\";\n}\n\n.mdi-maps-directions-bike:before {\n  content: \"\\e86a\";\n}\n\n.mdi-maps-directions-bus:before {\n  content: \"\\e86b\";\n}\n\n.mdi-maps-directions-car:before {\n  content: \"\\e86c\";\n}\n\n.mdi-maps-directions-ferry:before {\n  content: \"\\e86d\";\n}\n\n.mdi-maps-directions-subway:before {\n  content: \"\\e86e\";\n}\n\n.mdi-maps-directions-train:before {\n  content: \"\\e86f\";\n}\n\n.mdi-maps-directions-transit:before {\n  content: \"\\e870\";\n}\n\n.mdi-maps-directions-walk:before {\n  content: \"\\e871\";\n}\n\n.mdi-maps-directions:before {\n  content: \"\\e872\";\n}\n\n.mdi-maps-flight:before {\n  content: \"\\e873\";\n}\n\n.mdi-maps-hotel:before {\n  content: \"\\e874\";\n}\n\n.mdi-maps-layers-clear:before {\n  content: \"\\e875\";\n}\n\n.mdi-maps-layers:before {\n  content: \"\\e876\";\n}\n\n.mdi-maps-local-airport:before {\n  content: \"\\e877\";\n}\n\n.mdi-maps-local-atm:before {\n  content: \"\\e878\";\n}\n\n.mdi-maps-local-attraction:before {\n  content: \"\\e879\";\n}\n\n.mdi-maps-local-bar:before {\n  content: \"\\e87a\";\n}\n\n.mdi-maps-local-cafe:before {\n  content: \"\\e87b\";\n}\n\n.mdi-maps-local-car-wash:before {\n  content: \"\\e87c\";\n}\n\n.mdi-maps-local-convenience-store:before {\n  content: \"\\e87d\";\n}\n\n.mdi-maps-local-drink:before {\n  content: \"\\e87e\";\n}\n\n.mdi-maps-local-florist:before {\n  content: \"\\e87f\";\n}\n\n.mdi-maps-local-gas-station:before {\n  content: \"\\e880\";\n}\n\n.mdi-maps-local-grocery-store:before {\n  content: \"\\e881\";\n}\n\n.mdi-maps-local-hospital:before {\n  content: \"\\e882\";\n}\n\n.mdi-maps-local-hotel:before {\n  content: \"\\e883\";\n}\n\n.mdi-maps-local-laundry-service:before {\n  content: \"\\e884\";\n}\n\n.mdi-maps-local-library:before {\n  content: \"\\e885\";\n}\n\n.mdi-maps-local-mall:before {\n  content: \"\\e886\";\n}\n\n.mdi-maps-local-movies:before {\n  content: \"\\e887\";\n}\n\n.mdi-maps-local-offer:before {\n  content: \"\\e888\";\n}\n\n.mdi-maps-local-parking:before {\n  content: \"\\e889\";\n}\n\n.mdi-maps-local-pharmacy:before {\n  content: \"\\e88a\";\n}\n\n.mdi-maps-local-phone:before {\n  content: \"\\e88b\";\n}\n\n.mdi-maps-local-pizza:before {\n  content: \"\\e88c\";\n}\n\n.mdi-maps-local-play:before {\n  content: \"\\e88d\";\n}\n\n.mdi-maps-local-post-office:before {\n  content: \"\\e88e\";\n}\n\n.mdi-maps-local-print-shop:before {\n  content: \"\\e88f\";\n}\n\n.mdi-maps-local-restaurant:before {\n  content: \"\\e890\";\n}\n\n.mdi-maps-local-see:before {\n  content: \"\\e891\";\n}\n\n.mdi-maps-local-shipping:before {\n  content: \"\\e892\";\n}\n\n.mdi-maps-local-taxi:before {\n  content: \"\\e893\";\n}\n\n.mdi-maps-location-history:before {\n  content: \"\\e894\";\n}\n\n.mdi-maps-map:before {\n  content: \"\\e895\";\n}\n\n.mdi-maps-my-location:before {\n  content: \"\\e896\";\n}\n\n.mdi-maps-navigation:before {\n  content: \"\\e897\";\n}\n\n.mdi-maps-pin-drop:before {\n  content: \"\\e898\";\n}\n\n.mdi-maps-place:before {\n  content: \"\\e899\";\n}\n\n.mdi-maps-rate-review:before {\n  content: \"\\e89a\";\n}\n\n.mdi-maps-restaurant-menu:before {\n  content: \"\\e89b\";\n}\n\n.mdi-maps-satellite:before {\n  content: \"\\e89c\";\n}\n\n.mdi-maps-store-mall-directory:before {\n  content: \"\\e89d\";\n}\n\n.mdi-maps-terrain:before {\n  content: \"\\e89e\";\n}\n\n.mdi-maps-traffic:before {\n  content: \"\\e89f\";\n}\n\n.mdi-navigation-apps:before {\n  content: \"\\e8a0\";\n}\n\n.mdi-navigation-arrow-back:before {\n  content: \"\\e8a1\";\n}\n\n.mdi-navigation-arrow-drop-down-circle:before {\n  content: \"\\e8a2\";\n}\n\n.mdi-navigation-arrow-drop-down:before {\n  content: \"\\e8a3\";\n}\n\n.mdi-navigation-arrow-drop-up:before {\n  content: \"\\e8a4\";\n}\n\n.mdi-navigation-arrow-forward:before {\n  content: \"\\e8a5\";\n}\n\n.mdi-navigation-cancel:before {\n  content: \"\\e8a6\";\n}\n\n.mdi-navigation-check:before {\n  content: \"\\e8a7\";\n}\n\n.mdi-navigation-chevron-left:before {\n  content: \"\\e8a8\";\n}\n\n.mdi-navigation-chevron-right:before {\n  content: \"\\e8a9\";\n}\n\n.mdi-navigation-close:before {\n  content: \"\\e8aa\";\n}\n\n.mdi-navigation-expand-less:before {\n  content: \"\\e8ab\";\n}\n\n.mdi-navigation-expand-more:before {\n  content: \"\\e8ac\";\n}\n\n.mdi-navigation-fullscreen-exit:before {\n  content: \"\\e8ad\";\n}\n\n.mdi-navigation-fullscreen:before {\n  content: \"\\e8ae\";\n}\n\n.mdi-navigation-menu:before {\n  content: \"\\e8af\";\n}\n\n.mdi-navigation-more-horiz:before {\n  content: \"\\e8b0\";\n}\n\n.mdi-navigation-more-vert:before {\n  content: \"\\e8b1\";\n}\n\n.mdi-navigation-refresh:before {\n  content: \"\\e8b2\";\n}\n\n.mdi-navigation-unfold-less:before {\n  content: \"\\e8b3\";\n}\n\n.mdi-navigation-unfold-more:before {\n  content: \"\\e8b4\";\n}\n\n.mdi-notification-adb:before {\n  content: \"\\e8b5\";\n}\n\n.mdi-notification-bluetooth-audio:before {\n  content: \"\\e8b6\";\n}\n\n.mdi-notification-disc-full:before {\n  content: \"\\e8b7\";\n}\n\n.mdi-notification-dnd-forwardslash:before {\n  content: \"\\e8b8\";\n}\n\n.mdi-notification-do-not-disturb:before {\n  content: \"\\e8b9\";\n}\n\n.mdi-notification-drive-eta:before {\n  content: \"\\e8ba\";\n}\n\n.mdi-notification-event-available:before {\n  content: \"\\e8bb\";\n}\n\n.mdi-notification-event-busy:before {\n  content: \"\\e8bc\";\n}\n\n.mdi-notification-event-note:before {\n  content: \"\\e8bd\";\n}\n\n.mdi-notification-folder-special:before {\n  content: \"\\e8be\";\n}\n\n.mdi-notification-mms:before {\n  content: \"\\e8bf\";\n}\n\n.mdi-notification-more:before {\n  content: \"\\e8c0\";\n}\n\n.mdi-notification-network-locked:before {\n  content: \"\\e8c1\";\n}\n\n.mdi-notification-phone-bluetooth-speaker:before {\n  content: \"\\e8c2\";\n}\n\n.mdi-notification-phone-forwarded:before {\n  content: \"\\e8c3\";\n}\n\n.mdi-notification-phone-in-talk:before {\n  content: \"\\e8c4\";\n}\n\n.mdi-notification-phone-locked:before {\n  content: \"\\e8c5\";\n}\n\n.mdi-notification-phone-missed:before {\n  content: \"\\e8c6\";\n}\n\n.mdi-notification-phone-paused:before {\n  content: \"\\e8c7\";\n}\n\n.mdi-notification-play-download:before {\n  content: \"\\e8c8\";\n}\n\n.mdi-notification-play-install:before {\n  content: \"\\e8c9\";\n}\n\n.mdi-notification-sd-card:before {\n  content: \"\\e8ca\";\n}\n\n.mdi-notification-sim-card-alert:before {\n  content: \"\\e8cb\";\n}\n\n.mdi-notification-sms-failed:before {\n  content: \"\\e8cc\";\n}\n\n.mdi-notification-sms:before {\n  content: \"\\e8cd\";\n}\n\n.mdi-notification-sync-disabled:before {\n  content: \"\\e8ce\";\n}\n\n.mdi-notification-sync-problem:before {\n  content: \"\\e8cf\";\n}\n\n.mdi-notification-sync:before {\n  content: \"\\e8d0\";\n}\n\n.mdi-notification-system-update:before {\n  content: \"\\e8d1\";\n}\n\n.mdi-notification-tap-and-play:before {\n  content: \"\\e8d2\";\n}\n\n.mdi-notification-time-to-leave:before {\n  content: \"\\e8d3\";\n}\n\n.mdi-notification-vibration:before {\n  content: \"\\e8d4\";\n}\n\n.mdi-notification-voice-chat:before {\n  content: \"\\e8d5\";\n}\n\n.mdi-notification-vpn-lock:before {\n  content: \"\\e8d6\";\n}\n\n.mdi-social-cake:before {\n  content: \"\\e8d7\";\n}\n\n.mdi-social-domain:before {\n  content: \"\\e8d8\";\n}\n\n.mdi-social-group-add:before {\n  content: \"\\e8d9\";\n}\n\n.mdi-social-group:before {\n  content: \"\\e8da\";\n}\n\n.mdi-social-location-city:before {\n  content: \"\\e8db\";\n}\n\n.mdi-social-mood:before {\n  content: \"\\e8dc\";\n}\n\n.mdi-social-notifications-none:before {\n  content: \"\\e8dd\";\n}\n\n.mdi-social-notifications-off:before {\n  content: \"\\e8de\";\n}\n\n.mdi-social-notifications-on:before {\n  content: \"\\e8df\";\n}\n\n.mdi-social-notifications-paused:before {\n  content: \"\\e8e0\";\n}\n\n.mdi-social-notifications:before {\n  content: \"\\e8e1\";\n}\n\n.mdi-social-pages:before {\n  content: \"\\e8e2\";\n}\n\n.mdi-social-party-mode:before {\n  content: \"\\e8e3\";\n}\n\n.mdi-social-people-outline:before {\n  content: \"\\e8e4\";\n}\n\n.mdi-social-people:before {\n  content: \"\\e8e5\";\n}\n\n.mdi-social-person-add:before {\n  content: \"\\e8e6\";\n}\n\n.mdi-social-person-outline:before {\n  content: \"\\e8e7\";\n}\n\n.mdi-social-person:before {\n  content: \"\\e8e8\";\n}\n\n.mdi-social-plus-one:before {\n  content: \"\\e8e9\";\n}\n\n.mdi-social-poll:before {\n  content: \"\\e8ea\";\n}\n\n.mdi-social-public:before {\n  content: \"\\e8eb\";\n}\n\n.mdi-social-school:before {\n  content: \"\\e8ec\";\n}\n\n.mdi-social-share:before {\n  content: \"\\e8ed\";\n}\n\n.mdi-social-whatshot:before {\n  content: \"\\e8ee\";\n}\n\n.mdi-toggle-check-box-outline-blank:before {\n  content: \"\\e8ef\";\n}\n\n.mdi-toggle-check-box:before {\n  content: \"\\e8f0\";\n}\n\n.mdi-toggle-radio-button-off:before {\n  content: \"\\e8f1\";\n}\n\n.mdi-toggle-radio-button-on:before {\n  content: \"\\e8f2\";\n}\n\n.mdi-toggle-star-half:before {\n  content: \"\\e8f3\";\n}\n\n.mdi-toggle-star-outline:before {\n  content: \"\\e8f4\";\n}\n\n.mdi-toggle-star:before {\n  content: \"\\e8f5\";\n}\n\n.container {\n  margin: 0 auto;\n  max-width: 1280px;\n  width: 90%;\n}\n\n@media only screen and (min-width: 601px) {\n  .container {\n    width: 85%;\n  }\n}\n\n@media only screen and (min-width: 993px) {\n  .container {\n    width: 70%;\n  }\n}\n\n.container .row {\n  margin-left: -0.75rem;\n  margin-right: -0.75rem;\n}\n\n.section {\n  padding-top: 1rem;\n  padding-bottom: 1rem;\n}\n\n.section.no-pad {\n  padding: 0;\n}\n\n.section.no-pad-bot {\n  padding-bottom: 0;\n}\n\n.section.no-pad-top {\n  padding-top: 0;\n}\n\n.row {\n  margin-left: auto;\n  margin-right: auto;\n  margin-bottom: 20px;\n}\n\n.row:after {\n  content: \"\";\n  display: table;\n  clear: both;\n}\n\n.row .col {\n  float: left;\n  box-sizing: border-box;\n  padding: 0 0.75rem;\n}\n\n.row .col[class*=\"push-\"], .row .col[class*=\"pull-\"] {\n  position: relative;\n}\n\n.row .col.s1 {\n  width: 8.3333333333%;\n  margin-left: auto;\n  left: auto;\n  right: auto;\n}\n\n.row .col.s2 {\n  width: 16.6666666667%;\n  margin-left: auto;\n  left: auto;\n  right: auto;\n}\n\n.row .col.s3 {\n  width: 25%;\n  margin-left: auto;\n  left: auto;\n  right: auto;\n}\n\n.row .col.s4 {\n  width: 33.3333333333%;\n  margin-left: auto;\n  left: auto;\n  right: auto;\n}\n\n.row .col.s5 {\n  width: 41.6666666667%;\n  margin-left: auto;\n  left: auto;\n  right: auto;\n}\n\n.row .col.s6 {\n  width: 50%;\n  margin-left: auto;\n  left: auto;\n  right: auto;\n}\n\n.row .col.s7 {\n  width: 58.3333333333%;\n  margin-left: auto;\n  left: auto;\n  right: auto;\n}\n\n.row .col.s8 {\n  width: 66.6666666667%;\n  margin-left: auto;\n  left: auto;\n  right: auto;\n}\n\n.row .col.s9 {\n  width: 75%;\n  margin-left: auto;\n  left: auto;\n  right: auto;\n}\n\n.row .col.s10 {\n  width: 83.3333333333%;\n  margin-left: auto;\n  left: auto;\n  right: auto;\n}\n\n.row .col.s11 {\n  width: 91.6666666667%;\n  margin-left: auto;\n  left: auto;\n  right: auto;\n}\n\n.row .col.s12 {\n  width: 100%;\n  margin-left: auto;\n  left: auto;\n  right: auto;\n}\n\n.row .col.offset-s1 {\n  margin-left: 8.3333333333%;\n}\n\n.row .col.pull-s1 {\n  right: 8.3333333333%;\n}\n\n.row .col.push-s1 {\n  left: 8.3333333333%;\n}\n\n.row .col.offset-s2 {\n  margin-left: 16.6666666667%;\n}\n\n.row .col.pull-s2 {\n  right: 16.6666666667%;\n}\n\n.row .col.push-s2 {\n  left: 16.6666666667%;\n}\n\n.row .col.offset-s3 {\n  margin-left: 25%;\n}\n\n.row .col.pull-s3 {\n  right: 25%;\n}\n\n.row .col.push-s3 {\n  left: 25%;\n}\n\n.row .col.offset-s4 {\n  margin-left: 33.3333333333%;\n}\n\n.row .col.pull-s4 {\n  right: 33.3333333333%;\n}\n\n.row .col.push-s4 {\n  left: 33.3333333333%;\n}\n\n.row .col.offset-s5 {\n  margin-left: 41.6666666667%;\n}\n\n.row .col.pull-s5 {\n  right: 41.6666666667%;\n}\n\n.row .col.push-s5 {\n  left: 41.6666666667%;\n}\n\n.row .col.offset-s6 {\n  margin-left: 50%;\n}\n\n.row .col.pull-s6 {\n  right: 50%;\n}\n\n.row .col.push-s6 {\n  left: 50%;\n}\n\n.row .col.offset-s7 {\n  margin-left: 58.3333333333%;\n}\n\n.row .col.pull-s7 {\n  right: 58.3333333333%;\n}\n\n.row .col.push-s7 {\n  left: 58.3333333333%;\n}\n\n.row .col.offset-s8 {\n  margin-left: 66.6666666667%;\n}\n\n.row .col.pull-s8 {\n  right: 66.6666666667%;\n}\n\n.row .col.push-s8 {\n  left: 66.6666666667%;\n}\n\n.row .col.offset-s9 {\n  margin-left: 75%;\n}\n\n.row .col.pull-s9 {\n  right: 75%;\n}\n\n.row .col.push-s9 {\n  left: 75%;\n}\n\n.row .col.offset-s10 {\n  margin-left: 83.3333333333%;\n}\n\n.row .col.pull-s10 {\n  right: 83.3333333333%;\n}\n\n.row .col.push-s10 {\n  left: 83.3333333333%;\n}\n\n.row .col.offset-s11 {\n  margin-left: 91.6666666667%;\n}\n\n.row .col.pull-s11 {\n  right: 91.6666666667%;\n}\n\n.row .col.push-s11 {\n  left: 91.6666666667%;\n}\n\n.row .col.offset-s12 {\n  margin-left: 100%;\n}\n\n.row .col.pull-s12 {\n  right: 100%;\n}\n\n.row .col.push-s12 {\n  left: 100%;\n}\n\n@media only screen and (min-width: 601px) {\n  .row .col.m1 {\n    width: 8.3333333333%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.m2 {\n    width: 16.6666666667%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.m3 {\n    width: 25%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.m4 {\n    width: 33.3333333333%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.m5 {\n    width: 41.6666666667%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.m6 {\n    width: 50%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.m7 {\n    width: 58.3333333333%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.m8 {\n    width: 66.6666666667%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.m9 {\n    width: 75%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.m10 {\n    width: 83.3333333333%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.m11 {\n    width: 91.6666666667%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.m12 {\n    width: 100%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.offset-m1 {\n    margin-left: 8.3333333333%;\n  }\n  .row .col.pull-m1 {\n    right: 8.3333333333%;\n  }\n  .row .col.push-m1 {\n    left: 8.3333333333%;\n  }\n  .row .col.offset-m2 {\n    margin-left: 16.6666666667%;\n  }\n  .row .col.pull-m2 {\n    right: 16.6666666667%;\n  }\n  .row .col.push-m2 {\n    left: 16.6666666667%;\n  }\n  .row .col.offset-m3 {\n    margin-left: 25%;\n  }\n  .row .col.pull-m3 {\n    right: 25%;\n  }\n  .row .col.push-m3 {\n    left: 25%;\n  }\n  .row .col.offset-m4 {\n    margin-left: 33.3333333333%;\n  }\n  .row .col.pull-m4 {\n    right: 33.3333333333%;\n  }\n  .row .col.push-m4 {\n    left: 33.3333333333%;\n  }\n  .row .col.offset-m5 {\n    margin-left: 41.6666666667%;\n  }\n  .row .col.pull-m5 {\n    right: 41.6666666667%;\n  }\n  .row .col.push-m5 {\n    left: 41.6666666667%;\n  }\n  .row .col.offset-m6 {\n    margin-left: 50%;\n  }\n  .row .col.pull-m6 {\n    right: 50%;\n  }\n  .row .col.push-m6 {\n    left: 50%;\n  }\n  .row .col.offset-m7 {\n    margin-left: 58.3333333333%;\n  }\n  .row .col.pull-m7 {\n    right: 58.3333333333%;\n  }\n  .row .col.push-m7 {\n    left: 58.3333333333%;\n  }\n  .row .col.offset-m8 {\n    margin-left: 66.6666666667%;\n  }\n  .row .col.pull-m8 {\n    right: 66.6666666667%;\n  }\n  .row .col.push-m8 {\n    left: 66.6666666667%;\n  }\n  .row .col.offset-m9 {\n    margin-left: 75%;\n  }\n  .row .col.pull-m9 {\n    right: 75%;\n  }\n  .row .col.push-m9 {\n    left: 75%;\n  }\n  .row .col.offset-m10 {\n    margin-left: 83.3333333333%;\n  }\n  .row .col.pull-m10 {\n    right: 83.3333333333%;\n  }\n  .row .col.push-m10 {\n    left: 83.3333333333%;\n  }\n  .row .col.offset-m11 {\n    margin-left: 91.6666666667%;\n  }\n  .row .col.pull-m11 {\n    right: 91.6666666667%;\n  }\n  .row .col.push-m11 {\n    left: 91.6666666667%;\n  }\n  .row .col.offset-m12 {\n    margin-left: 100%;\n  }\n  .row .col.pull-m12 {\n    right: 100%;\n  }\n  .row .col.push-m12 {\n    left: 100%;\n  }\n}\n\n@media only screen and (min-width: 993px) {\n  .row .col.l1 {\n    width: 8.3333333333%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.l2 {\n    width: 16.6666666667%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.l3 {\n    width: 25%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.l4 {\n    width: 33.3333333333%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.l5 {\n    width: 41.6666666667%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.l6 {\n    width: 50%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.l7 {\n    width: 58.3333333333%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.l8 {\n    width: 66.6666666667%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.l9 {\n    width: 75%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.l10 {\n    width: 83.3333333333%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.l11 {\n    width: 91.6666666667%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.l12 {\n    width: 100%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.offset-l1 {\n    margin-left: 8.3333333333%;\n  }\n  .row .col.pull-l1 {\n    right: 8.3333333333%;\n  }\n  .row .col.push-l1 {\n    left: 8.3333333333%;\n  }\n  .row .col.offset-l2 {\n    margin-left: 16.6666666667%;\n  }\n  .row .col.pull-l2 {\n    right: 16.6666666667%;\n  }\n  .row .col.push-l2 {\n    left: 16.6666666667%;\n  }\n  .row .col.offset-l3 {\n    margin-left: 25%;\n  }\n  .row .col.pull-l3 {\n    right: 25%;\n  }\n  .row .col.push-l3 {\n    left: 25%;\n  }\n  .row .col.offset-l4 {\n    margin-left: 33.3333333333%;\n  }\n  .row .col.pull-l4 {\n    right: 33.3333333333%;\n  }\n  .row .col.push-l4 {\n    left: 33.3333333333%;\n  }\n  .row .col.offset-l5 {\n    margin-left: 41.6666666667%;\n  }\n  .row .col.pull-l5 {\n    right: 41.6666666667%;\n  }\n  .row .col.push-l5 {\n    left: 41.6666666667%;\n  }\n  .row .col.offset-l6 {\n    margin-left: 50%;\n  }\n  .row .col.pull-l6 {\n    right: 50%;\n  }\n  .row .col.push-l6 {\n    left: 50%;\n  }\n  .row .col.offset-l7 {\n    margin-left: 58.3333333333%;\n  }\n  .row .col.pull-l7 {\n    right: 58.3333333333%;\n  }\n  .row .col.push-l7 {\n    left: 58.3333333333%;\n  }\n  .row .col.offset-l8 {\n    margin-left: 66.6666666667%;\n  }\n  .row .col.pull-l8 {\n    right: 66.6666666667%;\n  }\n  .row .col.push-l8 {\n    left: 66.6666666667%;\n  }\n  .row .col.offset-l9 {\n    margin-left: 75%;\n  }\n  .row .col.pull-l9 {\n    right: 75%;\n  }\n  .row .col.push-l9 {\n    left: 75%;\n  }\n  .row .col.offset-l10 {\n    margin-left: 83.3333333333%;\n  }\n  .row .col.pull-l10 {\n    right: 83.3333333333%;\n  }\n  .row .col.push-l10 {\n    left: 83.3333333333%;\n  }\n  .row .col.offset-l11 {\n    margin-left: 91.6666666667%;\n  }\n  .row .col.pull-l11 {\n    right: 91.6666666667%;\n  }\n  .row .col.push-l11 {\n    left: 91.6666666667%;\n  }\n  .row .col.offset-l12 {\n    margin-left: 100%;\n  }\n  .row .col.pull-l12 {\n    right: 100%;\n  }\n  .row .col.push-l12 {\n    left: 100%;\n  }\n}\n\nnav {\n  color: #fff;\n  background-color: #ee6e73;\n  width: 100%;\n  height: 56px;\n  line-height: 56px;\n}\n\nnav a {\n  color: #fff;\n}\n\nnav i,\nnav [class^=\"mdi-\"], nav [class*=\"mdi-\"],\nnav i.material-icons {\n  display: block;\n  font-size: 2rem;\n  height: 56px;\n  line-height: 56px;\n}\n\nnav .nav-wrapper {\n  position: relative;\n  height: 100%;\n}\n\n@media only screen and (min-width: 993px) {\n  nav a.button-collapse {\n    display: none;\n  }\n}\n\nnav .button-collapse {\n  float: left;\n  position: relative;\n  z-index: 1;\n  height: 56px;\n}\n\nnav .button-collapse i {\n  font-size: 2.7rem;\n  height: 56px;\n  line-height: 56px;\n}\n\nnav .brand-logo {\n  position: absolute;\n  color: #fff;\n  display: inline-block;\n  font-size: 2.1rem;\n  padding: 0;\n  white-space: nowrap;\n}\n\nnav .brand-logo.center {\n  left: 50%;\n  transform: translateX(-50%);\n}\n\n@media only screen and (max-width: 992px) {\n  nav .brand-logo {\n    left: 50%;\n    transform: translateX(-50%);\n  }\n  nav .brand-logo.left, nav .brand-logo.right {\n    padding: 0;\n    transform: none;\n  }\n  nav .brand-logo.left {\n    left: 0.5rem;\n  }\n  nav .brand-logo.right {\n    right: 0.5rem;\n    left: auto;\n  }\n}\n\nnav .brand-logo.right {\n  right: 0.5rem;\n  padding: 0;\n}\n\nnav ul {\n  margin: 0;\n}\n\nnav ul li {\n  transition: background-color .3s;\n  float: left;\n  padding: 0;\n}\n\nnav ul li.active {\n  background-color: rgba(0, 0, 0, 0.1);\n}\n\nnav ul a {\n  transition: background-color .3s;\n  font-size: 1rem;\n  color: #fff;\n  display: block;\n  padding: 0 15px;\n  cursor: pointer;\n}\n\nnav ul a.btn, nav ul a.btn-large, nav ul a.btn-large, nav ul a.btn-flat, nav ul a.btn-floating {\n  margin-top: -2px;\n  margin-left: 15px;\n  margin-right: 15px;\n}\n\nnav ul a:hover {\n  background-color: rgba(0, 0, 0, 0.1);\n}\n\nnav ul.left {\n  float: left;\n}\n\nnav .input-field {\n  margin: 0;\n}\n\nnav .input-field input {\n  height: 100%;\n  font-size: 1.2rem;\n  border: none;\n  padding-left: 2rem;\n}\n\nnav .input-field input:focus, nav .input-field input[type=text]:valid, nav .input-field input[type=password]:valid, nav .input-field input[type=email]:valid, nav .input-field input[type=url]:valid, nav .input-field input[type=date]:valid {\n  border: none;\n  box-shadow: none;\n}\n\nnav .input-field label {\n  top: 0;\n  left: 0;\n}\n\nnav .input-field label i {\n  color: rgba(255, 255, 255, 0.7);\n  transition: color .3s;\n}\n\nnav .input-field label.active i {\n  color: #fff;\n}\n\nnav .input-field label.active {\n  transform: translateY(0);\n}\n\n.navbar-fixed {\n  position: relative;\n  height: 56px;\n  z-index: 998;\n}\n\n.navbar-fixed nav {\n  position: fixed;\n}\n\n@media only screen and (min-width: 601px) {\n  nav, nav .nav-wrapper i, nav a.button-collapse, nav a.button-collapse i {\n    height: 64px;\n    line-height: 64px;\n  }\n  .navbar-fixed {\n    height: 64px;\n  }\n}\n\n@font-face {\n  font-family: \"Roboto\";\n  src: local(Roboto Thin), url(\"../font/roboto/Roboto-Thin.eot\");\n  src: url(\"../font/roboto/Roboto-Thin.eot?#iefix\") format(\"embedded-opentype\"), url(\"../font/roboto/Roboto-Thin.woff2\") format(\"woff2\"), url(\"../font/roboto/Roboto-Thin.woff\") format(\"woff\"), url(\"../font/roboto/Roboto-Thin.ttf\") format(\"truetype\");\n  font-weight: 200;\n}\n\n@font-face {\n  font-family: \"Roboto\";\n  src: local(Roboto Light), url(\"../font/roboto/Roboto-Light.eot\");\n  src: url(\"../font/roboto/Roboto-Light.eot?#iefix\") format(\"embedded-opentype\"), url(\"../font/roboto/Roboto-Light.woff2\") format(\"woff2\"), url(\"../font/roboto/Roboto-Light.woff\") format(\"woff\"), url(\"../font/roboto/Roboto-Light.ttf\") format(\"truetype\");\n  font-weight: 300;\n}\n\n@font-face {\n  font-family: \"Roboto\";\n  src: local(Roboto Regular), url(\"../font/roboto/Roboto-Regular.eot\");\n  src: url(\"../font/roboto/Roboto-Regular.eot?#iefix\") format(\"embedded-opentype\"), url(\"../font/roboto/Roboto-Regular.woff2\") format(\"woff2\"), url(\"../font/roboto/Roboto-Regular.woff\") format(\"woff\"), url(\"../font/roboto/Roboto-Regular.ttf\") format(\"truetype\");\n  font-weight: 400;\n}\n\n@font-face {\n  font-family: \"Roboto\";\n  src: url(\"../font/roboto/Roboto-Medium.eot\");\n  src: url(\"../font/roboto/Roboto-Medium.eot?#iefix\") format(\"embedded-opentype\"), url(\"../font/roboto/Roboto-Medium.woff2\") format(\"woff2\"), url(\"../font/roboto/Roboto-Medium.woff\") format(\"woff\"), url(\"../font/roboto/Roboto-Medium.ttf\") format(\"truetype\");\n  font-weight: 500;\n}\n\n@font-face {\n  font-family: \"Roboto\";\n  src: url(\"../font/roboto/Roboto-Bold.eot\");\n  src: url(\"../font/roboto/Roboto-Bold.eot?#iefix\") format(\"embedded-opentype\"), url(\"../font/roboto/Roboto-Bold.woff2\") format(\"woff2\"), url(\"../font/roboto/Roboto-Bold.woff\") format(\"woff\"), url(\"../font/roboto/Roboto-Bold.ttf\") format(\"truetype\");\n  font-weight: 700;\n}\n\na {\n  text-decoration: none;\n}\n\nhtml {\n  line-height: 1.5;\n  font-family: \"Roboto\", sans-serif;\n  font-weight: normal;\n  color: rgba(0, 0, 0, 0.87);\n}\n\n@media only screen and (min-width: 0) {\n  html {\n    font-size: 14px;\n  }\n}\n\n@media only screen and (min-width: 992px) {\n  html {\n    font-size: 14.5px;\n  }\n}\n\n@media only screen and (min-width: 1200px) {\n  html {\n    font-size: 15px;\n  }\n}\n\nh1, h2, h3, h4, h5, h6 {\n  font-weight: 400;\n  line-height: 1.1;\n}\n\nh1 a, h2 a, h3 a, h4 a, h5 a, h6 a {\n  font-weight: inherit;\n}\n\nh1 {\n  font-size: 4.2rem;\n  line-height: 110%;\n  margin: 2.1rem 0 1.68rem 0;\n}\n\nh2 {\n  font-size: 3.56rem;\n  line-height: 110%;\n  margin: 1.78rem 0 1.424rem 0;\n}\n\nh3 {\n  font-size: 2.92rem;\n  line-height: 110%;\n  margin: 1.46rem 0 1.168rem 0;\n}\n\nh4 {\n  font-size: 2.28rem;\n  line-height: 110%;\n  margin: 1.14rem 0 0.912rem 0;\n}\n\nh5 {\n  font-size: 1.64rem;\n  line-height: 110%;\n  margin: 0.82rem 0 0.656rem 0;\n}\n\nh6 {\n  font-size: 1rem;\n  line-height: 110%;\n  margin: 0.5rem 0 0.4rem 0;\n}\n\nem {\n  font-style: italic;\n}\n\nstrong {\n  font-weight: 500;\n}\n\nsmall {\n  font-size: 75%;\n}\n\n.light, footer.page-footer .footer-copyright {\n  font-weight: 300;\n}\n\n.thin {\n  font-weight: 200;\n}\n\n.flow-text {\n  font-weight: 300;\n}\n\n@media only screen and (min-width: 360px) {\n  .flow-text {\n    font-size: 1.2rem;\n  }\n}\n\n@media only screen and (min-width: 390px) {\n  .flow-text {\n    font-size: 1.224rem;\n  }\n}\n\n@media only screen and (min-width: 420px) {\n  .flow-text {\n    font-size: 1.248rem;\n  }\n}\n\n@media only screen and (min-width: 450px) {\n  .flow-text {\n    font-size: 1.272rem;\n  }\n}\n\n@media only screen and (min-width: 480px) {\n  .flow-text {\n    font-size: 1.296rem;\n  }\n}\n\n@media only screen and (min-width: 510px) {\n  .flow-text {\n    font-size: 1.32rem;\n  }\n}\n\n@media only screen and (min-width: 540px) {\n  .flow-text {\n    font-size: 1.344rem;\n  }\n}\n\n@media only screen and (min-width: 570px) {\n  .flow-text {\n    font-size: 1.368rem;\n  }\n}\n\n@media only screen and (min-width: 600px) {\n  .flow-text {\n    font-size: 1.392rem;\n  }\n}\n\n@media only screen and (min-width: 630px) {\n  .flow-text {\n    font-size: 1.416rem;\n  }\n}\n\n@media only screen and (min-width: 660px) {\n  .flow-text {\n    font-size: 1.44rem;\n  }\n}\n\n@media only screen and (min-width: 690px) {\n  .flow-text {\n    font-size: 1.464rem;\n  }\n}\n\n@media only screen and (min-width: 720px) {\n  .flow-text {\n    font-size: 1.488rem;\n  }\n}\n\n@media only screen and (min-width: 750px) {\n  .flow-text {\n    font-size: 1.512rem;\n  }\n}\n\n@media only screen and (min-width: 780px) {\n  .flow-text {\n    font-size: 1.536rem;\n  }\n}\n\n@media only screen and (min-width: 810px) {\n  .flow-text {\n    font-size: 1.56rem;\n  }\n}\n\n@media only screen and (min-width: 840px) {\n  .flow-text {\n    font-size: 1.584rem;\n  }\n}\n\n@media only screen and (min-width: 870px) {\n  .flow-text {\n    font-size: 1.608rem;\n  }\n}\n\n@media only screen and (min-width: 900px) {\n  .flow-text {\n    font-size: 1.632rem;\n  }\n}\n\n@media only screen and (min-width: 930px) {\n  .flow-text {\n    font-size: 1.656rem;\n  }\n}\n\n@media only screen and (min-width: 960px) {\n  .flow-text {\n    font-size: 1.68rem;\n  }\n}\n\n@media only screen and (max-width: 360px) {\n  .flow-text {\n    font-size: 1.2rem;\n  }\n}\n\n.card-panel {\n  transition: box-shadow .25s;\n  padding: 20px;\n  margin: 0.5rem 0 1rem 0;\n  border-radius: 2px;\n  background-color: #fff;\n}\n\n.card {\n  position: relative;\n  margin: 0.5rem 0 1rem 0;\n  background-color: #fff;\n  transition: box-shadow .25s;\n  border-radius: 2px;\n}\n\n.card .card-title {\n  font-size: 24px;\n  font-weight: 300;\n}\n\n.card .card-title.activator {\n  cursor: pointer;\n}\n\n.card.small, .card.medium, .card.large {\n  position: relative;\n}\n\n.card.small .card-image, .card.medium .card-image, .card.large .card-image {\n  max-height: 60%;\n  overflow: hidden;\n}\n\n.card.small .card-content, .card.medium .card-content, .card.large .card-content {\n  max-height: 40%;\n  overflow: hidden;\n}\n\n.card.small .card-action, .card.medium .card-action, .card.large .card-action {\n  position: absolute;\n  bottom: 0;\n  left: 0;\n  right: 0;\n  z-index: 1;\n  background-color: inherit;\n}\n\n.card.small {\n  height: 300px;\n}\n\n.card.medium {\n  height: 400px;\n}\n\n.card.large {\n  height: 500px;\n}\n\n.card .card-image {\n  position: relative;\n}\n\n.card .card-image img {\n  display: block;\n  border-radius: 2px 2px 0 0;\n  position: relative;\n  left: 0;\n  right: 0;\n  top: 0;\n  bottom: 0;\n  width: 100%;\n}\n\n.card .card-image .card-title {\n  color: #fff;\n  position: absolute;\n  bottom: 0;\n  left: 0;\n  padding: 20px;\n}\n\n.card .card-content {\n  padding: 20px;\n  border-radius: 0 0 2px 2px;\n}\n\n.card .card-content p {\n  margin: 0;\n  color: inherit;\n}\n\n.card .card-content .card-title {\n  line-height: 48px;\n}\n\n.card .card-action {\n  border-top: 1px solid rgba(160, 160, 160, 0.2);\n  padding: 20px;\n}\n\n.card .card-action a:not(.btn):not(.btn-large):not(.btn-floating) {\n  color: #ffab40;\n  margin-right: 20px;\n  transition: color .3s ease;\n  text-transform: uppercase;\n}\n\n.card .card-action a:not(.btn):not(.btn-large):not(.btn-floating):hover {\n  color: #ffd8a6;\n}\n\n.card .card-reveal {\n  padding: 20px;\n  position: absolute;\n  background-color: #fff;\n  width: 100%;\n  overflow-y: auto;\n  top: 100%;\n  height: 100%;\n  z-index: 1;\n  display: none;\n}\n\n.card .card-reveal .card-title {\n  cursor: pointer;\n  display: block;\n}\n\n#toast-container {\n  display: block;\n  position: fixed;\n  z-index: 10000;\n}\n\n@media only screen and (max-width: 600px) {\n  #toast-container {\n    min-width: 100%;\n    bottom: 0%;\n  }\n}\n\n@media only screen and (min-width: 601px) and (max-width: 992px) {\n  #toast-container {\n    left: 5%;\n    bottom: 7%;\n    max-width: 90%;\n  }\n}\n\n@media only screen and (min-width: 993px) {\n  #toast-container {\n    top: 10%;\n    right: 7%;\n    max-width: 86%;\n  }\n}\n\n.toast {\n  border-radius: 2px;\n  top: 0;\n  width: auto;\n  clear: both;\n  margin-top: 10px;\n  position: relative;\n  max-width: 100%;\n  height: auto;\n  min-height: 48px;\n  line-height: 1.5em;\n  word-break: break-all;\n  background-color: #323232;\n  padding: 10px 25px;\n  font-size: 1.1rem;\n  font-weight: 300;\n  color: #fff;\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n}\n\n.toast .btn, .toast .btn-large, .toast .btn-flat {\n  margin: 0;\n  margin-left: 3rem;\n}\n\n.toast.rounded {\n  border-radius: 24px;\n}\n\n@media only screen and (max-width: 600px) {\n  .toast {\n    width: 100%;\n    border-radius: 0;\n  }\n}\n\n@media only screen and (min-width: 601px) and (max-width: 992px) {\n  .toast {\n    float: left;\n  }\n}\n\n@media only screen and (min-width: 993px) {\n  .toast {\n    float: right;\n  }\n}\n\n.tabs {\n  display: flex;\n  position: relative;\n  overflow-x: auto;\n  overflow-y: hidden;\n  height: 48px;\n  background-color: #fff;\n  margin: 0 auto;\n  width: 100%;\n  white-space: nowrap;\n}\n\n.tabs .tab {\n  -webkit-box-flex: 1;\n  -webkit-flex-grow: 1;\n  -ms-flex-positive: 1;\n  flex-grow: 1;\n  display: block;\n  float: left;\n  text-align: center;\n  line-height: 48px;\n  height: 48px;\n  padding: 0;\n  margin: 0;\n  text-transform: uppercase;\n  text-overflow: ellipsis;\n  overflow: hidden;\n  letter-spacing: .8px;\n  width: 15%;\n  min-width: 80px;\n}\n\n.tabs .tab a {\n  color: #ee6e73;\n  display: block;\n  width: 100%;\n  height: 100%;\n  text-overflow: ellipsis;\n  overflow: hidden;\n  transition: color .28s ease;\n}\n\n.tabs .tab a:hover {\n  color: #f9c9cb;\n}\n\n.tabs .tab.disabled a {\n  color: #f9c9cb;\n  cursor: default;\n}\n\n.tabs .indicator {\n  position: absolute;\n  bottom: 0;\n  height: 2px;\n  background-color: #f6b2b5;\n  will-change: left, right;\n}\n\n.material-tooltip {\n  padding: 10px 8px;\n  font-size: 1rem;\n  z-index: 2000;\n  background-color: transparent;\n  border-radius: 2px;\n  color: #fff;\n  min-height: 36px;\n  line-height: 120%;\n  opacity: 0;\n  display: none;\n  position: absolute;\n  text-align: center;\n  max-width: calc(100% - 4px);\n  overflow: hidden;\n  left: 0;\n  top: 0;\n  will-change: top, left;\n}\n\n.backdrop {\n  position: absolute;\n  opacity: 0;\n  display: none;\n  height: 7px;\n  width: 14px;\n  border-radius: 0 0 14px 14px;\n  background-color: #323232;\n  z-index: -1;\n  transform-origin: 50% 10%;\n  will-change: transform, opacity;\n}\n\n.btn, .btn-large, .btn-flat {\n  border: none;\n  border-radius: 2px;\n  display: inline-block;\n  height: 36px;\n  line-height: 36px;\n  outline: 0;\n  padding: 0 2rem;\n  text-transform: uppercase;\n  vertical-align: middle;\n  -webkit-tap-highlight-color: transparent;\n}\n\n.btn.disabled, .disabled.btn-large, .btn-floating.disabled, .btn-large.disabled, .btn:disabled, .btn-large:disabled, .btn-large:disabled, .btn-floating:disabled {\n  background-color: #DFDFDF !important;\n  box-shadow: none;\n  color: #9F9F9F !important;\n  cursor: default;\n}\n\n.btn.disabled *, .disabled.btn-large *, .btn-floating.disabled *, .btn-large.disabled *, .btn:disabled *, .btn-large:disabled *, .btn-large:disabled *, .btn-floating:disabled * {\n  pointer-events: none;\n}\n\n.btn.disabled:hover, .disabled.btn-large:hover, .btn-floating.disabled:hover, .btn-large.disabled:hover, .btn:disabled:hover, .btn-large:disabled:hover, .btn-large:disabled:hover, .btn-floating:disabled:hover {\n  background-color: #DFDFDF;\n  color: #9F9F9F;\n}\n\n.btn i, .btn-large i, .btn-floating i, .btn-large i, .btn-flat i {\n  font-size: 1.3rem;\n  line-height: inherit;\n}\n\n.btn, .btn-large {\n  text-decoration: none;\n  color: #fff;\n  background-color: #26a69a;\n  text-align: center;\n  letter-spacing: .5px;\n  transition: .2s ease-out;\n  cursor: pointer;\n}\n\n.btn:hover, .btn-large:hover {\n  background-color: #2bbbad;\n}\n\n.btn-floating {\n  display: inline-block;\n  color: #fff;\n  position: relative;\n  overflow: hidden;\n  z-index: 1;\n  width: 37px;\n  height: 37px;\n  line-height: 37px;\n  padding: 0;\n  background-color: #26a69a;\n  border-radius: 50%;\n  transition: .3s;\n  cursor: pointer;\n  vertical-align: middle;\n}\n\n.btn-floating i {\n  width: inherit;\n  display: inline-block;\n  text-align: center;\n  color: #fff;\n  font-size: 1.6rem;\n  line-height: 37px;\n}\n\n.btn-floating:hover {\n  background-color: #26a69a;\n}\n\n.btn-floating:before {\n  border-radius: 0;\n}\n\n.btn-floating.btn-large {\n  width: 55.5px;\n  height: 55.5px;\n}\n\n.btn-floating.btn-large i {\n  line-height: 55.5px;\n}\n\nbutton.btn-floating {\n  border: none;\n}\n\n.fixed-action-btn {\n  position: fixed;\n  right: 23px;\n  bottom: 23px;\n  padding-top: 15px;\n  margin-bottom: 0;\n  z-index: 998;\n}\n\n.fixed-action-btn.active ul {\n  visibility: visible;\n}\n\n.fixed-action-btn.horizontal {\n  padding: 0 0 0 15px;\n}\n\n.fixed-action-btn.horizontal ul {\n  text-align: right;\n  right: 64px;\n  top: 50%;\n  transform: translateY(-50%);\n  height: 100%;\n  left: initial;\n  width: 500px;\n  /*width 100% only goes to width of button container */\n}\n\n.fixed-action-btn.horizontal ul li {\n  display: inline-block;\n  margin: 15px 15px 0 0;\n}\n\n.fixed-action-btn ul {\n  left: 0;\n  right: 0;\n  text-align: center;\n  position: absolute;\n  bottom: 64px;\n  margin: 0;\n  visibility: hidden;\n}\n\n.fixed-action-btn ul li {\n  margin-bottom: 15px;\n}\n\n.fixed-action-btn ul a.btn-floating {\n  opacity: 0;\n}\n\n.btn-flat {\n  box-shadow: none;\n  background-color: transparent;\n  color: #343434;\n  cursor: pointer;\n}\n\n.btn-flat.disabled {\n  color: #b3b3b3;\n  cursor: default;\n}\n\n.btn-large {\n  height: 54px;\n  line-height: 56px;\n}\n\n.btn-large i {\n  font-size: 1.6rem;\n}\n\n.btn-block {\n  display: block;\n}\n\n.dropdown-content {\n  background-color: #fff;\n  margin: 0;\n  display: none;\n  min-width: 100px;\n  max-height: 650px;\n  overflow-y: auto;\n  opacity: 0;\n  position: absolute;\n  z-index: 999;\n  will-change: width, height;\n}\n\n.dropdown-content li {\n  clear: both;\n  color: rgba(0, 0, 0, 0.87);\n  cursor: pointer;\n  min-height: 50px;\n  line-height: 1.5rem;\n  width: 100%;\n  text-align: left;\n  text-transform: none;\n}\n\n.dropdown-content li:hover, .dropdown-content li.active, .dropdown-content li.selected {\n  background-color: #eee;\n}\n\n.dropdown-content li.active.selected {\n  background-color: #e1e1e1;\n}\n\n.dropdown-content li.divider {\n  min-height: 0;\n  height: 1px;\n}\n\n.dropdown-content li > a, .dropdown-content li > span {\n  font-size: 16px;\n  color: #26a69a;\n  display: block;\n  line-height: 22px;\n  padding: 14px 16px;\n}\n\n.dropdown-content li > span > label {\n  top: 1px;\n  left: 3px;\n  height: 18px;\n}\n\n.dropdown-content li > a > i {\n  height: inherit;\n  line-height: inherit;\n}\n\n/*!\n * Waves v0.6.0\n * http://fian.my.id/Waves\n *\n * Copyright 2014 Alfiana E. Sibuea and other contributors\n * Released under the MIT license\n * https://github.com/fians/Waves/blob/master/LICENSE\n */\n.waves-effect {\n  position: relative;\n  cursor: pointer;\n  display: inline-block;\n  overflow: hidden;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n  -webkit-tap-highlight-color: transparent;\n  vertical-align: middle;\n  z-index: 1;\n  will-change: opacity, transform;\n  transition: all .3s ease-out;\n}\n\n.waves-effect .waves-ripple {\n  position: absolute;\n  border-radius: 50%;\n  width: 20px;\n  height: 20px;\n  margin-top: -10px;\n  margin-left: -10px;\n  opacity: 0;\n  background: rgba(0, 0, 0, 0.2);\n  transition: all 0.7s ease-out;\n  transition-property: transform, opacity;\n  transform: scale(0);\n  pointer-events: none;\n}\n\n.waves-effect.waves-light .waves-ripple {\n  background-color: rgba(255, 255, 255, 0.45);\n}\n\n.waves-effect.waves-red .waves-ripple {\n  background-color: rgba(244, 67, 54, 0.7);\n}\n\n.waves-effect.waves-yellow .waves-ripple {\n  background-color: rgba(255, 235, 59, 0.7);\n}\n\n.waves-effect.waves-orange .waves-ripple {\n  background-color: rgba(255, 152, 0, 0.7);\n}\n\n.waves-effect.waves-purple .waves-ripple {\n  background-color: rgba(156, 39, 176, 0.7);\n}\n\n.waves-effect.waves-green .waves-ripple {\n  background-color: rgba(76, 175, 80, 0.7);\n}\n\n.waves-effect.waves-teal .waves-ripple {\n  background-color: rgba(0, 150, 136, 0.7);\n}\n\n.waves-effect input[type=\"button\"], .waves-effect input[type=\"reset\"], .waves-effect input[type=\"submit\"] {\n  border: 0;\n  font-style: normal;\n  font-size: inherit;\n  text-transform: inherit;\n  background: none;\n}\n\n.waves-notransition {\n  transition: none !important;\n}\n\n.waves-circle {\n  transform: translateZ(0);\n  -webkit-mask-image: -webkit-radial-gradient(circle, white 100%, black 100%);\n}\n\n.waves-input-wrapper {\n  border-radius: 0.2em;\n  vertical-align: bottom;\n}\n\n.waves-input-wrapper .waves-button-input {\n  position: relative;\n  top: 0;\n  left: 0;\n  z-index: 1;\n}\n\n.waves-circle {\n  text-align: center;\n  width: 2.5em;\n  height: 2.5em;\n  line-height: 2.5em;\n  border-radius: 50%;\n  -webkit-mask-image: none;\n}\n\n.waves-block {\n  display: block;\n}\n\n/* Firefox Bug: link not triggered */\na.waves-effect .waves-ripple {\n  z-index: -1;\n}\n\n.modal {\n  display: none;\n  position: fixed;\n  left: 0;\n  right: 0;\n  background-color: #fafafa;\n  padding: 0;\n  max-height: 70%;\n  width: 55%;\n  margin: auto;\n  overflow-y: auto;\n  border-radius: 2px;\n  will-change: top, opacity;\n}\n\n@media only screen and (max-width: 992px) {\n  .modal {\n    width: 80%;\n  }\n}\n\n.modal h1, .modal h2, .modal h3, .modal h4 {\n  margin-top: 0;\n}\n\n.modal .modal-content {\n  padding: 24px;\n}\n\n.modal .modal-close {\n  cursor: pointer;\n}\n\n.modal .modal-footer {\n  border-radius: 0 0 2px 2px;\n  background-color: #fafafa;\n  padding: 4px 6px;\n  height: 56px;\n  width: 100%;\n}\n\n.modal .modal-footer .btn, .modal .modal-footer .btn-large, .modal .modal-footer .btn-flat {\n  float: right;\n  margin: 6px 0;\n}\n\n.lean-overlay {\n  position: fixed;\n  z-index: 999;\n  top: -100px;\n  left: 0;\n  bottom: 0;\n  right: 0;\n  height: 125%;\n  width: 100%;\n  background: #000;\n  display: none;\n  will-change: opacity;\n}\n\n.modal.modal-fixed-footer {\n  padding: 0;\n  height: 70%;\n}\n\n.modal.modal-fixed-footer .modal-content {\n  position: absolute;\n  height: calc(100% - 56px);\n  max-height: 100%;\n  width: 100%;\n  overflow-y: auto;\n}\n\n.modal.modal-fixed-footer .modal-footer {\n  border-top: 1px solid rgba(0, 0, 0, 0.1);\n  position: absolute;\n  bottom: 0;\n}\n\n.modal.bottom-sheet {\n  top: auto;\n  bottom: -100%;\n  margin: 0;\n  width: 100%;\n  max-height: 45%;\n  border-radius: 0;\n  will-change: bottom, opacity;\n}\n\n.collapsible {\n  border-top: 1px solid #ddd;\n  border-right: 1px solid #ddd;\n  border-left: 1px solid #ddd;\n  margin: 0.5rem 0 1rem 0;\n}\n\n.collapsible-header {\n  display: block;\n  cursor: pointer;\n  min-height: 3rem;\n  line-height: 3rem;\n  padding: 0 1rem;\n  background-color: #fff;\n  border-bottom: 1px solid #ddd;\n}\n\n.collapsible-header i {\n  width: 2rem;\n  font-size: 1.6rem;\n  line-height: 3rem;\n  display: block;\n  float: left;\n  text-align: center;\n  margin-right: 1rem;\n}\n\n.collapsible-body {\n  display: none;\n  border-bottom: 1px solid #ddd;\n  box-sizing: border-box;\n}\n\n.collapsible-body p {\n  margin: 0;\n  padding: 2rem;\n}\n\n.side-nav .collapsible {\n  border: none;\n  box-shadow: none;\n}\n\n.side-nav .collapsible li {\n  padding: 0;\n}\n\n.side-nav .collapsible-header {\n  background-color: transparent;\n  border: none;\n  line-height: inherit;\n  height: inherit;\n  margin: 0 1rem;\n}\n\n.side-nav .collapsible-header i {\n  line-height: inherit;\n}\n\n.side-nav .collapsible-body {\n  border: 0;\n  background-color: #fff;\n}\n\n.side-nav .collapsible-body li a {\n  margin: 0 1rem 0 2rem;\n}\n\n.collapsible.popout {\n  border: none;\n  box-shadow: none;\n}\n\n.collapsible.popout > li {\n  box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12);\n  margin: 0 24px;\n  transition: margin 0.35s cubic-bezier(0.25, 0.46, 0.45, 0.94);\n}\n\n.collapsible.popout > li.active {\n  box-shadow: 0 5px 11px 0 rgba(0, 0, 0, 0.18), 0 4px 15px 0 rgba(0, 0, 0, 0.15);\n  margin: 16px 0;\n}\n\n.chip {\n  display: inline-block;\n  height: 32px;\n  font-size: 13px;\n  font-weight: 500;\n  color: rgba(0, 0, 0, 0.6);\n  line-height: 32px;\n  padding: 0 12px;\n  border-radius: 16px;\n  background-color: #e4e4e4;\n}\n\n.chip img {\n  float: left;\n  margin: 0 8px 0 -12px;\n  height: 32px;\n  width: 32px;\n  border-radius: 50%;\n}\n\n.chip i.material-icons {\n  cursor: pointer;\n  float: right;\n  font-size: 16px;\n  line-height: 32px;\n  padding-left: 8px;\n}\n\n.materialboxed {\n  display: block;\n  cursor: zoom-in;\n  position: relative;\n  transition: opacity .4s;\n}\n\n.materialboxed:hover {\n  will-change: left, top, width, height;\n}\n\n.materialboxed:hover:not(.active) {\n  opacity: .8;\n}\n\n.materialboxed.active {\n  cursor: zoom-out;\n}\n\n#materialbox-overlay {\n  position: fixed;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  background-color: #292929;\n  z-index: 999;\n  will-change: opacity;\n}\n\n.materialbox-caption {\n  position: fixed;\n  display: none;\n  color: #fff;\n  line-height: 50px;\n  bottom: 0;\n  width: 100%;\n  text-align: center;\n  padding: 0% 15%;\n  height: 50px;\n  z-index: 1000;\n  -webkit-font-smoothing: antialiased;\n}\n\n/* Remove Focus Boxes */\nselect:focus {\n  outline: 1px solid #c9f3ef;\n}\n\nbutton:focus {\n  outline: none;\n  background-color: #2ab7a9;\n}\n\nlabel {\n  font-size: 0.8rem;\n  color: #9e9e9e;\n}\n\n/***************************\n   Text Inputs + Textarea\n****************************/\n::-webkit-input-placeholder {\n  color: #d1d1d1;\n}\n\n:-moz-placeholder {\n  /* Firefox 18- */\n  color: #d1d1d1;\n}\n\n::-moz-placeholder {\n  /* Firefox 19+ */\n  color: #d1d1d1;\n}\n\n:-ms-input-placeholder {\n  color: #d1d1d1;\n}\n\ninput:not([type]),\ninput[type=text],\ninput[type=password],\ninput[type=email],\ninput[type=url],\ninput[type=time],\ninput[type=date],\ninput[type=datetime-local],\ninput[type=tel],\ninput[type=number],\ninput[type=search],\ntextarea.materialize-textarea {\n  background-color: transparent;\n  border: none;\n  border-bottom: 1px solid #9e9e9e;\n  border-radius: 0;\n  outline: none;\n  height: 3rem;\n  width: 100%;\n  font-size: 1rem;\n  margin: 0 0 15px 0;\n  padding: 0;\n  box-shadow: none;\n  box-sizing: content-box;\n  transition: all .3s;\n}\n\ninput:not([type]):disabled, input:not([type])[readonly=\"readonly\"],\ninput[type=text]:disabled,\ninput[type=text][readonly=\"readonly\"],\ninput[type=password]:disabled,\ninput[type=password][readonly=\"readonly\"],\ninput[type=email]:disabled,\ninput[type=email][readonly=\"readonly\"],\ninput[type=url]:disabled,\ninput[type=url][readonly=\"readonly\"],\ninput[type=time]:disabled,\ninput[type=time][readonly=\"readonly\"],\ninput[type=date]:disabled,\ninput[type=date][readonly=\"readonly\"],\ninput[type=datetime-local]:disabled,\ninput[type=datetime-local][readonly=\"readonly\"],\ninput[type=tel]:disabled,\ninput[type=tel][readonly=\"readonly\"],\ninput[type=number]:disabled,\ninput[type=number][readonly=\"readonly\"],\ninput[type=search]:disabled,\ninput[type=search][readonly=\"readonly\"],\ntextarea.materialize-textarea:disabled,\ntextarea.materialize-textarea[readonly=\"readonly\"] {\n  color: rgba(0, 0, 0, 0.26);\n  border-bottom: 1px dotted rgba(0, 0, 0, 0.26);\n}\n\ninput:not([type]):disabled + label, input:not([type])[readonly=\"readonly\"] + label,\ninput[type=text]:disabled + label,\ninput[type=text][readonly=\"readonly\"] + label,\ninput[type=password]:disabled + label,\ninput[type=password][readonly=\"readonly\"] + label,\ninput[type=email]:disabled + label,\ninput[type=email][readonly=\"readonly\"] + label,\ninput[type=url]:disabled + label,\ninput[type=url][readonly=\"readonly\"] + label,\ninput[type=time]:disabled + label,\ninput[type=time][readonly=\"readonly\"] + label,\ninput[type=date]:disabled + label,\ninput[type=date][readonly=\"readonly\"] + label,\ninput[type=datetime-local]:disabled + label,\ninput[type=datetime-local][readonly=\"readonly\"] + label,\ninput[type=tel]:disabled + label,\ninput[type=tel][readonly=\"readonly\"] + label,\ninput[type=number]:disabled + label,\ninput[type=number][readonly=\"readonly\"] + label,\ninput[type=search]:disabled + label,\ninput[type=search][readonly=\"readonly\"] + label,\ntextarea.materialize-textarea:disabled + label,\ntextarea.materialize-textarea[readonly=\"readonly\"] + label {\n  color: rgba(0, 0, 0, 0.26);\n}\n\ninput:not([type]):focus:not([readonly]),\ninput[type=text]:focus:not([readonly]),\ninput[type=password]:focus:not([readonly]),\ninput[type=email]:focus:not([readonly]),\ninput[type=url]:focus:not([readonly]),\ninput[type=time]:focus:not([readonly]),\ninput[type=date]:focus:not([readonly]),\ninput[type=datetime-local]:focus:not([readonly]),\ninput[type=tel]:focus:not([readonly]),\ninput[type=number]:focus:not([readonly]),\ninput[type=search]:focus:not([readonly]),\ntextarea.materialize-textarea:focus:not([readonly]) {\n  border-bottom: 1px solid #26a69a;\n  box-shadow: 0 1px 0 0 #26a69a;\n}\n\ninput:not([type]):focus:not([readonly]) + label,\ninput[type=text]:focus:not([readonly]) + label,\ninput[type=password]:focus:not([readonly]) + label,\ninput[type=email]:focus:not([readonly]) + label,\ninput[type=url]:focus:not([readonly]) + label,\ninput[type=time]:focus:not([readonly]) + label,\ninput[type=date]:focus:not([readonly]) + label,\ninput[type=datetime-local]:focus:not([readonly]) + label,\ninput[type=tel]:focus:not([readonly]) + label,\ninput[type=number]:focus:not([readonly]) + label,\ninput[type=search]:focus:not([readonly]) + label,\ntextarea.materialize-textarea:focus:not([readonly]) + label {\n  color: #26a69a;\n}\n\ninput:not([type]).valid, input:not([type]):focus.valid,\ninput[type=text].valid,\ninput[type=text]:focus.valid,\ninput[type=password].valid,\ninput[type=password]:focus.valid,\ninput[type=email].valid,\ninput[type=email]:focus.valid,\ninput[type=url].valid,\ninput[type=url]:focus.valid,\ninput[type=time].valid,\ninput[type=time]:focus.valid,\ninput[type=date].valid,\ninput[type=date]:focus.valid,\ninput[type=datetime-local].valid,\ninput[type=datetime-local]:focus.valid,\ninput[type=tel].valid,\ninput[type=tel]:focus.valid,\ninput[type=number].valid,\ninput[type=number]:focus.valid,\ninput[type=search].valid,\ninput[type=search]:focus.valid,\ntextarea.materialize-textarea.valid,\ntextarea.materialize-textarea:focus.valid {\n  border-bottom: 1px solid #4CAF50;\n  box-shadow: 0 1px 0 0 #4CAF50;\n}\n\ninput:not([type]).valid + label:after,\ninput:not([type]):focus.valid + label:after,\ninput[type=text].valid + label:after,\ninput[type=text]:focus.valid + label:after,\ninput[type=password].valid + label:after,\ninput[type=password]:focus.valid + label:after,\ninput[type=email].valid + label:after,\ninput[type=email]:focus.valid + label:after,\ninput[type=url].valid + label:after,\ninput[type=url]:focus.valid + label:after,\ninput[type=time].valid + label:after,\ninput[type=time]:focus.valid + label:after,\ninput[type=date].valid + label:after,\ninput[type=date]:focus.valid + label:after,\ninput[type=datetime-local].valid + label:after,\ninput[type=datetime-local]:focus.valid + label:after,\ninput[type=tel].valid + label:after,\ninput[type=tel]:focus.valid + label:after,\ninput[type=number].valid + label:after,\ninput[type=number]:focus.valid + label:after,\ninput[type=search].valid + label:after,\ninput[type=search]:focus.valid + label:after,\ntextarea.materialize-textarea.valid + label:after,\ntextarea.materialize-textarea:focus.valid + label:after {\n  content: attr(data-success);\n  color: #4CAF50;\n  opacity: 1;\n}\n\ninput:not([type]).invalid, input:not([type]):focus.invalid,\ninput[type=text].invalid,\ninput[type=text]:focus.invalid,\ninput[type=password].invalid,\ninput[type=password]:focus.invalid,\ninput[type=email].invalid,\ninput[type=email]:focus.invalid,\ninput[type=url].invalid,\ninput[type=url]:focus.invalid,\ninput[type=time].invalid,\ninput[type=time]:focus.invalid,\ninput[type=date].invalid,\ninput[type=date]:focus.invalid,\ninput[type=datetime-local].invalid,\ninput[type=datetime-local]:focus.invalid,\ninput[type=tel].invalid,\ninput[type=tel]:focus.invalid,\ninput[type=number].invalid,\ninput[type=number]:focus.invalid,\ninput[type=search].invalid,\ninput[type=search]:focus.invalid,\ntextarea.materialize-textarea.invalid,\ntextarea.materialize-textarea:focus.invalid {\n  border-bottom: 1px solid #F44336;\n  box-shadow: 0 1px 0 0 #F44336;\n}\n\ninput:not([type]).invalid + label:after,\ninput:not([type]):focus.invalid + label:after,\ninput[type=text].invalid + label:after,\ninput[type=text]:focus.invalid + label:after,\ninput[type=password].invalid + label:after,\ninput[type=password]:focus.invalid + label:after,\ninput[type=email].invalid + label:after,\ninput[type=email]:focus.invalid + label:after,\ninput[type=url].invalid + label:after,\ninput[type=url]:focus.invalid + label:after,\ninput[type=time].invalid + label:after,\ninput[type=time]:focus.invalid + label:after,\ninput[type=date].invalid + label:after,\ninput[type=date]:focus.invalid + label:after,\ninput[type=datetime-local].invalid + label:after,\ninput[type=datetime-local]:focus.invalid + label:after,\ninput[type=tel].invalid + label:after,\ninput[type=tel]:focus.invalid + label:after,\ninput[type=number].invalid + label:after,\ninput[type=number]:focus.invalid + label:after,\ninput[type=search].invalid + label:after,\ninput[type=search]:focus.invalid + label:after,\ntextarea.materialize-textarea.invalid + label:after,\ntextarea.materialize-textarea:focus.invalid + label:after {\n  content: attr(data-error);\n  color: #F44336;\n  opacity: 1;\n}\n\ninput:not([type]) + label:after,\ninput[type=text] + label:after,\ninput[type=password] + label:after,\ninput[type=email] + label:after,\ninput[type=url] + label:after,\ninput[type=time] + label:after,\ninput[type=date] + label:after,\ninput[type=datetime-local] + label:after,\ninput[type=tel] + label:after,\ninput[type=number] + label:after,\ninput[type=search] + label:after,\ntextarea.materialize-textarea + label:after {\n  display: block;\n  content: \"\";\n  position: absolute;\n  top: 65px;\n  opacity: 0;\n  transition: .2s opacity ease-out, .2s color ease-out;\n}\n\n.input-field {\n  position: relative;\n  margin-top: 1rem;\n}\n\n.input-field label {\n  color: #9e9e9e;\n  position: absolute;\n  top: 0.8rem;\n  left: 0.75rem;\n  font-size: 1rem;\n  cursor: text;\n  transition: .2s ease-out;\n}\n\n.input-field label.active {\n  font-size: 0.8rem;\n  transform: translateY(-140%);\n}\n\n.input-field .prefix {\n  position: absolute;\n  width: 3rem;\n  font-size: 2rem;\n  transition: color .2s;\n}\n\n.input-field .prefix.active {\n  color: #26a69a;\n}\n\n.input-field .prefix ~ input,\n.input-field .prefix ~ .select-wrapper,\n.input-field .prefix ~ textarea {\n  margin-left: 3rem;\n  width: 92%;\n  width: calc(100% - 3rem);\n}\n\n.input-field .prefix ~ textarea {\n  padding-top: .8rem;\n}\n\n.input-field .prefix ~ label {\n  margin-left: 3rem;\n}\n\n@media only screen and (max-width: 992px) {\n  .input-field .prefix ~ input {\n    width: 86%;\n    width: calc(100% - 3rem);\n  }\n}\n\n@media only screen and (max-width: 600px) {\n  .input-field .prefix ~ input {\n    width: 80%;\n    width: calc(100% - 3rem);\n  }\n}\n\n.input-field input[type=search] {\n  display: block;\n  line-height: inherit;\n  padding-left: 4rem;\n  width: calc(100% - 4rem);\n}\n\n.input-field input[type=search]:focus {\n  background-color: #fff;\n  border: 0;\n  box-shadow: none;\n  color: #444;\n}\n\n.input-field input[type=search]:focus + label i,\n.input-field input[type=search]:focus ~ .mdi-navigation-close,\n.input-field input[type=search]:focus ~ .material-icons {\n  color: #444;\n}\n\n.input-field input[type=search] + label {\n  left: 1rem;\n}\n\n.input-field input[type=search] ~ .mdi-navigation-close,\n.input-field input[type=search] ~ .material-icons {\n  position: absolute;\n  top: 0;\n  right: 1rem;\n  color: transparent;\n  cursor: pointer;\n  font-size: 2rem;\n  transition: .3s color;\n}\n\ntextarea {\n  width: 100%;\n  height: 3rem;\n  background-color: transparent;\n}\n\ntextarea.materialize-textarea {\n  overflow-y: hidden;\n  /* prevents scroll bar flash */\n  padding: 1.6rem 0;\n  /* prevents text jump on Enter keypress */\n  resize: none;\n  min-height: 3rem;\n}\n\n.hiddendiv {\n  display: none;\n  white-space: pre-wrap;\n  word-wrap: break-word;\n  overflow-wrap: break-word;\n  /* future version of deprecated 'word-wrap' */\n  padding-top: 1.2rem;\n  /* prevents text jump on Enter keypress */\n}\n\n/***************\n  Radio Buttons\n***************/\n/* Remove default Radio Buttons */\n[type=\"radio\"]:not(:checked),\n[type=\"radio\"]:checked {\n  position: absolute;\n  left: -9999px;\n  visibility: hidden;\n}\n\n[type=\"radio\"]:not(:checked) + label,\n[type=\"radio\"]:checked + label {\n  position: relative;\n  padding-left: 35px;\n  cursor: pointer;\n  display: inline-block;\n  height: 25px;\n  line-height: 25px;\n  font-size: 1rem;\n  transition: .28s ease;\n  -khtml-user-select: none;\n  /* webkit (konqueror) browsers */\n  user-select: none;\n}\n\n[type=\"radio\"] + label:before,\n[type=\"radio\"] + label:after {\n  content: '';\n  position: absolute;\n  left: 0;\n  top: 0;\n  margin: 4px;\n  width: 16px;\n  height: 16px;\n  z-index: 0;\n  transition: .28s ease;\n}\n\n/* Unchecked styles */\n[type=\"radio\"]:not(:checked) + label:before {\n  border-radius: 50%;\n  border: 2px solid #5a5a5a;\n}\n\n[type=\"radio\"]:not(:checked) + label:after {\n  border-radius: 50%;\n  border: 2px solid #5a5a5a;\n  z-index: -1;\n  transform: scale(0);\n}\n\n/* Checked styles */\n[type=\"radio\"]:checked + label:before {\n  border-radius: 50%;\n  border: 2px solid transparent;\n}\n\n[type=\"radio\"]:checked + label:after {\n  border-radius: 50%;\n  border: 2px solid #26a69a;\n  background-color: #26a69a;\n  z-index: 0;\n  transform: scale(1.02);\n}\n\n/* Radio With gap */\n[type=\"radio\"].with-gap:checked + label:before {\n  border-radius: 50%;\n  border: 2px solid #26a69a;\n}\n\n[type=\"radio\"].with-gap:checked + label:after {\n  border-radius: 50%;\n  border: 2px solid #26a69a;\n  background-color: #26a69a;\n  z-index: 0;\n  transform: scale(0.5);\n}\n\n/* Disabled Radio With gap */\n[type=\"radio\"].with-gap:disabled:checked + label:before {\n  border: 2px solid rgba(0, 0, 0, 0.26);\n}\n\n[type=\"radio\"].with-gap:disabled:checked + label:after {\n  border: none;\n  background-color: rgba(0, 0, 0, 0.26);\n}\n\n/* Disabled style */\n[type=\"radio\"]:disabled:not(:checked) + label:before,\n[type=\"radio\"]:disabled:checked + label:before {\n  background-color: transparent;\n  border-color: rgba(0, 0, 0, 0.26);\n}\n\n[type=\"radio\"]:disabled + label {\n  color: rgba(0, 0, 0, 0.26);\n}\n\n[type=\"radio\"]:disabled:not(:checked) + label:before {\n  border-color: rgba(0, 0, 0, 0.26);\n}\n\n[type=\"radio\"]:disabled:checked + label:after {\n  background-color: rgba(0, 0, 0, 0.26);\n  border-color: #BDBDBD;\n}\n\n/***************\n   Checkboxes\n***************/\n/* CUSTOM CSS CHECKBOXES */\nform p {\n  margin-bottom: 10px;\n  text-align: left;\n}\n\nform p:last-child {\n  margin-bottom: 0;\n}\n\n/* Remove default checkbox */\n[type=\"checkbox\"]:not(:checked),\n[type=\"checkbox\"]:checked {\n  position: absolute;\n  left: -9999px;\n  visibility: hidden;\n}\n\n[type=\"checkbox\"] {\n  /* checkbox aspect */\n}\n\n[type=\"checkbox\"] + label {\n  position: relative;\n  padding-left: 35px;\n  cursor: pointer;\n  display: inline-block;\n  height: 25px;\n  line-height: 25px;\n  font-size: 1rem;\n  -webkit-user-select: none;\n  /* webkit (safari, chrome) browsers */\n  -moz-user-select: none;\n  /* mozilla browsers */\n  -khtml-user-select: none;\n  /* webkit (konqueror) browsers */\n  -ms-user-select: none;\n  /* IE10+ */\n}\n\n[type=\"checkbox\"] + label:before {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 18px;\n  height: 18px;\n  z-index: 0;\n  border: 2px solid #5a5a5a;\n  border-radius: 1px;\n  margin-top: 2px;\n  transition: .2s;\n}\n\n[type=\"checkbox\"]:not(:checked):disabled + label:before {\n  border: none;\n  background-color: rgba(0, 0, 0, 0.26);\n}\n\n[type=\"checkbox\"]:checked + label:before {\n  top: -4px;\n  left: -3px;\n  width: 12px;\n  height: 22px;\n  border-top: 2px solid transparent;\n  border-left: 2px solid transparent;\n  border-right: 2px solid #26a69a;\n  border-bottom: 2px solid #26a69a;\n  transform: rotate(40deg);\n  backface-visibility: hidden;\n  transform-origin: 100% 100%;\n}\n\n[type=\"checkbox\"]:checked:disabled + label:before {\n  border-right: 2px solid rgba(0, 0, 0, 0.26);\n  border-bottom: 2px solid rgba(0, 0, 0, 0.26);\n}\n\n/* Indeterminate checkbox */\n[type=\"checkbox\"]:indeterminate + label:before {\n  left: -10px;\n  top: -11px;\n  width: 10px;\n  height: 22px;\n  border-top: none;\n  border-left: none;\n  border-right: 2px solid #26a69a;\n  border-bottom: none;\n  transform: rotate(90deg);\n  backface-visibility: hidden;\n  transform-origin: 100% 100%;\n}\n\n[type=\"checkbox\"]:indeterminate:disabled + label:before {\n  border-right: 2px solid rgba(0, 0, 0, 0.26);\n  background-color: transparent;\n}\n\n[type=\"checkbox\"].filled-in + label:after {\n  border-radius: 2px;\n}\n\n[type=\"checkbox\"].filled-in + label:before,\n[type=\"checkbox\"].filled-in + label:after {\n  content: '';\n  left: 0;\n  position: absolute;\n  /* .1s delay is for check animation */\n  transition: border .25s, background-color .25s, width .20s .1s, height .20s .1s, top .20s .1s, left .20s .1s;\n  z-index: 1;\n}\n\n[type=\"checkbox\"].filled-in:not(:checked) + label:before {\n  width: 0;\n  height: 0;\n  border: 3px solid transparent;\n  left: 6px;\n  top: 10px;\n  -webkit-transform: rotateZ(37deg);\n  transform: rotateZ(37deg);\n  -webkit-transform-origin: 20% 40%;\n  transform-origin: 100% 100%;\n}\n\n[type=\"checkbox\"].filled-in:not(:checked) + label:after {\n  height: 20px;\n  width: 20px;\n  background-color: transparent;\n  border: 2px solid #5a5a5a;\n  top: 0px;\n  z-index: 0;\n}\n\n[type=\"checkbox\"].filled-in:checked + label:before {\n  top: 0;\n  left: 1px;\n  width: 8px;\n  height: 13px;\n  border-top: 2px solid transparent;\n  border-left: 2px solid transparent;\n  border-right: 2px solid #fff;\n  border-bottom: 2px solid #fff;\n  -webkit-transform: rotateZ(37deg);\n  transform: rotateZ(37deg);\n  -webkit-transform-origin: 100% 100%;\n  transform-origin: 100% 100%;\n}\n\n[type=\"checkbox\"].filled-in:checked + label:after {\n  top: 0px;\n  width: 20px;\n  height: 20px;\n  border: 2px solid #26a69a;\n  background-color: #26a69a;\n  z-index: 0;\n}\n\n[type=\"checkbox\"].filled-in:disabled:not(:checked) + label:before {\n  background-color: transparent;\n  border: 2px solid transparent;\n}\n\n[type=\"checkbox\"].filled-in:disabled:not(:checked) + label:after {\n  border-color: transparent;\n  background-color: #BDBDBD;\n}\n\n[type=\"checkbox\"].filled-in:disabled:checked + label:before {\n  background-color: transparent;\n}\n\n[type=\"checkbox\"].filled-in:disabled:checked + label:after {\n  background-color: #BDBDBD;\n  border-color: #BDBDBD;\n}\n\n/***************\n     Switch\n***************/\n.switch,\n.switch * {\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -khtml-user-select: none;\n  -ms-user-select: none;\n}\n\n.switch label {\n  cursor: pointer;\n}\n\n.switch label input[type=checkbox] {\n  opacity: 0;\n  width: 0;\n  height: 0;\n}\n\n.switch label input[type=checkbox]:checked + .lever {\n  background-color: #84c7c1;\n}\n\n.switch label input[type=checkbox]:checked + .lever:after {\n  background-color: #26a69a;\n}\n\n.switch label .lever {\n  content: \"\";\n  display: inline-block;\n  position: relative;\n  width: 40px;\n  height: 15px;\n  background-color: #818181;\n  border-radius: 15px;\n  margin-right: 10px;\n  transition: background 0.3s ease;\n  vertical-align: middle;\n  margin: 0 16px;\n}\n\n.switch label .lever:after {\n  content: \"\";\n  position: absolute;\n  display: inline-block;\n  width: 21px;\n  height: 21px;\n  background-color: #F1F1F1;\n  border-radius: 21px;\n  box-shadow: 0 1px 3px 1px rgba(0, 0, 0, 0.4);\n  left: -5px;\n  top: -3px;\n  transition: left 0.3s ease, background .3s ease, box-shadow 0.1s ease;\n}\n\ninput[type=checkbox]:checked:not(:disabled) ~ .lever:active:after {\n  box-shadow: 0 1px 3px 1px rgba(0, 0, 0, 0.4), 0 0 0 15px rgba(38, 166, 154, 0.1);\n}\n\ninput[type=checkbox]:not(:disabled) ~ .lever:active:after {\n  box-shadow: 0 1px 3px 1px rgba(0, 0, 0, 0.4), 0 0 0 15px rgba(0, 0, 0, 0.08);\n}\n\n.switch label input[type=checkbox]:checked + .lever:after {\n  left: 24px;\n}\n\n.switch input[type=checkbox][disabled] + .lever {\n  cursor: default;\n}\n\n.switch label input[type=checkbox][disabled] + .lever:after,\n.switch label input[type=checkbox][disabled]:checked + .lever:after {\n  background-color: #BDBDBD;\n}\n\n/***************\n  Select Field\n***************/\n.select-label {\n  position: absolute;\n}\n\n.select-wrapper {\n  position: relative;\n}\n\n.select-wrapper input.select-dropdown {\n  position: relative;\n  cursor: pointer;\n  background-color: transparent;\n  border: none;\n  border-bottom: 1px solid #9e9e9e;\n  outline: none;\n  height: 3rem;\n  line-height: 3rem;\n  width: 100%;\n  font-size: 1rem;\n  margin: 0 0 15px 0;\n  padding: 0;\n  display: block;\n}\n\n.select-wrapper span.caret {\n  color: initial;\n  position: absolute;\n  right: 0;\n  top: 16px;\n  font-size: 10px;\n}\n\n.select-wrapper span.caret.disabled {\n  color: rgba(0, 0, 0, 0.26);\n}\n\n.select-wrapper + label {\n  position: absolute;\n  top: -14px;\n  font-size: 0.8rem;\n}\n\nselect {\n  display: none;\n}\n\nselect.browser-default {\n  display: block;\n}\n\nselect:disabled {\n  color: rgba(0, 0, 0, 0.3);\n}\n\n.select-wrapper input.select-dropdown:disabled {\n  color: rgba(0, 0, 0, 0.3);\n  cursor: default;\n  -webkit-user-select: none;\n  /* webkit (safari, chrome) browsers */\n  -moz-user-select: none;\n  /* mozilla browsers */\n  -ms-user-select: none;\n  /* IE10+ */\n  border-bottom: 1px solid rgba(0, 0, 0, 0.3);\n}\n\n.select-wrapper i {\n  color: rgba(0, 0, 0, 0.3);\n}\n\n.select-dropdown li.disabled,\n.select-dropdown li.disabled > span,\n.select-dropdown li.optgroup {\n  color: rgba(0, 0, 0, 0.3);\n  background-color: transparent;\n}\n\n.select-dropdown li img {\n  height: 40px;\n  width: 40px;\n  margin: 5px 15px;\n  float: right;\n}\n\n.select-dropdown li.optgroup {\n  border-top: 1px solid #eee;\n}\n\n.select-dropdown li.optgroup.selected > span {\n  color: rgba(0, 0, 0, 0.7);\n}\n\n.select-dropdown li.optgroup > span {\n  color: rgba(0, 0, 0, 0.4);\n}\n\n.select-dropdown li.optgroup ~ li:not(.optgroup) {\n  padding-left: 1rem;\n}\n\n/*********************\n      File Input\n**********************/\n.file-field {\n  position: relative;\n}\n\n.file-field .file-path-wrapper {\n  overflow: hidden;\n  padding-left: 10px;\n}\n\n.file-field input.file-path {\n  width: 100%;\n}\n\n.file-field .btn, .file-field .btn-large {\n  float: left;\n  height: 3rem;\n  line-height: 3rem;\n}\n\n.file-field span {\n  cursor: pointer;\n}\n\n.file-field input[type=file] {\n  position: absolute;\n  top: 0;\n  right: 0;\n  left: 0;\n  bottom: 0;\n  width: 100%;\n  margin: 0;\n  padding: 0;\n  font-size: 20px;\n  cursor: pointer;\n  opacity: 0;\n  filter: alpha(opacity=0);\n}\n\n/***************\n      Range\n***************/\n.range-field {\n  position: relative;\n}\n\ninput[type=range], input[type=range] + .thumb {\n  cursor: pointer;\n}\n\ninput[type=range] {\n  position: relative;\n  background-color: transparent;\n  border: none;\n  outline: none;\n  width: 100%;\n  margin: 15px 0px;\n  padding: 0;\n}\n\ninput[type=range] + .thumb {\n  position: absolute;\n  border: none;\n  height: 0;\n  width: 0;\n  border-radius: 50%;\n  background-color: #26a69a;\n  top: 10px;\n  margin-left: -6px;\n  transform-origin: 50% 50%;\n  transform: rotate(-45deg);\n}\n\ninput[type=range] + .thumb .value {\n  display: block;\n  width: 30px;\n  text-align: center;\n  color: #26a69a;\n  font-size: 0;\n  transform: rotate(45deg);\n}\n\ninput[type=range] + .thumb.active {\n  border-radius: 50% 50% 50% 0;\n}\n\ninput[type=range] + .thumb.active .value {\n  color: #fff;\n  margin-left: -1px;\n  margin-top: 8px;\n  font-size: 10px;\n}\n\ninput[type=range]:focus {\n  outline: none;\n}\n\ninput[type=range] {\n  -webkit-appearance: none;\n}\n\ninput[type=range]::-webkit-slider-runnable-track {\n  height: 3px;\n  background: #c2c0c2;\n  border: none;\n}\n\ninput[type=range]::-webkit-slider-thumb {\n  -webkit-appearance: none;\n  border: none;\n  height: 14px;\n  width: 14px;\n  border-radius: 50%;\n  background-color: #26a69a;\n  transform-origin: 50% 50%;\n  margin: -5px 0 0 0;\n  transition: .3s;\n}\n\ninput[type=range]:focus::-webkit-slider-runnable-track {\n  background: #ccc;\n}\n\ninput[type=range] {\n  /* fix for FF unable to apply focus style bug  */\n  border: 1px solid white;\n  /*required for proper track sizing in FF*/\n}\n\ninput[type=range]::-moz-range-track {\n  height: 3px;\n  background: #ddd;\n  border: none;\n}\n\ninput[type=range]::-moz-range-thumb {\n  border: none;\n  height: 14px;\n  width: 14px;\n  border-radius: 50%;\n  background: #26a69a;\n  margin-top: -5px;\n}\n\n/*hide the outline behind the border*/\ninput[type=range]:-moz-focusring {\n  outline: 1px solid white;\n  outline-offset: -1px;\n}\n\ninput[type=range]:focus::-moz-range-track {\n  background: #ccc;\n}\n\ninput[type=range]::-ms-track {\n  height: 3px;\n  /*remove bg colour from the track, we'll use ms-fill-lower and ms-fill-upper instead */\n  background: transparent;\n  /*leave room for the larger thumb to overflow with a transparent border */\n  border-color: transparent;\n  border-width: 6px 0;\n  /*remove default tick marks*/\n  color: transparent;\n}\n\ninput[type=range]::-ms-fill-lower {\n  background: #777;\n}\n\ninput[type=range]::-ms-fill-upper {\n  background: #ddd;\n}\n\ninput[type=range]::-ms-thumb {\n  border: none;\n  height: 14px;\n  width: 14px;\n  border-radius: 50%;\n  background: #26a69a;\n}\n\ninput[type=range]:focus::-ms-fill-lower {\n  background: #888;\n}\n\ninput[type=range]:focus::-ms-fill-upper {\n  background: #ccc;\n}\n\n/***************************\n   Text Inputs + Textarea\n****************************/\nselect {\n  background-color: rgba(255, 255, 255, 0.9);\n  width: 100%;\n  padding: 5px;\n  border: 1px solid #f2f2f2;\n  border-radius: 2px;\n  height: 3rem;\n}\n\n/***************\n    Nav List\n***************/\n.table-of-contents.fixed {\n  position: fixed;\n}\n\n.table-of-contents li {\n  padding: 2px 0;\n}\n\n.table-of-contents a {\n  display: inline-block;\n  font-weight: 300;\n  color: #757575;\n  padding-left: 20px;\n  height: 1.5rem;\n  line-height: 1.5rem;\n  letter-spacing: .4;\n  display: inline-block;\n}\n\n.table-of-contents a:hover {\n  color: #a8a8a8;\n  padding-left: 19px;\n  border-left: 1px solid #ea4a4f;\n}\n\n.table-of-contents a.active {\n  font-weight: 500;\n  padding-left: 18px;\n  border-left: 2px solid #ea4a4f;\n}\n\n.side-nav {\n  position: fixed;\n  width: 240px;\n  left: -105%;\n  top: 0;\n  margin: 0;\n  height: 100%;\n  height: calc(100% + 60px);\n  height: -moz-calc(100%);\n  padding-bottom: 60px;\n  background-color: #fff;\n  z-index: 999;\n  overflow-y: auto;\n  will-change: left;\n}\n\n.side-nav.right-aligned {\n  will-change: right;\n  right: -105%;\n  left: auto;\n}\n\n.side-nav .collapsible {\n  margin: 0;\n}\n\n.side-nav li {\n  float: none;\n  padding: 0 15px;\n  line-height: 64px;\n}\n\n.side-nav li:hover, .side-nav li.active {\n  background-color: #ddd;\n}\n\n.side-nav a {\n  color: #444;\n  display: block;\n  font-size: 1rem;\n  height: 64px;\n  line-height: 64px;\n  padding: 0 15px;\n}\n\n.drag-target {\n  height: 100%;\n  width: 10px;\n  position: fixed;\n  top: 0;\n  z-index: 998;\n}\n\n.side-nav.fixed a {\n  display: block;\n  padding: 0 15px;\n  color: #444;\n}\n\n.side-nav.fixed {\n  left: 0;\n  position: fixed;\n}\n\n.side-nav.fixed.right-aligned {\n  right: 0;\n  left: auto;\n}\n\n@media only screen and (max-width: 992px) {\n  .side-nav.fixed {\n    left: -105%;\n  }\n  .side-nav.fixed.right-aligned {\n    right: -105%;\n    left: auto;\n  }\n}\n\n.side-nav .collapsible-body li.active,\n.side-nav.fixed .collapsible-body li.active {\n  background-color: #ee6e73;\n}\n\n.side-nav .collapsible-body li.active a,\n.side-nav.fixed .collapsible-body li.active a {\n  color: #fff;\n}\n\n#sidenav-overlay {\n  position: fixed;\n  top: 0;\n  left: 0;\n  right: 0;\n  height: 120vh;\n  background-color: rgba(0, 0, 0, 0.5);\n  z-index: 997;\n  will-change: opacity;\n}\n\n/*\n    @license\n    Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n    This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n    The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n    The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n    Code distributed by Google as part of the polymer project is also\n    subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n/**************************/\n/* STYLES FOR THE SPINNER */\n/**************************/\n/*\n * Constants:\n *      STROKEWIDTH = 3px\n *      ARCSIZE     = 270 degrees (amount of circle the arc takes up)\n *      ARCTIME     = 1333ms (time it takes to expand and contract arc)\n *      ARCSTARTROT = 216 degrees (how much the start location of the arc\n *                                should rotate each time, 216 gives us a\n *                                5 pointed star shape (it's 360/5 * 3).\n *                                For a 7 pointed star, we might do\n *                                360/7 * 3 = 154.286)\n *      CONTAINERWIDTH = 28px\n *      SHRINK_TIME = 400ms\n */\n.preloader-wrapper {\n  display: inline-block;\n  position: relative;\n  width: 48px;\n  height: 48px;\n}\n\n.preloader-wrapper.small {\n  width: 36px;\n  height: 36px;\n}\n\n.preloader-wrapper.big {\n  width: 64px;\n  height: 64px;\n}\n\n.preloader-wrapper.active {\n  /* duration: 360 * ARCTIME / (ARCSTARTROT + (360-ARCSIZE)) */\n  -webkit-animation: container-rotate 1568ms linear infinite;\n  animation: container-rotate 1568ms linear infinite;\n}\n\n@-webkit-keyframes container-rotate {\n  to {\n    -webkit-transform: rotate(360deg);\n  }\n}\n\n@keyframes container-rotate {\n  to {\n    transform: rotate(360deg);\n  }\n}\n\n.spinner-layer {\n  position: absolute;\n  width: 100%;\n  height: 100%;\n  opacity: 0;\n  border-color: #26a69a;\n}\n\n.spinner-blue,\n.spinner-blue-only {\n  border-color: #4285f4;\n}\n\n.spinner-red,\n.spinner-red-only {\n  border-color: #db4437;\n}\n\n.spinner-yellow,\n.spinner-yellow-only {\n  border-color: #f4b400;\n}\n\n.spinner-green,\n.spinner-green-only {\n  border-color: #0f9d58;\n}\n\n/**\n * IMPORTANT NOTE ABOUT CSS ANIMATION PROPERTIES (keanulee):\n *\n * iOS Safari (tested on iOS 8.1) does not handle animation-delay very well - it doesn't\n * guarantee that the animation will start _exactly_ after that value. So we avoid using\n * animation-delay and instead set custom keyframes for each color (as redundant as it\n * seems).\n *\n * We write out each animation in full (instead of separating animation-name,\n * animation-duration, etc.) because under the polyfill, Safari does not recognize those\n * specific properties properly, treats them as -webkit-animation, and overrides the\n * other animation rules. See https://github.com/Polymer/platform/issues/53.\n */\n.active .spinner-layer.spinner-blue {\n  /* durations: 4 * ARCTIME */\n  -webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, blue-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;\n  animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, blue-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;\n}\n\n.active .spinner-layer.spinner-red {\n  /* durations: 4 * ARCTIME */\n  -webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, red-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;\n  animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, red-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;\n}\n\n.active .spinner-layer.spinner-yellow {\n  /* durations: 4 * ARCTIME */\n  -webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, yellow-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;\n  animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, yellow-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;\n}\n\n.active .spinner-layer.spinner-green {\n  /* durations: 4 * ARCTIME */\n  -webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, green-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;\n  animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, green-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;\n}\n\n.active .spinner-layer,\n.active .spinner-layer.spinner-blue-only,\n.active .spinner-layer.spinner-red-only,\n.active .spinner-layer.spinner-yellow-only,\n.active .spinner-layer.spinner-green-only {\n  /* durations: 4 * ARCTIME */\n  opacity: 1;\n  -webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;\n  animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;\n}\n\n@-webkit-keyframes fill-unfill-rotate {\n  12.5% {\n    -webkit-transform: rotate(135deg);\n  }\n  /* 0.5 * ARCSIZE */\n  25% {\n    -webkit-transform: rotate(270deg);\n  }\n  /* 1   * ARCSIZE */\n  37.5% {\n    -webkit-transform: rotate(405deg);\n  }\n  /* 1.5 * ARCSIZE */\n  50% {\n    -webkit-transform: rotate(540deg);\n  }\n  /* 2   * ARCSIZE */\n  62.5% {\n    -webkit-transform: rotate(675deg);\n  }\n  /* 2.5 * ARCSIZE */\n  75% {\n    -webkit-transform: rotate(810deg);\n  }\n  /* 3   * ARCSIZE */\n  87.5% {\n    -webkit-transform: rotate(945deg);\n  }\n  /* 3.5 * ARCSIZE */\n  to {\n    -webkit-transform: rotate(1080deg);\n  }\n  /* 4   * ARCSIZE */\n}\n\n@keyframes fill-unfill-rotate {\n  12.5% {\n    transform: rotate(135deg);\n  }\n  /* 0.5 * ARCSIZE */\n  25% {\n    transform: rotate(270deg);\n  }\n  /* 1   * ARCSIZE */\n  37.5% {\n    transform: rotate(405deg);\n  }\n  /* 1.5 * ARCSIZE */\n  50% {\n    transform: rotate(540deg);\n  }\n  /* 2   * ARCSIZE */\n  62.5% {\n    transform: rotate(675deg);\n  }\n  /* 2.5 * ARCSIZE */\n  75% {\n    transform: rotate(810deg);\n  }\n  /* 3   * ARCSIZE */\n  87.5% {\n    transform: rotate(945deg);\n  }\n  /* 3.5 * ARCSIZE */\n  to {\n    transform: rotate(1080deg);\n  }\n  /* 4   * ARCSIZE */\n}\n\n@-webkit-keyframes blue-fade-in-out {\n  from {\n    opacity: 1;\n  }\n  25% {\n    opacity: 1;\n  }\n  26% {\n    opacity: 0;\n  }\n  89% {\n    opacity: 0;\n  }\n  90% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 1;\n  }\n}\n\n@keyframes blue-fade-in-out {\n  from {\n    opacity: 1;\n  }\n  25% {\n    opacity: 1;\n  }\n  26% {\n    opacity: 0;\n  }\n  89% {\n    opacity: 0;\n  }\n  90% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 1;\n  }\n}\n\n@-webkit-keyframes red-fade-in-out {\n  from {\n    opacity: 0;\n  }\n  15% {\n    opacity: 0;\n  }\n  25% {\n    opacity: 1;\n  }\n  50% {\n    opacity: 1;\n  }\n  51% {\n    opacity: 0;\n  }\n}\n\n@keyframes red-fade-in-out {\n  from {\n    opacity: 0;\n  }\n  15% {\n    opacity: 0;\n  }\n  25% {\n    opacity: 1;\n  }\n  50% {\n    opacity: 1;\n  }\n  51% {\n    opacity: 0;\n  }\n}\n\n@-webkit-keyframes yellow-fade-in-out {\n  from {\n    opacity: 0;\n  }\n  40% {\n    opacity: 0;\n  }\n  50% {\n    opacity: 1;\n  }\n  75% {\n    opacity: 1;\n  }\n  76% {\n    opacity: 0;\n  }\n}\n\n@keyframes yellow-fade-in-out {\n  from {\n    opacity: 0;\n  }\n  40% {\n    opacity: 0;\n  }\n  50% {\n    opacity: 1;\n  }\n  75% {\n    opacity: 1;\n  }\n  76% {\n    opacity: 0;\n  }\n}\n\n@-webkit-keyframes green-fade-in-out {\n  from {\n    opacity: 0;\n  }\n  65% {\n    opacity: 0;\n  }\n  75% {\n    opacity: 1;\n  }\n  90% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n  }\n}\n\n@keyframes green-fade-in-out {\n  from {\n    opacity: 0;\n  }\n  65% {\n    opacity: 0;\n  }\n  75% {\n    opacity: 1;\n  }\n  90% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n  }\n}\n\n/**\n * Patch the gap that appear between the two adjacent div.circle-clipper while the\n * spinner is rotating (appears on Chrome 38, Safari 7.1, and IE 11).\n */\n.gap-patch {\n  position: absolute;\n  top: 0;\n  left: 45%;\n  width: 10%;\n  height: 100%;\n  overflow: hidden;\n  border-color: inherit;\n}\n\n.gap-patch .circle {\n  width: 1000%;\n  left: -450%;\n}\n\n.circle-clipper {\n  display: inline-block;\n  position: relative;\n  width: 50%;\n  height: 100%;\n  overflow: hidden;\n  border-color: inherit;\n}\n\n.circle-clipper .circle {\n  width: 200%;\n  height: 100%;\n  border-width: 3px;\n  /* STROKEWIDTH */\n  border-style: solid;\n  border-color: inherit;\n  border-bottom-color: transparent !important;\n  border-radius: 50%;\n  -webkit-animation: none;\n  animation: none;\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n}\n\n.circle-clipper.left .circle {\n  left: 0;\n  border-right-color: transparent !important;\n  -webkit-transform: rotate(129deg);\n  transform: rotate(129deg);\n}\n\n.circle-clipper.right .circle {\n  left: -100%;\n  border-left-color: transparent !important;\n  -webkit-transform: rotate(-129deg);\n  transform: rotate(-129deg);\n}\n\n.active .circle-clipper.left .circle {\n  /* duration: ARCTIME */\n  -webkit-animation: left-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;\n  animation: left-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;\n}\n\n.active .circle-clipper.right .circle {\n  /* duration: ARCTIME */\n  -webkit-animation: right-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;\n  animation: right-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;\n}\n\n@-webkit-keyframes left-spin {\n  from {\n    -webkit-transform: rotate(130deg);\n  }\n  50% {\n    -webkit-transform: rotate(-5deg);\n  }\n  to {\n    -webkit-transform: rotate(130deg);\n  }\n}\n\n@keyframes left-spin {\n  from {\n    transform: rotate(130deg);\n  }\n  50% {\n    transform: rotate(-5deg);\n  }\n  to {\n    transform: rotate(130deg);\n  }\n}\n\n@-webkit-keyframes right-spin {\n  from {\n    -webkit-transform: rotate(-130deg);\n  }\n  50% {\n    -webkit-transform: rotate(5deg);\n  }\n  to {\n    -webkit-transform: rotate(-130deg);\n  }\n}\n\n@keyframes right-spin {\n  from {\n    transform: rotate(-130deg);\n  }\n  50% {\n    transform: rotate(5deg);\n  }\n  to {\n    transform: rotate(-130deg);\n  }\n}\n\n#spinnerContainer.cooldown {\n  /* duration: SHRINK_TIME */\n  -webkit-animation: container-rotate 1568ms linear infinite, fade-out 400ms cubic-bezier(0.4, 0, 0.2, 1);\n  animation: container-rotate 1568ms linear infinite, fade-out 400ms cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n@-webkit-keyframes fade-out {\n  from {\n    opacity: 1;\n  }\n  to {\n    opacity: 0;\n  }\n}\n\n@keyframes fade-out {\n  from {\n    opacity: 1;\n  }\n  to {\n    opacity: 0;\n  }\n}\n\n.slider {\n  position: relative;\n  height: 400px;\n  width: 100%;\n}\n\n.slider.fullscreen {\n  height: 100%;\n  width: 100%;\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n}\n\n.slider.fullscreen ul.slides {\n  height: 100%;\n}\n\n.slider.fullscreen ul.indicators {\n  z-index: 2;\n  bottom: 30px;\n}\n\n.slider .slides {\n  background-color: #9e9e9e;\n  margin: 0;\n  height: 400px;\n}\n\n.slider .slides li {\n  opacity: 0;\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1;\n  width: 100%;\n  height: inherit;\n  overflow: hidden;\n}\n\n.slider .slides li img {\n  height: 100%;\n  width: 100%;\n  background-size: cover;\n  background-position: center;\n}\n\n.slider .slides li .caption {\n  color: #fff;\n  position: absolute;\n  top: 15%;\n  left: 15%;\n  width: 70%;\n  opacity: 0;\n}\n\n.slider .slides li .caption p {\n  color: #e0e0e0;\n}\n\n.slider .slides li.active {\n  z-index: 2;\n}\n\n.slider .indicators {\n  position: absolute;\n  text-align: center;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  margin: 0;\n}\n\n.slider .indicators .indicator-item {\n  display: inline-block;\n  position: relative;\n  cursor: pointer;\n  height: 16px;\n  width: 16px;\n  margin: 0 12px;\n  background-color: #e0e0e0;\n  transition: background-color .3s;\n  border-radius: 50%;\n}\n\n.slider .indicators .indicator-item.active {\n  background-color: #4CAF50;\n}\n\n.carousel {\n  overflow: hidden;\n  position: relative;\n  width: 100%;\n  height: 400px;\n  perspective: 500px;\n  transform-style: preserve-3d;\n  transform-origin: 0% 50%;\n}\n\n.carousel .carousel-item {\n  width: 200px;\n  position: absolute;\n  top: 0;\n  left: 0;\n}\n\n.carousel .carousel-item img {\n  width: 100%;\n}\n\n.carousel.carousel-slider {\n  top: 0;\n  left: 0;\n  height: 0;\n}\n\n.carousel.carousel-slider .carousel-item {\n  width: 100%;\n  height: 100%;\n  position: absolute;\n  top: 0;\n  left: 0;\n}\n\n/* ==========================================================================\n   $BASE-PICKER\n   ========================================================================== */\n/**\n * Note: the root picker element should *NOT* be styled more than what's here.\n */\n.picker {\n  font-size: 16px;\n  text-align: left;\n  line-height: 1.2;\n  color: #000000;\n  position: absolute;\n  z-index: 10000;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n\n/**\n * The picker input element.\n */\n.picker__input {\n  cursor: default;\n}\n\n/**\n * When the picker is opened, the input element is \"activated\".\n */\n.picker__input.picker__input--active {\n  border-color: #0089ec;\n}\n\n/**\n * The holder is the only \"scrollable\" top-level container element.\n */\n.picker__holder {\n  width: 100%;\n  overflow-y: auto;\n  -webkit-overflow-scrolling: touch;\n}\n\n/*!\n * Default mobile-first, responsive styling for pickadate.js\n * Demo: http://amsul.github.io/pickadate.js\n */\n/**\n * Note: the root picker element should *NOT* be styled more than what's here.\n */\n/**\n * Make the holder and frame fullscreen.\n */\n.picker__holder,\n.picker__frame {\n  bottom: 0;\n  left: 0;\n  right: 0;\n  top: 100%;\n}\n\n/**\n * The holder should overlay the entire screen.\n */\n.picker__holder {\n  position: fixed;\n  -webkit-transition: background 0.15s ease-out, top 0s 0.15s;\n  -moz-transition: background 0.15s ease-out, top 0s 0.15s;\n  transition: background 0.15s ease-out, top 0s 0.15s;\n  -webkit-backface-visibility: hidden;\n}\n\n/**\n * The frame that bounds the box contents of the picker.\n */\n.picker__frame {\n  position: absolute;\n  margin: 0 auto;\n  min-width: 256px;\n  width: 300px;\n  max-height: 350px;\n  -ms-filter: \"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)\";\n  filter: alpha(opacity=0);\n  -moz-opacity: 0;\n  opacity: 0;\n  -webkit-transition: all 0.15s ease-out;\n  -moz-transition: all 0.15s ease-out;\n  transition: all 0.15s ease-out;\n}\n\n@media (min-height: 28.875em) {\n  .picker__frame {\n    overflow: visible;\n    top: auto;\n    bottom: -100%;\n    max-height: 80%;\n  }\n}\n\n@media (min-height: 40.125em) {\n  .picker__frame {\n    margin-bottom: 7.5%;\n  }\n}\n\n/**\n * The wrapper sets the stage to vertically align the box contents.\n */\n.picker__wrap {\n  display: table;\n  width: 100%;\n  height: 100%;\n}\n\n@media (min-height: 28.875em) {\n  .picker__wrap {\n    display: block;\n  }\n}\n\n/**\n * The box contains all the picker contents.\n */\n.picker__box {\n  background: #ffffff;\n  display: table-cell;\n  vertical-align: middle;\n}\n\n@media (min-height: 28.875em) {\n  .picker__box {\n    display: block;\n    border: 1px solid #777777;\n    border-top-color: #898989;\n    border-bottom-width: 0;\n    -webkit-border-radius: 5px 5px 0 0;\n    -moz-border-radius: 5px 5px 0 0;\n    border-radius: 5px 5px 0 0;\n    -webkit-box-shadow: 0 12px 36px 16px rgba(0, 0, 0, 0.24);\n    -moz-box-shadow: 0 12px 36px 16px rgba(0, 0, 0, 0.24);\n    box-shadow: 0 12px 36px 16px rgba(0, 0, 0, 0.24);\n  }\n}\n\n/**\n * When the picker opens...\n */\n.picker--opened .picker__holder {\n  top: 0;\n  background: transparent;\n  -ms-filter: \"progid:DXImageTransform.Microsoft.gradient(startColorstr=#1E000000,endColorstr=#1E000000)\";\n  zoom: 1;\n  background: rgba(0, 0, 0, 0.32);\n  -webkit-transition: background 0.15s ease-out;\n  -moz-transition: background 0.15s ease-out;\n  transition: background 0.15s ease-out;\n}\n\n.picker--opened .picker__frame {\n  top: 0;\n  -ms-filter: \"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)\";\n  filter: alpha(opacity=100);\n  -moz-opacity: 1;\n  opacity: 1;\n}\n\n@media (min-height: 35.875em) {\n  .picker--opened .picker__frame {\n    top: 10%;\n    bottom: 20%auto;\n  }\n}\n\n/**\n * For `large` screens, transform into an inline picker.\n */\n/* ==========================================================================\n   CUSTOM MATERIALIZE STYLES\n   ========================================================================== */\n.picker__input.picker__input--active {\n  border-color: #E3F2FD;\n}\n\n.picker__frame {\n  margin: 0 auto;\n  max-width: 325px;\n}\n\n@media (min-height: 38.875em) {\n  .picker--opened .picker__frame {\n    top: 10%;\n    bottom: auto;\n  }\n}\n\n/* ==========================================================================\n   $BASE-DATE-PICKER\n   ========================================================================== */\n/**\n * The picker box.\n */\n.picker__box {\n  padding: 0 1em;\n}\n\n/**\n * The header containing the month and year stuff.\n */\n.picker__header {\n  text-align: center;\n  position: relative;\n  margin-top: .75em;\n}\n\n/**\n * The month and year labels.\n */\n.picker__month,\n.picker__year {\n  display: inline-block;\n  margin-left: .25em;\n  margin-right: .25em;\n}\n\n/**\n * The month and year selectors.\n */\n.picker__select--month,\n.picker__select--year {\n  height: 2em;\n  padding: 0;\n  margin-left: .25em;\n  margin-right: .25em;\n}\n\n.picker__select--month.browser-default {\n  display: inline;\n  background-color: #FFFFFF;\n  width: 40%;\n}\n\n.picker__select--year.browser-default {\n  display: inline;\n  background-color: #FFFFFF;\n  width: 25%;\n}\n\n.picker__select--month:focus,\n.picker__select--year:focus {\n  border-color: rgba(0, 0, 0, 0.05);\n}\n\n/**\n * The month navigation buttons.\n */\n.picker__nav--prev,\n.picker__nav--next {\n  position: absolute;\n  padding: .5em 1.25em;\n  width: 1em;\n  height: 1em;\n  box-sizing: content-box;\n  top: -0.25em;\n}\n\n.picker__nav--prev {\n  left: -1em;\n  padding-right: 1.25em;\n}\n\n.picker__nav--next {\n  right: -1em;\n  padding-left: 1.25em;\n}\n\n.picker__nav--disabled,\n.picker__nav--disabled:hover,\n.picker__nav--disabled:before,\n.picker__nav--disabled:before:hover {\n  cursor: default;\n  background: none;\n  border-right-color: #f5f5f5;\n  border-left-color: #f5f5f5;\n}\n\n/**\n * The calendar table of dates\n */\n.picker__table {\n  text-align: center;\n  border-collapse: collapse;\n  border-spacing: 0;\n  table-layout: fixed;\n  font-size: 1rem;\n  width: 100%;\n  margin-top: .75em;\n  margin-bottom: .5em;\n}\n\n.picker__table th, .picker__table td {\n  text-align: center;\n}\n\n.picker__table td {\n  margin: 0;\n  padding: 0;\n}\n\n/**\n * The weekday labels\n */\n.picker__weekday {\n  width: 14.285714286%;\n  font-size: .75em;\n  padding-bottom: .25em;\n  color: #999999;\n  font-weight: 500;\n  /* Increase the spacing a tad */\n}\n\n@media (min-height: 33.875em) {\n  .picker__weekday {\n    padding-bottom: .5em;\n  }\n}\n\n/**\n * The days on the calendar\n */\n.picker__day--today {\n  position: relative;\n  color: #595959;\n  letter-spacing: -.3;\n  padding: .75rem 0;\n  font-weight: 400;\n  border: 1px solid transparent;\n}\n\n.picker__day--disabled:before {\n  border-top-color: #aaaaaa;\n}\n\n.picker__day--infocus:hover {\n  cursor: pointer;\n  color: #000;\n  font-weight: 500;\n}\n\n.picker__day--outfocus {\n  display: none;\n  padding: .75rem 0;\n  color: #fff;\n}\n\n.picker__day--outfocus:hover {\n  cursor: pointer;\n  color: #dddddd;\n  font-weight: 500;\n}\n\n.picker__day--highlighted:hover,\n.picker--focused .picker__day--highlighted {\n  cursor: pointer;\n}\n\n.picker__day--selected,\n.picker__day--selected:hover,\n.picker--focused .picker__day--selected {\n  border-radius: 50%;\n  transform: scale(0.75);\n  background: #0089ec;\n  color: #ffffff;\n}\n\n.picker__day--disabled,\n.picker__day--disabled:hover,\n.picker--focused .picker__day--disabled {\n  background: #f5f5f5;\n  border-color: #f5f5f5;\n  color: #dddddd;\n  cursor: default;\n}\n\n.picker__day--highlighted.picker__day--disabled,\n.picker__day--highlighted.picker__day--disabled:hover {\n  background: #bbbbbb;\n}\n\n/**\n * The footer containing the \"today\", \"clear\", and \"close\" buttons.\n */\n.picker__footer {\n  text-align: center;\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n}\n\n.picker__button--today,\n.picker__button--clear,\n.picker__button--close {\n  border: 1px solid #ffffff;\n  background: #ffffff;\n  font-size: .8em;\n  padding: .66em 0;\n  font-weight: bold;\n  width: 33%;\n  display: inline-block;\n  vertical-align: bottom;\n}\n\n.picker__button--today:hover,\n.picker__button--clear:hover,\n.picker__button--close:hover {\n  cursor: pointer;\n  color: #000000;\n  background: #b1dcfb;\n  border-bottom-color: #b1dcfb;\n}\n\n.picker__button--today:focus,\n.picker__button--clear:focus,\n.picker__button--close:focus {\n  background: #b1dcfb;\n  border-color: rgba(0, 0, 0, 0.05);\n  outline: none;\n}\n\n.picker__button--today:before,\n.picker__button--clear:before,\n.picker__button--close:before {\n  position: relative;\n  display: inline-block;\n  height: 0;\n}\n\n.picker__button--today:before,\n.picker__button--clear:before {\n  content: \" \";\n  margin-right: .45em;\n}\n\n.picker__button--today:before {\n  top: -0.05em;\n  width: 0;\n  border-top: 0.66em solid #0059bc;\n  border-left: .66em solid transparent;\n}\n\n.picker__button--clear:before {\n  top: -0.25em;\n  width: .66em;\n  border-top: 3px solid #ee2200;\n}\n\n.picker__button--close:before {\n  content: \"\\D7\";\n  top: -0.1em;\n  vertical-align: top;\n  font-size: 1.1em;\n  margin-right: .35em;\n  color: #777777;\n}\n\n.picker__button--today[disabled],\n.picker__button--today[disabled]:hover {\n  background: #f5f5f5;\n  border-color: #f5f5f5;\n  color: #dddddd;\n  cursor: default;\n}\n\n.picker__button--today[disabled]:before {\n  border-top-color: #aaaaaa;\n}\n\n/* ==========================================================================\n   CUSTOM MATERIALIZE STYLES\n   ========================================================================== */\n.picker__box {\n  border-radius: 2px;\n  overflow: hidden;\n}\n\n.picker__date-display {\n  text-align: center;\n  background-color: #26a69a;\n  color: #fff;\n  padding-bottom: 15px;\n  font-weight: 300;\n}\n\n.picker__nav--prev:hover,\n.picker__nav--next:hover {\n  cursor: pointer;\n  color: #000000;\n  background: #a1ded8;\n}\n\n.picker__weekday-display {\n  background-color: #1f897f;\n  padding: 10px;\n  font-weight: 200;\n  letter-spacing: .5;\n  font-size: 1rem;\n  margin-bottom: 15px;\n}\n\n.picker__month-display {\n  text-transform: uppercase;\n  font-size: 2rem;\n}\n\n.picker__day-display {\n  font-size: 4.5rem;\n  font-weight: 400;\n}\n\n.picker__year-display {\n  font-size: 1.8rem;\n  color: rgba(255, 255, 255, 0.4);\n}\n\n.picker__box {\n  padding: 0;\n}\n\n.picker__calendar-container {\n  padding: 0 1rem;\n}\n\n.picker__calendar-container thead {\n  border: none;\n}\n\n.picker__table {\n  margin-top: 0;\n  margin-bottom: .5em;\n}\n\n.picker__day--infocus {\n  color: #595959;\n  letter-spacing: -.3;\n  padding: .75rem 0;\n  font-weight: 400;\n  border: 1px solid transparent;\n}\n\n.picker__day.picker__day--today {\n  color: #26a69a;\n}\n\n.picker__day.picker__day--today.picker__day--selected {\n  color: #fff;\n}\n\n.picker__weekday {\n  font-size: .9rem;\n}\n\n.picker__day--selected,\n.picker__day--selected:hover,\n.picker--focused .picker__day--selected {\n  border-radius: 50%;\n  transform: scale(0.9);\n  background-color: #26a69a;\n  color: #ffffff;\n}\n\n.picker__day--selected.picker__day--outfocus,\n.picker__day--selected:hover.picker__day--outfocus,\n.picker--focused .picker__day--selected.picker__day--outfocus {\n  background-color: #a1ded8;\n}\n\n.picker__footer {\n  text-align: right;\n  padding: 5px 10px;\n}\n\n.picker__close, .picker__today {\n  font-size: 1.1rem;\n  padding: 0 1rem;\n  color: #26a69a;\n}\n\n.picker__nav--prev:before,\n.picker__nav--next:before {\n  content: \" \";\n  border-top: .5em solid transparent;\n  border-bottom: .5em solid transparent;\n  border-right: 0.75em solid #676767;\n  width: 0;\n  height: 0;\n  display: block;\n  margin: 0 auto;\n}\n\n.picker__nav--next:before {\n  border-right: 0;\n  border-left: 0.75em solid #676767;\n}\n\nbutton.picker__today:focus, button.picker__clear:focus, button.picker__close:focus {\n  background-color: #a1ded8;\n}\n\n/* ==========================================================================\n   $BASE-TIME-PICKER\n   ========================================================================== */\n/**\n * The list of times.\n */\n.picker__list {\n  list-style: none;\n  padding: 0.75em 0 4.2em;\n  margin: 0;\n}\n\n/**\n * The times on the clock.\n */\n.picker__list-item {\n  border-bottom: 1px solid #dddddd;\n  border-top: 1px solid #dddddd;\n  margin-bottom: -1px;\n  position: relative;\n  background: #ffffff;\n  padding: .75em 1.25em;\n}\n\n@media (min-height: 46.75em) {\n  .picker__list-item {\n    padding: .5em 1em;\n  }\n}\n\n/* Hovered time */\n.picker__list-item:hover {\n  cursor: pointer;\n  color: #000000;\n  background: #b1dcfb;\n  border-color: #0089ec;\n  z-index: 10;\n}\n\n/* Highlighted and hovered/focused time */\n.picker__list-item--highlighted {\n  border-color: #0089ec;\n  z-index: 10;\n}\n\n.picker__list-item--highlighted:hover,\n.picker--focused .picker__list-item--highlighted {\n  cursor: pointer;\n  color: #000000;\n  background: #b1dcfb;\n}\n\n/* Selected and hovered/focused time */\n.picker__list-item--selected,\n.picker__list-item--selected:hover,\n.picker--focused .picker__list-item--selected {\n  background: #0089ec;\n  color: #ffffff;\n  z-index: 10;\n}\n\n/* Disabled time */\n.picker__list-item--disabled,\n.picker__list-item--disabled:hover,\n.picker--focused .picker__list-item--disabled {\n  background: #f5f5f5;\n  border-color: #f5f5f5;\n  color: #dddddd;\n  cursor: default;\n  border-color: #dddddd;\n  z-index: auto;\n}\n\n/**\n * The clear button\n */\n.picker--time .picker__button--clear {\n  display: block;\n  width: 80%;\n  margin: 1em auto 0;\n  padding: 1em 1.25em;\n  background: none;\n  border: 0;\n  font-weight: 500;\n  font-size: .67em;\n  text-align: center;\n  text-transform: uppercase;\n  color: #666;\n}\n\n.picker--time .picker__button--clear:hover,\n.picker--time .picker__button--clear:focus {\n  color: #000000;\n  background: #b1dcfb;\n  background: #ee2200;\n  border-color: #ee2200;\n  cursor: pointer;\n  color: #ffffff;\n  outline: none;\n}\n\n.picker--time .picker__button--clear:before {\n  top: -0.25em;\n  color: #666;\n  font-size: 1.25em;\n  font-weight: bold;\n}\n\n.picker--time .picker__button--clear:hover:before,\n.picker--time .picker__button--clear:focus:before {\n  color: #ffffff;\n}\n\n/* ==========================================================================\n   $DEFAULT-TIME-PICKER\n   ========================================================================== */\n/**\n * The frame the bounds the time picker.\n */\n.picker--time .picker__frame {\n  min-width: 256px;\n  max-width: 320px;\n}\n\n/**\n * The picker box.\n */\n.picker--time .picker__box {\n  font-size: 1em;\n  background: #f2f2f2;\n  padding: 0;\n}\n\n@media (min-height: 40.125em) {\n  .picker--time .picker__box {\n    margin-bottom: 5em;\n  }\n}\n"
  },
  {
    "path": "themes/default/public/css/materialize.min.css",
    "content": ".materialize-red.lighten-5{background-color:#fdeaeb !important}.materialize-red-text.text-lighten-5{color:#fdeaeb !important}.materialize-red.lighten-4{background-color:#f8c1c3 !important}.materialize-red-text.text-lighten-4{color:#f8c1c3 !important}.materialize-red.lighten-3{background-color:#f3989b !important}.materialize-red-text.text-lighten-3{color:#f3989b !important}.materialize-red.lighten-2{background-color:#ee6e73 !important}.materialize-red-text.text-lighten-2{color:#ee6e73 !important}.materialize-red.lighten-1{background-color:#ea454b !important}.materialize-red-text.text-lighten-1{color:#ea454b !important}.materialize-red{background-color:#e51c23 !important}.materialize-red-text{color:#e51c23 !important}.materialize-red.darken-1{background-color:#d0181e !important}.materialize-red-text.text-darken-1{color:#d0181e !important}.materialize-red.darken-2{background-color:#b9151b !important}.materialize-red-text.text-darken-2{color:#b9151b !important}.materialize-red.darken-3{background-color:#a21318 !important}.materialize-red-text.text-darken-3{color:#a21318 !important}.materialize-red.darken-4{background-color:#8b1014 !important}.materialize-red-text.text-darken-4{color:#8b1014 !important}.red.lighten-5{background-color:#FFEBEE !important}.red-text.text-lighten-5{color:#FFEBEE !important}.red.lighten-4{background-color:#FFCDD2 !important}.red-text.text-lighten-4{color:#FFCDD2 !important}.red.lighten-3{background-color:#EF9A9A !important}.red-text.text-lighten-3{color:#EF9A9A !important}.red.lighten-2{background-color:#E57373 !important}.red-text.text-lighten-2{color:#E57373 !important}.red.lighten-1{background-color:#EF5350 !important}.red-text.text-lighten-1{color:#EF5350 !important}.red{background-color:#F44336 !important}.red-text{color:#F44336 !important}.red.darken-1{background-color:#E53935 !important}.red-text.text-darken-1{color:#E53935 !important}.red.darken-2{background-color:#D32F2F !important}.red-text.text-darken-2{color:#D32F2F !important}.red.darken-3{background-color:#C62828 !important}.red-text.text-darken-3{color:#C62828 !important}.red.darken-4{background-color:#B71C1C !important}.red-text.text-darken-4{color:#B71C1C !important}.red.accent-1{background-color:#FF8A80 !important}.red-text.text-accent-1{color:#FF8A80 !important}.red.accent-2{background-color:#FF5252 !important}.red-text.text-accent-2{color:#FF5252 !important}.red.accent-3{background-color:#FF1744 !important}.red-text.text-accent-3{color:#FF1744 !important}.red.accent-4{background-color:#D50000 !important}.red-text.text-accent-4{color:#D50000 !important}.pink.lighten-5{background-color:#fce4ec !important}.pink-text.text-lighten-5{color:#fce4ec !important}.pink.lighten-4{background-color:#f8bbd0 !important}.pink-text.text-lighten-4{color:#f8bbd0 !important}.pink.lighten-3{background-color:#f48fb1 !important}.pink-text.text-lighten-3{color:#f48fb1 !important}.pink.lighten-2{background-color:#f06292 !important}.pink-text.text-lighten-2{color:#f06292 !important}.pink.lighten-1{background-color:#ec407a !important}.pink-text.text-lighten-1{color:#ec407a !important}.pink{background-color:#e91e63 !important}.pink-text{color:#e91e63 !important}.pink.darken-1{background-color:#d81b60 !important}.pink-text.text-darken-1{color:#d81b60 !important}.pink.darken-2{background-color:#c2185b !important}.pink-text.text-darken-2{color:#c2185b !important}.pink.darken-3{background-color:#ad1457 !important}.pink-text.text-darken-3{color:#ad1457 !important}.pink.darken-4{background-color:#880e4f !important}.pink-text.text-darken-4{color:#880e4f !important}.pink.accent-1{background-color:#ff80ab !important}.pink-text.text-accent-1{color:#ff80ab !important}.pink.accent-2{background-color:#ff4081 !important}.pink-text.text-accent-2{color:#ff4081 !important}.pink.accent-3{background-color:#f50057 !important}.pink-text.text-accent-3{color:#f50057 !important}.pink.accent-4{background-color:#c51162 !important}.pink-text.text-accent-4{color:#c51162 !important}.purple.lighten-5{background-color:#f3e5f5 !important}.purple-text.text-lighten-5{color:#f3e5f5 !important}.purple.lighten-4{background-color:#e1bee7 !important}.purple-text.text-lighten-4{color:#e1bee7 !important}.purple.lighten-3{background-color:#ce93d8 !important}.purple-text.text-lighten-3{color:#ce93d8 !important}.purple.lighten-2{background-color:#ba68c8 !important}.purple-text.text-lighten-2{color:#ba68c8 !important}.purple.lighten-1{background-color:#ab47bc !important}.purple-text.text-lighten-1{color:#ab47bc !important}.purple{background-color:#9c27b0 !important}.purple-text{color:#9c27b0 !important}.purple.darken-1{background-color:#8e24aa !important}.purple-text.text-darken-1{color:#8e24aa !important}.purple.darken-2{background-color:#7b1fa2 !important}.purple-text.text-darken-2{color:#7b1fa2 !important}.purple.darken-3{background-color:#6a1b9a !important}.purple-text.text-darken-3{color:#6a1b9a !important}.purple.darken-4{background-color:#4a148c !important}.purple-text.text-darken-4{color:#4a148c !important}.purple.accent-1{background-color:#ea80fc !important}.purple-text.text-accent-1{color:#ea80fc !important}.purple.accent-2{background-color:#e040fb !important}.purple-text.text-accent-2{color:#e040fb !important}.purple.accent-3{background-color:#d500f9 !important}.purple-text.text-accent-3{color:#d500f9 !important}.purple.accent-4{background-color:#a0f !important}.purple-text.text-accent-4{color:#a0f !important}.deep-purple.lighten-5{background-color:#ede7f6 !important}.deep-purple-text.text-lighten-5{color:#ede7f6 !important}.deep-purple.lighten-4{background-color:#d1c4e9 !important}.deep-purple-text.text-lighten-4{color:#d1c4e9 !important}.deep-purple.lighten-3{background-color:#b39ddb !important}.deep-purple-text.text-lighten-3{color:#b39ddb !important}.deep-purple.lighten-2{background-color:#9575cd !important}.deep-purple-text.text-lighten-2{color:#9575cd !important}.deep-purple.lighten-1{background-color:#7e57c2 !important}.deep-purple-text.text-lighten-1{color:#7e57c2 !important}.deep-purple{background-color:#673ab7 !important}.deep-purple-text{color:#673ab7 !important}.deep-purple.darken-1{background-color:#5e35b1 !important}.deep-purple-text.text-darken-1{color:#5e35b1 !important}.deep-purple.darken-2{background-color:#512da8 !important}.deep-purple-text.text-darken-2{color:#512da8 !important}.deep-purple.darken-3{background-color:#4527a0 !important}.deep-purple-text.text-darken-3{color:#4527a0 !important}.deep-purple.darken-4{background-color:#311b92 !important}.deep-purple-text.text-darken-4{color:#311b92 !important}.deep-purple.accent-1{background-color:#b388ff !important}.deep-purple-text.text-accent-1{color:#b388ff !important}.deep-purple.accent-2{background-color:#7c4dff !important}.deep-purple-text.text-accent-2{color:#7c4dff !important}.deep-purple.accent-3{background-color:#651fff !important}.deep-purple-text.text-accent-3{color:#651fff !important}.deep-purple.accent-4{background-color:#6200ea !important}.deep-purple-text.text-accent-4{color:#6200ea !important}.indigo.lighten-5{background-color:#e8eaf6 !important}.indigo-text.text-lighten-5{color:#e8eaf6 !important}.indigo.lighten-4{background-color:#c5cae9 !important}.indigo-text.text-lighten-4{color:#c5cae9 !important}.indigo.lighten-3{background-color:#9fa8da !important}.indigo-text.text-lighten-3{color:#9fa8da !important}.indigo.lighten-2{background-color:#7986cb !important}.indigo-text.text-lighten-2{color:#7986cb !important}.indigo.lighten-1{background-color:#5c6bc0 !important}.indigo-text.text-lighten-1{color:#5c6bc0 !important}.indigo{background-color:#3f51b5 !important}.indigo-text{color:#3f51b5 !important}.indigo.darken-1{background-color:#3949ab !important}.indigo-text.text-darken-1{color:#3949ab !important}.indigo.darken-2{background-color:#303f9f !important}.indigo-text.text-darken-2{color:#303f9f !important}.indigo.darken-3{background-color:#283593 !important}.indigo-text.text-darken-3{color:#283593 !important}.indigo.darken-4{background-color:#1a237e !important}.indigo-text.text-darken-4{color:#1a237e !important}.indigo.accent-1{background-color:#8c9eff !important}.indigo-text.text-accent-1{color:#8c9eff !important}.indigo.accent-2{background-color:#536dfe !important}.indigo-text.text-accent-2{color:#536dfe !important}.indigo.accent-3{background-color:#3d5afe !important}.indigo-text.text-accent-3{color:#3d5afe !important}.indigo.accent-4{background-color:#304ffe !important}.indigo-text.text-accent-4{color:#304ffe !important}.blue.lighten-5{background-color:#E3F2FD !important}.blue-text.text-lighten-5{color:#E3F2FD !important}.blue.lighten-4{background-color:#BBDEFB !important}.blue-text.text-lighten-4{color:#BBDEFB !important}.blue.lighten-3{background-color:#90CAF9 !important}.blue-text.text-lighten-3{color:#90CAF9 !important}.blue.lighten-2{background-color:#64B5F6 !important}.blue-text.text-lighten-2{color:#64B5F6 !important}.blue.lighten-1{background-color:#42A5F5 !important}.blue-text.text-lighten-1{color:#42A5F5 !important}.blue{background-color:#2196F3 !important}.blue-text{color:#2196F3 !important}.blue.darken-1{background-color:#1E88E5 !important}.blue-text.text-darken-1{color:#1E88E5 !important}.blue.darken-2{background-color:#1976D2 !important}.blue-text.text-darken-2{color:#1976D2 !important}.blue.darken-3{background-color:#1565C0 !important}.blue-text.text-darken-3{color:#1565C0 !important}.blue.darken-4{background-color:#0D47A1 !important}.blue-text.text-darken-4{color:#0D47A1 !important}.blue.accent-1{background-color:#82B1FF !important}.blue-text.text-accent-1{color:#82B1FF !important}.blue.accent-2{background-color:#448AFF !important}.blue-text.text-accent-2{color:#448AFF !important}.blue.accent-3{background-color:#2979FF !important}.blue-text.text-accent-3{color:#2979FF !important}.blue.accent-4{background-color:#2962FF !important}.blue-text.text-accent-4{color:#2962FF !important}.light-blue.lighten-5{background-color:#e1f5fe !important}.light-blue-text.text-lighten-5{color:#e1f5fe !important}.light-blue.lighten-4{background-color:#b3e5fc !important}.light-blue-text.text-lighten-4{color:#b3e5fc !important}.light-blue.lighten-3{background-color:#81d4fa !important}.light-blue-text.text-lighten-3{color:#81d4fa !important}.light-blue.lighten-2{background-color:#4fc3f7 !important}.light-blue-text.text-lighten-2{color:#4fc3f7 !important}.light-blue.lighten-1{background-color:#29b6f6 !important}.light-blue-text.text-lighten-1{color:#29b6f6 !important}.light-blue{background-color:#03a9f4 !important}.light-blue-text{color:#03a9f4 !important}.light-blue.darken-1{background-color:#039be5 !important}.light-blue-text.text-darken-1{color:#039be5 !important}.light-blue.darken-2{background-color:#0288d1 !important}.light-blue-text.text-darken-2{color:#0288d1 !important}.light-blue.darken-3{background-color:#0277bd !important}.light-blue-text.text-darken-3{color:#0277bd !important}.light-blue.darken-4{background-color:#01579b !important}.light-blue-text.text-darken-4{color:#01579b !important}.light-blue.accent-1{background-color:#80d8ff !important}.light-blue-text.text-accent-1{color:#80d8ff !important}.light-blue.accent-2{background-color:#40c4ff !important}.light-blue-text.text-accent-2{color:#40c4ff !important}.light-blue.accent-3{background-color:#00b0ff !important}.light-blue-text.text-accent-3{color:#00b0ff !important}.light-blue.accent-4{background-color:#0091ea !important}.light-blue-text.text-accent-4{color:#0091ea !important}.cyan.lighten-5{background-color:#e0f7fa !important}.cyan-text.text-lighten-5{color:#e0f7fa !important}.cyan.lighten-4{background-color:#b2ebf2 !important}.cyan-text.text-lighten-4{color:#b2ebf2 !important}.cyan.lighten-3{background-color:#80deea !important}.cyan-text.text-lighten-3{color:#80deea !important}.cyan.lighten-2{background-color:#4dd0e1 !important}.cyan-text.text-lighten-2{color:#4dd0e1 !important}.cyan.lighten-1{background-color:#26c6da !important}.cyan-text.text-lighten-1{color:#26c6da !important}.cyan{background-color:#00bcd4 !important}.cyan-text{color:#00bcd4 !important}.cyan.darken-1{background-color:#00acc1 !important}.cyan-text.text-darken-1{color:#00acc1 !important}.cyan.darken-2{background-color:#0097a7 !important}.cyan-text.text-darken-2{color:#0097a7 !important}.cyan.darken-3{background-color:#00838f !important}.cyan-text.text-darken-3{color:#00838f !important}.cyan.darken-4{background-color:#006064 !important}.cyan-text.text-darken-4{color:#006064 !important}.cyan.accent-1{background-color:#84ffff !important}.cyan-text.text-accent-1{color:#84ffff !important}.cyan.accent-2{background-color:#18ffff !important}.cyan-text.text-accent-2{color:#18ffff !important}.cyan.accent-3{background-color:#00e5ff !important}.cyan-text.text-accent-3{color:#00e5ff !important}.cyan.accent-4{background-color:#00b8d4 !important}.cyan-text.text-accent-4{color:#00b8d4 !important}.teal.lighten-5{background-color:#e0f2f1 !important}.teal-text.text-lighten-5{color:#e0f2f1 !important}.teal.lighten-4{background-color:#b2dfdb !important}.teal-text.text-lighten-4{color:#b2dfdb !important}.teal.lighten-3{background-color:#80cbc4 !important}.teal-text.text-lighten-3{color:#80cbc4 !important}.teal.lighten-2{background-color:#4db6ac !important}.teal-text.text-lighten-2{color:#4db6ac !important}.teal.lighten-1{background-color:#26a69a !important}.teal-text.text-lighten-1{color:#26a69a !important}.teal{background-color:#009688 !important}.teal-text{color:#009688 !important}.teal.darken-1{background-color:#00897b !important}.teal-text.text-darken-1{color:#00897b !important}.teal.darken-2{background-color:#00796b !important}.teal-text.text-darken-2{color:#00796b !important}.teal.darken-3{background-color:#00695c !important}.teal-text.text-darken-3{color:#00695c !important}.teal.darken-4{background-color:#004d40 !important}.teal-text.text-darken-4{color:#004d40 !important}.teal.accent-1{background-color:#a7ffeb !important}.teal-text.text-accent-1{color:#a7ffeb !important}.teal.accent-2{background-color:#64ffda !important}.teal-text.text-accent-2{color:#64ffda !important}.teal.accent-3{background-color:#1de9b6 !important}.teal-text.text-accent-3{color:#1de9b6 !important}.teal.accent-4{background-color:#00bfa5 !important}.teal-text.text-accent-4{color:#00bfa5 !important}.green.lighten-5{background-color:#E8F5E9 !important}.green-text.text-lighten-5{color:#E8F5E9 !important}.green.lighten-4{background-color:#C8E6C9 !important}.green-text.text-lighten-4{color:#C8E6C9 !important}.green.lighten-3{background-color:#A5D6A7 !important}.green-text.text-lighten-3{color:#A5D6A7 !important}.green.lighten-2{background-color:#81C784 !important}.green-text.text-lighten-2{color:#81C784 !important}.green.lighten-1{background-color:#66BB6A !important}.green-text.text-lighten-1{color:#66BB6A !important}.green{background-color:#4CAF50 !important}.green-text{color:#4CAF50 !important}.green.darken-1{background-color:#43A047 !important}.green-text.text-darken-1{color:#43A047 !important}.green.darken-2{background-color:#388E3C !important}.green-text.text-darken-2{color:#388E3C !important}.green.darken-3{background-color:#2E7D32 !important}.green-text.text-darken-3{color:#2E7D32 !important}.green.darken-4{background-color:#1B5E20 !important}.green-text.text-darken-4{color:#1B5E20 !important}.green.accent-1{background-color:#B9F6CA !important}.green-text.text-accent-1{color:#B9F6CA !important}.green.accent-2{background-color:#69F0AE !important}.green-text.text-accent-2{color:#69F0AE !important}.green.accent-3{background-color:#00E676 !important}.green-text.text-accent-3{color:#00E676 !important}.green.accent-4{background-color:#00C853 !important}.green-text.text-accent-4{color:#00C853 !important}.light-green.lighten-5{background-color:#f1f8e9 !important}.light-green-text.text-lighten-5{color:#f1f8e9 !important}.light-green.lighten-4{background-color:#dcedc8 !important}.light-green-text.text-lighten-4{color:#dcedc8 !important}.light-green.lighten-3{background-color:#c5e1a5 !important}.light-green-text.text-lighten-3{color:#c5e1a5 !important}.light-green.lighten-2{background-color:#aed581 !important}.light-green-text.text-lighten-2{color:#aed581 !important}.light-green.lighten-1{background-color:#9ccc65 !important}.light-green-text.text-lighten-1{color:#9ccc65 !important}.light-green{background-color:#8bc34a !important}.light-green-text{color:#8bc34a !important}.light-green.darken-1{background-color:#7cb342 !important}.light-green-text.text-darken-1{color:#7cb342 !important}.light-green.darken-2{background-color:#689f38 !important}.light-green-text.text-darken-2{color:#689f38 !important}.light-green.darken-3{background-color:#558b2f !important}.light-green-text.text-darken-3{color:#558b2f !important}.light-green.darken-4{background-color:#33691e !important}.light-green-text.text-darken-4{color:#33691e !important}.light-green.accent-1{background-color:#ccff90 !important}.light-green-text.text-accent-1{color:#ccff90 !important}.light-green.accent-2{background-color:#b2ff59 !important}.light-green-text.text-accent-2{color:#b2ff59 !important}.light-green.accent-3{background-color:#76ff03 !important}.light-green-text.text-accent-3{color:#76ff03 !important}.light-green.accent-4{background-color:#64dd17 !important}.light-green-text.text-accent-4{color:#64dd17 !important}.lime.lighten-5{background-color:#f9fbe7 !important}.lime-text.text-lighten-5{color:#f9fbe7 !important}.lime.lighten-4{background-color:#f0f4c3 !important}.lime-text.text-lighten-4{color:#f0f4c3 !important}.lime.lighten-3{background-color:#e6ee9c !important}.lime-text.text-lighten-3{color:#e6ee9c !important}.lime.lighten-2{background-color:#dce775 !important}.lime-text.text-lighten-2{color:#dce775 !important}.lime.lighten-1{background-color:#d4e157 !important}.lime-text.text-lighten-1{color:#d4e157 !important}.lime{background-color:#cddc39 !important}.lime-text{color:#cddc39 !important}.lime.darken-1{background-color:#c0ca33 !important}.lime-text.text-darken-1{color:#c0ca33 !important}.lime.darken-2{background-color:#afb42b !important}.lime-text.text-darken-2{color:#afb42b !important}.lime.darken-3{background-color:#9e9d24 !important}.lime-text.text-darken-3{color:#9e9d24 !important}.lime.darken-4{background-color:#827717 !important}.lime-text.text-darken-4{color:#827717 !important}.lime.accent-1{background-color:#f4ff81 !important}.lime-text.text-accent-1{color:#f4ff81 !important}.lime.accent-2{background-color:#eeff41 !important}.lime-text.text-accent-2{color:#eeff41 !important}.lime.accent-3{background-color:#c6ff00 !important}.lime-text.text-accent-3{color:#c6ff00 !important}.lime.accent-4{background-color:#aeea00 !important}.lime-text.text-accent-4{color:#aeea00 !important}.yellow.lighten-5{background-color:#fffde7 !important}.yellow-text.text-lighten-5{color:#fffde7 !important}.yellow.lighten-4{background-color:#fff9c4 !important}.yellow-text.text-lighten-4{color:#fff9c4 !important}.yellow.lighten-3{background-color:#fff59d !important}.yellow-text.text-lighten-3{color:#fff59d !important}.yellow.lighten-2{background-color:#fff176 !important}.yellow-text.text-lighten-2{color:#fff176 !important}.yellow.lighten-1{background-color:#ffee58 !important}.yellow-text.text-lighten-1{color:#ffee58 !important}.yellow{background-color:#ffeb3b !important}.yellow-text{color:#ffeb3b !important}.yellow.darken-1{background-color:#fdd835 !important}.yellow-text.text-darken-1{color:#fdd835 !important}.yellow.darken-2{background-color:#fbc02d !important}.yellow-text.text-darken-2{color:#fbc02d !important}.yellow.darken-3{background-color:#f9a825 !important}.yellow-text.text-darken-3{color:#f9a825 !important}.yellow.darken-4{background-color:#f57f17 !important}.yellow-text.text-darken-4{color:#f57f17 !important}.yellow.accent-1{background-color:#ffff8d !important}.yellow-text.text-accent-1{color:#ffff8d !important}.yellow.accent-2{background-color:#ff0 !important}.yellow-text.text-accent-2{color:#ff0 !important}.yellow.accent-3{background-color:#ffea00 !important}.yellow-text.text-accent-3{color:#ffea00 !important}.yellow.accent-4{background-color:#ffd600 !important}.yellow-text.text-accent-4{color:#ffd600 !important}.amber.lighten-5{background-color:#fff8e1 !important}.amber-text.text-lighten-5{color:#fff8e1 !important}.amber.lighten-4{background-color:#ffecb3 !important}.amber-text.text-lighten-4{color:#ffecb3 !important}.amber.lighten-3{background-color:#ffe082 !important}.amber-text.text-lighten-3{color:#ffe082 !important}.amber.lighten-2{background-color:#ffd54f !important}.amber-text.text-lighten-2{color:#ffd54f !important}.amber.lighten-1{background-color:#ffca28 !important}.amber-text.text-lighten-1{color:#ffca28 !important}.amber{background-color:#ffc107 !important}.amber-text{color:#ffc107 !important}.amber.darken-1{background-color:#ffb300 !important}.amber-text.text-darken-1{color:#ffb300 !important}.amber.darken-2{background-color:#ffa000 !important}.amber-text.text-darken-2{color:#ffa000 !important}.amber.darken-3{background-color:#ff8f00 !important}.amber-text.text-darken-3{color:#ff8f00 !important}.amber.darken-4{background-color:#ff6f00 !important}.amber-text.text-darken-4{color:#ff6f00 !important}.amber.accent-1{background-color:#ffe57f !important}.amber-text.text-accent-1{color:#ffe57f !important}.amber.accent-2{background-color:#ffd740 !important}.amber-text.text-accent-2{color:#ffd740 !important}.amber.accent-3{background-color:#ffc400 !important}.amber-text.text-accent-3{color:#ffc400 !important}.amber.accent-4{background-color:#ffab00 !important}.amber-text.text-accent-4{color:#ffab00 !important}.orange.lighten-5{background-color:#fff3e0 !important}.orange-text.text-lighten-5{color:#fff3e0 !important}.orange.lighten-4{background-color:#ffe0b2 !important}.orange-text.text-lighten-4{color:#ffe0b2 !important}.orange.lighten-3{background-color:#ffcc80 !important}.orange-text.text-lighten-3{color:#ffcc80 !important}.orange.lighten-2{background-color:#ffb74d !important}.orange-text.text-lighten-2{color:#ffb74d !important}.orange.lighten-1{background-color:#ffa726 !important}.orange-text.text-lighten-1{color:#ffa726 !important}.orange{background-color:#ff9800 !important}.orange-text{color:#ff9800 !important}.orange.darken-1{background-color:#fb8c00 !important}.orange-text.text-darken-1{color:#fb8c00 !important}.orange.darken-2{background-color:#f57c00 !important}.orange-text.text-darken-2{color:#f57c00 !important}.orange.darken-3{background-color:#ef6c00 !important}.orange-text.text-darken-3{color:#ef6c00 !important}.orange.darken-4{background-color:#e65100 !important}.orange-text.text-darken-4{color:#e65100 !important}.orange.accent-1{background-color:#ffd180 !important}.orange-text.text-accent-1{color:#ffd180 !important}.orange.accent-2{background-color:#ffab40 !important}.orange-text.text-accent-2{color:#ffab40 !important}.orange.accent-3{background-color:#ff9100 !important}.orange-text.text-accent-3{color:#ff9100 !important}.orange.accent-4{background-color:#ff6d00 !important}.orange-text.text-accent-4{color:#ff6d00 !important}.deep-orange.lighten-5{background-color:#fbe9e7 !important}.deep-orange-text.text-lighten-5{color:#fbe9e7 !important}.deep-orange.lighten-4{background-color:#ffccbc !important}.deep-orange-text.text-lighten-4{color:#ffccbc !important}.deep-orange.lighten-3{background-color:#ffab91 !important}.deep-orange-text.text-lighten-3{color:#ffab91 !important}.deep-orange.lighten-2{background-color:#ff8a65 !important}.deep-orange-text.text-lighten-2{color:#ff8a65 !important}.deep-orange.lighten-1{background-color:#ff7043 !important}.deep-orange-text.text-lighten-1{color:#ff7043 !important}.deep-orange{background-color:#ff5722 !important}.deep-orange-text{color:#ff5722 !important}.deep-orange.darken-1{background-color:#f4511e !important}.deep-orange-text.text-darken-1{color:#f4511e !important}.deep-orange.darken-2{background-color:#e64a19 !important}.deep-orange-text.text-darken-2{color:#e64a19 !important}.deep-orange.darken-3{background-color:#d84315 !important}.deep-orange-text.text-darken-3{color:#d84315 !important}.deep-orange.darken-4{background-color:#bf360c !important}.deep-orange-text.text-darken-4{color:#bf360c !important}.deep-orange.accent-1{background-color:#ff9e80 !important}.deep-orange-text.text-accent-1{color:#ff9e80 !important}.deep-orange.accent-2{background-color:#ff6e40 !important}.deep-orange-text.text-accent-2{color:#ff6e40 !important}.deep-orange.accent-3{background-color:#ff3d00 !important}.deep-orange-text.text-accent-3{color:#ff3d00 !important}.deep-orange.accent-4{background-color:#dd2c00 !important}.deep-orange-text.text-accent-4{color:#dd2c00 !important}.brown.lighten-5{background-color:#efebe9 !important}.brown-text.text-lighten-5{color:#efebe9 !important}.brown.lighten-4{background-color:#d7ccc8 !important}.brown-text.text-lighten-4{color:#d7ccc8 !important}.brown.lighten-3{background-color:#bcaaa4 !important}.brown-text.text-lighten-3{color:#bcaaa4 !important}.brown.lighten-2{background-color:#a1887f !important}.brown-text.text-lighten-2{color:#a1887f !important}.brown.lighten-1{background-color:#8d6e63 !important}.brown-text.text-lighten-1{color:#8d6e63 !important}.brown{background-color:#795548 !important}.brown-text{color:#795548 !important}.brown.darken-1{background-color:#6d4c41 !important}.brown-text.text-darken-1{color:#6d4c41 !important}.brown.darken-2{background-color:#5d4037 !important}.brown-text.text-darken-2{color:#5d4037 !important}.brown.darken-3{background-color:#4e342e !important}.brown-text.text-darken-3{color:#4e342e !important}.brown.darken-4{background-color:#3e2723 !important}.brown-text.text-darken-4{color:#3e2723 !important}.blue-grey.lighten-5{background-color:#eceff1 !important}.blue-grey-text.text-lighten-5{color:#eceff1 !important}.blue-grey.lighten-4{background-color:#cfd8dc !important}.blue-grey-text.text-lighten-4{color:#cfd8dc !important}.blue-grey.lighten-3{background-color:#b0bec5 !important}.blue-grey-text.text-lighten-3{color:#b0bec5 !important}.blue-grey.lighten-2{background-color:#90a4ae !important}.blue-grey-text.text-lighten-2{color:#90a4ae !important}.blue-grey.lighten-1{background-color:#78909c !important}.blue-grey-text.text-lighten-1{color:#78909c !important}.blue-grey{background-color:#607d8b !important}.blue-grey-text{color:#607d8b !important}.blue-grey.darken-1{background-color:#546e7a !important}.blue-grey-text.text-darken-1{color:#546e7a !important}.blue-grey.darken-2{background-color:#455a64 !important}.blue-grey-text.text-darken-2{color:#455a64 !important}.blue-grey.darken-3{background-color:#37474f !important}.blue-grey-text.text-darken-3{color:#37474f !important}.blue-grey.darken-4{background-color:#263238 !important}.blue-grey-text.text-darken-4{color:#263238 !important}.grey.lighten-5{background-color:#fafafa !important}.grey-text.text-lighten-5{color:#fafafa !important}.grey.lighten-4{background-color:#f5f5f5 !important}.grey-text.text-lighten-4{color:#f5f5f5 !important}.grey.lighten-3{background-color:#eee !important}.grey-text.text-lighten-3{color:#eee !important}.grey.lighten-2{background-color:#e0e0e0 !important}.grey-text.text-lighten-2{color:#e0e0e0 !important}.grey.lighten-1{background-color:#bdbdbd !important}.grey-text.text-lighten-1{color:#bdbdbd !important}.grey{background-color:#9e9e9e !important}.grey-text{color:#9e9e9e !important}.grey.darken-1{background-color:#757575 !important}.grey-text.text-darken-1{color:#757575 !important}.grey.darken-2{background-color:#616161 !important}.grey-text.text-darken-2{color:#616161 !important}.grey.darken-3{background-color:#424242 !important}.grey-text.text-darken-3{color:#424242 !important}.grey.darken-4{background-color:#212121 !important}.grey-text.text-darken-4{color:#212121 !important}.shades.black{background-color:#000 !important}.shades-text.text-black{color:#000 !important}.shades.white{background-color:#fff !important}.shades-text.text-white{color:#fff !important}.shades.transparent{background-color:transparent !important}.shades-text.text-transparent{color:transparent !important}.black{background-color:#000 !important}.black-text{color:#000 !important}.white{background-color:#fff !important}.white-text{color:#fff !important}.transparent{background-color:transparent !important}.transparent-text{color:transparent !important}/*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}html input[type=\"button\"],button,input[type=\"reset\"],input[type=\"submit\"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=\"checkbox\"],input[type=\"radio\"]{box-sizing:border-box;padding:0}input[type=\"number\"]::-webkit-inner-spin-button,input[type=\"number\"]::-webkit-outer-spin-button{height:auto}input[type=\"search\"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=\"search\"]::-webkit-search-cancel-button,input[type=\"search\"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit}ul{list-style-type:none}a{color:#039be5;text-decoration:none;-webkit-tap-highlight-color:transparent}.valign-wrapper{display:flex;align-items:center}.valign-wrapper .valign{display:block}ul{padding:0}ul li{list-style-type:none}.clearfix{clear:both}.z-depth-0{box-shadow:none !important}.z-depth-1,nav,.card-panel,.card,.toast,.btn,.btn-large,.btn-floating,.dropdown-content,.collapsible,.side-nav{box-shadow:0 2px 5px 0 rgba(0,0,0,0.16),0 2px 10px 0 rgba(0,0,0,0.12)}.z-depth-1-half,.btn:hover,.btn-large:hover,.btn-floating:hover{box-shadow:0 5px 11px 0 rgba(0,0,0,0.18),0 4px 15px 0 rgba(0,0,0,0.15)}.z-depth-2{box-shadow:0 8px 17px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)}.z-depth-3{box-shadow:0 12px 15px 0 rgba(0,0,0,0.24),0 17px 50px 0 rgba(0,0,0,0.19)}.z-depth-4,.modal{box-shadow:0 16px 28px 0 rgba(0,0,0,0.22),0 25px 55px 0 rgba(0,0,0,0.21)}.z-depth-5{box-shadow:0 27px 24px 0 rgba(0,0,0,0.2),0 40px 77px 0 rgba(0,0,0,0.22)}.hoverable{transition:box-shadow .25s;box-shadow:0}.hoverable:hover{transition:box-shadow .25s;box-shadow:0 8px 17px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)}.divider{height:1px;overflow:hidden;background-color:#e0e0e0}blockquote{margin:20px 0;padding-left:1.5rem;border-left:5px solid #ee6e73}i{line-height:inherit}i.left{float:left;margin-right:15px}i.right{float:right;margin-left:15px}i.tiny{font-size:1rem}i.small{font-size:2rem}i.medium{font-size:4rem}i.large{font-size:6rem}img.responsive-img,video.responsive-video{max-width:100%;height:auto}.pagination li{display:inline-block;font-size:1.2rem;padding:0 10px;line-height:30px;border-radius:2px;text-align:center}.pagination li a{color:#444}.pagination li.active a{color:#fff}.pagination li.active{background-color:#ee6e73}.pagination li.disabled a{cursor:default;color:#999}.pagination li i{font-size:2.2rem;vertical-align:middle}.pagination li.pages ul li{display:inline-block;float:none}@media only screen and (max-width: 992px){.pagination{width:100%}.pagination li.prev,.pagination li.next{width:10%}.pagination li.pages{width:80%;overflow:hidden;white-space:nowrap}}.breadcrumb{font-size:18px;color:rgba(255,255,255,0.7)}.breadcrumb i,.breadcrumb [class^=\"mdi-\"],.breadcrumb [class*=\"mdi-\"],.breadcrumb i.material-icons{display:inline-block;float:left;font-size:24px}.breadcrumb:before{content:'\\E5CC';color:rgba(255,255,255,0.7);vertical-align:top;display:inline-block;font-family:'Material Icons';font-weight:normal;font-style:normal;font-size:25px;margin:0 10px 0 8px;-webkit-font-smoothing:antialiased}.breadcrumb:first-child:before{display:none}.breadcrumb:last-child{color:#fff}.parallax-container{position:relative;overflow:hidden;height:500px}.parallax{position:absolute;top:0;left:0;right:0;bottom:0;z-index:-1}.parallax img{display:none;position:absolute;left:50%;bottom:0;min-width:100%;min-height:100%;-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);transform:translateX(-50%)}.pin-top,.pin-bottom{position:relative}.pinned{position:fixed !important}ul.staggered-list li{opacity:0}.fade-in{opacity:0;transform-origin:0 50%}@media only screen and (max-width: 600px){.hide-on-small-only,.hide-on-small-and-down{display:none !important}}@media only screen and (max-width: 992px){.hide-on-med-and-down{display:none !important}}@media only screen and (min-width: 601px){.hide-on-med-and-up{display:none !important}}@media only screen and (min-width: 600px) and (max-width: 992px){.hide-on-med-only{display:none !important}}@media only screen and (min-width: 993px){.hide-on-large-only{display:none !important}}@media only screen and (min-width: 993px){.show-on-large{display:block !important}}@media only screen and (min-width: 600px) and (max-width: 992px){.show-on-medium{display:block !important}}@media only screen and (max-width: 600px){.show-on-small{display:block !important}}@media only screen and (min-width: 601px){.show-on-medium-and-up{display:block !important}}@media only screen and (max-width: 992px){.show-on-medium-and-down{display:block !important}}@media only screen and (max-width: 600px){.center-on-small-only{text-align:center}}footer.page-footer{margin-top:20px;padding-top:20px;background-color:#ee6e73}footer.page-footer .footer-copyright{overflow:hidden;height:50px;line-height:50px;color:rgba(255,255,255,0.8);background-color:rgba(51,51,51,0.08)}table,th,td{border:none}table{width:100%;display:table}table.bordered>thead>tr,table.bordered>tbody>tr{border-bottom:1px solid #d0d0d0}table.striped>tbody>tr:nth-child(odd){background-color:#f2f2f2}table.striped>tbody>tr>td{border-radius:0px}table.highlight>tbody>tr{transition:background-color .25s ease}table.highlight>tbody>tr:hover{background-color:#f2f2f2}table.centered thead tr th,table.centered tbody tr td{text-align:center}thead{border-bottom:1px solid #d0d0d0}td,th{padding:15px 5px;display:table-cell;text-align:left;vertical-align:middle;border-radius:2px}@media only screen and (max-width: 992px){table.responsive-table{width:100%;border-collapse:collapse;border-spacing:0;display:block;position:relative}table.responsive-table th,table.responsive-table td{margin:0;vertical-align:top}table.responsive-table th{text-align:left}table.responsive-table thead{display:block;float:left}table.responsive-table thead tr{display:block;padding:0 10px 0 0}table.responsive-table thead tr th::before{content:\"\\00a0\"}table.responsive-table tbody{display:block;width:auto;position:relative;overflow-x:auto;white-space:nowrap}table.responsive-table tbody tr{display:inline-block;vertical-align:top}table.responsive-table th{display:block;text-align:right}table.responsive-table td{display:block;min-height:1.25em;text-align:left}table.responsive-table tr{padding:0 10px}table.responsive-table thead{border:0;border-right:1px solid #d0d0d0}table.responsive-table.bordered th{border-bottom:0;border-left:0}table.responsive-table.bordered td{border-left:0;border-right:0;border-bottom:0}table.responsive-table.bordered tr{border:0}table.responsive-table.bordered tbody tr{border-right:1px solid #d0d0d0}}.collection{margin:0.5rem 0 1rem 0;border:1px solid #e0e0e0;border-radius:2px;overflow:hidden;position:relative}.collection .collection-item{background-color:#fff;line-height:1.5rem;padding:10px 20px;margin:0;border-bottom:1px solid #e0e0e0}.collection .collection-item.avatar{min-height:84px;padding-left:72px;position:relative}.collection .collection-item.avatar .circle{position:absolute;width:42px;height:42px;overflow:hidden;left:15px;display:inline-block;vertical-align:middle}.collection .collection-item.avatar i.circle{font-size:18px;line-height:42px;color:#fff;background-color:#999;text-align:center}.collection .collection-item.avatar .title{font-size:16px}.collection .collection-item.avatar p{margin:0}.collection .collection-item.avatar .secondary-content{position:absolute;top:16px;right:16px}.collection .collection-item:last-child{border-bottom:none}.collection .collection-item.active{background-color:#26a69a;color:#eafaf9}.collection .collection-item.active .secondary-content{color:#fff}.collection a.collection-item{display:block;transition:.25s;color:#26a69a}.collection a.collection-item:not(.active):hover{background-color:#ddd}.collection.with-header .collection-header{background-color:#fff;border-bottom:1px solid #e0e0e0;padding:10px 20px}.collection.with-header .collection-item{padding-left:30px}.collection.with-header .collection-item.avatar{padding-left:72px}.secondary-content{float:right;color:#26a69a}.collapsible .collection{margin:0;border:none}span.badge{min-width:3rem;padding:0 6px;text-align:center;font-size:1rem;line-height:inherit;color:#757575;position:absolute;right:15px;box-sizing:border-box}span.badge.new{font-weight:300;font-size:0.8rem;color:#fff;background-color:#26a69a;border-radius:2px}span.badge.new:after{content:\" new\"}nav ul a span.badge{position:static;margin-left:4px;line-height:0}.video-container{position:relative;padding-bottom:56.25%;height:0;overflow:hidden}.video-container iframe,.video-container object,.video-container embed{position:absolute;top:0;left:0;width:100%;height:100%}.progress{position:relative;height:4px;display:block;width:100%;background-color:#acece6;border-radius:2px;margin:0.5rem 0 1rem 0;overflow:hidden}.progress .determinate{position:absolute;background-color:inherit;top:0;left:0;bottom:0;background-color:#26a69a;transition:width .3s linear}.progress .indeterminate{background-color:#26a69a}.progress .indeterminate:before{content:'';position:absolute;background-color:inherit;top:0;left:0;bottom:0;will-change:left, right;animation:indeterminate 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite}.progress .indeterminate:after{content:'';position:absolute;background-color:inherit;top:0;left:0;bottom:0;will-change:left, right;animation:indeterminate-short 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) infinite;animation-delay:1.15s}@keyframes indeterminate{0%{left:-35%;right:100%}60%{left:100%;right:-90%}100%{left:100%;right:-90%}}@keyframes indeterminate-short{0%{left:-200%;right:100%}60%{left:107%;right:-8%}100%{left:107%;right:-8%}}.hide{display:none !important}.left-align{text-align:left}.right-align{text-align:right}.center,.center-align{text-align:center}.left{float:left !important}.right{float:right !important}.no-select,input[type=range],input[type=range]+.thumb{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.circle{border-radius:50%}.center-block{display:block;margin-left:auto;margin-right:auto}.truncate{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.no-padding{padding:0 !important}.material-icons{text-rendering:optimizeLegibility;font-feature-settings:'liga'}@font-face{font-family:\"Material-Design-Icons\";src:url(\"../font/material-design-icons/Material-Design-Icons.eot?#iefix\") format(\"embedded-opentype\"),url(\"../font/material-design-icons/Material-Design-Icons.woff2\") format(\"woff2\"),url(\"../font/material-design-icons/Material-Design-Icons.woff\") format(\"woff\"),url(\"../font/material-design-icons/Material-Design-Icons.ttf\") format(\"truetype\"),url(\"../font/material-design-icons/Material-Design-Icons.svg#Material-Design-Icons\") format(\"svg\");font-weight:normal;font-style:normal}[class^=\"mdi-\"],[class*=\"mdi-\"]{speak:none;display:inline-block;font-family:\"Material-Design-Icons\";font-style:normal;font-weight:normal;font-variant:normal;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0)}[class^=\"mdi-\"]:before,[class*=\"mdi-\"]:before{display:inline-block;speak:none;text-decoration:inherit}[class^=\"mdi-\"].pull-left,[class*=\"mdi-\"].pull-left{margin-right:.3em}[class^=\"mdi-\"].pull-right,[class*=\"mdi-\"].pull-right{margin-left:.3em}[class^=\"mdi-\"].mdi-lg:before,[class^=\"mdi-\"].mdi-lg:after,[class*=\"mdi-\"].mdi-lg:before,[class*=\"mdi-\"].mdi-lg:after{font-size:1.33333333em;line-height:0.75em;vertical-align:-15%}[class^=\"mdi-\"].mdi-2x:before,[class^=\"mdi-\"].mdi-2x:after,[class*=\"mdi-\"].mdi-2x:before,[class*=\"mdi-\"].mdi-2x:after{font-size:2em}[class^=\"mdi-\"].mdi-3x:before,[class^=\"mdi-\"].mdi-3x:after,[class*=\"mdi-\"].mdi-3x:before,[class*=\"mdi-\"].mdi-3x:after{font-size:3em}[class^=\"mdi-\"].mdi-4x:before,[class^=\"mdi-\"].mdi-4x:after,[class*=\"mdi-\"].mdi-4x:before,[class*=\"mdi-\"].mdi-4x:after{font-size:4em}[class^=\"mdi-\"].mdi-5x:before,[class^=\"mdi-\"].mdi-5x:after,[class*=\"mdi-\"].mdi-5x:before,[class*=\"mdi-\"].mdi-5x:after{font-size:5em}[class^=\"mdi-device-signal-cellular-\"]:after,[class^=\"mdi-device-battery-\"]:after,[class^=\"mdi-device-battery-charging-\"]:after,[class^=\"mdi-device-signal-cellular-connected-no-internet-\"]:after,[class^=\"mdi-device-signal-wifi-\"]:after,[class^=\"mdi-device-signal-wifi-statusbar-not-connected\"]:after,.mdi-device-network-wifi:after{opacity:.3;position:absolute;left:0;top:0;z-index:1;display:inline-block;speak:none;text-decoration:inherit}[class^=\"mdi-device-signal-cellular-\"]:after{content:\"\\e758\"}[class^=\"mdi-device-battery-\"]:after{content:\"\\e735\"}[class^=\"mdi-device-battery-charging-\"]:after{content:\"\\e733\"}[class^=\"mdi-device-signal-cellular-connected-no-internet-\"]:after{content:\"\\e75d\"}[class^=\"mdi-device-signal-wifi-\"]:after,.mdi-device-network-wifi:after{content:\"\\e765\"}[class^=\"mdi-device-signal-wifi-statusbasr-not-connected\"]:after{content:\"\\e8f7\"}.mdi-device-signal-cellular-off:after,.mdi-device-signal-cellular-null:after,.mdi-device-signal-cellular-no-sim:after,.mdi-device-signal-wifi-off:after,.mdi-device-signal-wifi-4-bar:after,.mdi-device-signal-cellular-4-bar:after,.mdi-device-battery-alert:after,.mdi-device-signal-cellular-connected-no-internet-4-bar:after,.mdi-device-battery-std:after,.mdi-device-battery-full .mdi-device-battery-unknown:after{content:\"\"}.mdi-fw{width:1.28571429em;text-align:center}.mdi-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.mdi-ul>li{position:relative}.mdi-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:0.14285714em;text-align:center}.mdi-li.mdi-lg{left:-1.85714286em}.mdi-border{padding:.2em .25em .15em;border:solid 0.08em #eeeeee;border-radius:.1em}.mdi-spin{-webkit-animation:mdi-spin 2s infinite linear;animation:mdi-spin 2s infinite linear;-webkit-transform-origin:50% 50%;-moz-transform-origin:50% 50%;-o-transform-origin:50% 50%;transform-origin:50% 50%}.mdi-pulse{-webkit-animation:mdi-spin 1s steps(8) infinite;animation:mdi-spin 1s steps(8) infinite;-webkit-transform-origin:50% 50%;-moz-transform-origin:50% 50%;-o-transform-origin:50% 50%;transform-origin:50% 50%}@-webkit-keyframes mdi-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes mdi-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.mdi-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.mdi-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.mdi-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.mdi-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.mdi-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .mdi-rotate-90,:root .mdi-rotate-180,:root .mdi-rotate-270,:root .mdi-flip-horizontal,:root .mdi-flip-vertical{filter:none}.mdi-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.mdi-stack-1x,.mdi-stack-2x{position:absolute;left:0;width:100%;text-align:center}.mdi-stack-1x{line-height:inherit}.mdi-stack-2x{font-size:2em}.mdi-inverse{color:#ffffff}.mdi-action-3d-rotation:before{content:\"\\e600\"}.mdi-action-accessibility:before{content:\"\\e601\"}.mdi-action-account-balance-wallet:before{content:\"\\e602\"}.mdi-action-account-balance:before{content:\"\\e603\"}.mdi-action-account-box:before{content:\"\\e604\"}.mdi-action-account-child:before{content:\"\\e605\"}.mdi-action-account-circle:before{content:\"\\e606\"}.mdi-action-add-shopping-cart:before{content:\"\\e607\"}.mdi-action-alarm-add:before{content:\"\\e608\"}.mdi-action-alarm-off:before{content:\"\\e609\"}.mdi-action-alarm-on:before{content:\"\\e60a\"}.mdi-action-alarm:before{content:\"\\e60b\"}.mdi-action-android:before{content:\"\\e60c\"}.mdi-action-announcement:before{content:\"\\e60d\"}.mdi-action-aspect-ratio:before{content:\"\\e60e\"}.mdi-action-assessment:before{content:\"\\e60f\"}.mdi-action-assignment-ind:before{content:\"\\e610\"}.mdi-action-assignment-late:before{content:\"\\e611\"}.mdi-action-assignment-return:before{content:\"\\e612\"}.mdi-action-assignment-returned:before{content:\"\\e613\"}.mdi-action-assignment-turned-in:before{content:\"\\e614\"}.mdi-action-assignment:before{content:\"\\e615\"}.mdi-action-autorenew:before{content:\"\\e616\"}.mdi-action-backup:before{content:\"\\e617\"}.mdi-action-book:before{content:\"\\e618\"}.mdi-action-bookmark-outline:before{content:\"\\e619\"}.mdi-action-bookmark:before{content:\"\\e61a\"}.mdi-action-bug-report:before{content:\"\\e61b\"}.mdi-action-cached:before{content:\"\\e61c\"}.mdi-action-check-circle:before{content:\"\\e61d\"}.mdi-action-class:before{content:\"\\e61e\"}.mdi-action-credit-card:before{content:\"\\e61f\"}.mdi-action-dashboard:before{content:\"\\e620\"}.mdi-action-delete:before{content:\"\\e621\"}.mdi-action-description:before{content:\"\\e622\"}.mdi-action-dns:before{content:\"\\e623\"}.mdi-action-done-all:before{content:\"\\e624\"}.mdi-action-done:before{content:\"\\e625\"}.mdi-action-event:before{content:\"\\e626\"}.mdi-action-exit-to-app:before{content:\"\\e627\"}.mdi-action-explore:before{content:\"\\e628\"}.mdi-action-extension:before{content:\"\\e629\"}.mdi-action-face-unlock:before{content:\"\\e62a\"}.mdi-action-favorite-outline:before{content:\"\\e62b\"}.mdi-action-favorite:before{content:\"\\e62c\"}.mdi-action-find-in-page:before{content:\"\\e62d\"}.mdi-action-find-replace:before{content:\"\\e62e\"}.mdi-action-flip-to-back:before{content:\"\\e62f\"}.mdi-action-flip-to-front:before{content:\"\\e630\"}.mdi-action-get-app:before{content:\"\\e631\"}.mdi-action-grade:before{content:\"\\e632\"}.mdi-action-group-work:before{content:\"\\e633\"}.mdi-action-help:before{content:\"\\e634\"}.mdi-action-highlight-remove:before{content:\"\\e635\"}.mdi-action-history:before{content:\"\\e636\"}.mdi-action-home:before{content:\"\\e637\"}.mdi-action-https:before{content:\"\\e638\"}.mdi-action-info-outline:before{content:\"\\e639\"}.mdi-action-info:before{content:\"\\e63a\"}.mdi-action-input:before{content:\"\\e63b\"}.mdi-action-invert-colors:before{content:\"\\e63c\"}.mdi-action-label-outline:before{content:\"\\e63d\"}.mdi-action-label:before{content:\"\\e63e\"}.mdi-action-language:before{content:\"\\e63f\"}.mdi-action-launch:before{content:\"\\e640\"}.mdi-action-list:before{content:\"\\e641\"}.mdi-action-lock-open:before{content:\"\\e642\"}.mdi-action-lock-outline:before{content:\"\\e643\"}.mdi-action-lock:before{content:\"\\e644\"}.mdi-action-loyalty:before{content:\"\\e645\"}.mdi-action-markunread-mailbox:before{content:\"\\e646\"}.mdi-action-note-add:before{content:\"\\e647\"}.mdi-action-open-in-browser:before{content:\"\\e648\"}.mdi-action-open-in-new:before{content:\"\\e649\"}.mdi-action-open-with:before{content:\"\\e64a\"}.mdi-action-pageview:before{content:\"\\e64b\"}.mdi-action-payment:before{content:\"\\e64c\"}.mdi-action-perm-camera-mic:before{content:\"\\e64d\"}.mdi-action-perm-contact-cal:before{content:\"\\e64e\"}.mdi-action-perm-data-setting:before{content:\"\\e64f\"}.mdi-action-perm-device-info:before{content:\"\\e650\"}.mdi-action-perm-identity:before{content:\"\\e651\"}.mdi-action-perm-media:before{content:\"\\e652\"}.mdi-action-perm-phone-msg:before{content:\"\\e653\"}.mdi-action-perm-scan-wifi:before{content:\"\\e654\"}.mdi-action-picture-in-picture:before{content:\"\\e655\"}.mdi-action-polymer:before{content:\"\\e656\"}.mdi-action-print:before{content:\"\\e657\"}.mdi-action-query-builder:before{content:\"\\e658\"}.mdi-action-question-answer:before{content:\"\\e659\"}.mdi-action-receipt:before{content:\"\\e65a\"}.mdi-action-redeem:before{content:\"\\e65b\"}.mdi-action-reorder:before{content:\"\\e65c\"}.mdi-action-report-problem:before{content:\"\\e65d\"}.mdi-action-restore:before{content:\"\\e65e\"}.mdi-action-room:before{content:\"\\e65f\"}.mdi-action-schedule:before{content:\"\\e660\"}.mdi-action-search:before{content:\"\\e661\"}.mdi-action-settings-applications:before{content:\"\\e662\"}.mdi-action-settings-backup-restore:before{content:\"\\e663\"}.mdi-action-settings-bluetooth:before{content:\"\\e664\"}.mdi-action-settings-cell:before{content:\"\\e665\"}.mdi-action-settings-display:before{content:\"\\e666\"}.mdi-action-settings-ethernet:before{content:\"\\e667\"}.mdi-action-settings-input-antenna:before{content:\"\\e668\"}.mdi-action-settings-input-component:before{content:\"\\e669\"}.mdi-action-settings-input-composite:before{content:\"\\e66a\"}.mdi-action-settings-input-hdmi:before{content:\"\\e66b\"}.mdi-action-settings-input-svideo:before{content:\"\\e66c\"}.mdi-action-settings-overscan:before{content:\"\\e66d\"}.mdi-action-settings-phone:before{content:\"\\e66e\"}.mdi-action-settings-power:before{content:\"\\e66f\"}.mdi-action-settings-remote:before{content:\"\\e670\"}.mdi-action-settings-voice:before{content:\"\\e671\"}.mdi-action-settings:before{content:\"\\e672\"}.mdi-action-shop-two:before{content:\"\\e673\"}.mdi-action-shop:before{content:\"\\e674\"}.mdi-action-shopping-basket:before{content:\"\\e675\"}.mdi-action-shopping-cart:before{content:\"\\e676\"}.mdi-action-speaker-notes:before{content:\"\\e677\"}.mdi-action-spellcheck:before{content:\"\\e678\"}.mdi-action-star-rate:before{content:\"\\e679\"}.mdi-action-stars:before{content:\"\\e67a\"}.mdi-action-store:before{content:\"\\e67b\"}.mdi-action-subject:before{content:\"\\e67c\"}.mdi-action-supervisor-account:before{content:\"\\e67d\"}.mdi-action-swap-horiz:before{content:\"\\e67e\"}.mdi-action-swap-vert-circle:before{content:\"\\e67f\"}.mdi-action-swap-vert:before{content:\"\\e680\"}.mdi-action-system-update-tv:before{content:\"\\e681\"}.mdi-action-tab-unselected:before{content:\"\\e682\"}.mdi-action-tab:before{content:\"\\e683\"}.mdi-action-theaters:before{content:\"\\e684\"}.mdi-action-thumb-down:before{content:\"\\e685\"}.mdi-action-thumb-up:before{content:\"\\e686\"}.mdi-action-thumbs-up-down:before{content:\"\\e687\"}.mdi-action-toc:before{content:\"\\e688\"}.mdi-action-today:before{content:\"\\e689\"}.mdi-action-track-changes:before{content:\"\\e68a\"}.mdi-action-translate:before{content:\"\\e68b\"}.mdi-action-trending-down:before{content:\"\\e68c\"}.mdi-action-trending-neutral:before{content:\"\\e68d\"}.mdi-action-trending-up:before{content:\"\\e68e\"}.mdi-action-turned-in-not:before{content:\"\\e68f\"}.mdi-action-turned-in:before{content:\"\\e690\"}.mdi-action-verified-user:before{content:\"\\e691\"}.mdi-action-view-agenda:before{content:\"\\e692\"}.mdi-action-view-array:before{content:\"\\e693\"}.mdi-action-view-carousel:before{content:\"\\e694\"}.mdi-action-view-column:before{content:\"\\e695\"}.mdi-action-view-day:before{content:\"\\e696\"}.mdi-action-view-headline:before{content:\"\\e697\"}.mdi-action-view-list:before{content:\"\\e698\"}.mdi-action-view-module:before{content:\"\\e699\"}.mdi-action-view-quilt:before{content:\"\\e69a\"}.mdi-action-view-stream:before{content:\"\\e69b\"}.mdi-action-view-week:before{content:\"\\e69c\"}.mdi-action-visibility-off:before{content:\"\\e69d\"}.mdi-action-visibility:before{content:\"\\e69e\"}.mdi-action-wallet-giftcard:before{content:\"\\e69f\"}.mdi-action-wallet-membership:before{content:\"\\e6a0\"}.mdi-action-wallet-travel:before{content:\"\\e6a1\"}.mdi-action-work:before{content:\"\\e6a2\"}.mdi-alert-error:before{content:\"\\e6a3\"}.mdi-alert-warning:before{content:\"\\e6a4\"}.mdi-av-album:before{content:\"\\e6a5\"}.mdi-av-closed-caption:before{content:\"\\e6a6\"}.mdi-av-equalizer:before{content:\"\\e6a7\"}.mdi-av-explicit:before{content:\"\\e6a8\"}.mdi-av-fast-forward:before{content:\"\\e6a9\"}.mdi-av-fast-rewind:before{content:\"\\e6aa\"}.mdi-av-games:before{content:\"\\e6ab\"}.mdi-av-hearing:before{content:\"\\e6ac\"}.mdi-av-high-quality:before{content:\"\\e6ad\"}.mdi-av-loop:before{content:\"\\e6ae\"}.mdi-av-mic-none:before{content:\"\\e6af\"}.mdi-av-mic-off:before{content:\"\\e6b0\"}.mdi-av-mic:before{content:\"\\e6b1\"}.mdi-av-movie:before{content:\"\\e6b2\"}.mdi-av-my-library-add:before{content:\"\\e6b3\"}.mdi-av-my-library-books:before{content:\"\\e6b4\"}.mdi-av-my-library-music:before{content:\"\\e6b5\"}.mdi-av-new-releases:before{content:\"\\e6b6\"}.mdi-av-not-interested:before{content:\"\\e6b7\"}.mdi-av-pause-circle-fill:before{content:\"\\e6b8\"}.mdi-av-pause-circle-outline:before{content:\"\\e6b9\"}.mdi-av-pause:before{content:\"\\e6ba\"}.mdi-av-play-arrow:before{content:\"\\e6bb\"}.mdi-av-play-circle-fill:before{content:\"\\e6bc\"}.mdi-av-play-circle-outline:before{content:\"\\e6bd\"}.mdi-av-play-shopping-bag:before{content:\"\\e6be\"}.mdi-av-playlist-add:before{content:\"\\e6bf\"}.mdi-av-queue-music:before{content:\"\\e6c0\"}.mdi-av-queue:before{content:\"\\e6c1\"}.mdi-av-radio:before{content:\"\\e6c2\"}.mdi-av-recent-actors:before{content:\"\\e6c3\"}.mdi-av-repeat-one:before{content:\"\\e6c4\"}.mdi-av-repeat:before{content:\"\\e6c5\"}.mdi-av-replay:before{content:\"\\e6c6\"}.mdi-av-shuffle:before{content:\"\\e6c7\"}.mdi-av-skip-next:before{content:\"\\e6c8\"}.mdi-av-skip-previous:before{content:\"\\e6c9\"}.mdi-av-snooze:before{content:\"\\e6ca\"}.mdi-av-stop:before{content:\"\\e6cb\"}.mdi-av-subtitles:before{content:\"\\e6cc\"}.mdi-av-surround-sound:before{content:\"\\e6cd\"}.mdi-av-timer:before{content:\"\\e6ce\"}.mdi-av-video-collection:before{content:\"\\e6cf\"}.mdi-av-videocam-off:before{content:\"\\e6d0\"}.mdi-av-videocam:before{content:\"\\e6d1\"}.mdi-av-volume-down:before{content:\"\\e6d2\"}.mdi-av-volume-mute:before{content:\"\\e6d3\"}.mdi-av-volume-off:before{content:\"\\e6d4\"}.mdi-av-volume-up:before{content:\"\\e6d5\"}.mdi-av-web:before{content:\"\\e6d6\"}.mdi-communication-business:before{content:\"\\e6d7\"}.mdi-communication-call-end:before{content:\"\\e6d8\"}.mdi-communication-call-made:before{content:\"\\e6d9\"}.mdi-communication-call-merge:before{content:\"\\e6da\"}.mdi-communication-call-missed:before{content:\"\\e6db\"}.mdi-communication-call-received:before{content:\"\\e6dc\"}.mdi-communication-call-split:before{content:\"\\e6dd\"}.mdi-communication-call:before{content:\"\\e6de\"}.mdi-communication-chat:before{content:\"\\e6df\"}.mdi-communication-clear-all:before{content:\"\\e6e0\"}.mdi-communication-comment:before{content:\"\\e6e1\"}.mdi-communication-contacts:before{content:\"\\e6e2\"}.mdi-communication-dialer-sip:before{content:\"\\e6e3\"}.mdi-communication-dialpad:before{content:\"\\e6e4\"}.mdi-communication-dnd-on:before{content:\"\\e6e5\"}.mdi-communication-email:before{content:\"\\e6e6\"}.mdi-communication-forum:before{content:\"\\e6e7\"}.mdi-communication-import-export:before{content:\"\\e6e8\"}.mdi-communication-invert-colors-off:before{content:\"\\e6e9\"}.mdi-communication-invert-colors-on:before{content:\"\\e6ea\"}.mdi-communication-live-help:before{content:\"\\e6eb\"}.mdi-communication-location-off:before{content:\"\\e6ec\"}.mdi-communication-location-on:before{content:\"\\e6ed\"}.mdi-communication-message:before{content:\"\\e6ee\"}.mdi-communication-messenger:before{content:\"\\e6ef\"}.mdi-communication-no-sim:before{content:\"\\e6f0\"}.mdi-communication-phone:before{content:\"\\e6f1\"}.mdi-communication-portable-wifi-off:before{content:\"\\e6f2\"}.mdi-communication-quick-contacts-dialer:before{content:\"\\e6f3\"}.mdi-communication-quick-contacts-mail:before{content:\"\\e6f4\"}.mdi-communication-ring-volume:before{content:\"\\e6f5\"}.mdi-communication-stay-current-landscape:before{content:\"\\e6f6\"}.mdi-communication-stay-current-portrait:before{content:\"\\e6f7\"}.mdi-communication-stay-primary-landscape:before{content:\"\\e6f8\"}.mdi-communication-stay-primary-portrait:before{content:\"\\e6f9\"}.mdi-communication-swap-calls:before{content:\"\\e6fa\"}.mdi-communication-textsms:before{content:\"\\e6fb\"}.mdi-communication-voicemail:before{content:\"\\e6fc\"}.mdi-communication-vpn-key:before{content:\"\\e6fd\"}.mdi-content-add-box:before{content:\"\\e6fe\"}.mdi-content-add-circle-outline:before{content:\"\\e6ff\"}.mdi-content-add-circle:before{content:\"\\e700\"}.mdi-content-add:before{content:\"\\e701\"}.mdi-content-archive:before{content:\"\\e702\"}.mdi-content-backspace:before{content:\"\\e703\"}.mdi-content-block:before{content:\"\\e704\"}.mdi-content-clear:before{content:\"\\e705\"}.mdi-content-content-copy:before{content:\"\\e706\"}.mdi-content-content-cut:before{content:\"\\e707\"}.mdi-content-content-paste:before{content:\"\\e708\"}.mdi-content-create:before{content:\"\\e709\"}.mdi-content-drafts:before{content:\"\\e70a\"}.mdi-content-filter-list:before{content:\"\\e70b\"}.mdi-content-flag:before{content:\"\\e70c\"}.mdi-content-forward:before{content:\"\\e70d\"}.mdi-content-gesture:before{content:\"\\e70e\"}.mdi-content-inbox:before{content:\"\\e70f\"}.mdi-content-link:before{content:\"\\e710\"}.mdi-content-mail:before{content:\"\\e711\"}.mdi-content-markunread:before{content:\"\\e712\"}.mdi-content-redo:before{content:\"\\e713\"}.mdi-content-remove-circle-outline:before{content:\"\\e714\"}.mdi-content-remove-circle:before{content:\"\\e715\"}.mdi-content-remove:before{content:\"\\e716\"}.mdi-content-reply-all:before{content:\"\\e717\"}.mdi-content-reply:before{content:\"\\e718\"}.mdi-content-report:before{content:\"\\e719\"}.mdi-content-save:before{content:\"\\e71a\"}.mdi-content-select-all:before{content:\"\\e71b\"}.mdi-content-send:before{content:\"\\e71c\"}.mdi-content-sort:before{content:\"\\e71d\"}.mdi-content-text-format:before{content:\"\\e71e\"}.mdi-content-undo:before{content:\"\\e71f\"}.mdi-editor-attach-file:before{content:\"\\e776\"}.mdi-editor-attach-money:before{content:\"\\e777\"}.mdi-editor-border-all:before{content:\"\\e778\"}.mdi-editor-border-bottom:before{content:\"\\e779\"}.mdi-editor-border-clear:before{content:\"\\e77a\"}.mdi-editor-border-color:before{content:\"\\e77b\"}.mdi-editor-border-horizontal:before{content:\"\\e77c\"}.mdi-editor-border-inner:before{content:\"\\e77d\"}.mdi-editor-border-left:before{content:\"\\e77e\"}.mdi-editor-border-outer:before{content:\"\\e77f\"}.mdi-editor-border-right:before{content:\"\\e780\"}.mdi-editor-border-style:before{content:\"\\e781\"}.mdi-editor-border-top:before{content:\"\\e782\"}.mdi-editor-border-vertical:before{content:\"\\e783\"}.mdi-editor-format-align-center:before{content:\"\\e784\"}.mdi-editor-format-align-justify:before{content:\"\\e785\"}.mdi-editor-format-align-left:before{content:\"\\e786\"}.mdi-editor-format-align-right:before{content:\"\\e787\"}.mdi-editor-format-bold:before{content:\"\\e788\"}.mdi-editor-format-clear:before{content:\"\\e789\"}.mdi-editor-format-color-fill:before{content:\"\\e78a\"}.mdi-editor-format-color-reset:before{content:\"\\e78b\"}.mdi-editor-format-color-text:before{content:\"\\e78c\"}.mdi-editor-format-indent-decrease:before{content:\"\\e78d\"}.mdi-editor-format-indent-increase:before{content:\"\\e78e\"}.mdi-editor-format-italic:before{content:\"\\e78f\"}.mdi-editor-format-line-spacing:before{content:\"\\e790\"}.mdi-editor-format-list-bulleted:before{content:\"\\e791\"}.mdi-editor-format-list-numbered:before{content:\"\\e792\"}.mdi-editor-format-paint:before{content:\"\\e793\"}.mdi-editor-format-quote:before{content:\"\\e794\"}.mdi-editor-format-size:before{content:\"\\e795\"}.mdi-editor-format-strikethrough:before{content:\"\\e796\"}.mdi-editor-format-textdirection-l-to-r:before{content:\"\\e797\"}.mdi-editor-format-textdirection-r-to-l:before{content:\"\\e798\"}.mdi-editor-format-underline:before{content:\"\\e799\"}.mdi-editor-functions:before{content:\"\\e79a\"}.mdi-editor-insert-chart:before{content:\"\\e79b\"}.mdi-editor-insert-comment:before{content:\"\\e79c\"}.mdi-editor-insert-drive-file:before{content:\"\\e79d\"}.mdi-editor-insert-emoticon:before{content:\"\\e79e\"}.mdi-editor-insert-invitation:before{content:\"\\e79f\"}.mdi-editor-insert-link:before{content:\"\\e7a0\"}.mdi-editor-insert-photo:before{content:\"\\e7a1\"}.mdi-editor-merge-type:before{content:\"\\e7a2\"}.mdi-editor-mode-comment:before{content:\"\\e7a3\"}.mdi-editor-mode-edit:before{content:\"\\e7a4\"}.mdi-editor-publish:before{content:\"\\e7a5\"}.mdi-editor-vertical-align-bottom:before{content:\"\\e7a6\"}.mdi-editor-vertical-align-center:before{content:\"\\e7a7\"}.mdi-editor-vertical-align-top:before{content:\"\\e7a8\"}.mdi-editor-wrap-text:before{content:\"\\e7a9\"}.mdi-file-attachment:before{content:\"\\e7aa\"}.mdi-file-cloud-circle:before{content:\"\\e7ab\"}.mdi-file-cloud-done:before{content:\"\\e7ac\"}.mdi-file-cloud-download:before{content:\"\\e7ad\"}.mdi-file-cloud-off:before{content:\"\\e7ae\"}.mdi-file-cloud-queue:before{content:\"\\e7af\"}.mdi-file-cloud-upload:before{content:\"\\e7b0\"}.mdi-file-cloud:before{content:\"\\e7b1\"}.mdi-file-file-download:before{content:\"\\e7b2\"}.mdi-file-file-upload:before{content:\"\\e7b3\"}.mdi-file-folder-open:before{content:\"\\e7b4\"}.mdi-file-folder-shared:before{content:\"\\e7b5\"}.mdi-file-folder:before{content:\"\\e7b6\"}.mdi-device-access-alarm:before{content:\"\\e720\"}.mdi-device-access-alarms:before{content:\"\\e721\"}.mdi-device-access-time:before{content:\"\\e722\"}.mdi-device-add-alarm:before{content:\"\\e723\"}.mdi-device-airplanemode-off:before{content:\"\\e724\"}.mdi-device-airplanemode-on:before{content:\"\\e725\"}.mdi-device-battery-20:before{content:\"\\e726\"}.mdi-device-battery-30:before{content:\"\\e727\"}.mdi-device-battery-50:before{content:\"\\e728\"}.mdi-device-battery-60:before{content:\"\\e729\"}.mdi-device-battery-80:before{content:\"\\e72a\"}.mdi-device-battery-90:before{content:\"\\e72b\"}.mdi-device-battery-alert:before{content:\"\\e72c\"}.mdi-device-battery-charging-20:before{content:\"\\e72d\"}.mdi-device-battery-charging-30:before{content:\"\\e72e\"}.mdi-device-battery-charging-50:before{content:\"\\e72f\"}.mdi-device-battery-charging-60:before{content:\"\\e730\"}.mdi-device-battery-charging-80:before{content:\"\\e731\"}.mdi-device-battery-charging-90:before{content:\"\\e732\"}.mdi-device-battery-charging-full:before{content:\"\\e733\"}.mdi-device-battery-full:before{content:\"\\e734\"}.mdi-device-battery-std:before{content:\"\\e735\"}.mdi-device-battery-unknown:before{content:\"\\e736\"}.mdi-device-bluetooth-connected:before{content:\"\\e737\"}.mdi-device-bluetooth-disabled:before{content:\"\\e738\"}.mdi-device-bluetooth-searching:before{content:\"\\e739\"}.mdi-device-bluetooth:before{content:\"\\e73a\"}.mdi-device-brightness-auto:before{content:\"\\e73b\"}.mdi-device-brightness-high:before{content:\"\\e73c\"}.mdi-device-brightness-low:before{content:\"\\e73d\"}.mdi-device-brightness-medium:before{content:\"\\e73e\"}.mdi-device-data-usage:before{content:\"\\e73f\"}.mdi-device-developer-mode:before{content:\"\\e740\"}.mdi-device-devices:before{content:\"\\e741\"}.mdi-device-dvr:before{content:\"\\e742\"}.mdi-device-gps-fixed:before{content:\"\\e743\"}.mdi-device-gps-not-fixed:before{content:\"\\e744\"}.mdi-device-gps-off:before{content:\"\\e745\"}.mdi-device-location-disabled:before{content:\"\\e746\"}.mdi-device-location-searching:before{content:\"\\e747\"}.mdi-device-multitrack-audio:before{content:\"\\e748\"}.mdi-device-network-cell:before{content:\"\\e749\"}.mdi-device-network-wifi:before{content:\"\\e74a\"}.mdi-device-nfc:before{content:\"\\e74b\"}.mdi-device-now-wallpaper:before{content:\"\\e74c\"}.mdi-device-now-widgets:before{content:\"\\e74d\"}.mdi-device-screen-lock-landscape:before{content:\"\\e74e\"}.mdi-device-screen-lock-portrait:before{content:\"\\e74f\"}.mdi-device-screen-lock-rotation:before{content:\"\\e750\"}.mdi-device-screen-rotation:before{content:\"\\e751\"}.mdi-device-sd-storage:before{content:\"\\e752\"}.mdi-device-settings-system-daydream:before{content:\"\\e753\"}.mdi-device-signal-cellular-0-bar:before{content:\"\\e754\"}.mdi-device-signal-cellular-1-bar:before{content:\"\\e755\"}.mdi-device-signal-cellular-2-bar:before{content:\"\\e756\"}.mdi-device-signal-cellular-3-bar:before{content:\"\\e757\"}.mdi-device-signal-cellular-4-bar:before{content:\"\\e758\"}.mdi-signal-wifi-statusbar-connected-no-internet-after:before{content:\"\\e8f6\"}.mdi-device-signal-cellular-connected-no-internet-0-bar:before{content:\"\\e759\"}.mdi-device-signal-cellular-connected-no-internet-1-bar:before{content:\"\\e75a\"}.mdi-device-signal-cellular-connected-no-internet-2-bar:before{content:\"\\e75b\"}.mdi-device-signal-cellular-connected-no-internet-3-bar:before{content:\"\\e75c\"}.mdi-device-signal-cellular-connected-no-internet-4-bar:before{content:\"\\e75d\"}.mdi-device-signal-cellular-no-sim:before{content:\"\\e75e\"}.mdi-device-signal-cellular-null:before{content:\"\\e75f\"}.mdi-device-signal-cellular-off:before{content:\"\\e760\"}.mdi-device-signal-wifi-0-bar:before{content:\"\\e761\"}.mdi-device-signal-wifi-1-bar:before{content:\"\\e762\"}.mdi-device-signal-wifi-2-bar:before{content:\"\\e763\"}.mdi-device-signal-wifi-3-bar:before{content:\"\\e764\"}.mdi-device-signal-wifi-4-bar:before{content:\"\\e765\"}.mdi-device-signal-wifi-off:before{content:\"\\e766\"}.mdi-device-signal-wifi-statusbar-1-bar:before{content:\"\\e767\"}.mdi-device-signal-wifi-statusbar-2-bar:before{content:\"\\e768\"}.mdi-device-signal-wifi-statusbar-3-bar:before{content:\"\\e769\"}.mdi-device-signal-wifi-statusbar-4-bar:before{content:\"\\e76a\"}.mdi-device-signal-wifi-statusbar-connected-no-internet-:before{content:\"\\e76b\"}.mdi-device-signal-wifi-statusbar-connected-no-internet:before{content:\"\\e76f\"}.mdi-device-signal-wifi-statusbar-connected-no-internet-2:before{content:\"\\e76c\"}.mdi-device-signal-wifi-statusbar-connected-no-internet-3:before{content:\"\\e76d\"}.mdi-device-signal-wifi-statusbar-connected-no-internet-4:before{content:\"\\e76e\"}.mdi-signal-wifi-statusbar-not-connected-after:before{content:\"\\e8f7\"}.mdi-device-signal-wifi-statusbar-not-connected:before{content:\"\\e770\"}.mdi-device-signal-wifi-statusbar-null:before{content:\"\\e771\"}.mdi-device-storage:before{content:\"\\e772\"}.mdi-device-usb:before{content:\"\\e773\"}.mdi-device-wifi-lock:before{content:\"\\e774\"}.mdi-device-wifi-tethering:before{content:\"\\e775\"}.mdi-hardware-cast-connected:before{content:\"\\e7b7\"}.mdi-hardware-cast:before{content:\"\\e7b8\"}.mdi-hardware-computer:before{content:\"\\e7b9\"}.mdi-hardware-desktop-mac:before{content:\"\\e7ba\"}.mdi-hardware-desktop-windows:before{content:\"\\e7bb\"}.mdi-hardware-dock:before{content:\"\\e7bc\"}.mdi-hardware-gamepad:before{content:\"\\e7bd\"}.mdi-hardware-headset-mic:before{content:\"\\e7be\"}.mdi-hardware-headset:before{content:\"\\e7bf\"}.mdi-hardware-keyboard-alt:before{content:\"\\e7c0\"}.mdi-hardware-keyboard-arrow-down:before{content:\"\\e7c1\"}.mdi-hardware-keyboard-arrow-left:before{content:\"\\e7c2\"}.mdi-hardware-keyboard-arrow-right:before{content:\"\\e7c3\"}.mdi-hardware-keyboard-arrow-up:before{content:\"\\e7c4\"}.mdi-hardware-keyboard-backspace:before{content:\"\\e7c5\"}.mdi-hardware-keyboard-capslock:before{content:\"\\e7c6\"}.mdi-hardware-keyboard-control:before{content:\"\\e7c7\"}.mdi-hardware-keyboard-hide:before{content:\"\\e7c8\"}.mdi-hardware-keyboard-return:before{content:\"\\e7c9\"}.mdi-hardware-keyboard-tab:before{content:\"\\e7ca\"}.mdi-hardware-keyboard-voice:before{content:\"\\e7cb\"}.mdi-hardware-keyboard:before{content:\"\\e7cc\"}.mdi-hardware-laptop-chromebook:before{content:\"\\e7cd\"}.mdi-hardware-laptop-mac:before{content:\"\\e7ce\"}.mdi-hardware-laptop-windows:before{content:\"\\e7cf\"}.mdi-hardware-laptop:before{content:\"\\e7d0\"}.mdi-hardware-memory:before{content:\"\\e7d1\"}.mdi-hardware-mouse:before{content:\"\\e7d2\"}.mdi-hardware-phone-android:before{content:\"\\e7d3\"}.mdi-hardware-phone-iphone:before{content:\"\\e7d4\"}.mdi-hardware-phonelink-off:before{content:\"\\e7d5\"}.mdi-hardware-phonelink:before{content:\"\\e7d6\"}.mdi-hardware-security:before{content:\"\\e7d7\"}.mdi-hardware-sim-card:before{content:\"\\e7d8\"}.mdi-hardware-smartphone:before{content:\"\\e7d9\"}.mdi-hardware-speaker:before{content:\"\\e7da\"}.mdi-hardware-tablet-android:before{content:\"\\e7db\"}.mdi-hardware-tablet-mac:before{content:\"\\e7dc\"}.mdi-hardware-tablet:before{content:\"\\e7dd\"}.mdi-hardware-tv:before{content:\"\\e7de\"}.mdi-hardware-watch:before{content:\"\\e7df\"}.mdi-image-add-to-photos:before{content:\"\\e7e0\"}.mdi-image-adjust:before{content:\"\\e7e1\"}.mdi-image-assistant-photo:before{content:\"\\e7e2\"}.mdi-image-audiotrack:before{content:\"\\e7e3\"}.mdi-image-blur-circular:before{content:\"\\e7e4\"}.mdi-image-blur-linear:before{content:\"\\e7e5\"}.mdi-image-blur-off:before{content:\"\\e7e6\"}.mdi-image-blur-on:before{content:\"\\e7e7\"}.mdi-image-brightness-1:before{content:\"\\e7e8\"}.mdi-image-brightness-2:before{content:\"\\e7e9\"}.mdi-image-brightness-3:before{content:\"\\e7ea\"}.mdi-image-brightness-4:before{content:\"\\e7eb\"}.mdi-image-brightness-5:before{content:\"\\e7ec\"}.mdi-image-brightness-6:before{content:\"\\e7ed\"}.mdi-image-brightness-7:before{content:\"\\e7ee\"}.mdi-image-brush:before{content:\"\\e7ef\"}.mdi-image-camera-alt:before{content:\"\\e7f0\"}.mdi-image-camera-front:before{content:\"\\e7f1\"}.mdi-image-camera-rear:before{content:\"\\e7f2\"}.mdi-image-camera-roll:before{content:\"\\e7f3\"}.mdi-image-camera:before{content:\"\\e7f4\"}.mdi-image-center-focus-strong:before{content:\"\\e7f5\"}.mdi-image-center-focus-weak:before{content:\"\\e7f6\"}.mdi-image-collections:before{content:\"\\e7f7\"}.mdi-image-color-lens:before{content:\"\\e7f8\"}.mdi-image-colorize:before{content:\"\\e7f9\"}.mdi-image-compare:before{content:\"\\e7fa\"}.mdi-image-control-point-duplicate:before{content:\"\\e7fb\"}.mdi-image-control-point:before{content:\"\\e7fc\"}.mdi-image-crop-3-2:before{content:\"\\e7fd\"}.mdi-image-crop-5-4:before{content:\"\\e7fe\"}.mdi-image-crop-7-5:before{content:\"\\e7ff\"}.mdi-image-crop-16-9:before{content:\"\\e800\"}.mdi-image-crop-din:before{content:\"\\e801\"}.mdi-image-crop-free:before{content:\"\\e802\"}.mdi-image-crop-landscape:before{content:\"\\e803\"}.mdi-image-crop-original:before{content:\"\\e804\"}.mdi-image-crop-portrait:before{content:\"\\e805\"}.mdi-image-crop-square:before{content:\"\\e806\"}.mdi-image-crop:before{content:\"\\e807\"}.mdi-image-dehaze:before{content:\"\\e808\"}.mdi-image-details:before{content:\"\\e809\"}.mdi-image-edit:before{content:\"\\e80a\"}.mdi-image-exposure-minus-1:before{content:\"\\e80b\"}.mdi-image-exposure-minus-2:before{content:\"\\e80c\"}.mdi-image-exposure-plus-1:before{content:\"\\e80d\"}.mdi-image-exposure-plus-2:before{content:\"\\e80e\"}.mdi-image-exposure-zero:before{content:\"\\e80f\"}.mdi-image-exposure:before{content:\"\\e810\"}.mdi-image-filter-1:before{content:\"\\e811\"}.mdi-image-filter-2:before{content:\"\\e812\"}.mdi-image-filter-3:before{content:\"\\e813\"}.mdi-image-filter-4:before{content:\"\\e814\"}.mdi-image-filter-5:before{content:\"\\e815\"}.mdi-image-filter-6:before{content:\"\\e816\"}.mdi-image-filter-7:before{content:\"\\e817\"}.mdi-image-filter-8:before{content:\"\\e818\"}.mdi-image-filter-9-plus:before{content:\"\\e819\"}.mdi-image-filter-9:before{content:\"\\e81a\"}.mdi-image-filter-b-and-w:before{content:\"\\e81b\"}.mdi-image-filter-center-focus:before{content:\"\\e81c\"}.mdi-image-filter-drama:before{content:\"\\e81d\"}.mdi-image-filter-frames:before{content:\"\\e81e\"}.mdi-image-filter-hdr:before{content:\"\\e81f\"}.mdi-image-filter-none:before{content:\"\\e820\"}.mdi-image-filter-tilt-shift:before{content:\"\\e821\"}.mdi-image-filter-vintage:before{content:\"\\e822\"}.mdi-image-filter:before{content:\"\\e823\"}.mdi-image-flare:before{content:\"\\e824\"}.mdi-image-flash-auto:before{content:\"\\e825\"}.mdi-image-flash-off:before{content:\"\\e826\"}.mdi-image-flash-on:before{content:\"\\e827\"}.mdi-image-flip:before{content:\"\\e828\"}.mdi-image-gradient:before{content:\"\\e829\"}.mdi-image-grain:before{content:\"\\e82a\"}.mdi-image-grid-off:before{content:\"\\e82b\"}.mdi-image-grid-on:before{content:\"\\e82c\"}.mdi-image-hdr-off:before{content:\"\\e82d\"}.mdi-image-hdr-on:before{content:\"\\e82e\"}.mdi-image-hdr-strong:before{content:\"\\e82f\"}.mdi-image-hdr-weak:before{content:\"\\e830\"}.mdi-image-healing:before{content:\"\\e831\"}.mdi-image-image-aspect-ratio:before{content:\"\\e832\"}.mdi-image-image:before{content:\"\\e833\"}.mdi-image-iso:before{content:\"\\e834\"}.mdi-image-landscape:before{content:\"\\e835\"}.mdi-image-leak-add:before{content:\"\\e836\"}.mdi-image-leak-remove:before{content:\"\\e837\"}.mdi-image-lens:before{content:\"\\e838\"}.mdi-image-looks-3:before{content:\"\\e839\"}.mdi-image-looks-4:before{content:\"\\e83a\"}.mdi-image-looks-5:before{content:\"\\e83b\"}.mdi-image-looks-6:before{content:\"\\e83c\"}.mdi-image-looks-one:before{content:\"\\e83d\"}.mdi-image-looks-two:before{content:\"\\e83e\"}.mdi-image-looks:before{content:\"\\e83f\"}.mdi-image-loupe:before{content:\"\\e840\"}.mdi-image-movie-creation:before{content:\"\\e841\"}.mdi-image-nature-people:before{content:\"\\e842\"}.mdi-image-nature:before{content:\"\\e843\"}.mdi-image-navigate-before:before{content:\"\\e844\"}.mdi-image-navigate-next:before{content:\"\\e845\"}.mdi-image-palette:before{content:\"\\e846\"}.mdi-image-panorama-fisheye:before{content:\"\\e847\"}.mdi-image-panorama-horizontal:before{content:\"\\e848\"}.mdi-image-panorama-vertical:before{content:\"\\e849\"}.mdi-image-panorama-wide-angle:before{content:\"\\e84a\"}.mdi-image-panorama:before{content:\"\\e84b\"}.mdi-image-photo-album:before{content:\"\\e84c\"}.mdi-image-photo-camera:before{content:\"\\e84d\"}.mdi-image-photo-library:before{content:\"\\e84e\"}.mdi-image-photo:before{content:\"\\e84f\"}.mdi-image-portrait:before{content:\"\\e850\"}.mdi-image-remove-red-eye:before{content:\"\\e851\"}.mdi-image-rotate-left:before{content:\"\\e852\"}.mdi-image-rotate-right:before{content:\"\\e853\"}.mdi-image-slideshow:before{content:\"\\e854\"}.mdi-image-straighten:before{content:\"\\e855\"}.mdi-image-style:before{content:\"\\e856\"}.mdi-image-switch-camera:before{content:\"\\e857\"}.mdi-image-switch-video:before{content:\"\\e858\"}.mdi-image-tag-faces:before{content:\"\\e859\"}.mdi-image-texture:before{content:\"\\e85a\"}.mdi-image-timelapse:before{content:\"\\e85b\"}.mdi-image-timer-3:before{content:\"\\e85c\"}.mdi-image-timer-10:before{content:\"\\e85d\"}.mdi-image-timer-auto:before{content:\"\\e85e\"}.mdi-image-timer-off:before{content:\"\\e85f\"}.mdi-image-timer:before{content:\"\\e860\"}.mdi-image-tonality:before{content:\"\\e861\"}.mdi-image-transform:before{content:\"\\e862\"}.mdi-image-tune:before{content:\"\\e863\"}.mdi-image-wb-auto:before{content:\"\\e864\"}.mdi-image-wb-cloudy:before{content:\"\\e865\"}.mdi-image-wb-incandescent:before{content:\"\\e866\"}.mdi-image-wb-irradescent:before{content:\"\\e867\"}.mdi-image-wb-sunny:before{content:\"\\e868\"}.mdi-maps-beenhere:before{content:\"\\e869\"}.mdi-maps-directions-bike:before{content:\"\\e86a\"}.mdi-maps-directions-bus:before{content:\"\\e86b\"}.mdi-maps-directions-car:before{content:\"\\e86c\"}.mdi-maps-directions-ferry:before{content:\"\\e86d\"}.mdi-maps-directions-subway:before{content:\"\\e86e\"}.mdi-maps-directions-train:before{content:\"\\e86f\"}.mdi-maps-directions-transit:before{content:\"\\e870\"}.mdi-maps-directions-walk:before{content:\"\\e871\"}.mdi-maps-directions:before{content:\"\\e872\"}.mdi-maps-flight:before{content:\"\\e873\"}.mdi-maps-hotel:before{content:\"\\e874\"}.mdi-maps-layers-clear:before{content:\"\\e875\"}.mdi-maps-layers:before{content:\"\\e876\"}.mdi-maps-local-airport:before{content:\"\\e877\"}.mdi-maps-local-atm:before{content:\"\\e878\"}.mdi-maps-local-attraction:before{content:\"\\e879\"}.mdi-maps-local-bar:before{content:\"\\e87a\"}.mdi-maps-local-cafe:before{content:\"\\e87b\"}.mdi-maps-local-car-wash:before{content:\"\\e87c\"}.mdi-maps-local-convenience-store:before{content:\"\\e87d\"}.mdi-maps-local-drink:before{content:\"\\e87e\"}.mdi-maps-local-florist:before{content:\"\\e87f\"}.mdi-maps-local-gas-station:before{content:\"\\e880\"}.mdi-maps-local-grocery-store:before{content:\"\\e881\"}.mdi-maps-local-hospital:before{content:\"\\e882\"}.mdi-maps-local-hotel:before{content:\"\\e883\"}.mdi-maps-local-laundry-service:before{content:\"\\e884\"}.mdi-maps-local-library:before{content:\"\\e885\"}.mdi-maps-local-mall:before{content:\"\\e886\"}.mdi-maps-local-movies:before{content:\"\\e887\"}.mdi-maps-local-offer:before{content:\"\\e888\"}.mdi-maps-local-parking:before{content:\"\\e889\"}.mdi-maps-local-pharmacy:before{content:\"\\e88a\"}.mdi-maps-local-phone:before{content:\"\\e88b\"}.mdi-maps-local-pizza:before{content:\"\\e88c\"}.mdi-maps-local-play:before{content:\"\\e88d\"}.mdi-maps-local-post-office:before{content:\"\\e88e\"}.mdi-maps-local-print-shop:before{content:\"\\e88f\"}.mdi-maps-local-restaurant:before{content:\"\\e890\"}.mdi-maps-local-see:before{content:\"\\e891\"}.mdi-maps-local-shipping:before{content:\"\\e892\"}.mdi-maps-local-taxi:before{content:\"\\e893\"}.mdi-maps-location-history:before{content:\"\\e894\"}.mdi-maps-map:before{content:\"\\e895\"}.mdi-maps-my-location:before{content:\"\\e896\"}.mdi-maps-navigation:before{content:\"\\e897\"}.mdi-maps-pin-drop:before{content:\"\\e898\"}.mdi-maps-place:before{content:\"\\e899\"}.mdi-maps-rate-review:before{content:\"\\e89a\"}.mdi-maps-restaurant-menu:before{content:\"\\e89b\"}.mdi-maps-satellite:before{content:\"\\e89c\"}.mdi-maps-store-mall-directory:before{content:\"\\e89d\"}.mdi-maps-terrain:before{content:\"\\e89e\"}.mdi-maps-traffic:before{content:\"\\e89f\"}.mdi-navigation-apps:before{content:\"\\e8a0\"}.mdi-navigation-arrow-back:before{content:\"\\e8a1\"}.mdi-navigation-arrow-drop-down-circle:before{content:\"\\e8a2\"}.mdi-navigation-arrow-drop-down:before{content:\"\\e8a3\"}.mdi-navigation-arrow-drop-up:before{content:\"\\e8a4\"}.mdi-navigation-arrow-forward:before{content:\"\\e8a5\"}.mdi-navigation-cancel:before{content:\"\\e8a6\"}.mdi-navigation-check:before{content:\"\\e8a7\"}.mdi-navigation-chevron-left:before{content:\"\\e8a8\"}.mdi-navigation-chevron-right:before{content:\"\\e8a9\"}.mdi-navigation-close:before{content:\"\\e8aa\"}.mdi-navigation-expand-less:before{content:\"\\e8ab\"}.mdi-navigation-expand-more:before{content:\"\\e8ac\"}.mdi-navigation-fullscreen-exit:before{content:\"\\e8ad\"}.mdi-navigation-fullscreen:before{content:\"\\e8ae\"}.mdi-navigation-menu:before{content:\"\\e8af\"}.mdi-navigation-more-horiz:before{content:\"\\e8b0\"}.mdi-navigation-more-vert:before{content:\"\\e8b1\"}.mdi-navigation-refresh:before{content:\"\\e8b2\"}.mdi-navigation-unfold-less:before{content:\"\\e8b3\"}.mdi-navigation-unfold-more:before{content:\"\\e8b4\"}.mdi-notification-adb:before{content:\"\\e8b5\"}.mdi-notification-bluetooth-audio:before{content:\"\\e8b6\"}.mdi-notification-disc-full:before{content:\"\\e8b7\"}.mdi-notification-dnd-forwardslash:before{content:\"\\e8b8\"}.mdi-notification-do-not-disturb:before{content:\"\\e8b9\"}.mdi-notification-drive-eta:before{content:\"\\e8ba\"}.mdi-notification-event-available:before{content:\"\\e8bb\"}.mdi-notification-event-busy:before{content:\"\\e8bc\"}.mdi-notification-event-note:before{content:\"\\e8bd\"}.mdi-notification-folder-special:before{content:\"\\e8be\"}.mdi-notification-mms:before{content:\"\\e8bf\"}.mdi-notification-more:before{content:\"\\e8c0\"}.mdi-notification-network-locked:before{content:\"\\e8c1\"}.mdi-notification-phone-bluetooth-speaker:before{content:\"\\e8c2\"}.mdi-notification-phone-forwarded:before{content:\"\\e8c3\"}.mdi-notification-phone-in-talk:before{content:\"\\e8c4\"}.mdi-notification-phone-locked:before{content:\"\\e8c5\"}.mdi-notification-phone-missed:before{content:\"\\e8c6\"}.mdi-notification-phone-paused:before{content:\"\\e8c7\"}.mdi-notification-play-download:before{content:\"\\e8c8\"}.mdi-notification-play-install:before{content:\"\\e8c9\"}.mdi-notification-sd-card:before{content:\"\\e8ca\"}.mdi-notification-sim-card-alert:before{content:\"\\e8cb\"}.mdi-notification-sms-failed:before{content:\"\\e8cc\"}.mdi-notification-sms:before{content:\"\\e8cd\"}.mdi-notification-sync-disabled:before{content:\"\\e8ce\"}.mdi-notification-sync-problem:before{content:\"\\e8cf\"}.mdi-notification-sync:before{content:\"\\e8d0\"}.mdi-notification-system-update:before{content:\"\\e8d1\"}.mdi-notification-tap-and-play:before{content:\"\\e8d2\"}.mdi-notification-time-to-leave:before{content:\"\\e8d3\"}.mdi-notification-vibration:before{content:\"\\e8d4\"}.mdi-notification-voice-chat:before{content:\"\\e8d5\"}.mdi-notification-vpn-lock:before{content:\"\\e8d6\"}.mdi-social-cake:before{content:\"\\e8d7\"}.mdi-social-domain:before{content:\"\\e8d8\"}.mdi-social-group-add:before{content:\"\\e8d9\"}.mdi-social-group:before{content:\"\\e8da\"}.mdi-social-location-city:before{content:\"\\e8db\"}.mdi-social-mood:before{content:\"\\e8dc\"}.mdi-social-notifications-none:before{content:\"\\e8dd\"}.mdi-social-notifications-off:before{content:\"\\e8de\"}.mdi-social-notifications-on:before{content:\"\\e8df\"}.mdi-social-notifications-paused:before{content:\"\\e8e0\"}.mdi-social-notifications:before{content:\"\\e8e1\"}.mdi-social-pages:before{content:\"\\e8e2\"}.mdi-social-party-mode:before{content:\"\\e8e3\"}.mdi-social-people-outline:before{content:\"\\e8e4\"}.mdi-social-people:before{content:\"\\e8e5\"}.mdi-social-person-add:before{content:\"\\e8e6\"}.mdi-social-person-outline:before{content:\"\\e8e7\"}.mdi-social-person:before{content:\"\\e8e8\"}.mdi-social-plus-one:before{content:\"\\e8e9\"}.mdi-social-poll:before{content:\"\\e8ea\"}.mdi-social-public:before{content:\"\\e8eb\"}.mdi-social-school:before{content:\"\\e8ec\"}.mdi-social-share:before{content:\"\\e8ed\"}.mdi-social-whatshot:before{content:\"\\e8ee\"}.mdi-toggle-check-box-outline-blank:before{content:\"\\e8ef\"}.mdi-toggle-check-box:before{content:\"\\e8f0\"}.mdi-toggle-radio-button-off:before{content:\"\\e8f1\"}.mdi-toggle-radio-button-on:before{content:\"\\e8f2\"}.mdi-toggle-star-half:before{content:\"\\e8f3\"}.mdi-toggle-star-outline:before{content:\"\\e8f4\"}.mdi-toggle-star:before{content:\"\\e8f5\"}.container{margin:0 auto;max-width:1280px;width:90%}@media only screen and (min-width: 601px){.container{width:85%}}@media only screen and (min-width: 993px){.container{width:70%}}.container .row{margin-left:-0.75rem;margin-right:-0.75rem}.section{padding-top:1rem;padding-bottom:1rem}.section.no-pad{padding:0}.section.no-pad-bot{padding-bottom:0}.section.no-pad-top{padding-top:0}.row{margin-left:auto;margin-right:auto;margin-bottom:20px}.row:after{content:\"\";display:table;clear:both}.row .col{float:left;box-sizing:border-box;padding:0 0.75rem}.row .col[class*=\"push-\"],.row .col[class*=\"pull-\"]{position:relative}.row .col.s1{width:8.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.s2{width:16.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.s3{width:25%;margin-left:auto;left:auto;right:auto}.row .col.s4{width:33.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.s5{width:41.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.s6{width:50%;margin-left:auto;left:auto;right:auto}.row .col.s7{width:58.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.s8{width:66.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.s9{width:75%;margin-left:auto;left:auto;right:auto}.row .col.s10{width:83.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.s11{width:91.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.s12{width:100%;margin-left:auto;left:auto;right:auto}.row .col.offset-s1{margin-left:8.3333333333%}.row .col.pull-s1{right:8.3333333333%}.row .col.push-s1{left:8.3333333333%}.row .col.offset-s2{margin-left:16.6666666667%}.row .col.pull-s2{right:16.6666666667%}.row .col.push-s2{left:16.6666666667%}.row .col.offset-s3{margin-left:25%}.row .col.pull-s3{right:25%}.row .col.push-s3{left:25%}.row .col.offset-s4{margin-left:33.3333333333%}.row .col.pull-s4{right:33.3333333333%}.row .col.push-s4{left:33.3333333333%}.row .col.offset-s5{margin-left:41.6666666667%}.row .col.pull-s5{right:41.6666666667%}.row .col.push-s5{left:41.6666666667%}.row .col.offset-s6{margin-left:50%}.row .col.pull-s6{right:50%}.row .col.push-s6{left:50%}.row .col.offset-s7{margin-left:58.3333333333%}.row .col.pull-s7{right:58.3333333333%}.row .col.push-s7{left:58.3333333333%}.row .col.offset-s8{margin-left:66.6666666667%}.row .col.pull-s8{right:66.6666666667%}.row .col.push-s8{left:66.6666666667%}.row .col.offset-s9{margin-left:75%}.row .col.pull-s9{right:75%}.row .col.push-s9{left:75%}.row .col.offset-s10{margin-left:83.3333333333%}.row .col.pull-s10{right:83.3333333333%}.row .col.push-s10{left:83.3333333333%}.row .col.offset-s11{margin-left:91.6666666667%}.row .col.pull-s11{right:91.6666666667%}.row .col.push-s11{left:91.6666666667%}.row .col.offset-s12{margin-left:100%}.row .col.pull-s12{right:100%}.row .col.push-s12{left:100%}@media only screen and (min-width: 601px){.row .col.m1{width:8.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.m2{width:16.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.m3{width:25%;margin-left:auto;left:auto;right:auto}.row .col.m4{width:33.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.m5{width:41.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.m6{width:50%;margin-left:auto;left:auto;right:auto}.row .col.m7{width:58.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.m8{width:66.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.m9{width:75%;margin-left:auto;left:auto;right:auto}.row .col.m10{width:83.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.m11{width:91.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.m12{width:100%;margin-left:auto;left:auto;right:auto}.row .col.offset-m1{margin-left:8.3333333333%}.row .col.pull-m1{right:8.3333333333%}.row .col.push-m1{left:8.3333333333%}.row .col.offset-m2{margin-left:16.6666666667%}.row .col.pull-m2{right:16.6666666667%}.row .col.push-m2{left:16.6666666667%}.row .col.offset-m3{margin-left:25%}.row .col.pull-m3{right:25%}.row .col.push-m3{left:25%}.row .col.offset-m4{margin-left:33.3333333333%}.row .col.pull-m4{right:33.3333333333%}.row .col.push-m4{left:33.3333333333%}.row .col.offset-m5{margin-left:41.6666666667%}.row .col.pull-m5{right:41.6666666667%}.row .col.push-m5{left:41.6666666667%}.row .col.offset-m6{margin-left:50%}.row .col.pull-m6{right:50%}.row .col.push-m6{left:50%}.row .col.offset-m7{margin-left:58.3333333333%}.row .col.pull-m7{right:58.3333333333%}.row .col.push-m7{left:58.3333333333%}.row .col.offset-m8{margin-left:66.6666666667%}.row .col.pull-m8{right:66.6666666667%}.row .col.push-m8{left:66.6666666667%}.row .col.offset-m9{margin-left:75%}.row .col.pull-m9{right:75%}.row .col.push-m9{left:75%}.row .col.offset-m10{margin-left:83.3333333333%}.row .col.pull-m10{right:83.3333333333%}.row .col.push-m10{left:83.3333333333%}.row .col.offset-m11{margin-left:91.6666666667%}.row .col.pull-m11{right:91.6666666667%}.row .col.push-m11{left:91.6666666667%}.row .col.offset-m12{margin-left:100%}.row .col.pull-m12{right:100%}.row .col.push-m12{left:100%}}@media only screen and (min-width: 993px){.row .col.l1{width:8.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.l2{width:16.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.l3{width:25%;margin-left:auto;left:auto;right:auto}.row .col.l4{width:33.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.l5{width:41.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.l6{width:50%;margin-left:auto;left:auto;right:auto}.row .col.l7{width:58.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.l8{width:66.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.l9{width:75%;margin-left:auto;left:auto;right:auto}.row .col.l10{width:83.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.l11{width:91.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.l12{width:100%;margin-left:auto;left:auto;right:auto}.row .col.offset-l1{margin-left:8.3333333333%}.row .col.pull-l1{right:8.3333333333%}.row .col.push-l1{left:8.3333333333%}.row .col.offset-l2{margin-left:16.6666666667%}.row .col.pull-l2{right:16.6666666667%}.row .col.push-l2{left:16.6666666667%}.row .col.offset-l3{margin-left:25%}.row .col.pull-l3{right:25%}.row .col.push-l3{left:25%}.row .col.offset-l4{margin-left:33.3333333333%}.row .col.pull-l4{right:33.3333333333%}.row .col.push-l4{left:33.3333333333%}.row .col.offset-l5{margin-left:41.6666666667%}.row .col.pull-l5{right:41.6666666667%}.row .col.push-l5{left:41.6666666667%}.row .col.offset-l6{margin-left:50%}.row .col.pull-l6{right:50%}.row .col.push-l6{left:50%}.row .col.offset-l7{margin-left:58.3333333333%}.row .col.pull-l7{right:58.3333333333%}.row .col.push-l7{left:58.3333333333%}.row .col.offset-l8{margin-left:66.6666666667%}.row .col.pull-l8{right:66.6666666667%}.row .col.push-l8{left:66.6666666667%}.row .col.offset-l9{margin-left:75%}.row .col.pull-l9{right:75%}.row .col.push-l9{left:75%}.row .col.offset-l10{margin-left:83.3333333333%}.row .col.pull-l10{right:83.3333333333%}.row .col.push-l10{left:83.3333333333%}.row .col.offset-l11{margin-left:91.6666666667%}.row .col.pull-l11{right:91.6666666667%}.row .col.push-l11{left:91.6666666667%}.row .col.offset-l12{margin-left:100%}.row .col.pull-l12{right:100%}.row .col.push-l12{left:100%}}nav{color:#fff;background-color:#ee6e73;width:100%;height:56px;line-height:56px}nav a{color:#fff}nav i,nav [class^=\"mdi-\"],nav [class*=\"mdi-\"],nav i.material-icons{display:block;font-size:2rem;height:56px;line-height:56px}nav .nav-wrapper{position:relative;height:100%}@media only screen and (min-width: 993px){nav a.button-collapse{display:none}}nav .button-collapse{float:left;position:relative;z-index:1;height:56px}nav .button-collapse i{font-size:2.7rem;height:56px;line-height:56px}nav .brand-logo{position:absolute;color:#fff;display:inline-block;font-size:2.1rem;padding:0;white-space:nowrap}nav .brand-logo.center{left:50%;transform:translateX(-50%)}@media only screen and (max-width: 992px){nav .brand-logo{left:50%;transform:translateX(-50%)}nav .brand-logo.left,nav .brand-logo.right{padding:0;transform:none}nav .brand-logo.left{left:0.5rem}nav .brand-logo.right{right:0.5rem;left:auto}}nav .brand-logo.right{right:0.5rem;padding:0}nav ul{margin:0}nav ul li{transition:background-color .3s;float:left;padding:0}nav ul li.active{background-color:rgba(0,0,0,0.1)}nav ul a{transition:background-color .3s;font-size:1rem;color:#fff;display:block;padding:0 15px;cursor:pointer}nav ul a.btn,nav ul a.btn-large,nav ul a.btn-large,nav ul a.btn-flat,nav ul a.btn-floating{margin-top:-2px;margin-left:15px;margin-right:15px}nav ul a:hover{background-color:rgba(0,0,0,0.1)}nav ul.left{float:left}nav .input-field{margin:0}nav .input-field input{height:100%;font-size:1.2rem;border:none;padding-left:2rem}nav .input-field input:focus,nav .input-field input[type=text]:valid,nav .input-field input[type=password]:valid,nav .input-field input[type=email]:valid,nav .input-field input[type=url]:valid,nav .input-field input[type=date]:valid{border:none;box-shadow:none}nav .input-field label{top:0;left:0}nav .input-field label i{color:rgba(255,255,255,0.7);transition:color .3s}nav .input-field label.active i{color:#fff}nav .input-field label.active{transform:translateY(0)}.navbar-fixed{position:relative;height:56px;z-index:998}.navbar-fixed nav{position:fixed}@media only screen and (min-width: 601px){nav,nav .nav-wrapper i,nav a.button-collapse,nav a.button-collapse i{height:64px;line-height:64px}.navbar-fixed{height:64px}}@font-face{font-family:\"Roboto\";src:local(Roboto Thin),url(\"../font/roboto/Roboto-Thin.eot\");src:url(\"../font/roboto/Roboto-Thin.eot?#iefix\") format(\"embedded-opentype\"),url(\"../font/roboto/Roboto-Thin.woff2\") format(\"woff2\"),url(\"../font/roboto/Roboto-Thin.woff\") format(\"woff\"),url(\"../font/roboto/Roboto-Thin.ttf\") format(\"truetype\");font-weight:200}@font-face{font-family:\"Roboto\";src:local(Roboto Light),url(\"../font/roboto/Roboto-Light.eot\");src:url(\"../font/roboto/Roboto-Light.eot?#iefix\") format(\"embedded-opentype\"),url(\"../font/roboto/Roboto-Light.woff2\") format(\"woff2\"),url(\"../font/roboto/Roboto-Light.woff\") format(\"woff\"),url(\"../font/roboto/Roboto-Light.ttf\") format(\"truetype\");font-weight:300}@font-face{font-family:\"Roboto\";src:local(Roboto Regular),url(\"../font/roboto/Roboto-Regular.eot\");src:url(\"../font/roboto/Roboto-Regular.eot?#iefix\") format(\"embedded-opentype\"),url(\"../font/roboto/Roboto-Regular.woff2\") format(\"woff2\"),url(\"../font/roboto/Roboto-Regular.woff\") format(\"woff\"),url(\"../font/roboto/Roboto-Regular.ttf\") format(\"truetype\");font-weight:400}@font-face{font-family:\"Roboto\";src:url(\"../font/roboto/Roboto-Medium.eot\");src:url(\"../font/roboto/Roboto-Medium.eot?#iefix\") format(\"embedded-opentype\"),url(\"../font/roboto/Roboto-Medium.woff2\") format(\"woff2\"),url(\"../font/roboto/Roboto-Medium.woff\") format(\"woff\"),url(\"../font/roboto/Roboto-Medium.ttf\") format(\"truetype\");font-weight:500}@font-face{font-family:\"Roboto\";src:url(\"../font/roboto/Roboto-Bold.eot\");src:url(\"../font/roboto/Roboto-Bold.eot?#iefix\") format(\"embedded-opentype\"),url(\"../font/roboto/Roboto-Bold.woff2\") format(\"woff2\"),url(\"../font/roboto/Roboto-Bold.woff\") format(\"woff\"),url(\"../font/roboto/Roboto-Bold.ttf\") format(\"truetype\");font-weight:700}a{text-decoration:none}html{line-height:1.5;font-family:\"Roboto\", sans-serif;font-weight:normal;color:rgba(0,0,0,0.87)}@media only screen and (min-width: 0){html{font-size:14px}}@media only screen and (min-width: 992px){html{font-size:14.5px}}@media only screen and (min-width: 1200px){html{font-size:15px}}h1,h2,h3,h4,h5,h6{font-weight:400;line-height:1.1}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{font-weight:inherit}h1{font-size:4.2rem;line-height:110%;margin:2.1rem 0 1.68rem 0}h2{font-size:3.56rem;line-height:110%;margin:1.78rem 0 1.424rem 0}h3{font-size:2.92rem;line-height:110%;margin:1.46rem 0 1.168rem 0}h4{font-size:2.28rem;line-height:110%;margin:1.14rem 0 0.912rem 0}h5{font-size:1.64rem;line-height:110%;margin:0.82rem 0 0.656rem 0}h6{font-size:1rem;line-height:110%;margin:0.5rem 0 0.4rem 0}em{font-style:italic}strong{font-weight:500}small{font-size:75%}.light,footer.page-footer .footer-copyright{font-weight:300}.thin{font-weight:200}.flow-text{font-weight:300}@media only screen and (min-width: 360px){.flow-text{font-size:1.2rem}}@media only screen and (min-width: 390px){.flow-text{font-size:1.224rem}}@media only screen and (min-width: 420px){.flow-text{font-size:1.248rem}}@media only screen and (min-width: 450px){.flow-text{font-size:1.272rem}}@media only screen and (min-width: 480px){.flow-text{font-size:1.296rem}}@media only screen and (min-width: 510px){.flow-text{font-size:1.32rem}}@media only screen and (min-width: 540px){.flow-text{font-size:1.344rem}}@media only screen and (min-width: 570px){.flow-text{font-size:1.368rem}}@media only screen and (min-width: 600px){.flow-text{font-size:1.392rem}}@media only screen and (min-width: 630px){.flow-text{font-size:1.416rem}}@media only screen and (min-width: 660px){.flow-text{font-size:1.44rem}}@media only screen and (min-width: 690px){.flow-text{font-size:1.464rem}}@media only screen and (min-width: 720px){.flow-text{font-size:1.488rem}}@media only screen and (min-width: 750px){.flow-text{font-size:1.512rem}}@media only screen and (min-width: 780px){.flow-text{font-size:1.536rem}}@media only screen and (min-width: 810px){.flow-text{font-size:1.56rem}}@media only screen and (min-width: 840px){.flow-text{font-size:1.584rem}}@media only screen and (min-width: 870px){.flow-text{font-size:1.608rem}}@media only screen and (min-width: 900px){.flow-text{font-size:1.632rem}}@media only screen and (min-width: 930px){.flow-text{font-size:1.656rem}}@media only screen and (min-width: 960px){.flow-text{font-size:1.68rem}}@media only screen and (max-width: 360px){.flow-text{font-size:1.2rem}}.card-panel{transition:box-shadow .25s;padding:20px;margin:0.5rem 0 1rem 0;border-radius:2px;background-color:#fff}.card{position:relative;margin:0.5rem 0 1rem 0;background-color:#fff;transition:box-shadow .25s;border-radius:2px}.card .card-title{font-size:24px;font-weight:300}.card .card-title.activator{cursor:pointer}.card.small,.card.medium,.card.large{position:relative}.card.small .card-image,.card.medium .card-image,.card.large .card-image{max-height:60%;overflow:hidden}.card.small .card-content,.card.medium .card-content,.card.large .card-content{max-height:40%;overflow:hidden}.card.small .card-action,.card.medium .card-action,.card.large .card-action{position:absolute;bottom:0;left:0;right:0;z-index:1;background-color:inherit}.card.small{height:300px}.card.medium{height:400px}.card.large{height:500px}.card .card-image{position:relative}.card .card-image img{display:block;border-radius:2px 2px 0 0;position:relative;left:0;right:0;top:0;bottom:0;width:100%}.card .card-image .card-title{color:#fff;position:absolute;bottom:0;left:0;padding:20px}.card .card-content{padding:20px;border-radius:0 0 2px 2px}.card .card-content p{margin:0;color:inherit}.card .card-content .card-title{line-height:48px}.card .card-action{border-top:1px solid rgba(160,160,160,0.2);padding:20px}.card .card-action a:not(.btn):not(.btn-large):not(.btn-floating){color:#ffab40;margin-right:20px;transition:color .3s ease;text-transform:uppercase}.card .card-action a:not(.btn):not(.btn-large):not(.btn-floating):hover{color:#ffd8a6}.card .card-reveal{padding:20px;position:absolute;background-color:#fff;width:100%;overflow-y:auto;top:100%;height:100%;z-index:1;display:none}.card .card-reveal .card-title{cursor:pointer;display:block}#toast-container{display:block;position:fixed;z-index:10000}@media only screen and (max-width: 600px){#toast-container{min-width:100%;bottom:0%}}@media only screen and (min-width: 601px) and (max-width: 992px){#toast-container{left:5%;bottom:7%;max-width:90%}}@media only screen and (min-width: 993px){#toast-container{top:10%;right:7%;max-width:86%}}.toast{border-radius:2px;top:0;width:auto;clear:both;margin-top:10px;position:relative;max-width:100%;height:auto;min-height:48px;line-height:1.5em;word-break:break-all;background-color:#323232;padding:10px 25px;font-size:1.1rem;font-weight:300;color:#fff;display:flex;align-items:center;justify-content:space-between}.toast .btn,.toast .btn-large,.toast .btn-flat{margin:0;margin-left:3rem}.toast.rounded{border-radius:24px}@media only screen and (max-width: 600px){.toast{width:100%;border-radius:0}}@media only screen and (min-width: 601px) and (max-width: 992px){.toast{float:left}}@media only screen and (min-width: 993px){.toast{float:right}}.tabs{display:flex;position:relative;overflow-x:auto;overflow-y:hidden;height:48px;background-color:#fff;margin:0 auto;width:100%;white-space:nowrap}.tabs .tab{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;display:block;float:left;text-align:center;line-height:48px;height:48px;padding:0;margin:0;text-transform:uppercase;text-overflow:ellipsis;overflow:hidden;letter-spacing:.8px;width:15%;min-width:80px}.tabs .tab a{color:#ee6e73;display:block;width:100%;height:100%;text-overflow:ellipsis;overflow:hidden;transition:color .28s ease}.tabs .tab a:hover{color:#f9c9cb}.tabs .tab.disabled a{color:#f9c9cb;cursor:default}.tabs .indicator{position:absolute;bottom:0;height:2px;background-color:#f6b2b5;will-change:left, right}.material-tooltip{padding:10px 8px;font-size:1rem;z-index:2000;background-color:transparent;border-radius:2px;color:#fff;min-height:36px;line-height:120%;opacity:0;display:none;position:absolute;text-align:center;max-width:calc(100% - 4px);overflow:hidden;left:0;top:0;will-change:top, left}.backdrop{position:absolute;opacity:0;display:none;height:7px;width:14px;border-radius:0 0 14px 14px;background-color:#323232;z-index:-1;transform-origin:50% 10%;will-change:transform, opacity}.btn,.btn-large,.btn-flat{border:none;border-radius:2px;display:inline-block;height:36px;line-height:36px;outline:0;padding:0 2rem;text-transform:uppercase;vertical-align:middle;-webkit-tap-highlight-color:transparent}.btn.disabled,.disabled.btn-large,.btn-floating.disabled,.btn-large.disabled,.btn:disabled,.btn-large:disabled,.btn-large:disabled,.btn-floating:disabled{background-color:#DFDFDF !important;box-shadow:none;color:#9F9F9F !important;cursor:default}.btn.disabled *,.disabled.btn-large *,.btn-floating.disabled *,.btn-large.disabled *,.btn:disabled *,.btn-large:disabled *,.btn-large:disabled *,.btn-floating:disabled *{pointer-events:none}.btn.disabled:hover,.disabled.btn-large:hover,.btn-floating.disabled:hover,.btn-large.disabled:hover,.btn:disabled:hover,.btn-large:disabled:hover,.btn-large:disabled:hover,.btn-floating:disabled:hover{background-color:#DFDFDF;color:#9F9F9F}.btn i,.btn-large i,.btn-floating i,.btn-large i,.btn-flat i{font-size:1.3rem;line-height:inherit}.btn,.btn-large{text-decoration:none;color:#fff;background-color:#26a69a;text-align:center;letter-spacing:.5px;transition:.2s ease-out;cursor:pointer}.btn:hover,.btn-large:hover{background-color:#2bbbad}.btn-floating{display:inline-block;color:#fff;position:relative;overflow:hidden;z-index:1;width:37px;height:37px;line-height:37px;padding:0;background-color:#26a69a;border-radius:50%;transition:.3s;cursor:pointer;vertical-align:middle}.btn-floating i{width:inherit;display:inline-block;text-align:center;color:#fff;font-size:1.6rem;line-height:37px}.btn-floating:hover{background-color:#26a69a}.btn-floating:before{border-radius:0}.btn-floating.btn-large{width:55.5px;height:55.5px}.btn-floating.btn-large i{line-height:55.5px}button.btn-floating{border:none}.fixed-action-btn{position:fixed;right:23px;bottom:23px;padding-top:15px;margin-bottom:0;z-index:998}.fixed-action-btn.active ul{visibility:visible}.fixed-action-btn.horizontal{padding:0 0 0 15px}.fixed-action-btn.horizontal ul{text-align:right;right:64px;top:50%;transform:translateY(-50%);height:100%;left:initial;width:500px}.fixed-action-btn.horizontal ul li{display:inline-block;margin:15px 15px 0 0}.fixed-action-btn ul{left:0;right:0;text-align:center;position:absolute;bottom:64px;margin:0;visibility:hidden}.fixed-action-btn ul li{margin-bottom:15px}.fixed-action-btn ul a.btn-floating{opacity:0}.btn-flat{box-shadow:none;background-color:transparent;color:#343434;cursor:pointer}.btn-flat.disabled{color:#b3b3b3;cursor:default}.btn-large{height:54px;line-height:56px}.btn-large i{font-size:1.6rem}.btn-block{display:block}.dropdown-content{background-color:#fff;margin:0;display:none;min-width:100px;max-height:650px;overflow-y:auto;opacity:0;position:absolute;z-index:999;will-change:width, height}.dropdown-content li{clear:both;color:rgba(0,0,0,0.87);cursor:pointer;min-height:50px;line-height:1.5rem;width:100%;text-align:left;text-transform:none}.dropdown-content li:hover,.dropdown-content li.active,.dropdown-content li.selected{background-color:#eee}.dropdown-content li.active.selected{background-color:#e1e1e1}.dropdown-content li.divider{min-height:0;height:1px}.dropdown-content li>a,.dropdown-content li>span{font-size:16px;color:#26a69a;display:block;line-height:22px;padding:14px 16px}.dropdown-content li>span>label{top:1px;left:3px;height:18px}.dropdown-content li>a>i{height:inherit;line-height:inherit}/*!\n * Waves v0.6.0\n * http://fian.my.id/Waves\n *\n * Copyright 2014 Alfiana E. Sibuea and other contributors\n * Released under the MIT license\n * https://github.com/fians/Waves/blob/master/LICENSE\n */.waves-effect{position:relative;cursor:pointer;display:inline-block;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;vertical-align:middle;z-index:1;will-change:opacity, transform;transition:all .3s ease-out}.waves-effect .waves-ripple{position:absolute;border-radius:50%;width:20px;height:20px;margin-top:-10px;margin-left:-10px;opacity:0;background:rgba(0,0,0,0.2);transition:all 0.7s ease-out;transition-property:transform, opacity;transform:scale(0);pointer-events:none}.waves-effect.waves-light .waves-ripple{background-color:rgba(255,255,255,0.45)}.waves-effect.waves-red .waves-ripple{background-color:rgba(244,67,54,0.7)}.waves-effect.waves-yellow .waves-ripple{background-color:rgba(255,235,59,0.7)}.waves-effect.waves-orange .waves-ripple{background-color:rgba(255,152,0,0.7)}.waves-effect.waves-purple .waves-ripple{background-color:rgba(156,39,176,0.7)}.waves-effect.waves-green .waves-ripple{background-color:rgba(76,175,80,0.7)}.waves-effect.waves-teal .waves-ripple{background-color:rgba(0,150,136,0.7)}.waves-effect input[type=\"button\"],.waves-effect input[type=\"reset\"],.waves-effect input[type=\"submit\"]{border:0;font-style:normal;font-size:inherit;text-transform:inherit;background:none}.waves-notransition{transition:none !important}.waves-circle{transform:translateZ(0);-webkit-mask-image:-webkit-radial-gradient(circle, #fff 100%, #000 100%)}.waves-input-wrapper{border-radius:0.2em;vertical-align:bottom}.waves-input-wrapper .waves-button-input{position:relative;top:0;left:0;z-index:1}.waves-circle{text-align:center;width:2.5em;height:2.5em;line-height:2.5em;border-radius:50%;-webkit-mask-image:none}.waves-block{display:block}a.waves-effect .waves-ripple{z-index:-1}.modal{display:none;position:fixed;left:0;right:0;background-color:#fafafa;padding:0;max-height:70%;width:55%;margin:auto;overflow-y:auto;border-radius:2px;will-change:top, opacity}@media only screen and (max-width: 992px){.modal{width:80%}}.modal h1,.modal h2,.modal h3,.modal h4{margin-top:0}.modal .modal-content{padding:24px}.modal .modal-close{cursor:pointer}.modal .modal-footer{border-radius:0 0 2px 2px;background-color:#fafafa;padding:4px 6px;height:56px;width:100%}.modal .modal-footer .btn,.modal .modal-footer .btn-large,.modal .modal-footer .btn-flat{float:right;margin:6px 0}.lean-overlay{position:fixed;z-index:999;top:-100px;left:0;bottom:0;right:0;height:125%;width:100%;background:#000;display:none;will-change:opacity}.modal.modal-fixed-footer{padding:0;height:70%}.modal.modal-fixed-footer .modal-content{position:absolute;height:calc(100% - 56px);max-height:100%;width:100%;overflow-y:auto}.modal.modal-fixed-footer .modal-footer{border-top:1px solid rgba(0,0,0,0.1);position:absolute;bottom:0}.modal.bottom-sheet{top:auto;bottom:-100%;margin:0;width:100%;max-height:45%;border-radius:0;will-change:bottom, opacity}.collapsible{border-top:1px solid #ddd;border-right:1px solid #ddd;border-left:1px solid #ddd;margin:0.5rem 0 1rem 0}.collapsible-header{display:block;cursor:pointer;min-height:3rem;line-height:3rem;padding:0 1rem;background-color:#fff;border-bottom:1px solid #ddd}.collapsible-header i{width:2rem;font-size:1.6rem;line-height:3rem;display:block;float:left;text-align:center;margin-right:1rem}.collapsible-body{display:none;border-bottom:1px solid #ddd;box-sizing:border-box}.collapsible-body p{margin:0;padding:2rem}.side-nav .collapsible{border:none;box-shadow:none}.side-nav .collapsible li{padding:0}.side-nav .collapsible-header{background-color:transparent;border:none;line-height:inherit;height:inherit;margin:0 1rem}.side-nav .collapsible-header i{line-height:inherit}.side-nav .collapsible-body{border:0;background-color:#fff}.side-nav .collapsible-body li a{margin:0 1rem 0 2rem}.collapsible.popout{border:none;box-shadow:none}.collapsible.popout>li{box-shadow:0 2px 5px 0 rgba(0,0,0,0.16),0 2px 10px 0 rgba(0,0,0,0.12);margin:0 24px;transition:margin 0.35s cubic-bezier(0.25, 0.46, 0.45, 0.94)}.collapsible.popout>li.active{box-shadow:0 5px 11px 0 rgba(0,0,0,0.18),0 4px 15px 0 rgba(0,0,0,0.15);margin:16px 0}.chip{display:inline-block;height:32px;font-size:13px;font-weight:500;color:rgba(0,0,0,0.6);line-height:32px;padding:0 12px;border-radius:16px;background-color:#e4e4e4}.chip img{float:left;margin:0 8px 0 -12px;height:32px;width:32px;border-radius:50%}.chip i.material-icons{cursor:pointer;float:right;font-size:16px;line-height:32px;padding-left:8px}.materialboxed{display:block;cursor:zoom-in;position:relative;transition:opacity .4s}.materialboxed:hover{will-change:left, top, width, height}.materialboxed:hover:not(.active){opacity:.8}.materialboxed.active{cursor:zoom-out}#materialbox-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background-color:#292929;z-index:999;will-change:opacity}.materialbox-caption{position:fixed;display:none;color:#fff;line-height:50px;bottom:0;width:100%;text-align:center;padding:0% 15%;height:50px;z-index:1000;-webkit-font-smoothing:antialiased}select:focus{outline:1px solid #c9f3ef}button:focus{outline:none;background-color:#2ab7a9}label{font-size:0.8rem;color:#9e9e9e}::-webkit-input-placeholder{color:#d1d1d1}:-moz-placeholder{color:#d1d1d1}::-moz-placeholder{color:#d1d1d1}:-ms-input-placeholder{color:#d1d1d1}input:not([type]),input[type=text],input[type=password],input[type=email],input[type=url],input[type=time],input[type=date],input[type=datetime-local],input[type=tel],input[type=number],input[type=search],textarea.materialize-textarea{background-color:transparent;border:none;border-bottom:1px solid #9e9e9e;border-radius:0;outline:none;height:3rem;width:100%;font-size:1rem;margin:0 0 15px 0;padding:0;box-shadow:none;box-sizing:content-box;transition:all .3s}input:not([type]):disabled,input:not([type])[readonly=\"readonly\"],input[type=text]:disabled,input[type=text][readonly=\"readonly\"],input[type=password]:disabled,input[type=password][readonly=\"readonly\"],input[type=email]:disabled,input[type=email][readonly=\"readonly\"],input[type=url]:disabled,input[type=url][readonly=\"readonly\"],input[type=time]:disabled,input[type=time][readonly=\"readonly\"],input[type=date]:disabled,input[type=date][readonly=\"readonly\"],input[type=datetime-local]:disabled,input[type=datetime-local][readonly=\"readonly\"],input[type=tel]:disabled,input[type=tel][readonly=\"readonly\"],input[type=number]:disabled,input[type=number][readonly=\"readonly\"],input[type=search]:disabled,input[type=search][readonly=\"readonly\"],textarea.materialize-textarea:disabled,textarea.materialize-textarea[readonly=\"readonly\"]{color:rgba(0,0,0,0.26);border-bottom:1px dotted rgba(0,0,0,0.26)}input:not([type]):disabled+label,input:not([type])[readonly=\"readonly\"]+label,input[type=text]:disabled+label,input[type=text][readonly=\"readonly\"]+label,input[type=password]:disabled+label,input[type=password][readonly=\"readonly\"]+label,input[type=email]:disabled+label,input[type=email][readonly=\"readonly\"]+label,input[type=url]:disabled+label,input[type=url][readonly=\"readonly\"]+label,input[type=time]:disabled+label,input[type=time][readonly=\"readonly\"]+label,input[type=date]:disabled+label,input[type=date][readonly=\"readonly\"]+label,input[type=datetime-local]:disabled+label,input[type=datetime-local][readonly=\"readonly\"]+label,input[type=tel]:disabled+label,input[type=tel][readonly=\"readonly\"]+label,input[type=number]:disabled+label,input[type=number][readonly=\"readonly\"]+label,input[type=search]:disabled+label,input[type=search][readonly=\"readonly\"]+label,textarea.materialize-textarea:disabled+label,textarea.materialize-textarea[readonly=\"readonly\"]+label{color:rgba(0,0,0,0.26)}input:not([type]):focus:not([readonly]),input[type=text]:focus:not([readonly]),input[type=password]:focus:not([readonly]),input[type=email]:focus:not([readonly]),input[type=url]:focus:not([readonly]),input[type=time]:focus:not([readonly]),input[type=date]:focus:not([readonly]),input[type=datetime-local]:focus:not([readonly]),input[type=tel]:focus:not([readonly]),input[type=number]:focus:not([readonly]),input[type=search]:focus:not([readonly]),textarea.materialize-textarea:focus:not([readonly]){border-bottom:1px solid #26a69a;box-shadow:0 1px 0 0 #26a69a}input:not([type]):focus:not([readonly])+label,input[type=text]:focus:not([readonly])+label,input[type=password]:focus:not([readonly])+label,input[type=email]:focus:not([readonly])+label,input[type=url]:focus:not([readonly])+label,input[type=time]:focus:not([readonly])+label,input[type=date]:focus:not([readonly])+label,input[type=datetime-local]:focus:not([readonly])+label,input[type=tel]:focus:not([readonly])+label,input[type=number]:focus:not([readonly])+label,input[type=search]:focus:not([readonly])+label,textarea.materialize-textarea:focus:not([readonly])+label{color:#26a69a}input:not([type]).valid,input:not([type]):focus.valid,input[type=text].valid,input[type=text]:focus.valid,input[type=password].valid,input[type=password]:focus.valid,input[type=email].valid,input[type=email]:focus.valid,input[type=url].valid,input[type=url]:focus.valid,input[type=time].valid,input[type=time]:focus.valid,input[type=date].valid,input[type=date]:focus.valid,input[type=datetime-local].valid,input[type=datetime-local]:focus.valid,input[type=tel].valid,input[type=tel]:focus.valid,input[type=number].valid,input[type=number]:focus.valid,input[type=search].valid,input[type=search]:focus.valid,textarea.materialize-textarea.valid,textarea.materialize-textarea:focus.valid{border-bottom:1px solid #4CAF50;box-shadow:0 1px 0 0 #4CAF50}input:not([type]).valid+label:after,input:not([type]):focus.valid+label:after,input[type=text].valid+label:after,input[type=text]:focus.valid+label:after,input[type=password].valid+label:after,input[type=password]:focus.valid+label:after,input[type=email].valid+label:after,input[type=email]:focus.valid+label:after,input[type=url].valid+label:after,input[type=url]:focus.valid+label:after,input[type=time].valid+label:after,input[type=time]:focus.valid+label:after,input[type=date].valid+label:after,input[type=date]:focus.valid+label:after,input[type=datetime-local].valid+label:after,input[type=datetime-local]:focus.valid+label:after,input[type=tel].valid+label:after,input[type=tel]:focus.valid+label:after,input[type=number].valid+label:after,input[type=number]:focus.valid+label:after,input[type=search].valid+label:after,input[type=search]:focus.valid+label:after,textarea.materialize-textarea.valid+label:after,textarea.materialize-textarea:focus.valid+label:after{content:attr(data-success);color:#4CAF50;opacity:1}input:not([type]).invalid,input:not([type]):focus.invalid,input[type=text].invalid,input[type=text]:focus.invalid,input[type=password].invalid,input[type=password]:focus.invalid,input[type=email].invalid,input[type=email]:focus.invalid,input[type=url].invalid,input[type=url]:focus.invalid,input[type=time].invalid,input[type=time]:focus.invalid,input[type=date].invalid,input[type=date]:focus.invalid,input[type=datetime-local].invalid,input[type=datetime-local]:focus.invalid,input[type=tel].invalid,input[type=tel]:focus.invalid,input[type=number].invalid,input[type=number]:focus.invalid,input[type=search].invalid,input[type=search]:focus.invalid,textarea.materialize-textarea.invalid,textarea.materialize-textarea:focus.invalid{border-bottom:1px solid #F44336;box-shadow:0 1px 0 0 #F44336}input:not([type]).invalid+label:after,input:not([type]):focus.invalid+label:after,input[type=text].invalid+label:after,input[type=text]:focus.invalid+label:after,input[type=password].invalid+label:after,input[type=password]:focus.invalid+label:after,input[type=email].invalid+label:after,input[type=email]:focus.invalid+label:after,input[type=url].invalid+label:after,input[type=url]:focus.invalid+label:after,input[type=time].invalid+label:after,input[type=time]:focus.invalid+label:after,input[type=date].invalid+label:after,input[type=date]:focus.invalid+label:after,input[type=datetime-local].invalid+label:after,input[type=datetime-local]:focus.invalid+label:after,input[type=tel].invalid+label:after,input[type=tel]:focus.invalid+label:after,input[type=number].invalid+label:after,input[type=number]:focus.invalid+label:after,input[type=search].invalid+label:after,input[type=search]:focus.invalid+label:after,textarea.materialize-textarea.invalid+label:after,textarea.materialize-textarea:focus.invalid+label:after{content:attr(data-error);color:#F44336;opacity:1}input:not([type])+label:after,input[type=text]+label:after,input[type=password]+label:after,input[type=email]+label:after,input[type=url]+label:after,input[type=time]+label:after,input[type=date]+label:after,input[type=datetime-local]+label:after,input[type=tel]+label:after,input[type=number]+label:after,input[type=search]+label:after,textarea.materialize-textarea+label:after{display:block;content:\"\";position:absolute;top:65px;opacity:0;transition:.2s opacity ease-out, .2s color ease-out}.input-field{position:relative;margin-top:1rem}.input-field label{color:#9e9e9e;position:absolute;top:0.8rem;left:0.75rem;font-size:1rem;cursor:text;transition:.2s ease-out}.input-field label.active{font-size:0.8rem;transform:translateY(-140%)}.input-field .prefix{position:absolute;width:3rem;font-size:2rem;transition:color .2s}.input-field .prefix.active{color:#26a69a}.input-field .prefix ~ input,.input-field .prefix ~ .select-wrapper,.input-field .prefix ~ textarea{margin-left:3rem;width:92%;width:calc(100% - 3rem)}.input-field .prefix ~ textarea{padding-top:.8rem}.input-field .prefix ~ label{margin-left:3rem}@media only screen and (max-width: 992px){.input-field .prefix ~ input{width:86%;width:calc(100% - 3rem)}}@media only screen and (max-width: 600px){.input-field .prefix ~ input{width:80%;width:calc(100% - 3rem)}}.input-field input[type=search]{display:block;line-height:inherit;padding-left:4rem;width:calc(100% - 4rem)}.input-field input[type=search]:focus{background-color:#fff;border:0;box-shadow:none;color:#444}.input-field input[type=search]:focus+label i,.input-field input[type=search]:focus ~ .mdi-navigation-close,.input-field input[type=search]:focus ~ .material-icons{color:#444}.input-field input[type=search]+label{left:1rem}.input-field input[type=search] ~ .mdi-navigation-close,.input-field input[type=search] ~ .material-icons{position:absolute;top:0;right:1rem;color:transparent;cursor:pointer;font-size:2rem;transition:.3s color}textarea{width:100%;height:3rem;background-color:transparent}textarea.materialize-textarea{overflow-y:hidden;padding:1.6rem 0;resize:none;min-height:3rem}.hiddendiv{display:none;white-space:pre-wrap;word-wrap:break-word;overflow-wrap:break-word;padding-top:1.2rem}[type=\"radio\"]:not(:checked),[type=\"radio\"]:checked{position:absolute;left:-9999px;visibility:hidden}[type=\"radio\"]:not(:checked)+label,[type=\"radio\"]:checked+label{position:relative;padding-left:35px;cursor:pointer;display:inline-block;height:25px;line-height:25px;font-size:1rem;transition:.28s ease;-khtml-user-select:none;user-select:none}[type=\"radio\"]+label:before,[type=\"radio\"]+label:after{content:'';position:absolute;left:0;top:0;margin:4px;width:16px;height:16px;z-index:0;transition:.28s ease}[type=\"radio\"]:not(:checked)+label:before{border-radius:50%;border:2px solid #5a5a5a}[type=\"radio\"]:not(:checked)+label:after{border-radius:50%;border:2px solid #5a5a5a;z-index:-1;transform:scale(0)}[type=\"radio\"]:checked+label:before{border-radius:50%;border:2px solid transparent}[type=\"radio\"]:checked+label:after{border-radius:50%;border:2px solid #26a69a;background-color:#26a69a;z-index:0;transform:scale(1.02)}[type=\"radio\"].with-gap:checked+label:before{border-radius:50%;border:2px solid #26a69a}[type=\"radio\"].with-gap:checked+label:after{border-radius:50%;border:2px solid #26a69a;background-color:#26a69a;z-index:0;transform:scale(0.5)}[type=\"radio\"].with-gap:disabled:checked+label:before{border:2px solid rgba(0,0,0,0.26)}[type=\"radio\"].with-gap:disabled:checked+label:after{border:none;background-color:rgba(0,0,0,0.26)}[type=\"radio\"]:disabled:not(:checked)+label:before,[type=\"radio\"]:disabled:checked+label:before{background-color:transparent;border-color:rgba(0,0,0,0.26)}[type=\"radio\"]:disabled+label{color:rgba(0,0,0,0.26)}[type=\"radio\"]:disabled:not(:checked)+label:before{border-color:rgba(0,0,0,0.26)}[type=\"radio\"]:disabled:checked+label:after{background-color:rgba(0,0,0,0.26);border-color:#BDBDBD}form p{margin-bottom:10px;text-align:left}form p:last-child{margin-bottom:0}[type=\"checkbox\"]:not(:checked),[type=\"checkbox\"]:checked{position:absolute;left:-9999px;visibility:hidden}[type=\"checkbox\"]+label{position:relative;padding-left:35px;cursor:pointer;display:inline-block;height:25px;line-height:25px;font-size:1rem;-webkit-user-select:none;-moz-user-select:none;-khtml-user-select:none;-ms-user-select:none}[type=\"checkbox\"]+label:before{content:'';position:absolute;top:0;left:0;width:18px;height:18px;z-index:0;border:2px solid #5a5a5a;border-radius:1px;margin-top:2px;transition:.2s}[type=\"checkbox\"]:not(:checked):disabled+label:before{border:none;background-color:rgba(0,0,0,0.26)}[type=\"checkbox\"]:checked+label:before{top:-4px;left:-3px;width:12px;height:22px;border-top:2px solid transparent;border-left:2px solid transparent;border-right:2px solid #26a69a;border-bottom:2px solid #26a69a;transform:rotate(40deg);backface-visibility:hidden;transform-origin:100% 100%}[type=\"checkbox\"]:checked:disabled+label:before{border-right:2px solid rgba(0,0,0,0.26);border-bottom:2px solid rgba(0,0,0,0.26)}[type=\"checkbox\"]:indeterminate+label:before{left:-10px;top:-11px;width:10px;height:22px;border-top:none;border-left:none;border-right:2px solid #26a69a;border-bottom:none;transform:rotate(90deg);backface-visibility:hidden;transform-origin:100% 100%}[type=\"checkbox\"]:indeterminate:disabled+label:before{border-right:2px solid rgba(0,0,0,0.26);background-color:transparent}[type=\"checkbox\"].filled-in+label:after{border-radius:2px}[type=\"checkbox\"].filled-in+label:before,[type=\"checkbox\"].filled-in+label:after{content:'';left:0;position:absolute;transition:border .25s, background-color .25s, width .20s .1s, height .20s .1s, top .20s .1s, left .20s .1s;z-index:1}[type=\"checkbox\"].filled-in:not(:checked)+label:before{width:0;height:0;border:3px solid transparent;left:6px;top:10px;-webkit-transform:rotateZ(37deg);transform:rotateZ(37deg);-webkit-transform-origin:20% 40%;transform-origin:100% 100%}[type=\"checkbox\"].filled-in:not(:checked)+label:after{height:20px;width:20px;background-color:transparent;border:2px solid #5a5a5a;top:0px;z-index:0}[type=\"checkbox\"].filled-in:checked+label:before{top:0;left:1px;width:8px;height:13px;border-top:2px solid transparent;border-left:2px solid transparent;border-right:2px solid #fff;border-bottom:2px solid #fff;-webkit-transform:rotateZ(37deg);transform:rotateZ(37deg);-webkit-transform-origin:100% 100%;transform-origin:100% 100%}[type=\"checkbox\"].filled-in:checked+label:after{top:0px;width:20px;height:20px;border:2px solid #26a69a;background-color:#26a69a;z-index:0}[type=\"checkbox\"].filled-in:disabled:not(:checked)+label:before{background-color:transparent;border:2px solid transparent}[type=\"checkbox\"].filled-in:disabled:not(:checked)+label:after{border-color:transparent;background-color:#BDBDBD}[type=\"checkbox\"].filled-in:disabled:checked+label:before{background-color:transparent}[type=\"checkbox\"].filled-in:disabled:checked+label:after{background-color:#BDBDBD;border-color:#BDBDBD}.switch,.switch *{-webkit-user-select:none;-moz-user-select:none;-khtml-user-select:none;-ms-user-select:none}.switch label{cursor:pointer}.switch label input[type=checkbox]{opacity:0;width:0;height:0}.switch label input[type=checkbox]:checked+.lever{background-color:#84c7c1}.switch label input[type=checkbox]:checked+.lever:after{background-color:#26a69a}.switch label .lever{content:\"\";display:inline-block;position:relative;width:40px;height:15px;background-color:#818181;border-radius:15px;margin-right:10px;transition:background 0.3s ease;vertical-align:middle;margin:0 16px}.switch label .lever:after{content:\"\";position:absolute;display:inline-block;width:21px;height:21px;background-color:#F1F1F1;border-radius:21px;box-shadow:0 1px 3px 1px rgba(0,0,0,0.4);left:-5px;top:-3px;transition:left 0.3s ease, background .3s ease, box-shadow 0.1s ease}input[type=checkbox]:checked:not(:disabled) ~ .lever:active:after{box-shadow:0 1px 3px 1px rgba(0,0,0,0.4),0 0 0 15px rgba(38,166,154,0.1)}input[type=checkbox]:not(:disabled) ~ .lever:active:after{box-shadow:0 1px 3px 1px rgba(0,0,0,0.4),0 0 0 15px rgba(0,0,0,0.08)}.switch label input[type=checkbox]:checked+.lever:after{left:24px}.switch input[type=checkbox][disabled]+.lever{cursor:default}.switch label input[type=checkbox][disabled]+.lever:after,.switch label input[type=checkbox][disabled]:checked+.lever:after{background-color:#BDBDBD}.select-label{position:absolute}.select-wrapper{position:relative}.select-wrapper input.select-dropdown{position:relative;cursor:pointer;background-color:transparent;border:none;border-bottom:1px solid #9e9e9e;outline:none;height:3rem;line-height:3rem;width:100%;font-size:1rem;margin:0 0 15px 0;padding:0;display:block}.select-wrapper span.caret{color:initial;position:absolute;right:0;top:16px;font-size:10px}.select-wrapper span.caret.disabled{color:rgba(0,0,0,0.26)}.select-wrapper+label{position:absolute;top:-14px;font-size:0.8rem}select{display:none}select.browser-default{display:block}select:disabled{color:rgba(0,0,0,0.3)}.select-wrapper input.select-dropdown:disabled{color:rgba(0,0,0,0.3);cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;border-bottom:1px solid rgba(0,0,0,0.3)}.select-wrapper i{color:rgba(0,0,0,0.3)}.select-dropdown li.disabled,.select-dropdown li.disabled>span,.select-dropdown li.optgroup{color:rgba(0,0,0,0.3);background-color:transparent}.select-dropdown li img{height:40px;width:40px;margin:5px 15px;float:right}.select-dropdown li.optgroup{border-top:1px solid #eee}.select-dropdown li.optgroup.selected>span{color:rgba(0,0,0,0.7)}.select-dropdown li.optgroup>span{color:rgba(0,0,0,0.4)}.select-dropdown li.optgroup ~ li:not(.optgroup){padding-left:1rem}.file-field{position:relative}.file-field .file-path-wrapper{overflow:hidden;padding-left:10px}.file-field input.file-path{width:100%}.file-field .btn,.file-field .btn-large{float:left;height:3rem;line-height:3rem}.file-field span{cursor:pointer}.file-field input[type=file]{position:absolute;top:0;right:0;left:0;bottom:0;width:100%;margin:0;padding:0;font-size:20px;cursor:pointer;opacity:0;filter:alpha(opacity=0)}.range-field{position:relative}input[type=range],input[type=range]+.thumb{cursor:pointer}input[type=range]{position:relative;background-color:transparent;border:none;outline:none;width:100%;margin:15px 0px;padding:0}input[type=range]+.thumb{position:absolute;border:none;height:0;width:0;border-radius:50%;background-color:#26a69a;top:10px;margin-left:-6px;transform-origin:50% 50%;transform:rotate(-45deg)}input[type=range]+.thumb .value{display:block;width:30px;text-align:center;color:#26a69a;font-size:0;transform:rotate(45deg)}input[type=range]+.thumb.active{border-radius:50% 50% 50% 0}input[type=range]+.thumb.active .value{color:#fff;margin-left:-1px;margin-top:8px;font-size:10px}input[type=range]:focus{outline:none}input[type=range]{-webkit-appearance:none}input[type=range]::-webkit-slider-runnable-track{height:3px;background:#c2c0c2;border:none}input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;border:none;height:14px;width:14px;border-radius:50%;background-color:#26a69a;transform-origin:50% 50%;margin:-5px 0 0 0;transition:.3s}input[type=range]:focus::-webkit-slider-runnable-track{background:#ccc}input[type=range]{border:1px solid white}input[type=range]::-moz-range-track{height:3px;background:#ddd;border:none}input[type=range]::-moz-range-thumb{border:none;height:14px;width:14px;border-radius:50%;background:#26a69a;margin-top:-5px}input[type=range]:-moz-focusring{outline:1px solid white;outline-offset:-1px}input[type=range]:focus::-moz-range-track{background:#ccc}input[type=range]::-ms-track{height:3px;background:transparent;border-color:transparent;border-width:6px 0;color:transparent}input[type=range]::-ms-fill-lower{background:#777}input[type=range]::-ms-fill-upper{background:#ddd}input[type=range]::-ms-thumb{border:none;height:14px;width:14px;border-radius:50%;background:#26a69a}input[type=range]:focus::-ms-fill-lower{background:#888}input[type=range]:focus::-ms-fill-upper{background:#ccc}select{background-color:rgba(255,255,255,0.9);width:100%;padding:5px;border:1px solid #f2f2f2;border-radius:2px;height:3rem}.table-of-contents.fixed{position:fixed}.table-of-contents li{padding:2px 0}.table-of-contents a{display:inline-block;font-weight:300;color:#757575;padding-left:20px;height:1.5rem;line-height:1.5rem;letter-spacing:.4;display:inline-block}.table-of-contents a:hover{color:#a8a8a8;padding-left:19px;border-left:1px solid #ea4a4f}.table-of-contents a.active{font-weight:500;padding-left:18px;border-left:2px solid #ea4a4f}.side-nav{position:fixed;width:240px;left:-105%;top:0;margin:0;height:100%;height:calc(100% + 60px);height:-moz-calc(100%);padding-bottom:60px;background-color:#fff;z-index:999;overflow-y:auto;will-change:left}.side-nav.right-aligned{will-change:right;right:-105%;left:auto}.side-nav .collapsible{margin:0}.side-nav li{float:none;padding:0 15px;line-height:64px}.side-nav li:hover,.side-nav li.active{background-color:#ddd}.side-nav a{color:#444;display:block;font-size:1rem;height:64px;line-height:64px;padding:0 15px}.drag-target{height:100%;width:10px;position:fixed;top:0;z-index:998}.side-nav.fixed a{display:block;padding:0 15px;color:#444}.side-nav.fixed{left:0;position:fixed}.side-nav.fixed.right-aligned{right:0;left:auto}@media only screen and (max-width: 992px){.side-nav.fixed{left:-105%}.side-nav.fixed.right-aligned{right:-105%;left:auto}}.side-nav .collapsible-body li.active,.side-nav.fixed .collapsible-body li.active{background-color:#ee6e73}.side-nav .collapsible-body li.active a,.side-nav.fixed .collapsible-body li.active a{color:#fff}#sidenav-overlay{position:fixed;top:0;left:0;right:0;height:120vh;background-color:rgba(0,0,0,0.5);z-index:997;will-change:opacity}.preloader-wrapper{display:inline-block;position:relative;width:48px;height:48px}.preloader-wrapper.small{width:36px;height:36px}.preloader-wrapper.big{width:64px;height:64px}.preloader-wrapper.active{-webkit-animation:container-rotate 1568ms linear infinite;animation:container-rotate 1568ms linear infinite}@-webkit-keyframes container-rotate{to{-webkit-transform:rotate(360deg)}}@keyframes container-rotate{to{transform:rotate(360deg)}}.spinner-layer{position:absolute;width:100%;height:100%;opacity:0;border-color:#26a69a}.spinner-blue,.spinner-blue-only{border-color:#4285f4}.spinner-red,.spinner-red-only{border-color:#db4437}.spinner-yellow,.spinner-yellow-only{border-color:#f4b400}.spinner-green,.spinner-green-only{border-color:#0f9d58}.active .spinner-layer.spinner-blue{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,blue-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,blue-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}.active .spinner-layer.spinner-red{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,red-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,red-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}.active .spinner-layer.spinner-yellow{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,yellow-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,yellow-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}.active .spinner-layer.spinner-green{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,green-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,green-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}.active .spinner-layer,.active .spinner-layer.spinner-blue-only,.active .spinner-layer.spinner-red-only,.active .spinner-layer.spinner-yellow-only,.active .spinner-layer.spinner-green-only{opacity:1;-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}@-webkit-keyframes fill-unfill-rotate{12.5%{-webkit-transform:rotate(135deg)}25%{-webkit-transform:rotate(270deg)}37.5%{-webkit-transform:rotate(405deg)}50%{-webkit-transform:rotate(540deg)}62.5%{-webkit-transform:rotate(675deg)}75%{-webkit-transform:rotate(810deg)}87.5%{-webkit-transform:rotate(945deg)}to{-webkit-transform:rotate(1080deg)}}@keyframes fill-unfill-rotate{12.5%{transform:rotate(135deg)}25%{transform:rotate(270deg)}37.5%{transform:rotate(405deg)}50%{transform:rotate(540deg)}62.5%{transform:rotate(675deg)}75%{transform:rotate(810deg)}87.5%{transform:rotate(945deg)}to{transform:rotate(1080deg)}}@-webkit-keyframes blue-fade-in-out{from{opacity:1}25%{opacity:1}26%{opacity:0}89%{opacity:0}90%{opacity:1}100%{opacity:1}}@keyframes blue-fade-in-out{from{opacity:1}25%{opacity:1}26%{opacity:0}89%{opacity:0}90%{opacity:1}100%{opacity:1}}@-webkit-keyframes red-fade-in-out{from{opacity:0}15%{opacity:0}25%{opacity:1}50%{opacity:1}51%{opacity:0}}@keyframes red-fade-in-out{from{opacity:0}15%{opacity:0}25%{opacity:1}50%{opacity:1}51%{opacity:0}}@-webkit-keyframes yellow-fade-in-out{from{opacity:0}40%{opacity:0}50%{opacity:1}75%{opacity:1}76%{opacity:0}}@keyframes yellow-fade-in-out{from{opacity:0}40%{opacity:0}50%{opacity:1}75%{opacity:1}76%{opacity:0}}@-webkit-keyframes green-fade-in-out{from{opacity:0}65%{opacity:0}75%{opacity:1}90%{opacity:1}100%{opacity:0}}@keyframes green-fade-in-out{from{opacity:0}65%{opacity:0}75%{opacity:1}90%{opacity:1}100%{opacity:0}}.gap-patch{position:absolute;top:0;left:45%;width:10%;height:100%;overflow:hidden;border-color:inherit}.gap-patch .circle{width:1000%;left:-450%}.circle-clipper{display:inline-block;position:relative;width:50%;height:100%;overflow:hidden;border-color:inherit}.circle-clipper .circle{width:200%;height:100%;border-width:3px;border-style:solid;border-color:inherit;border-bottom-color:transparent !important;border-radius:50%;-webkit-animation:none;animation:none;position:absolute;top:0;right:0;bottom:0}.circle-clipper.left .circle{left:0;border-right-color:transparent !important;-webkit-transform:rotate(129deg);transform:rotate(129deg)}.circle-clipper.right .circle{left:-100%;border-left-color:transparent !important;-webkit-transform:rotate(-129deg);transform:rotate(-129deg)}.active .circle-clipper.left .circle{-webkit-animation:left-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:left-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}.active .circle-clipper.right .circle{-webkit-animation:right-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:right-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}@-webkit-keyframes left-spin{from{-webkit-transform:rotate(130deg)}50%{-webkit-transform:rotate(-5deg)}to{-webkit-transform:rotate(130deg)}}@keyframes left-spin{from{transform:rotate(130deg)}50%{transform:rotate(-5deg)}to{transform:rotate(130deg)}}@-webkit-keyframes right-spin{from{-webkit-transform:rotate(-130deg)}50%{-webkit-transform:rotate(5deg)}to{-webkit-transform:rotate(-130deg)}}@keyframes right-spin{from{transform:rotate(-130deg)}50%{transform:rotate(5deg)}to{transform:rotate(-130deg)}}#spinnerContainer.cooldown{-webkit-animation:container-rotate 1568ms linear infinite,fade-out 400ms cubic-bezier(0.4, 0, 0.2, 1);animation:container-rotate 1568ms linear infinite,fade-out 400ms cubic-bezier(0.4, 0, 0.2, 1)}@-webkit-keyframes fade-out{from{opacity:1}to{opacity:0}}@keyframes fade-out{from{opacity:1}to{opacity:0}}.slider{position:relative;height:400px;width:100%}.slider.fullscreen{height:100%;width:100%;position:absolute;top:0;left:0;right:0;bottom:0}.slider.fullscreen ul.slides{height:100%}.slider.fullscreen ul.indicators{z-index:2;bottom:30px}.slider .slides{background-color:#9e9e9e;margin:0;height:400px}.slider .slides li{opacity:0;position:absolute;top:0;left:0;z-index:1;width:100%;height:inherit;overflow:hidden}.slider .slides li img{height:100%;width:100%;background-size:cover;background-position:center}.slider .slides li .caption{color:#fff;position:absolute;top:15%;left:15%;width:70%;opacity:0}.slider .slides li .caption p{color:#e0e0e0}.slider .slides li.active{z-index:2}.slider .indicators{position:absolute;text-align:center;left:0;right:0;bottom:0;margin:0}.slider .indicators .indicator-item{display:inline-block;position:relative;cursor:pointer;height:16px;width:16px;margin:0 12px;background-color:#e0e0e0;transition:background-color .3s;border-radius:50%}.slider .indicators .indicator-item.active{background-color:#4CAF50}.carousel{overflow:hidden;position:relative;width:100%;height:400px;perspective:500px;transform-style:preserve-3d;transform-origin:0% 50%}.carousel .carousel-item{width:200px;position:absolute;top:0;left:0}.carousel .carousel-item img{width:100%}.carousel.carousel-slider{top:0;left:0;height:0}.carousel.carousel-slider .carousel-item{width:100%;height:100%;position:absolute;top:0;left:0}.picker{font-size:16px;text-align:left;line-height:1.2;color:#000000;position:absolute;z-index:10000;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.picker__input{cursor:default}.picker__input.picker__input--active{border-color:#0089ec}.picker__holder{width:100%;overflow-y:auto;-webkit-overflow-scrolling:touch}/*!\n * Default mobile-first, responsive styling for pickadate.js\n * Demo: http://amsul.github.io/pickadate.js\n */.picker__holder,.picker__frame{bottom:0;left:0;right:0;top:100%}.picker__holder{position:fixed;-webkit-transition:background 0.15s ease-out, top 0s 0.15s;-moz-transition:background 0.15s ease-out, top 0s 0.15s;transition:background 0.15s ease-out, top 0s 0.15s;-webkit-backface-visibility:hidden}.picker__frame{position:absolute;margin:0 auto;min-width:256px;width:300px;max-height:350px;-ms-filter:\"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)\";filter:alpha(opacity=0);-moz-opacity:0;opacity:0;-webkit-transition:all 0.15s ease-out;-moz-transition:all 0.15s ease-out;transition:all 0.15s ease-out}@media (min-height: 28.875em){.picker__frame{overflow:visible;top:auto;bottom:-100%;max-height:80%}}@media (min-height: 40.125em){.picker__frame{margin-bottom:7.5%}}.picker__wrap{display:table;width:100%;height:100%}@media (min-height: 28.875em){.picker__wrap{display:block}}.picker__box{background:#ffffff;display:table-cell;vertical-align:middle}@media (min-height: 28.875em){.picker__box{display:block;border:1px solid #777777;border-top-color:#898989;border-bottom-width:0;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0;-webkit-box-shadow:0 12px 36px 16px rgba(0,0,0,0.24);-moz-box-shadow:0 12px 36px 16px rgba(0,0,0,0.24);box-shadow:0 12px 36px 16px rgba(0,0,0,0.24)}}.picker--opened .picker__holder{top:0;background:transparent;-ms-filter:\"progid:DXImageTransform.Microsoft.gradient(startColorstr=#1E000000,endColorstr=#1E000000)\";zoom:1;background:rgba(0,0,0,0.32);-webkit-transition:background 0.15s ease-out;-moz-transition:background 0.15s ease-out;transition:background 0.15s ease-out}.picker--opened .picker__frame{top:0;-ms-filter:\"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)\";filter:alpha(opacity=100);-moz-opacity:1;opacity:1}@media (min-height: 35.875em){.picker--opened .picker__frame{top:10%;bottom:20%auto}}.picker__input.picker__input--active{border-color:#E3F2FD}.picker__frame{margin:0 auto;max-width:325px}@media (min-height: 38.875em){.picker--opened .picker__frame{top:10%;bottom:auto}}.picker__box{padding:0 1em}.picker__header{text-align:center;position:relative;margin-top:.75em}.picker__month,.picker__year{display:inline-block;margin-left:.25em;margin-right:.25em}.picker__select--month,.picker__select--year{height:2em;padding:0;margin-left:.25em;margin-right:.25em}.picker__select--month.browser-default{display:inline;background-color:#FFFFFF;width:40%}.picker__select--year.browser-default{display:inline;background-color:#FFFFFF;width:25%}.picker__select--month:focus,.picker__select--year:focus{border-color:rgba(0,0,0,0.05)}.picker__nav--prev,.picker__nav--next{position:absolute;padding:.5em 1.25em;width:1em;height:1em;box-sizing:content-box;top:-0.25em}.picker__nav--prev{left:-1em;padding-right:1.25em}.picker__nav--next{right:-1em;padding-left:1.25em}.picker__nav--disabled,.picker__nav--disabled:hover,.picker__nav--disabled:before,.picker__nav--disabled:before:hover{cursor:default;background:none;border-right-color:#f5f5f5;border-left-color:#f5f5f5}.picker__table{text-align:center;border-collapse:collapse;border-spacing:0;table-layout:fixed;font-size:1rem;width:100%;margin-top:.75em;margin-bottom:.5em}.picker__table th,.picker__table td{text-align:center}.picker__table td{margin:0;padding:0}.picker__weekday{width:14.285714286%;font-size:.75em;padding-bottom:.25em;color:#999999;font-weight:500}@media (min-height: 33.875em){.picker__weekday{padding-bottom:.5em}}.picker__day--today{position:relative;color:#595959;letter-spacing:-.3;padding:.75rem 0;font-weight:400;border:1px solid transparent}.picker__day--disabled:before{border-top-color:#aaaaaa}.picker__day--infocus:hover{cursor:pointer;color:#000;font-weight:500}.picker__day--outfocus{display:none;padding:.75rem 0;color:#fff}.picker__day--outfocus:hover{cursor:pointer;color:#dddddd;font-weight:500}.picker__day--highlighted:hover,.picker--focused .picker__day--highlighted{cursor:pointer}.picker__day--selected,.picker__day--selected:hover,.picker--focused .picker__day--selected{border-radius:50%;transform:scale(0.75);background:#0089ec;color:#ffffff}.picker__day--disabled,.picker__day--disabled:hover,.picker--focused .picker__day--disabled{background:#f5f5f5;border-color:#f5f5f5;color:#dddddd;cursor:default}.picker__day--highlighted.picker__day--disabled,.picker__day--highlighted.picker__day--disabled:hover{background:#bbbbbb}.picker__footer{text-align:center;display:flex;align-items:center;justify-content:space-between}.picker__button--today,.picker__button--clear,.picker__button--close{border:1px solid #ffffff;background:#ffffff;font-size:.8em;padding:.66em 0;font-weight:bold;width:33%;display:inline-block;vertical-align:bottom}.picker__button--today:hover,.picker__button--clear:hover,.picker__button--close:hover{cursor:pointer;color:#000000;background:#b1dcfb;border-bottom-color:#b1dcfb}.picker__button--today:focus,.picker__button--clear:focus,.picker__button--close:focus{background:#b1dcfb;border-color:rgba(0,0,0,0.05);outline:none}.picker__button--today:before,.picker__button--clear:before,.picker__button--close:before{position:relative;display:inline-block;height:0}.picker__button--today:before,.picker__button--clear:before{content:\" \";margin-right:.45em}.picker__button--today:before{top:-0.05em;width:0;border-top:0.66em solid #0059bc;border-left:.66em solid transparent}.picker__button--clear:before{top:-0.25em;width:.66em;border-top:3px solid #ee2200}.picker__button--close:before{content:\"\\D7\";top:-0.1em;vertical-align:top;font-size:1.1em;margin-right:.35em;color:#777777}.picker__button--today[disabled],.picker__button--today[disabled]:hover{background:#f5f5f5;border-color:#f5f5f5;color:#dddddd;cursor:default}.picker__button--today[disabled]:before{border-top-color:#aaaaaa}.picker__box{border-radius:2px;overflow:hidden}.picker__date-display{text-align:center;background-color:#26a69a;color:#fff;padding-bottom:15px;font-weight:300}.picker__nav--prev:hover,.picker__nav--next:hover{cursor:pointer;color:#000000;background:#a1ded8}.picker__weekday-display{background-color:#1f897f;padding:10px;font-weight:200;letter-spacing:.5;font-size:1rem;margin-bottom:15px}.picker__month-display{text-transform:uppercase;font-size:2rem}.picker__day-display{font-size:4.5rem;font-weight:400}.picker__year-display{font-size:1.8rem;color:rgba(255,255,255,0.4)}.picker__box{padding:0}.picker__calendar-container{padding:0 1rem}.picker__calendar-container thead{border:none}.picker__table{margin-top:0;margin-bottom:.5em}.picker__day--infocus{color:#595959;letter-spacing:-.3;padding:.75rem 0;font-weight:400;border:1px solid transparent}.picker__day.picker__day--today{color:#26a69a}.picker__day.picker__day--today.picker__day--selected{color:#fff}.picker__weekday{font-size:.9rem}.picker__day--selected,.picker__day--selected:hover,.picker--focused .picker__day--selected{border-radius:50%;transform:scale(0.9);background-color:#26a69a;color:#ffffff}.picker__day--selected.picker__day--outfocus,.picker__day--selected:hover.picker__day--outfocus,.picker--focused .picker__day--selected.picker__day--outfocus{background-color:#a1ded8}.picker__footer{text-align:right;padding:5px 10px}.picker__close,.picker__today{font-size:1.1rem;padding:0 1rem;color:#26a69a}.picker__nav--prev:before,.picker__nav--next:before{content:\" \";border-top:.5em solid transparent;border-bottom:.5em solid transparent;border-right:0.75em solid #676767;width:0;height:0;display:block;margin:0 auto}.picker__nav--next:before{border-right:0;border-left:0.75em solid #676767}button.picker__today:focus,button.picker__clear:focus,button.picker__close:focus{background-color:#a1ded8}.picker__list{list-style:none;padding:0.75em 0 4.2em;margin:0}.picker__list-item{border-bottom:1px solid #dddddd;border-top:1px solid #dddddd;margin-bottom:-1px;position:relative;background:#ffffff;padding:.75em 1.25em}@media (min-height: 46.75em){.picker__list-item{padding:.5em 1em}}.picker__list-item:hover{cursor:pointer;color:#000000;background:#b1dcfb;border-color:#0089ec;z-index:10}.picker__list-item--highlighted{border-color:#0089ec;z-index:10}.picker__list-item--highlighted:hover,.picker--focused .picker__list-item--highlighted{cursor:pointer;color:#000000;background:#b1dcfb}.picker__list-item--selected,.picker__list-item--selected:hover,.picker--focused .picker__list-item--selected{background:#0089ec;color:#ffffff;z-index:10}.picker__list-item--disabled,.picker__list-item--disabled:hover,.picker--focused .picker__list-item--disabled{background:#f5f5f5;border-color:#f5f5f5;color:#dddddd;cursor:default;border-color:#dddddd;z-index:auto}.picker--time .picker__button--clear{display:block;width:80%;margin:1em auto 0;padding:1em 1.25em;background:none;border:0;font-weight:500;font-size:.67em;text-align:center;text-transform:uppercase;color:#666}.picker--time .picker__button--clear:hover,.picker--time .picker__button--clear:focus{color:#000000;background:#b1dcfb;background:#ee2200;border-color:#ee2200;cursor:pointer;color:#ffffff;outline:none}.picker--time .picker__button--clear:before{top:-0.25em;color:#666;font-size:1.25em;font-weight:bold}.picker--time .picker__button--clear:hover:before,.picker--time .picker__button--clear:focus:before{color:#ffffff}.picker--time .picker__frame{min-width:256px;max-width:320px}.picker--time .picker__box{font-size:1em;background:#f2f2f2;padding:0}@media (min-height: 40.125em){.picker--time .picker__box{margin-bottom:5em}}\n"
  },
  {
    "path": "themes/default/public/font/material-design-icons/LICENSE.txt",
    "content": "https://github.com/google/material-design-icons/blob/master/LICENSE\nhttps://github.com/FezVrasta/bootstrap-material-design/blob/master/fonts/LICENSE.txt\n\nAttribution-ShareAlike 4.0 International\n\n=======================================================================\n\nCreative Commons Corporation (\"Creative Commons\") is not a law firm and\ndoes not provide legal services or legal advice. Distribution of\nCreative Commons public licenses does not create a lawyer-client or\nother relationship. Creative Commons makes its licenses and related\ninformation available on an \"as-is\" basis. Creative Commons gives no\nwarranties regarding its licenses, any material licensed under their\nterms and conditions, or any related information. Creative Commons\ndisclaims all liability for damages resulting from their use to the\nfullest extent possible.\n\nUsing Creative Commons Public Licenses\n\nCreative Commons public licenses provide a standard set of terms and\nconditions that creators and other rights holders may use to share\noriginal works of authorship and other material subject to copyright\nand certain other rights specified in the public license below. The\nfollowing considerations are for informational purposes only, are not\nexhaustive, and do not form part of our licenses.\n\n     Considerations for licensors: Our public licenses are\n     intended for use by those authorized to give the public\n     permission to use material in ways otherwise restricted by\n     copyright and certain other rights. Our licenses are\n     irrevocable. Licensors should read and understand the terms\n     and conditions of the license they choose before applying it.\n     Licensors should also secure all rights necessary before\n     applying our licenses so that the public can reuse the\n     material as expected. Licensors should clearly mark any\n     material not subject to the license. This includes other CC-\n     licensed material, or material used under an exception or\n     limitation to copyright. More considerations for licensors:\n    wiki.creativecommons.org/Considerations_for_licensors\n\n     Considerations for the public: By using one of our public\n     licenses, a licensor grants the public permission to use the\n     licensed material under specified terms and conditions. If\n     the licensor's permission is not necessary for any reason--for\n     example, because of any applicable exception or limitation to\n     copyright--then that use is not regulated by the license. Our\n     licenses grant only permissions under copyright and certain\n     other rights that a licensor has authority to grant. Use of\n     the licensed material may still be restricted for other\n     reasons, including because others have copyright or other\n     rights in the material. A licensor may make special requests,\n     such as asking that all changes be marked or described.\n     Although not required by our licenses, you are encouraged to\n     respect those requests where reasonable. More_considerations\n     for the public:\n    wiki.creativecommons.org/Considerations_for_licensees\n\n=======================================================================\n\nCreative Commons Attribution-ShareAlike 4.0 International Public\nLicense\n\nBy exercising the Licensed Rights (defined below), You accept and agree\nto be bound by the terms and conditions of this Creative Commons\nAttribution-ShareAlike 4.0 International Public License (\"Public\nLicense\"). To the extent this Public License may be interpreted as a\ncontract, You are granted the Licensed Rights in consideration of Your\nacceptance of these terms and conditions, and the Licensor grants You\nsuch rights in consideration of benefits the Licensor receives from\nmaking the Licensed Material available under these terms and\nconditions.\n\n\nSection 1 -- Definitions.\n\n  a. Adapted Material means material subject to Copyright and Similar\n     Rights that is derived from or based upon the Licensed Material\n     and in which the Licensed Material is translated, altered,\n     arranged, transformed, or otherwise modified in a manner requiring\n     permission under the Copyright and Similar Rights held by the\n     Licensor. For purposes of this Public License, where the Licensed\n     Material is a musical work, performance, or sound recording,\n     Adapted Material is always produced where the Licensed Material is\n     synched in timed relation with a moving image.\n\n  b. Adapter's License means the license You apply to Your Copyright\n     and Similar Rights in Your contributions to Adapted Material in\n     accordance with the terms and conditions of this Public License.\n\n  c. BY-SA Compatible License means a license listed at\n     creativecommons.org/compatiblelicenses, approved by Creative\n     Commons as essentially the equivalent of this Public License.\n\n  d. Copyright and Similar Rights means copyright and/or similar rights\n     closely related to copyright including, without limitation,\n     performance, broadcast, sound recording, and Sui Generis Database\n     Rights, without regard to how the rights are labeled or\n     categorized. For purposes of this Public License, the rights\n     specified in Section 2(b)(1)-(2) are not Copyright and Similar\n     Rights.\n\n  e. Effective Technological Measures means those measures that, in the\n     absence of proper authority, may not be circumvented under laws\n     fulfilling obligations under Article 11 of the WIPO Copyright\n     Treaty adopted on December 20, 1996, and/or similar international\n     agreements.\n\n  f. Exceptions and Limitations means fair use, fair dealing, and/or\n     any other exception or limitation to Copyright and Similar Rights\n     that applies to Your use of the Licensed Material.\n\n  g. License Elements means the license attributes listed in the name\n     of a Creative Commons Public License. The License Elements of this\n     Public License are Attribution and ShareAlike.\n\n  h. Licensed Material means the artistic or literary work, database,\n     or other material to which the Licensor applied this Public\n     License.\n\n  i. Licensed Rights means the rights granted to You subject to the\n     terms and conditions of this Public License, which are limited to\n     all Copyright and Similar Rights that apply to Your use of the\n     Licensed Material and that the Licensor has authority to license.\n\n  j. Licensor means the individual(s) or entity(ies) granting rights\n     under this Public License.\n\n  k. Share means to provide material to the public by any means or\n     process that requires permission under the Licensed Rights, such\n     as reproduction, public display, public performance, distribution,\n     dissemination, communication, or importation, and to make material\n     available to the public including in ways that members of the\n     public may access the material from a place and at a time\n     individually chosen by them.\n\n  l. Sui Generis Database Rights means rights other than copyright\n     resulting from Directive 96/9/EC of the European Parliament and of\n     the Council of 11 March 1996 on the legal protection of databases,\n     as amended and/or succeeded, as well as other essentially\n     equivalent rights anywhere in the world.\n\n  m. You means the individual or entity exercising the Licensed Rights\n     under this Public License. Your has a corresponding meaning.\n\n\nSection 2 -- Scope.\n\n  a. License grant.\n\n       1. Subject to the terms and conditions of this Public License,\n          the Licensor hereby grants You a worldwide, royalty-free,\n          non-sublicensable, non-exclusive, irrevocable license to\n          exercise the Licensed Rights in the Licensed Material to:\n\n            a. reproduce and Share the Licensed Material, in whole or\n               in part; and\n\n            b. produce, reproduce, and Share Adapted Material.\n\n       2. Exceptions and Limitations. For the avoidance of doubt, where\n          Exceptions and Limitations apply to Your use, this Public\n          License does not apply, and You do not need to comply with\n          its terms and conditions.\n\n       3. Term. The term of this Public License is specified in Section\n          6(a).\n\n       4. Media and formats; technical modifications allowed. The\n          Licensor authorizes You to exercise the Licensed Rights in\n          all media and formats whether now known or hereafter created,\n          and to make technical modifications necessary to do so. The\n          Licensor waives and/or agrees not to assert any right or\n          authority to forbid You from making technical modifications\n          necessary to exercise the Licensed Rights, including\n          technical modifications necessary to circumvent Effective\n          Technological Measures. For purposes of this Public License,\n          simply making modifications authorized by this Section 2(a)\n          (4) never produces Adapted Material.\n\n       5. Downstream recipients.\n\n            a. Offer from the Licensor -- Licensed Material. Every\n               recipient of the Licensed Material automatically\n               receives an offer from the Licensor to exercise the\n               Licensed Rights under the terms and conditions of this\n               Public License.\n\n            b. Additional offer from the Licensor -- Adapted Material.\n               Every recipient of Adapted Material from You\n               automatically receives an offer from the Licensor to\n               exercise the Licensed Rights in the Adapted Material\n               under the conditions of the Adapter's License You apply.\n\n            c. No downstream restrictions. You may not offer or impose\n               any additional or different terms or conditions on, or\n               apply any Effective Technological Measures to, the\n               Licensed Material if doing so restricts exercise of the\n               Licensed Rights by any recipient of the Licensed\n               Material.\n\n       6. No endorsement. Nothing in this Public License constitutes or\n          may be construed as permission to assert or imply that You\n          are, or that Your use of the Licensed Material is, connected\n          with, or sponsored, endorsed, or granted official status by,\n          the Licensor or others designated to receive attribution as\n          provided in Section 3(a)(1)(A)(i).\n\n  b. Other rights.\n\n       1. Moral rights, such as the right of integrity, are not\n          licensed under this Public License, nor are publicity,\n          privacy, and/or other similar personality rights; however, to\n          the extent possible, the Licensor waives and/or agrees not to\n          assert any such rights held by the Licensor to the limited\n          extent necessary to allow You to exercise the Licensed\n          Rights, but not otherwise.\n\n       2. Patent and trademark rights are not licensed under this\n          Public License.\n\n       3. To the extent possible, the Licensor waives any right to\n          collect royalties from You for the exercise of the Licensed\n          Rights, whether directly or through a collecting society\n          under any voluntary or waivable statutory or compulsory\n          licensing scheme. In all other cases the Licensor expressly\n          reserves any right to collect such royalties.\n\n\nSection 3 -- License Conditions.\n\nYour exercise of the Licensed Rights is expressly made subject to the\nfollowing conditions.\n\n  a. Attribution.\n\n       1. If You Share the Licensed Material (including in modified\n          form), You must:\n\n            a. retain the following if it is supplied by the Licensor\n               with the Licensed Material:\n\n                 i. identification of the creator(s) of the Licensed\n                    Material and any others designated to receive\n                    attribution, in any reasonable manner requested by\n                    the Licensor (including by pseudonym if\n                    designated);\n\n                ii. a copyright notice;\n\n               iii. a notice that refers to this Public License;\n\n                iv. a notice that refers to the disclaimer of\n                    warranties;\n\n                 v. a URI or hyperlink to the Licensed Material to the\n                    extent reasonably practicable;\n\n            b. indicate if You modified the Licensed Material and\n               retain an indication of any previous modifications; and\n\n            c. indicate the Licensed Material is licensed under this\n               Public License, and include the text of, or the URI or\n               hyperlink to, this Public License.\n\n       2. You may satisfy the conditions in Section 3(a)(1) in any\n          reasonable manner based on the medium, means, and context in\n          which You Share the Licensed Material. For example, it may be\n          reasonable to satisfy the conditions by providing a URI or\n          hyperlink to a resource that includes the required\n          information.\n\n       3. If requested by the Licensor, You must remove any of the\n          information required by Section 3(a)(1)(A) to the extent\n          reasonably practicable.\n\n  b. ShareAlike.\n\n     In addition to the conditions in Section 3(a), if You Share\n     Adapted Material You produce, the following conditions also apply.\n\n       1. The Adapter's License You apply must be a Creative Commons\n          license with the same License Elements, this version or\n          later, or a BY-SA Compatible License.\n\n       2. You must include the text of, or the URI or hyperlink to, the\n          Adapter's License You apply. You may satisfy this condition\n          in any reasonable manner based on the medium, means, and\n          context in which You Share Adapted Material.\n\n       3. You may not offer or impose any additional or different terms\n          or conditions on, or apply any Effective Technological\n          Measures to, Adapted Material that restrict exercise of the\n          rights granted under the Adapter's License You apply.\n\n\nSection 4 -- Sui Generis Database Rights.\n\nWhere the Licensed Rights include Sui Generis Database Rights that\napply to Your use of the Licensed Material:\n\n  a. for the avoidance of doubt, Section 2(a)(1) grants You the right\n     to extract, reuse, reproduce, and Share all or a substantial\n     portion of the contents of the database;\n\n  b. if You include all or a substantial portion of the database\n     contents in a database in which You have Sui Generis Database\n     Rights, then the database in which You have Sui Generis Database\n     Rights (but not its individual contents) is Adapted Material,\n\n     including for purposes of Section 3(b); and\n  c. You must comply with the conditions in Section 3(a) if You Share\n     all or a substantial portion of the contents of the database.\n\nFor the avoidance of doubt, this Section 4 supplements and does not\nreplace Your obligations under this Public License where the Licensed\nRights include other Copyright and Similar Rights.\n\n\nSection 5 -- Disclaimer of Warranties and Limitation of Liability.\n\n  a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE\n     EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS\n     AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF\n     ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,\n     IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,\n     WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR\n     PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,\n     ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT\n     KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT\n     ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.\n\n  b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE\n     TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,\n     NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,\n     INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,\n     COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR\n     USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN\n     ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR\n     DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR\n     IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.\n\n  c. The disclaimer of warranties and limitation of liability provided\n     above shall be interpreted in a manner that, to the extent\n     possible, most closely approximates an absolute disclaimer and\n     waiver of all liability.\n\n\nSection 6 -- Term and Termination.\n\n  a. This Public License applies for the term of the Copyright and\n     Similar Rights licensed here. However, if You fail to comply with\n     this Public License, then Your rights under this Public License\n     terminate automatically.\n\n  b. Where Your right to use the Licensed Material has terminated under\n     Section 6(a), it reinstates:\n\n       1. automatically as of the date the violation is cured, provided\n          it is cured within 30 days of Your discovery of the\n          violation; or\n\n       2. upon express reinstatement by the Licensor.\n\n     For the avoidance of doubt, this Section 6(b) does not affect any\n     right the Licensor may have to seek remedies for Your violations\n     of this Public License.\n\n  c. For the avoidance of doubt, the Licensor may also offer the\n     Licensed Material under separate terms or conditions or stop\n     distributing the Licensed Material at any time; however, doing so\n     will not terminate this Public License.\n\n  d. Sections 1, 5, 6, 7, and 8 survive termination of this Public\n     License.\n\n\nSection 7 -- Other Terms and Conditions.\n\n  a. The Licensor shall not be bound by any additional or different\n     terms or conditions communicated by You unless expressly agreed.\n\n  b. Any arrangements, understandings, or agreements regarding the\n     Licensed Material not stated herein are separate from and\n     independent of the terms and conditions of this Public License.\n\n\nSection 8 -- Interpretation.\n\n  a. For the avoidance of doubt, this Public License does not, and\n     shall not be interpreted to, reduce, limit, restrict, or impose\n     conditions on any use of the Licensed Material that could lawfully\n     be made without permission under this Public License.\n\n  b. To the extent possible, if any provision of this Public License is\n     deemed unenforceable, it shall be automatically reformed to the\n     minimum extent necessary to make it enforceable. If the provision\n     cannot be reformed, it shall be severed from this Public License\n     without affecting the enforceability of the remaining terms and\n     conditions.\n\n  c. No term or condition of this Public License will be waived and no\n     failure to comply consented to unless expressly agreed to by the\n     Licensor.\n\n  d. Nothing in this Public License constitutes or may be interpreted\n     as a limitation upon, or waiver of, any privileges and immunities\n     that apply to the Licensor or You, including from the legal\n     processes of any jurisdiction or authority.\n\n\n=======================================================================\n\nCreative Commons is not a party to its public licenses.\nNotwithstanding, Creative Commons may elect to apply one of its public\nlicenses to material it publishes and in those instances will be\nconsidered the \"Licensor.\" Except for the limited purpose of indicating\nthat material is shared under a Creative Commons public license or as\notherwise permitted by the Creative Commons policies published at\ncreativecommons.org/policies, Creative Commons does not authorize the\nuse of the trademark \"Creative Commons\" or any other trademark or logo\nof Creative Commons without its prior written consent including,\nwithout limitation, in connection with any unauthorized modifications\nto any of its public licenses or any other arrangements,\nunderstandings, or agreements concerning use of licensed material. For\nthe avoidance of doubt, this paragraph does not form part of the public\nlicenses.\n\nCreative Commons may be contacted at creativecommons.org.\n"
  },
  {
    "path": "themes/default/public/js/filesize.min.js",
    "content": "/*\n 2018 Jason Mulligan <jason.mulligan@avoidwork.com>\n @version 3.6.1\n*/\n\"use strict\";!function(e){var i=/^(b|B)$/,t={iec:{bits:[\"b\",\"Kib\",\"Mib\",\"Gib\",\"Tib\",\"Pib\",\"Eib\",\"Zib\",\"Yib\"],bytes:[\"B\",\"KiB\",\"MiB\",\"GiB\",\"TiB\",\"PiB\",\"EiB\",\"ZiB\",\"YiB\"]},jedec:{bits:[\"b\",\"Kb\",\"Mb\",\"Gb\",\"Tb\",\"Pb\",\"Eb\",\"Zb\",\"Yb\"],bytes:[\"B\",\"KB\",\"MB\",\"GB\",\"TB\",\"PB\",\"EB\",\"ZB\",\"YB\"]}},o={iec:[\"\",\"kibi\",\"mebi\",\"gibi\",\"tebi\",\"pebi\",\"exbi\",\"zebi\",\"yobi\"],jedec:[\"\",\"kilo\",\"mega\",\"giga\",\"tera\",\"peta\",\"exa\",\"zetta\",\"yotta\"]};function b(e){var b,n,r,a,s,f,d,u,l,B,c,p,y,g=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},m=[],v=0,x=void 0,h=void 0;if(isNaN(e))throw new Error(\"Invalid arguments\");return n=!0===g.bits,l=!0===g.unix,b=g.base||2,u=void 0!==g.round?g.round:l?1:2,B=void 0!==g.separator&&g.separator||\"\",c=void 0!==g.spacer?g.spacer:l?\"\":\" \",y=g.symbols||g.suffixes||{},p=2===b&&g.standard||\"jedec\",d=g.output||\"string\",a=!0===g.fullform,s=g.fullforms instanceof Array?g.fullforms:[],x=void 0!==g.exponent?g.exponent:-1,f=(h=Number(e))<0,r=b>2?1e3:1024,f&&(h=-h),(-1===x||isNaN(x))&&(x=Math.floor(Math.log(h)/Math.log(r)))<0&&(x=0),x>8&&(x=8),0===h?(m[0]=0,m[1]=l?\"\":t[p][n?\"bits\":\"bytes\"][x]):(v=h/(2===b?Math.pow(2,10*x):Math.pow(1e3,x)),n&&(v*=8)>=r&&x<8&&(v/=r,x++),m[0]=Number(v.toFixed(x>0?u:0)),m[1]=10===b&&1===x?n?\"kb\":\"kB\":t[p][n?\"bits\":\"bytes\"][x],l&&(m[1]=\"jedec\"===p?m[1].charAt(0):x>0?m[1].replace(/B$/,\"\"):m[1],i.test(m[1])&&(m[0]=Math.floor(m[0]),m[1]=\"\"))),f&&(m[0]=-m[0]),m[1]=y[m[1]]||m[1],\"array\"===d?m:\"exponent\"===d?x:\"object\"===d?{value:m[0],suffix:m[1],symbol:m[1]}:(a&&(m[1]=s[x]?s[x]:o[p][x]+(n?\"bit\":\"byte\")+(1===m[0]?\"\":\"s\")),B.length>0&&(m[0]=m[0].toString().replace(\".\",B)),m.join(c))}b.partial=function(e){return function(i){return b(i,e)}},\"undefined\"!=typeof exports?module.exports=b:\"function\"==typeof define&&define.amd?define(function(){return b}):e.filesize=b}(\"undefined\"!=typeof window?window:global);\n//# sourceMappingURL=filesize.min.js.map"
  },
  {
    "path": "themes/default/public/js/filesize.min.js.map",
    "content": "{\"version\":3,\"sources\":[\"filesize.js\"],\"names\":[\"global\",\"b\",\"symbol\",\"iec\",\"bits\",\"bytes\",\"jedec\",\"fullform\",\"filesize\",\"arg\",\"base\",\"ceil\",\"full\",\"fullforms\",\"neg\",\"output\",\"round\",\"unix\",\"separator\",\"spacer\",\"standard\",\"symbols\",\"descriptor\",\"arguments\",\"length\",\"undefined\",\"result\",\"val\",\"e\",\"num\",\"isNaN\",\"Error\",\"suffixes\",\"Array\",\"exponent\",\"Number\",\"Math\",\"floor\",\"log\",\"pow\",\"toFixed\",\"charAt\",\"replace\",\"test\",\"value\",\"suffix\",\"toString\",\"join\",\"partial\",\"opt\",\"exports\",\"module\",\"define\",\"amd\",\"window\"],\"mappings\":\"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\",\"file\":\"filesize.min.js\"}"
  },
  {
    "path": "themes/default/public/js/ie-detection.js",
    "content": "function confirmExit() {\n    console.log(i18n.confirmExit);\n    return i18n.confirmExit;\n}\n\n// Is the browser IE?\nvar isIE = /*@cc_on!@*/false || !!document.documentMode;\n\n// If the browser is IE, add readAsBinaryString function and store the data\nif (isIE == true){\n    if (FileReader.prototype.readAsBinaryString === undefined) {\n        FileReader.prototype.readAsBinaryString = function (fileData) {\n                var binary = \"\";\n                var pt = this;\n                var reader = new FileReader();\n                reader.onload = function (e) {\n                    var bytes = new Uint8Array(reader.result);\n                    var length = bytes.byteLength;\n                    for (var i = 0; i < length; i++) {\n                        binary += String.fromCharCode(bytes[i]);\n                    }\n                    //pt.result  - readonly so assign content to another property\n                    pt.content = binary;\n                    $(pt).trigger('onloadend');\n                }\n            reader.readAsArrayBuffer(fileData);\n        }\n    }\n}\n"
  },
  {
    "path": "themes/default/public/js/jquery-3.7.1.min.js",
    "content": "/*! jQuery v3.7.1 | (c) OpenJS Foundation and other contributors | jquery.org/license */\n!function(e,t){\"use strict\";\"object\"==typeof module&&\"object\"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error(\"jQuery requires a window with a document\");return t(e)}:t(e)}(\"undefined\"!=typeof window?window:this,function(ie,e){\"use strict\";var oe=[],r=Object.getPrototypeOf,ae=oe.slice,g=oe.flat?function(e){return oe.flat.call(e)}:function(e){return oe.concat.apply([],e)},s=oe.push,se=oe.indexOf,n={},i=n.toString,ue=n.hasOwnProperty,o=ue.toString,a=o.call(Object),le={},v=function(e){return\"function\"==typeof e&&\"number\"!=typeof e.nodeType&&\"function\"!=typeof e.item},y=function(e){return null!=e&&e===e.window},C=ie.document,u={type:!0,src:!0,nonce:!0,noModule:!0};function m(e,t,n){var r,i,o=(n=n||C).createElement(\"script\");if(o.text=e,t)for(r in u)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+\"\":\"object\"==typeof e||\"function\"==typeof e?n[i.call(e)]||\"object\":typeof e}var t=\"3.7.1\",l=/HTML$/i,ce=function(e,t){return new ce.fn.init(e,t)};function c(e){var t=!!e&&\"length\"in e&&e.length,n=x(e);return!v(e)&&!y(e)&&(\"array\"===n||0===t||\"number\"==typeof t&&0<t&&t-1 in e)}function fe(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}ce.fn=ce.prototype={jquery:t,constructor:ce,length:0,toArray:function(){return ae.call(this)},get:function(e){return null==e?ae.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=ce.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return ce.each(this,e)},map:function(n){return this.pushStack(ce.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(ae.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(ce.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(ce.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:s,sort:oe.sort,splice:oe.splice},ce.extend=ce.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for(\"boolean\"==typeof a&&(l=a,a=arguments[s]||{},s++),\"object\"==typeof a||v(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],\"__proto__\"!==t&&a!==r&&(l&&r&&(ce.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||ce.isPlainObject(n)?n:{},i=!1,a[t]=ce.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},ce.extend({expando:\"jQuery\"+(t+Math.random()).replace(/\\D/g,\"\"),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||\"[object Object]\"!==i.call(e))&&(!(t=r(e))||\"function\"==typeof(n=ue.call(t,\"constructor\")&&t.constructor)&&o.call(n)===a)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){m(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(c(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},text:function(e){var t,n=\"\",r=0,i=e.nodeType;if(!i)while(t=e[r++])n+=ce.text(t);return 1===i||11===i?e.textContent:9===i?e.documentElement.textContent:3===i||4===i?e.nodeValue:n},makeArray:function(e,t){var n=t||[];return null!=e&&(c(Object(e))?ce.merge(n,\"string\"==typeof e?[e]:e):s.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:se.call(t,e,n)},isXMLDoc:function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!l.test(t||n&&n.nodeName||\"HTML\")},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(c(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:le}),\"function\"==typeof Symbol&&(ce.fn[Symbol.iterator]=oe[Symbol.iterator]),ce.each(\"Boolean Number String Function Array Date RegExp Object Error Symbol\".split(\" \"),function(e,t){n[\"[object \"+t+\"]\"]=t.toLowerCase()});var pe=oe.pop,de=oe.sort,he=oe.splice,ge=\"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",ve=new RegExp(\"^\"+ge+\"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\"+ge+\"+$\",\"g\");ce.contains=function(e,t){var n=t&&t.parentNode;return e===n||!(!n||1!==n.nodeType||!(e.contains?e.contains(n):e.compareDocumentPosition&&16&e.compareDocumentPosition(n)))};var f=/([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\x80-\\uFFFF\\w-]/g;function p(e,t){return t?\"\\0\"===e?\"\\ufffd\":e.slice(0,-1)+\"\\\\\"+e.charCodeAt(e.length-1).toString(16)+\" \":\"\\\\\"+e}ce.escapeSelector=function(e){return(e+\"\").replace(f,p)};var ye=C,me=s;!function(){var e,b,w,o,a,T,r,C,d,i,k=me,S=ce.expando,E=0,n=0,s=W(),c=W(),u=W(),h=W(),l=function(e,t){return e===t&&(a=!0),0},f=\"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",t=\"(?:\\\\\\\\[\\\\da-fA-F]{1,6}\"+ge+\"?|\\\\\\\\[^\\\\r\\\\n\\\\f]|[\\\\w-]|[^\\0-\\\\x7f])+\",p=\"\\\\[\"+ge+\"*(\"+t+\")(?:\"+ge+\"*([*^$|!~]?=)\"+ge+\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\"+t+\"))|)\"+ge+\"*\\\\]\",g=\":(\"+t+\")(?:\\\\((('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\"+p+\")*)|.*)\\\\)|)\",v=new RegExp(ge+\"+\",\"g\"),y=new RegExp(\"^\"+ge+\"*,\"+ge+\"*\"),m=new RegExp(\"^\"+ge+\"*([>+~]|\"+ge+\")\"+ge+\"*\"),x=new RegExp(ge+\"|>\"),j=new RegExp(g),A=new RegExp(\"^\"+t+\"$\"),D={ID:new RegExp(\"^#(\"+t+\")\"),CLASS:new RegExp(\"^\\\\.(\"+t+\")\"),TAG:new RegExp(\"^(\"+t+\"|[*])\"),ATTR:new RegExp(\"^\"+p),PSEUDO:new RegExp(\"^\"+g),CHILD:new RegExp(\"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\"+ge+\"*(even|odd|(([+-]|)(\\\\d*)n|)\"+ge+\"*(?:([+-]|)\"+ge+\"*(\\\\d+)|))\"+ge+\"*\\\\)|)\",\"i\"),bool:new RegExp(\"^(?:\"+f+\")$\",\"i\"),needsContext:new RegExp(\"^\"+ge+\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\"+ge+\"*((?:-\\\\d)?\\\\d*)\"+ge+\"*\\\\)|)(?=[^-]|$)\",\"i\")},N=/^(?:input|select|textarea|button)$/i,q=/^h\\d$/i,L=/^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,H=/[+~]/,O=new RegExp(\"\\\\\\\\[\\\\da-fA-F]{1,6}\"+ge+\"?|\\\\\\\\([^\\\\r\\\\n\\\\f])\",\"g\"),P=function(e,t){var n=\"0x\"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},M=function(){V()},R=J(function(e){return!0===e.disabled&&fe(e,\"fieldset\")},{dir:\"parentNode\",next:\"legend\"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],\"string\"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+\" \"]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&U(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute(\"id\"))?s=ce.escapeSelector(s):e.setAttribute(\"id\",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?\"#\"+s:\":scope\")+\" \"+Q(l[o]);c=l.join(\",\")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute(\"id\")}}}return re(t.replace(ve,\"$1\"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+\" \")>b.cacheLength&&delete e[r.shift()],e[t+\" \"]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement(\"fieldset\");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,\"input\")&&e.type===t}}function _(t){return function(e){return(fe(e,\"input\")||fe(e,\"button\"))&&e.type===t}}function z(t){return function(e){return\"form\"in e?e.parentNode&&!1===e.disabled?\"label\"in e?\"label\"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&R(e)===t:e.disabled===t:\"label\"in e&&e.disabled===t}}function X(a){return F(function(o){return o=+o,F(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function U(e){return e&&\"undefined\"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,r.msMatchesSelector&&ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener(\"unload\",M),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,\"*\")}),le.scope=$(function(){return T.querySelectorAll(\":scope\")}),le.cssHas=$(function(){try{return T.querySelector(\":has(*,:jqfake)\"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute(\"id\")===t}},b.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);return function(e){var t=\"undefined\"!=typeof e.getAttributeNode&&e.getAttributeNode(\"id\");return t&&t.value===n}},b.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&C){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode(\"id\"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode(\"id\"))&&n.value===e)return[o]}return[]}}),b.find.TAG=function(e,t){return\"undefined\"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if(\"undefined\"!=typeof t.getElementsByClassName&&C)return t.getElementsByClassName(e)},d=[],$(function(e){var t;r.appendChild(e).innerHTML=\"<a id='\"+S+\"' href='' disabled='disabled'></a><select id='\"+S+\"-\\r\\\\' disabled='disabled'><option selected=''></option></select>\",e.querySelectorAll(\"[selected]\").length||d.push(\"\\\\[\"+ge+\"*(?:value|\"+f+\")\"),e.querySelectorAll(\"[id~=\"+S+\"-]\").length||d.push(\"~=\"),e.querySelectorAll(\"a#\"+S+\"+*\").length||d.push(\".#.+[+~]\"),e.querySelectorAll(\":checked\").length||d.push(\":checked\"),(t=T.createElement(\"input\")).setAttribute(\"type\",\"hidden\"),e.appendChild(t).setAttribute(\"name\",\"D\"),r.appendChild(e).disabled=!0,2!==e.querySelectorAll(\":disabled\").length&&d.push(\":enabled\",\":disabled\"),(t=T.createElement(\"input\")).setAttribute(\"name\",\"\"),e.appendChild(t),e.querySelectorAll(\"[name='']\").length||d.push(\"\\\\[\"+ge+\"*name\"+ge+\"*=\"+ge+\"*(?:''|\\\"\\\")\")}),le.cssHas||d.push(\":has\"),d=d.length&&new RegExp(d.join(\"|\")),l=function(e,t){if(e===t)return a=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!le.sortDetached&&t.compareDocumentPosition(e)===n?e===T||e.ownerDocument==ye&&I.contains(ye,e)?-1:t===T||t.ownerDocument==ye&&I.contains(ye,t)?1:o?se.call(o,e)-se.call(o,t):0:4&n?-1:1)}),T}for(e in I.matches=function(e,t){return I(e,null,null,t)},I.matchesSelector=function(e,t){if(V(e),C&&!h[t+\" \"]&&(!d||!d.test(t)))try{var n=i.call(e,t);if(n||le.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){h(t,!0)}return 0<I(t,T,null,[e]).length},I.contains=function(e,t){return(e.ownerDocument||e)!=T&&V(e),ce.contains(e,t)},I.attr=function(e,t){(e.ownerDocument||e)!=T&&V(e);var n=b.attrHandle[t.toLowerCase()],r=n&&ue.call(b.attrHandle,t.toLowerCase())?n(e,t,!C):void 0;return void 0!==r?r:e.getAttribute(t)},I.error=function(e){throw new Error(\"Syntax error, unrecognized expression: \"+e)},ce.uniqueSort=function(e){var t,n=[],r=0,i=0;if(a=!le.sortStable,o=!le.sortStable&&ae.call(e,0),de.call(e,l),a){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)he.call(e,n[r],1)}return o=null,e},ce.fn.uniqueSort=function(){return this.pushStack(ce.uniqueSort(ae.apply(this)))},(b=ce.expr={cacheLength:50,createPseudo:F,match:D,attrHandle:{},find:{},relative:{\">\":{dir:\"parentNode\",first:!0},\" \":{dir:\"parentNode\"},\"+\":{dir:\"previousSibling\",first:!0},\"~\":{dir:\"previousSibling\"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(O,P),e[3]=(e[3]||e[4]||e[5]||\"\").replace(O,P),\"~=\"===e[2]&&(e[3]=\" \"+e[3]+\" \"),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),\"nth\"===e[1].slice(0,3)?(e[3]||I.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*(\"even\"===e[3]||\"odd\"===e[3])),e[5]=+(e[7]+e[8]||\"odd\"===e[3])):e[3]&&I.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return D.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||\"\":n&&j.test(n)&&(t=Y(n,!0))&&(t=n.indexOf(\")\",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(O,P).toLowerCase();return\"*\"===e?function(){return!0}:function(e){return fe(e,t)}},CLASS:function(e){var t=s[e+\" \"];return t||(t=new RegExp(\"(^|\"+ge+\")\"+e+\"(\"+ge+\"|$)\"))&&s(e,function(e){return t.test(\"string\"==typeof e.className&&e.className||\"undefined\"!=typeof e.getAttribute&&e.getAttribute(\"class\")||\"\")})},ATTR:function(n,r,i){return function(e){var t=I.attr(e,n);return null==t?\"!=\"===r:!r||(t+=\"\",\"=\"===r?t===i:\"!=\"===r?t!==i:\"^=\"===r?i&&0===t.indexOf(i):\"*=\"===r?i&&-1<t.indexOf(i):\"$=\"===r?i&&t.slice(-i.length)===i:\"~=\"===r?-1<(\" \"+t.replace(v,\" \")+\" \").indexOf(i):\"|=\"===r&&(t===i||t.slice(0,i.length+1)===i+\"-\"))}},CHILD:function(d,e,t,h,g){var v=\"nth\"!==d.slice(0,3),y=\"last\"!==d.slice(-4),m=\"of-type\"===e;return 1===h&&0===g?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u=v!==y?\"nextSibling\":\"previousSibling\",l=e.parentNode,c=m&&e.nodeName.toLowerCase(),f=!n&&!m,p=!1;if(l){if(v){while(u){o=e;while(o=o[u])if(m?fe(o,c):1===o.nodeType)return!1;s=u=\"only\"===d&&!s&&\"nextSibling\"}return!0}if(s=[y?l.firstChild:l.lastChild],y&&f){p=(a=(r=(i=l[S]||(l[S]={}))[d]||[])[0]===E&&r[1])&&r[2],o=a&&l.childNodes[a];while(o=++a&&o&&o[u]||(p=a=0)||s.pop())if(1===o.nodeType&&++p&&o===e){i[d]=[E,a,p];break}}else if(f&&(p=a=(r=(i=e[S]||(e[S]={}))[d]||[])[0]===E&&r[1]),!1===p)while(o=++a&&o&&o[u]||(p=a=0)||s.pop())if((m?fe(o,c):1===o.nodeType)&&++p&&(f&&((i=o[S]||(o[S]={}))[d]=[E,p]),o===e))break;return(p-=g)===h||p%h==0&&0<=p/h}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||I.error(\"unsupported pseudo: \"+e);return a[S]?a(o):1<a.length?(t=[e,e,\"\",o],b.setFilters.hasOwnProperty(e.toLowerCase())?F(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=se.call(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:F(function(e){var r=[],i=[],s=ne(e.replace(ve,\"$1\"));return s[S]?F(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:F(function(t){return function(e){return 0<I(t,e).length}}),contains:F(function(t){return t=t.replace(O,P),function(e){return-1<(e.textContent||ce.text(e)).indexOf(t)}}),lang:F(function(n){return A.test(n||\"\")||I.error(\"unsupported lang: \"+n),n=n.replace(O,P).toLowerCase(),function(e){var t;do{if(t=C?e.lang:e.getAttribute(\"xml:lang\")||e.getAttribute(\"lang\"))return(t=t.toLowerCase())===n||0===t.indexOf(n+\"-\")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=ie.location&&ie.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===r},focus:function(e){return e===function(){try{return T.activeElement}catch(e){}}()&&T.hasFocus()&&!!(e.type||e.href||~e.tabIndex)},enabled:z(!1),disabled:z(!0),checked:function(e){return fe(e,\"input\")&&!!e.checked||fe(e,\"option\")&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return q.test(e.nodeName)},input:function(e){return N.test(e.nodeName)},button:function(e){return fe(e,\"input\")&&\"button\"===e.type||fe(e,\"button\")},text:function(e){var t;return fe(e,\"input\")&&\"text\"===e.type&&(null==(t=e.getAttribute(\"type\"))||\"text\"===t.toLowerCase())},first:X(function(){return[0]}),last:X(function(e,t){return[t-1]}),eq:X(function(e,t,n){return[n<0?n+t:n]}),even:X(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:X(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:X(function(e,t,n){var r;for(r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:X(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=B(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=_(e);function G(){}function Y(e,t){var n,r,i,o,a,s,u,l=c[e+\" \"];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=y.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=m.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace(ve,\" \")}),a=a.slice(n.length)),b.filter)!(r=D[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?I.error(e):c(e,s).slice(0)}function Q(e){for(var t=0,n=e.length,r=\"\";t<n;t++)r+=e[t].value;return r}function J(a,e,t){var s=e.dir,u=e.next,l=u||s,c=t&&\"parentNode\"===l,f=n++;return e.first?function(e,t,n){while(e=e[s])if(1===e.nodeType||c)return a(e,t,n);return!1}:function(e,t,n){var r,i,o=[E,f];if(n){while(e=e[s])if((1===e.nodeType||c)&&a(e,t,n))return!0}else while(e=e[s])if(1===e.nodeType||c)if(i=e[S]||(e[S]={}),u&&fe(e,u))e=e[s]||e;else{if((r=i[l])&&r[0]===E&&r[1]===f)return o[2]=r[2];if((i[l]=o)[2]=a(e,t,n))return!0}return!1}}function K(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Z(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function ee(d,h,g,v,y,e){return v&&!v[S]&&(v=ee(v)),y&&!y[S]&&(y=ee(y,e)),F(function(e,t,n,r){var i,o,a,s,u=[],l=[],c=t.length,f=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)I(e,t[r],n);return n}(h||\"*\",n.nodeType?[n]:n,[]),p=!d||!e&&h?f:Z(f,u,d,n,r);if(g?g(p,s=y||(e?d:c||v)?[]:t,n,r):s=p,v){i=Z(s,l),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(s[l[o]]=!(p[l[o]]=a))}if(e){if(y||d){if(y){i=[],o=s.length;while(o--)(a=s[o])&&i.push(p[o]=a);y(null,s=[],i,r)}o=s.length;while(o--)(a=s[o])&&-1<(i=y?se.call(e,a):u[o])&&(e[i]=!(t[i]=a))}}else s=Z(s===t?s.splice(c,s.length):s),y?y(null,t,s,r):k.apply(t,s)})}function te(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[\" \"],s=o?1:0,u=J(function(e){return e===i},a,!0),l=J(function(e){return-1<se.call(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!=w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[J(K(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return ee(1<s&&K(c),1<s&&Q(e.slice(0,s-1).concat({value:\" \"===e[s-2].type?\"*\":\"\"})).replace(ve,\"$1\"),t,s<n&&te(e.slice(s,n)),n<r&&te(e=e.slice(n)),n<r&&Q(e))}c.push(t)}return K(c)}function ne(e,t){var n,v,y,m,x,r,i=[],o=[],a=u[e+\" \"];if(!a){t||(t=Y(e)),n=t.length;while(n--)(a=te(t[n]))[S]?i.push(a):o.push(a);(a=u(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l=\"0\",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG(\"*\",i),h=E+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==T||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==T||(V(o),n=!C);while(s=v[a++])if(s(o,t||T,n)){k.call(r,o);break}i&&(E=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=pe.call(r));f=Z(f)}k.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&ce.uniqueSort(r)}return i&&(E=h,w=p),c},m?F(r):r))).selector=e}return a}function re(e,t,n,r){var i,o,a,s,u,l=\"function\"==typeof e&&e,c=!r&&Y(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&\"ID\"===(a=o[0]).type&&9===t.nodeType&&C&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(O,P),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=D.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(O,P),H.test(o[0].type)&&U(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&Q(o)))return k.apply(n,r),n;break}}}return(l||ne(e,c))(r,t,!C,n,!t||H.test(e)&&U(t.parentNode)||t),n}G.prototype=b.filters=b.pseudos,b.setFilters=new G,le.sortStable=S.split(\"\").sort(l).join(\"\")===S,V(),le.sortDetached=$(function(e){return 1&e.compareDocumentPosition(T.createElement(\"fieldset\"))}),ce.find=I,ce.expr[\":\"]=ce.expr.pseudos,ce.unique=ce.uniqueSort,I.compile=ne,I.select=re,I.setDocument=V,I.tokenize=Y,I.escape=ce.escapeSelector,I.getText=ce.text,I.isXML=ce.isXMLDoc,I.selectors=ce.expr,I.support=ce.support,I.uniqueSort=ce.uniqueSort}();var d=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&ce(e).is(n))break;r.push(e)}return r},h=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},b=ce.expr.match.needsContext,w=/^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i;function T(e,n,r){return v(n)?ce.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?ce.grep(e,function(e){return e===n!==r}):\"string\"!=typeof n?ce.grep(e,function(e){return-1<se.call(n,e)!==r}):ce.filter(n,e,r)}ce.filter=function(e,t,n){var r=t[0];return n&&(e=\":not(\"+e+\")\"),1===t.length&&1===r.nodeType?ce.find.matchesSelector(r,e)?[r]:[]:ce.find.matches(e,ce.grep(t,function(e){return 1===e.nodeType}))},ce.fn.extend({find:function(e){var t,n,r=this.length,i=this;if(\"string\"!=typeof e)return this.pushStack(ce(e).filter(function(){for(t=0;t<r;t++)if(ce.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)ce.find(e,i[t],n);return 1<r?ce.uniqueSort(n):n},filter:function(e){return this.pushStack(T(this,e||[],!1))},not:function(e){return this.pushStack(T(this,e||[],!0))},is:function(e){return!!T(this,\"string\"==typeof e&&b.test(e)?ce(e):e||[],!1).length}});var k,S=/^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/;(ce.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||k,\"string\"==typeof e){if(!(r=\"<\"===e[0]&&\">\"===e[e.length-1]&&3<=e.length?[null,e,null]:S.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof ce?t[0]:t,ce.merge(this,ce.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:C,!0)),w.test(r[1])&&ce.isPlainObject(t))for(r in t)v(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=C.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):v(e)?void 0!==n.ready?n.ready(e):e(ce):ce.makeArray(e,this)}).prototype=ce.fn,k=ce(C);var E=/^(?:parents|prev(?:Until|All))/,j={children:!0,contents:!0,next:!0,prev:!0};function A(e,t){while((e=e[t])&&1!==e.nodeType);return e}ce.fn.extend({has:function(e){var t=ce(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(ce.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a=\"string\"!=typeof e&&ce(e);if(!b.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&ce.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?ce.uniqueSort(o):o)},index:function(e){return e?\"string\"==typeof e?se.call(ce(e),this[0]):se.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(ce.uniqueSort(ce.merge(this.get(),ce(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),ce.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return d(e,\"parentNode\")},parentsUntil:function(e,t,n){return d(e,\"parentNode\",n)},next:function(e){return A(e,\"nextSibling\")},prev:function(e){return A(e,\"previousSibling\")},nextAll:function(e){return d(e,\"nextSibling\")},prevAll:function(e){return d(e,\"previousSibling\")},nextUntil:function(e,t,n){return d(e,\"nextSibling\",n)},prevUntil:function(e,t,n){return d(e,\"previousSibling\",n)},siblings:function(e){return h((e.parentNode||{}).firstChild,e)},children:function(e){return h(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(fe(e,\"template\")&&(e=e.content||e),ce.merge([],e.childNodes))}},function(r,i){ce.fn[r]=function(e,t){var n=ce.map(this,i,e);return\"Until\"!==r.slice(-5)&&(t=e),t&&\"string\"==typeof t&&(n=ce.filter(t,n)),1<this.length&&(j[r]||ce.uniqueSort(n),E.test(r)&&n.reverse()),this.pushStack(n)}});var D=/[^\\x20\\t\\r\\n\\f]+/g;function N(e){return e}function q(e){throw e}function L(e,t,n,r){var i;try{e&&v(i=e.promise)?i.call(e).done(t).fail(n):e&&v(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}ce.Callbacks=function(r){var e,n;r=\"string\"==typeof r?(e=r,n={},ce.each(e.match(D)||[],function(e,t){n[t]=!0}),n):ce.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:\"\")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){ce.each(e,function(e,t){v(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&\"string\"!==x(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return ce.each(arguments,function(e,t){var n;while(-1<(n=ce.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<ce.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t=\"\",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=\"\"),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},ce.extend({Deferred:function(e){var o=[[\"notify\",\"progress\",ce.Callbacks(\"memory\"),ce.Callbacks(\"memory\"),2],[\"resolve\",\"done\",ce.Callbacks(\"once memory\"),ce.Callbacks(\"once memory\"),0,\"resolved\"],[\"reject\",\"fail\",ce.Callbacks(\"once memory\"),ce.Callbacks(\"once memory\"),1,\"rejected\"]],i=\"pending\",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},\"catch\":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return ce.Deferred(function(r){ce.each(o,function(e,t){var n=v(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&v(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+\"With\"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError(\"Thenable self-resolution\");t=e&&(\"object\"==typeof e||\"function\"==typeof e)&&e.then,v(t)?s?t.call(e,l(u,o,N,s),l(u,o,q,s)):(u++,t.call(e,l(u,o,N,s),l(u,o,q,s),l(u,o,N,o.notifyWith))):(a!==N&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){ce.Deferred.exceptionHook&&ce.Deferred.exceptionHook(e,t.error),u<=i+1&&(a!==q&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(ce.Deferred.getErrorHook?t.error=ce.Deferred.getErrorHook():ce.Deferred.getStackHook&&(t.error=ce.Deferred.getStackHook()),ie.setTimeout(t))}}return ce.Deferred(function(e){o[0][3].add(l(0,e,v(r)?r:N,e.notifyWith)),o[1][3].add(l(0,e,v(t)?t:N)),o[2][3].add(l(0,e,v(n)?n:q))}).promise()},promise:function(e){return null!=e?ce.extend(e,a):a}},s={};return ce.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+\"With\"](this===s?void 0:this,arguments),this},s[t[0]+\"With\"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=ae.call(arguments),o=ce.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?ae.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(L(e,o.done(a(t)).resolve,o.reject,!n),\"pending\"===o.state()||v(i[t]&&i[t].then)))return o.then();while(t--)L(i[t],a(t),o.reject);return o.promise()}});var H=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;ce.Deferred.exceptionHook=function(e,t){ie.console&&ie.console.warn&&e&&H.test(e.name)&&ie.console.warn(\"jQuery.Deferred exception: \"+e.message,e.stack,t)},ce.readyException=function(e){ie.setTimeout(function(){throw e})};var O=ce.Deferred();function P(){C.removeEventListener(\"DOMContentLoaded\",P),ie.removeEventListener(\"load\",P),ce.ready()}ce.fn.ready=function(e){return O.then(e)[\"catch\"](function(e){ce.readyException(e)}),this},ce.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--ce.readyWait:ce.isReady)||(ce.isReady=!0)!==e&&0<--ce.readyWait||O.resolveWith(C,[ce])}}),ce.ready.then=O.then,\"complete\"===C.readyState||\"loading\"!==C.readyState&&!C.documentElement.doScroll?ie.setTimeout(ce.ready):(C.addEventListener(\"DOMContentLoaded\",P),ie.addEventListener(\"load\",P));var M=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if(\"object\"===x(n))for(s in i=!0,n)M(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,v(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(ce(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},R=/^-ms-/,I=/-([a-z])/g;function W(e,t){return t.toUpperCase()}function F(e){return e.replace(R,\"ms-\").replace(I,W)}var $=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function B(){this.expando=ce.expando+B.uid++}B.uid=1,B.prototype={cache:function(e){var t=e[this.expando];return t||(t={},$(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if(\"string\"==typeof t)i[F(t)]=n;else for(r in t)i[F(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][F(t)]},access:function(e,t,n){return void 0===t||t&&\"string\"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(F):(t=F(t))in r?[t]:t.match(D)||[]).length;while(n--)delete r[t[n]]}(void 0===t||ce.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!ce.isEmptyObject(t)}};var _=new B,z=new B,X=/^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,U=/[A-Z]/g;function V(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r=\"data-\"+t.replace(U,\"-$&\").toLowerCase(),\"string\"==typeof(n=e.getAttribute(r))){try{n=\"true\"===(i=n)||\"false\"!==i&&(\"null\"===i?null:i===+i+\"\"?+i:X.test(i)?JSON.parse(i):i)}catch(e){}z.set(e,t,n)}else n=void 0;return n}ce.extend({hasData:function(e){return z.hasData(e)||_.hasData(e)},data:function(e,t,n){return z.access(e,t,n)},removeData:function(e,t){z.remove(e,t)},_data:function(e,t,n){return _.access(e,t,n)},_removeData:function(e,t){_.remove(e,t)}}),ce.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=z.get(o),1===o.nodeType&&!_.get(o,\"hasDataAttrs\"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf(\"data-\")&&(r=F(r.slice(5)),V(o,r,i[r]));_.set(o,\"hasDataAttrs\",!0)}return i}return\"object\"==typeof n?this.each(function(){z.set(this,n)}):M(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=z.get(o,n))?t:void 0!==(t=V(o,n))?t:void 0;this.each(function(){z.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){z.remove(this,e)})}}),ce.extend({queue:function(e,t,n){var r;if(e)return t=(t||\"fx\")+\"queue\",r=_.get(e,t),n&&(!r||Array.isArray(n)?r=_.access(e,t,ce.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||\"fx\";var n=ce.queue(e,t),r=n.length,i=n.shift(),o=ce._queueHooks(e,t);\"inprogress\"===i&&(i=n.shift(),r--),i&&(\"fx\"===t&&n.unshift(\"inprogress\"),delete o.stop,i.call(e,function(){ce.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+\"queueHooks\";return _.get(e,n)||_.access(e,n,{empty:ce.Callbacks(\"once memory\").add(function(){_.remove(e,[t+\"queue\",n])})})}}),ce.fn.extend({queue:function(t,n){var e=2;return\"string\"!=typeof t&&(n=t,t=\"fx\",e--),arguments.length<e?ce.queue(this[0],t):void 0===n?this:this.each(function(){var e=ce.queue(this,t,n);ce._queueHooks(this,t),\"fx\"===t&&\"inprogress\"!==e[0]&&ce.dequeue(this,t)})},dequeue:function(e){return this.each(function(){ce.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||\"fx\",[])},promise:function(e,t){var n,r=1,i=ce.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};\"string\"!=typeof e&&(t=e,e=void 0),e=e||\"fx\";while(a--)(n=_.get(o[a],e+\"queueHooks\"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var G=/[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source,Y=new RegExp(\"^(?:([+-])=|)(\"+G+\")([a-z%]*)$\",\"i\"),Q=[\"Top\",\"Right\",\"Bottom\",\"Left\"],J=C.documentElement,K=function(e){return ce.contains(e.ownerDocument,e)},Z={composed:!0};J.getRootNode&&(K=function(e){return ce.contains(e.ownerDocument,e)||e.getRootNode(Z)===e.ownerDocument});var ee=function(e,t){return\"none\"===(e=t||e).style.display||\"\"===e.style.display&&K(e)&&\"none\"===ce.css(e,\"display\")};function te(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return ce.css(e,t,\"\")},u=s(),l=n&&n[3]||(ce.cssNumber[t]?\"\":\"px\"),c=e.nodeType&&(ce.cssNumber[t]||\"px\"!==l&&+u)&&Y.exec(ce.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)ce.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,ce.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ne={};function re(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?(\"none\"===n&&(l[c]=_.get(r,\"display\")||null,l[c]||(r.style.display=\"\")),\"\"===r.style.display&&ee(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ne[s])||(o=a.body.appendChild(a.createElement(s)),u=ce.css(o,\"display\"),o.parentNode.removeChild(o),\"none\"===u&&(u=\"block\"),ne[s]=u)))):\"none\"!==n&&(l[c]=\"none\",_.set(r,\"display\",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}ce.fn.extend({show:function(){return re(this,!0)},hide:function(){return re(this)},toggle:function(e){return\"boolean\"==typeof e?e?this.show():this.hide():this.each(function(){ee(this)?ce(this).show():ce(this).hide()})}});var xe,be,we=/^(?:checkbox|radio)$/i,Te=/<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)/i,Ce=/^$|^module$|\\/(?:java|ecma)script/i;xe=C.createDocumentFragment().appendChild(C.createElement(\"div\")),(be=C.createElement(\"input\")).setAttribute(\"type\",\"radio\"),be.setAttribute(\"checked\",\"checked\"),be.setAttribute(\"name\",\"t\"),xe.appendChild(be),le.checkClone=xe.cloneNode(!0).cloneNode(!0).lastChild.checked,xe.innerHTML=\"<textarea>x</textarea>\",le.noCloneChecked=!!xe.cloneNode(!0).lastChild.defaultValue,xe.innerHTML=\"<option></option>\",le.option=!!xe.lastChild;var ke={thead:[1,\"<table>\",\"</table>\"],col:[2,\"<table><colgroup>\",\"</colgroup></table>\"],tr:[2,\"<table><tbody>\",\"</tbody></table>\"],td:[3,\"<table><tbody><tr>\",\"</tr></tbody></table>\"],_default:[0,\"\",\"\"]};function Se(e,t){var n;return n=\"undefined\"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||\"*\"):\"undefined\"!=typeof e.querySelectorAll?e.querySelectorAll(t||\"*\"):[],void 0===t||t&&fe(e,t)?ce.merge([e],n):n}function Ee(e,t){for(var n=0,r=e.length;n<r;n++)_.set(e[n],\"globalEval\",!t||_.get(t[n],\"globalEval\"))}ke.tbody=ke.tfoot=ke.colgroup=ke.caption=ke.thead,ke.th=ke.td,le.option||(ke.optgroup=ke.option=[1,\"<select multiple='multiple'>\",\"</select>\"]);var je=/<|&#?\\w+;/;function Ae(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if(\"object\"===x(o))ce.merge(p,o.nodeType?[o]:o);else if(je.test(o)){a=a||f.appendChild(t.createElement(\"div\")),s=(Te.exec(o)||[\"\",\"\"])[1].toLowerCase(),u=ke[s]||ke._default,a.innerHTML=u[1]+ce.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;ce.merge(p,a.childNodes),(a=f.firstChild).textContent=\"\"}else p.push(t.createTextNode(o));f.textContent=\"\",d=0;while(o=p[d++])if(r&&-1<ce.inArray(o,r))i&&i.push(o);else if(l=K(o),a=Se(f.appendChild(o),\"script\"),l&&Ee(a),n){c=0;while(o=a[c++])Ce.test(o.type||\"\")&&n.push(o)}return f}var De=/^([^.]*)(?:\\.(.+)|)/;function Ne(){return!0}function qe(){return!1}function Le(e,t,n,r,i,o){var a,s;if(\"object\"==typeof t){for(s in\"string\"!=typeof n&&(r=r||n,n=void 0),t)Le(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&(\"string\"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=qe;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return ce().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=ce.guid++)),e.each(function(){ce.event.add(this,t,i,r,n)})}function He(e,r,t){t?(_.set(e,r,!1),ce.event.add(e,r,{namespace:!1,handler:function(e){var t,n=_.get(this,r);if(1&e.isTrigger&&this[r]){if(n)(ce.event.special[r]||{}).delegateType&&e.stopPropagation();else if(n=ae.call(arguments),_.set(this,r,n),this[r](),t=_.get(this,r),_.set(this,r,!1),n!==t)return e.stopImmediatePropagation(),e.preventDefault(),t}else n&&(_.set(this,r,ce.event.trigger(n[0],n.slice(1),this)),e.stopPropagation(),e.isImmediatePropagationStopped=Ne)}})):void 0===_.get(e,r)&&ce.event.add(e,r,Ne)}ce.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=_.get(t);if($(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&ce.find.matchesSelector(J,i),n.guid||(n.guid=ce.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return\"undefined\"!=typeof ce&&ce.event.triggered!==e.type?ce.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||\"\").match(D)||[\"\"]).length;while(l--)d=g=(s=De.exec(e[l])||[])[1],h=(s[2]||\"\").split(\".\").sort(),d&&(f=ce.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=ce.event.special[d]||{},c=ce.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&ce.expr.match.needsContext.test(i),namespace:h.join(\".\")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),ce.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=_.hasData(e)&&_.get(e);if(v&&(u=v.events)){l=(t=(t||\"\").match(D)||[\"\"]).length;while(l--)if(d=g=(s=De.exec(t[l])||[])[1],h=(s[2]||\"\").split(\".\").sort(),d){f=ce.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp(\"(^|\\\\.)\"+h.join(\"\\\\.(?:.*\\\\.|)\")+\"(\\\\.|$)\"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&(\"**\"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||ce.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)ce.event.remove(e,d+t[l],n,r,!0);ce.isEmptyObject(u)&&_.remove(e,\"handle events\")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=ce.event.fix(e),l=(_.get(this,\"events\")||Object.create(null))[u.type]||[],c=ce.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=ce.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((ce.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!(\"click\"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&(\"click\"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+\" \"]&&(a[i]=r.needsContext?-1<ce(i,this).index(l):ce.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(ce.Event.prototype,t,{enumerable:!0,configurable:!0,get:v(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[ce.expando]?e:new ce.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return we.test(t.type)&&t.click&&fe(t,\"input\")&&He(t,\"click\",!0),!1},trigger:function(e){var t=this||e;return we.test(t.type)&&t.click&&fe(t,\"input\")&&He(t,\"click\"),!0},_default:function(e){var t=e.target;return we.test(t.type)&&t.click&&fe(t,\"input\")&&_.get(t,\"click\")||fe(t,\"a\")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},ce.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},ce.Event=function(e,t){if(!(this instanceof ce.Event))return new ce.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?Ne:qe,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&ce.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[ce.expando]=!0},ce.Event.prototype={constructor:ce.Event,isDefaultPrevented:qe,isPropagationStopped:qe,isImmediatePropagationStopped:qe,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=Ne,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=Ne,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=Ne,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},ce.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,\"char\":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:!0},ce.event.addProp),ce.each({focus:\"focusin\",blur:\"focusout\"},function(r,i){function o(e){if(C.documentMode){var t=_.get(this,\"handle\"),n=ce.event.fix(e);n.type=\"focusin\"===e.type?\"focus\":\"blur\",n.isSimulated=!0,t(e),n.target===n.currentTarget&&t(n)}else ce.event.simulate(i,e.target,ce.event.fix(e))}ce.event.special[r]={setup:function(){var e;if(He(this,r,!0),!C.documentMode)return!1;(e=_.get(this,i))||this.addEventListener(i,o),_.set(this,i,(e||0)+1)},trigger:function(){return He(this,r),!0},teardown:function(){var e;if(!C.documentMode)return!1;(e=_.get(this,i)-1)?_.set(this,i,e):(this.removeEventListener(i,o),_.remove(this,i))},_default:function(e){return _.get(e.target,r)},delegateType:i},ce.event.special[i]={setup:function(){var e=this.ownerDocument||this.document||this,t=C.documentMode?this:e,n=_.get(t,i);n||(C.documentMode?this.addEventListener(i,o):e.addEventListener(r,o,!0)),_.set(t,i,(n||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=C.documentMode?this:e,n=_.get(t,i)-1;n?_.set(t,i,n):(C.documentMode?this.removeEventListener(i,o):e.removeEventListener(r,o,!0),_.remove(t,i))}}}),ce.each({mouseenter:\"mouseover\",mouseleave:\"mouseout\",pointerenter:\"pointerover\",pointerleave:\"pointerout\"},function(e,i){ce.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||ce.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),ce.fn.extend({on:function(e,t,n,r){return Le(this,e,t,n,r)},one:function(e,t,n,r){return Le(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,ce(e.delegateTarget).off(r.namespace?r.origType+\".\"+r.namespace:r.origType,r.selector,r.handler),this;if(\"object\"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&\"function\"!=typeof t||(n=t,t=void 0),!1===n&&(n=qe),this.each(function(){ce.event.remove(this,e,n,t)})}});var Oe=/<script|<style|<link/i,Pe=/checked\\s*(?:[^=]|=\\s*.checked.)/i,Me=/^\\s*<!\\[CDATA\\[|\\]\\]>\\s*$/g;function Re(e,t){return fe(e,\"table\")&&fe(11!==t.nodeType?t:t.firstChild,\"tr\")&&ce(e).children(\"tbody\")[0]||e}function Ie(e){return e.type=(null!==e.getAttribute(\"type\"))+\"/\"+e.type,e}function We(e){return\"true/\"===(e.type||\"\").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute(\"type\"),e}function Fe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(_.hasData(e)&&(s=_.get(e).events))for(i in _.remove(t,\"handle events\"),s)for(n=0,r=s[i].length;n<r;n++)ce.event.add(t,i,s[i][n]);z.hasData(e)&&(o=z.access(e),a=ce.extend({},o),z.set(t,a))}}function $e(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=v(d);if(h||1<f&&\"string\"==typeof d&&!le.checkClone&&Pe.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),$e(t,r,i,o)});if(f&&(t=(e=Ae(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=ce.map(Se(e,\"script\"),Ie)).length;c<f;c++)u=e,c!==p&&(u=ce.clone(u,!0,!0),s&&ce.merge(a,Se(u,\"script\"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,ce.map(a,We),c=0;c<s;c++)u=a[c],Ce.test(u.type||\"\")&&!_.access(u,\"globalEval\")&&ce.contains(l,u)&&(u.src&&\"module\"!==(u.type||\"\").toLowerCase()?ce._evalUrl&&!u.noModule&&ce._evalUrl(u.src,{nonce:u.nonce||u.getAttribute(\"nonce\")},l):m(u.textContent.replace(Me,\"\"),u,l))}return n}function Be(e,t,n){for(var r,i=t?ce.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||ce.cleanData(Se(r)),r.parentNode&&(n&&K(r)&&Ee(Se(r,\"script\")),r.parentNode.removeChild(r));return e}ce.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=K(e);if(!(le.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||ce.isXMLDoc(e)))for(a=Se(c),r=0,i=(o=Se(e)).length;r<i;r++)s=o[r],u=a[r],void 0,\"input\"===(l=u.nodeName.toLowerCase())&&we.test(s.type)?u.checked=s.checked:\"input\"!==l&&\"textarea\"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||Se(e),a=a||Se(c),r=0,i=o.length;r<i;r++)Fe(o[r],a[r]);else Fe(e,c);return 0<(a=Se(c,\"script\")).length&&Ee(a,!f&&Se(e,\"script\")),c},cleanData:function(e){for(var t,n,r,i=ce.event.special,o=0;void 0!==(n=e[o]);o++)if($(n)){if(t=n[_.expando]){if(t.events)for(r in t.events)i[r]?ce.event.remove(n,r):ce.removeEvent(n,r,t.handle);n[_.expando]=void 0}n[z.expando]&&(n[z.expando]=void 0)}}}),ce.fn.extend({detach:function(e){return Be(this,e,!0)},remove:function(e){return Be(this,e)},text:function(e){return M(this,function(e){return void 0===e?ce.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return $e(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Re(this,e).appendChild(e)})},prepend:function(){return $e(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Re(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return $e(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return $e(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(ce.cleanData(Se(e,!1)),e.textContent=\"\");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return ce.clone(this,e,t)})},html:function(e){return M(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if(\"string\"==typeof e&&!Oe.test(e)&&!ke[(Te.exec(e)||[\"\",\"\"])[1].toLowerCase()]){e=ce.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(ce.cleanData(Se(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return $e(this,arguments,function(e){var t=this.parentNode;ce.inArray(this,n)<0&&(ce.cleanData(Se(this)),t&&t.replaceChild(e,this))},n)}}),ce.each({appendTo:\"append\",prependTo:\"prepend\",insertBefore:\"before\",insertAfter:\"after\",replaceAll:\"replaceWith\"},function(e,a){ce.fn[e]=function(e){for(var t,n=[],r=ce(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),ce(r[o])[a](t),s.apply(n,t.get());return this.pushStack(n)}});var _e=new RegExp(\"^(\"+G+\")(?!px)[a-z%]+$\",\"i\"),ze=/^--/,Xe=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=ie),t.getComputedStyle(e)},Ue=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Ve=new RegExp(Q.join(\"|\"),\"i\");function Ge(e,t,n){var r,i,o,a,s=ze.test(t),u=e.style;return(n=n||Xe(e))&&(a=n.getPropertyValue(t)||n[t],s&&a&&(a=a.replace(ve,\"$1\")||void 0),\"\"!==a||K(e)||(a=ce.style(e,t)),!le.pixelBoxStyles()&&_e.test(a)&&Ve.test(t)&&(r=u.width,i=u.minWidth,o=u.maxWidth,u.minWidth=u.maxWidth=u.width=a,a=n.width,u.width=r,u.minWidth=i,u.maxWidth=o)),void 0!==a?a+\"\":a}function Ye(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText=\"position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0\",l.style.cssText=\"position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%\",J.appendChild(u).appendChild(l);var e=ie.getComputedStyle(l);n=\"1%\"!==e.top,s=12===t(e.marginLeft),l.style.right=\"60%\",o=36===t(e.right),r=36===t(e.width),l.style.position=\"absolute\",i=12===t(l.offsetWidth/3),J.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=C.createElement(\"div\"),l=C.createElement(\"div\");l.style&&(l.style.backgroundClip=\"content-box\",l.cloneNode(!0).style.backgroundClip=\"\",le.clearCloneStyle=\"content-box\"===l.style.backgroundClip,ce.extend(le,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=C.createElement(\"table\"),t=C.createElement(\"tr\"),n=C.createElement(\"div\"),e.style.cssText=\"position:absolute;left:-11111px;border-collapse:separate\",t.style.cssText=\"box-sizing:content-box;border:1px solid\",t.style.height=\"1px\",n.style.height=\"9px\",n.style.display=\"block\",J.appendChild(e).appendChild(t).appendChild(n),r=ie.getComputedStyle(t),a=parseInt(r.height,10)+parseInt(r.borderTopWidth,10)+parseInt(r.borderBottomWidth,10)===t.offsetHeight,J.removeChild(e)),a}}))}();var Qe=[\"Webkit\",\"Moz\",\"ms\"],Je=C.createElement(\"div\").style,Ke={};function Ze(e){var t=ce.cssProps[e]||Ke[e];return t||(e in Je?e:Ke[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=Qe.length;while(n--)if((e=Qe[n]+t)in Je)return e}(e)||e)}var et=/^(none|table(?!-c[ea]).+)/,tt={position:\"absolute\",visibility:\"hidden\",display:\"block\"},nt={letterSpacing:\"0\",fontWeight:\"400\"};function rt(e,t,n){var r=Y.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||\"px\"):t}function it(e,t,n,r,i,o){var a=\"width\"===t?1:0,s=0,u=0,l=0;if(n===(r?\"border\":\"content\"))return 0;for(;a<4;a+=2)\"margin\"===n&&(l+=ce.css(e,n+Q[a],!0,i)),r?(\"content\"===n&&(u-=ce.css(e,\"padding\"+Q[a],!0,i)),\"margin\"!==n&&(u-=ce.css(e,\"border\"+Q[a]+\"Width\",!0,i))):(u+=ce.css(e,\"padding\"+Q[a],!0,i),\"padding\"!==n?u+=ce.css(e,\"border\"+Q[a]+\"Width\",!0,i):s+=ce.css(e,\"border\"+Q[a]+\"Width\",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e[\"offset\"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u+l}function ot(e,t,n){var r=Xe(e),i=(!le.boxSizingReliable()||n)&&\"border-box\"===ce.css(e,\"boxSizing\",!1,r),o=i,a=Ge(e,t,r),s=\"offset\"+t[0].toUpperCase()+t.slice(1);if(_e.test(a)){if(!n)return a;a=\"auto\"}return(!le.boxSizingReliable()&&i||!le.reliableTrDimensions()&&fe(e,\"tr\")||\"auto\"===a||!parseFloat(a)&&\"inline\"===ce.css(e,\"display\",!1,r))&&e.getClientRects().length&&(i=\"border-box\"===ce.css(e,\"boxSizing\",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+it(e,t,n||(i?\"border\":\"content\"),o,r,a)+\"px\"}function at(e,t,n,r,i){return new at.prototype.init(e,t,n,r,i)}ce.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Ge(e,\"opacity\");return\"\"===n?\"1\":n}}}},cssNumber:{animationIterationCount:!0,aspectRatio:!0,borderImageSlice:!0,columnCount:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,scale:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeMiterlimit:!0,strokeOpacity:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=F(t),u=ze.test(t),l=e.style;if(u||(t=Ze(s)),a=ce.cssHooks[t]||ce.cssHooks[s],void 0===n)return a&&\"get\"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];\"string\"===(o=typeof n)&&(i=Y.exec(n))&&i[1]&&(n=te(e,t,i),o=\"number\"),null!=n&&n==n&&(\"number\"!==o||u||(n+=i&&i[3]||(ce.cssNumber[s]?\"\":\"px\")),le.clearCloneStyle||\"\"!==n||0!==t.indexOf(\"background\")||(l[t]=\"inherit\"),a&&\"set\"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=F(t);return ze.test(t)||(t=Ze(s)),(a=ce.cssHooks[t]||ce.cssHooks[s])&&\"get\"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Ge(e,t,r)),\"normal\"===i&&t in nt&&(i=nt[t]),\"\"===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),ce.each([\"height\",\"width\"],function(e,u){ce.cssHooks[u]={get:function(e,t,n){if(t)return!et.test(ce.css(e,\"display\"))||e.getClientRects().length&&e.getBoundingClientRect().width?ot(e,u,n):Ue(e,tt,function(){return ot(e,u,n)})},set:function(e,t,n){var r,i=Xe(e),o=!le.scrollboxSize()&&\"absolute\"===i.position,a=(o||n)&&\"border-box\"===ce.css(e,\"boxSizing\",!1,i),s=n?it(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e[\"offset\"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-it(e,u,\"border\",!1,i)-.5)),s&&(r=Y.exec(t))&&\"px\"!==(r[3]||\"px\")&&(e.style[u]=t,t=ce.css(e,u)),rt(0,t,s)}}}),ce.cssHooks.marginLeft=Ye(le.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Ge(e,\"marginLeft\"))||e.getBoundingClientRect().left-Ue(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+\"px\"}),ce.each({margin:\"\",padding:\"\",border:\"Width\"},function(i,o){ce.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r=\"string\"==typeof e?e.split(\" \"):[e];t<4;t++)n[i+Q[t]+o]=r[t]||r[t-2]||r[0];return n}},\"margin\"!==i&&(ce.cssHooks[i+o].set=rt)}),ce.fn.extend({css:function(e,t){return M(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Xe(e),i=t.length;a<i;a++)o[t[a]]=ce.css(e,t[a],!1,r);return o}return void 0!==n?ce.style(e,t,n):ce.css(e,t)},e,t,1<arguments.length)}}),((ce.Tween=at).prototype={constructor:at,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||ce.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(ce.cssNumber[n]?\"\":\"px\")},cur:function(){var e=at.propHooks[this.prop];return e&&e.get?e.get(this):at.propHooks._default.get(this)},run:function(e){var t,n=at.propHooks[this.prop];return this.options.duration?this.pos=t=ce.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):at.propHooks._default.set(this),this}}).init.prototype=at.prototype,(at.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=ce.css(e.elem,e.prop,\"\"))&&\"auto\"!==t?t:0},set:function(e){ce.fx.step[e.prop]?ce.fx.step[e.prop](e):1!==e.elem.nodeType||!ce.cssHooks[e.prop]&&null==e.elem.style[Ze(e.prop)]?e.elem[e.prop]=e.now:ce.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=at.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},ce.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:\"swing\"},ce.fx=at.prototype.init,ce.fx.step={};var st,ut,lt,ct,ft=/^(?:toggle|show|hide)$/,pt=/queueHooks$/;function dt(){ut&&(!1===C.hidden&&ie.requestAnimationFrame?ie.requestAnimationFrame(dt):ie.setTimeout(dt,ce.fx.interval),ce.fx.tick())}function ht(){return ie.setTimeout(function(){st=void 0}),st=Date.now()}function gt(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i[\"margin\"+(n=Q[r])]=i[\"padding\"+n]=e;return t&&(i.opacity=i.width=e),i}function vt(e,t,n){for(var r,i=(yt.tweeners[t]||[]).concat(yt.tweeners[\"*\"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function yt(o,e,t){var n,a,r=0,i=yt.prefilters.length,s=ce.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=st||ht(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:ce.extend({},e),opts:ce.extend(!0,{specialEasing:{},easing:ce.easing._default},t),originalProperties:e,originalOptions:t,startTime:st||ht(),duration:t.duration,tweens:[],createTween:function(e,t){var n=ce.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=F(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=ce.cssHooks[r])&&\"expand\"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=yt.prefilters[r].call(l,o,c,l.opts))return v(n.stop)&&(ce._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return ce.map(c,vt,l),v(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),ce.fx.timer(ce.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}ce.Animation=ce.extend(yt,{tweeners:{\"*\":[function(e,t){var n=this.createTween(e,t);return te(n.elem,e,Y.exec(t),n),n}]},tweener:function(e,t){v(e)?(t=e,e=[\"*\"]):e=e.match(D);for(var n,r=0,i=e.length;r<i;r++)n=e[r],yt.tweeners[n]=yt.tweeners[n]||[],yt.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f=\"width\"in t||\"height\"in t,p=this,d={},h=e.style,g=e.nodeType&&ee(e),v=_.get(e,\"fxshow\");for(r in n.queue||(null==(a=ce._queueHooks(e,\"fx\")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,ce.queue(e,\"fx\").length||a.empty.fire()})})),t)if(i=t[r],ft.test(i)){if(delete t[r],o=o||\"toggle\"===i,i===(g?\"hide\":\"show\")){if(\"show\"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||ce.style(e,r)}if((u=!ce.isEmptyObject(t))||!ce.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=_.get(e,\"display\")),\"none\"===(c=ce.css(e,\"display\"))&&(l?c=l:(re([e],!0),l=e.style.display||l,c=ce.css(e,\"display\"),re([e]))),(\"inline\"===c||\"inline-block\"===c&&null!=l)&&\"none\"===ce.css(e,\"float\")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l=\"none\"===c?\"\":c)),h.display=\"inline-block\")),n.overflow&&(h.overflow=\"hidden\",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?\"hidden\"in v&&(g=v.hidden):v=_.access(e,\"fxshow\",{display:l}),o&&(v.hidden=!g),g&&re([e],!0),p.done(function(){for(r in g||re([e]),_.remove(e,\"fxshow\"),d)ce.style(e,r,d[r])})),u=vt(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?yt.prefilters.unshift(e):yt.prefilters.push(e)}}),ce.speed=function(e,t,n){var r=e&&\"object\"==typeof e?ce.extend({},e):{complete:n||!n&&t||v(e)&&e,duration:e,easing:n&&t||t&&!v(t)&&t};return ce.fx.off?r.duration=0:\"number\"!=typeof r.duration&&(r.duration in ce.fx.speeds?r.duration=ce.fx.speeds[r.duration]:r.duration=ce.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue=\"fx\"),r.old=r.complete,r.complete=function(){v(r.old)&&r.old.call(this),r.queue&&ce.dequeue(this,r.queue)},r},ce.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ee).css(\"opacity\",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=ce.isEmptyObject(t),o=ce.speed(e,n,r),a=function(){var e=yt(this,ce.extend({},t),o);(i||_.get(this,\"finish\"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return\"string\"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||\"fx\",[]),this.each(function(){var e=!0,t=null!=i&&i+\"queueHooks\",n=ce.timers,r=_.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&pt.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||ce.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||\"fx\"),this.each(function(){var e,t=_.get(this),n=t[a+\"queue\"],r=t[a+\"queueHooks\"],i=ce.timers,o=n?n.length:0;for(t.finish=!0,ce.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),ce.each([\"toggle\",\"show\",\"hide\"],function(e,r){var i=ce.fn[r];ce.fn[r]=function(e,t,n){return null==e||\"boolean\"==typeof e?i.apply(this,arguments):this.animate(gt(r,!0),e,t,n)}}),ce.each({slideDown:gt(\"show\"),slideUp:gt(\"hide\"),slideToggle:gt(\"toggle\"),fadeIn:{opacity:\"show\"},fadeOut:{opacity:\"hide\"},fadeToggle:{opacity:\"toggle\"}},function(e,r){ce.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),ce.timers=[],ce.fx.tick=function(){var e,t=0,n=ce.timers;for(st=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||ce.fx.stop(),st=void 0},ce.fx.timer=function(e){ce.timers.push(e),ce.fx.start()},ce.fx.interval=13,ce.fx.start=function(){ut||(ut=!0,dt())},ce.fx.stop=function(){ut=null},ce.fx.speeds={slow:600,fast:200,_default:400},ce.fn.delay=function(r,e){return r=ce.fx&&ce.fx.speeds[r]||r,e=e||\"fx\",this.queue(e,function(e,t){var n=ie.setTimeout(e,r);t.stop=function(){ie.clearTimeout(n)}})},lt=C.createElement(\"input\"),ct=C.createElement(\"select\").appendChild(C.createElement(\"option\")),lt.type=\"checkbox\",le.checkOn=\"\"!==lt.value,le.optSelected=ct.selected,(lt=C.createElement(\"input\")).value=\"t\",lt.type=\"radio\",le.radioValue=\"t\"===lt.value;var mt,xt=ce.expr.attrHandle;ce.fn.extend({attr:function(e,t){return M(this,ce.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){ce.removeAttr(this,e)})}}),ce.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return\"undefined\"==typeof e.getAttribute?ce.prop(e,t,n):(1===o&&ce.isXMLDoc(e)||(i=ce.attrHooks[t.toLowerCase()]||(ce.expr.match.bool.test(t)?mt:void 0)),void 0!==n?null===n?void ce.removeAttr(e,t):i&&\"set\"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+\"\"),n):i&&\"get\"in i&&null!==(r=i.get(e,t))?r:null==(r=ce.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!le.radioValue&&\"radio\"===t&&fe(e,\"input\")){var n=e.value;return e.setAttribute(\"type\",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(D);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),mt={set:function(e,t,n){return!1===t?ce.removeAttr(e,n):e.setAttribute(n,n),n}},ce.each(ce.expr.match.bool.source.match(/\\w+/g),function(e,t){var a=xt[t]||ce.find.attr;xt[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=xt[o],xt[o]=r,r=null!=a(e,t,n)?o:null,xt[o]=i),r}});var bt=/^(?:input|select|textarea|button)$/i,wt=/^(?:a|area)$/i;function Tt(e){return(e.match(D)||[]).join(\" \")}function Ct(e){return e.getAttribute&&e.getAttribute(\"class\")||\"\"}function kt(e){return Array.isArray(e)?e:\"string\"==typeof e&&e.match(D)||[]}ce.fn.extend({prop:function(e,t){return M(this,ce.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[ce.propFix[e]||e]})}}),ce.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&ce.isXMLDoc(e)||(t=ce.propFix[t]||t,i=ce.propHooks[t]),void 0!==n?i&&\"set\"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&\"get\"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=ce.find.attr(e,\"tabindex\");return t?parseInt(t,10):bt.test(e.nodeName)||wt.test(e.nodeName)&&e.href?0:-1}}},propFix:{\"for\":\"htmlFor\",\"class\":\"className\"}}),le.optSelected||(ce.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),ce.each([\"tabIndex\",\"readOnly\",\"maxLength\",\"cellSpacing\",\"cellPadding\",\"rowSpan\",\"colSpan\",\"useMap\",\"frameBorder\",\"contentEditable\"],function(){ce.propFix[this.toLowerCase()]=this}),ce.fn.extend({addClass:function(t){var e,n,r,i,o,a;return v(t)?this.each(function(e){ce(this).addClass(t.call(this,e,Ct(this)))}):(e=kt(t)).length?this.each(function(){if(r=Ct(this),n=1===this.nodeType&&\" \"+Tt(r)+\" \"){for(o=0;o<e.length;o++)i=e[o],n.indexOf(\" \"+i+\" \")<0&&(n+=i+\" \");a=Tt(n),r!==a&&this.setAttribute(\"class\",a)}}):this},removeClass:function(t){var e,n,r,i,o,a;return v(t)?this.each(function(e){ce(this).removeClass(t.call(this,e,Ct(this)))}):arguments.length?(e=kt(t)).length?this.each(function(){if(r=Ct(this),n=1===this.nodeType&&\" \"+Tt(r)+\" \"){for(o=0;o<e.length;o++){i=e[o];while(-1<n.indexOf(\" \"+i+\" \"))n=n.replace(\" \"+i+\" \",\" \")}a=Tt(n),r!==a&&this.setAttribute(\"class\",a)}}):this:this.attr(\"class\",\"\")},toggleClass:function(t,n){var e,r,i,o,a=typeof t,s=\"string\"===a||Array.isArray(t);return v(t)?this.each(function(e){ce(this).toggleClass(t.call(this,e,Ct(this),n),n)}):\"boolean\"==typeof n&&s?n?this.addClass(t):this.removeClass(t):(e=kt(t),this.each(function(){if(s)for(o=ce(this),i=0;i<e.length;i++)r=e[i],o.hasClass(r)?o.removeClass(r):o.addClass(r);else void 0!==t&&\"boolean\"!==a||((r=Ct(this))&&_.set(this,\"__className__\",r),this.setAttribute&&this.setAttribute(\"class\",r||!1===t?\"\":_.get(this,\"__className__\")||\"\"))}))},hasClass:function(e){var t,n,r=0;t=\" \"+e+\" \";while(n=this[r++])if(1===n.nodeType&&-1<(\" \"+Tt(Ct(n))+\" \").indexOf(t))return!0;return!1}});var St=/\\r/g;ce.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=v(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,ce(this).val()):n)?t=\"\":\"number\"==typeof t?t+=\"\":Array.isArray(t)&&(t=ce.map(t,function(e){return null==e?\"\":e+\"\"})),(r=ce.valHooks[this.type]||ce.valHooks[this.nodeName.toLowerCase()])&&\"set\"in r&&void 0!==r.set(this,t,\"value\")||(this.value=t))})):t?(r=ce.valHooks[t.type]||ce.valHooks[t.nodeName.toLowerCase()])&&\"get\"in r&&void 0!==(e=r.get(t,\"value\"))?e:\"string\"==typeof(e=t.value)?e.replace(St,\"\"):null==e?\"\":e:void 0}}),ce.extend({valHooks:{option:{get:function(e){var t=ce.find.attr(e,\"value\");return null!=t?t:Tt(ce.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a=\"select-one\"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!fe(n.parentNode,\"optgroup\"))){if(t=ce(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=ce.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<ce.inArray(ce.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),ce.each([\"radio\",\"checkbox\"],function(){ce.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<ce.inArray(ce(e).val(),t)}},le.checkOn||(ce.valHooks[this].get=function(e){return null===e.getAttribute(\"value\")?\"on\":e.value})});var Et=ie.location,jt={guid:Date.now()},At=/\\?/;ce.parseXML=function(e){var t,n;if(!e||\"string\"!=typeof e)return null;try{t=(new ie.DOMParser).parseFromString(e,\"text/xml\")}catch(e){}return n=t&&t.getElementsByTagName(\"parsererror\")[0],t&&!n||ce.error(\"Invalid XML: \"+(n?ce.map(n.childNodes,function(e){return e.textContent}).join(\"\\n\"):e)),t};var Dt=/^(?:focusinfocus|focusoutblur)$/,Nt=function(e){e.stopPropagation()};ce.extend(ce.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||C],d=ue.call(e,\"type\")?e.type:e,h=ue.call(e,\"namespace\")?e.namespace.split(\".\"):[];if(o=f=a=n=n||C,3!==n.nodeType&&8!==n.nodeType&&!Dt.test(d+ce.event.triggered)&&(-1<d.indexOf(\".\")&&(d=(h=d.split(\".\")).shift(),h.sort()),u=d.indexOf(\":\")<0&&\"on\"+d,(e=e[ce.expando]?e:new ce.Event(d,\"object\"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join(\".\"),e.rnamespace=e.namespace?new RegExp(\"(^|\\\\.)\"+h.join(\"\\\\.(?:.*\\\\.|)\")+\"(\\\\.|$)\"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:ce.makeArray(t,[e]),c=ce.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!y(n)){for(s=c.delegateType||d,Dt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||C)&&p.push(a.defaultView||a.parentWindow||ie)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(_.get(o,\"events\")||Object.create(null))[e.type]&&_.get(o,\"handle\"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&$(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!$(n)||u&&v(n[d])&&!y(n)&&((a=n[u])&&(n[u]=null),ce.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,Nt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,Nt),ce.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=ce.extend(new ce.Event,n,{type:e,isSimulated:!0});ce.event.trigger(r,null,t)}}),ce.fn.extend({trigger:function(e,t){return this.each(function(){ce.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return ce.event.trigger(e,t,n,!0)}});var qt=/\\[\\]$/,Lt=/\\r?\\n/g,Ht=/^(?:submit|button|image|reset|file)$/i,Ot=/^(?:input|select|textarea|keygen)/i;function Pt(n,e,r,i){var t;if(Array.isArray(e))ce.each(e,function(e,t){r||qt.test(n)?i(n,t):Pt(n+\"[\"+(\"object\"==typeof t&&null!=t?e:\"\")+\"]\",t,r,i)});else if(r||\"object\"!==x(e))i(n,e);else for(t in e)Pt(n+\"[\"+t+\"]\",e[t],r,i)}ce.param=function(e,t){var n,r=[],i=function(e,t){var n=v(t)?t():t;r[r.length]=encodeURIComponent(e)+\"=\"+encodeURIComponent(null==n?\"\":n)};if(null==e)return\"\";if(Array.isArray(e)||e.jquery&&!ce.isPlainObject(e))ce.each(e,function(){i(this.name,this.value)});else for(n in e)Pt(n,e[n],t,i);return r.join(\"&\")},ce.fn.extend({serialize:function(){return ce.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=ce.prop(this,\"elements\");return e?ce.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!ce(this).is(\":disabled\")&&Ot.test(this.nodeName)&&!Ht.test(e)&&(this.checked||!we.test(e))}).map(function(e,t){var n=ce(this).val();return null==n?null:Array.isArray(n)?ce.map(n,function(e){return{name:t.name,value:e.replace(Lt,\"\\r\\n\")}}):{name:t.name,value:n.replace(Lt,\"\\r\\n\")}}).get()}});var Mt=/%20/g,Rt=/#.*$/,It=/([?&])_=[^&]*/,Wt=/^(.*?):[ \\t]*([^\\r\\n]*)$/gm,Ft=/^(?:GET|HEAD)$/,$t=/^\\/\\//,Bt={},_t={},zt=\"*/\".concat(\"*\"),Xt=C.createElement(\"a\");function Ut(o){return function(e,t){\"string\"!=typeof e&&(t=e,e=\"*\");var n,r=0,i=e.toLowerCase().match(D)||[];if(v(t))while(n=i[r++])\"+\"===n[0]?(n=n.slice(1)||\"*\",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Vt(t,i,o,a){var s={},u=t===_t;function l(e){var r;return s[e]=!0,ce.each(t[e]||[],function(e,t){var n=t(i,o,a);return\"string\"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s[\"*\"]&&l(\"*\")}function Gt(e,t){var n,r,i=ce.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&ce.extend(!0,e,r),e}Xt.href=Et.href,ce.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Et.href,type:\"GET\",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Et.protocol),global:!0,processData:!0,async:!0,contentType:\"application/x-www-form-urlencoded; charset=UTF-8\",accepts:{\"*\":zt,text:\"text/plain\",html:\"text/html\",xml:\"application/xml, text/xml\",json:\"application/json, text/javascript\"},contents:{xml:/\\bxml\\b/,html:/\\bhtml/,json:/\\bjson\\b/},responseFields:{xml:\"responseXML\",text:\"responseText\",json:\"responseJSON\"},converters:{\"* text\":String,\"text html\":!0,\"text json\":JSON.parse,\"text xml\":ce.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Gt(Gt(e,ce.ajaxSettings),t):Gt(ce.ajaxSettings,e)},ajaxPrefilter:Ut(Bt),ajaxTransport:Ut(_t),ajax:function(e,t){\"object\"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=ce.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?ce(y):ce.event,x=ce.Deferred(),b=ce.Callbacks(\"once memory\"),w=v.statusCode||{},a={},s={},u=\"canceled\",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=Wt.exec(p))n[t[1].toLowerCase()+\" \"]=(n[t[1].toLowerCase()+\" \"]||[]).concat(t[2])}t=n[e.toLowerCase()+\" \"]}return null==t?null:t.join(\", \")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||Et.href)+\"\").replace($t,Et.protocol+\"//\"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||\"*\").toLowerCase().match(D)||[\"\"],null==v.crossDomain){r=C.createElement(\"a\");try{r.href=v.url,r.href=r.href,v.crossDomain=Xt.protocol+\"//\"+Xt.host!=r.protocol+\"//\"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&\"string\"!=typeof v.data&&(v.data=ce.param(v.data,v.traditional)),Vt(Bt,v,t,T),h)return T;for(i in(g=ce.event&&v.global)&&0==ce.active++&&ce.event.trigger(\"ajaxStart\"),v.type=v.type.toUpperCase(),v.hasContent=!Ft.test(v.type),f=v.url.replace(Rt,\"\"),v.hasContent?v.data&&v.processData&&0===(v.contentType||\"\").indexOf(\"application/x-www-form-urlencoded\")&&(v.data=v.data.replace(Mt,\"+\")):(o=v.url.slice(f.length),v.data&&(v.processData||\"string\"==typeof v.data)&&(f+=(At.test(f)?\"&\":\"?\")+v.data,delete v.data),!1===v.cache&&(f=f.replace(It,\"$1\"),o=(At.test(f)?\"&\":\"?\")+\"_=\"+jt.guid+++o),v.url=f+o),v.ifModified&&(ce.lastModified[f]&&T.setRequestHeader(\"If-Modified-Since\",ce.lastModified[f]),ce.etag[f]&&T.setRequestHeader(\"If-None-Match\",ce.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader(\"Content-Type\",v.contentType),T.setRequestHeader(\"Accept\",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+(\"*\"!==v.dataTypes[0]?\", \"+zt+\"; q=0.01\":\"\"):v.accepts[\"*\"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u=\"abort\",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Vt(_t,v,t,T)){if(T.readyState=1,g&&m.trigger(\"ajaxSend\",[T,v]),h)return T;v.async&&0<v.timeout&&(d=ie.setTimeout(function(){T.abort(\"timeout\")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,\"No Transport\");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&ie.clearTimeout(d),c=void 0,p=r||\"\",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while(\"*\"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader(\"Content-Type\"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+\" \"+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<ce.inArray(\"script\",v.dataTypes)&&ce.inArray(\"json\",v.dataTypes)<0&&(v.converters[\"text script\"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if(\"*\"===o)o=u;else if(\"*\"!==u&&u!==o){if(!(a=l[u+\" \"+o]||l[\"* \"+o]))for(i in l)if((s=i.split(\" \"))[1]===o&&(a=l[u+\" \"+s[0]]||l[\"* \"+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e[\"throws\"])t=a(t);else try{t=a(t)}catch(e){return{state:\"parsererror\",error:a?e:\"No conversion from \"+u+\" to \"+o}}}return{state:\"success\",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader(\"Last-Modified\"))&&(ce.lastModified[f]=u),(u=T.getResponseHeader(\"etag\"))&&(ce.etag[f]=u)),204===e||\"HEAD\"===v.type?l=\"nocontent\":304===e?l=\"notmodified\":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l=\"error\",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+\"\",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?\"ajaxSuccess\":\"ajaxError\",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger(\"ajaxComplete\",[T,v]),--ce.active||ce.event.trigger(\"ajaxStop\")))}return T},getJSON:function(e,t,n){return ce.get(e,t,n,\"json\")},getScript:function(e,t){return ce.get(e,void 0,t,\"script\")}}),ce.each([\"get\",\"post\"],function(e,i){ce[i]=function(e,t,n,r){return v(t)&&(r=r||n,n=t,t=void 0),ce.ajax(ce.extend({url:e,type:i,dataType:r,data:t,success:n},ce.isPlainObject(e)&&e))}}),ce.ajaxPrefilter(function(e){var t;for(t in e.headers)\"content-type\"===t.toLowerCase()&&(e.contentType=e.headers[t]||\"\")}),ce._evalUrl=function(e,t,n){return ce.ajax({url:e,type:\"GET\",dataType:\"script\",cache:!0,async:!1,global:!1,converters:{\"text script\":function(){}},dataFilter:function(e){ce.globalEval(e,t,n)}})},ce.fn.extend({wrapAll:function(e){var t;return this[0]&&(v(e)&&(e=e.call(this[0])),t=ce(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return v(n)?this.each(function(e){ce(this).wrapInner(n.call(this,e))}):this.each(function(){var e=ce(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=v(t);return this.each(function(e){ce(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not(\"body\").each(function(){ce(this).replaceWith(this.childNodes)}),this}}),ce.expr.pseudos.hidden=function(e){return!ce.expr.pseudos.visible(e)},ce.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},ce.ajaxSettings.xhr=function(){try{return new ie.XMLHttpRequest}catch(e){}};var Yt={0:200,1223:204},Qt=ce.ajaxSettings.xhr();le.cors=!!Qt&&\"withCredentials\"in Qt,le.ajax=Qt=!!Qt,ce.ajaxTransport(function(i){var o,a;if(le.cors||Qt&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e[\"X-Requested-With\"]||(e[\"X-Requested-With\"]=\"XMLHttpRequest\"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,\"abort\"===e?r.abort():\"error\"===e?\"number\"!=typeof r.status?t(0,\"error\"):t(r.status,r.statusText):t(Yt[r.status]||r.status,r.statusText,\"text\"!==(r.responseType||\"text\")||\"string\"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o(\"error\"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&ie.setTimeout(function(){o&&a()})},o=o(\"abort\");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),ce.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),ce.ajaxSetup({accepts:{script:\"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"},contents:{script:/\\b(?:java|ecma)script\\b/},converters:{\"text script\":function(e){return ce.globalEval(e),e}}}),ce.ajaxPrefilter(\"script\",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type=\"GET\")}),ce.ajaxTransport(\"script\",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=ce(\"<script>\").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on(\"load error\",i=function(e){r.remove(),i=null,e&&t(\"error\"===e.type?404:200,e.type)}),C.head.appendChild(r[0])},abort:function(){i&&i()}}});var Jt,Kt=[],Zt=/(=)\\?(?=&|$)|\\?\\?/;ce.ajaxSetup({jsonp:\"callback\",jsonpCallback:function(){var e=Kt.pop()||ce.expando+\"_\"+jt.guid++;return this[e]=!0,e}}),ce.ajaxPrefilter(\"json jsonp\",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Zt.test(e.url)?\"url\":\"string\"==typeof e.data&&0===(e.contentType||\"\").indexOf(\"application/x-www-form-urlencoded\")&&Zt.test(e.data)&&\"data\");if(a||\"jsonp\"===e.dataTypes[0])return r=e.jsonpCallback=v(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Zt,\"$1\"+r):!1!==e.jsonp&&(e.url+=(At.test(e.url)?\"&\":\"?\")+e.jsonp+\"=\"+r),e.converters[\"script json\"]=function(){return o||ce.error(r+\" was not called\"),o[0]},e.dataTypes[0]=\"json\",i=ie[r],ie[r]=function(){o=arguments},n.always(function(){void 0===i?ce(ie).removeProp(r):ie[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Kt.push(r)),o&&v(i)&&i(o[0]),o=i=void 0}),\"script\"}),le.createHTMLDocument=((Jt=C.implementation.createHTMLDocument(\"\").body).innerHTML=\"<form></form><form></form>\",2===Jt.childNodes.length),ce.parseHTML=function(e,t,n){return\"string\"!=typeof e?[]:(\"boolean\"==typeof t&&(n=t,t=!1),t||(le.createHTMLDocument?((r=(t=C.implementation.createHTMLDocument(\"\")).createElement(\"base\")).href=C.location.href,t.head.appendChild(r)):t=C),o=!n&&[],(i=w.exec(e))?[t.createElement(i[1])]:(i=Ae([e],t,o),o&&o.length&&ce(o).remove(),ce.merge([],i.childNodes)));var r,i,o},ce.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(\" \");return-1<s&&(r=Tt(e.slice(s)),e=e.slice(0,s)),v(t)?(n=t,t=void 0):t&&\"object\"==typeof t&&(i=\"POST\"),0<a.length&&ce.ajax({url:e,type:i||\"GET\",dataType:\"html\",data:t}).done(function(e){o=arguments,a.html(r?ce(\"<div>\").append(ce.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},ce.expr.pseudos.animated=function(t){return ce.grep(ce.timers,function(e){return t===e.elem}).length},ce.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=ce.css(e,\"position\"),c=ce(e),f={};\"static\"===l&&(e.style.position=\"relative\"),s=c.offset(),o=ce.css(e,\"top\"),u=ce.css(e,\"left\"),(\"absolute\"===l||\"fixed\"===l)&&-1<(o+u).indexOf(\"auto\")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),v(t)&&(t=t.call(e,n,ce.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),\"using\"in t?t.using.call(e,f):c.css(f)}},ce.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){ce.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if(\"fixed\"===ce.css(r,\"position\"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&\"static\"===ce.css(e,\"position\"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=ce(e).offset()).top+=ce.css(e,\"borderTopWidth\",!0),i.left+=ce.css(e,\"borderLeftWidth\",!0))}return{top:t.top-i.top-ce.css(r,\"marginTop\",!0),left:t.left-i.left-ce.css(r,\"marginLeft\",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&\"static\"===ce.css(e,\"position\"))e=e.offsetParent;return e||J})}}),ce.each({scrollLeft:\"pageXOffset\",scrollTop:\"pageYOffset\"},function(t,i){var o=\"pageYOffset\"===i;ce.fn[t]=function(e){return M(this,function(e,t,n){var r;if(y(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),ce.each([\"top\",\"left\"],function(e,n){ce.cssHooks[n]=Ye(le.pixelPosition,function(e,t){if(t)return t=Ge(e,n),_e.test(t)?ce(e).position()[n]+\"px\":t})}),ce.each({Height:\"height\",Width:\"width\"},function(a,s){ce.each({padding:\"inner\"+a,content:s,\"\":\"outer\"+a},function(r,o){ce.fn[o]=function(e,t){var n=arguments.length&&(r||\"boolean\"!=typeof e),i=r||(!0===e||!0===t?\"margin\":\"border\");return M(this,function(e,t,n){var r;return y(e)?0===o.indexOf(\"outer\")?e[\"inner\"+a]:e.document.documentElement[\"client\"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body[\"scroll\"+a],r[\"scroll\"+a],e.body[\"offset\"+a],r[\"offset\"+a],r[\"client\"+a])):void 0===n?ce.css(e,t,i):ce.style(e,t,n,i)},s,n?e:void 0,n)}})}),ce.each([\"ajaxStart\",\"ajaxStop\",\"ajaxComplete\",\"ajaxError\",\"ajaxSuccess\",\"ajaxSend\"],function(e,t){ce.fn[t]=function(e){return this.on(t,e)}}),ce.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,\"**\"):this.off(t,e||\"**\",n)},hover:function(e,t){return this.on(\"mouseenter\",e).on(\"mouseleave\",t||e)}}),ce.each(\"blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu\".split(\" \"),function(e,n){ce.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var en=/^[\\s\\uFEFF\\xA0]+|([^\\s\\uFEFF\\xA0])[\\s\\uFEFF\\xA0]+$/g;ce.proxy=function(e,t){var n,r,i;if(\"string\"==typeof t&&(n=e[t],t=e,e=n),v(e))return r=ae.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(ae.call(arguments)))}).guid=e.guid=e.guid||ce.guid++,i},ce.holdReady=function(e){e?ce.readyWait++:ce.ready(!0)},ce.isArray=Array.isArray,ce.parseJSON=JSON.parse,ce.nodeName=fe,ce.isFunction=v,ce.isWindow=y,ce.camelCase=F,ce.type=x,ce.now=Date.now,ce.isNumeric=function(e){var t=ce.type(e);return(\"number\"===t||\"string\"===t)&&!isNaN(e-parseFloat(e))},ce.trim=function(e){return null==e?\"\":(e+\"\").replace(en,\"$1\")},\"function\"==typeof define&&define.amd&&define(\"jquery\",[],function(){return ce});var tn=ie.jQuery,nn=ie.$;return ce.noConflict=function(e){return ie.$===ce&&(ie.$=nn),e&&ie.jQuery===ce&&(ie.jQuery=tn),ce},\"undefined\"==typeof e&&(ie.jQuery=ie.$=ce),ce});\n"
  },
  {
    "path": "themes/default/public/js/jquery-3.7.1.min.map",
    "content": "{\"version\":3,\"sources\":[\"jquery-3.7.1.js\"],\"names\":[\"global\",\"factory\",\"module\",\"exports\",\"document\",\"w\",\"Error\",\"window\",\"this\",\"noGlobal\",\"arr\",\"getProto\",\"Object\",\"getPrototypeOf\",\"slice\",\"flat\",\"array\",\"call\",\"concat\",\"apply\",\"push\",\"indexOf\",\"class2type\",\"toString\",\"hasOwn\",\"hasOwnProperty\",\"fnToString\",\"ObjectFunctionString\",\"support\",\"isFunction\",\"obj\",\"nodeType\",\"item\",\"isWindow\",\"preservedScriptAttributes\",\"type\",\"src\",\"nonce\",\"noModule\",\"DOMEval\",\"code\",\"node\",\"doc\",\"i\",\"val\",\"script\",\"createElement\",\"text\",\"getAttribute\",\"setAttribute\",\"head\",\"appendChild\",\"parentNode\",\"removeChild\",\"toType\",\"version\",\"rhtmlSuffix\",\"jQuery\",\"selector\",\"context\",\"fn\",\"init\",\"isArrayLike\",\"length\",\"nodeName\",\"elem\",\"name\",\"toLowerCase\",\"prototype\",\"jquery\",\"constructor\",\"toArray\",\"get\",\"num\",\"pushStack\",\"elems\",\"ret\",\"merge\",\"prevObject\",\"each\",\"callback\",\"map\",\"arguments\",\"first\",\"eq\",\"last\",\"even\",\"grep\",\"_elem\",\"odd\",\"len\",\"j\",\"end\",\"sort\",\"splice\",\"extend\",\"options\",\"copy\",\"copyIsArray\",\"clone\",\"target\",\"deep\",\"isPlainObject\",\"Array\",\"isArray\",\"undefined\",\"expando\",\"Math\",\"random\",\"replace\",\"isReady\",\"error\",\"msg\",\"noop\",\"proto\",\"Ctor\",\"isEmptyObject\",\"globalEval\",\"textContent\",\"documentElement\",\"nodeValue\",\"makeArray\",\"results\",\"inArray\",\"isXMLDoc\",\"namespace\",\"namespaceURI\",\"docElem\",\"ownerDocument\",\"test\",\"second\",\"invert\",\"matches\",\"callbackExpect\",\"arg\",\"value\",\"guid\",\"Symbol\",\"iterator\",\"split\",\"_i\",\"pop\",\"whitespace\",\"rtrimCSS\",\"RegExp\",\"contains\",\"a\",\"b\",\"bup\",\"compareDocumentPosition\",\"rcssescape\",\"fcssescape\",\"ch\",\"asCodePoint\",\"charCodeAt\",\"escapeSelector\",\"sel\",\"preferredDoc\",\"pushNative\",\"Expr\",\"outermostContext\",\"sortInput\",\"hasDuplicate\",\"documentIsHTML\",\"rbuggyQSA\",\"dirruns\",\"done\",\"classCache\",\"createCache\",\"tokenCache\",\"compilerCache\",\"nonnativeSelectorCache\",\"sortOrder\",\"booleans\",\"identifier\",\"attributes\",\"pseudos\",\"rwhitespace\",\"rcomma\",\"rleadingCombinator\",\"rdescend\",\"rpseudo\",\"ridentifier\",\"matchExpr\",\"ID\",\"CLASS\",\"TAG\",\"ATTR\",\"PSEUDO\",\"CHILD\",\"bool\",\"needsContext\",\"rinputs\",\"rheader\",\"rquickExpr\",\"rsibling\",\"runescape\",\"funescape\",\"escape\",\"nonHex\",\"high\",\"String\",\"fromCharCode\",\"unloadHandler\",\"setDocument\",\"inDisabledFieldset\",\"addCombinator\",\"disabled\",\"dir\",\"next\",\"childNodes\",\"e\",\"els\",\"find\",\"seed\",\"m\",\"nid\",\"match\",\"groups\",\"newSelector\",\"newContext\",\"exec\",\"getElementById\",\"id\",\"getElementsByTagName\",\"getElementsByClassName\",\"testContext\",\"scope\",\"tokenize\",\"toSelector\",\"join\",\"querySelectorAll\",\"qsaError\",\"removeAttribute\",\"select\",\"keys\",\"cache\",\"key\",\"cacheLength\",\"shift\",\"markFunction\",\"assert\",\"el\",\"createInputPseudo\",\"createButtonPseudo\",\"createDisabledPseudo\",\"isDisabled\",\"createPositionalPseudo\",\"argument\",\"matchIndexes\",\"subWindow\",\"webkitMatchesSelector\",\"msMatchesSelector\",\"defaultView\",\"top\",\"addEventListener\",\"getById\",\"getElementsByName\",\"disconnectedMatch\",\"cssHas\",\"querySelector\",\"filter\",\"attrId\",\"getAttributeNode\",\"tag\",\"className\",\"input\",\"innerHTML\",\"compare\",\"sortDetached\",\"expr\",\"elements\",\"matchesSelector\",\"attr\",\"attrHandle\",\"uniqueSort\",\"duplicates\",\"sortStable\",\"createPseudo\",\"relative\",\">\",\" \",\"+\",\"~\",\"preFilter\",\"excess\",\"unquoted\",\"nodeNameSelector\",\"expectedNodeName\",\"pattern\",\"operator\",\"check\",\"result\",\"what\",\"_argument\",\"simple\",\"forward\",\"ofType\",\"_context\",\"xml\",\"outerCache\",\"nodeIndex\",\"start\",\"parent\",\"useCache\",\"diff\",\"firstChild\",\"lastChild\",\"pseudo\",\"args\",\"setFilters\",\"idx\",\"matched\",\"not\",\"matcher\",\"compile\",\"unmatched\",\"has\",\"lang\",\"elemLang\",\"hash\",\"location\",\"root\",\"focus\",\"activeElement\",\"err\",\"safeActiveElement\",\"hasFocus\",\"href\",\"tabIndex\",\"enabled\",\"checked\",\"selected\",\"selectedIndex\",\"empty\",\"nextSibling\",\"header\",\"button\",\"_matchIndexes\",\"lt\",\"gt\",\"nth\",\"radio\",\"checkbox\",\"file\",\"password\",\"image\",\"submit\",\"reset\",\"parseOnly\",\"tokens\",\"soFar\",\"preFilters\",\"cached\",\"combinator\",\"base\",\"skip\",\"checkNonElements\",\"doneName\",\"oldCache\",\"newCache\",\"elementMatcher\",\"matchers\",\"condense\",\"newUnmatched\",\"mapped\",\"setMatcher\",\"postFilter\",\"postFinder\",\"postSelector\",\"temp\",\"matcherOut\",\"preMap\",\"postMap\",\"preexisting\",\"contexts\",\"multipleContexts\",\"matcherIn\",\"matcherFromTokens\",\"checkContext\",\"leadingRelative\",\"implicitRelative\",\"matchContext\",\"matchAnyContext\",\"elementMatchers\",\"setMatchers\",\"bySet\",\"byElement\",\"superMatcher\",\"outermost\",\"matchedCount\",\"setMatched\",\"contextBackup\",\"dirrunsUnique\",\"token\",\"compiled\",\"filters\",\"unique\",\"getText\",\"isXML\",\"selectors\",\"until\",\"truncate\",\"is\",\"siblings\",\"n\",\"rneedsContext\",\"rsingleTag\",\"winnow\",\"qualifier\",\"self\",\"rootjQuery\",\"parseHTML\",\"ready\",\"rparentsprev\",\"guaranteedUnique\",\"children\",\"contents\",\"prev\",\"sibling\",\"cur\",\"targets\",\"l\",\"closest\",\"index\",\"prevAll\",\"add\",\"addBack\",\"parents\",\"parentsUntil\",\"nextAll\",\"nextUntil\",\"prevUntil\",\"contentDocument\",\"content\",\"reverse\",\"rnothtmlwhite\",\"Identity\",\"v\",\"Thrower\",\"ex\",\"adoptValue\",\"resolve\",\"reject\",\"noValue\",\"method\",\"promise\",\"fail\",\"then\",\"Callbacks\",\"object\",\"_\",\"flag\",\"firing\",\"memory\",\"fired\",\"locked\",\"list\",\"queue\",\"firingIndex\",\"fire\",\"once\",\"stopOnFalse\",\"remove\",\"disable\",\"lock\",\"fireWith\",\"Deferred\",\"func\",\"tuples\",\"state\",\"always\",\"deferred\",\"catch\",\"pipe\",\"fns\",\"newDefer\",\"tuple\",\"returned\",\"progress\",\"notify\",\"onFulfilled\",\"onRejected\",\"onProgress\",\"maxDepth\",\"depth\",\"handler\",\"special\",\"that\",\"mightThrow\",\"TypeError\",\"notifyWith\",\"resolveWith\",\"process\",\"exceptionHook\",\"rejectWith\",\"getErrorHook\",\"getStackHook\",\"setTimeout\",\"stateString\",\"when\",\"singleValue\",\"remaining\",\"resolveContexts\",\"resolveValues\",\"primary\",\"updateFunc\",\"rerrorNames\",\"asyncError\",\"console\",\"warn\",\"message\",\"stack\",\"readyException\",\"readyList\",\"completed\",\"removeEventListener\",\"readyWait\",\"wait\",\"readyState\",\"doScroll\",\"access\",\"chainable\",\"emptyGet\",\"raw\",\"bulk\",\"_key\",\"rmsPrefix\",\"rdashAlpha\",\"fcamelCase\",\"_all\",\"letter\",\"toUpperCase\",\"camelCase\",\"string\",\"acceptData\",\"owner\",\"Data\",\"uid\",\"defineProperty\",\"configurable\",\"set\",\"data\",\"prop\",\"hasData\",\"dataPriv\",\"dataUser\",\"rbrace\",\"rmultiDash\",\"dataAttr\",\"JSON\",\"parse\",\"removeData\",\"_data\",\"_removeData\",\"attrs\",\"dequeue\",\"startLength\",\"hooks\",\"_queueHooks\",\"unshift\",\"stop\",\"setter\",\"clearQueue\",\"tmp\",\"count\",\"defer\",\"pnum\",\"source\",\"rcssNum\",\"cssExpand\",\"isAttached\",\"composed\",\"getRootNode\",\"isHiddenWithinTree\",\"style\",\"display\",\"css\",\"adjustCSS\",\"valueParts\",\"tween\",\"adjusted\",\"scale\",\"maxIterations\",\"currentValue\",\"initial\",\"unit\",\"cssNumber\",\"initialInUnit\",\"defaultDisplayMap\",\"showHide\",\"show\",\"values\",\"body\",\"hide\",\"toggle\",\"div\",\"rcheckableType\",\"rtagName\",\"rscriptType\",\"createDocumentFragment\",\"checkClone\",\"cloneNode\",\"noCloneChecked\",\"defaultValue\",\"option\",\"wrapMap\",\"thead\",\"col\",\"tr\",\"td\",\"_default\",\"getAll\",\"setGlobalEval\",\"refElements\",\"tbody\",\"tfoot\",\"colgroup\",\"caption\",\"th\",\"optgroup\",\"rhtml\",\"buildFragment\",\"scripts\",\"selection\",\"ignored\",\"wrap\",\"attached\",\"fragment\",\"nodes\",\"htmlPrefilter\",\"createTextNode\",\"rtypenamespace\",\"returnTrue\",\"returnFalse\",\"on\",\"types\",\"one\",\"origFn\",\"event\",\"off\",\"leverageNative\",\"isSetup\",\"saved\",\"isTrigger\",\"delegateType\",\"stopPropagation\",\"stopImmediatePropagation\",\"preventDefault\",\"trigger\",\"isImmediatePropagationStopped\",\"handleObjIn\",\"eventHandle\",\"events\",\"t\",\"handleObj\",\"handlers\",\"namespaces\",\"origType\",\"elemData\",\"create\",\"handle\",\"triggered\",\"dispatch\",\"bindType\",\"delegateCount\",\"setup\",\"mappedTypes\",\"origCount\",\"teardown\",\"removeEvent\",\"nativeEvent\",\"handlerQueue\",\"fix\",\"delegateTarget\",\"preDispatch\",\"isPropagationStopped\",\"currentTarget\",\"rnamespace\",\"postDispatch\",\"matchedHandlers\",\"matchedSelectors\",\"addProp\",\"hook\",\"Event\",\"enumerable\",\"originalEvent\",\"writable\",\"load\",\"noBubble\",\"click\",\"beforeunload\",\"returnValue\",\"props\",\"isDefaultPrevented\",\"defaultPrevented\",\"relatedTarget\",\"timeStamp\",\"Date\",\"now\",\"isSimulated\",\"altKey\",\"bubbles\",\"cancelable\",\"changedTouches\",\"ctrlKey\",\"detail\",\"eventPhase\",\"metaKey\",\"pageX\",\"pageY\",\"shiftKey\",\"view\",\"char\",\"charCode\",\"keyCode\",\"buttons\",\"clientX\",\"clientY\",\"offsetX\",\"offsetY\",\"pointerId\",\"pointerType\",\"screenX\",\"screenY\",\"targetTouches\",\"toElement\",\"touches\",\"which\",\"blur\",\"focusMappedHandler\",\"documentMode\",\"simulate\",\"attaches\",\"dataHolder\",\"mouseenter\",\"mouseleave\",\"pointerenter\",\"pointerleave\",\"orig\",\"related\",\"rnoInnerhtml\",\"rchecked\",\"rcleanScript\",\"manipulationTarget\",\"disableScript\",\"restoreScript\",\"cloneCopyEvent\",\"dest\",\"udataOld\",\"udataCur\",\"domManip\",\"collection\",\"hasScripts\",\"iNoClone\",\"valueIsFunction\",\"html\",\"_evalUrl\",\"keepData\",\"cleanData\",\"dataAndEvents\",\"deepDataAndEvents\",\"srcElements\",\"destElements\",\"inPage\",\"detach\",\"append\",\"prepend\",\"insertBefore\",\"before\",\"after\",\"replaceWith\",\"replaceChild\",\"appendTo\",\"prependTo\",\"insertAfter\",\"replaceAll\",\"original\",\"insert\",\"rnumnonpx\",\"rcustomProp\",\"getStyles\",\"opener\",\"getComputedStyle\",\"swap\",\"old\",\"rboxStyle\",\"curCSS\",\"computed\",\"width\",\"minWidth\",\"maxWidth\",\"isCustomProp\",\"getPropertyValue\",\"pixelBoxStyles\",\"addGetHookIf\",\"conditionFn\",\"hookFn\",\"computeStyleTests\",\"container\",\"cssText\",\"divStyle\",\"pixelPositionVal\",\"reliableMarginLeftVal\",\"roundPixelMeasures\",\"marginLeft\",\"right\",\"pixelBoxStylesVal\",\"boxSizingReliableVal\",\"position\",\"scrollboxSizeVal\",\"offsetWidth\",\"measure\",\"round\",\"parseFloat\",\"reliableTrDimensionsVal\",\"backgroundClip\",\"clearCloneStyle\",\"boxSizingReliable\",\"pixelPosition\",\"reliableMarginLeft\",\"scrollboxSize\",\"reliableTrDimensions\",\"table\",\"trChild\",\"trStyle\",\"height\",\"parseInt\",\"borderTopWidth\",\"borderBottomWidth\",\"offsetHeight\",\"cssPrefixes\",\"emptyStyle\",\"vendorProps\",\"finalPropName\",\"final\",\"cssProps\",\"capName\",\"vendorPropName\",\"rdisplayswap\",\"cssShow\",\"visibility\",\"cssNormalTransform\",\"letterSpacing\",\"fontWeight\",\"setPositiveNumber\",\"subtract\",\"max\",\"boxModelAdjustment\",\"dimension\",\"box\",\"isBorderBox\",\"styles\",\"computedVal\",\"extra\",\"delta\",\"marginDelta\",\"ceil\",\"getWidthOrHeight\",\"valueIsBorderBox\",\"offsetProp\",\"getClientRects\",\"Tween\",\"easing\",\"cssHooks\",\"opacity\",\"animationIterationCount\",\"aspectRatio\",\"borderImageSlice\",\"columnCount\",\"flexGrow\",\"flexShrink\",\"gridArea\",\"gridColumn\",\"gridColumnEnd\",\"gridColumnStart\",\"gridRow\",\"gridRowEnd\",\"gridRowStart\",\"lineHeight\",\"order\",\"orphans\",\"widows\",\"zIndex\",\"zoom\",\"fillOpacity\",\"floodOpacity\",\"stopOpacity\",\"strokeMiterlimit\",\"strokeOpacity\",\"origName\",\"setProperty\",\"isFinite\",\"getBoundingClientRect\",\"scrollboxSizeBuggy\",\"left\",\"margin\",\"padding\",\"border\",\"prefix\",\"suffix\",\"expand\",\"expanded\",\"parts\",\"propHooks\",\"run\",\"percent\",\"eased\",\"duration\",\"pos\",\"step\",\"fx\",\"scrollTop\",\"scrollLeft\",\"linear\",\"p\",\"swing\",\"cos\",\"PI\",\"fxNow\",\"inProgress\",\"opt\",\"rfxtypes\",\"rrun\",\"schedule\",\"hidden\",\"requestAnimationFrame\",\"interval\",\"tick\",\"createFxNow\",\"genFx\",\"includeWidth\",\"createTween\",\"animation\",\"Animation\",\"tweeners\",\"properties\",\"stopped\",\"prefilters\",\"currentTime\",\"startTime\",\"tweens\",\"opts\",\"specialEasing\",\"originalProperties\",\"originalOptions\",\"gotoEnd\",\"propFilter\",\"bind\",\"complete\",\"timer\",\"anim\",\"*\",\"tweener\",\"oldfire\",\"propTween\",\"restoreDisplay\",\"isBox\",\"dataShow\",\"unqueued\",\"overflow\",\"overflowX\",\"overflowY\",\"prefilter\",\"speed\",\"speeds\",\"fadeTo\",\"to\",\"animate\",\"optall\",\"doAnimation\",\"finish\",\"stopQueue\",\"timers\",\"cssFn\",\"slideDown\",\"slideUp\",\"slideToggle\",\"fadeIn\",\"fadeOut\",\"fadeToggle\",\"slow\",\"fast\",\"delay\",\"time\",\"timeout\",\"clearTimeout\",\"checkOn\",\"optSelected\",\"radioValue\",\"boolHook\",\"removeAttr\",\"nType\",\"attrHooks\",\"attrNames\",\"getter\",\"lowercaseName\",\"rfocusable\",\"rclickable\",\"stripAndCollapse\",\"getClass\",\"classesToArray\",\"removeProp\",\"propFix\",\"tabindex\",\"for\",\"class\",\"addClass\",\"classNames\",\"curValue\",\"finalValue\",\"removeClass\",\"toggleClass\",\"stateVal\",\"isValidValue\",\"hasClass\",\"rreturn\",\"valHooks\",\"optionSet\",\"rquery\",\"parseXML\",\"parserErrorElem\",\"DOMParser\",\"parseFromString\",\"rfocusMorph\",\"stopPropagationCallback\",\"onlyHandlers\",\"bubbleType\",\"ontype\",\"lastElement\",\"eventPath\",\"parentWindow\",\"triggerHandler\",\"rbracket\",\"rCRLF\",\"rsubmitterTypes\",\"rsubmittable\",\"buildParams\",\"traditional\",\"param\",\"s\",\"valueOrFunction\",\"encodeURIComponent\",\"serialize\",\"serializeArray\",\"r20\",\"rhash\",\"rantiCache\",\"rheaders\",\"rnoContent\",\"rprotocol\",\"transports\",\"allTypes\",\"originAnchor\",\"addToPrefiltersOrTransports\",\"structure\",\"dataTypeExpression\",\"dataType\",\"dataTypes\",\"inspectPrefiltersOrTransports\",\"jqXHR\",\"inspected\",\"seekingTransport\",\"inspect\",\"prefilterOrFactory\",\"dataTypeOrTransport\",\"ajaxExtend\",\"flatOptions\",\"ajaxSettings\",\"active\",\"lastModified\",\"etag\",\"url\",\"isLocal\",\"protocol\",\"processData\",\"async\",\"contentType\",\"accepts\",\"json\",\"responseFields\",\"converters\",\"* text\",\"text html\",\"text json\",\"text xml\",\"ajaxSetup\",\"settings\",\"ajaxPrefilter\",\"ajaxTransport\",\"ajax\",\"transport\",\"cacheURL\",\"responseHeadersString\",\"responseHeaders\",\"timeoutTimer\",\"urlAnchor\",\"fireGlobals\",\"uncached\",\"callbackContext\",\"globalEventContext\",\"completeDeferred\",\"statusCode\",\"requestHeaders\",\"requestHeadersNames\",\"strAbort\",\"getResponseHeader\",\"getAllResponseHeaders\",\"setRequestHeader\",\"overrideMimeType\",\"mimeType\",\"status\",\"abort\",\"statusText\",\"finalText\",\"crossDomain\",\"host\",\"hasContent\",\"ifModified\",\"headers\",\"beforeSend\",\"success\",\"send\",\"nativeStatusText\",\"responses\",\"isSuccess\",\"response\",\"modified\",\"ct\",\"finalDataType\",\"firstDataType\",\"ajaxHandleResponses\",\"conv2\",\"current\",\"conv\",\"dataFilter\",\"throws\",\"ajaxConvert\",\"getJSON\",\"getScript\",\"text script\",\"wrapAll\",\"firstElementChild\",\"wrapInner\",\"htmlIsFunction\",\"unwrap\",\"visible\",\"xhr\",\"XMLHttpRequest\",\"xhrSuccessStatus\",\"0\",\"1223\",\"xhrSupported\",\"cors\",\"errorCallback\",\"open\",\"username\",\"xhrFields\",\"onload\",\"onerror\",\"onabort\",\"ontimeout\",\"onreadystatechange\",\"responseType\",\"responseText\",\"binary\",\"scriptAttrs\",\"charset\",\"scriptCharset\",\"evt\",\"oldCallbacks\",\"rjsonp\",\"jsonp\",\"jsonpCallback\",\"originalSettings\",\"callbackName\",\"overwritten\",\"responseContainer\",\"jsonProp\",\"createHTMLDocument\",\"implementation\",\"keepScripts\",\"parsed\",\"params\",\"animated\",\"offset\",\"setOffset\",\"curPosition\",\"curLeft\",\"curCSSTop\",\"curTop\",\"curOffset\",\"curCSSLeft\",\"curElem\",\"using\",\"rect\",\"win\",\"pageYOffset\",\"pageXOffset\",\"offsetParent\",\"parentOffset\",\"scrollTo\",\"Height\",\"Width\",\"\",\"defaultExtra\",\"funcName\",\"unbind\",\"delegate\",\"undelegate\",\"hover\",\"fnOver\",\"fnOut\",\"rtrim\",\"proxy\",\"holdReady\",\"hold\",\"parseJSON\",\"isNumeric\",\"isNaN\",\"trim\",\"define\",\"amd\",\"_jQuery\",\"_$\",\"$\",\"noConflict\"],\"mappings\":\"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\",\"file\":\"jquery-3.7.1.min.js\"}"
  },
  {
    "path": "themes/default/public/js/jszip.js",
    "content": "/*!\n\nJSZip v3.2.1 - A JavaScript class for generating and reading zip files\n<http://stuartk.com/jszip>\n\n(c) 2009-2016 Stuart Knightley <stuart [at] stuartk.com>\nDual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip/master/LICENSE.markdown.\n\nJSZip uses the library pako released under the MIT license :\nhttps://github.com/nodeca/pako/blob/master/LICENSE\n*/\n\n(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.JSZip = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){\n'use strict';\nvar utils = require('./utils');\nvar support = require('./support');\n// private property\nvar _keyStr = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\n\n\n// public method for encoding\nexports.encode = function(input) {\n    var output = [];\n    var chr1, chr2, chr3, enc1, enc2, enc3, enc4;\n    var i = 0, len = input.length, remainingBytes = len;\n\n    var isArray = utils.getTypeOf(input) !== \"string\";\n    while (i < input.length) {\n        remainingBytes = len - i;\n\n        if (!isArray) {\n            chr1 = input.charCodeAt(i++);\n            chr2 = i < len ? input.charCodeAt(i++) : 0;\n            chr3 = i < len ? input.charCodeAt(i++) : 0;\n        } else {\n            chr1 = input[i++];\n            chr2 = i < len ? input[i++] : 0;\n            chr3 = i < len ? input[i++] : 0;\n        }\n\n        enc1 = chr1 >> 2;\n        enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);\n        enc3 = remainingBytes > 1 ? (((chr2 & 15) << 2) | (chr3 >> 6)) : 64;\n        enc4 = remainingBytes > 2 ? (chr3 & 63) : 64;\n\n        output.push(_keyStr.charAt(enc1) + _keyStr.charAt(enc2) + _keyStr.charAt(enc3) + _keyStr.charAt(enc4));\n\n    }\n\n    return output.join(\"\");\n};\n\n// public method for decoding\nexports.decode = function(input) {\n    var chr1, chr2, chr3;\n    var enc1, enc2, enc3, enc4;\n    var i = 0, resultIndex = 0;\n\n    var dataUrlPrefix = \"data:\";\n\n    if (input.substr(0, dataUrlPrefix.length) === dataUrlPrefix) {\n        // This is a common error: people give a data url\n        // (data:image/png;base64,iVBOR...) with a {base64: true} and\n        // wonders why things don't work.\n        // We can detect that the string input looks like a data url but we\n        // *can't* be sure it is one: removing everything up to the comma would\n        // be too dangerous.\n        throw new Error(\"Invalid base64 input, it looks like a data url.\");\n    }\n\n    input = input.replace(/[^A-Za-z0-9\\+\\/\\=]/g, \"\");\n\n    var totalLength = input.length * 3 / 4;\n    if(input.charAt(input.length - 1) === _keyStr.charAt(64)) {\n        totalLength--;\n    }\n    if(input.charAt(input.length - 2) === _keyStr.charAt(64)) {\n        totalLength--;\n    }\n    if (totalLength % 1 !== 0) {\n        // totalLength is not an integer, the length does not match a valid\n        // base64 content. That can happen if:\n        // - the input is not a base64 content\n        // - the input is *almost* a base64 content, with a extra chars at the\n        //   beginning or at the end\n        // - the input uses a base64 variant (base64url for example)\n        throw new Error(\"Invalid base64 input, bad content length.\");\n    }\n    var output;\n    if (support.uint8array) {\n        output = new Uint8Array(totalLength|0);\n    } else {\n        output = new Array(totalLength|0);\n    }\n\n    while (i < input.length) {\n\n        enc1 = _keyStr.indexOf(input.charAt(i++));\n        enc2 = _keyStr.indexOf(input.charAt(i++));\n        enc3 = _keyStr.indexOf(input.charAt(i++));\n        enc4 = _keyStr.indexOf(input.charAt(i++));\n\n        chr1 = (enc1 << 2) | (enc2 >> 4);\n        chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);\n        chr3 = ((enc3 & 3) << 6) | enc4;\n\n        output[resultIndex++] = chr1;\n\n        if (enc3 !== 64) {\n            output[resultIndex++] = chr2;\n        }\n        if (enc4 !== 64) {\n            output[resultIndex++] = chr3;\n        }\n\n    }\n\n    return output;\n};\n\n},{\"./support\":30,\"./utils\":32}],2:[function(require,module,exports){\n'use strict';\n\nvar external = require(\"./external\");\nvar DataWorker = require('./stream/DataWorker');\nvar DataLengthProbe = require('./stream/DataLengthProbe');\nvar Crc32Probe = require('./stream/Crc32Probe');\nvar DataLengthProbe = require('./stream/DataLengthProbe');\n\n/**\n * Represent a compressed object, with everything needed to decompress it.\n * @constructor\n * @param {number} compressedSize the size of the data compressed.\n * @param {number} uncompressedSize the size of the data after decompression.\n * @param {number} crc32 the crc32 of the decompressed file.\n * @param {object} compression the type of compression, see lib/compressions.js.\n * @param {String|ArrayBuffer|Uint8Array|Buffer} data the compressed data.\n */\nfunction CompressedObject(compressedSize, uncompressedSize, crc32, compression, data) {\n    this.compressedSize = compressedSize;\n    this.uncompressedSize = uncompressedSize;\n    this.crc32 = crc32;\n    this.compression = compression;\n    this.compressedContent = data;\n}\n\nCompressedObject.prototype = {\n    /**\n     * Create a worker to get the uncompressed content.\n     * @return {GenericWorker} the worker.\n     */\n    getContentWorker : function () {\n        var worker = new DataWorker(external.Promise.resolve(this.compressedContent))\n        .pipe(this.compression.uncompressWorker())\n        .pipe(new DataLengthProbe(\"data_length\"));\n\n        var that = this;\n        worker.on(\"end\", function () {\n            if(this.streamInfo['data_length'] !== that.uncompressedSize) {\n                throw new Error(\"Bug : uncompressed data size mismatch\");\n            }\n        });\n        return worker;\n    },\n    /**\n     * Create a worker to get the compressed content.\n     * @return {GenericWorker} the worker.\n     */\n    getCompressedWorker : function () {\n        return new DataWorker(external.Promise.resolve(this.compressedContent))\n        .withStreamInfo(\"compressedSize\", this.compressedSize)\n        .withStreamInfo(\"uncompressedSize\", this.uncompressedSize)\n        .withStreamInfo(\"crc32\", this.crc32)\n        .withStreamInfo(\"compression\", this.compression)\n        ;\n    }\n};\n\n/**\n * Chain the given worker with other workers to compress the content with the\n * given compresion.\n * @param {GenericWorker} uncompressedWorker the worker to pipe.\n * @param {Object} compression the compression object.\n * @param {Object} compressionOptions the options to use when compressing.\n * @return {GenericWorker} the new worker compressing the content.\n */\nCompressedObject.createWorkerFrom = function (uncompressedWorker, compression, compressionOptions) {\n    return uncompressedWorker\n    .pipe(new Crc32Probe())\n    .pipe(new DataLengthProbe(\"uncompressedSize\"))\n    .pipe(compression.compressWorker(compressionOptions))\n    .pipe(new DataLengthProbe(\"compressedSize\"))\n    .withStreamInfo(\"compression\", compression);\n};\n\nmodule.exports = CompressedObject;\n\n},{\"./external\":6,\"./stream/Crc32Probe\":25,\"./stream/DataLengthProbe\":26,\"./stream/DataWorker\":27}],3:[function(require,module,exports){\n'use strict';\n\nvar GenericWorker = require(\"./stream/GenericWorker\");\n\nexports.STORE = {\n    magic: \"\\x00\\x00\",\n    compressWorker : function (compressionOptions) {\n        return new GenericWorker(\"STORE compression\");\n    },\n    uncompressWorker : function () {\n        return new GenericWorker(\"STORE decompression\");\n    }\n};\nexports.DEFLATE = require('./flate');\n\n},{\"./flate\":7,\"./stream/GenericWorker\":28}],4:[function(require,module,exports){\n'use strict';\n\nvar utils = require('./utils');\n\n/**\n * The following functions come from pako, from pako/lib/zlib/crc32.js\n * released under the MIT license, see pako https://github.com/nodeca/pako/\n */\n\n// Use ordinary array, since untyped makes no boost here\nfunction makeTable() {\n    var c, table = [];\n\n    for(var n =0; n < 256; n++){\n        c = n;\n        for(var k =0; k < 8; k++){\n            c = ((c&1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));\n        }\n        table[n] = c;\n    }\n\n    return table;\n}\n\n// Create table on load. Just 255 signed longs. Not a problem.\nvar crcTable = makeTable();\n\n\nfunction crc32(crc, buf, len, pos) {\n    var t = crcTable, end = pos + len;\n\n    crc = crc ^ (-1);\n\n    for (var i = pos; i < end; i++ ) {\n        crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF];\n    }\n\n    return (crc ^ (-1)); // >>> 0;\n}\n\n// That's all for the pako functions.\n\n/**\n * Compute the crc32 of a string.\n * This is almost the same as the function crc32, but for strings. Using the\n * same function for the two use cases leads to horrible performances.\n * @param {Number} crc the starting value of the crc.\n * @param {String} str the string to use.\n * @param {Number} len the length of the string.\n * @param {Number} pos the starting position for the crc32 computation.\n * @return {Number} the computed crc32.\n */\nfunction crc32str(crc, str, len, pos) {\n    var t = crcTable, end = pos + len;\n\n    crc = crc ^ (-1);\n\n    for (var i = pos; i < end; i++ ) {\n        crc = (crc >>> 8) ^ t[(crc ^ str.charCodeAt(i)) & 0xFF];\n    }\n\n    return (crc ^ (-1)); // >>> 0;\n}\n\nmodule.exports = function crc32wrapper(input, crc) {\n    if (typeof input === \"undefined\" || !input.length) {\n        return 0;\n    }\n\n    var isArray = utils.getTypeOf(input) !== \"string\";\n\n    if(isArray) {\n        return crc32(crc|0, input, input.length, 0);\n    } else {\n        return crc32str(crc|0, input, input.length, 0);\n    }\n};\n\n},{\"./utils\":32}],5:[function(require,module,exports){\n'use strict';\nexports.base64 = false;\nexports.binary = false;\nexports.dir = false;\nexports.createFolders = true;\nexports.date = null;\nexports.compression = null;\nexports.compressionOptions = null;\nexports.comment = null;\nexports.unixPermissions = null;\nexports.dosPermissions = null;\n\n},{}],6:[function(require,module,exports){\n/* global Promise */\n'use strict';\n\n// load the global object first:\n// - it should be better integrated in the system (unhandledRejection in node)\n// - the environment may have a custom Promise implementation (see zone.js)\nvar ES6Promise = null;\nif (typeof Promise !== \"undefined\") {\n    ES6Promise = Promise;\n} else {\n    ES6Promise = require(\"lie\");\n}\n\n/**\n * Let the user use/change some implementations.\n */\nmodule.exports = {\n    Promise: ES6Promise\n};\n\n},{\"lie\":37}],7:[function(require,module,exports){\n'use strict';\nvar USE_TYPEDARRAY = (typeof Uint8Array !== 'undefined') && (typeof Uint16Array !== 'undefined') && (typeof Uint32Array !== 'undefined');\n\nvar pako = require(\"pako\");\nvar utils = require(\"./utils\");\nvar GenericWorker = require(\"./stream/GenericWorker\");\n\nvar ARRAY_TYPE = USE_TYPEDARRAY ? \"uint8array\" : \"array\";\n\nexports.magic = \"\\x08\\x00\";\n\n/**\n * Create a worker that uses pako to inflate/deflate.\n * @constructor\n * @param {String} action the name of the pako function to call : either \"Deflate\" or \"Inflate\".\n * @param {Object} options the options to use when (de)compressing.\n */\nfunction FlateWorker(action, options) {\n    GenericWorker.call(this, \"FlateWorker/\" + action);\n\n    this._pako = null;\n    this._pakoAction = action;\n    this._pakoOptions = options;\n    // the `meta` object from the last chunk received\n    // this allow this worker to pass around metadata\n    this.meta = {};\n}\n\nutils.inherits(FlateWorker, GenericWorker);\n\n/**\n * @see GenericWorker.processChunk\n */\nFlateWorker.prototype.processChunk = function (chunk) {\n    this.meta = chunk.meta;\n    if (this._pako === null) {\n        this._createPako();\n    }\n    this._pako.push(utils.transformTo(ARRAY_TYPE, chunk.data), false);\n};\n\n/**\n * @see GenericWorker.flush\n */\nFlateWorker.prototype.flush = function () {\n    GenericWorker.prototype.flush.call(this);\n    if (this._pako === null) {\n        this._createPako();\n    }\n    this._pako.push([], true);\n};\n/**\n * @see GenericWorker.cleanUp\n */\nFlateWorker.prototype.cleanUp = function () {\n    GenericWorker.prototype.cleanUp.call(this);\n    this._pako = null;\n};\n\n/**\n * Create the _pako object.\n * TODO: lazy-loading this object isn't the best solution but it's the\n * quickest. The best solution is to lazy-load the worker list. See also the\n * issue #446.\n */\nFlateWorker.prototype._createPako = function () {\n    this._pako = new pako[this._pakoAction]({\n        raw: true,\n        level: this._pakoOptions.level || -1 // default compression\n    });\n    var self = this;\n    this._pako.onData = function(data) {\n        self.push({\n            data : data,\n            meta : self.meta\n        });\n    };\n};\n\nexports.compressWorker = function (compressionOptions) {\n    return new FlateWorker(\"Deflate\", compressionOptions);\n};\nexports.uncompressWorker = function () {\n    return new FlateWorker(\"Inflate\", {});\n};\n\n},{\"./stream/GenericWorker\":28,\"./utils\":32,\"pako\":38}],8:[function(require,module,exports){\n'use strict';\n\nvar utils = require('../utils');\nvar GenericWorker = require('../stream/GenericWorker');\nvar utf8 = require('../utf8');\nvar crc32 = require('../crc32');\nvar signature = require('../signature');\n\n/**\n * Transform an integer into a string in hexadecimal.\n * @private\n * @param {number} dec the number to convert.\n * @param {number} bytes the number of bytes to generate.\n * @returns {string} the result.\n */\nvar decToHex = function(dec, bytes) {\n    var hex = \"\", i;\n    for (i = 0; i < bytes; i++) {\n        hex += String.fromCharCode(dec & 0xff);\n        dec = dec >>> 8;\n    }\n    return hex;\n};\n\n/**\n * Generate the UNIX part of the external file attributes.\n * @param {Object} unixPermissions the unix permissions or null.\n * @param {Boolean} isDir true if the entry is a directory, false otherwise.\n * @return {Number} a 32 bit integer.\n *\n * adapted from http://unix.stackexchange.com/questions/14705/the-zip-formats-external-file-attribute :\n *\n * TTTTsstrwxrwxrwx0000000000ADVSHR\n * ^^^^____________________________ file type, see zipinfo.c (UNX_*)\n *     ^^^_________________________ setuid, setgid, sticky\n *        ^^^^^^^^^________________ permissions\n *                 ^^^^^^^^^^______ not used ?\n *                           ^^^^^^ DOS attribute bits : Archive, Directory, Volume label, System file, Hidden, Read only\n */\nvar generateUnixExternalFileAttr = function (unixPermissions, isDir) {\n\n    var result = unixPermissions;\n    if (!unixPermissions) {\n        // I can't use octal values in strict mode, hence the hexa.\n        //  040775 => 0x41fd\n        // 0100664 => 0x81b4\n        result = isDir ? 0x41fd : 0x81b4;\n    }\n    return (result & 0xFFFF) << 16;\n};\n\n/**\n * Generate the DOS part of the external file attributes.\n * @param {Object} dosPermissions the dos permissions or null.\n * @param {Boolean} isDir true if the entry is a directory, false otherwise.\n * @return {Number} a 32 bit integer.\n *\n * Bit 0     Read-Only\n * Bit 1     Hidden\n * Bit 2     System\n * Bit 3     Volume Label\n * Bit 4     Directory\n * Bit 5     Archive\n */\nvar generateDosExternalFileAttr = function (dosPermissions, isDir) {\n\n    // the dir flag is already set for compatibility\n    return (dosPermissions || 0)  & 0x3F;\n};\n\n/**\n * Generate the various parts used in the construction of the final zip file.\n * @param {Object} streamInfo the hash with informations about the compressed file.\n * @param {Boolean} streamedContent is the content streamed ?\n * @param {Boolean} streamingEnded is the stream finished ?\n * @param {number} offset the current offset from the start of the zip file.\n * @param {String} platform let's pretend we are this platform (change platform dependents fields)\n * @param {Function} encodeFileName the function to encode the file name / comment.\n * @return {Object} the zip parts.\n */\nvar generateZipParts = function(streamInfo, streamedContent, streamingEnded, offset, platform, encodeFileName) {\n    var file = streamInfo['file'],\n    compression = streamInfo['compression'],\n    useCustomEncoding = encodeFileName !== utf8.utf8encode,\n    encodedFileName = utils.transformTo(\"string\", encodeFileName(file.name)),\n    utfEncodedFileName = utils.transformTo(\"string\", utf8.utf8encode(file.name)),\n    comment = file.comment,\n    encodedComment = utils.transformTo(\"string\", encodeFileName(comment)),\n    utfEncodedComment = utils.transformTo(\"string\", utf8.utf8encode(comment)),\n    useUTF8ForFileName = utfEncodedFileName.length !== file.name.length,\n    useUTF8ForComment = utfEncodedComment.length !== comment.length,\n    dosTime,\n    dosDate,\n    extraFields = \"\",\n    unicodePathExtraField = \"\",\n    unicodeCommentExtraField = \"\",\n    dir = file.dir,\n    date = file.date;\n\n\n    var dataInfo = {\n        crc32 : 0,\n        compressedSize : 0,\n        uncompressedSize : 0\n    };\n\n    // if the content is streamed, the sizes/crc32 are only available AFTER\n    // the end of the stream.\n    if (!streamedContent || streamingEnded) {\n        dataInfo.crc32 = streamInfo['crc32'];\n        dataInfo.compressedSize = streamInfo['compressedSize'];\n        dataInfo.uncompressedSize = streamInfo['uncompressedSize'];\n    }\n\n    var bitflag = 0;\n    if (streamedContent) {\n        // Bit 3: the sizes/crc32 are set to zero in the local header.\n        // The correct values are put in the data descriptor immediately\n        // following the compressed data.\n        bitflag |= 0x0008;\n    }\n    if (!useCustomEncoding && (useUTF8ForFileName || useUTF8ForComment)) {\n        // Bit 11: Language encoding flag (EFS).\n        bitflag |= 0x0800;\n    }\n\n\n    var extFileAttr = 0;\n    var versionMadeBy = 0;\n    if (dir) {\n        // dos or unix, we set the dos dir flag\n        extFileAttr |= 0x00010;\n    }\n    if(platform === \"UNIX\") {\n        versionMadeBy = 0x031E; // UNIX, version 3.0\n        extFileAttr |= generateUnixExternalFileAttr(file.unixPermissions, dir);\n    } else { // DOS or other, fallback to DOS\n        versionMadeBy = 0x0014; // DOS, version 2.0\n        extFileAttr |= generateDosExternalFileAttr(file.dosPermissions, dir);\n    }\n\n    // date\n    // @see http://www.delorie.com/djgpp/doc/rbinter/it/52/13.html\n    // @see http://www.delorie.com/djgpp/doc/rbinter/it/65/16.html\n    // @see http://www.delorie.com/djgpp/doc/rbinter/it/66/16.html\n\n    dosTime = date.getUTCHours();\n    dosTime = dosTime << 6;\n    dosTime = dosTime | date.getUTCMinutes();\n    dosTime = dosTime << 5;\n    dosTime = dosTime | date.getUTCSeconds() / 2;\n\n    dosDate = date.getUTCFullYear() - 1980;\n    dosDate = dosDate << 4;\n    dosDate = dosDate | (date.getUTCMonth() + 1);\n    dosDate = dosDate << 5;\n    dosDate = dosDate | date.getUTCDate();\n\n    if (useUTF8ForFileName) {\n        // set the unicode path extra field. unzip needs at least one extra\n        // field to correctly handle unicode path, so using the path is as good\n        // as any other information. This could improve the situation with\n        // other archive managers too.\n        // This field is usually used without the utf8 flag, with a non\n        // unicode path in the header (winrar, winzip). This helps (a bit)\n        // with the messy Windows' default compressed folders feature but\n        // breaks on p7zip which doesn't seek the unicode path extra field.\n        // So for now, UTF-8 everywhere !\n        unicodePathExtraField =\n            // Version\n            decToHex(1, 1) +\n            // NameCRC32\n            decToHex(crc32(encodedFileName), 4) +\n            // UnicodeName\n            utfEncodedFileName;\n\n        extraFields +=\n            // Info-ZIP Unicode Path Extra Field\n            \"\\x75\\x70\" +\n            // size\n            decToHex(unicodePathExtraField.length, 2) +\n            // content\n            unicodePathExtraField;\n    }\n\n    if(useUTF8ForComment) {\n\n        unicodeCommentExtraField =\n            // Version\n            decToHex(1, 1) +\n            // CommentCRC32\n            decToHex(crc32(encodedComment), 4) +\n            // UnicodeName\n            utfEncodedComment;\n\n        extraFields +=\n            // Info-ZIP Unicode Path Extra Field\n            \"\\x75\\x63\" +\n            // size\n            decToHex(unicodeCommentExtraField.length, 2) +\n            // content\n            unicodeCommentExtraField;\n    }\n\n    var header = \"\";\n\n    // version needed to extract\n    header += \"\\x0A\\x00\";\n    // general purpose bit flag\n    header += decToHex(bitflag, 2);\n    // compression method\n    header += compression.magic;\n    // last mod file time\n    header += decToHex(dosTime, 2);\n    // last mod file date\n    header += decToHex(dosDate, 2);\n    // crc-32\n    header += decToHex(dataInfo.crc32, 4);\n    // compressed size\n    header += decToHex(dataInfo.compressedSize, 4);\n    // uncompressed size\n    header += decToHex(dataInfo.uncompressedSize, 4);\n    // file name length\n    header += decToHex(encodedFileName.length, 2);\n    // extra field length\n    header += decToHex(extraFields.length, 2);\n\n\n    var fileRecord = signature.LOCAL_FILE_HEADER + header + encodedFileName + extraFields;\n\n    var dirRecord = signature.CENTRAL_FILE_HEADER +\n        // version made by (00: DOS)\n        decToHex(versionMadeBy, 2) +\n        // file header (common to file and central directory)\n        header +\n        // file comment length\n        decToHex(encodedComment.length, 2) +\n        // disk number start\n        \"\\x00\\x00\" +\n        // internal file attributes TODO\n        \"\\x00\\x00\" +\n        // external file attributes\n        decToHex(extFileAttr, 4) +\n        // relative offset of local header\n        decToHex(offset, 4) +\n        // file name\n        encodedFileName +\n        // extra field\n        extraFields +\n        // file comment\n        encodedComment;\n\n    return {\n        fileRecord: fileRecord,\n        dirRecord: dirRecord\n    };\n};\n\n/**\n * Generate the EOCD record.\n * @param {Number} entriesCount the number of entries in the zip file.\n * @param {Number} centralDirLength the length (in bytes) of the central dir.\n * @param {Number} localDirLength the length (in bytes) of the local dir.\n * @param {String} comment the zip file comment as a binary string.\n * @param {Function} encodeFileName the function to encode the comment.\n * @return {String} the EOCD record.\n */\nvar generateCentralDirectoryEnd = function (entriesCount, centralDirLength, localDirLength, comment, encodeFileName) {\n    var dirEnd = \"\";\n    var encodedComment = utils.transformTo(\"string\", encodeFileName(comment));\n\n    // end of central dir signature\n    dirEnd = signature.CENTRAL_DIRECTORY_END +\n        // number of this disk\n        \"\\x00\\x00\" +\n        // number of the disk with the start of the central directory\n        \"\\x00\\x00\" +\n        // total number of entries in the central directory on this disk\n        decToHex(entriesCount, 2) +\n        // total number of entries in the central directory\n        decToHex(entriesCount, 2) +\n        // size of the central directory   4 bytes\n        decToHex(centralDirLength, 4) +\n        // offset of start of central directory with respect to the starting disk number\n        decToHex(localDirLength, 4) +\n        // .ZIP file comment length\n        decToHex(encodedComment.length, 2) +\n        // .ZIP file comment\n        encodedComment;\n\n    return dirEnd;\n};\n\n/**\n * Generate data descriptors for a file entry.\n * @param {Object} streamInfo the hash generated by a worker, containing informations\n * on the file entry.\n * @return {String} the data descriptors.\n */\nvar generateDataDescriptors = function (streamInfo) {\n    var descriptor = \"\";\n    descriptor = signature.DATA_DESCRIPTOR +\n        // crc-32                          4 bytes\n        decToHex(streamInfo['crc32'], 4) +\n        // compressed size                 4 bytes\n        decToHex(streamInfo['compressedSize'], 4) +\n        // uncompressed size               4 bytes\n        decToHex(streamInfo['uncompressedSize'], 4);\n\n    return descriptor;\n};\n\n\n/**\n * A worker to concatenate other workers to create a zip file.\n * @param {Boolean} streamFiles `true` to stream the content of the files,\n * `false` to accumulate it.\n * @param {String} comment the comment to use.\n * @param {String} platform the platform to use, \"UNIX\" or \"DOS\".\n * @param {Function} encodeFileName the function to encode file names and comments.\n */\nfunction ZipFileWorker(streamFiles, comment, platform, encodeFileName) {\n    GenericWorker.call(this, \"ZipFileWorker\");\n    // The number of bytes written so far. This doesn't count accumulated chunks.\n    this.bytesWritten = 0;\n    // The comment of the zip file\n    this.zipComment = comment;\n    // The platform \"generating\" the zip file.\n    this.zipPlatform = platform;\n    // the function to encode file names and comments.\n    this.encodeFileName = encodeFileName;\n    // Should we stream the content of the files ?\n    this.streamFiles = streamFiles;\n    // If `streamFiles` is false, we will need to accumulate the content of the\n    // files to calculate sizes / crc32 (and write them *before* the content).\n    // This boolean indicates if we are accumulating chunks (it will change a lot\n    // during the lifetime of this worker).\n    this.accumulate = false;\n    // The buffer receiving chunks when accumulating content.\n    this.contentBuffer = [];\n    // The list of generated directory records.\n    this.dirRecords = [];\n    // The offset (in bytes) from the beginning of the zip file for the current source.\n    this.currentSourceOffset = 0;\n    // The total number of entries in this zip file.\n    this.entriesCount = 0;\n    // the name of the file currently being added, null when handling the end of the zip file.\n    // Used for the emited metadata.\n    this.currentFile = null;\n\n\n\n    this._sources = [];\n}\nutils.inherits(ZipFileWorker, GenericWorker);\n\n/**\n * @see GenericWorker.push\n */\nZipFileWorker.prototype.push = function (chunk) {\n\n    var currentFilePercent = chunk.meta.percent || 0;\n    var entriesCount = this.entriesCount;\n    var remainingFiles = this._sources.length;\n\n    if(this.accumulate) {\n        this.contentBuffer.push(chunk);\n    } else {\n        this.bytesWritten += chunk.data.length;\n\n        GenericWorker.prototype.push.call(this, {\n            data : chunk.data,\n            meta : {\n                currentFile : this.currentFile,\n                percent : entriesCount ? (currentFilePercent + 100 * (entriesCount - remainingFiles - 1)) / entriesCount : 100\n            }\n        });\n    }\n};\n\n/**\n * The worker started a new source (an other worker).\n * @param {Object} streamInfo the streamInfo object from the new source.\n */\nZipFileWorker.prototype.openedSource = function (streamInfo) {\n    this.currentSourceOffset = this.bytesWritten;\n    this.currentFile = streamInfo['file'].name;\n\n    var streamedContent = this.streamFiles && !streamInfo['file'].dir;\n\n    // don't stream folders (because they don't have any content)\n    if(streamedContent) {\n        var record = generateZipParts(streamInfo, streamedContent, false, this.currentSourceOffset, this.zipPlatform, this.encodeFileName);\n        this.push({\n            data : record.fileRecord,\n            meta : {percent:0}\n        });\n    } else {\n        // we need to wait for the whole file before pushing anything\n        this.accumulate = true;\n    }\n};\n\n/**\n * The worker finished a source (an other worker).\n * @param {Object} streamInfo the streamInfo object from the finished source.\n */\nZipFileWorker.prototype.closedSource = function (streamInfo) {\n    this.accumulate = false;\n    var streamedContent = this.streamFiles && !streamInfo['file'].dir;\n    var record = generateZipParts(streamInfo, streamedContent, true, this.currentSourceOffset, this.zipPlatform, this.encodeFileName);\n\n    this.dirRecords.push(record.dirRecord);\n    if(streamedContent) {\n        // after the streamed file, we put data descriptors\n        this.push({\n            data : generateDataDescriptors(streamInfo),\n            meta : {percent:100}\n        });\n    } else {\n        // the content wasn't streamed, we need to push everything now\n        // first the file record, then the content\n        this.push({\n            data : record.fileRecord,\n            meta : {percent:0}\n        });\n        while(this.contentBuffer.length) {\n            this.push(this.contentBuffer.shift());\n        }\n    }\n    this.currentFile = null;\n};\n\n/**\n * @see GenericWorker.flush\n */\nZipFileWorker.prototype.flush = function () {\n\n    var localDirLength = this.bytesWritten;\n    for(var i = 0; i < this.dirRecords.length; i++) {\n        this.push({\n            data : this.dirRecords[i],\n            meta : {percent:100}\n        });\n    }\n    var centralDirLength = this.bytesWritten - localDirLength;\n\n    var dirEnd = generateCentralDirectoryEnd(this.dirRecords.length, centralDirLength, localDirLength, this.zipComment, this.encodeFileName);\n\n    this.push({\n        data : dirEnd,\n        meta : {percent:100}\n    });\n};\n\n/**\n * Prepare the next source to be read.\n */\nZipFileWorker.prototype.prepareNextSource = function () {\n    this.previous = this._sources.shift();\n    this.openedSource(this.previous.streamInfo);\n    if (this.isPaused) {\n        this.previous.pause();\n    } else {\n        this.previous.resume();\n    }\n};\n\n/**\n * @see GenericWorker.registerPrevious\n */\nZipFileWorker.prototype.registerPrevious = function (previous) {\n    this._sources.push(previous);\n    var self = this;\n\n    previous.on('data', function (chunk) {\n        self.processChunk(chunk);\n    });\n    previous.on('end', function () {\n        self.closedSource(self.previous.streamInfo);\n        if(self._sources.length) {\n            self.prepareNextSource();\n        } else {\n            self.end();\n        }\n    });\n    previous.on('error', function (e) {\n        self.error(e);\n    });\n    return this;\n};\n\n/**\n * @see GenericWorker.resume\n */\nZipFileWorker.prototype.resume = function () {\n    if(!GenericWorker.prototype.resume.call(this)) {\n        return false;\n    }\n\n    if (!this.previous && this._sources.length) {\n        this.prepareNextSource();\n        return true;\n    }\n    if (!this.previous && !this._sources.length && !this.generatedError) {\n        this.end();\n        return true;\n    }\n};\n\n/**\n * @see GenericWorker.error\n */\nZipFileWorker.prototype.error = function (e) {\n    var sources = this._sources;\n    if(!GenericWorker.prototype.error.call(this, e)) {\n        return false;\n    }\n    for(var i = 0; i < sources.length; i++) {\n        try {\n            sources[i].error(e);\n        } catch(e) {\n            // the `error` exploded, nothing to do\n        }\n    }\n    return true;\n};\n\n/**\n * @see GenericWorker.lock\n */\nZipFileWorker.prototype.lock = function () {\n    GenericWorker.prototype.lock.call(this);\n    var sources = this._sources;\n    for(var i = 0; i < sources.length; i++) {\n        sources[i].lock();\n    }\n};\n\nmodule.exports = ZipFileWorker;\n\n},{\"../crc32\":4,\"../signature\":23,\"../stream/GenericWorker\":28,\"../utf8\":31,\"../utils\":32}],9:[function(require,module,exports){\n'use strict';\n\nvar compressions = require('../compressions');\nvar ZipFileWorker = require('./ZipFileWorker');\n\n/**\n * Find the compression to use.\n * @param {String} fileCompression the compression defined at the file level, if any.\n * @param {String} zipCompression the compression defined at the load() level.\n * @return {Object} the compression object to use.\n */\nvar getCompression = function (fileCompression, zipCompression) {\n\n    var compressionName = fileCompression || zipCompression;\n    var compression = compressions[compressionName];\n    if (!compression) {\n        throw new Error(compressionName + \" is not a valid compression method !\");\n    }\n    return compression;\n};\n\n/**\n * Create a worker to generate a zip file.\n * @param {JSZip} zip the JSZip instance at the right root level.\n * @param {Object} options to generate the zip file.\n * @param {String} comment the comment to use.\n */\nexports.generateWorker = function (zip, options, comment) {\n\n    var zipFileWorker = new ZipFileWorker(options.streamFiles, comment, options.platform, options.encodeFileName);\n    var entriesCount = 0;\n    try {\n\n        zip.forEach(function (relativePath, file) {\n            entriesCount++;\n            var compression = getCompression(file.options.compression, options.compression);\n            var compressionOptions = file.options.compressionOptions || options.compressionOptions || {};\n            var dir = file.dir, date = file.date;\n\n            file._compressWorker(compression, compressionOptions)\n            .withStreamInfo(\"file\", {\n                name : relativePath,\n                dir : dir,\n                date : date,\n                comment : file.comment || \"\",\n                unixPermissions : file.unixPermissions,\n                dosPermissions : file.dosPermissions\n            })\n            .pipe(zipFileWorker);\n        });\n        zipFileWorker.entriesCount = entriesCount;\n    } catch (e) {\n        zipFileWorker.error(e);\n    }\n\n    return zipFileWorker;\n};\n\n},{\"../compressions\":3,\"./ZipFileWorker\":8}],10:[function(require,module,exports){\n'use strict';\n\n/**\n * Representation a of zip file in js\n * @constructor\n */\nfunction JSZip() {\n    // if this constructor is used without `new`, it adds `new` before itself:\n    if(!(this instanceof JSZip)) {\n        return new JSZip();\n    }\n\n    if(arguments.length) {\n        throw new Error(\"The constructor with parameters has been removed in JSZip 3.0, please check the upgrade guide.\");\n    }\n\n    // object containing the files :\n    // {\n    //   \"folder/\" : {...},\n    //   \"folder/data.txt\" : {...}\n    // }\n    this.files = {};\n\n    this.comment = null;\n\n    // Where we are in the hierarchy\n    this.root = \"\";\n    this.clone = function() {\n        var newObj = new JSZip();\n        for (var i in this) {\n            if (typeof this[i] !== \"function\") {\n                newObj[i] = this[i];\n            }\n        }\n        return newObj;\n    };\n}\nJSZip.prototype = require('./object');\nJSZip.prototype.loadAsync = require('./load');\nJSZip.support = require('./support');\nJSZip.defaults = require('./defaults');\n\n// TODO find a better way to handle this version,\n// a require('package.json').version doesn't work with webpack, see #327\nJSZip.version = \"3.2.0\";\n\nJSZip.loadAsync = function (content, options) {\n    return new JSZip().loadAsync(content, options);\n};\n\nJSZip.external = require(\"./external\");\nmodule.exports = JSZip;\n\n},{\"./defaults\":5,\"./external\":6,\"./load\":11,\"./object\":15,\"./support\":30}],11:[function(require,module,exports){\n'use strict';\nvar utils = require('./utils');\nvar external = require(\"./external\");\nvar utf8 = require('./utf8');\nvar utils = require('./utils');\nvar ZipEntries = require('./zipEntries');\nvar Crc32Probe = require('./stream/Crc32Probe');\nvar nodejsUtils = require(\"./nodejsUtils\");\n\n/**\n * Check the CRC32 of an entry.\n * @param {ZipEntry} zipEntry the zip entry to check.\n * @return {Promise} the result.\n */\nfunction checkEntryCRC32(zipEntry) {\n    return new external.Promise(function (resolve, reject) {\n        var worker = zipEntry.decompressed.getContentWorker().pipe(new Crc32Probe());\n        worker.on(\"error\", function (e) {\n            reject(e);\n        })\n        .on(\"end\", function () {\n            if (worker.streamInfo.crc32 !== zipEntry.decompressed.crc32) {\n                reject(new Error(\"Corrupted zip : CRC32 mismatch\"));\n            } else {\n                resolve();\n            }\n        })\n        .resume();\n    });\n}\n\nmodule.exports = function(data, options) {\n    var zip = this;\n    options = utils.extend(options || {}, {\n        base64: false,\n        checkCRC32: false,\n        optimizedBinaryString: false,\n        createFolders: false,\n        decodeFileName: utf8.utf8decode\n    });\n\n    if (nodejsUtils.isNode && nodejsUtils.isStream(data)) {\n        return external.Promise.reject(new Error(\"JSZip can't accept a stream when loading a zip file.\"));\n    }\n\n    return utils.prepareContent(\"the loaded zip file\", data, true, options.optimizedBinaryString, options.base64)\n    .then(function(data) {\n        var zipEntries = new ZipEntries(options);\n        zipEntries.load(data);\n        return zipEntries;\n    }).then(function checkCRC32(zipEntries) {\n        var promises = [external.Promise.resolve(zipEntries)];\n        var files = zipEntries.files;\n        if (options.checkCRC32) {\n            for (var i = 0; i < files.length; i++) {\n                promises.push(checkEntryCRC32(files[i]));\n            }\n        }\n        return external.Promise.all(promises);\n    }).then(function addFiles(results) {\n        var zipEntries = results.shift();\n        var files = zipEntries.files;\n        for (var i = 0; i < files.length; i++) {\n            var input = files[i];\n            zip.file(input.fileNameStr, input.decompressed, {\n                binary: true,\n                optimizedBinaryString: true,\n                date: input.date,\n                dir: input.dir,\n                comment : input.fileCommentStr.length ? input.fileCommentStr : null,\n                unixPermissions : input.unixPermissions,\n                dosPermissions : input.dosPermissions,\n                createFolders: options.createFolders\n            });\n        }\n        if (zipEntries.zipComment.length) {\n            zip.comment = zipEntries.zipComment;\n        }\n\n        return zip;\n    });\n};\n\n},{\"./external\":6,\"./nodejsUtils\":14,\"./stream/Crc32Probe\":25,\"./utf8\":31,\"./utils\":32,\"./zipEntries\":33}],12:[function(require,module,exports){\n\"use strict\";\n\nvar utils = require('../utils');\nvar GenericWorker = require('../stream/GenericWorker');\n\n/**\n * A worker that use a nodejs stream as source.\n * @constructor\n * @param {String} filename the name of the file entry for this stream.\n * @param {Readable} stream the nodejs stream.\n */\nfunction NodejsStreamInputAdapter(filename, stream) {\n    GenericWorker.call(this, \"Nodejs stream input adapter for \" + filename);\n    this._upstreamEnded = false;\n    this._bindStream(stream);\n}\n\nutils.inherits(NodejsStreamInputAdapter, GenericWorker);\n\n/**\n * Prepare the stream and bind the callbacks on it.\n * Do this ASAP on node 0.10 ! A lazy binding doesn't always work.\n * @param {Stream} stream the nodejs stream to use.\n */\nNodejsStreamInputAdapter.prototype._bindStream = function (stream) {\n    var self = this;\n    this._stream = stream;\n    stream.pause();\n    stream\n    .on(\"data\", function (chunk) {\n        self.push({\n            data: chunk,\n            meta : {\n                percent : 0\n            }\n        });\n    })\n    .on(\"error\", function (e) {\n        if(self.isPaused) {\n            this.generatedError = e;\n        } else {\n            self.error(e);\n        }\n    })\n    .on(\"end\", function () {\n        if(self.isPaused) {\n            self._upstreamEnded = true;\n        } else {\n            self.end();\n        }\n    });\n};\nNodejsStreamInputAdapter.prototype.pause = function () {\n    if(!GenericWorker.prototype.pause.call(this)) {\n        return false;\n    }\n    this._stream.pause();\n    return true;\n};\nNodejsStreamInputAdapter.prototype.resume = function () {\n    if(!GenericWorker.prototype.resume.call(this)) {\n        return false;\n    }\n\n    if(this._upstreamEnded) {\n        this.end();\n    } else {\n        this._stream.resume();\n    }\n\n    return true;\n};\n\nmodule.exports = NodejsStreamInputAdapter;\n\n},{\"../stream/GenericWorker\":28,\"../utils\":32}],13:[function(require,module,exports){\n'use strict';\n\nvar Readable = require('readable-stream').Readable;\n\nvar utils = require('../utils');\nutils.inherits(NodejsStreamOutputAdapter, Readable);\n\n/**\n* A nodejs stream using a worker as source.\n* @see the SourceWrapper in http://nodejs.org/api/stream.html\n* @constructor\n* @param {StreamHelper} helper the helper wrapping the worker\n* @param {Object} options the nodejs stream options\n* @param {Function} updateCb the update callback.\n*/\nfunction NodejsStreamOutputAdapter(helper, options, updateCb) {\n    Readable.call(this, options);\n    this._helper = helper;\n\n    var self = this;\n    helper.on(\"data\", function (data, meta) {\n        if (!self.push(data)) {\n            self._helper.pause();\n        }\n        if(updateCb) {\n            updateCb(meta);\n        }\n    })\n    .on(\"error\", function(e) {\n        self.emit('error', e);\n    })\n    .on(\"end\", function () {\n        self.push(null);\n    });\n}\n\n\nNodejsStreamOutputAdapter.prototype._read = function() {\n    this._helper.resume();\n};\n\nmodule.exports = NodejsStreamOutputAdapter;\n\n},{\"../utils\":32,\"readable-stream\":16}],14:[function(require,module,exports){\n'use strict';\n\nmodule.exports = {\n    /**\n     * True if this is running in Nodejs, will be undefined in a browser.\n     * In a browser, browserify won't include this file and the whole module\n     * will be resolved an empty object.\n     */\n    isNode : typeof Buffer !== \"undefined\",\n    /**\n     * Create a new nodejs Buffer from an existing content.\n     * @param {Object} data the data to pass to the constructor.\n     * @param {String} encoding the encoding to use.\n     * @return {Buffer} a new Buffer.\n     */\n    newBufferFrom: function(data, encoding) {\n        if (Buffer.from && Buffer.from !== Uint8Array.from) {\n            return Buffer.from(data, encoding);\n        } else {\n            if (typeof data === \"number\") {\n                // Safeguard for old Node.js versions. On newer versions,\n                // Buffer.from(number) / Buffer(number, encoding) already throw.\n                throw new Error(\"The \\\"data\\\" argument must not be a number\");\n            }\n            return new Buffer(data, encoding);\n        }\n    },\n    /**\n     * Create a new nodejs Buffer with the specified size.\n     * @param {Integer} size the size of the buffer.\n     * @return {Buffer} a new Buffer.\n     */\n    allocBuffer: function (size) {\n        if (Buffer.alloc) {\n            return Buffer.alloc(size);\n        } else {\n            var buf = new Buffer(size);\n            buf.fill(0);\n            return buf;\n        }\n    },\n    /**\n     * Find out if an object is a Buffer.\n     * @param {Object} b the object to test.\n     * @return {Boolean} true if the object is a Buffer, false otherwise.\n     */\n    isBuffer : function(b){\n        return Buffer.isBuffer(b);\n    },\n\n    isStream : function (obj) {\n        return obj &&\n            typeof obj.on === \"function\" &&\n            typeof obj.pause === \"function\" &&\n            typeof obj.resume === \"function\";\n    }\n};\n\n},{}],15:[function(require,module,exports){\n'use strict';\nvar utf8 = require('./utf8');\nvar utils = require('./utils');\nvar GenericWorker = require('./stream/GenericWorker');\nvar StreamHelper = require('./stream/StreamHelper');\nvar defaults = require('./defaults');\nvar CompressedObject = require('./compressedObject');\nvar ZipObject = require('./zipObject');\nvar generate = require(\"./generate\");\nvar nodejsUtils = require(\"./nodejsUtils\");\nvar NodejsStreamInputAdapter = require(\"./nodejs/NodejsStreamInputAdapter\");\n\n\n/**\n * Add a file in the current folder.\n * @private\n * @param {string} name the name of the file\n * @param {String|ArrayBuffer|Uint8Array|Buffer} data the data of the file\n * @param {Object} originalOptions the options of the file\n * @return {Object} the new file.\n */\nvar fileAdd = function(name, data, originalOptions) {\n    // be sure sub folders exist\n    var dataType = utils.getTypeOf(data),\n        parent;\n\n\n    /*\n     * Correct options.\n     */\n\n    var o = utils.extend(originalOptions || {}, defaults);\n    o.date = o.date || new Date();\n    if (o.compression !== null) {\n        o.compression = o.compression.toUpperCase();\n    }\n\n    if (typeof o.unixPermissions === \"string\") {\n        o.unixPermissions = parseInt(o.unixPermissions, 8);\n    }\n\n    // UNX_IFDIR  0040000 see zipinfo.c\n    if (o.unixPermissions && (o.unixPermissions & 0x4000)) {\n        o.dir = true;\n    }\n    // Bit 4    Directory\n    if (o.dosPermissions && (o.dosPermissions & 0x0010)) {\n        o.dir = true;\n    }\n\n    if (o.dir) {\n        name = forceTrailingSlash(name);\n    }\n    if (o.createFolders && (parent = parentFolder(name))) {\n        folderAdd.call(this, parent, true);\n    }\n\n    var isUnicodeString = dataType === \"string\" && o.binary === false && o.base64 === false;\n    if (!originalOptions || typeof originalOptions.binary === \"undefined\") {\n        o.binary = !isUnicodeString;\n    }\n\n\n    var isCompressedEmpty = (data instanceof CompressedObject) && data.uncompressedSize === 0;\n\n    if (isCompressedEmpty || o.dir || !data || data.length === 0) {\n        o.base64 = false;\n        o.binary = true;\n        data = \"\";\n        o.compression = \"STORE\";\n        dataType = \"string\";\n    }\n\n    /*\n     * Convert content to fit.\n     */\n\n    var zipObjectContent = null;\n    if (data instanceof CompressedObject || data instanceof GenericWorker) {\n        zipObjectContent = data;\n    } else if (nodejsUtils.isNode && nodejsUtils.isStream(data)) {\n        zipObjectContent = new NodejsStreamInputAdapter(name, data);\n    } else {\n        zipObjectContent = utils.prepareContent(name, data, o.binary, o.optimizedBinaryString, o.base64);\n    }\n\n    var object = new ZipObject(name, zipObjectContent, o);\n    this.files[name] = object;\n    /*\n    TODO: we can't throw an exception because we have async promises\n    (we can have a promise of a Date() for example) but returning a\n    promise is useless because file(name, data) returns the JSZip\n    object for chaining. Should we break that to allow the user\n    to catch the error ?\n\n    return external.Promise.resolve(zipObjectContent)\n    .then(function () {\n        return object;\n    });\n    */\n};\n\n/**\n * Find the parent folder of the path.\n * @private\n * @param {string} path the path to use\n * @return {string} the parent folder, or \"\"\n */\nvar parentFolder = function (path) {\n    if (path.slice(-1) === '/') {\n        path = path.substring(0, path.length - 1);\n    }\n    var lastSlash = path.lastIndexOf('/');\n    return (lastSlash > 0) ? path.substring(0, lastSlash) : \"\";\n};\n\n/**\n * Returns the path with a slash at the end.\n * @private\n * @param {String} path the path to check.\n * @return {String} the path with a trailing slash.\n */\nvar forceTrailingSlash = function(path) {\n    // Check the name ends with a /\n    if (path.slice(-1) !== \"/\") {\n        path += \"/\"; // IE doesn't like substr(-1)\n    }\n    return path;\n};\n\n/**\n * Add a (sub) folder in the current folder.\n * @private\n * @param {string} name the folder's name\n * @param {boolean=} [createFolders] If true, automatically create sub\n *  folders. Defaults to false.\n * @return {Object} the new folder.\n */\nvar folderAdd = function(name, createFolders) {\n    createFolders = (typeof createFolders !== 'undefined') ? createFolders : defaults.createFolders;\n\n    name = forceTrailingSlash(name);\n\n    // Does this folder already exist?\n    if (!this.files[name]) {\n        fileAdd.call(this, name, null, {\n            dir: true,\n            createFolders: createFolders\n        });\n    }\n    return this.files[name];\n};\n\n/**\n* Cross-window, cross-Node-context regular expression detection\n* @param  {Object}  object Anything\n* @return {Boolean}        true if the object is a regular expression,\n* false otherwise\n*/\nfunction isRegExp(object) {\n    return Object.prototype.toString.call(object) === \"[object RegExp]\";\n}\n\n// return the actual prototype of JSZip\nvar out = {\n    /**\n     * @see loadAsync\n     */\n    load: function() {\n        throw new Error(\"This method has been removed in JSZip 3.0, please check the upgrade guide.\");\n    },\n\n\n    /**\n     * Call a callback function for each entry at this folder level.\n     * @param {Function} cb the callback function:\n     * function (relativePath, file) {...}\n     * It takes 2 arguments : the relative path and the file.\n     */\n    forEach: function(cb) {\n        var filename, relativePath, file;\n        for (filename in this.files) {\n            if (!this.files.hasOwnProperty(filename)) {\n                continue;\n            }\n            file = this.files[filename];\n            relativePath = filename.slice(this.root.length, filename.length);\n            if (relativePath && filename.slice(0, this.root.length) === this.root) { // the file is in the current root\n                cb(relativePath, file); // TODO reverse the parameters ? need to be clean AND consistent with the filter search fn...\n            }\n        }\n    },\n\n    /**\n     * Filter nested files/folders with the specified function.\n     * @param {Function} search the predicate to use :\n     * function (relativePath, file) {...}\n     * It takes 2 arguments : the relative path and the file.\n     * @return {Array} An array of matching elements.\n     */\n    filter: function(search) {\n        var result = [];\n        this.forEach(function (relativePath, entry) {\n            if (search(relativePath, entry)) { // the file matches the function\n                result.push(entry);\n            }\n\n        });\n        return result;\n    },\n\n    /**\n     * Add a file to the zip file, or search a file.\n     * @param   {string|RegExp} name The name of the file to add (if data is defined),\n     * the name of the file to find (if no data) or a regex to match files.\n     * @param   {String|ArrayBuffer|Uint8Array|Buffer} data  The file data, either raw or base64 encoded\n     * @param   {Object} o     File options\n     * @return  {JSZip|Object|Array} this JSZip object (when adding a file),\n     * a file (when searching by string) or an array of files (when searching by regex).\n     */\n    file: function(name, data, o) {\n        if (arguments.length === 1) {\n            if (isRegExp(name)) {\n                var regexp = name;\n                return this.filter(function(relativePath, file) {\n                    return !file.dir && regexp.test(relativePath);\n                });\n            }\n            else { // text\n                var obj = this.files[this.root + name];\n                if (obj && !obj.dir) {\n                    return obj;\n                } else {\n                    return null;\n                }\n            }\n        }\n        else { // more than one argument : we have data !\n            name = this.root + name;\n            fileAdd.call(this, name, data, o);\n        }\n        return this;\n    },\n\n    /**\n     * Add a directory to the zip file, or search.\n     * @param   {String|RegExp} arg The name of the directory to add, or a regex to search folders.\n     * @return  {JSZip} an object with the new directory as the root, or an array containing matching folders.\n     */\n    folder: function(arg) {\n        if (!arg) {\n            return this;\n        }\n\n        if (isRegExp(arg)) {\n            return this.filter(function(relativePath, file) {\n                return file.dir && arg.test(relativePath);\n            });\n        }\n\n        // else, name is a new folder\n        var name = this.root + arg;\n        var newFolder = folderAdd.call(this, name);\n\n        // Allow chaining by returning a new object with this folder as the root\n        var ret = this.clone();\n        ret.root = newFolder.name;\n        return ret;\n    },\n\n    /**\n     * Delete a file, or a directory and all sub-files, from the zip\n     * @param {string} name the name of the file to delete\n     * @return {JSZip} this JSZip object\n     */\n    remove: function(name) {\n        name = this.root + name;\n        var file = this.files[name];\n        if (!file) {\n            // Look for any folders\n            if (name.slice(-1) !== \"/\") {\n                name += \"/\";\n            }\n            file = this.files[name];\n        }\n\n        if (file && !file.dir) {\n            // file\n            delete this.files[name];\n        } else {\n            // maybe a folder, delete recursively\n            var kids = this.filter(function(relativePath, file) {\n                return file.name.slice(0, name.length) === name;\n            });\n            for (var i = 0; i < kids.length; i++) {\n                delete this.files[kids[i].name];\n            }\n        }\n\n        return this;\n    },\n\n    /**\n     * Generate the complete zip file\n     * @param {Object} options the options to generate the zip file :\n     * - compression, \"STORE\" by default.\n     * - type, \"base64\" by default. Values are : string, base64, uint8array, arraybuffer, blob.\n     * @return {String|Uint8Array|ArrayBuffer|Buffer|Blob} the zip file\n     */\n    generate: function(options) {\n        throw new Error(\"This method has been removed in JSZip 3.0, please check the upgrade guide.\");\n    },\n\n    /**\n     * Generate the complete zip file as an internal stream.\n     * @param {Object} options the options to generate the zip file :\n     * - compression, \"STORE\" by default.\n     * - type, \"base64\" by default. Values are : string, base64, uint8array, arraybuffer, blob.\n     * @return {StreamHelper} the streamed zip file.\n     */\n    generateInternalStream: function(options) {\n      var worker, opts = {};\n      try {\n          opts = utils.extend(options || {}, {\n              streamFiles: false,\n              compression: \"STORE\",\n              compressionOptions : null,\n              type: \"\",\n              platform: \"DOS\",\n              comment: null,\n              mimeType: 'application/zip',\n              encodeFileName: utf8.utf8encode\n          });\n\n          opts.type = opts.type.toLowerCase();\n          opts.compression = opts.compression.toUpperCase();\n\n          // \"binarystring\" is prefered but the internals use \"string\".\n          if(opts.type === \"binarystring\") {\n            opts.type = \"string\";\n          }\n\n          if (!opts.type) {\n            throw new Error(\"No output type specified.\");\n          }\n\n          utils.checkSupport(opts.type);\n\n          // accept nodejs `process.platform`\n          if(\n              opts.platform === 'darwin' ||\n              opts.platform === 'freebsd' ||\n              opts.platform === 'linux' ||\n              opts.platform === 'sunos'\n          ) {\n              opts.platform = \"UNIX\";\n          }\n          if (opts.platform === 'win32') {\n              opts.platform = \"DOS\";\n          }\n\n          var comment = opts.comment || this.comment || \"\";\n          worker = generate.generateWorker(this, opts, comment);\n      } catch (e) {\n        worker = new GenericWorker(\"error\");\n        worker.error(e);\n      }\n      return new StreamHelper(worker, opts.type || \"string\", opts.mimeType);\n    },\n    /**\n     * Generate the complete zip file asynchronously.\n     * @see generateInternalStream\n     */\n    generateAsync: function(options, onUpdate) {\n        return this.generateInternalStream(options).accumulate(onUpdate);\n    },\n    /**\n     * Generate the complete zip file asynchronously.\n     * @see generateInternalStream\n     */\n    generateNodeStream: function(options, onUpdate) {\n        options = options || {};\n        if (!options.type) {\n            options.type = \"nodebuffer\";\n        }\n        return this.generateInternalStream(options).toNodejsStream(onUpdate);\n    }\n};\nmodule.exports = out;\n\n},{\"./compressedObject\":2,\"./defaults\":5,\"./generate\":9,\"./nodejs/NodejsStreamInputAdapter\":12,\"./nodejsUtils\":14,\"./stream/GenericWorker\":28,\"./stream/StreamHelper\":29,\"./utf8\":31,\"./utils\":32,\"./zipObject\":35}],16:[function(require,module,exports){\n/*\n * This file is used by module bundlers (browserify/webpack/etc) when\n * including a stream implementation. We use \"readable-stream\" to get a\n * consistent behavior between nodejs versions but bundlers often have a shim\n * for \"stream\". Using this shim greatly improve the compatibility and greatly\n * reduce the final size of the bundle (only one stream implementation, not\n * two).\n */\nmodule.exports = require(\"stream\");\n\n},{\"stream\":undefined}],17:[function(require,module,exports){\n'use strict';\nvar DataReader = require('./DataReader');\nvar utils = require('../utils');\n\nfunction ArrayReader(data) {\n    DataReader.call(this, data);\n\tfor(var i = 0; i < this.data.length; i++) {\n\t\tdata[i] = data[i] & 0xFF;\n\t}\n}\nutils.inherits(ArrayReader, DataReader);\n/**\n * @see DataReader.byteAt\n */\nArrayReader.prototype.byteAt = function(i) {\n    return this.data[this.zero + i];\n};\n/**\n * @see DataReader.lastIndexOfSignature\n */\nArrayReader.prototype.lastIndexOfSignature = function(sig) {\n    var sig0 = sig.charCodeAt(0),\n        sig1 = sig.charCodeAt(1),\n        sig2 = sig.charCodeAt(2),\n        sig3 = sig.charCodeAt(3);\n    for (var i = this.length - 4; i >= 0; --i) {\n        if (this.data[i] === sig0 && this.data[i + 1] === sig1 && this.data[i + 2] === sig2 && this.data[i + 3] === sig3) {\n            return i - this.zero;\n        }\n    }\n\n    return -1;\n};\n/**\n * @see DataReader.readAndCheckSignature\n */\nArrayReader.prototype.readAndCheckSignature = function (sig) {\n    var sig0 = sig.charCodeAt(0),\n        sig1 = sig.charCodeAt(1),\n        sig2 = sig.charCodeAt(2),\n        sig3 = sig.charCodeAt(3),\n        data = this.readData(4);\n    return sig0 === data[0] && sig1 === data[1] && sig2 === data[2] && sig3 === data[3];\n};\n/**\n * @see DataReader.readData\n */\nArrayReader.prototype.readData = function(size) {\n    this.checkOffset(size);\n    if(size === 0) {\n        return [];\n    }\n    var result = this.data.slice(this.zero + this.index, this.zero + this.index + size);\n    this.index += size;\n    return result;\n};\nmodule.exports = ArrayReader;\n\n},{\"../utils\":32,\"./DataReader\":18}],18:[function(require,module,exports){\n'use strict';\nvar utils = require('../utils');\n\nfunction DataReader(data) {\n    this.data = data; // type : see implementation\n    this.length = data.length;\n    this.index = 0;\n    this.zero = 0;\n}\nDataReader.prototype = {\n    /**\n     * Check that the offset will not go too far.\n     * @param {string} offset the additional offset to check.\n     * @throws {Error} an Error if the offset is out of bounds.\n     */\n    checkOffset: function(offset) {\n        this.checkIndex(this.index + offset);\n    },\n    /**\n     * Check that the specified index will not be too far.\n     * @param {string} newIndex the index to check.\n     * @throws {Error} an Error if the index is out of bounds.\n     */\n    checkIndex: function(newIndex) {\n        if (this.length < this.zero + newIndex || newIndex < 0) {\n            throw new Error(\"End of data reached (data length = \" + this.length + \", asked index = \" + (newIndex) + \"). Corrupted zip ?\");\n        }\n    },\n    /**\n     * Change the index.\n     * @param {number} newIndex The new index.\n     * @throws {Error} if the new index is out of the data.\n     */\n    setIndex: function(newIndex) {\n        this.checkIndex(newIndex);\n        this.index = newIndex;\n    },\n    /**\n     * Skip the next n bytes.\n     * @param {number} n the number of bytes to skip.\n     * @throws {Error} if the new index is out of the data.\n     */\n    skip: function(n) {\n        this.setIndex(this.index + n);\n    },\n    /**\n     * Get the byte at the specified index.\n     * @param {number} i the index to use.\n     * @return {number} a byte.\n     */\n    byteAt: function(i) {\n        // see implementations\n    },\n    /**\n     * Get the next number with a given byte size.\n     * @param {number} size the number of bytes to read.\n     * @return {number} the corresponding number.\n     */\n    readInt: function(size) {\n        var result = 0,\n            i;\n        this.checkOffset(size);\n        for (i = this.index + size - 1; i >= this.index; i--) {\n            result = (result << 8) + this.byteAt(i);\n        }\n        this.index += size;\n        return result;\n    },\n    /**\n     * Get the next string with a given byte size.\n     * @param {number} size the number of bytes to read.\n     * @return {string} the corresponding string.\n     */\n    readString: function(size) {\n        return utils.transformTo(\"string\", this.readData(size));\n    },\n    /**\n     * Get raw data without conversion, <size> bytes.\n     * @param {number} size the number of bytes to read.\n     * @return {Object} the raw data, implementation specific.\n     */\n    readData: function(size) {\n        // see implementations\n    },\n    /**\n     * Find the last occurence of a zip signature (4 bytes).\n     * @param {string} sig the signature to find.\n     * @return {number} the index of the last occurence, -1 if not found.\n     */\n    lastIndexOfSignature: function(sig) {\n        // see implementations\n    },\n    /**\n     * Read the signature (4 bytes) at the current position and compare it with sig.\n     * @param {string} sig the expected signature\n     * @return {boolean} true if the signature matches, false otherwise.\n     */\n    readAndCheckSignature: function(sig) {\n        // see implementations\n    },\n    /**\n     * Get the next date.\n     * @return {Date} the date.\n     */\n    readDate: function() {\n        var dostime = this.readInt(4);\n        return new Date(Date.UTC(\n        ((dostime >> 25) & 0x7f) + 1980, // year\n        ((dostime >> 21) & 0x0f) - 1, // month\n        (dostime >> 16) & 0x1f, // day\n        (dostime >> 11) & 0x1f, // hour\n        (dostime >> 5) & 0x3f, // minute\n        (dostime & 0x1f) << 1)); // second\n    }\n};\nmodule.exports = DataReader;\n\n},{\"../utils\":32}],19:[function(require,module,exports){\n'use strict';\nvar Uint8ArrayReader = require('./Uint8ArrayReader');\nvar utils = require('../utils');\n\nfunction NodeBufferReader(data) {\n    Uint8ArrayReader.call(this, data);\n}\nutils.inherits(NodeBufferReader, Uint8ArrayReader);\n\n/**\n * @see DataReader.readData\n */\nNodeBufferReader.prototype.readData = function(size) {\n    this.checkOffset(size);\n    var result = this.data.slice(this.zero + this.index, this.zero + this.index + size);\n    this.index += size;\n    return result;\n};\nmodule.exports = NodeBufferReader;\n\n},{\"../utils\":32,\"./Uint8ArrayReader\":21}],20:[function(require,module,exports){\n'use strict';\nvar DataReader = require('./DataReader');\nvar utils = require('../utils');\n\nfunction StringReader(data) {\n    DataReader.call(this, data);\n}\nutils.inherits(StringReader, DataReader);\n/**\n * @see DataReader.byteAt\n */\nStringReader.prototype.byteAt = function(i) {\n    return this.data.charCodeAt(this.zero + i);\n};\n/**\n * @see DataReader.lastIndexOfSignature\n */\nStringReader.prototype.lastIndexOfSignature = function(sig) {\n    return this.data.lastIndexOf(sig) - this.zero;\n};\n/**\n * @see DataReader.readAndCheckSignature\n */\nStringReader.prototype.readAndCheckSignature = function (sig) {\n    var data = this.readData(4);\n    return sig === data;\n};\n/**\n * @see DataReader.readData\n */\nStringReader.prototype.readData = function(size) {\n    this.checkOffset(size);\n    // this will work because the constructor applied the \"& 0xff\" mask.\n    var result = this.data.slice(this.zero + this.index, this.zero + this.index + size);\n    this.index += size;\n    return result;\n};\nmodule.exports = StringReader;\n\n},{\"../utils\":32,\"./DataReader\":18}],21:[function(require,module,exports){\n'use strict';\nvar ArrayReader = require('./ArrayReader');\nvar utils = require('../utils');\n\nfunction Uint8ArrayReader(data) {\n    ArrayReader.call(this, data);\n}\nutils.inherits(Uint8ArrayReader, ArrayReader);\n/**\n * @see DataReader.readData\n */\nUint8ArrayReader.prototype.readData = function(size) {\n    this.checkOffset(size);\n    if(size === 0) {\n        // in IE10, when using subarray(idx, idx), we get the array [0x00] instead of [].\n        return new Uint8Array(0);\n    }\n    var result = this.data.subarray(this.zero + this.index, this.zero + this.index + size);\n    this.index += size;\n    return result;\n};\nmodule.exports = Uint8ArrayReader;\n\n},{\"../utils\":32,\"./ArrayReader\":17}],22:[function(require,module,exports){\n'use strict';\n\nvar utils = require('../utils');\nvar support = require('../support');\nvar ArrayReader = require('./ArrayReader');\nvar StringReader = require('./StringReader');\nvar NodeBufferReader = require('./NodeBufferReader');\nvar Uint8ArrayReader = require('./Uint8ArrayReader');\n\n/**\n * Create a reader adapted to the data.\n * @param {String|ArrayBuffer|Uint8Array|Buffer} data the data to read.\n * @return {DataReader} the data reader.\n */\nmodule.exports = function (data) {\n    var type = utils.getTypeOf(data);\n    utils.checkSupport(type);\n    if (type === \"string\" && !support.uint8array) {\n        return new StringReader(data);\n    }\n    if (type === \"nodebuffer\") {\n        return new NodeBufferReader(data);\n    }\n    if (support.uint8array) {\n        return new Uint8ArrayReader(utils.transformTo(\"uint8array\", data));\n    }\n    return new ArrayReader(utils.transformTo(\"array\", data));\n};\n\n},{\"../support\":30,\"../utils\":32,\"./ArrayReader\":17,\"./NodeBufferReader\":19,\"./StringReader\":20,\"./Uint8ArrayReader\":21}],23:[function(require,module,exports){\n'use strict';\nexports.LOCAL_FILE_HEADER = \"PK\\x03\\x04\";\nexports.CENTRAL_FILE_HEADER = \"PK\\x01\\x02\";\nexports.CENTRAL_DIRECTORY_END = \"PK\\x05\\x06\";\nexports.ZIP64_CENTRAL_DIRECTORY_LOCATOR = \"PK\\x06\\x07\";\nexports.ZIP64_CENTRAL_DIRECTORY_END = \"PK\\x06\\x06\";\nexports.DATA_DESCRIPTOR = \"PK\\x07\\x08\";\n\n},{}],24:[function(require,module,exports){\n'use strict';\n\nvar GenericWorker = require('./GenericWorker');\nvar utils = require('../utils');\n\n/**\n * A worker which convert chunks to a specified type.\n * @constructor\n * @param {String} destType the destination type.\n */\nfunction ConvertWorker(destType) {\n    GenericWorker.call(this, \"ConvertWorker to \" + destType);\n    this.destType = destType;\n}\nutils.inherits(ConvertWorker, GenericWorker);\n\n/**\n * @see GenericWorker.processChunk\n */\nConvertWorker.prototype.processChunk = function (chunk) {\n    this.push({\n        data : utils.transformTo(this.destType, chunk.data),\n        meta : chunk.meta\n    });\n};\nmodule.exports = ConvertWorker;\n\n},{\"../utils\":32,\"./GenericWorker\":28}],25:[function(require,module,exports){\n'use strict';\n\nvar GenericWorker = require('./GenericWorker');\nvar crc32 = require('../crc32');\nvar utils = require('../utils');\n\n/**\n * A worker which calculate the crc32 of the data flowing through.\n * @constructor\n */\nfunction Crc32Probe() {\n    GenericWorker.call(this, \"Crc32Probe\");\n    this.withStreamInfo(\"crc32\", 0);\n}\nutils.inherits(Crc32Probe, GenericWorker);\n\n/**\n * @see GenericWorker.processChunk\n */\nCrc32Probe.prototype.processChunk = function (chunk) {\n    this.streamInfo.crc32 = crc32(chunk.data, this.streamInfo.crc32 || 0);\n    this.push(chunk);\n};\nmodule.exports = Crc32Probe;\n\n},{\"../crc32\":4,\"../utils\":32,\"./GenericWorker\":28}],26:[function(require,module,exports){\n'use strict';\n\nvar utils = require('../utils');\nvar GenericWorker = require('./GenericWorker');\n\n/**\n * A worker which calculate the total length of the data flowing through.\n * @constructor\n * @param {String} propName the name used to expose the length\n */\nfunction DataLengthProbe(propName) {\n    GenericWorker.call(this, \"DataLengthProbe for \" + propName);\n    this.propName = propName;\n    this.withStreamInfo(propName, 0);\n}\nutils.inherits(DataLengthProbe, GenericWorker);\n\n/**\n * @see GenericWorker.processChunk\n */\nDataLengthProbe.prototype.processChunk = function (chunk) {\n    if(chunk) {\n        var length = this.streamInfo[this.propName] || 0;\n        this.streamInfo[this.propName] = length + chunk.data.length;\n    }\n    GenericWorker.prototype.processChunk.call(this, chunk);\n};\nmodule.exports = DataLengthProbe;\n\n\n},{\"../utils\":32,\"./GenericWorker\":28}],27:[function(require,module,exports){\n'use strict';\n\nvar utils = require('../utils');\nvar GenericWorker = require('./GenericWorker');\n\n// the size of the generated chunks\n// TODO expose this as a public variable\nvar DEFAULT_BLOCK_SIZE = 16 * 1024;\n\n/**\n * A worker that reads a content and emits chunks.\n * @constructor\n * @param {Promise} dataP the promise of the data to split\n */\nfunction DataWorker(dataP) {\n    GenericWorker.call(this, \"DataWorker\");\n    var self = this;\n    this.dataIsReady = false;\n    this.index = 0;\n    this.max = 0;\n    this.data = null;\n    this.type = \"\";\n\n    this._tickScheduled = false;\n\n    dataP.then(function (data) {\n        self.dataIsReady = true;\n        self.data = data;\n        self.max = data && data.length || 0;\n        self.type = utils.getTypeOf(data);\n        if(!self.isPaused) {\n            self._tickAndRepeat();\n        }\n    }, function (e) {\n        self.error(e);\n    });\n}\n\nutils.inherits(DataWorker, GenericWorker);\n\n/**\n * @see GenericWorker.cleanUp\n */\nDataWorker.prototype.cleanUp = function () {\n    GenericWorker.prototype.cleanUp.call(this);\n    this.data = null;\n};\n\n/**\n * @see GenericWorker.resume\n */\nDataWorker.prototype.resume = function () {\n    if(!GenericWorker.prototype.resume.call(this)) {\n        return false;\n    }\n\n    if (!this._tickScheduled && this.dataIsReady) {\n        this._tickScheduled = true;\n        utils.delay(this._tickAndRepeat, [], this);\n    }\n    return true;\n};\n\n/**\n * Trigger a tick a schedule an other call to this function.\n */\nDataWorker.prototype._tickAndRepeat = function() {\n    this._tickScheduled = false;\n    if(this.isPaused || this.isFinished) {\n        return;\n    }\n    this._tick();\n    if(!this.isFinished) {\n        utils.delay(this._tickAndRepeat, [], this);\n        this._tickScheduled = true;\n    }\n};\n\n/**\n * Read and push a chunk.\n */\nDataWorker.prototype._tick = function() {\n\n    if(this.isPaused || this.isFinished) {\n        return false;\n    }\n\n    var size = DEFAULT_BLOCK_SIZE;\n    var data = null, nextIndex = Math.min(this.max, this.index + size);\n    if (this.index >= this.max) {\n        // EOF\n        return this.end();\n    } else {\n        switch(this.type) {\n            case \"string\":\n                data = this.data.substring(this.index, nextIndex);\n            break;\n            case \"uint8array\":\n                data = this.data.subarray(this.index, nextIndex);\n            break;\n            case \"array\":\n            case \"nodebuffer\":\n                data = this.data.slice(this.index, nextIndex);\n            break;\n        }\n        this.index = nextIndex;\n        return this.push({\n            data : data,\n            meta : {\n                percent : this.max ? this.index / this.max * 100 : 0\n            }\n        });\n    }\n};\n\nmodule.exports = DataWorker;\n\n},{\"../utils\":32,\"./GenericWorker\":28}],28:[function(require,module,exports){\n'use strict';\n\n/**\n * A worker that does nothing but passing chunks to the next one. This is like\n * a nodejs stream but with some differences. On the good side :\n * - it works on IE 6-9 without any issue / polyfill\n * - it weights less than the full dependencies bundled with browserify\n * - it forwards errors (no need to declare an error handler EVERYWHERE)\n *\n * A chunk is an object with 2 attributes : `meta` and `data`. The former is an\n * object containing anything (`percent` for example), see each worker for more\n * details. The latter is the real data (String, Uint8Array, etc).\n *\n * @constructor\n * @param {String} name the name of the stream (mainly used for debugging purposes)\n */\nfunction GenericWorker(name) {\n    // the name of the worker\n    this.name = name || \"default\";\n    // an object containing metadata about the workers chain\n    this.streamInfo = {};\n    // an error which happened when the worker was paused\n    this.generatedError = null;\n    // an object containing metadata to be merged by this worker into the general metadata\n    this.extraStreamInfo = {};\n    // true if the stream is paused (and should not do anything), false otherwise\n    this.isPaused = true;\n    // true if the stream is finished (and should not do anything), false otherwise\n    this.isFinished = false;\n    // true if the stream is locked to prevent further structure updates (pipe), false otherwise\n    this.isLocked = false;\n    // the event listeners\n    this._listeners = {\n        'data':[],\n        'end':[],\n        'error':[]\n    };\n    // the previous worker, if any\n    this.previous = null;\n}\n\nGenericWorker.prototype = {\n    /**\n     * Push a chunk to the next workers.\n     * @param {Object} chunk the chunk to push\n     */\n    push : function (chunk) {\n        this.emit(\"data\", chunk);\n    },\n    /**\n     * End the stream.\n     * @return {Boolean} true if this call ended the worker, false otherwise.\n     */\n    end : function () {\n        if (this.isFinished) {\n            return false;\n        }\n\n        this.flush();\n        try {\n            this.emit(\"end\");\n            this.cleanUp();\n            this.isFinished = true;\n        } catch (e) {\n            this.emit(\"error\", e);\n        }\n        return true;\n    },\n    /**\n     * End the stream with an error.\n     * @param {Error} e the error which caused the premature end.\n     * @return {Boolean} true if this call ended the worker with an error, false otherwise.\n     */\n    error : function (e) {\n        if (this.isFinished) {\n            return false;\n        }\n\n        if(this.isPaused) {\n            this.generatedError = e;\n        } else {\n            this.isFinished = true;\n\n            this.emit(\"error\", e);\n\n            // in the workers chain exploded in the middle of the chain,\n            // the error event will go downward but we also need to notify\n            // workers upward that there has been an error.\n            if(this.previous) {\n                this.previous.error(e);\n            }\n\n            this.cleanUp();\n        }\n        return true;\n    },\n    /**\n     * Add a callback on an event.\n     * @param {String} name the name of the event (data, end, error)\n     * @param {Function} listener the function to call when the event is triggered\n     * @return {GenericWorker} the current object for chainability\n     */\n    on : function (name, listener) {\n        this._listeners[name].push(listener);\n        return this;\n    },\n    /**\n     * Clean any references when a worker is ending.\n     */\n    cleanUp : function () {\n        this.streamInfo = this.generatedError = this.extraStreamInfo = null;\n        this._listeners = [];\n    },\n    /**\n     * Trigger an event. This will call registered callback with the provided arg.\n     * @param {String} name the name of the event (data, end, error)\n     * @param {Object} arg the argument to call the callback with.\n     */\n    emit : function (name, arg) {\n        if (this._listeners[name]) {\n            for(var i = 0; i < this._listeners[name].length; i++) {\n                this._listeners[name][i].call(this, arg);\n            }\n        }\n    },\n    /**\n     * Chain a worker with an other.\n     * @param {Worker} next the worker receiving events from the current one.\n     * @return {worker} the next worker for chainability\n     */\n    pipe : function (next) {\n        return next.registerPrevious(this);\n    },\n    /**\n     * Same as `pipe` in the other direction.\n     * Using an API with `pipe(next)` is very easy.\n     * Implementing the API with the point of view of the next one registering\n     * a source is easier, see the ZipFileWorker.\n     * @param {Worker} previous the previous worker, sending events to this one\n     * @return {Worker} the current worker for chainability\n     */\n    registerPrevious : function (previous) {\n        if (this.isLocked) {\n            throw new Error(\"The stream '\" + this + \"' has already been used.\");\n        }\n\n        // sharing the streamInfo...\n        this.streamInfo = previous.streamInfo;\n        // ... and adding our own bits\n        this.mergeStreamInfo();\n        this.previous =  previous;\n        var self = this;\n        previous.on('data', function (chunk) {\n            self.processChunk(chunk);\n        });\n        previous.on('end', function () {\n            self.end();\n        });\n        previous.on('error', function (e) {\n            self.error(e);\n        });\n        return this;\n    },\n    /**\n     * Pause the stream so it doesn't send events anymore.\n     * @return {Boolean} true if this call paused the worker, false otherwise.\n     */\n    pause : function () {\n        if(this.isPaused || this.isFinished) {\n            return false;\n        }\n        this.isPaused = true;\n\n        if(this.previous) {\n            this.previous.pause();\n        }\n        return true;\n    },\n    /**\n     * Resume a paused stream.\n     * @return {Boolean} true if this call resumed the worker, false otherwise.\n     */\n    resume : function () {\n        if(!this.isPaused || this.isFinished) {\n            return false;\n        }\n        this.isPaused = false;\n\n        // if true, the worker tried to resume but failed\n        var withError = false;\n        if(this.generatedError) {\n            this.error(this.generatedError);\n            withError = true;\n        }\n        if(this.previous) {\n            this.previous.resume();\n        }\n\n        return !withError;\n    },\n    /**\n     * Flush any remaining bytes as the stream is ending.\n     */\n    flush : function () {},\n    /**\n     * Process a chunk. This is usually the method overridden.\n     * @param {Object} chunk the chunk to process.\n     */\n    processChunk : function(chunk) {\n        this.push(chunk);\n    },\n    /**\n     * Add a key/value to be added in the workers chain streamInfo once activated.\n     * @param {String} key the key to use\n     * @param {Object} value the associated value\n     * @return {Worker} the current worker for chainability\n     */\n    withStreamInfo : function (key, value) {\n        this.extraStreamInfo[key] = value;\n        this.mergeStreamInfo();\n        return this;\n    },\n    /**\n     * Merge this worker's streamInfo into the chain's streamInfo.\n     */\n    mergeStreamInfo : function () {\n        for(var key in this.extraStreamInfo) {\n            if (!this.extraStreamInfo.hasOwnProperty(key)) {\n                continue;\n            }\n            this.streamInfo[key] = this.extraStreamInfo[key];\n        }\n    },\n\n    /**\n     * Lock the stream to prevent further updates on the workers chain.\n     * After calling this method, all calls to pipe will fail.\n     */\n    lock: function () {\n        if (this.isLocked) {\n            throw new Error(\"The stream '\" + this + \"' has already been used.\");\n        }\n        this.isLocked = true;\n        if (this.previous) {\n            this.previous.lock();\n        }\n    },\n\n    /**\n     *\n     * Pretty print the workers chain.\n     */\n    toString : function () {\n        var me = \"Worker \" + this.name;\n        if (this.previous) {\n            return this.previous + \" -> \" + me;\n        } else {\n            return me;\n        }\n    }\n};\n\nmodule.exports = GenericWorker;\n\n},{}],29:[function(require,module,exports){\n'use strict';\n\nvar utils = require('../utils');\nvar ConvertWorker = require('./ConvertWorker');\nvar GenericWorker = require('./GenericWorker');\nvar base64 = require('../base64');\nvar support = require(\"../support\");\nvar external = require(\"../external\");\n\nvar NodejsStreamOutputAdapter = null;\nif (support.nodestream) {\n    try {\n        NodejsStreamOutputAdapter = require('../nodejs/NodejsStreamOutputAdapter');\n    } catch(e) {}\n}\n\n/**\n * Apply the final transformation of the data. If the user wants a Blob for\n * example, it's easier to work with an U8intArray and finally do the\n * ArrayBuffer/Blob conversion.\n * @param {String} type the name of the final type\n * @param {String|Uint8Array|Buffer} content the content to transform\n * @param {String} mimeType the mime type of the content, if applicable.\n * @return {String|Uint8Array|ArrayBuffer|Buffer|Blob} the content in the right format.\n */\nfunction transformZipOutput(type, content, mimeType) {\n    switch(type) {\n        case \"blob\" :\n            return utils.newBlob(utils.transformTo(\"arraybuffer\", content), mimeType);\n        case \"base64\" :\n            return base64.encode(content);\n        default :\n            return utils.transformTo(type, content);\n    }\n}\n\n/**\n * Concatenate an array of data of the given type.\n * @param {String} type the type of the data in the given array.\n * @param {Array} dataArray the array containing the data chunks to concatenate\n * @return {String|Uint8Array|Buffer} the concatenated data\n * @throws Error if the asked type is unsupported\n */\nfunction concat (type, dataArray) {\n    var i, index = 0, res = null, totalLength = 0;\n    for(i = 0; i < dataArray.length; i++) {\n        totalLength += dataArray[i].length;\n    }\n    switch(type) {\n        case \"string\":\n            return dataArray.join(\"\");\n          case \"array\":\n            return Array.prototype.concat.apply([], dataArray);\n        case \"uint8array\":\n            res = new Uint8Array(totalLength);\n            for(i = 0; i < dataArray.length; i++) {\n                res.set(dataArray[i], index);\n                index += dataArray[i].length;\n            }\n            return res;\n        case \"nodebuffer\":\n            return Buffer.concat(dataArray);\n        default:\n            throw new Error(\"concat : unsupported type '\"  + type + \"'\");\n    }\n}\n\n/**\n * Listen a StreamHelper, accumulate its content and concatenate it into a\n * complete block.\n * @param {StreamHelper} helper the helper to use.\n * @param {Function} updateCallback a callback called on each update. Called\n * with one arg :\n * - the metadata linked to the update received.\n * @return Promise the promise for the accumulation.\n */\nfunction accumulate(helper, updateCallback) {\n    return new external.Promise(function (resolve, reject){\n        var dataArray = [];\n        var chunkType = helper._internalType,\n            resultType = helper._outputType,\n            mimeType = helper._mimeType;\n        helper\n        .on('data', function (data, meta) {\n            dataArray.push(data);\n            if(updateCallback) {\n                updateCallback(meta);\n            }\n        })\n        .on('error', function(err) {\n            dataArray = [];\n            reject(err);\n        })\n        .on('end', function (){\n            try {\n                var result = transformZipOutput(resultType, concat(chunkType, dataArray), mimeType);\n                resolve(result);\n            } catch (e) {\n                reject(e);\n            }\n            dataArray = [];\n        })\n        .resume();\n    });\n}\n\n/**\n * An helper to easily use workers outside of JSZip.\n * @constructor\n * @param {Worker} worker the worker to wrap\n * @param {String} outputType the type of data expected by the use\n * @param {String} mimeType the mime type of the content, if applicable.\n */\nfunction StreamHelper(worker, outputType, mimeType) {\n    var internalType = outputType;\n    switch(outputType) {\n        case \"blob\":\n        case \"arraybuffer\":\n            internalType = \"uint8array\";\n        break;\n        case \"base64\":\n            internalType = \"string\";\n        break;\n    }\n\n    try {\n        // the type used internally\n        this._internalType = internalType;\n        // the type used to output results\n        this._outputType = outputType;\n        // the mime type\n        this._mimeType = mimeType;\n        utils.checkSupport(internalType);\n        this._worker = worker.pipe(new ConvertWorker(internalType));\n        // the last workers can be rewired without issues but we need to\n        // prevent any updates on previous workers.\n        worker.lock();\n    } catch(e) {\n        this._worker = new GenericWorker(\"error\");\n        this._worker.error(e);\n    }\n}\n\nStreamHelper.prototype = {\n    /**\n     * Listen a StreamHelper, accumulate its content and concatenate it into a\n     * complete block.\n     * @param {Function} updateCb the update callback.\n     * @return Promise the promise for the accumulation.\n     */\n    accumulate : function (updateCb) {\n        return accumulate(this, updateCb);\n    },\n    /**\n     * Add a listener on an event triggered on a stream.\n     * @param {String} evt the name of the event\n     * @param {Function} fn the listener\n     * @return {StreamHelper} the current helper.\n     */\n    on : function (evt, fn) {\n        var self = this;\n\n        if(evt === \"data\") {\n            this._worker.on(evt, function (chunk) {\n                fn.call(self, chunk.data, chunk.meta);\n            });\n        } else {\n            this._worker.on(evt, function () {\n                utils.delay(fn, arguments, self);\n            });\n        }\n        return this;\n    },\n    /**\n     * Resume the flow of chunks.\n     * @return {StreamHelper} the current helper.\n     */\n    resume : function () {\n        utils.delay(this._worker.resume, [], this._worker);\n        return this;\n    },\n    /**\n     * Pause the flow of chunks.\n     * @return {StreamHelper} the current helper.\n     */\n    pause : function () {\n        this._worker.pause();\n        return this;\n    },\n    /**\n     * Return a nodejs stream for this helper.\n     * @param {Function} updateCb the update callback.\n     * @return {NodejsStreamOutputAdapter} the nodejs stream.\n     */\n    toNodejsStream : function (updateCb) {\n        utils.checkSupport(\"nodestream\");\n        if (this._outputType !== \"nodebuffer\") {\n            // an object stream containing blob/arraybuffer/uint8array/string\n            // is strange and I don't know if it would be useful.\n            // I you find this comment and have a good usecase, please open a\n            // bug report !\n            throw new Error(this._outputType + \" is not supported by this method\");\n        }\n\n        return new NodejsStreamOutputAdapter(this, {\n            objectMode : this._outputType !== \"nodebuffer\"\n        }, updateCb);\n    }\n};\n\n\nmodule.exports = StreamHelper;\n\n},{\"../base64\":1,\"../external\":6,\"../nodejs/NodejsStreamOutputAdapter\":13,\"../support\":30,\"../utils\":32,\"./ConvertWorker\":24,\"./GenericWorker\":28}],30:[function(require,module,exports){\n'use strict';\n\nexports.base64 = true;\nexports.array = true;\nexports.string = true;\nexports.arraybuffer = typeof ArrayBuffer !== \"undefined\" && typeof Uint8Array !== \"undefined\";\nexports.nodebuffer = typeof Buffer !== \"undefined\";\n// contains true if JSZip can read/generate Uint8Array, false otherwise.\nexports.uint8array = typeof Uint8Array !== \"undefined\";\n\nif (typeof ArrayBuffer === \"undefined\") {\n    exports.blob = false;\n}\nelse {\n    var buffer = new ArrayBuffer(0);\n    try {\n        exports.blob = new Blob([buffer], {\n            type: \"application/zip\"\n        }).size === 0;\n    }\n    catch (e) {\n        try {\n            var Builder = self.BlobBuilder || self.WebKitBlobBuilder || self.MozBlobBuilder || self.MSBlobBuilder;\n            var builder = new Builder();\n            builder.append(buffer);\n            exports.blob = builder.getBlob('application/zip').size === 0;\n        }\n        catch (e) {\n            exports.blob = false;\n        }\n    }\n}\n\ntry {\n    exports.nodestream = !!require('readable-stream').Readable;\n} catch(e) {\n    exports.nodestream = false;\n}\n\n},{\"readable-stream\":16}],31:[function(require,module,exports){\n'use strict';\n\nvar utils = require('./utils');\nvar support = require('./support');\nvar nodejsUtils = require('./nodejsUtils');\nvar GenericWorker = require('./stream/GenericWorker');\n\n/**\n * The following functions come from pako, from pako/lib/utils/strings\n * released under the MIT license, see pako https://github.com/nodeca/pako/\n */\n\n// Table with utf8 lengths (calculated by first byte of sequence)\n// Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS,\n// because max possible codepoint is 0x10ffff\nvar _utf8len = new Array(256);\nfor (var i=0; i<256; i++) {\n  _utf8len[i] = (i >= 252 ? 6 : i >= 248 ? 5 : i >= 240 ? 4 : i >= 224 ? 3 : i >= 192 ? 2 : 1);\n}\n_utf8len[254]=_utf8len[254]=1; // Invalid sequence start\n\n// convert string to array (typed, when possible)\nvar string2buf = function (str) {\n    var buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0;\n\n    // count binary size\n    for (m_pos = 0; m_pos < str_len; m_pos++) {\n        c = str.charCodeAt(m_pos);\n        if ((c & 0xfc00) === 0xd800 && (m_pos+1 < str_len)) {\n            c2 = str.charCodeAt(m_pos+1);\n            if ((c2 & 0xfc00) === 0xdc00) {\n                c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n                m_pos++;\n            }\n        }\n        buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4;\n    }\n\n    // allocate buffer\n    if (support.uint8array) {\n        buf = new Uint8Array(buf_len);\n    } else {\n        buf = new Array(buf_len);\n    }\n\n    // convert\n    for (i=0, m_pos = 0; i < buf_len; m_pos++) {\n        c = str.charCodeAt(m_pos);\n        if ((c & 0xfc00) === 0xd800 && (m_pos+1 < str_len)) {\n            c2 = str.charCodeAt(m_pos+1);\n            if ((c2 & 0xfc00) === 0xdc00) {\n                c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n                m_pos++;\n            }\n        }\n        if (c < 0x80) {\n            /* one byte */\n            buf[i++] = c;\n        } else if (c < 0x800) {\n            /* two bytes */\n            buf[i++] = 0xC0 | (c >>> 6);\n            buf[i++] = 0x80 | (c & 0x3f);\n        } else if (c < 0x10000) {\n            /* three bytes */\n            buf[i++] = 0xE0 | (c >>> 12);\n            buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n            buf[i++] = 0x80 | (c & 0x3f);\n        } else {\n            /* four bytes */\n            buf[i++] = 0xf0 | (c >>> 18);\n            buf[i++] = 0x80 | (c >>> 12 & 0x3f);\n            buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n            buf[i++] = 0x80 | (c & 0x3f);\n        }\n    }\n\n    return buf;\n};\n\n// Calculate max possible position in utf8 buffer,\n// that will not break sequence. If that's not possible\n// - (very small limits) return max size as is.\n//\n// buf[] - utf8 bytes array\n// max   - length limit (mandatory);\nvar utf8border = function(buf, max) {\n    var pos;\n\n    max = max || buf.length;\n    if (max > buf.length) { max = buf.length; }\n\n    // go back from last position, until start of sequence found\n    pos = max-1;\n    while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; }\n\n    // Fuckup - very small and broken sequence,\n    // return max, because we should return something anyway.\n    if (pos < 0) { return max; }\n\n    // If we came to start of buffer - that means vuffer is too small,\n    // return max too.\n    if (pos === 0) { return max; }\n\n    return (pos + _utf8len[buf[pos]] > max) ? pos : max;\n};\n\n// convert array to string\nvar buf2string = function (buf) {\n    var str, i, out, c, c_len;\n    var len = buf.length;\n\n    // Reserve max possible length (2 words per char)\n    // NB: by unknown reasons, Array is significantly faster for\n    //     String.fromCharCode.apply than Uint16Array.\n    var utf16buf = new Array(len*2);\n\n    for (out=0, i=0; i<len;) {\n        c = buf[i++];\n        // quick process ascii\n        if (c < 0x80) { utf16buf[out++] = c; continue; }\n\n        c_len = _utf8len[c];\n        // skip 5 & 6 byte codes\n        if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len-1; continue; }\n\n        // apply mask on first byte\n        c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;\n        // join the rest\n        while (c_len > 1 && i < len) {\n            c = (c << 6) | (buf[i++] & 0x3f);\n            c_len--;\n        }\n\n        // terminated by end of string?\n        if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; }\n\n        if (c < 0x10000) {\n            utf16buf[out++] = c;\n        } else {\n            c -= 0x10000;\n            utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff);\n            utf16buf[out++] = 0xdc00 | (c & 0x3ff);\n        }\n    }\n\n    // shrinkBuf(utf16buf, out)\n    if (utf16buf.length !== out) {\n        if(utf16buf.subarray) {\n            utf16buf = utf16buf.subarray(0, out);\n        } else {\n            utf16buf.length = out;\n        }\n    }\n\n    // return String.fromCharCode.apply(null, utf16buf);\n    return utils.applyFromCharCode(utf16buf);\n};\n\n\n// That's all for the pako functions.\n\n\n/**\n * Transform a javascript string into an array (typed if possible) of bytes,\n * UTF-8 encoded.\n * @param {String} str the string to encode\n * @return {Array|Uint8Array|Buffer} the UTF-8 encoded string.\n */\nexports.utf8encode = function utf8encode(str) {\n    if (support.nodebuffer) {\n        return nodejsUtils.newBufferFrom(str, \"utf-8\");\n    }\n\n    return string2buf(str);\n};\n\n\n/**\n * Transform a bytes array (or a representation) representing an UTF-8 encoded\n * string into a javascript string.\n * @param {Array|Uint8Array|Buffer} buf the data de decode\n * @return {String} the decoded string.\n */\nexports.utf8decode = function utf8decode(buf) {\n    if (support.nodebuffer) {\n        return utils.transformTo(\"nodebuffer\", buf).toString(\"utf-8\");\n    }\n\n    buf = utils.transformTo(support.uint8array ? \"uint8array\" : \"array\", buf);\n\n    return buf2string(buf);\n};\n\n/**\n * A worker to decode utf8 encoded binary chunks into string chunks.\n * @constructor\n */\nfunction Utf8DecodeWorker() {\n    GenericWorker.call(this, \"utf-8 decode\");\n    // the last bytes if a chunk didn't end with a complete codepoint.\n    this.leftOver = null;\n}\nutils.inherits(Utf8DecodeWorker, GenericWorker);\n\n/**\n * @see GenericWorker.processChunk\n */\nUtf8DecodeWorker.prototype.processChunk = function (chunk) {\n\n    var data = utils.transformTo(support.uint8array ? \"uint8array\" : \"array\", chunk.data);\n\n    // 1st step, re-use what's left of the previous chunk\n    if (this.leftOver && this.leftOver.length) {\n        if(support.uint8array) {\n            var previousData = data;\n            data = new Uint8Array(previousData.length + this.leftOver.length);\n            data.set(this.leftOver, 0);\n            data.set(previousData, this.leftOver.length);\n        } else {\n            data = this.leftOver.concat(data);\n        }\n        this.leftOver = null;\n    }\n\n    var nextBoundary = utf8border(data);\n    var usableData = data;\n    if (nextBoundary !== data.length) {\n        if (support.uint8array) {\n            usableData = data.subarray(0, nextBoundary);\n            this.leftOver = data.subarray(nextBoundary, data.length);\n        } else {\n            usableData = data.slice(0, nextBoundary);\n            this.leftOver = data.slice(nextBoundary, data.length);\n        }\n    }\n\n    this.push({\n        data : exports.utf8decode(usableData),\n        meta : chunk.meta\n    });\n};\n\n/**\n * @see GenericWorker.flush\n */\nUtf8DecodeWorker.prototype.flush = function () {\n    if(this.leftOver && this.leftOver.length) {\n        this.push({\n            data : exports.utf8decode(this.leftOver),\n            meta : {}\n        });\n        this.leftOver = null;\n    }\n};\nexports.Utf8DecodeWorker = Utf8DecodeWorker;\n\n/**\n * A worker to endcode string chunks into utf8 encoded binary chunks.\n * @constructor\n */\nfunction Utf8EncodeWorker() {\n    GenericWorker.call(this, \"utf-8 encode\");\n}\nutils.inherits(Utf8EncodeWorker, GenericWorker);\n\n/**\n * @see GenericWorker.processChunk\n */\nUtf8EncodeWorker.prototype.processChunk = function (chunk) {\n    this.push({\n        data : exports.utf8encode(chunk.data),\n        meta : chunk.meta\n    });\n};\nexports.Utf8EncodeWorker = Utf8EncodeWorker;\n\n},{\"./nodejsUtils\":14,\"./stream/GenericWorker\":28,\"./support\":30,\"./utils\":32}],32:[function(require,module,exports){\n'use strict';\n\nvar support = require('./support');\nvar base64 = require('./base64');\nvar nodejsUtils = require('./nodejsUtils');\nvar setImmediate = require('set-immediate-shim');\nvar external = require(\"./external\");\n\n\n/**\n * Convert a string that pass as a \"binary string\": it should represent a byte\n * array but may have > 255 char codes. Be sure to take only the first byte\n * and returns the byte array.\n * @param {String} str the string to transform.\n * @return {Array|Uint8Array} the string in a binary format.\n */\nfunction string2binary(str) {\n    var result = null;\n    if (support.uint8array) {\n      result = new Uint8Array(str.length);\n    } else {\n      result = new Array(str.length);\n    }\n    return stringToArrayLike(str, result);\n}\n\n/**\n * Create a new blob with the given content and the given type.\n * @param {String|ArrayBuffer} part the content to put in the blob. DO NOT use\n * an Uint8Array because the stock browser of android 4 won't accept it (it\n * will be silently converted to a string, \"[object Uint8Array]\").\n *\n * Use only ONE part to build the blob to avoid a memory leak in IE11 / Edge:\n * when a large amount of Array is used to create the Blob, the amount of\n * memory consumed is nearly 100 times the original data amount.\n *\n * @param {String} type the mime type of the blob.\n * @return {Blob} the created blob.\n */\nexports.newBlob = function(part, type) {\n    exports.checkSupport(\"blob\");\n\n    try {\n        // Blob constructor\n        return new Blob([part], {\n            type: type\n        });\n    }\n    catch (e) {\n\n        try {\n            // deprecated, browser only, old way\n            var Builder = self.BlobBuilder || self.WebKitBlobBuilder || self.MozBlobBuilder || self.MSBlobBuilder;\n            var builder = new Builder();\n            builder.append(part);\n            return builder.getBlob(type);\n        }\n        catch (e) {\n\n            // well, fuck ?!\n            throw new Error(\"Bug : can't construct the Blob.\");\n        }\n    }\n\n\n};\n/**\n * The identity function.\n * @param {Object} input the input.\n * @return {Object} the same input.\n */\nfunction identity(input) {\n    return input;\n}\n\n/**\n * Fill in an array with a string.\n * @param {String} str the string to use.\n * @param {Array|ArrayBuffer|Uint8Array|Buffer} array the array to fill in (will be mutated).\n * @return {Array|ArrayBuffer|Uint8Array|Buffer} the updated array.\n */\nfunction stringToArrayLike(str, array) {\n    for (var i = 0; i < str.length; ++i) {\n        array[i] = str.charCodeAt(i) & 0xFF;\n    }\n    return array;\n}\n\n/**\n * An helper for the function arrayLikeToString.\n * This contains static informations and functions that\n * can be optimized by the browser JIT compiler.\n */\nvar arrayToStringHelper = {\n    /**\n     * Transform an array of int into a string, chunk by chunk.\n     * See the performances notes on arrayLikeToString.\n     * @param {Array|ArrayBuffer|Uint8Array|Buffer} array the array to transform.\n     * @param {String} type the type of the array.\n     * @param {Integer} chunk the chunk size.\n     * @return {String} the resulting string.\n     * @throws Error if the chunk is too big for the stack.\n     */\n    stringifyByChunk: function(array, type, chunk) {\n        var result = [], k = 0, len = array.length;\n        // shortcut\n        if (len <= chunk) {\n            return String.fromCharCode.apply(null, array);\n        }\n        while (k < len) {\n            if (type === \"array\" || type === \"nodebuffer\") {\n                result.push(String.fromCharCode.apply(null, array.slice(k, Math.min(k + chunk, len))));\n            }\n            else {\n                result.push(String.fromCharCode.apply(null, array.subarray(k, Math.min(k + chunk, len))));\n            }\n            k += chunk;\n        }\n        return result.join(\"\");\n    },\n    /**\n     * Call String.fromCharCode on every item in the array.\n     * This is the naive implementation, which generate A LOT of intermediate string.\n     * This should be used when everything else fail.\n     * @param {Array|ArrayBuffer|Uint8Array|Buffer} array the array to transform.\n     * @return {String} the result.\n     */\n    stringifyByChar: function(array){\n        var resultStr = \"\";\n        for(var i = 0; i < array.length; i++) {\n            resultStr += String.fromCharCode(array[i]);\n        }\n        return resultStr;\n    },\n    applyCanBeUsed : {\n        /**\n         * true if the browser accepts to use String.fromCharCode on Uint8Array\n         */\n        uint8array : (function () {\n            try {\n                return support.uint8array && String.fromCharCode.apply(null, new Uint8Array(1)).length === 1;\n            } catch (e) {\n                return false;\n            }\n        })(),\n        /**\n         * true if the browser accepts to use String.fromCharCode on nodejs Buffer.\n         */\n        nodebuffer : (function () {\n            try {\n                return support.nodebuffer && String.fromCharCode.apply(null, nodejsUtils.allocBuffer(1)).length === 1;\n            } catch (e) {\n                return false;\n            }\n        })()\n    }\n};\n\n/**\n * Transform an array-like object to a string.\n * @param {Array|ArrayBuffer|Uint8Array|Buffer} array the array to transform.\n * @return {String} the result.\n */\nfunction arrayLikeToString(array) {\n    // Performances notes :\n    // --------------------\n    // String.fromCharCode.apply(null, array) is the fastest, see\n    // see http://jsperf.com/converting-a-uint8array-to-a-string/2\n    // but the stack is limited (and we can get huge arrays !).\n    //\n    // result += String.fromCharCode(array[i]); generate too many strings !\n    //\n    // This code is inspired by http://jsperf.com/arraybuffer-to-string-apply-performance/2\n    // TODO : we now have workers that split the work. Do we still need that ?\n    var chunk = 65536,\n        type = exports.getTypeOf(array),\n        canUseApply = true;\n    if (type === \"uint8array\") {\n        canUseApply = arrayToStringHelper.applyCanBeUsed.uint8array;\n    } else if (type === \"nodebuffer\") {\n        canUseApply = arrayToStringHelper.applyCanBeUsed.nodebuffer;\n    }\n\n    if (canUseApply) {\n        while (chunk > 1) {\n            try {\n                return arrayToStringHelper.stringifyByChunk(array, type, chunk);\n            } catch (e) {\n                chunk = Math.floor(chunk / 2);\n            }\n        }\n    }\n\n    // no apply or chunk error : slow and painful algorithm\n    // default browser on android 4.*\n    return arrayToStringHelper.stringifyByChar(array);\n}\n\nexports.applyFromCharCode = arrayLikeToString;\n\n\n/**\n * Copy the data from an array-like to an other array-like.\n * @param {Array|ArrayBuffer|Uint8Array|Buffer} arrayFrom the origin array.\n * @param {Array|ArrayBuffer|Uint8Array|Buffer} arrayTo the destination array which will be mutated.\n * @return {Array|ArrayBuffer|Uint8Array|Buffer} the updated destination array.\n */\nfunction arrayLikeToArrayLike(arrayFrom, arrayTo) {\n    for (var i = 0; i < arrayFrom.length; i++) {\n        arrayTo[i] = arrayFrom[i];\n    }\n    return arrayTo;\n}\n\n// a matrix containing functions to transform everything into everything.\nvar transform = {};\n\n// string to ?\ntransform[\"string\"] = {\n    \"string\": identity,\n    \"array\": function(input) {\n        return stringToArrayLike(input, new Array(input.length));\n    },\n    \"arraybuffer\": function(input) {\n        return transform[\"string\"][\"uint8array\"](input).buffer;\n    },\n    \"uint8array\": function(input) {\n        return stringToArrayLike(input, new Uint8Array(input.length));\n    },\n    \"nodebuffer\": function(input) {\n        return stringToArrayLike(input, nodejsUtils.allocBuffer(input.length));\n    }\n};\n\n// array to ?\ntransform[\"array\"] = {\n    \"string\": arrayLikeToString,\n    \"array\": identity,\n    \"arraybuffer\": function(input) {\n        return (new Uint8Array(input)).buffer;\n    },\n    \"uint8array\": function(input) {\n        return new Uint8Array(input);\n    },\n    \"nodebuffer\": function(input) {\n        return nodejsUtils.newBufferFrom(input);\n    }\n};\n\n// arraybuffer to ?\ntransform[\"arraybuffer\"] = {\n    \"string\": function(input) {\n        return arrayLikeToString(new Uint8Array(input));\n    },\n    \"array\": function(input) {\n        return arrayLikeToArrayLike(new Uint8Array(input), new Array(input.byteLength));\n    },\n    \"arraybuffer\": identity,\n    \"uint8array\": function(input) {\n        return new Uint8Array(input);\n    },\n    \"nodebuffer\": function(input) {\n        return nodejsUtils.newBufferFrom(new Uint8Array(input));\n    }\n};\n\n// uint8array to ?\ntransform[\"uint8array\"] = {\n    \"string\": arrayLikeToString,\n    \"array\": function(input) {\n        return arrayLikeToArrayLike(input, new Array(input.length));\n    },\n    \"arraybuffer\": function(input) {\n        return input.buffer;\n    },\n    \"uint8array\": identity,\n    \"nodebuffer\": function(input) {\n        return nodejsUtils.newBufferFrom(input);\n    }\n};\n\n// nodebuffer to ?\ntransform[\"nodebuffer\"] = {\n    \"string\": arrayLikeToString,\n    \"array\": function(input) {\n        return arrayLikeToArrayLike(input, new Array(input.length));\n    },\n    \"arraybuffer\": function(input) {\n        return transform[\"nodebuffer\"][\"uint8array\"](input).buffer;\n    },\n    \"uint8array\": function(input) {\n        return arrayLikeToArrayLike(input, new Uint8Array(input.length));\n    },\n    \"nodebuffer\": identity\n};\n\n/**\n * Transform an input into any type.\n * The supported output type are : string, array, uint8array, arraybuffer, nodebuffer.\n * If no output type is specified, the unmodified input will be returned.\n * @param {String} outputType the output type.\n * @param {String|Array|ArrayBuffer|Uint8Array|Buffer} input the input to convert.\n * @throws {Error} an Error if the browser doesn't support the requested output type.\n */\nexports.transformTo = function(outputType, input) {\n    if (!input) {\n        // undefined, null, etc\n        // an empty string won't harm.\n        input = \"\";\n    }\n    if (!outputType) {\n        return input;\n    }\n    exports.checkSupport(outputType);\n    var inputType = exports.getTypeOf(input);\n    var result = transform[inputType][outputType](input);\n    return result;\n};\n\n/**\n * Return the type of the input.\n * The type will be in a format valid for JSZip.utils.transformTo : string, array, uint8array, arraybuffer.\n * @param {Object} input the input to identify.\n * @return {String} the (lowercase) type of the input.\n */\nexports.getTypeOf = function(input) {\n    if (typeof input === \"string\") {\n        return \"string\";\n    }\n    if (Object.prototype.toString.call(input) === \"[object Array]\") {\n        return \"array\";\n    }\n    if (support.nodebuffer && nodejsUtils.isBuffer(input)) {\n        return \"nodebuffer\";\n    }\n    if (support.uint8array && input instanceof Uint8Array) {\n        return \"uint8array\";\n    }\n    if (support.arraybuffer && input instanceof ArrayBuffer) {\n        return \"arraybuffer\";\n    }\n};\n\n/**\n * Throw an exception if the type is not supported.\n * @param {String} type the type to check.\n * @throws {Error} an Error if the browser doesn't support the requested type.\n */\nexports.checkSupport = function(type) {\n    var supported = support[type.toLowerCase()];\n    if (!supported) {\n        throw new Error(type + \" is not supported by this platform\");\n    }\n};\n\nexports.MAX_VALUE_16BITS = 65535;\nexports.MAX_VALUE_32BITS = -1; // well, \"\\xFF\\xFF\\xFF\\xFF\\xFF\\xFF\\xFF\\xFF\" is parsed as -1\n\n/**\n * Prettify a string read as binary.\n * @param {string} str the string to prettify.\n * @return {string} a pretty string.\n */\nexports.pretty = function(str) {\n    var res = '',\n        code, i;\n    for (i = 0; i < (str || \"\").length; i++) {\n        code = str.charCodeAt(i);\n        res += '\\\\x' + (code < 16 ? \"0\" : \"\") + code.toString(16).toUpperCase();\n    }\n    return res;\n};\n\n/**\n * Defer the call of a function.\n * @param {Function} callback the function to call asynchronously.\n * @param {Array} args the arguments to give to the callback.\n */\nexports.delay = function(callback, args, self) {\n    setImmediate(function () {\n        callback.apply(self || null, args || []);\n    });\n};\n\n/**\n * Extends a prototype with an other, without calling a constructor with\n * side effects. Inspired by nodejs' `utils.inherits`\n * @param {Function} ctor the constructor to augment\n * @param {Function} superCtor the parent constructor to use\n */\nexports.inherits = function (ctor, superCtor) {\n    var Obj = function() {};\n    Obj.prototype = superCtor.prototype;\n    ctor.prototype = new Obj();\n};\n\n/**\n * Merge the objects passed as parameters into a new one.\n * @private\n * @param {...Object} var_args All objects to merge.\n * @return {Object} a new object with the data of the others.\n */\nexports.extend = function() {\n    var result = {}, i, attr;\n    for (i = 0; i < arguments.length; i++) { // arguments is not enumerable in some browsers\n        for (attr in arguments[i]) {\n            if (arguments[i].hasOwnProperty(attr) && typeof result[attr] === \"undefined\") {\n                result[attr] = arguments[i][attr];\n            }\n        }\n    }\n    return result;\n};\n\n/**\n * Transform arbitrary content into a Promise.\n * @param {String} name a name for the content being processed.\n * @param {Object} inputData the content to process.\n * @param {Boolean} isBinary true if the content is not an unicode string\n * @param {Boolean} isOptimizedBinaryString true if the string content only has one byte per character.\n * @param {Boolean} isBase64 true if the string content is encoded with base64.\n * @return {Promise} a promise in a format usable by JSZip.\n */\nexports.prepareContent = function(name, inputData, isBinary, isOptimizedBinaryString, isBase64) {\n\n    // if inputData is already a promise, this flatten it.\n    var promise = external.Promise.resolve(inputData).then(function(data) {\n        \n        \n        var isBlob = support.blob && (data instanceof Blob || ['[object File]', '[object Blob]'].indexOf(Object.prototype.toString.call(data)) !== -1);\n\n        if (isBlob && typeof FileReader !== \"undefined\") {\n            return new external.Promise(function (resolve, reject) {\n                var reader = new FileReader();\n\n                reader.onload = function(e) {\n                    resolve(e.target.result);\n                };\n                reader.onerror = function(e) {\n                    reject(e.target.error);\n                };\n                reader.readAsArrayBuffer(data);\n            });\n        } else {\n            return data;\n        }\n    });\n\n    return promise.then(function(data) {\n        var dataType = exports.getTypeOf(data);\n\n        if (!dataType) {\n            return external.Promise.reject(\n                new Error(\"Can't read the data of '\" + name + \"'. Is it \" +\n                          \"in a supported JavaScript type (String, Blob, ArrayBuffer, etc) ?\")\n            );\n        }\n        // special case : it's way easier to work with Uint8Array than with ArrayBuffer\n        if (dataType === \"arraybuffer\") {\n            data = exports.transformTo(\"uint8array\", data);\n        } else if (dataType === \"string\") {\n            if (isBase64) {\n                data = base64.decode(data);\n            }\n            else if (isBinary) {\n                // optimizedBinaryString === true means that the file has already been filtered with a 0xFF mask\n                if (isOptimizedBinaryString !== true) {\n                    // this is a string, not in a base64 format.\n                    // Be sure that this is a correct \"binary string\"\n                    data = string2binary(data);\n                }\n            }\n        }\n        return data;\n    });\n};\n\n},{\"./base64\":1,\"./external\":6,\"./nodejsUtils\":14,\"./support\":30,\"set-immediate-shim\":54}],33:[function(require,module,exports){\n'use strict';\nvar readerFor = require('./reader/readerFor');\nvar utils = require('./utils');\nvar sig = require('./signature');\nvar ZipEntry = require('./zipEntry');\nvar utf8 = require('./utf8');\nvar support = require('./support');\n//  class ZipEntries {{{\n/**\n * All the entries in the zip file.\n * @constructor\n * @param {Object} loadOptions Options for loading the stream.\n */\nfunction ZipEntries(loadOptions) {\n    this.files = [];\n    this.loadOptions = loadOptions;\n}\nZipEntries.prototype = {\n    /**\n     * Check that the reader is on the specified signature.\n     * @param {string} expectedSignature the expected signature.\n     * @throws {Error} if it is an other signature.\n     */\n    checkSignature: function(expectedSignature) {\n        if (!this.reader.readAndCheckSignature(expectedSignature)) {\n            this.reader.index -= 4;\n            var signature = this.reader.readString(4);\n            throw new Error(\"Corrupted zip or bug: unexpected signature \" + \"(\" + utils.pretty(signature) + \", expected \" + utils.pretty(expectedSignature) + \")\");\n        }\n    },\n    /**\n     * Check if the given signature is at the given index.\n     * @param {number} askedIndex the index to check.\n     * @param {string} expectedSignature the signature to expect.\n     * @return {boolean} true if the signature is here, false otherwise.\n     */\n    isSignature: function(askedIndex, expectedSignature) {\n        var currentIndex = this.reader.index;\n        this.reader.setIndex(askedIndex);\n        var signature = this.reader.readString(4);\n        var result = signature === expectedSignature;\n        this.reader.setIndex(currentIndex);\n        return result;\n    },\n    /**\n     * Read the end of the central directory.\n     */\n    readBlockEndOfCentral: function() {\n        this.diskNumber = this.reader.readInt(2);\n        this.diskWithCentralDirStart = this.reader.readInt(2);\n        this.centralDirRecordsOnThisDisk = this.reader.readInt(2);\n        this.centralDirRecords = this.reader.readInt(2);\n        this.centralDirSize = this.reader.readInt(4);\n        this.centralDirOffset = this.reader.readInt(4);\n\n        this.zipCommentLength = this.reader.readInt(2);\n        // warning : the encoding depends of the system locale\n        // On a linux machine with LANG=en_US.utf8, this field is utf8 encoded.\n        // On a windows machine, this field is encoded with the localized windows code page.\n        var zipComment = this.reader.readData(this.zipCommentLength);\n        var decodeParamType = support.uint8array ? \"uint8array\" : \"array\";\n        // To get consistent behavior with the generation part, we will assume that\n        // this is utf8 encoded unless specified otherwise.\n        var decodeContent = utils.transformTo(decodeParamType, zipComment);\n        this.zipComment = this.loadOptions.decodeFileName(decodeContent);\n    },\n    /**\n     * Read the end of the Zip 64 central directory.\n     * Not merged with the method readEndOfCentral :\n     * The end of central can coexist with its Zip64 brother,\n     * I don't want to read the wrong number of bytes !\n     */\n    readBlockZip64EndOfCentral: function() {\n        this.zip64EndOfCentralSize = this.reader.readInt(8);\n        this.reader.skip(4);\n        // this.versionMadeBy = this.reader.readString(2);\n        // this.versionNeeded = this.reader.readInt(2);\n        this.diskNumber = this.reader.readInt(4);\n        this.diskWithCentralDirStart = this.reader.readInt(4);\n        this.centralDirRecordsOnThisDisk = this.reader.readInt(8);\n        this.centralDirRecords = this.reader.readInt(8);\n        this.centralDirSize = this.reader.readInt(8);\n        this.centralDirOffset = this.reader.readInt(8);\n\n        this.zip64ExtensibleData = {};\n        var extraDataSize = this.zip64EndOfCentralSize - 44,\n            index = 0,\n            extraFieldId,\n            extraFieldLength,\n            extraFieldValue;\n        while (index < extraDataSize) {\n            extraFieldId = this.reader.readInt(2);\n            extraFieldLength = this.reader.readInt(4);\n            extraFieldValue = this.reader.readData(extraFieldLength);\n            this.zip64ExtensibleData[extraFieldId] = {\n                id: extraFieldId,\n                length: extraFieldLength,\n                value: extraFieldValue\n            };\n        }\n    },\n    /**\n     * Read the end of the Zip 64 central directory locator.\n     */\n    readBlockZip64EndOfCentralLocator: function() {\n        this.diskWithZip64CentralDirStart = this.reader.readInt(4);\n        this.relativeOffsetEndOfZip64CentralDir = this.reader.readInt(8);\n        this.disksCount = this.reader.readInt(4);\n        if (this.disksCount > 1) {\n            throw new Error(\"Multi-volumes zip are not supported\");\n        }\n    },\n    /**\n     * Read the local files, based on the offset read in the central part.\n     */\n    readLocalFiles: function() {\n        var i, file;\n        for (i = 0; i < this.files.length; i++) {\n            file = this.files[i];\n            this.reader.setIndex(file.localHeaderOffset);\n            this.checkSignature(sig.LOCAL_FILE_HEADER);\n            file.readLocalPart(this.reader);\n            file.handleUTF8();\n            file.processAttributes();\n        }\n    },\n    /**\n     * Read the central directory.\n     */\n    readCentralDir: function() {\n        var file;\n\n        this.reader.setIndex(this.centralDirOffset);\n        while (this.reader.readAndCheckSignature(sig.CENTRAL_FILE_HEADER)) {\n            file = new ZipEntry({\n                zip64: this.zip64\n            }, this.loadOptions);\n            file.readCentralPart(this.reader);\n            this.files.push(file);\n        }\n\n        if (this.centralDirRecords !== this.files.length) {\n            if (this.centralDirRecords !== 0 && this.files.length === 0) {\n                // We expected some records but couldn't find ANY.\n                // This is really suspicious, as if something went wrong.\n                throw new Error(\"Corrupted zip or bug: expected \" + this.centralDirRecords + \" records in central dir, got \" + this.files.length);\n            } else {\n                // We found some records but not all.\n                // Something is wrong but we got something for the user: no error here.\n                // console.warn(\"expected\", this.centralDirRecords, \"records in central dir, got\", this.files.length);\n            }\n        }\n    },\n    /**\n     * Read the end of central directory.\n     */\n    readEndOfCentral: function() {\n        var offset = this.reader.lastIndexOfSignature(sig.CENTRAL_DIRECTORY_END);\n        if (offset < 0) {\n            // Check if the content is a truncated zip or complete garbage.\n            // A \"LOCAL_FILE_HEADER\" is not required at the beginning (auto\n            // extractible zip for example) but it can give a good hint.\n            // If an ajax request was used without responseType, we will also\n            // get unreadable data.\n            var isGarbage = !this.isSignature(0, sig.LOCAL_FILE_HEADER);\n\n            if (isGarbage) {\n                throw new Error(\"Can't find end of central directory : is this a zip file ? \" +\n                                \"If it is, see https://stuk.github.io/jszip/documentation/howto/read_zip.html\");\n            } else {\n                throw new Error(\"Corrupted zip: can't find end of central directory\");\n            }\n\n        }\n        this.reader.setIndex(offset);\n        var endOfCentralDirOffset = offset;\n        this.checkSignature(sig.CENTRAL_DIRECTORY_END);\n        this.readBlockEndOfCentral();\n\n\n        /* extract from the zip spec :\n            4)  If one of the fields in the end of central directory\n                record is too small to hold required data, the field\n                should be set to -1 (0xFFFF or 0xFFFFFFFF) and the\n                ZIP64 format record should be created.\n            5)  The end of central directory record and the\n                Zip64 end of central directory locator record must\n                reside on the same disk when splitting or spanning\n                an archive.\n         */\n        if (this.diskNumber === utils.MAX_VALUE_16BITS || this.diskWithCentralDirStart === utils.MAX_VALUE_16BITS || this.centralDirRecordsOnThisDisk === utils.MAX_VALUE_16BITS || this.centralDirRecords === utils.MAX_VALUE_16BITS || this.centralDirSize === utils.MAX_VALUE_32BITS || this.centralDirOffset === utils.MAX_VALUE_32BITS) {\n            this.zip64 = true;\n\n            /*\n            Warning : the zip64 extension is supported, but ONLY if the 64bits integer read from\n            the zip file can fit into a 32bits integer. This cannot be solved : JavaScript represents\n            all numbers as 64-bit double precision IEEE 754 floating point numbers.\n            So, we have 53bits for integers and bitwise operations treat everything as 32bits.\n            see https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Bitwise_Operators\n            and http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf section 8.5\n            */\n\n            // should look for a zip64 EOCD locator\n            offset = this.reader.lastIndexOfSignature(sig.ZIP64_CENTRAL_DIRECTORY_LOCATOR);\n            if (offset < 0) {\n                throw new Error(\"Corrupted zip: can't find the ZIP64 end of central directory locator\");\n            }\n            this.reader.setIndex(offset);\n            this.checkSignature(sig.ZIP64_CENTRAL_DIRECTORY_LOCATOR);\n            this.readBlockZip64EndOfCentralLocator();\n\n            // now the zip64 EOCD record\n            if (!this.isSignature(this.relativeOffsetEndOfZip64CentralDir, sig.ZIP64_CENTRAL_DIRECTORY_END)) {\n                // console.warn(\"ZIP64 end of central directory not where expected.\");\n                this.relativeOffsetEndOfZip64CentralDir = this.reader.lastIndexOfSignature(sig.ZIP64_CENTRAL_DIRECTORY_END);\n                if (this.relativeOffsetEndOfZip64CentralDir < 0) {\n                    throw new Error(\"Corrupted zip: can't find the ZIP64 end of central directory\");\n                }\n            }\n            this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir);\n            this.checkSignature(sig.ZIP64_CENTRAL_DIRECTORY_END);\n            this.readBlockZip64EndOfCentral();\n        }\n\n        var expectedEndOfCentralDirOffset = this.centralDirOffset + this.centralDirSize;\n        if (this.zip64) {\n            expectedEndOfCentralDirOffset += 20; // end of central dir 64 locator\n            expectedEndOfCentralDirOffset += 12 /* should not include the leading 12 bytes */ + this.zip64EndOfCentralSize;\n        }\n\n        var extraBytes = endOfCentralDirOffset - expectedEndOfCentralDirOffset;\n\n        if (extraBytes > 0) {\n            // console.warn(extraBytes, \"extra bytes at beginning or within zipfile\");\n            if (this.isSignature(endOfCentralDirOffset, sig.CENTRAL_FILE_HEADER)) {\n                // The offsets seem wrong, but we have something at the specified offset.\n                // So… we keep it.\n            } else {\n                // the offset is wrong, update the \"zero\" of the reader\n                // this happens if data has been prepended (crx files for example)\n                this.reader.zero = extraBytes;\n            }\n        } else if (extraBytes < 0) {\n            throw new Error(\"Corrupted zip: missing \" + Math.abs(extraBytes) + \" bytes.\");\n        }\n    },\n    prepareReader: function(data) {\n        this.reader = readerFor(data);\n    },\n    /**\n     * Read a zip file and create ZipEntries.\n     * @param {String|ArrayBuffer|Uint8Array|Buffer} data the binary string representing a zip file.\n     */\n    load: function(data) {\n        this.prepareReader(data);\n        this.readEndOfCentral();\n        this.readCentralDir();\n        this.readLocalFiles();\n    }\n};\n// }}} end of ZipEntries\nmodule.exports = ZipEntries;\n\n},{\"./reader/readerFor\":22,\"./signature\":23,\"./support\":30,\"./utf8\":31,\"./utils\":32,\"./zipEntry\":34}],34:[function(require,module,exports){\n'use strict';\nvar readerFor = require('./reader/readerFor');\nvar utils = require('./utils');\nvar CompressedObject = require('./compressedObject');\nvar crc32fn = require('./crc32');\nvar utf8 = require('./utf8');\nvar compressions = require('./compressions');\nvar support = require('./support');\n\nvar MADE_BY_DOS = 0x00;\nvar MADE_BY_UNIX = 0x03;\n\n/**\n * Find a compression registered in JSZip.\n * @param {string} compressionMethod the method magic to find.\n * @return {Object|null} the JSZip compression object, null if none found.\n */\nvar findCompression = function(compressionMethod) {\n    for (var method in compressions) {\n        if (!compressions.hasOwnProperty(method)) {\n            continue;\n        }\n        if (compressions[method].magic === compressionMethod) {\n            return compressions[method];\n        }\n    }\n    return null;\n};\n\n// class ZipEntry {{{\n/**\n * An entry in the zip file.\n * @constructor\n * @param {Object} options Options of the current file.\n * @param {Object} loadOptions Options for loading the stream.\n */\nfunction ZipEntry(options, loadOptions) {\n    this.options = options;\n    this.loadOptions = loadOptions;\n}\nZipEntry.prototype = {\n    /**\n     * say if the file is encrypted.\n     * @return {boolean} true if the file is encrypted, false otherwise.\n     */\n    isEncrypted: function() {\n        // bit 1 is set\n        return (this.bitFlag & 0x0001) === 0x0001;\n    },\n    /**\n     * say if the file has utf-8 filename/comment.\n     * @return {boolean} true if the filename/comment is in utf-8, false otherwise.\n     */\n    useUTF8: function() {\n        // bit 11 is set\n        return (this.bitFlag & 0x0800) === 0x0800;\n    },\n    /**\n     * Read the local part of a zip file and add the info in this object.\n     * @param {DataReader} reader the reader to use.\n     */\n    readLocalPart: function(reader) {\n        var compression, localExtraFieldsLength;\n\n        // we already know everything from the central dir !\n        // If the central dir data are false, we are doomed.\n        // On the bright side, the local part is scary  : zip64, data descriptors, both, etc.\n        // The less data we get here, the more reliable this should be.\n        // Let's skip the whole header and dash to the data !\n        reader.skip(22);\n        // in some zip created on windows, the filename stored in the central dir contains \\ instead of /.\n        // Strangely, the filename here is OK.\n        // I would love to treat these zip files as corrupted (see http://www.info-zip.org/FAQ.html#backslashes\n        // or APPNOTE#4.4.17.1, \"All slashes MUST be forward slashes '/'\") but there are a lot of bad zip generators...\n        // Search \"unzip mismatching \"local\" filename continuing with \"central\" filename version\" on\n        // the internet.\n        //\n        // I think I see the logic here : the central directory is used to display\n        // content and the local directory is used to extract the files. Mixing / and \\\n        // may be used to display \\ to windows users and use / when extracting the files.\n        // Unfortunately, this lead also to some issues : http://seclists.org/fulldisclosure/2009/Sep/394\n        this.fileNameLength = reader.readInt(2);\n        localExtraFieldsLength = reader.readInt(2); // can't be sure this will be the same as the central dir\n        // the fileName is stored as binary data, the handleUTF8 method will take care of the encoding.\n        this.fileName = reader.readData(this.fileNameLength);\n        reader.skip(localExtraFieldsLength);\n\n        if (this.compressedSize === -1 || this.uncompressedSize === -1) {\n            throw new Error(\"Bug or corrupted zip : didn't get enough informations from the central directory \" + \"(compressedSize === -1 || uncompressedSize === -1)\");\n        }\n\n        compression = findCompression(this.compressionMethod);\n        if (compression === null) { // no compression found\n            throw new Error(\"Corrupted zip : compression \" + utils.pretty(this.compressionMethod) + \" unknown (inner file : \" + utils.transformTo(\"string\", this.fileName) + \")\");\n        }\n        this.decompressed = new CompressedObject(this.compressedSize, this.uncompressedSize, this.crc32, compression, reader.readData(this.compressedSize));\n    },\n\n    /**\n     * Read the central part of a zip file and add the info in this object.\n     * @param {DataReader} reader the reader to use.\n     */\n    readCentralPart: function(reader) {\n        this.versionMadeBy = reader.readInt(2);\n        reader.skip(2);\n        // this.versionNeeded = reader.readInt(2);\n        this.bitFlag = reader.readInt(2);\n        this.compressionMethod = reader.readString(2);\n        this.date = reader.readDate();\n        this.crc32 = reader.readInt(4);\n        this.compressedSize = reader.readInt(4);\n        this.uncompressedSize = reader.readInt(4);\n        var fileNameLength = reader.readInt(2);\n        this.extraFieldsLength = reader.readInt(2);\n        this.fileCommentLength = reader.readInt(2);\n        this.diskNumberStart = reader.readInt(2);\n        this.internalFileAttributes = reader.readInt(2);\n        this.externalFileAttributes = reader.readInt(4);\n        this.localHeaderOffset = reader.readInt(4);\n\n        if (this.isEncrypted()) {\n            throw new Error(\"Encrypted zip are not supported\");\n        }\n\n        // will be read in the local part, see the comments there\n        reader.skip(fileNameLength);\n        this.readExtraFields(reader);\n        this.parseZIP64ExtraField(reader);\n        this.fileComment = reader.readData(this.fileCommentLength);\n    },\n\n    /**\n     * Parse the external file attributes and get the unix/dos permissions.\n     */\n    processAttributes: function () {\n        this.unixPermissions = null;\n        this.dosPermissions = null;\n        var madeBy = this.versionMadeBy >> 8;\n\n        // Check if we have the DOS directory flag set.\n        // We look for it in the DOS and UNIX permissions\n        // but some unknown platform could set it as a compatibility flag.\n        this.dir = this.externalFileAttributes & 0x0010 ? true : false;\n\n        if(madeBy === MADE_BY_DOS) {\n            // first 6 bits (0 to 5)\n            this.dosPermissions = this.externalFileAttributes & 0x3F;\n        }\n\n        if(madeBy === MADE_BY_UNIX) {\n            this.unixPermissions = (this.externalFileAttributes >> 16) & 0xFFFF;\n            // the octal permissions are in (this.unixPermissions & 0x01FF).toString(8);\n        }\n\n        // fail safe : if the name ends with a / it probably means a folder\n        if (!this.dir && this.fileNameStr.slice(-1) === '/') {\n            this.dir = true;\n        }\n    },\n\n    /**\n     * Parse the ZIP64 extra field and merge the info in the current ZipEntry.\n     * @param {DataReader} reader the reader to use.\n     */\n    parseZIP64ExtraField: function(reader) {\n\n        if (!this.extraFields[0x0001]) {\n            return;\n        }\n\n        // should be something, preparing the extra reader\n        var extraReader = readerFor(this.extraFields[0x0001].value);\n\n        // I really hope that these 64bits integer can fit in 32 bits integer, because js\n        // won't let us have more.\n        if (this.uncompressedSize === utils.MAX_VALUE_32BITS) {\n            this.uncompressedSize = extraReader.readInt(8);\n        }\n        if (this.compressedSize === utils.MAX_VALUE_32BITS) {\n            this.compressedSize = extraReader.readInt(8);\n        }\n        if (this.localHeaderOffset === utils.MAX_VALUE_32BITS) {\n            this.localHeaderOffset = extraReader.readInt(8);\n        }\n        if (this.diskNumberStart === utils.MAX_VALUE_32BITS) {\n            this.diskNumberStart = extraReader.readInt(4);\n        }\n    },\n    /**\n     * Read the central part of a zip file and add the info in this object.\n     * @param {DataReader} reader the reader to use.\n     */\n    readExtraFields: function(reader) {\n        var end = reader.index + this.extraFieldsLength,\n            extraFieldId,\n            extraFieldLength,\n            extraFieldValue;\n\n        if (!this.extraFields) {\n            this.extraFields = {};\n        }\n\n        while (reader.index < end) {\n            extraFieldId = reader.readInt(2);\n            extraFieldLength = reader.readInt(2);\n            extraFieldValue = reader.readData(extraFieldLength);\n\n            this.extraFields[extraFieldId] = {\n                id: extraFieldId,\n                length: extraFieldLength,\n                value: extraFieldValue\n            };\n        }\n    },\n    /**\n     * Apply an UTF8 transformation if needed.\n     */\n    handleUTF8: function() {\n        var decodeParamType = support.uint8array ? \"uint8array\" : \"array\";\n        if (this.useUTF8()) {\n            this.fileNameStr = utf8.utf8decode(this.fileName);\n            this.fileCommentStr = utf8.utf8decode(this.fileComment);\n        } else {\n            var upath = this.findExtraFieldUnicodePath();\n            if (upath !== null) {\n                this.fileNameStr = upath;\n            } else {\n                // ASCII text or unsupported code page\n                var fileNameByteArray =  utils.transformTo(decodeParamType, this.fileName);\n                this.fileNameStr = this.loadOptions.decodeFileName(fileNameByteArray);\n            }\n\n            var ucomment = this.findExtraFieldUnicodeComment();\n            if (ucomment !== null) {\n                this.fileCommentStr = ucomment;\n            } else {\n                // ASCII text or unsupported code page\n                var commentByteArray =  utils.transformTo(decodeParamType, this.fileComment);\n                this.fileCommentStr = this.loadOptions.decodeFileName(commentByteArray);\n            }\n        }\n    },\n\n    /**\n     * Find the unicode path declared in the extra field, if any.\n     * @return {String} the unicode path, null otherwise.\n     */\n    findExtraFieldUnicodePath: function() {\n        var upathField = this.extraFields[0x7075];\n        if (upathField) {\n            var extraReader = readerFor(upathField.value);\n\n            // wrong version\n            if (extraReader.readInt(1) !== 1) {\n                return null;\n            }\n\n            // the crc of the filename changed, this field is out of date.\n            if (crc32fn(this.fileName) !== extraReader.readInt(4)) {\n                return null;\n            }\n\n            return utf8.utf8decode(extraReader.readData(upathField.length - 5));\n        }\n        return null;\n    },\n\n    /**\n     * Find the unicode comment declared in the extra field, if any.\n     * @return {String} the unicode comment, null otherwise.\n     */\n    findExtraFieldUnicodeComment: function() {\n        var ucommentField = this.extraFields[0x6375];\n        if (ucommentField) {\n            var extraReader = readerFor(ucommentField.value);\n\n            // wrong version\n            if (extraReader.readInt(1) !== 1) {\n                return null;\n            }\n\n            // the crc of the comment changed, this field is out of date.\n            if (crc32fn(this.fileComment) !== extraReader.readInt(4)) {\n                return null;\n            }\n\n            return utf8.utf8decode(extraReader.readData(ucommentField.length - 5));\n        }\n        return null;\n    }\n};\nmodule.exports = ZipEntry;\n\n},{\"./compressedObject\":2,\"./compressions\":3,\"./crc32\":4,\"./reader/readerFor\":22,\"./support\":30,\"./utf8\":31,\"./utils\":32}],35:[function(require,module,exports){\n'use strict';\n\nvar StreamHelper = require('./stream/StreamHelper');\nvar DataWorker = require('./stream/DataWorker');\nvar utf8 = require('./utf8');\nvar CompressedObject = require('./compressedObject');\nvar GenericWorker = require('./stream/GenericWorker');\n\n/**\n * A simple object representing a file in the zip file.\n * @constructor\n * @param {string} name the name of the file\n * @param {String|ArrayBuffer|Uint8Array|Buffer} data the data\n * @param {Object} options the options of the file\n */\nvar ZipObject = function(name, data, options) {\n    this.name = name;\n    this.dir = options.dir;\n    this.date = options.date;\n    this.comment = options.comment;\n    this.unixPermissions = options.unixPermissions;\n    this.dosPermissions = options.dosPermissions;\n\n    this._data = data;\n    this._dataBinary = options.binary;\n    // keep only the compression\n    this.options = {\n        compression : options.compression,\n        compressionOptions : options.compressionOptions\n    };\n};\n\nZipObject.prototype = {\n    /**\n     * Create an internal stream for the content of this object.\n     * @param {String} type the type of each chunk.\n     * @return StreamHelper the stream.\n     */\n    internalStream: function (type) {\n        var result = null, outputType = \"string\";\n        try {\n            if (!type) {\n                throw new Error(\"No output type specified.\");\n            }\n            outputType = type.toLowerCase();\n            var askUnicodeString = outputType === \"string\" || outputType === \"text\";\n            if (outputType === \"binarystring\" || outputType === \"text\") {\n                outputType = \"string\";\n            }\n            result = this._decompressWorker();\n\n            var isUnicodeString = !this._dataBinary;\n\n            if (isUnicodeString && !askUnicodeString) {\n                result = result.pipe(new utf8.Utf8EncodeWorker());\n            }\n            if (!isUnicodeString && askUnicodeString) {\n                result = result.pipe(new utf8.Utf8DecodeWorker());\n            }\n        } catch (e) {\n            result = new GenericWorker(\"error\");\n            result.error(e);\n        }\n\n        return new StreamHelper(result, outputType, \"\");\n    },\n\n    /**\n     * Prepare the content in the asked type.\n     * @param {String} type the type of the result.\n     * @param {Function} onUpdate a function to call on each internal update.\n     * @return Promise the promise of the result.\n     */\n    async: function (type, onUpdate) {\n        return this.internalStream(type).accumulate(onUpdate);\n    },\n\n    /**\n     * Prepare the content as a nodejs stream.\n     * @param {String} type the type of each chunk.\n     * @param {Function} onUpdate a function to call on each internal update.\n     * @return Stream the stream.\n     */\n    nodeStream: function (type, onUpdate) {\n        return this.internalStream(type || \"nodebuffer\").toNodejsStream(onUpdate);\n    },\n\n    /**\n     * Return a worker for the compressed content.\n     * @private\n     * @param {Object} compression the compression object to use.\n     * @param {Object} compressionOptions the options to use when compressing.\n     * @return Worker the worker.\n     */\n    _compressWorker: function (compression, compressionOptions) {\n        if (\n            this._data instanceof CompressedObject &&\n            this._data.compression.magic === compression.magic\n        ) {\n            return this._data.getCompressedWorker();\n        } else {\n            var result = this._decompressWorker();\n            if(!this._dataBinary) {\n                result = result.pipe(new utf8.Utf8EncodeWorker());\n            }\n            return CompressedObject.createWorkerFrom(result, compression, compressionOptions);\n        }\n    },\n    /**\n     * Return a worker for the decompressed content.\n     * @private\n     * @return Worker the worker.\n     */\n    _decompressWorker : function () {\n        if (this._data instanceof CompressedObject) {\n            return this._data.getContentWorker();\n        } else if (this._data instanceof GenericWorker) {\n            return this._data;\n        } else {\n            return new DataWorker(this._data);\n        }\n    }\n};\n\nvar removedMethods = [\"asText\", \"asBinary\", \"asNodeBuffer\", \"asUint8Array\", \"asArrayBuffer\"];\nvar removedFn = function () {\n    throw new Error(\"This method has been removed in JSZip 3.0, please check the upgrade guide.\");\n};\n\nfor(var i = 0; i < removedMethods.length; i++) {\n    ZipObject.prototype[removedMethods[i]] = removedFn;\n}\nmodule.exports = ZipObject;\n\n},{\"./compressedObject\":2,\"./stream/DataWorker\":27,\"./stream/GenericWorker\":28,\"./stream/StreamHelper\":29,\"./utf8\":31}],36:[function(require,module,exports){\n(function (global){\n'use strict';\nvar Mutation = global.MutationObserver || global.WebKitMutationObserver;\n\nvar scheduleDrain;\n\n{\n  if (Mutation) {\n    var called = 0;\n    var observer = new Mutation(nextTick);\n    var element = global.document.createTextNode('');\n    observer.observe(element, {\n      characterData: true\n    });\n    scheduleDrain = function () {\n      element.data = (called = ++called % 2);\n    };\n  } else if (!global.setImmediate && typeof global.MessageChannel !== 'undefined') {\n    var channel = new global.MessageChannel();\n    channel.port1.onmessage = nextTick;\n    scheduleDrain = function () {\n      channel.port2.postMessage(0);\n    };\n  } else if ('document' in global && 'onreadystatechange' in global.document.createElement('script')) {\n    scheduleDrain = function () {\n\n      // Create a <script> element; its readystatechange event will be fired asynchronously once it is inserted\n      // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called.\n      var scriptEl = global.document.createElement('script');\n      scriptEl.onreadystatechange = function () {\n        nextTick();\n\n        scriptEl.onreadystatechange = null;\n        scriptEl.parentNode.removeChild(scriptEl);\n        scriptEl = null;\n      };\n      global.document.documentElement.appendChild(scriptEl);\n    };\n  } else {\n    scheduleDrain = function () {\n      setTimeout(nextTick, 0);\n    };\n  }\n}\n\nvar draining;\nvar queue = [];\n//named nextTick for less confusing stack traces\nfunction nextTick() {\n  draining = true;\n  var i, oldQueue;\n  var len = queue.length;\n  while (len) {\n    oldQueue = queue;\n    queue = [];\n    i = -1;\n    while (++i < len) {\n      oldQueue[i]();\n    }\n    len = queue.length;\n  }\n  draining = false;\n}\n\nmodule.exports = immediate;\nfunction immediate(task) {\n  if (queue.push(task) === 1 && !draining) {\n    scheduleDrain();\n  }\n}\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{}],37:[function(require,module,exports){\n'use strict';\nvar immediate = require('immediate');\n\n/* istanbul ignore next */\nfunction INTERNAL() {}\n\nvar handlers = {};\n\nvar REJECTED = ['REJECTED'];\nvar FULFILLED = ['FULFILLED'];\nvar PENDING = ['PENDING'];\n\nmodule.exports = Promise;\n\nfunction Promise(resolver) {\n  if (typeof resolver !== 'function') {\n    throw new TypeError('resolver must be a function');\n  }\n  this.state = PENDING;\n  this.queue = [];\n  this.outcome = void 0;\n  if (resolver !== INTERNAL) {\n    safelyResolveThenable(this, resolver);\n  }\n}\n\nPromise.prototype[\"finally\"] = function (callback) {\n  if (typeof callback !== 'function') {\n    return this;\n  }\n  var p = this.constructor;\n  return this.then(resolve, reject);\n\n  function resolve(value) {\n    function yes () {\n      return value;\n    }\n    return p.resolve(callback()).then(yes);\n  }\n  function reject(reason) {\n    function no () {\n      throw reason;\n    }\n    return p.resolve(callback()).then(no);\n  }\n};\nPromise.prototype[\"catch\"] = function (onRejected) {\n  return this.then(null, onRejected);\n};\nPromise.prototype.then = function (onFulfilled, onRejected) {\n  if (typeof onFulfilled !== 'function' && this.state === FULFILLED ||\n    typeof onRejected !== 'function' && this.state === REJECTED) {\n    return this;\n  }\n  var promise = new this.constructor(INTERNAL);\n  if (this.state !== PENDING) {\n    var resolver = this.state === FULFILLED ? onFulfilled : onRejected;\n    unwrap(promise, resolver, this.outcome);\n  } else {\n    this.queue.push(new QueueItem(promise, onFulfilled, onRejected));\n  }\n\n  return promise;\n};\nfunction QueueItem(promise, onFulfilled, onRejected) {\n  this.promise = promise;\n  if (typeof onFulfilled === 'function') {\n    this.onFulfilled = onFulfilled;\n    this.callFulfilled = this.otherCallFulfilled;\n  }\n  if (typeof onRejected === 'function') {\n    this.onRejected = onRejected;\n    this.callRejected = this.otherCallRejected;\n  }\n}\nQueueItem.prototype.callFulfilled = function (value) {\n  handlers.resolve(this.promise, value);\n};\nQueueItem.prototype.otherCallFulfilled = function (value) {\n  unwrap(this.promise, this.onFulfilled, value);\n};\nQueueItem.prototype.callRejected = function (value) {\n  handlers.reject(this.promise, value);\n};\nQueueItem.prototype.otherCallRejected = function (value) {\n  unwrap(this.promise, this.onRejected, value);\n};\n\nfunction unwrap(promise, func, value) {\n  immediate(function () {\n    var returnValue;\n    try {\n      returnValue = func(value);\n    } catch (e) {\n      return handlers.reject(promise, e);\n    }\n    if (returnValue === promise) {\n      handlers.reject(promise, new TypeError('Cannot resolve promise with itself'));\n    } else {\n      handlers.resolve(promise, returnValue);\n    }\n  });\n}\n\nhandlers.resolve = function (self, value) {\n  var result = tryCatch(getThen, value);\n  if (result.status === 'error') {\n    return handlers.reject(self, result.value);\n  }\n  var thenable = result.value;\n\n  if (thenable) {\n    safelyResolveThenable(self, thenable);\n  } else {\n    self.state = FULFILLED;\n    self.outcome = value;\n    var i = -1;\n    var len = self.queue.length;\n    while (++i < len) {\n      self.queue[i].callFulfilled(value);\n    }\n  }\n  return self;\n};\nhandlers.reject = function (self, error) {\n  self.state = REJECTED;\n  self.outcome = error;\n  var i = -1;\n  var len = self.queue.length;\n  while (++i < len) {\n    self.queue[i].callRejected(error);\n  }\n  return self;\n};\n\nfunction getThen(obj) {\n  // Make sure we only access the accessor once as required by the spec\n  var then = obj && obj.then;\n  if (obj && (typeof obj === 'object' || typeof obj === 'function') && typeof then === 'function') {\n    return function appyThen() {\n      then.apply(obj, arguments);\n    };\n  }\n}\n\nfunction safelyResolveThenable(self, thenable) {\n  // Either fulfill, reject or reject with error\n  var called = false;\n  function onError(value) {\n    if (called) {\n      return;\n    }\n    called = true;\n    handlers.reject(self, value);\n  }\n\n  function onSuccess(value) {\n    if (called) {\n      return;\n    }\n    called = true;\n    handlers.resolve(self, value);\n  }\n\n  function tryToUnwrap() {\n    thenable(onSuccess, onError);\n  }\n\n  var result = tryCatch(tryToUnwrap);\n  if (result.status === 'error') {\n    onError(result.value);\n  }\n}\n\nfunction tryCatch(func, value) {\n  var out = {};\n  try {\n    out.value = func(value);\n    out.status = 'success';\n  } catch (e) {\n    out.status = 'error';\n    out.value = e;\n  }\n  return out;\n}\n\nPromise.resolve = resolve;\nfunction resolve(value) {\n  if (value instanceof this) {\n    return value;\n  }\n  return handlers.resolve(new this(INTERNAL), value);\n}\n\nPromise.reject = reject;\nfunction reject(reason) {\n  var promise = new this(INTERNAL);\n  return handlers.reject(promise, reason);\n}\n\nPromise.all = all;\nfunction all(iterable) {\n  var self = this;\n  if (Object.prototype.toString.call(iterable) !== '[object Array]') {\n    return this.reject(new TypeError('must be an array'));\n  }\n\n  var len = iterable.length;\n  var called = false;\n  if (!len) {\n    return this.resolve([]);\n  }\n\n  var values = new Array(len);\n  var resolved = 0;\n  var i = -1;\n  var promise = new this(INTERNAL);\n\n  while (++i < len) {\n    allResolver(iterable[i], i);\n  }\n  return promise;\n  function allResolver(value, i) {\n    self.resolve(value).then(resolveFromAll, function (error) {\n      if (!called) {\n        called = true;\n        handlers.reject(promise, error);\n      }\n    });\n    function resolveFromAll(outValue) {\n      values[i] = outValue;\n      if (++resolved === len && !called) {\n        called = true;\n        handlers.resolve(promise, values);\n      }\n    }\n  }\n}\n\nPromise.race = race;\nfunction race(iterable) {\n  var self = this;\n  if (Object.prototype.toString.call(iterable) !== '[object Array]') {\n    return this.reject(new TypeError('must be an array'));\n  }\n\n  var len = iterable.length;\n  var called = false;\n  if (!len) {\n    return this.resolve([]);\n  }\n\n  var i = -1;\n  var promise = new this(INTERNAL);\n\n  while (++i < len) {\n    resolver(iterable[i]);\n  }\n  return promise;\n  function resolver(value) {\n    self.resolve(value).then(function (response) {\n      if (!called) {\n        called = true;\n        handlers.resolve(promise, response);\n      }\n    }, function (error) {\n      if (!called) {\n        called = true;\n        handlers.reject(promise, error);\n      }\n    });\n  }\n}\n\n},{\"immediate\":36}],38:[function(require,module,exports){\n// Top level file is just a mixin of submodules & constants\n'use strict';\n\nvar assign    = require('./lib/utils/common').assign;\n\nvar deflate   = require('./lib/deflate');\nvar inflate   = require('./lib/inflate');\nvar constants = require('./lib/zlib/constants');\n\nvar pako = {};\n\nassign(pako, deflate, inflate, constants);\n\nmodule.exports = pako;\n\n},{\"./lib/deflate\":39,\"./lib/inflate\":40,\"./lib/utils/common\":41,\"./lib/zlib/constants\":44}],39:[function(require,module,exports){\n'use strict';\n\n\nvar zlib_deflate = require('./zlib/deflate');\nvar utils        = require('./utils/common');\nvar strings      = require('./utils/strings');\nvar msg          = require('./zlib/messages');\nvar ZStream      = require('./zlib/zstream');\n\nvar toString = Object.prototype.toString;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nvar Z_NO_FLUSH      = 0;\nvar Z_FINISH        = 4;\n\nvar Z_OK            = 0;\nvar Z_STREAM_END    = 1;\nvar Z_SYNC_FLUSH    = 2;\n\nvar Z_DEFAULT_COMPRESSION = -1;\n\nvar Z_DEFAULT_STRATEGY    = 0;\n\nvar Z_DEFLATED  = 8;\n\n/* ===========================================================================*/\n\n\n/**\n * class Deflate\n *\n * Generic JS-style wrapper for zlib calls. If you don't need\n * streaming behaviour - use more simple functions: [[deflate]],\n * [[deflateRaw]] and [[gzip]].\n **/\n\n/* internal\n * Deflate.chunks -> Array\n *\n * Chunks of output data, if [[Deflate#onData]] not overriden.\n **/\n\n/**\n * Deflate.result -> Uint8Array|Array\n *\n * Compressed result, generated by default [[Deflate#onData]]\n * and [[Deflate#onEnd]] handlers. Filled after you push last chunk\n * (call [[Deflate#push]] with `Z_FINISH` / `true` param)  or if you\n * push a chunk with explicit flush (call [[Deflate#push]] with\n * `Z_SYNC_FLUSH` param).\n **/\n\n/**\n * Deflate.err -> Number\n *\n * Error code after deflate finished. 0 (Z_OK) on success.\n * You will not need it in real life, because deflate errors\n * are possible only on wrong options or bad `onData` / `onEnd`\n * custom handlers.\n **/\n\n/**\n * Deflate.msg -> String\n *\n * Error message, if [[Deflate.err]] != 0\n **/\n\n\n/**\n * new Deflate(options)\n * - options (Object): zlib deflate options.\n *\n * Creates new deflator instance with specified params. Throws exception\n * on bad params. Supported options:\n *\n * - `level`\n * - `windowBits`\n * - `memLevel`\n * - `strategy`\n * - `dictionary`\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Additional options, for internal needs:\n *\n * - `chunkSize` - size of generated data chunks (16K by default)\n * - `raw` (Boolean) - do raw deflate\n * - `gzip` (Boolean) - create gzip wrapper\n * - `to` (String) - if equal to 'string', then result will be \"binary string\"\n *    (each char code [0..255])\n * - `header` (Object) - custom header for gzip\n *   - `text` (Boolean) - true if compressed data believed to be text\n *   - `time` (Number) - modification time, unix timestamp\n *   - `os` (Number) - operation system code\n *   - `extra` (Array) - array of bytes with extra data (max 65536)\n *   - `name` (String) - file name (binary string)\n *   - `comment` (String) - comment (binary string)\n *   - `hcrc` (Boolean) - true if header crc should be added\n *\n * ##### Example:\n *\n * ```javascript\n * var pako = require('pako')\n *   , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9])\n *   , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]);\n *\n * var deflate = new pako.Deflate({ level: 3});\n *\n * deflate.push(chunk1, false);\n * deflate.push(chunk2, true);  // true -> last chunk\n *\n * if (deflate.err) { throw new Error(deflate.err); }\n *\n * console.log(deflate.result);\n * ```\n **/\nfunction Deflate(options) {\n  if (!(this instanceof Deflate)) return new Deflate(options);\n\n  this.options = utils.assign({\n    level: Z_DEFAULT_COMPRESSION,\n    method: Z_DEFLATED,\n    chunkSize: 16384,\n    windowBits: 15,\n    memLevel: 8,\n    strategy: Z_DEFAULT_STRATEGY,\n    to: ''\n  }, options || {});\n\n  var opt = this.options;\n\n  if (opt.raw && (opt.windowBits > 0)) {\n    opt.windowBits = -opt.windowBits;\n  }\n\n  else if (opt.gzip && (opt.windowBits > 0) && (opt.windowBits < 16)) {\n    opt.windowBits += 16;\n  }\n\n  this.err    = 0;      // error code, if happens (0 = Z_OK)\n  this.msg    = '';     // error message\n  this.ended  = false;  // used to avoid multiple onEnd() calls\n  this.chunks = [];     // chunks of compressed data\n\n  this.strm = new ZStream();\n  this.strm.avail_out = 0;\n\n  var status = zlib_deflate.deflateInit2(\n    this.strm,\n    opt.level,\n    opt.method,\n    opt.windowBits,\n    opt.memLevel,\n    opt.strategy\n  );\n\n  if (status !== Z_OK) {\n    throw new Error(msg[status]);\n  }\n\n  if (opt.header) {\n    zlib_deflate.deflateSetHeader(this.strm, opt.header);\n  }\n\n  if (opt.dictionary) {\n    var dict;\n    // Convert data if needed\n    if (typeof opt.dictionary === 'string') {\n      // If we need to compress text, change encoding to utf8.\n      dict = strings.string2buf(opt.dictionary);\n    } else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') {\n      dict = new Uint8Array(opt.dictionary);\n    } else {\n      dict = opt.dictionary;\n    }\n\n    status = zlib_deflate.deflateSetDictionary(this.strm, dict);\n\n    if (status !== Z_OK) {\n      throw new Error(msg[status]);\n    }\n\n    this._dict_set = true;\n  }\n}\n\n/**\n * Deflate#push(data[, mode]) -> Boolean\n * - data (Uint8Array|Array|ArrayBuffer|String): input data. Strings will be\n *   converted to utf8 byte sequence.\n * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.\n *   See constants. Skipped or `false` means Z_NO_FLUSH, `true` meansh Z_FINISH.\n *\n * Sends input data to deflate pipe, generating [[Deflate#onData]] calls with\n * new compressed chunks. Returns `true` on success. The last data block must have\n * mode Z_FINISH (or `true`). That will flush internal pending buffers and call\n * [[Deflate#onEnd]]. For interim explicit flushes (without ending the stream) you\n * can use mode Z_SYNC_FLUSH, keeping the compression context.\n *\n * On fail call [[Deflate#onEnd]] with error code and return false.\n *\n * We strongly recommend to use `Uint8Array` on input for best speed (output\n * array format is detected automatically). Also, don't skip last param and always\n * use the same type in your code (boolean or number). That will improve JS speed.\n *\n * For regular `Array`-s make sure all elements are [0..255].\n *\n * ##### Example\n *\n * ```javascript\n * push(chunk, false); // push one of data chunks\n * ...\n * push(chunk, true);  // push last chunk\n * ```\n **/\nDeflate.prototype.push = function (data, mode) {\n  var strm = this.strm;\n  var chunkSize = this.options.chunkSize;\n  var status, _mode;\n\n  if (this.ended) { return false; }\n\n  _mode = (mode === ~~mode) ? mode : ((mode === true) ? Z_FINISH : Z_NO_FLUSH);\n\n  // Convert data if needed\n  if (typeof data === 'string') {\n    // If we need to compress text, change encoding to utf8.\n    strm.input = strings.string2buf(data);\n  } else if (toString.call(data) === '[object ArrayBuffer]') {\n    strm.input = new Uint8Array(data);\n  } else {\n    strm.input = data;\n  }\n\n  strm.next_in = 0;\n  strm.avail_in = strm.input.length;\n\n  do {\n    if (strm.avail_out === 0) {\n      strm.output = new utils.Buf8(chunkSize);\n      strm.next_out = 0;\n      strm.avail_out = chunkSize;\n    }\n    status = zlib_deflate.deflate(strm, _mode);    /* no bad return value */\n\n    if (status !== Z_STREAM_END && status !== Z_OK) {\n      this.onEnd(status);\n      this.ended = true;\n      return false;\n    }\n    if (strm.avail_out === 0 || (strm.avail_in === 0 && (_mode === Z_FINISH || _mode === Z_SYNC_FLUSH))) {\n      if (this.options.to === 'string') {\n        this.onData(strings.buf2binstring(utils.shrinkBuf(strm.output, strm.next_out)));\n      } else {\n        this.onData(utils.shrinkBuf(strm.output, strm.next_out));\n      }\n    }\n  } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== Z_STREAM_END);\n\n  // Finalize on the last chunk.\n  if (_mode === Z_FINISH) {\n    status = zlib_deflate.deflateEnd(this.strm);\n    this.onEnd(status);\n    this.ended = true;\n    return status === Z_OK;\n  }\n\n  // callback interim results if Z_SYNC_FLUSH.\n  if (_mode === Z_SYNC_FLUSH) {\n    this.onEnd(Z_OK);\n    strm.avail_out = 0;\n    return true;\n  }\n\n  return true;\n};\n\n\n/**\n * Deflate#onData(chunk) -> Void\n * - chunk (Uint8Array|Array|String): ouput data. Type of array depends\n *   on js engine support. When string output requested, each chunk\n *   will be string.\n *\n * By default, stores data blocks in `chunks[]` property and glue\n * those in `onEnd`. Override this handler, if you need another behaviour.\n **/\nDeflate.prototype.onData = function (chunk) {\n  this.chunks.push(chunk);\n};\n\n\n/**\n * Deflate#onEnd(status) -> Void\n * - status (Number): deflate status. 0 (Z_OK) on success,\n *   other if not.\n *\n * Called once after you tell deflate that the input stream is\n * complete (Z_FINISH) or should be flushed (Z_SYNC_FLUSH)\n * or if an error happened. By default - join collected chunks,\n * free memory and fill `results` / `err` properties.\n **/\nDeflate.prototype.onEnd = function (status) {\n  // On success - join\n  if (status === Z_OK) {\n    if (this.options.to === 'string') {\n      this.result = this.chunks.join('');\n    } else {\n      this.result = utils.flattenChunks(this.chunks);\n    }\n  }\n  this.chunks = [];\n  this.err = status;\n  this.msg = this.strm.msg;\n};\n\n\n/**\n * deflate(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * Compress `data` with deflate algorithm and `options`.\n *\n * Supported options are:\n *\n * - level\n * - windowBits\n * - memLevel\n * - strategy\n * - dictionary\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Sugar (options):\n *\n * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify\n *   negative windowBits implicitly.\n * - `to` (String) - if equal to 'string', then result will be \"binary string\"\n *    (each char code [0..255])\n *\n * ##### Example:\n *\n * ```javascript\n * var pako = require('pako')\n *   , data = Uint8Array([1,2,3,4,5,6,7,8,9]);\n *\n * console.log(pako.deflate(data));\n * ```\n **/\nfunction deflate(input, options) {\n  var deflator = new Deflate(options);\n\n  deflator.push(input, true);\n\n  // That will never happens, if you don't cheat with options :)\n  if (deflator.err) { throw deflator.msg || msg[deflator.err]; }\n\n  return deflator.result;\n}\n\n\n/**\n * deflateRaw(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * The same as [[deflate]], but creates raw data, without wrapper\n * (header and adler32 crc).\n **/\nfunction deflateRaw(input, options) {\n  options = options || {};\n  options.raw = true;\n  return deflate(input, options);\n}\n\n\n/**\n * gzip(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * The same as [[deflate]], but create gzip wrapper instead of\n * deflate one.\n **/\nfunction gzip(input, options) {\n  options = options || {};\n  options.gzip = true;\n  return deflate(input, options);\n}\n\n\nexports.Deflate = Deflate;\nexports.deflate = deflate;\nexports.deflateRaw = deflateRaw;\nexports.gzip = gzip;\n\n},{\"./utils/common\":41,\"./utils/strings\":42,\"./zlib/deflate\":46,\"./zlib/messages\":51,\"./zlib/zstream\":53}],40:[function(require,module,exports){\n'use strict';\n\n\nvar zlib_inflate = require('./zlib/inflate');\nvar utils        = require('./utils/common');\nvar strings      = require('./utils/strings');\nvar c            = require('./zlib/constants');\nvar msg          = require('./zlib/messages');\nvar ZStream      = require('./zlib/zstream');\nvar GZheader     = require('./zlib/gzheader');\n\nvar toString = Object.prototype.toString;\n\n/**\n * class Inflate\n *\n * Generic JS-style wrapper for zlib calls. If you don't need\n * streaming behaviour - use more simple functions: [[inflate]]\n * and [[inflateRaw]].\n **/\n\n/* internal\n * inflate.chunks -> Array\n *\n * Chunks of output data, if [[Inflate#onData]] not overriden.\n **/\n\n/**\n * Inflate.result -> Uint8Array|Array|String\n *\n * Uncompressed result, generated by default [[Inflate#onData]]\n * and [[Inflate#onEnd]] handlers. Filled after you push last chunk\n * (call [[Inflate#push]] with `Z_FINISH` / `true` param) or if you\n * push a chunk with explicit flush (call [[Inflate#push]] with\n * `Z_SYNC_FLUSH` param).\n **/\n\n/**\n * Inflate.err -> Number\n *\n * Error code after inflate finished. 0 (Z_OK) on success.\n * Should be checked if broken data possible.\n **/\n\n/**\n * Inflate.msg -> String\n *\n * Error message, if [[Inflate.err]] != 0\n **/\n\n\n/**\n * new Inflate(options)\n * - options (Object): zlib inflate options.\n *\n * Creates new inflator instance with specified params. Throws exception\n * on bad params. Supported options:\n *\n * - `windowBits`\n * - `dictionary`\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Additional options, for internal needs:\n *\n * - `chunkSize` - size of generated data chunks (16K by default)\n * - `raw` (Boolean) - do raw inflate\n * - `to` (String) - if equal to 'string', then result will be converted\n *   from utf8 to utf16 (javascript) string. When string output requested,\n *   chunk length can differ from `chunkSize`, depending on content.\n *\n * By default, when no options set, autodetect deflate/gzip data format via\n * wrapper header.\n *\n * ##### Example:\n *\n * ```javascript\n * var pako = require('pako')\n *   , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9])\n *   , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]);\n *\n * var inflate = new pako.Inflate({ level: 3});\n *\n * inflate.push(chunk1, false);\n * inflate.push(chunk2, true);  // true -> last chunk\n *\n * if (inflate.err) { throw new Error(inflate.err); }\n *\n * console.log(inflate.result);\n * ```\n **/\nfunction Inflate(options) {\n  if (!(this instanceof Inflate)) return new Inflate(options);\n\n  this.options = utils.assign({\n    chunkSize: 16384,\n    windowBits: 0,\n    to: ''\n  }, options || {});\n\n  var opt = this.options;\n\n  // Force window size for `raw` data, if not set directly,\n  // because we have no header for autodetect.\n  if (opt.raw && (opt.windowBits >= 0) && (opt.windowBits < 16)) {\n    opt.windowBits = -opt.windowBits;\n    if (opt.windowBits === 0) { opt.windowBits = -15; }\n  }\n\n  // If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate\n  if ((opt.windowBits >= 0) && (opt.windowBits < 16) &&\n      !(options && options.windowBits)) {\n    opt.windowBits += 32;\n  }\n\n  // Gzip header has no info about windows size, we can do autodetect only\n  // for deflate. So, if window size not set, force it to max when gzip possible\n  if ((opt.windowBits > 15) && (opt.windowBits < 48)) {\n    // bit 3 (16) -> gzipped data\n    // bit 4 (32) -> autodetect gzip/deflate\n    if ((opt.windowBits & 15) === 0) {\n      opt.windowBits |= 15;\n    }\n  }\n\n  this.err    = 0;      // error code, if happens (0 = Z_OK)\n  this.msg    = '';     // error message\n  this.ended  = false;  // used to avoid multiple onEnd() calls\n  this.chunks = [];     // chunks of compressed data\n\n  this.strm   = new ZStream();\n  this.strm.avail_out = 0;\n\n  var status  = zlib_inflate.inflateInit2(\n    this.strm,\n    opt.windowBits\n  );\n\n  if (status !== c.Z_OK) {\n    throw new Error(msg[status]);\n  }\n\n  this.header = new GZheader();\n\n  zlib_inflate.inflateGetHeader(this.strm, this.header);\n}\n\n/**\n * Inflate#push(data[, mode]) -> Boolean\n * - data (Uint8Array|Array|ArrayBuffer|String): input data\n * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.\n *   See constants. Skipped or `false` means Z_NO_FLUSH, `true` meansh Z_FINISH.\n *\n * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with\n * new output chunks. Returns `true` on success. The last data block must have\n * mode Z_FINISH (or `true`). That will flush internal pending buffers and call\n * [[Inflate#onEnd]]. For interim explicit flushes (without ending the stream) you\n * can use mode Z_SYNC_FLUSH, keeping the decompression context.\n *\n * On fail call [[Inflate#onEnd]] with error code and return false.\n *\n * We strongly recommend to use `Uint8Array` on input for best speed (output\n * format is detected automatically). Also, don't skip last param and always\n * use the same type in your code (boolean or number). That will improve JS speed.\n *\n * For regular `Array`-s make sure all elements are [0..255].\n *\n * ##### Example\n *\n * ```javascript\n * push(chunk, false); // push one of data chunks\n * ...\n * push(chunk, true);  // push last chunk\n * ```\n **/\nInflate.prototype.push = function (data, mode) {\n  var strm = this.strm;\n  var chunkSize = this.options.chunkSize;\n  var dictionary = this.options.dictionary;\n  var status, _mode;\n  var next_out_utf8, tail, utf8str;\n  var dict;\n\n  // Flag to properly process Z_BUF_ERROR on testing inflate call\n  // when we check that all output data was flushed.\n  var allowBufError = false;\n\n  if (this.ended) { return false; }\n  _mode = (mode === ~~mode) ? mode : ((mode === true) ? c.Z_FINISH : c.Z_NO_FLUSH);\n\n  // Convert data if needed\n  if (typeof data === 'string') {\n    // Only binary strings can be decompressed on practice\n    strm.input = strings.binstring2buf(data);\n  } else if (toString.call(data) === '[object ArrayBuffer]') {\n    strm.input = new Uint8Array(data);\n  } else {\n    strm.input = data;\n  }\n\n  strm.next_in = 0;\n  strm.avail_in = strm.input.length;\n\n  do {\n    if (strm.avail_out === 0) {\n      strm.output = new utils.Buf8(chunkSize);\n      strm.next_out = 0;\n      strm.avail_out = chunkSize;\n    }\n\n    status = zlib_inflate.inflate(strm, c.Z_NO_FLUSH);    /* no bad return value */\n\n    if (status === c.Z_NEED_DICT && dictionary) {\n      // Convert data if needed\n      if (typeof dictionary === 'string') {\n        dict = strings.string2buf(dictionary);\n      } else if (toString.call(dictionary) === '[object ArrayBuffer]') {\n        dict = new Uint8Array(dictionary);\n      } else {\n        dict = dictionary;\n      }\n\n      status = zlib_inflate.inflateSetDictionary(this.strm, dict);\n\n    }\n\n    if (status === c.Z_BUF_ERROR && allowBufError === true) {\n      status = c.Z_OK;\n      allowBufError = false;\n    }\n\n    if (status !== c.Z_STREAM_END && status !== c.Z_OK) {\n      this.onEnd(status);\n      this.ended = true;\n      return false;\n    }\n\n    if (strm.next_out) {\n      if (strm.avail_out === 0 || status === c.Z_STREAM_END || (strm.avail_in === 0 && (_mode === c.Z_FINISH || _mode === c.Z_SYNC_FLUSH))) {\n\n        if (this.options.to === 'string') {\n\n          next_out_utf8 = strings.utf8border(strm.output, strm.next_out);\n\n          tail = strm.next_out - next_out_utf8;\n          utf8str = strings.buf2string(strm.output, next_out_utf8);\n\n          // move tail\n          strm.next_out = tail;\n          strm.avail_out = chunkSize - tail;\n          if (tail) { utils.arraySet(strm.output, strm.output, next_out_utf8, tail, 0); }\n\n          this.onData(utf8str);\n\n        } else {\n          this.onData(utils.shrinkBuf(strm.output, strm.next_out));\n        }\n      }\n    }\n\n    // When no more input data, we should check that internal inflate buffers\n    // are flushed. The only way to do it when avail_out = 0 - run one more\n    // inflate pass. But if output data not exists, inflate return Z_BUF_ERROR.\n    // Here we set flag to process this error properly.\n    //\n    // NOTE. Deflate does not return error in this case and does not needs such\n    // logic.\n    if (strm.avail_in === 0 && strm.avail_out === 0) {\n      allowBufError = true;\n    }\n\n  } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== c.Z_STREAM_END);\n\n  if (status === c.Z_STREAM_END) {\n    _mode = c.Z_FINISH;\n  }\n\n  // Finalize on the last chunk.\n  if (_mode === c.Z_FINISH) {\n    status = zlib_inflate.inflateEnd(this.strm);\n    this.onEnd(status);\n    this.ended = true;\n    return status === c.Z_OK;\n  }\n\n  // callback interim results if Z_SYNC_FLUSH.\n  if (_mode === c.Z_SYNC_FLUSH) {\n    this.onEnd(c.Z_OK);\n    strm.avail_out = 0;\n    return true;\n  }\n\n  return true;\n};\n\n\n/**\n * Inflate#onData(chunk) -> Void\n * - chunk (Uint8Array|Array|String): ouput data. Type of array depends\n *   on js engine support. When string output requested, each chunk\n *   will be string.\n *\n * By default, stores data blocks in `chunks[]` property and glue\n * those in `onEnd`. Override this handler, if you need another behaviour.\n **/\nInflate.prototype.onData = function (chunk) {\n  this.chunks.push(chunk);\n};\n\n\n/**\n * Inflate#onEnd(status) -> Void\n * - status (Number): inflate status. 0 (Z_OK) on success,\n *   other if not.\n *\n * Called either after you tell inflate that the input stream is\n * complete (Z_FINISH) or should be flushed (Z_SYNC_FLUSH)\n * or if an error happened. By default - join collected chunks,\n * free memory and fill `results` / `err` properties.\n **/\nInflate.prototype.onEnd = function (status) {\n  // On success - join\n  if (status === c.Z_OK) {\n    if (this.options.to === 'string') {\n      // Glue & convert here, until we teach pako to send\n      // utf8 alligned strings to onData\n      this.result = this.chunks.join('');\n    } else {\n      this.result = utils.flattenChunks(this.chunks);\n    }\n  }\n  this.chunks = [];\n  this.err = status;\n  this.msg = this.strm.msg;\n};\n\n\n/**\n * inflate(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Decompress `data` with inflate/ungzip and `options`. Autodetect\n * format via wrapper header by default. That's why we don't provide\n * separate `ungzip` method.\n *\n * Supported options are:\n *\n * - windowBits\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information.\n *\n * Sugar (options):\n *\n * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify\n *   negative windowBits implicitly.\n * - `to` (String) - if equal to 'string', then result will be converted\n *   from utf8 to utf16 (javascript) string. When string output requested,\n *   chunk length can differ from `chunkSize`, depending on content.\n *\n *\n * ##### Example:\n *\n * ```javascript\n * var pako = require('pako')\n *   , input = pako.deflate([1,2,3,4,5,6,7,8,9])\n *   , output;\n *\n * try {\n *   output = pako.inflate(input);\n * } catch (err)\n *   console.log(err);\n * }\n * ```\n **/\nfunction inflate(input, options) {\n  var inflator = new Inflate(options);\n\n  inflator.push(input, true);\n\n  // That will never happens, if you don't cheat with options :)\n  if (inflator.err) { throw inflator.msg || msg[inflator.err]; }\n\n  return inflator.result;\n}\n\n\n/**\n * inflateRaw(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * The same as [[inflate]], but creates raw data, without wrapper\n * (header and adler32 crc).\n **/\nfunction inflateRaw(input, options) {\n  options = options || {};\n  options.raw = true;\n  return inflate(input, options);\n}\n\n\n/**\n * ungzip(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Just shortcut to [[inflate]], because it autodetects format\n * by header.content. Done for convenience.\n **/\n\n\nexports.Inflate = Inflate;\nexports.inflate = inflate;\nexports.inflateRaw = inflateRaw;\nexports.ungzip  = inflate;\n\n},{\"./utils/common\":41,\"./utils/strings\":42,\"./zlib/constants\":44,\"./zlib/gzheader\":47,\"./zlib/inflate\":49,\"./zlib/messages\":51,\"./zlib/zstream\":53}],41:[function(require,module,exports){\n'use strict';\n\n\nvar TYPED_OK =  (typeof Uint8Array !== 'undefined') &&\n                (typeof Uint16Array !== 'undefined') &&\n                (typeof Int32Array !== 'undefined');\n\n\nexports.assign = function (obj /*from1, from2, from3, ...*/) {\n  var sources = Array.prototype.slice.call(arguments, 1);\n  while (sources.length) {\n    var source = sources.shift();\n    if (!source) { continue; }\n\n    if (typeof source !== 'object') {\n      throw new TypeError(source + 'must be non-object');\n    }\n\n    for (var p in source) {\n      if (source.hasOwnProperty(p)) {\n        obj[p] = source[p];\n      }\n    }\n  }\n\n  return obj;\n};\n\n\n// reduce buffer size, avoiding mem copy\nexports.shrinkBuf = function (buf, size) {\n  if (buf.length === size) { return buf; }\n  if (buf.subarray) { return buf.subarray(0, size); }\n  buf.length = size;\n  return buf;\n};\n\n\nvar fnTyped = {\n  arraySet: function (dest, src, src_offs, len, dest_offs) {\n    if (src.subarray && dest.subarray) {\n      dest.set(src.subarray(src_offs, src_offs + len), dest_offs);\n      return;\n    }\n    // Fallback to ordinary array\n    for (var i = 0; i < len; i++) {\n      dest[dest_offs + i] = src[src_offs + i];\n    }\n  },\n  // Join array of chunks to single array.\n  flattenChunks: function (chunks) {\n    var i, l, len, pos, chunk, result;\n\n    // calculate data length\n    len = 0;\n    for (i = 0, l = chunks.length; i < l; i++) {\n      len += chunks[i].length;\n    }\n\n    // join chunks\n    result = new Uint8Array(len);\n    pos = 0;\n    for (i = 0, l = chunks.length; i < l; i++) {\n      chunk = chunks[i];\n      result.set(chunk, pos);\n      pos += chunk.length;\n    }\n\n    return result;\n  }\n};\n\nvar fnUntyped = {\n  arraySet: function (dest, src, src_offs, len, dest_offs) {\n    for (var i = 0; i < len; i++) {\n      dest[dest_offs + i] = src[src_offs + i];\n    }\n  },\n  // Join array of chunks to single array.\n  flattenChunks: function (chunks) {\n    return [].concat.apply([], chunks);\n  }\n};\n\n\n// Enable/Disable typed arrays use, for testing\n//\nexports.setTyped = function (on) {\n  if (on) {\n    exports.Buf8  = Uint8Array;\n    exports.Buf16 = Uint16Array;\n    exports.Buf32 = Int32Array;\n    exports.assign(exports, fnTyped);\n  } else {\n    exports.Buf8  = Array;\n    exports.Buf16 = Array;\n    exports.Buf32 = Array;\n    exports.assign(exports, fnUntyped);\n  }\n};\n\nexports.setTyped(TYPED_OK);\n\n},{}],42:[function(require,module,exports){\n// String encode/decode helpers\n'use strict';\n\n\nvar utils = require('./common');\n\n\n// Quick check if we can use fast array to bin string conversion\n//\n// - apply(Array) can fail on Android 2.2\n// - apply(Uint8Array) can fail on iOS 5.1 Safary\n//\nvar STR_APPLY_OK = true;\nvar STR_APPLY_UIA_OK = true;\n\ntry { String.fromCharCode.apply(null, [ 0 ]); } catch (__) { STR_APPLY_OK = false; }\ntry { String.fromCharCode.apply(null, new Uint8Array(1)); } catch (__) { STR_APPLY_UIA_OK = false; }\n\n\n// Table with utf8 lengths (calculated by first byte of sequence)\n// Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS,\n// because max possible codepoint is 0x10ffff\nvar _utf8len = new utils.Buf8(256);\nfor (var q = 0; q < 256; q++) {\n  _utf8len[q] = (q >= 252 ? 6 : q >= 248 ? 5 : q >= 240 ? 4 : q >= 224 ? 3 : q >= 192 ? 2 : 1);\n}\n_utf8len[254] = _utf8len[254] = 1; // Invalid sequence start\n\n\n// convert string to array (typed, when possible)\nexports.string2buf = function (str) {\n  var buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0;\n\n  // count binary size\n  for (m_pos = 0; m_pos < str_len; m_pos++) {\n    c = str.charCodeAt(m_pos);\n    if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {\n      c2 = str.charCodeAt(m_pos + 1);\n      if ((c2 & 0xfc00) === 0xdc00) {\n        c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n        m_pos++;\n      }\n    }\n    buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4;\n  }\n\n  // allocate buffer\n  buf = new utils.Buf8(buf_len);\n\n  // convert\n  for (i = 0, m_pos = 0; i < buf_len; m_pos++) {\n    c = str.charCodeAt(m_pos);\n    if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {\n      c2 = str.charCodeAt(m_pos + 1);\n      if ((c2 & 0xfc00) === 0xdc00) {\n        c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n        m_pos++;\n      }\n    }\n    if (c < 0x80) {\n      /* one byte */\n      buf[i++] = c;\n    } else if (c < 0x800) {\n      /* two bytes */\n      buf[i++] = 0xC0 | (c >>> 6);\n      buf[i++] = 0x80 | (c & 0x3f);\n    } else if (c < 0x10000) {\n      /* three bytes */\n      buf[i++] = 0xE0 | (c >>> 12);\n      buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n      buf[i++] = 0x80 | (c & 0x3f);\n    } else {\n      /* four bytes */\n      buf[i++] = 0xf0 | (c >>> 18);\n      buf[i++] = 0x80 | (c >>> 12 & 0x3f);\n      buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n      buf[i++] = 0x80 | (c & 0x3f);\n    }\n  }\n\n  return buf;\n};\n\n// Helper (used in 2 places)\nfunction buf2binstring(buf, len) {\n  // use fallback for big arrays to avoid stack overflow\n  if (len < 65537) {\n    if ((buf.subarray && STR_APPLY_UIA_OK) || (!buf.subarray && STR_APPLY_OK)) {\n      return String.fromCharCode.apply(null, utils.shrinkBuf(buf, len));\n    }\n  }\n\n  var result = '';\n  for (var i = 0; i < len; i++) {\n    result += String.fromCharCode(buf[i]);\n  }\n  return result;\n}\n\n\n// Convert byte array to binary string\nexports.buf2binstring = function (buf) {\n  return buf2binstring(buf, buf.length);\n};\n\n\n// Convert binary string (typed, when possible)\nexports.binstring2buf = function (str) {\n  var buf = new utils.Buf8(str.length);\n  for (var i = 0, len = buf.length; i < len; i++) {\n    buf[i] = str.charCodeAt(i);\n  }\n  return buf;\n};\n\n\n// convert array to string\nexports.buf2string = function (buf, max) {\n  var i, out, c, c_len;\n  var len = max || buf.length;\n\n  // Reserve max possible length (2 words per char)\n  // NB: by unknown reasons, Array is significantly faster for\n  //     String.fromCharCode.apply than Uint16Array.\n  var utf16buf = new Array(len * 2);\n\n  for (out = 0, i = 0; i < len;) {\n    c = buf[i++];\n    // quick process ascii\n    if (c < 0x80) { utf16buf[out++] = c; continue; }\n\n    c_len = _utf8len[c];\n    // skip 5 & 6 byte codes\n    if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len - 1; continue; }\n\n    // apply mask on first byte\n    c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;\n    // join the rest\n    while (c_len > 1 && i < len) {\n      c = (c << 6) | (buf[i++] & 0x3f);\n      c_len--;\n    }\n\n    // terminated by end of string?\n    if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; }\n\n    if (c < 0x10000) {\n      utf16buf[out++] = c;\n    } else {\n      c -= 0x10000;\n      utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff);\n      utf16buf[out++] = 0xdc00 | (c & 0x3ff);\n    }\n  }\n\n  return buf2binstring(utf16buf, out);\n};\n\n\n// Calculate max possible position in utf8 buffer,\n// that will not break sequence. If that's not possible\n// - (very small limits) return max size as is.\n//\n// buf[] - utf8 bytes array\n// max   - length limit (mandatory);\nexports.utf8border = function (buf, max) {\n  var pos;\n\n  max = max || buf.length;\n  if (max > buf.length) { max = buf.length; }\n\n  // go back from last position, until start of sequence found\n  pos = max - 1;\n  while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; }\n\n  // Fuckup - very small and broken sequence,\n  // return max, because we should return something anyway.\n  if (pos < 0) { return max; }\n\n  // If we came to start of buffer - that means vuffer is too small,\n  // return max too.\n  if (pos === 0) { return max; }\n\n  return (pos + _utf8len[buf[pos]] > max) ? pos : max;\n};\n\n},{\"./common\":41}],43:[function(require,module,exports){\n'use strict';\n\n// Note: adler32 takes 12% for level 0 and 2% for level 6.\n// It doesn't worth to make additional optimizationa as in original.\n// Small size is preferable.\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nfunction adler32(adler, buf, len, pos) {\n  var s1 = (adler & 0xffff) |0,\n      s2 = ((adler >>> 16) & 0xffff) |0,\n      n = 0;\n\n  while (len !== 0) {\n    // Set limit ~ twice less than 5552, to keep\n    // s2 in 31-bits, because we force signed ints.\n    // in other case %= will fail.\n    n = len > 2000 ? 2000 : len;\n    len -= n;\n\n    do {\n      s1 = (s1 + buf[pos++]) |0;\n      s2 = (s2 + s1) |0;\n    } while (--n);\n\n    s1 %= 65521;\n    s2 %= 65521;\n  }\n\n  return (s1 | (s2 << 16)) |0;\n}\n\n\nmodule.exports = adler32;\n\n},{}],44:[function(require,module,exports){\n'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nmodule.exports = {\n\n  /* Allowed flush values; see deflate() and inflate() below for details */\n  Z_NO_FLUSH:         0,\n  Z_PARTIAL_FLUSH:    1,\n  Z_SYNC_FLUSH:       2,\n  Z_FULL_FLUSH:       3,\n  Z_FINISH:           4,\n  Z_BLOCK:            5,\n  Z_TREES:            6,\n\n  /* Return codes for the compression/decompression functions. Negative values\n  * are errors, positive values are used for special but normal events.\n  */\n  Z_OK:               0,\n  Z_STREAM_END:       1,\n  Z_NEED_DICT:        2,\n  Z_ERRNO:           -1,\n  Z_STREAM_ERROR:    -2,\n  Z_DATA_ERROR:      -3,\n  //Z_MEM_ERROR:     -4,\n  Z_BUF_ERROR:       -5,\n  //Z_VERSION_ERROR: -6,\n\n  /* compression levels */\n  Z_NO_COMPRESSION:         0,\n  Z_BEST_SPEED:             1,\n  Z_BEST_COMPRESSION:       9,\n  Z_DEFAULT_COMPRESSION:   -1,\n\n\n  Z_FILTERED:               1,\n  Z_HUFFMAN_ONLY:           2,\n  Z_RLE:                    3,\n  Z_FIXED:                  4,\n  Z_DEFAULT_STRATEGY:       0,\n\n  /* Possible values of the data_type field (though see inflate()) */\n  Z_BINARY:                 0,\n  Z_TEXT:                   1,\n  //Z_ASCII:                1, // = Z_TEXT (deprecated)\n  Z_UNKNOWN:                2,\n\n  /* The deflate compression method */\n  Z_DEFLATED:               8\n  //Z_NULL:                 null // Use -1 or null inline, depending on var type\n};\n\n},{}],45:[function(require,module,exports){\n'use strict';\n\n// Note: we can't get significant speed boost here.\n// So write code to minimize size - no pregenerated tables\n// and array tools dependencies.\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n// Use ordinary array, since untyped makes no boost here\nfunction makeTable() {\n  var c, table = [];\n\n  for (var n = 0; n < 256; n++) {\n    c = n;\n    for (var k = 0; k < 8; k++) {\n      c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));\n    }\n    table[n] = c;\n  }\n\n  return table;\n}\n\n// Create table on load. Just 255 signed longs. Not a problem.\nvar crcTable = makeTable();\n\n\nfunction crc32(crc, buf, len, pos) {\n  var t = crcTable,\n      end = pos + len;\n\n  crc ^= -1;\n\n  for (var i = pos; i < end; i++) {\n    crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF];\n  }\n\n  return (crc ^ (-1)); // >>> 0;\n}\n\n\nmodule.exports = crc32;\n\n},{}],46:[function(require,module,exports){\n'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nvar utils   = require('../utils/common');\nvar trees   = require('./trees');\nvar adler32 = require('./adler32');\nvar crc32   = require('./crc32');\nvar msg     = require('./messages');\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\n\n/* Allowed flush values; see deflate() and inflate() below for details */\nvar Z_NO_FLUSH      = 0;\nvar Z_PARTIAL_FLUSH = 1;\n//var Z_SYNC_FLUSH    = 2;\nvar Z_FULL_FLUSH    = 3;\nvar Z_FINISH        = 4;\nvar Z_BLOCK         = 5;\n//var Z_TREES         = 6;\n\n\n/* Return codes for the compression/decompression functions. Negative values\n * are errors, positive values are used for special but normal events.\n */\nvar Z_OK            = 0;\nvar Z_STREAM_END    = 1;\n//var Z_NEED_DICT     = 2;\n//var Z_ERRNO         = -1;\nvar Z_STREAM_ERROR  = -2;\nvar Z_DATA_ERROR    = -3;\n//var Z_MEM_ERROR     = -4;\nvar Z_BUF_ERROR     = -5;\n//var Z_VERSION_ERROR = -6;\n\n\n/* compression levels */\n//var Z_NO_COMPRESSION      = 0;\n//var Z_BEST_SPEED          = 1;\n//var Z_BEST_COMPRESSION    = 9;\nvar Z_DEFAULT_COMPRESSION = -1;\n\n\nvar Z_FILTERED            = 1;\nvar Z_HUFFMAN_ONLY        = 2;\nvar Z_RLE                 = 3;\nvar Z_FIXED               = 4;\nvar Z_DEFAULT_STRATEGY    = 0;\n\n/* Possible values of the data_type field (though see inflate()) */\n//var Z_BINARY              = 0;\n//var Z_TEXT                = 1;\n//var Z_ASCII               = 1; // = Z_TEXT\nvar Z_UNKNOWN             = 2;\n\n\n/* The deflate compression method */\nvar Z_DEFLATED  = 8;\n\n/*============================================================================*/\n\n\nvar MAX_MEM_LEVEL = 9;\n/* Maximum value for memLevel in deflateInit2 */\nvar MAX_WBITS = 15;\n/* 32K LZ77 window */\nvar DEF_MEM_LEVEL = 8;\n\n\nvar LENGTH_CODES  = 29;\n/* number of length codes, not counting the special END_BLOCK code */\nvar LITERALS      = 256;\n/* number of literal bytes 0..255 */\nvar L_CODES       = LITERALS + 1 + LENGTH_CODES;\n/* number of Literal or Length codes, including the END_BLOCK code */\nvar D_CODES       = 30;\n/* number of distance codes */\nvar BL_CODES      = 19;\n/* number of codes used to transfer the bit lengths */\nvar HEAP_SIZE     = 2 * L_CODES + 1;\n/* maximum heap size */\nvar MAX_BITS  = 15;\n/* All codes must not exceed MAX_BITS bits */\n\nvar MIN_MATCH = 3;\nvar MAX_MATCH = 258;\nvar MIN_LOOKAHEAD = (MAX_MATCH + MIN_MATCH + 1);\n\nvar PRESET_DICT = 0x20;\n\nvar INIT_STATE = 42;\nvar EXTRA_STATE = 69;\nvar NAME_STATE = 73;\nvar COMMENT_STATE = 91;\nvar HCRC_STATE = 103;\nvar BUSY_STATE = 113;\nvar FINISH_STATE = 666;\n\nvar BS_NEED_MORE      = 1; /* block not completed, need more input or more output */\nvar BS_BLOCK_DONE     = 2; /* block flush performed */\nvar BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */\nvar BS_FINISH_DONE    = 4; /* finish done, accept no more input or output */\n\nvar OS_CODE = 0x03; // Unix :) . Don't detect, use this default.\n\nfunction err(strm, errorCode) {\n  strm.msg = msg[errorCode];\n  return errorCode;\n}\n\nfunction rank(f) {\n  return ((f) << 1) - ((f) > 4 ? 9 : 0);\n}\n\nfunction zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } }\n\n\n/* =========================================================================\n * Flush as much pending output as possible. All deflate() output goes\n * through this function so some applications may wish to modify it\n * to avoid allocating a large strm->output buffer and copying into it.\n * (See also read_buf()).\n */\nfunction flush_pending(strm) {\n  var s = strm.state;\n\n  //_tr_flush_bits(s);\n  var len = s.pending;\n  if (len > strm.avail_out) {\n    len = strm.avail_out;\n  }\n  if (len === 0) { return; }\n\n  utils.arraySet(strm.output, s.pending_buf, s.pending_out, len, strm.next_out);\n  strm.next_out += len;\n  s.pending_out += len;\n  strm.total_out += len;\n  strm.avail_out -= len;\n  s.pending -= len;\n  if (s.pending === 0) {\n    s.pending_out = 0;\n  }\n}\n\n\nfunction flush_block_only(s, last) {\n  trees._tr_flush_block(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last);\n  s.block_start = s.strstart;\n  flush_pending(s.strm);\n}\n\n\nfunction put_byte(s, b) {\n  s.pending_buf[s.pending++] = b;\n}\n\n\n/* =========================================================================\n * Put a short in the pending buffer. The 16-bit value is put in MSB order.\n * IN assertion: the stream state is correct and there is enough room in\n * pending_buf.\n */\nfunction putShortMSB(s, b) {\n//  put_byte(s, (Byte)(b >> 8));\n//  put_byte(s, (Byte)(b & 0xff));\n  s.pending_buf[s.pending++] = (b >>> 8) & 0xff;\n  s.pending_buf[s.pending++] = b & 0xff;\n}\n\n\n/* ===========================================================================\n * Read a new buffer from the current input stream, update the adler32\n * and total number of bytes read.  All deflate() input goes through\n * this function so some applications may wish to modify it to avoid\n * allocating a large strm->input buffer and copying from it.\n * (See also flush_pending()).\n */\nfunction read_buf(strm, buf, start, size) {\n  var len = strm.avail_in;\n\n  if (len > size) { len = size; }\n  if (len === 0) { return 0; }\n\n  strm.avail_in -= len;\n\n  // zmemcpy(buf, strm->next_in, len);\n  utils.arraySet(buf, strm.input, strm.next_in, len, start);\n  if (strm.state.wrap === 1) {\n    strm.adler = adler32(strm.adler, buf, len, start);\n  }\n\n  else if (strm.state.wrap === 2) {\n    strm.adler = crc32(strm.adler, buf, len, start);\n  }\n\n  strm.next_in += len;\n  strm.total_in += len;\n\n  return len;\n}\n\n\n/* ===========================================================================\n * Set match_start to the longest match starting at the given string and\n * return its length. Matches shorter or equal to prev_length are discarded,\n * in which case the result is equal to prev_length and match_start is\n * garbage.\n * IN assertions: cur_match is the head of the hash chain for the current\n *   string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1\n * OUT assertion: the match length is not greater than s->lookahead.\n */\nfunction longest_match(s, cur_match) {\n  var chain_length = s.max_chain_length;      /* max hash chain length */\n  var scan = s.strstart; /* current string */\n  var match;                       /* matched string */\n  var len;                           /* length of current match */\n  var best_len = s.prev_length;              /* best match length so far */\n  var nice_match = s.nice_match;             /* stop if match long enough */\n  var limit = (s.strstart > (s.w_size - MIN_LOOKAHEAD)) ?\n      s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0/*NIL*/;\n\n  var _win = s.window; // shortcut\n\n  var wmask = s.w_mask;\n  var prev  = s.prev;\n\n  /* Stop when cur_match becomes <= limit. To simplify the code,\n   * we prevent matches with the string of window index 0.\n   */\n\n  var strend = s.strstart + MAX_MATCH;\n  var scan_end1  = _win[scan + best_len - 1];\n  var scan_end   = _win[scan + best_len];\n\n  /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.\n   * It is easy to get rid of this optimization if necessary.\n   */\n  // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, \"Code too clever\");\n\n  /* Do not waste too much time if we already have a good match: */\n  if (s.prev_length >= s.good_match) {\n    chain_length >>= 2;\n  }\n  /* Do not look for matches beyond the end of the input. This is necessary\n   * to make deflate deterministic.\n   */\n  if (nice_match > s.lookahead) { nice_match = s.lookahead; }\n\n  // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, \"need lookahead\");\n\n  do {\n    // Assert(cur_match < s->strstart, \"no future\");\n    match = cur_match;\n\n    /* Skip to next match if the match length cannot increase\n     * or if the match length is less than 2.  Note that the checks below\n     * for insufficient lookahead only occur occasionally for performance\n     * reasons.  Therefore uninitialized memory will be accessed, and\n     * conditional jumps will be made that depend on those values.\n     * However the length of the match is limited to the lookahead, so\n     * the output of deflate is not affected by the uninitialized values.\n     */\n\n    if (_win[match + best_len]     !== scan_end  ||\n        _win[match + best_len - 1] !== scan_end1 ||\n        _win[match]                !== _win[scan] ||\n        _win[++match]              !== _win[scan + 1]) {\n      continue;\n    }\n\n    /* The check at best_len-1 can be removed because it will be made\n     * again later. (This heuristic is not always a win.)\n     * It is not necessary to compare scan[2] and match[2] since they\n     * are always equal when the other bytes match, given that\n     * the hash keys are equal and that HASH_BITS >= 8.\n     */\n    scan += 2;\n    match++;\n    // Assert(*scan == *match, \"match[2]?\");\n\n    /* We check for insufficient lookahead only every 8th comparison;\n     * the 256th check will be made at strstart+258.\n     */\n    do {\n      /*jshint noempty:false*/\n    } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n             _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n             _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n             _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n             scan < strend);\n\n    // Assert(scan <= s->window+(unsigned)(s->window_size-1), \"wild scan\");\n\n    len = MAX_MATCH - (strend - scan);\n    scan = strend - MAX_MATCH;\n\n    if (len > best_len) {\n      s.match_start = cur_match;\n      best_len = len;\n      if (len >= nice_match) {\n        break;\n      }\n      scan_end1  = _win[scan + best_len - 1];\n      scan_end   = _win[scan + best_len];\n    }\n  } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0);\n\n  if (best_len <= s.lookahead) {\n    return best_len;\n  }\n  return s.lookahead;\n}\n\n\n/* ===========================================================================\n * Fill the window when the lookahead becomes insufficient.\n * Updates strstart and lookahead.\n *\n * IN assertion: lookahead < MIN_LOOKAHEAD\n * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD\n *    At least one byte has been read, or avail_in == 0; reads are\n *    performed for at least two bytes (required for the zip translate_eol\n *    option -- not supported here).\n */\nfunction fill_window(s) {\n  var _w_size = s.w_size;\n  var p, n, m, more, str;\n\n  //Assert(s->lookahead < MIN_LOOKAHEAD, \"already enough lookahead\");\n\n  do {\n    more = s.window_size - s.lookahead - s.strstart;\n\n    // JS ints have 32 bit, block below not needed\n    /* Deal with !@#$% 64K limit: */\n    //if (sizeof(int) <= 2) {\n    //    if (more == 0 && s->strstart == 0 && s->lookahead == 0) {\n    //        more = wsize;\n    //\n    //  } else if (more == (unsigned)(-1)) {\n    //        /* Very unlikely, but possible on 16 bit machine if\n    //         * strstart == 0 && lookahead == 1 (input done a byte at time)\n    //         */\n    //        more--;\n    //    }\n    //}\n\n\n    /* If the window is almost full and there is insufficient lookahead,\n     * move the upper half to the lower one to make room in the upper half.\n     */\n    if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) {\n\n      utils.arraySet(s.window, s.window, _w_size, _w_size, 0);\n      s.match_start -= _w_size;\n      s.strstart -= _w_size;\n      /* we now have strstart >= MAX_DIST */\n      s.block_start -= _w_size;\n\n      /* Slide the hash table (could be avoided with 32 bit values\n       at the expense of memory usage). We slide even when level == 0\n       to keep the hash table consistent if we switch back to level > 0\n       later. (Using level 0 permanently is not an optimal usage of\n       zlib, so we don't care about this pathological case.)\n       */\n\n      n = s.hash_size;\n      p = n;\n      do {\n        m = s.head[--p];\n        s.head[p] = (m >= _w_size ? m - _w_size : 0);\n      } while (--n);\n\n      n = _w_size;\n      p = n;\n      do {\n        m = s.prev[--p];\n        s.prev[p] = (m >= _w_size ? m - _w_size : 0);\n        /* If n is not on any hash chain, prev[n] is garbage but\n         * its value will never be used.\n         */\n      } while (--n);\n\n      more += _w_size;\n    }\n    if (s.strm.avail_in === 0) {\n      break;\n    }\n\n    /* If there was no sliding:\n     *    strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&\n     *    more == window_size - lookahead - strstart\n     * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)\n     * => more >= window_size - 2*WSIZE + 2\n     * In the BIG_MEM or MMAP case (not yet supported),\n     *   window_size == input_size + MIN_LOOKAHEAD  &&\n     *   strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.\n     * Otherwise, window_size == 2*WSIZE so more >= 2.\n     * If there was sliding, more >= WSIZE. So in all cases, more >= 2.\n     */\n    //Assert(more >= 2, \"more < 2\");\n    n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more);\n    s.lookahead += n;\n\n    /* Initialize the hash value now that we have some input: */\n    if (s.lookahead + s.insert >= MIN_MATCH) {\n      str = s.strstart - s.insert;\n      s.ins_h = s.window[str];\n\n      /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */\n      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + 1]) & s.hash_mask;\n//#if MIN_MATCH != 3\n//        Call update_hash() MIN_MATCH-3 more times\n//#endif\n      while (s.insert) {\n        /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */\n        s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask;\n\n        s.prev[str & s.w_mask] = s.head[s.ins_h];\n        s.head[s.ins_h] = str;\n        str++;\n        s.insert--;\n        if (s.lookahead + s.insert < MIN_MATCH) {\n          break;\n        }\n      }\n    }\n    /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,\n     * but this is not important since only literal bytes will be emitted.\n     */\n\n  } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0);\n\n  /* If the WIN_INIT bytes after the end of the current data have never been\n   * written, then zero those bytes in order to avoid memory check reports of\n   * the use of uninitialized (or uninitialised as Julian writes) bytes by\n   * the longest match routines.  Update the high water mark for the next\n   * time through here.  WIN_INIT is set to MAX_MATCH since the longest match\n   * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.\n   */\n//  if (s.high_water < s.window_size) {\n//    var curr = s.strstart + s.lookahead;\n//    var init = 0;\n//\n//    if (s.high_water < curr) {\n//      /* Previous high water mark below current data -- zero WIN_INIT\n//       * bytes or up to end of window, whichever is less.\n//       */\n//      init = s.window_size - curr;\n//      if (init > WIN_INIT)\n//        init = WIN_INIT;\n//      zmemzero(s->window + curr, (unsigned)init);\n//      s->high_water = curr + init;\n//    }\n//    else if (s->high_water < (ulg)curr + WIN_INIT) {\n//      /* High water mark at or above current data, but below current data\n//       * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up\n//       * to end of window, whichever is less.\n//       */\n//      init = (ulg)curr + WIN_INIT - s->high_water;\n//      if (init > s->window_size - s->high_water)\n//        init = s->window_size - s->high_water;\n//      zmemzero(s->window + s->high_water, (unsigned)init);\n//      s->high_water += init;\n//    }\n//  }\n//\n//  Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,\n//    \"not enough room for search\");\n}\n\n/* ===========================================================================\n * Copy without compression as much as possible from the input stream, return\n * the current block state.\n * This function does not insert new strings in the dictionary since\n * uncompressible data is probably not useful. This function is used\n * only for the level=0 compression option.\n * NOTE: this function should be optimized to avoid extra copying from\n * window to pending_buf.\n */\nfunction deflate_stored(s, flush) {\n  /* Stored blocks are limited to 0xffff bytes, pending_buf is limited\n   * to pending_buf_size, and each stored block has a 5 byte header:\n   */\n  var max_block_size = 0xffff;\n\n  if (max_block_size > s.pending_buf_size - 5) {\n    max_block_size = s.pending_buf_size - 5;\n  }\n\n  /* Copy as much as possible from input to output: */\n  for (;;) {\n    /* Fill the window as much as possible: */\n    if (s.lookahead <= 1) {\n\n      //Assert(s->strstart < s->w_size+MAX_DIST(s) ||\n      //  s->block_start >= (long)s->w_size, \"slide too late\");\n//      if (!(s.strstart < s.w_size + (s.w_size - MIN_LOOKAHEAD) ||\n//        s.block_start >= s.w_size)) {\n//        throw  new Error(\"slide too late\");\n//      }\n\n      fill_window(s);\n      if (s.lookahead === 0 && flush === Z_NO_FLUSH) {\n        return BS_NEED_MORE;\n      }\n\n      if (s.lookahead === 0) {\n        break;\n      }\n      /* flush the current block */\n    }\n    //Assert(s->block_start >= 0L, \"block gone\");\n//    if (s.block_start < 0) throw new Error(\"block gone\");\n\n    s.strstart += s.lookahead;\n    s.lookahead = 0;\n\n    /* Emit a stored block if pending_buf will be full: */\n    var max_start = s.block_start + max_block_size;\n\n    if (s.strstart === 0 || s.strstart >= max_start) {\n      /* strstart == 0 is possible when wraparound on 16-bit machine */\n      s.lookahead = s.strstart - max_start;\n      s.strstart = max_start;\n      /*** FLUSH_BLOCK(s, 0); ***/\n      flush_block_only(s, false);\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n      /***/\n\n\n    }\n    /* Flush if we may have to slide, otherwise block_start may become\n     * negative and the data will be gone:\n     */\n    if (s.strstart - s.block_start >= (s.w_size - MIN_LOOKAHEAD)) {\n      /*** FLUSH_BLOCK(s, 0); ***/\n      flush_block_only(s, false);\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n      /***/\n    }\n  }\n\n  s.insert = 0;\n\n  if (flush === Z_FINISH) {\n    /*** FLUSH_BLOCK(s, 1); ***/\n    flush_block_only(s, true);\n    if (s.strm.avail_out === 0) {\n      return BS_FINISH_STARTED;\n    }\n    /***/\n    return BS_FINISH_DONE;\n  }\n\n  if (s.strstart > s.block_start) {\n    /*** FLUSH_BLOCK(s, 0); ***/\n    flush_block_only(s, false);\n    if (s.strm.avail_out === 0) {\n      return BS_NEED_MORE;\n    }\n    /***/\n  }\n\n  return BS_NEED_MORE;\n}\n\n/* ===========================================================================\n * Compress as much as possible from the input stream, return the current\n * block state.\n * This function does not perform lazy evaluation of matches and inserts\n * new strings in the dictionary only for unmatched strings or for short\n * matches. It is used only for the fast compression options.\n */\nfunction deflate_fast(s, flush) {\n  var hash_head;        /* head of the hash chain */\n  var bflush;           /* set if current block must be flushed */\n\n  for (;;) {\n    /* Make sure that we always have enough lookahead, except\n     * at the end of the input file. We need MAX_MATCH bytes\n     * for the next match, plus MIN_MATCH bytes to insert the\n     * string following the next match.\n     */\n    if (s.lookahead < MIN_LOOKAHEAD) {\n      fill_window(s);\n      if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {\n        return BS_NEED_MORE;\n      }\n      if (s.lookahead === 0) {\n        break; /* flush the current block */\n      }\n    }\n\n    /* Insert the string window[strstart .. strstart+2] in the\n     * dictionary, and set hash_head to the head of the hash chain:\n     */\n    hash_head = 0/*NIL*/;\n    if (s.lookahead >= MIN_MATCH) {\n      /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;\n      hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n      s.head[s.ins_h] = s.strstart;\n      /***/\n    }\n\n    /* Find the longest match, discarding those <= prev_length.\n     * At this point we have always match_length < MIN_MATCH\n     */\n    if (hash_head !== 0/*NIL*/ && ((s.strstart - hash_head) <= (s.w_size - MIN_LOOKAHEAD))) {\n      /* To simplify the code, we prevent matches with the string\n       * of window index 0 (in particular we have to avoid a match\n       * of the string with itself at the start of the input file).\n       */\n      s.match_length = longest_match(s, hash_head);\n      /* longest_match() sets match_start */\n    }\n    if (s.match_length >= MIN_MATCH) {\n      // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only\n\n      /*** _tr_tally_dist(s, s.strstart - s.match_start,\n                     s.match_length - MIN_MATCH, bflush); ***/\n      bflush = trees._tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH);\n\n      s.lookahead -= s.match_length;\n\n      /* Insert new strings in the hash table only if the match length\n       * is not too large. This saves time but degrades compression.\n       */\n      if (s.match_length <= s.max_lazy_match/*max_insert_length*/ && s.lookahead >= MIN_MATCH) {\n        s.match_length--; /* string at strstart already in table */\n        do {\n          s.strstart++;\n          /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n          s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;\n          hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n          s.head[s.ins_h] = s.strstart;\n          /***/\n          /* strstart never exceeds WSIZE-MAX_MATCH, so there are\n           * always MIN_MATCH bytes ahead.\n           */\n        } while (--s.match_length !== 0);\n        s.strstart++;\n      } else\n      {\n        s.strstart += s.match_length;\n        s.match_length = 0;\n        s.ins_h = s.window[s.strstart];\n        /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */\n        s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + 1]) & s.hash_mask;\n\n//#if MIN_MATCH != 3\n//                Call UPDATE_HASH() MIN_MATCH-3 more times\n//#endif\n        /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not\n         * matter since it will be recomputed at next deflate call.\n         */\n      }\n    } else {\n      /* No match, output a literal byte */\n      //Tracevv((stderr,\"%c\", s.window[s.strstart]));\n      /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n      bflush = trees._tr_tally(s, 0, s.window[s.strstart]);\n\n      s.lookahead--;\n      s.strstart++;\n    }\n    if (bflush) {\n      /*** FLUSH_BLOCK(s, 0); ***/\n      flush_block_only(s, false);\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n      /***/\n    }\n  }\n  s.insert = ((s.strstart < (MIN_MATCH - 1)) ? s.strstart : MIN_MATCH - 1);\n  if (flush === Z_FINISH) {\n    /*** FLUSH_BLOCK(s, 1); ***/\n    flush_block_only(s, true);\n    if (s.strm.avail_out === 0) {\n      return BS_FINISH_STARTED;\n    }\n    /***/\n    return BS_FINISH_DONE;\n  }\n  if (s.last_lit) {\n    /*** FLUSH_BLOCK(s, 0); ***/\n    flush_block_only(s, false);\n    if (s.strm.avail_out === 0) {\n      return BS_NEED_MORE;\n    }\n    /***/\n  }\n  return BS_BLOCK_DONE;\n}\n\n/* ===========================================================================\n * Same as above, but achieves better compression. We use a lazy\n * evaluation for matches: a match is finally adopted only if there is\n * no better match at the next window position.\n */\nfunction deflate_slow(s, flush) {\n  var hash_head;          /* head of hash chain */\n  var bflush;              /* set if current block must be flushed */\n\n  var max_insert;\n\n  /* Process the input block. */\n  for (;;) {\n    /* Make sure that we always have enough lookahead, except\n     * at the end of the input file. We need MAX_MATCH bytes\n     * for the next match, plus MIN_MATCH bytes to insert the\n     * string following the next match.\n     */\n    if (s.lookahead < MIN_LOOKAHEAD) {\n      fill_window(s);\n      if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {\n        return BS_NEED_MORE;\n      }\n      if (s.lookahead === 0) { break; } /* flush the current block */\n    }\n\n    /* Insert the string window[strstart .. strstart+2] in the\n     * dictionary, and set hash_head to the head of the hash chain:\n     */\n    hash_head = 0/*NIL*/;\n    if (s.lookahead >= MIN_MATCH) {\n      /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;\n      hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n      s.head[s.ins_h] = s.strstart;\n      /***/\n    }\n\n    /* Find the longest match, discarding those <= prev_length.\n     */\n    s.prev_length = s.match_length;\n    s.prev_match = s.match_start;\n    s.match_length = MIN_MATCH - 1;\n\n    if (hash_head !== 0/*NIL*/ && s.prev_length < s.max_lazy_match &&\n        s.strstart - hash_head <= (s.w_size - MIN_LOOKAHEAD)/*MAX_DIST(s)*/) {\n      /* To simplify the code, we prevent matches with the string\n       * of window index 0 (in particular we have to avoid a match\n       * of the string with itself at the start of the input file).\n       */\n      s.match_length = longest_match(s, hash_head);\n      /* longest_match() sets match_start */\n\n      if (s.match_length <= 5 &&\n         (s.strategy === Z_FILTERED || (s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096/*TOO_FAR*/))) {\n\n        /* If prev_match is also MIN_MATCH, match_start is garbage\n         * but we will ignore the current match anyway.\n         */\n        s.match_length = MIN_MATCH - 1;\n      }\n    }\n    /* If there was a match at the previous step and the current\n     * match is not better, output the previous match:\n     */\n    if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) {\n      max_insert = s.strstart + s.lookahead - MIN_MATCH;\n      /* Do not insert strings in hash table beyond this. */\n\n      //check_match(s, s.strstart-1, s.prev_match, s.prev_length);\n\n      /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match,\n                     s.prev_length - MIN_MATCH, bflush);***/\n      bflush = trees._tr_tally(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH);\n      /* Insert in hash table all strings up to the end of the match.\n       * strstart-1 and strstart are already inserted. If there is not\n       * enough lookahead, the last two strings are not inserted in\n       * the hash table.\n       */\n      s.lookahead -= s.prev_length - 1;\n      s.prev_length -= 2;\n      do {\n        if (++s.strstart <= max_insert) {\n          /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n          s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;\n          hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n          s.head[s.ins_h] = s.strstart;\n          /***/\n        }\n      } while (--s.prev_length !== 0);\n      s.match_available = 0;\n      s.match_length = MIN_MATCH - 1;\n      s.strstart++;\n\n      if (bflush) {\n        /*** FLUSH_BLOCK(s, 0); ***/\n        flush_block_only(s, false);\n        if (s.strm.avail_out === 0) {\n          return BS_NEED_MORE;\n        }\n        /***/\n      }\n\n    } else if (s.match_available) {\n      /* If there was no match at the previous position, output a\n       * single literal. If there was a match but the current match\n       * is longer, truncate the previous match to a single literal.\n       */\n      //Tracevv((stderr,\"%c\", s->window[s->strstart-1]));\n      /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/\n      bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]);\n\n      if (bflush) {\n        /*** FLUSH_BLOCK_ONLY(s, 0) ***/\n        flush_block_only(s, false);\n        /***/\n      }\n      s.strstart++;\n      s.lookahead--;\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n    } else {\n      /* There is no previous match to compare with, wait for\n       * the next step to decide.\n       */\n      s.match_available = 1;\n      s.strstart++;\n      s.lookahead--;\n    }\n  }\n  //Assert (flush != Z_NO_FLUSH, \"no flush?\");\n  if (s.match_available) {\n    //Tracevv((stderr,\"%c\", s->window[s->strstart-1]));\n    /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/\n    bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]);\n\n    s.match_available = 0;\n  }\n  s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1;\n  if (flush === Z_FINISH) {\n    /*** FLUSH_BLOCK(s, 1); ***/\n    flush_block_only(s, true);\n    if (s.strm.avail_out === 0) {\n      return BS_FINISH_STARTED;\n    }\n    /***/\n    return BS_FINISH_DONE;\n  }\n  if (s.last_lit) {\n    /*** FLUSH_BLOCK(s, 0); ***/\n    flush_block_only(s, false);\n    if (s.strm.avail_out === 0) {\n      return BS_NEED_MORE;\n    }\n    /***/\n  }\n\n  return BS_BLOCK_DONE;\n}\n\n\n/* ===========================================================================\n * For Z_RLE, simply look for runs of bytes, generate matches only of distance\n * one.  Do not maintain a hash table.  (It will be regenerated if this run of\n * deflate switches away from Z_RLE.)\n */\nfunction deflate_rle(s, flush) {\n  var bflush;            /* set if current block must be flushed */\n  var prev;              /* byte at distance one to match */\n  var scan, strend;      /* scan goes up to strend for length of run */\n\n  var _win = s.window;\n\n  for (;;) {\n    /* Make sure that we always have enough lookahead, except\n     * at the end of the input file. We need MAX_MATCH bytes\n     * for the longest run, plus one for the unrolled loop.\n     */\n    if (s.lookahead <= MAX_MATCH) {\n      fill_window(s);\n      if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH) {\n        return BS_NEED_MORE;\n      }\n      if (s.lookahead === 0) { break; } /* flush the current block */\n    }\n\n    /* See how many times the previous byte repeats */\n    s.match_length = 0;\n    if (s.lookahead >= MIN_MATCH && s.strstart > 0) {\n      scan = s.strstart - 1;\n      prev = _win[scan];\n      if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) {\n        strend = s.strstart + MAX_MATCH;\n        do {\n          /*jshint noempty:false*/\n        } while (prev === _win[++scan] && prev === _win[++scan] &&\n                 prev === _win[++scan] && prev === _win[++scan] &&\n                 prev === _win[++scan] && prev === _win[++scan] &&\n                 prev === _win[++scan] && prev === _win[++scan] &&\n                 scan < strend);\n        s.match_length = MAX_MATCH - (strend - scan);\n        if (s.match_length > s.lookahead) {\n          s.match_length = s.lookahead;\n        }\n      }\n      //Assert(scan <= s->window+(uInt)(s->window_size-1), \"wild scan\");\n    }\n\n    /* Emit match if have run of MIN_MATCH or longer, else emit literal */\n    if (s.match_length >= MIN_MATCH) {\n      //check_match(s, s.strstart, s.strstart - 1, s.match_length);\n\n      /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/\n      bflush = trees._tr_tally(s, 1, s.match_length - MIN_MATCH);\n\n      s.lookahead -= s.match_length;\n      s.strstart += s.match_length;\n      s.match_length = 0;\n    } else {\n      /* No match, output a literal byte */\n      //Tracevv((stderr,\"%c\", s->window[s->strstart]));\n      /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n      bflush = trees._tr_tally(s, 0, s.window[s.strstart]);\n\n      s.lookahead--;\n      s.strstart++;\n    }\n    if (bflush) {\n      /*** FLUSH_BLOCK(s, 0); ***/\n      flush_block_only(s, false);\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n      /***/\n    }\n  }\n  s.insert = 0;\n  if (flush === Z_FINISH) {\n    /*** FLUSH_BLOCK(s, 1); ***/\n    flush_block_only(s, true);\n    if (s.strm.avail_out === 0) {\n      return BS_FINISH_STARTED;\n    }\n    /***/\n    return BS_FINISH_DONE;\n  }\n  if (s.last_lit) {\n    /*** FLUSH_BLOCK(s, 0); ***/\n    flush_block_only(s, false);\n    if (s.strm.avail_out === 0) {\n      return BS_NEED_MORE;\n    }\n    /***/\n  }\n  return BS_BLOCK_DONE;\n}\n\n/* ===========================================================================\n * For Z_HUFFMAN_ONLY, do not look for matches.  Do not maintain a hash table.\n * (It will be regenerated if this run of deflate switches away from Huffman.)\n */\nfunction deflate_huff(s, flush) {\n  var bflush;             /* set if current block must be flushed */\n\n  for (;;) {\n    /* Make sure that we have a literal to write. */\n    if (s.lookahead === 0) {\n      fill_window(s);\n      if (s.lookahead === 0) {\n        if (flush === Z_NO_FLUSH) {\n          return BS_NEED_MORE;\n        }\n        break;      /* flush the current block */\n      }\n    }\n\n    /* Output a literal byte */\n    s.match_length = 0;\n    //Tracevv((stderr,\"%c\", s->window[s->strstart]));\n    /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n    bflush = trees._tr_tally(s, 0, s.window[s.strstart]);\n    s.lookahead--;\n    s.strstart++;\n    if (bflush) {\n      /*** FLUSH_BLOCK(s, 0); ***/\n      flush_block_only(s, false);\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n      /***/\n    }\n  }\n  s.insert = 0;\n  if (flush === Z_FINISH) {\n    /*** FLUSH_BLOCK(s, 1); ***/\n    flush_block_only(s, true);\n    if (s.strm.avail_out === 0) {\n      return BS_FINISH_STARTED;\n    }\n    /***/\n    return BS_FINISH_DONE;\n  }\n  if (s.last_lit) {\n    /*** FLUSH_BLOCK(s, 0); ***/\n    flush_block_only(s, false);\n    if (s.strm.avail_out === 0) {\n      return BS_NEED_MORE;\n    }\n    /***/\n  }\n  return BS_BLOCK_DONE;\n}\n\n/* Values for max_lazy_match, good_match and max_chain_length, depending on\n * the desired pack level (0..9). The values given below have been tuned to\n * exclude worst case performance for pathological files. Better values may be\n * found for specific files.\n */\nfunction Config(good_length, max_lazy, nice_length, max_chain, func) {\n  this.good_length = good_length;\n  this.max_lazy = max_lazy;\n  this.nice_length = nice_length;\n  this.max_chain = max_chain;\n  this.func = func;\n}\n\nvar configuration_table;\n\nconfiguration_table = [\n  /*      good lazy nice chain */\n  new Config(0, 0, 0, 0, deflate_stored),          /* 0 store only */\n  new Config(4, 4, 8, 4, deflate_fast),            /* 1 max speed, no lazy matches */\n  new Config(4, 5, 16, 8, deflate_fast),           /* 2 */\n  new Config(4, 6, 32, 32, deflate_fast),          /* 3 */\n\n  new Config(4, 4, 16, 16, deflate_slow),          /* 4 lazy matches */\n  new Config(8, 16, 32, 32, deflate_slow),         /* 5 */\n  new Config(8, 16, 128, 128, deflate_slow),       /* 6 */\n  new Config(8, 32, 128, 256, deflate_slow),       /* 7 */\n  new Config(32, 128, 258, 1024, deflate_slow),    /* 8 */\n  new Config(32, 258, 258, 4096, deflate_slow)     /* 9 max compression */\n];\n\n\n/* ===========================================================================\n * Initialize the \"longest match\" routines for a new zlib stream\n */\nfunction lm_init(s) {\n  s.window_size = 2 * s.w_size;\n\n  /*** CLEAR_HASH(s); ***/\n  zero(s.head); // Fill with NIL (= 0);\n\n  /* Set the default configuration parameters:\n   */\n  s.max_lazy_match = configuration_table[s.level].max_lazy;\n  s.good_match = configuration_table[s.level].good_length;\n  s.nice_match = configuration_table[s.level].nice_length;\n  s.max_chain_length = configuration_table[s.level].max_chain;\n\n  s.strstart = 0;\n  s.block_start = 0;\n  s.lookahead = 0;\n  s.insert = 0;\n  s.match_length = s.prev_length = MIN_MATCH - 1;\n  s.match_available = 0;\n  s.ins_h = 0;\n}\n\n\nfunction DeflateState() {\n  this.strm = null;            /* pointer back to this zlib stream */\n  this.status = 0;            /* as the name implies */\n  this.pending_buf = null;      /* output still pending */\n  this.pending_buf_size = 0;  /* size of pending_buf */\n  this.pending_out = 0;       /* next pending byte to output to the stream */\n  this.pending = 0;           /* nb of bytes in the pending buffer */\n  this.wrap = 0;              /* bit 0 true for zlib, bit 1 true for gzip */\n  this.gzhead = null;         /* gzip header information to write */\n  this.gzindex = 0;           /* where in extra, name, or comment */\n  this.method = Z_DEFLATED; /* can only be DEFLATED */\n  this.last_flush = -1;   /* value of flush param for previous deflate call */\n\n  this.w_size = 0;  /* LZ77 window size (32K by default) */\n  this.w_bits = 0;  /* log2(w_size)  (8..16) */\n  this.w_mask = 0;  /* w_size - 1 */\n\n  this.window = null;\n  /* Sliding window. Input bytes are read into the second half of the window,\n   * and move to the first half later to keep a dictionary of at least wSize\n   * bytes. With this organization, matches are limited to a distance of\n   * wSize-MAX_MATCH bytes, but this ensures that IO is always\n   * performed with a length multiple of the block size.\n   */\n\n  this.window_size = 0;\n  /* Actual size of window: 2*wSize, except when the user input buffer\n   * is directly used as sliding window.\n   */\n\n  this.prev = null;\n  /* Link to older string with same hash index. To limit the size of this\n   * array to 64K, this link is maintained only for the last 32K strings.\n   * An index in this array is thus a window index modulo 32K.\n   */\n\n  this.head = null;   /* Heads of the hash chains or NIL. */\n\n  this.ins_h = 0;       /* hash index of string to be inserted */\n  this.hash_size = 0;   /* number of elements in hash table */\n  this.hash_bits = 0;   /* log2(hash_size) */\n  this.hash_mask = 0;   /* hash_size-1 */\n\n  this.hash_shift = 0;\n  /* Number of bits by which ins_h must be shifted at each input\n   * step. It must be such that after MIN_MATCH steps, the oldest\n   * byte no longer takes part in the hash key, that is:\n   *   hash_shift * MIN_MATCH >= hash_bits\n   */\n\n  this.block_start = 0;\n  /* Window position at the beginning of the current output block. Gets\n   * negative when the window is moved backwards.\n   */\n\n  this.match_length = 0;      /* length of best match */\n  this.prev_match = 0;        /* previous match */\n  this.match_available = 0;   /* set if previous match exists */\n  this.strstart = 0;          /* start of string to insert */\n  this.match_start = 0;       /* start of matching string */\n  this.lookahead = 0;         /* number of valid bytes ahead in window */\n\n  this.prev_length = 0;\n  /* Length of the best match at previous step. Matches not greater than this\n   * are discarded. This is used in the lazy match evaluation.\n   */\n\n  this.max_chain_length = 0;\n  /* To speed up deflation, hash chains are never searched beyond this\n   * length.  A higher limit improves compression ratio but degrades the\n   * speed.\n   */\n\n  this.max_lazy_match = 0;\n  /* Attempt to find a better match only when the current match is strictly\n   * smaller than this value. This mechanism is used only for compression\n   * levels >= 4.\n   */\n  // That's alias to max_lazy_match, don't use directly\n  //this.max_insert_length = 0;\n  /* Insert new strings in the hash table only if the match length is not\n   * greater than this length. This saves time but degrades compression.\n   * max_insert_length is used only for compression levels <= 3.\n   */\n\n  this.level = 0;     /* compression level (1..9) */\n  this.strategy = 0;  /* favor or force Huffman coding*/\n\n  this.good_match = 0;\n  /* Use a faster search when the previous match is longer than this */\n\n  this.nice_match = 0; /* Stop searching when current match exceeds this */\n\n              /* used by trees.c: */\n\n  /* Didn't use ct_data typedef below to suppress compiler warning */\n\n  // struct ct_data_s dyn_ltree[HEAP_SIZE];   /* literal and length tree */\n  // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */\n  // struct ct_data_s bl_tree[2*BL_CODES+1];  /* Huffman tree for bit lengths */\n\n  // Use flat array of DOUBLE size, with interleaved fata,\n  // because JS does not support effective\n  this.dyn_ltree  = new utils.Buf16(HEAP_SIZE * 2);\n  this.dyn_dtree  = new utils.Buf16((2 * D_CODES + 1) * 2);\n  this.bl_tree    = new utils.Buf16((2 * BL_CODES + 1) * 2);\n  zero(this.dyn_ltree);\n  zero(this.dyn_dtree);\n  zero(this.bl_tree);\n\n  this.l_desc   = null;         /* desc. for literal tree */\n  this.d_desc   = null;         /* desc. for distance tree */\n  this.bl_desc  = null;         /* desc. for bit length tree */\n\n  //ush bl_count[MAX_BITS+1];\n  this.bl_count = new utils.Buf16(MAX_BITS + 1);\n  /* number of codes at each bit length for an optimal tree */\n\n  //int heap[2*L_CODES+1];      /* heap used to build the Huffman trees */\n  this.heap = new utils.Buf16(2 * L_CODES + 1);  /* heap used to build the Huffman trees */\n  zero(this.heap);\n\n  this.heap_len = 0;               /* number of elements in the heap */\n  this.heap_max = 0;               /* element of largest frequency */\n  /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.\n   * The same heap array is used to build all trees.\n   */\n\n  this.depth = new utils.Buf16(2 * L_CODES + 1); //uch depth[2*L_CODES+1];\n  zero(this.depth);\n  /* Depth of each subtree used as tie breaker for trees of equal frequency\n   */\n\n  this.l_buf = 0;          /* buffer index for literals or lengths */\n\n  this.lit_bufsize = 0;\n  /* Size of match buffer for literals/lengths.  There are 4 reasons for\n   * limiting lit_bufsize to 64K:\n   *   - frequencies can be kept in 16 bit counters\n   *   - if compression is not successful for the first block, all input\n   *     data is still in the window so we can still emit a stored block even\n   *     when input comes from standard input.  (This can also be done for\n   *     all blocks if lit_bufsize is not greater than 32K.)\n   *   - if compression is not successful for a file smaller than 64K, we can\n   *     even emit a stored file instead of a stored block (saving 5 bytes).\n   *     This is applicable only for zip (not gzip or zlib).\n   *   - creating new Huffman trees less frequently may not provide fast\n   *     adaptation to changes in the input data statistics. (Take for\n   *     example a binary file with poorly compressible code followed by\n   *     a highly compressible string table.) Smaller buffer sizes give\n   *     fast adaptation but have of course the overhead of transmitting\n   *     trees more frequently.\n   *   - I can't count above 4\n   */\n\n  this.last_lit = 0;      /* running index in l_buf */\n\n  this.d_buf = 0;\n  /* Buffer index for distances. To simplify the code, d_buf and l_buf have\n   * the same number of elements. To use different lengths, an extra flag\n   * array would be necessary.\n   */\n\n  this.opt_len = 0;       /* bit length of current block with optimal trees */\n  this.static_len = 0;    /* bit length of current block with static trees */\n  this.matches = 0;       /* number of string matches in current block */\n  this.insert = 0;        /* bytes at end of window left to insert */\n\n\n  this.bi_buf = 0;\n  /* Output buffer. bits are inserted starting at the bottom (least\n   * significant bits).\n   */\n  this.bi_valid = 0;\n  /* Number of valid bits in bi_buf.  All bits above the last valid bit\n   * are always zero.\n   */\n\n  // Used for window memory init. We safely ignore it for JS. That makes\n  // sense only for pointers and memory check tools.\n  //this.high_water = 0;\n  /* High water mark offset in window for initialized bytes -- bytes above\n   * this are set to zero in order to avoid memory check warnings when\n   * longest match routines access bytes past the input.  This is then\n   * updated to the new high water mark.\n   */\n}\n\n\nfunction deflateResetKeep(strm) {\n  var s;\n\n  if (!strm || !strm.state) {\n    return err(strm, Z_STREAM_ERROR);\n  }\n\n  strm.total_in = strm.total_out = 0;\n  strm.data_type = Z_UNKNOWN;\n\n  s = strm.state;\n  s.pending = 0;\n  s.pending_out = 0;\n\n  if (s.wrap < 0) {\n    s.wrap = -s.wrap;\n    /* was made negative by deflate(..., Z_FINISH); */\n  }\n  s.status = (s.wrap ? INIT_STATE : BUSY_STATE);\n  strm.adler = (s.wrap === 2) ?\n    0  // crc32(0, Z_NULL, 0)\n  :\n    1; // adler32(0, Z_NULL, 0)\n  s.last_flush = Z_NO_FLUSH;\n  trees._tr_init(s);\n  return Z_OK;\n}\n\n\nfunction deflateReset(strm) {\n  var ret = deflateResetKeep(strm);\n  if (ret === Z_OK) {\n    lm_init(strm.state);\n  }\n  return ret;\n}\n\n\nfunction deflateSetHeader(strm, head) {\n  if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n  if (strm.state.wrap !== 2) { return Z_STREAM_ERROR; }\n  strm.state.gzhead = head;\n  return Z_OK;\n}\n\n\nfunction deflateInit2(strm, level, method, windowBits, memLevel, strategy) {\n  if (!strm) { // === Z_NULL\n    return Z_STREAM_ERROR;\n  }\n  var wrap = 1;\n\n  if (level === Z_DEFAULT_COMPRESSION) {\n    level = 6;\n  }\n\n  if (windowBits < 0) { /* suppress zlib wrapper */\n    wrap = 0;\n    windowBits = -windowBits;\n  }\n\n  else if (windowBits > 15) {\n    wrap = 2;           /* write gzip wrapper instead */\n    windowBits -= 16;\n  }\n\n\n  if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED ||\n    windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||\n    strategy < 0 || strategy > Z_FIXED) {\n    return err(strm, Z_STREAM_ERROR);\n  }\n\n\n  if (windowBits === 8) {\n    windowBits = 9;\n  }\n  /* until 256-byte window bug fixed */\n\n  var s = new DeflateState();\n\n  strm.state = s;\n  s.strm = strm;\n\n  s.wrap = wrap;\n  s.gzhead = null;\n  s.w_bits = windowBits;\n  s.w_size = 1 << s.w_bits;\n  s.w_mask = s.w_size - 1;\n\n  s.hash_bits = memLevel + 7;\n  s.hash_size = 1 << s.hash_bits;\n  s.hash_mask = s.hash_size - 1;\n  s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH);\n\n  s.window = new utils.Buf8(s.w_size * 2);\n  s.head = new utils.Buf16(s.hash_size);\n  s.prev = new utils.Buf16(s.w_size);\n\n  // Don't need mem init magic for JS.\n  //s.high_water = 0;  /* nothing written to s->window yet */\n\n  s.lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */\n\n  s.pending_buf_size = s.lit_bufsize * 4;\n\n  //overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2);\n  //s->pending_buf = (uchf *) overlay;\n  s.pending_buf = new utils.Buf8(s.pending_buf_size);\n\n  // It is offset from `s.pending_buf` (size is `s.lit_bufsize * 2`)\n  //s->d_buf = overlay + s->lit_bufsize/sizeof(ush);\n  s.d_buf = 1 * s.lit_bufsize;\n\n  //s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize;\n  s.l_buf = (1 + 2) * s.lit_bufsize;\n\n  s.level = level;\n  s.strategy = strategy;\n  s.method = method;\n\n  return deflateReset(strm);\n}\n\nfunction deflateInit(strm, level) {\n  return deflateInit2(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY);\n}\n\n\nfunction deflate(strm, flush) {\n  var old_flush, s;\n  var beg, val; // for gzip header write only\n\n  if (!strm || !strm.state ||\n    flush > Z_BLOCK || flush < 0) {\n    return strm ? err(strm, Z_STREAM_ERROR) : Z_STREAM_ERROR;\n  }\n\n  s = strm.state;\n\n  if (!strm.output ||\n      (!strm.input && strm.avail_in !== 0) ||\n      (s.status === FINISH_STATE && flush !== Z_FINISH)) {\n    return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR : Z_STREAM_ERROR);\n  }\n\n  s.strm = strm; /* just in case */\n  old_flush = s.last_flush;\n  s.last_flush = flush;\n\n  /* Write the header */\n  if (s.status === INIT_STATE) {\n\n    if (s.wrap === 2) { // GZIP header\n      strm.adler = 0;  //crc32(0L, Z_NULL, 0);\n      put_byte(s, 31);\n      put_byte(s, 139);\n      put_byte(s, 8);\n      if (!s.gzhead) { // s->gzhead == Z_NULL\n        put_byte(s, 0);\n        put_byte(s, 0);\n        put_byte(s, 0);\n        put_byte(s, 0);\n        put_byte(s, 0);\n        put_byte(s, s.level === 9 ? 2 :\n                    (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?\n                     4 : 0));\n        put_byte(s, OS_CODE);\n        s.status = BUSY_STATE;\n      }\n      else {\n        put_byte(s, (s.gzhead.text ? 1 : 0) +\n                    (s.gzhead.hcrc ? 2 : 0) +\n                    (!s.gzhead.extra ? 0 : 4) +\n                    (!s.gzhead.name ? 0 : 8) +\n                    (!s.gzhead.comment ? 0 : 16)\n                );\n        put_byte(s, s.gzhead.time & 0xff);\n        put_byte(s, (s.gzhead.time >> 8) & 0xff);\n        put_byte(s, (s.gzhead.time >> 16) & 0xff);\n        put_byte(s, (s.gzhead.time >> 24) & 0xff);\n        put_byte(s, s.level === 9 ? 2 :\n                    (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?\n                     4 : 0));\n        put_byte(s, s.gzhead.os & 0xff);\n        if (s.gzhead.extra && s.gzhead.extra.length) {\n          put_byte(s, s.gzhead.extra.length & 0xff);\n          put_byte(s, (s.gzhead.extra.length >> 8) & 0xff);\n        }\n        if (s.gzhead.hcrc) {\n          strm.adler = crc32(strm.adler, s.pending_buf, s.pending, 0);\n        }\n        s.gzindex = 0;\n        s.status = EXTRA_STATE;\n      }\n    }\n    else // DEFLATE header\n    {\n      var header = (Z_DEFLATED + ((s.w_bits - 8) << 4)) << 8;\n      var level_flags = -1;\n\n      if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) {\n        level_flags = 0;\n      } else if (s.level < 6) {\n        level_flags = 1;\n      } else if (s.level === 6) {\n        level_flags = 2;\n      } else {\n        level_flags = 3;\n      }\n      header |= (level_flags << 6);\n      if (s.strstart !== 0) { header |= PRESET_DICT; }\n      header += 31 - (header % 31);\n\n      s.status = BUSY_STATE;\n      putShortMSB(s, header);\n\n      /* Save the adler32 of the preset dictionary: */\n      if (s.strstart !== 0) {\n        putShortMSB(s, strm.adler >>> 16);\n        putShortMSB(s, strm.adler & 0xffff);\n      }\n      strm.adler = 1; // adler32(0L, Z_NULL, 0);\n    }\n  }\n\n//#ifdef GZIP\n  if (s.status === EXTRA_STATE) {\n    if (s.gzhead.extra/* != Z_NULL*/) {\n      beg = s.pending;  /* start of bytes to update crc */\n\n      while (s.gzindex < (s.gzhead.extra.length & 0xffff)) {\n        if (s.pending === s.pending_buf_size) {\n          if (s.gzhead.hcrc && s.pending > beg) {\n            strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n          }\n          flush_pending(strm);\n          beg = s.pending;\n          if (s.pending === s.pending_buf_size) {\n            break;\n          }\n        }\n        put_byte(s, s.gzhead.extra[s.gzindex] & 0xff);\n        s.gzindex++;\n      }\n      if (s.gzhead.hcrc && s.pending > beg) {\n        strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n      }\n      if (s.gzindex === s.gzhead.extra.length) {\n        s.gzindex = 0;\n        s.status = NAME_STATE;\n      }\n    }\n    else {\n      s.status = NAME_STATE;\n    }\n  }\n  if (s.status === NAME_STATE) {\n    if (s.gzhead.name/* != Z_NULL*/) {\n      beg = s.pending;  /* start of bytes to update crc */\n      //int val;\n\n      do {\n        if (s.pending === s.pending_buf_size) {\n          if (s.gzhead.hcrc && s.pending > beg) {\n            strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n          }\n          flush_pending(strm);\n          beg = s.pending;\n          if (s.pending === s.pending_buf_size) {\n            val = 1;\n            break;\n          }\n        }\n        // JS specific: little magic to add zero terminator to end of string\n        if (s.gzindex < s.gzhead.name.length) {\n          val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff;\n        } else {\n          val = 0;\n        }\n        put_byte(s, val);\n      } while (val !== 0);\n\n      if (s.gzhead.hcrc && s.pending > beg) {\n        strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n      }\n      if (val === 0) {\n        s.gzindex = 0;\n        s.status = COMMENT_STATE;\n      }\n    }\n    else {\n      s.status = COMMENT_STATE;\n    }\n  }\n  if (s.status === COMMENT_STATE) {\n    if (s.gzhead.comment/* != Z_NULL*/) {\n      beg = s.pending;  /* start of bytes to update crc */\n      //int val;\n\n      do {\n        if (s.pending === s.pending_buf_size) {\n          if (s.gzhead.hcrc && s.pending > beg) {\n            strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n          }\n          flush_pending(strm);\n          beg = s.pending;\n          if (s.pending === s.pending_buf_size) {\n            val = 1;\n            break;\n          }\n        }\n        // JS specific: little magic to add zero terminator to end of string\n        if (s.gzindex < s.gzhead.comment.length) {\n          val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff;\n        } else {\n          val = 0;\n        }\n        put_byte(s, val);\n      } while (val !== 0);\n\n      if (s.gzhead.hcrc && s.pending > beg) {\n        strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n      }\n      if (val === 0) {\n        s.status = HCRC_STATE;\n      }\n    }\n    else {\n      s.status = HCRC_STATE;\n    }\n  }\n  if (s.status === HCRC_STATE) {\n    if (s.gzhead.hcrc) {\n      if (s.pending + 2 > s.pending_buf_size) {\n        flush_pending(strm);\n      }\n      if (s.pending + 2 <= s.pending_buf_size) {\n        put_byte(s, strm.adler & 0xff);\n        put_byte(s, (strm.adler >> 8) & 0xff);\n        strm.adler = 0; //crc32(0L, Z_NULL, 0);\n        s.status = BUSY_STATE;\n      }\n    }\n    else {\n      s.status = BUSY_STATE;\n    }\n  }\n//#endif\n\n  /* Flush as much pending output as possible */\n  if (s.pending !== 0) {\n    flush_pending(strm);\n    if (strm.avail_out === 0) {\n      /* Since avail_out is 0, deflate will be called again with\n       * more output space, but possibly with both pending and\n       * avail_in equal to zero. There won't be anything to do,\n       * but this is not an error situation so make sure we\n       * return OK instead of BUF_ERROR at next call of deflate:\n       */\n      s.last_flush = -1;\n      return Z_OK;\n    }\n\n    /* Make sure there is something to do and avoid duplicate consecutive\n     * flushes. For repeated and useless calls with Z_FINISH, we keep\n     * returning Z_STREAM_END instead of Z_BUF_ERROR.\n     */\n  } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) &&\n    flush !== Z_FINISH) {\n    return err(strm, Z_BUF_ERROR);\n  }\n\n  /* User must not provide more input after the first FINISH: */\n  if (s.status === FINISH_STATE && strm.avail_in !== 0) {\n    return err(strm, Z_BUF_ERROR);\n  }\n\n  /* Start a new block or continue the current one.\n   */\n  if (strm.avail_in !== 0 || s.lookahead !== 0 ||\n    (flush !== Z_NO_FLUSH && s.status !== FINISH_STATE)) {\n    var bstate = (s.strategy === Z_HUFFMAN_ONLY) ? deflate_huff(s, flush) :\n      (s.strategy === Z_RLE ? deflate_rle(s, flush) :\n        configuration_table[s.level].func(s, flush));\n\n    if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) {\n      s.status = FINISH_STATE;\n    }\n    if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) {\n      if (strm.avail_out === 0) {\n        s.last_flush = -1;\n        /* avoid BUF_ERROR next call, see above */\n      }\n      return Z_OK;\n      /* If flush != Z_NO_FLUSH && avail_out == 0, the next call\n       * of deflate should use the same flush parameter to make sure\n       * that the flush is complete. So we don't have to output an\n       * empty block here, this will be done at next call. This also\n       * ensures that for a very small output buffer, we emit at most\n       * one empty block.\n       */\n    }\n    if (bstate === BS_BLOCK_DONE) {\n      if (flush === Z_PARTIAL_FLUSH) {\n        trees._tr_align(s);\n      }\n      else if (flush !== Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */\n\n        trees._tr_stored_block(s, 0, 0, false);\n        /* For a full flush, this empty block will be recognized\n         * as a special marker by inflate_sync().\n         */\n        if (flush === Z_FULL_FLUSH) {\n          /*** CLEAR_HASH(s); ***/             /* forget history */\n          zero(s.head); // Fill with NIL (= 0);\n\n          if (s.lookahead === 0) {\n            s.strstart = 0;\n            s.block_start = 0;\n            s.insert = 0;\n          }\n        }\n      }\n      flush_pending(strm);\n      if (strm.avail_out === 0) {\n        s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */\n        return Z_OK;\n      }\n    }\n  }\n  //Assert(strm->avail_out > 0, \"bug2\");\n  //if (strm.avail_out <= 0) { throw new Error(\"bug2\");}\n\n  if (flush !== Z_FINISH) { return Z_OK; }\n  if (s.wrap <= 0) { return Z_STREAM_END; }\n\n  /* Write the trailer */\n  if (s.wrap === 2) {\n    put_byte(s, strm.adler & 0xff);\n    put_byte(s, (strm.adler >> 8) & 0xff);\n    put_byte(s, (strm.adler >> 16) & 0xff);\n    put_byte(s, (strm.adler >> 24) & 0xff);\n    put_byte(s, strm.total_in & 0xff);\n    put_byte(s, (strm.total_in >> 8) & 0xff);\n    put_byte(s, (strm.total_in >> 16) & 0xff);\n    put_byte(s, (strm.total_in >> 24) & 0xff);\n  }\n  else\n  {\n    putShortMSB(s, strm.adler >>> 16);\n    putShortMSB(s, strm.adler & 0xffff);\n  }\n\n  flush_pending(strm);\n  /* If avail_out is zero, the application will call deflate again\n   * to flush the rest.\n   */\n  if (s.wrap > 0) { s.wrap = -s.wrap; }\n  /* write the trailer only once! */\n  return s.pending !== 0 ? Z_OK : Z_STREAM_END;\n}\n\nfunction deflateEnd(strm) {\n  var status;\n\n  if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {\n    return Z_STREAM_ERROR;\n  }\n\n  status = strm.state.status;\n  if (status !== INIT_STATE &&\n    status !== EXTRA_STATE &&\n    status !== NAME_STATE &&\n    status !== COMMENT_STATE &&\n    status !== HCRC_STATE &&\n    status !== BUSY_STATE &&\n    status !== FINISH_STATE\n  ) {\n    return err(strm, Z_STREAM_ERROR);\n  }\n\n  strm.state = null;\n\n  return status === BUSY_STATE ? err(strm, Z_DATA_ERROR) : Z_OK;\n}\n\n\n/* =========================================================================\n * Initializes the compression dictionary from the given byte\n * sequence without producing any compressed output.\n */\nfunction deflateSetDictionary(strm, dictionary) {\n  var dictLength = dictionary.length;\n\n  var s;\n  var str, n;\n  var wrap;\n  var avail;\n  var next;\n  var input;\n  var tmpDict;\n\n  if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {\n    return Z_STREAM_ERROR;\n  }\n\n  s = strm.state;\n  wrap = s.wrap;\n\n  if (wrap === 2 || (wrap === 1 && s.status !== INIT_STATE) || s.lookahead) {\n    return Z_STREAM_ERROR;\n  }\n\n  /* when using zlib wrappers, compute Adler-32 for provided dictionary */\n  if (wrap === 1) {\n    /* adler32(strm->adler, dictionary, dictLength); */\n    strm.adler = adler32(strm.adler, dictionary, dictLength, 0);\n  }\n\n  s.wrap = 0;   /* avoid computing Adler-32 in read_buf */\n\n  /* if dictionary would fill window, just replace the history */\n  if (dictLength >= s.w_size) {\n    if (wrap === 0) {            /* already empty otherwise */\n      /*** CLEAR_HASH(s); ***/\n      zero(s.head); // Fill with NIL (= 0);\n      s.strstart = 0;\n      s.block_start = 0;\n      s.insert = 0;\n    }\n    /* use the tail */\n    // dictionary = dictionary.slice(dictLength - s.w_size);\n    tmpDict = new utils.Buf8(s.w_size);\n    utils.arraySet(tmpDict, dictionary, dictLength - s.w_size, s.w_size, 0);\n    dictionary = tmpDict;\n    dictLength = s.w_size;\n  }\n  /* insert dictionary into window and hash */\n  avail = strm.avail_in;\n  next = strm.next_in;\n  input = strm.input;\n  strm.avail_in = dictLength;\n  strm.next_in = 0;\n  strm.input = dictionary;\n  fill_window(s);\n  while (s.lookahead >= MIN_MATCH) {\n    str = s.strstart;\n    n = s.lookahead - (MIN_MATCH - 1);\n    do {\n      /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */\n      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask;\n\n      s.prev[str & s.w_mask] = s.head[s.ins_h];\n\n      s.head[s.ins_h] = str;\n      str++;\n    } while (--n);\n    s.strstart = str;\n    s.lookahead = MIN_MATCH - 1;\n    fill_window(s);\n  }\n  s.strstart += s.lookahead;\n  s.block_start = s.strstart;\n  s.insert = s.lookahead;\n  s.lookahead = 0;\n  s.match_length = s.prev_length = MIN_MATCH - 1;\n  s.match_available = 0;\n  strm.next_in = next;\n  strm.input = input;\n  strm.avail_in = avail;\n  s.wrap = wrap;\n  return Z_OK;\n}\n\n\nexports.deflateInit = deflateInit;\nexports.deflateInit2 = deflateInit2;\nexports.deflateReset = deflateReset;\nexports.deflateResetKeep = deflateResetKeep;\nexports.deflateSetHeader = deflateSetHeader;\nexports.deflate = deflate;\nexports.deflateEnd = deflateEnd;\nexports.deflateSetDictionary = deflateSetDictionary;\nexports.deflateInfo = 'pako deflate (from Nodeca project)';\n\n/* Not implemented\nexports.deflateBound = deflateBound;\nexports.deflateCopy = deflateCopy;\nexports.deflateParams = deflateParams;\nexports.deflatePending = deflatePending;\nexports.deflatePrime = deflatePrime;\nexports.deflateTune = deflateTune;\n*/\n\n},{\"../utils/common\":41,\"./adler32\":43,\"./crc32\":45,\"./messages\":51,\"./trees\":52}],47:[function(require,module,exports){\n'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nfunction GZheader() {\n  /* true if compressed data believed to be text */\n  this.text       = 0;\n  /* modification time */\n  this.time       = 0;\n  /* extra flags (not used when writing a gzip file) */\n  this.xflags     = 0;\n  /* operating system */\n  this.os         = 0;\n  /* pointer to extra field or Z_NULL if none */\n  this.extra      = null;\n  /* extra field length (valid if extra != Z_NULL) */\n  this.extra_len  = 0; // Actually, we don't need it in JS,\n                       // but leave for few code modifications\n\n  //\n  // Setup limits is not necessary because in js we should not preallocate memory\n  // for inflate use constant limit in 65536 bytes\n  //\n\n  /* space at extra (only when reading header) */\n  // this.extra_max  = 0;\n  /* pointer to zero-terminated file name or Z_NULL */\n  this.name       = '';\n  /* space at name (only when reading header) */\n  // this.name_max   = 0;\n  /* pointer to zero-terminated comment or Z_NULL */\n  this.comment    = '';\n  /* space at comment (only when reading header) */\n  // this.comm_max   = 0;\n  /* true if there was or will be a header crc */\n  this.hcrc       = 0;\n  /* true when done reading gzip header (not used when writing a gzip file) */\n  this.done       = false;\n}\n\nmodule.exports = GZheader;\n\n},{}],48:[function(require,module,exports){\n'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n// See state defs from inflate.js\nvar BAD = 30;       /* got a data error -- remain here until reset */\nvar TYPE = 12;      /* i: waiting for type bits, including last-flag bit */\n\n/*\n   Decode literal, length, and distance codes and write out the resulting\n   literal and match bytes until either not enough input or output is\n   available, an end-of-block is encountered, or a data error is encountered.\n   When large enough input and output buffers are supplied to inflate(), for\n   example, a 16K input buffer and a 64K output buffer, more than 95% of the\n   inflate execution time is spent in this routine.\n\n   Entry assumptions:\n\n        state.mode === LEN\n        strm.avail_in >= 6\n        strm.avail_out >= 258\n        start >= strm.avail_out\n        state.bits < 8\n\n   On return, state.mode is one of:\n\n        LEN -- ran out of enough output space or enough available input\n        TYPE -- reached end of block code, inflate() to interpret next block\n        BAD -- error in block data\n\n   Notes:\n\n    - The maximum input bits used by a length/distance pair is 15 bits for the\n      length code, 5 bits for the length extra, 15 bits for the distance code,\n      and 13 bits for the distance extra.  This totals 48 bits, or six bytes.\n      Therefore if strm.avail_in >= 6, then there is enough input to avoid\n      checking for available input while decoding.\n\n    - The maximum bytes that a single length/distance pair can output is 258\n      bytes, which is the maximum length that can be coded.  inflate_fast()\n      requires strm.avail_out >= 258 for each loop to avoid checking for\n      output space.\n */\nmodule.exports = function inflate_fast(strm, start) {\n  var state;\n  var _in;                    /* local strm.input */\n  var last;                   /* have enough input while in < last */\n  var _out;                   /* local strm.output */\n  var beg;                    /* inflate()'s initial strm.output */\n  var end;                    /* while out < end, enough space available */\n//#ifdef INFLATE_STRICT\n  var dmax;                   /* maximum distance from zlib header */\n//#endif\n  var wsize;                  /* window size or zero if not using window */\n  var whave;                  /* valid bytes in the window */\n  var wnext;                  /* window write index */\n  // Use `s_window` instead `window`, avoid conflict with instrumentation tools\n  var s_window;               /* allocated sliding window, if wsize != 0 */\n  var hold;                   /* local strm.hold */\n  var bits;                   /* local strm.bits */\n  var lcode;                  /* local strm.lencode */\n  var dcode;                  /* local strm.distcode */\n  var lmask;                  /* mask for first level of length codes */\n  var dmask;                  /* mask for first level of distance codes */\n  var here;                   /* retrieved table entry */\n  var op;                     /* code bits, operation, extra bits, or */\n                              /*  window position, window bytes to copy */\n  var len;                    /* match length, unused bytes */\n  var dist;                   /* match distance */\n  var from;                   /* where to copy match from */\n  var from_source;\n\n\n  var input, output; // JS specific, because we have no pointers\n\n  /* copy state to local variables */\n  state = strm.state;\n  //here = state.here;\n  _in = strm.next_in;\n  input = strm.input;\n  last = _in + (strm.avail_in - 5);\n  _out = strm.next_out;\n  output = strm.output;\n  beg = _out - (start - strm.avail_out);\n  end = _out + (strm.avail_out - 257);\n//#ifdef INFLATE_STRICT\n  dmax = state.dmax;\n//#endif\n  wsize = state.wsize;\n  whave = state.whave;\n  wnext = state.wnext;\n  s_window = state.window;\n  hold = state.hold;\n  bits = state.bits;\n  lcode = state.lencode;\n  dcode = state.distcode;\n  lmask = (1 << state.lenbits) - 1;\n  dmask = (1 << state.distbits) - 1;\n\n\n  /* decode literals and length/distances until end-of-block or not enough\n     input data or output space */\n\n  top:\n  do {\n    if (bits < 15) {\n      hold += input[_in++] << bits;\n      bits += 8;\n      hold += input[_in++] << bits;\n      bits += 8;\n    }\n\n    here = lcode[hold & lmask];\n\n    dolen:\n    for (;;) { // Goto emulation\n      op = here >>> 24/*here.bits*/;\n      hold >>>= op;\n      bits -= op;\n      op = (here >>> 16) & 0xff/*here.op*/;\n      if (op === 0) {                          /* literal */\n        //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n        //        \"inflate:         literal '%c'\\n\" :\n        //        \"inflate:         literal 0x%02x\\n\", here.val));\n        output[_out++] = here & 0xffff/*here.val*/;\n      }\n      else if (op & 16) {                     /* length base */\n        len = here & 0xffff/*here.val*/;\n        op &= 15;                           /* number of extra bits */\n        if (op) {\n          if (bits < op) {\n            hold += input[_in++] << bits;\n            bits += 8;\n          }\n          len += hold & ((1 << op) - 1);\n          hold >>>= op;\n          bits -= op;\n        }\n        //Tracevv((stderr, \"inflate:         length %u\\n\", len));\n        if (bits < 15) {\n          hold += input[_in++] << bits;\n          bits += 8;\n          hold += input[_in++] << bits;\n          bits += 8;\n        }\n        here = dcode[hold & dmask];\n\n        dodist:\n        for (;;) { // goto emulation\n          op = here >>> 24/*here.bits*/;\n          hold >>>= op;\n          bits -= op;\n          op = (here >>> 16) & 0xff/*here.op*/;\n\n          if (op & 16) {                      /* distance base */\n            dist = here & 0xffff/*here.val*/;\n            op &= 15;                       /* number of extra bits */\n            if (bits < op) {\n              hold += input[_in++] << bits;\n              bits += 8;\n              if (bits < op) {\n                hold += input[_in++] << bits;\n                bits += 8;\n              }\n            }\n            dist += hold & ((1 << op) - 1);\n//#ifdef INFLATE_STRICT\n            if (dist > dmax) {\n              strm.msg = 'invalid distance too far back';\n              state.mode = BAD;\n              break top;\n            }\n//#endif\n            hold >>>= op;\n            bits -= op;\n            //Tracevv((stderr, \"inflate:         distance %u\\n\", dist));\n            op = _out - beg;                /* max distance in output */\n            if (dist > op) {                /* see if copy from window */\n              op = dist - op;               /* distance back in window */\n              if (op > whave) {\n                if (state.sane) {\n                  strm.msg = 'invalid distance too far back';\n                  state.mode = BAD;\n                  break top;\n                }\n\n// (!) This block is disabled in zlib defailts,\n// don't enable it for binary compatibility\n//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n//                if (len <= op - whave) {\n//                  do {\n//                    output[_out++] = 0;\n//                  } while (--len);\n//                  continue top;\n//                }\n//                len -= op - whave;\n//                do {\n//                  output[_out++] = 0;\n//                } while (--op > whave);\n//                if (op === 0) {\n//                  from = _out - dist;\n//                  do {\n//                    output[_out++] = output[from++];\n//                  } while (--len);\n//                  continue top;\n//                }\n//#endif\n              }\n              from = 0; // window index\n              from_source = s_window;\n              if (wnext === 0) {           /* very common case */\n                from += wsize - op;\n                if (op < len) {         /* some from window */\n                  len -= op;\n                  do {\n                    output[_out++] = s_window[from++];\n                  } while (--op);\n                  from = _out - dist;  /* rest from output */\n                  from_source = output;\n                }\n              }\n              else if (wnext < op) {      /* wrap around window */\n                from += wsize + wnext - op;\n                op -= wnext;\n                if (op < len) {         /* some from end of window */\n                  len -= op;\n                  do {\n                    output[_out++] = s_window[from++];\n                  } while (--op);\n                  from = 0;\n                  if (wnext < len) {  /* some from start of window */\n                    op = wnext;\n                    len -= op;\n                    do {\n                      output[_out++] = s_window[from++];\n                    } while (--op);\n                    from = _out - dist;      /* rest from output */\n                    from_source = output;\n                  }\n                }\n              }\n              else {                      /* contiguous in window */\n                from += wnext - op;\n                if (op < len) {         /* some from window */\n                  len -= op;\n                  do {\n                    output[_out++] = s_window[from++];\n                  } while (--op);\n                  from = _out - dist;  /* rest from output */\n                  from_source = output;\n                }\n              }\n              while (len > 2) {\n                output[_out++] = from_source[from++];\n                output[_out++] = from_source[from++];\n                output[_out++] = from_source[from++];\n                len -= 3;\n              }\n              if (len) {\n                output[_out++] = from_source[from++];\n                if (len > 1) {\n                  output[_out++] = from_source[from++];\n                }\n              }\n            }\n            else {\n              from = _out - dist;          /* copy direct from output */\n              do {                        /* minimum length is three */\n                output[_out++] = output[from++];\n                output[_out++] = output[from++];\n                output[_out++] = output[from++];\n                len -= 3;\n              } while (len > 2);\n              if (len) {\n                output[_out++] = output[from++];\n                if (len > 1) {\n                  output[_out++] = output[from++];\n                }\n              }\n            }\n          }\n          else if ((op & 64) === 0) {          /* 2nd level distance code */\n            here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];\n            continue dodist;\n          }\n          else {\n            strm.msg = 'invalid distance code';\n            state.mode = BAD;\n            break top;\n          }\n\n          break; // need to emulate goto via \"continue\"\n        }\n      }\n      else if ((op & 64) === 0) {              /* 2nd level length code */\n        here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];\n        continue dolen;\n      }\n      else if (op & 32) {                     /* end-of-block */\n        //Tracevv((stderr, \"inflate:         end of block\\n\"));\n        state.mode = TYPE;\n        break top;\n      }\n      else {\n        strm.msg = 'invalid literal/length code';\n        state.mode = BAD;\n        break top;\n      }\n\n      break; // need to emulate goto via \"continue\"\n    }\n  } while (_in < last && _out < end);\n\n  /* return unused bytes (on entry, bits < 8, so in won't go too far back) */\n  len = bits >> 3;\n  _in -= len;\n  bits -= len << 3;\n  hold &= (1 << bits) - 1;\n\n  /* update state and return */\n  strm.next_in = _in;\n  strm.next_out = _out;\n  strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last));\n  strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end));\n  state.hold = hold;\n  state.bits = bits;\n  return;\n};\n\n},{}],49:[function(require,module,exports){\n'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nvar utils         = require('../utils/common');\nvar adler32       = require('./adler32');\nvar crc32         = require('./crc32');\nvar inflate_fast  = require('./inffast');\nvar inflate_table = require('./inftrees');\n\nvar CODES = 0;\nvar LENS = 1;\nvar DISTS = 2;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\n\n/* Allowed flush values; see deflate() and inflate() below for details */\n//var Z_NO_FLUSH      = 0;\n//var Z_PARTIAL_FLUSH = 1;\n//var Z_SYNC_FLUSH    = 2;\n//var Z_FULL_FLUSH    = 3;\nvar Z_FINISH        = 4;\nvar Z_BLOCK         = 5;\nvar Z_TREES         = 6;\n\n\n/* Return codes for the compression/decompression functions. Negative values\n * are errors, positive values are used for special but normal events.\n */\nvar Z_OK            = 0;\nvar Z_STREAM_END    = 1;\nvar Z_NEED_DICT     = 2;\n//var Z_ERRNO         = -1;\nvar Z_STREAM_ERROR  = -2;\nvar Z_DATA_ERROR    = -3;\nvar Z_MEM_ERROR     = -4;\nvar Z_BUF_ERROR     = -5;\n//var Z_VERSION_ERROR = -6;\n\n/* The deflate compression method */\nvar Z_DEFLATED  = 8;\n\n\n/* STATES ====================================================================*/\n/* ===========================================================================*/\n\n\nvar    HEAD = 1;       /* i: waiting for magic header */\nvar    FLAGS = 2;      /* i: waiting for method and flags (gzip) */\nvar    TIME = 3;       /* i: waiting for modification time (gzip) */\nvar    OS = 4;         /* i: waiting for extra flags and operating system (gzip) */\nvar    EXLEN = 5;      /* i: waiting for extra length (gzip) */\nvar    EXTRA = 6;      /* i: waiting for extra bytes (gzip) */\nvar    NAME = 7;       /* i: waiting for end of file name (gzip) */\nvar    COMMENT = 8;    /* i: waiting for end of comment (gzip) */\nvar    HCRC = 9;       /* i: waiting for header crc (gzip) */\nvar    DICTID = 10;    /* i: waiting for dictionary check value */\nvar    DICT = 11;      /* waiting for inflateSetDictionary() call */\nvar        TYPE = 12;      /* i: waiting for type bits, including last-flag bit */\nvar        TYPEDO = 13;    /* i: same, but skip check to exit inflate on new block */\nvar        STORED = 14;    /* i: waiting for stored size (length and complement) */\nvar        COPY_ = 15;     /* i/o: same as COPY below, but only first time in */\nvar        COPY = 16;      /* i/o: waiting for input or output to copy stored block */\nvar        TABLE = 17;     /* i: waiting for dynamic block table lengths */\nvar        LENLENS = 18;   /* i: waiting for code length code lengths */\nvar        CODELENS = 19;  /* i: waiting for length/lit and distance code lengths */\nvar            LEN_ = 20;      /* i: same as LEN below, but only first time in */\nvar            LEN = 21;       /* i: waiting for length/lit/eob code */\nvar            LENEXT = 22;    /* i: waiting for length extra bits */\nvar            DIST = 23;      /* i: waiting for distance code */\nvar            DISTEXT = 24;   /* i: waiting for distance extra bits */\nvar            MATCH = 25;     /* o: waiting for output space to copy string */\nvar            LIT = 26;       /* o: waiting for output space to write literal */\nvar    CHECK = 27;     /* i: waiting for 32-bit check value */\nvar    LENGTH = 28;    /* i: waiting for 32-bit length (gzip) */\nvar    DONE = 29;      /* finished check, done -- remain here until reset */\nvar    BAD = 30;       /* got a data error -- remain here until reset */\nvar    MEM = 31;       /* got an inflate() memory error -- remain here until reset */\nvar    SYNC = 32;      /* looking for synchronization bytes to restart inflate() */\n\n/* ===========================================================================*/\n\n\n\nvar ENOUGH_LENS = 852;\nvar ENOUGH_DISTS = 592;\n//var ENOUGH =  (ENOUGH_LENS+ENOUGH_DISTS);\n\nvar MAX_WBITS = 15;\n/* 32K LZ77 window */\nvar DEF_WBITS = MAX_WBITS;\n\n\nfunction zswap32(q) {\n  return  (((q >>> 24) & 0xff) +\n          ((q >>> 8) & 0xff00) +\n          ((q & 0xff00) << 8) +\n          ((q & 0xff) << 24));\n}\n\n\nfunction InflateState() {\n  this.mode = 0;             /* current inflate mode */\n  this.last = false;          /* true if processing last block */\n  this.wrap = 0;              /* bit 0 true for zlib, bit 1 true for gzip */\n  this.havedict = false;      /* true if dictionary provided */\n  this.flags = 0;             /* gzip header method and flags (0 if zlib) */\n  this.dmax = 0;              /* zlib header max distance (INFLATE_STRICT) */\n  this.check = 0;             /* protected copy of check value */\n  this.total = 0;             /* protected copy of output count */\n  // TODO: may be {}\n  this.head = null;           /* where to save gzip header information */\n\n  /* sliding window */\n  this.wbits = 0;             /* log base 2 of requested window size */\n  this.wsize = 0;             /* window size or zero if not using window */\n  this.whave = 0;             /* valid bytes in the window */\n  this.wnext = 0;             /* window write index */\n  this.window = null;         /* allocated sliding window, if needed */\n\n  /* bit accumulator */\n  this.hold = 0;              /* input bit accumulator */\n  this.bits = 0;              /* number of bits in \"in\" */\n\n  /* for string and stored block copying */\n  this.length = 0;            /* literal or length of data to copy */\n  this.offset = 0;            /* distance back to copy string from */\n\n  /* for table and code decoding */\n  this.extra = 0;             /* extra bits needed */\n\n  /* fixed and dynamic code tables */\n  this.lencode = null;          /* starting table for length/literal codes */\n  this.distcode = null;         /* starting table for distance codes */\n  this.lenbits = 0;           /* index bits for lencode */\n  this.distbits = 0;          /* index bits for distcode */\n\n  /* dynamic table building */\n  this.ncode = 0;             /* number of code length code lengths */\n  this.nlen = 0;              /* number of length code lengths */\n  this.ndist = 0;             /* number of distance code lengths */\n  this.have = 0;              /* number of code lengths in lens[] */\n  this.next = null;              /* next available space in codes[] */\n\n  this.lens = new utils.Buf16(320); /* temporary storage for code lengths */\n  this.work = new utils.Buf16(288); /* work area for code table building */\n\n  /*\n   because we don't have pointers in js, we use lencode and distcode directly\n   as buffers so we don't need codes\n  */\n  //this.codes = new utils.Buf32(ENOUGH);       /* space for code tables */\n  this.lendyn = null;              /* dynamic table for length/literal codes (JS specific) */\n  this.distdyn = null;             /* dynamic table for distance codes (JS specific) */\n  this.sane = 0;                   /* if false, allow invalid distance too far */\n  this.back = 0;                   /* bits back of last unprocessed length/lit */\n  this.was = 0;                    /* initial length of match */\n}\n\nfunction inflateResetKeep(strm) {\n  var state;\n\n  if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n  state = strm.state;\n  strm.total_in = strm.total_out = state.total = 0;\n  strm.msg = ''; /*Z_NULL*/\n  if (state.wrap) {       /* to support ill-conceived Java test suite */\n    strm.adler = state.wrap & 1;\n  }\n  state.mode = HEAD;\n  state.last = 0;\n  state.havedict = 0;\n  state.dmax = 32768;\n  state.head = null/*Z_NULL*/;\n  state.hold = 0;\n  state.bits = 0;\n  //state.lencode = state.distcode = state.next = state.codes;\n  state.lencode = state.lendyn = new utils.Buf32(ENOUGH_LENS);\n  state.distcode = state.distdyn = new utils.Buf32(ENOUGH_DISTS);\n\n  state.sane = 1;\n  state.back = -1;\n  //Tracev((stderr, \"inflate: reset\\n\"));\n  return Z_OK;\n}\n\nfunction inflateReset(strm) {\n  var state;\n\n  if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n  state = strm.state;\n  state.wsize = 0;\n  state.whave = 0;\n  state.wnext = 0;\n  return inflateResetKeep(strm);\n\n}\n\nfunction inflateReset2(strm, windowBits) {\n  var wrap;\n  var state;\n\n  /* get the state */\n  if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n  state = strm.state;\n\n  /* extract wrap request from windowBits parameter */\n  if (windowBits < 0) {\n    wrap = 0;\n    windowBits = -windowBits;\n  }\n  else {\n    wrap = (windowBits >> 4) + 1;\n    if (windowBits < 48) {\n      windowBits &= 15;\n    }\n  }\n\n  /* set number of window bits, free window if different */\n  if (windowBits && (windowBits < 8 || windowBits > 15)) {\n    return Z_STREAM_ERROR;\n  }\n  if (state.window !== null && state.wbits !== windowBits) {\n    state.window = null;\n  }\n\n  /* update state and reset the rest of it */\n  state.wrap = wrap;\n  state.wbits = windowBits;\n  return inflateReset(strm);\n}\n\nfunction inflateInit2(strm, windowBits) {\n  var ret;\n  var state;\n\n  if (!strm) { return Z_STREAM_ERROR; }\n  //strm.msg = Z_NULL;                 /* in case we return an error */\n\n  state = new InflateState();\n\n  //if (state === Z_NULL) return Z_MEM_ERROR;\n  //Tracev((stderr, \"inflate: allocated\\n\"));\n  strm.state = state;\n  state.window = null/*Z_NULL*/;\n  ret = inflateReset2(strm, windowBits);\n  if (ret !== Z_OK) {\n    strm.state = null/*Z_NULL*/;\n  }\n  return ret;\n}\n\nfunction inflateInit(strm) {\n  return inflateInit2(strm, DEF_WBITS);\n}\n\n\n/*\n Return state with length and distance decoding tables and index sizes set to\n fixed code decoding.  Normally this returns fixed tables from inffixed.h.\n If BUILDFIXED is defined, then instead this routine builds the tables the\n first time it's called, and returns those tables the first time and\n thereafter.  This reduces the size of the code by about 2K bytes, in\n exchange for a little execution time.  However, BUILDFIXED should not be\n used for threaded applications, since the rewriting of the tables and virgin\n may not be thread-safe.\n */\nvar virgin = true;\n\nvar lenfix, distfix; // We have no pointers in JS, so keep tables separate\n\nfunction fixedtables(state) {\n  /* build fixed huffman tables if first call (may not be thread safe) */\n  if (virgin) {\n    var sym;\n\n    lenfix = new utils.Buf32(512);\n    distfix = new utils.Buf32(32);\n\n    /* literal/length table */\n    sym = 0;\n    while (sym < 144) { state.lens[sym++] = 8; }\n    while (sym < 256) { state.lens[sym++] = 9; }\n    while (sym < 280) { state.lens[sym++] = 7; }\n    while (sym < 288) { state.lens[sym++] = 8; }\n\n    inflate_table(LENS,  state.lens, 0, 288, lenfix,   0, state.work, { bits: 9 });\n\n    /* distance table */\n    sym = 0;\n    while (sym < 32) { state.lens[sym++] = 5; }\n\n    inflate_table(DISTS, state.lens, 0, 32,   distfix, 0, state.work, { bits: 5 });\n\n    /* do this just once */\n    virgin = false;\n  }\n\n  state.lencode = lenfix;\n  state.lenbits = 9;\n  state.distcode = distfix;\n  state.distbits = 5;\n}\n\n\n/*\n Update the window with the last wsize (normally 32K) bytes written before\n returning.  If window does not exist yet, create it.  This is only called\n when a window is already in use, or when output has been written during this\n inflate call, but the end of the deflate stream has not been reached yet.\n It is also called to create a window for dictionary data when a dictionary\n is loaded.\n\n Providing output buffers larger than 32K to inflate() should provide a speed\n advantage, since only the last 32K of output is copied to the sliding window\n upon return from inflate(), and since all distances after the first 32K of\n output will fall in the output data, making match copies simpler and faster.\n The advantage may be dependent on the size of the processor's data caches.\n */\nfunction updatewindow(strm, src, end, copy) {\n  var dist;\n  var state = strm.state;\n\n  /* if it hasn't been done already, allocate space for the window */\n  if (state.window === null) {\n    state.wsize = 1 << state.wbits;\n    state.wnext = 0;\n    state.whave = 0;\n\n    state.window = new utils.Buf8(state.wsize);\n  }\n\n  /* copy state->wsize or less output bytes into the circular window */\n  if (copy >= state.wsize) {\n    utils.arraySet(state.window, src, end - state.wsize, state.wsize, 0);\n    state.wnext = 0;\n    state.whave = state.wsize;\n  }\n  else {\n    dist = state.wsize - state.wnext;\n    if (dist > copy) {\n      dist = copy;\n    }\n    //zmemcpy(state->window + state->wnext, end - copy, dist);\n    utils.arraySet(state.window, src, end - copy, dist, state.wnext);\n    copy -= dist;\n    if (copy) {\n      //zmemcpy(state->window, end - copy, copy);\n      utils.arraySet(state.window, src, end - copy, copy, 0);\n      state.wnext = copy;\n      state.whave = state.wsize;\n    }\n    else {\n      state.wnext += dist;\n      if (state.wnext === state.wsize) { state.wnext = 0; }\n      if (state.whave < state.wsize) { state.whave += dist; }\n    }\n  }\n  return 0;\n}\n\nfunction inflate(strm, flush) {\n  var state;\n  var input, output;          // input/output buffers\n  var next;                   /* next input INDEX */\n  var put;                    /* next output INDEX */\n  var have, left;             /* available input and output */\n  var hold;                   /* bit buffer */\n  var bits;                   /* bits in bit buffer */\n  var _in, _out;              /* save starting available input and output */\n  var copy;                   /* number of stored or match bytes to copy */\n  var from;                   /* where to copy match bytes from */\n  var from_source;\n  var here = 0;               /* current decoding table entry */\n  var here_bits, here_op, here_val; // paked \"here\" denormalized (JS specific)\n  //var last;                   /* parent table entry */\n  var last_bits, last_op, last_val; // paked \"last\" denormalized (JS specific)\n  var len;                    /* length to copy for repeats, bits to drop */\n  var ret;                    /* return code */\n  var hbuf = new utils.Buf8(4);    /* buffer for gzip header crc calculation */\n  var opts;\n\n  var n; // temporary var for NEED_BITS\n\n  var order = /* permutation of code lengths */\n    [ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ];\n\n\n  if (!strm || !strm.state || !strm.output ||\n      (!strm.input && strm.avail_in !== 0)) {\n    return Z_STREAM_ERROR;\n  }\n\n  state = strm.state;\n  if (state.mode === TYPE) { state.mode = TYPEDO; }    /* skip check */\n\n\n  //--- LOAD() ---\n  put = strm.next_out;\n  output = strm.output;\n  left = strm.avail_out;\n  next = strm.next_in;\n  input = strm.input;\n  have = strm.avail_in;\n  hold = state.hold;\n  bits = state.bits;\n  //---\n\n  _in = have;\n  _out = left;\n  ret = Z_OK;\n\n  inf_leave: // goto emulation\n  for (;;) {\n    switch (state.mode) {\n    case HEAD:\n      if (state.wrap === 0) {\n        state.mode = TYPEDO;\n        break;\n      }\n      //=== NEEDBITS(16);\n      while (bits < 16) {\n        if (have === 0) { break inf_leave; }\n        have--;\n        hold += input[next++] << bits;\n        bits += 8;\n      }\n      //===//\n      if ((state.wrap & 2) && hold === 0x8b1f) {  /* gzip header */\n        state.check = 0/*crc32(0L, Z_NULL, 0)*/;\n        //=== CRC2(state.check, hold);\n        hbuf[0] = hold & 0xff;\n        hbuf[1] = (hold >>> 8) & 0xff;\n        state.check = crc32(state.check, hbuf, 2, 0);\n        //===//\n\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n        state.mode = FLAGS;\n        break;\n      }\n      state.flags = 0;           /* expect zlib header */\n      if (state.head) {\n        state.head.done = false;\n      }\n      if (!(state.wrap & 1) ||   /* check if zlib header allowed */\n        (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) {\n        strm.msg = 'incorrect header check';\n        state.mode = BAD;\n        break;\n      }\n      if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED) {\n        strm.msg = 'unknown compression method';\n        state.mode = BAD;\n        break;\n      }\n      //--- DROPBITS(4) ---//\n      hold >>>= 4;\n      bits -= 4;\n      //---//\n      len = (hold & 0x0f)/*BITS(4)*/ + 8;\n      if (state.wbits === 0) {\n        state.wbits = len;\n      }\n      else if (len > state.wbits) {\n        strm.msg = 'invalid window size';\n        state.mode = BAD;\n        break;\n      }\n      state.dmax = 1 << len;\n      //Tracev((stderr, \"inflate:   zlib header ok\\n\"));\n      strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;\n      state.mode = hold & 0x200 ? DICTID : TYPE;\n      //=== INITBITS();\n      hold = 0;\n      bits = 0;\n      //===//\n      break;\n    case FLAGS:\n      //=== NEEDBITS(16); */\n      while (bits < 16) {\n        if (have === 0) { break inf_leave; }\n        have--;\n        hold += input[next++] << bits;\n        bits += 8;\n      }\n      //===//\n      state.flags = hold;\n      if ((state.flags & 0xff) !== Z_DEFLATED) {\n        strm.msg = 'unknown compression method';\n        state.mode = BAD;\n        break;\n      }\n      if (state.flags & 0xe000) {\n        strm.msg = 'unknown header flags set';\n        state.mode = BAD;\n        break;\n      }\n      if (state.head) {\n        state.head.text = ((hold >> 8) & 1);\n      }\n      if (state.flags & 0x0200) {\n        //=== CRC2(state.check, hold);\n        hbuf[0] = hold & 0xff;\n        hbuf[1] = (hold >>> 8) & 0xff;\n        state.check = crc32(state.check, hbuf, 2, 0);\n        //===//\n      }\n      //=== INITBITS();\n      hold = 0;\n      bits = 0;\n      //===//\n      state.mode = TIME;\n      /* falls through */\n    case TIME:\n      //=== NEEDBITS(32); */\n      while (bits < 32) {\n        if (have === 0) { break inf_leave; }\n        have--;\n        hold += input[next++] << bits;\n        bits += 8;\n      }\n      //===//\n      if (state.head) {\n        state.head.time = hold;\n      }\n      if (state.flags & 0x0200) {\n        //=== CRC4(state.check, hold)\n        hbuf[0] = hold & 0xff;\n        hbuf[1] = (hold >>> 8) & 0xff;\n        hbuf[2] = (hold >>> 16) & 0xff;\n        hbuf[3] = (hold >>> 24) & 0xff;\n        state.check = crc32(state.check, hbuf, 4, 0);\n        //===\n      }\n      //=== INITBITS();\n      hold = 0;\n      bits = 0;\n      //===//\n      state.mode = OS;\n      /* falls through */\n    case OS:\n      //=== NEEDBITS(16); */\n      while (bits < 16) {\n        if (have === 0) { break inf_leave; }\n        have--;\n        hold += input[next++] << bits;\n        bits += 8;\n      }\n      //===//\n      if (state.head) {\n        state.head.xflags = (hold & 0xff);\n        state.head.os = (hold >> 8);\n      }\n      if (state.flags & 0x0200) {\n        //=== CRC2(state.check, hold);\n        hbuf[0] = hold & 0xff;\n        hbuf[1] = (hold >>> 8) & 0xff;\n        state.check = crc32(state.check, hbuf, 2, 0);\n        //===//\n      }\n      //=== INITBITS();\n      hold = 0;\n      bits = 0;\n      //===//\n      state.mode = EXLEN;\n      /* falls through */\n    case EXLEN:\n      if (state.flags & 0x0400) {\n        //=== NEEDBITS(16); */\n        while (bits < 16) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        state.length = hold;\n        if (state.head) {\n          state.head.extra_len = hold;\n        }\n        if (state.flags & 0x0200) {\n          //=== CRC2(state.check, hold);\n          hbuf[0] = hold & 0xff;\n          hbuf[1] = (hold >>> 8) & 0xff;\n          state.check = crc32(state.check, hbuf, 2, 0);\n          //===//\n        }\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n      }\n      else if (state.head) {\n        state.head.extra = null/*Z_NULL*/;\n      }\n      state.mode = EXTRA;\n      /* falls through */\n    case EXTRA:\n      if (state.flags & 0x0400) {\n        copy = state.length;\n        if (copy > have) { copy = have; }\n        if (copy) {\n          if (state.head) {\n            len = state.head.extra_len - state.length;\n            if (!state.head.extra) {\n              // Use untyped array for more conveniend processing later\n              state.head.extra = new Array(state.head.extra_len);\n            }\n            utils.arraySet(\n              state.head.extra,\n              input,\n              next,\n              // extra field is limited to 65536 bytes\n              // - no need for additional size check\n              copy,\n              /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/\n              len\n            );\n            //zmemcpy(state.head.extra + len, next,\n            //        len + copy > state.head.extra_max ?\n            //        state.head.extra_max - len : copy);\n          }\n          if (state.flags & 0x0200) {\n            state.check = crc32(state.check, input, copy, next);\n          }\n          have -= copy;\n          next += copy;\n          state.length -= copy;\n        }\n        if (state.length) { break inf_leave; }\n      }\n      state.length = 0;\n      state.mode = NAME;\n      /* falls through */\n    case NAME:\n      if (state.flags & 0x0800) {\n        if (have === 0) { break inf_leave; }\n        copy = 0;\n        do {\n          // TODO: 2 or 1 bytes?\n          len = input[next + copy++];\n          /* use constant limit because in js we should not preallocate memory */\n          if (state.head && len &&\n              (state.length < 65536 /*state.head.name_max*/)) {\n            state.head.name += String.fromCharCode(len);\n          }\n        } while (len && copy < have);\n\n        if (state.flags & 0x0200) {\n          state.check = crc32(state.check, input, copy, next);\n        }\n        have -= copy;\n        next += copy;\n        if (len) { break inf_leave; }\n      }\n      else if (state.head) {\n        state.head.name = null;\n      }\n      state.length = 0;\n      state.mode = COMMENT;\n      /* falls through */\n    case COMMENT:\n      if (state.flags & 0x1000) {\n        if (have === 0) { break inf_leave; }\n        copy = 0;\n        do {\n          len = input[next + copy++];\n          /* use constant limit because in js we should not preallocate memory */\n          if (state.head && len &&\n              (state.length < 65536 /*state.head.comm_max*/)) {\n            state.head.comment += String.fromCharCode(len);\n          }\n        } while (len && copy < have);\n        if (state.flags & 0x0200) {\n          state.check = crc32(state.check, input, copy, next);\n        }\n        have -= copy;\n        next += copy;\n        if (len) { break inf_leave; }\n      }\n      else if (state.head) {\n        state.head.comment = null;\n      }\n      state.mode = HCRC;\n      /* falls through */\n    case HCRC:\n      if (state.flags & 0x0200) {\n        //=== NEEDBITS(16); */\n        while (bits < 16) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        if (hold !== (state.check & 0xffff)) {\n          strm.msg = 'header crc mismatch';\n          state.mode = BAD;\n          break;\n        }\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n      }\n      if (state.head) {\n        state.head.hcrc = ((state.flags >> 9) & 1);\n        state.head.done = true;\n      }\n      strm.adler = state.check = 0;\n      state.mode = TYPE;\n      break;\n    case DICTID:\n      //=== NEEDBITS(32); */\n      while (bits < 32) {\n        if (have === 0) { break inf_leave; }\n        have--;\n        hold += input[next++] << bits;\n        bits += 8;\n      }\n      //===//\n      strm.adler = state.check = zswap32(hold);\n      //=== INITBITS();\n      hold = 0;\n      bits = 0;\n      //===//\n      state.mode = DICT;\n      /* falls through */\n    case DICT:\n      if (state.havedict === 0) {\n        //--- RESTORE() ---\n        strm.next_out = put;\n        strm.avail_out = left;\n        strm.next_in = next;\n        strm.avail_in = have;\n        state.hold = hold;\n        state.bits = bits;\n        //---\n        return Z_NEED_DICT;\n      }\n      strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;\n      state.mode = TYPE;\n      /* falls through */\n    case TYPE:\n      if (flush === Z_BLOCK || flush === Z_TREES) { break inf_leave; }\n      /* falls through */\n    case TYPEDO:\n      if (state.last) {\n        //--- BYTEBITS() ---//\n        hold >>>= bits & 7;\n        bits -= bits & 7;\n        //---//\n        state.mode = CHECK;\n        break;\n      }\n      //=== NEEDBITS(3); */\n      while (bits < 3) {\n        if (have === 0) { break inf_leave; }\n        have--;\n        hold += input[next++] << bits;\n        bits += 8;\n      }\n      //===//\n      state.last = (hold & 0x01)/*BITS(1)*/;\n      //--- DROPBITS(1) ---//\n      hold >>>= 1;\n      bits -= 1;\n      //---//\n\n      switch ((hold & 0x03)/*BITS(2)*/) {\n      case 0:                             /* stored block */\n        //Tracev((stderr, \"inflate:     stored block%s\\n\",\n        //        state.last ? \" (last)\" : \"\"));\n        state.mode = STORED;\n        break;\n      case 1:                             /* fixed block */\n        fixedtables(state);\n        //Tracev((stderr, \"inflate:     fixed codes block%s\\n\",\n        //        state.last ? \" (last)\" : \"\"));\n        state.mode = LEN_;             /* decode codes */\n        if (flush === Z_TREES) {\n          //--- DROPBITS(2) ---//\n          hold >>>= 2;\n          bits -= 2;\n          //---//\n          break inf_leave;\n        }\n        break;\n      case 2:                             /* dynamic block */\n        //Tracev((stderr, \"inflate:     dynamic codes block%s\\n\",\n        //        state.last ? \" (last)\" : \"\"));\n        state.mode = TABLE;\n        break;\n      case 3:\n        strm.msg = 'invalid block type';\n        state.mode = BAD;\n      }\n      //--- DROPBITS(2) ---//\n      hold >>>= 2;\n      bits -= 2;\n      //---//\n      break;\n    case STORED:\n      //--- BYTEBITS() ---// /* go to byte boundary */\n      hold >>>= bits & 7;\n      bits -= bits & 7;\n      //---//\n      //=== NEEDBITS(32); */\n      while (bits < 32) {\n        if (have === 0) { break inf_leave; }\n        have--;\n        hold += input[next++] << bits;\n        bits += 8;\n      }\n      //===//\n      if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) {\n        strm.msg = 'invalid stored block lengths';\n        state.mode = BAD;\n        break;\n      }\n      state.length = hold & 0xffff;\n      //Tracev((stderr, \"inflate:       stored length %u\\n\",\n      //        state.length));\n      //=== INITBITS();\n      hold = 0;\n      bits = 0;\n      //===//\n      state.mode = COPY_;\n      if (flush === Z_TREES) { break inf_leave; }\n      /* falls through */\n    case COPY_:\n      state.mode = COPY;\n      /* falls through */\n    case COPY:\n      copy = state.length;\n      if (copy) {\n        if (copy > have) { copy = have; }\n        if (copy > left) { copy = left; }\n        if (copy === 0) { break inf_leave; }\n        //--- zmemcpy(put, next, copy); ---\n        utils.arraySet(output, input, next, copy, put);\n        //---//\n        have -= copy;\n        next += copy;\n        left -= copy;\n        put += copy;\n        state.length -= copy;\n        break;\n      }\n      //Tracev((stderr, \"inflate:       stored end\\n\"));\n      state.mode = TYPE;\n      break;\n    case TABLE:\n      //=== NEEDBITS(14); */\n      while (bits < 14) {\n        if (have === 0) { break inf_leave; }\n        have--;\n        hold += input[next++] << bits;\n        bits += 8;\n      }\n      //===//\n      state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257;\n      //--- DROPBITS(5) ---//\n      hold >>>= 5;\n      bits -= 5;\n      //---//\n      state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1;\n      //--- DROPBITS(5) ---//\n      hold >>>= 5;\n      bits -= 5;\n      //---//\n      state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4;\n      //--- DROPBITS(4) ---//\n      hold >>>= 4;\n      bits -= 4;\n      //---//\n//#ifndef PKZIP_BUG_WORKAROUND\n      if (state.nlen > 286 || state.ndist > 30) {\n        strm.msg = 'too many length or distance symbols';\n        state.mode = BAD;\n        break;\n      }\n//#endif\n      //Tracev((stderr, \"inflate:       table sizes ok\\n\"));\n      state.have = 0;\n      state.mode = LENLENS;\n      /* falls through */\n    case LENLENS:\n      while (state.have < state.ncode) {\n        //=== NEEDBITS(3);\n        while (bits < 3) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        state.lens[order[state.have++]] = (hold & 0x07);//BITS(3);\n        //--- DROPBITS(3) ---//\n        hold >>>= 3;\n        bits -= 3;\n        //---//\n      }\n      while (state.have < 19) {\n        state.lens[order[state.have++]] = 0;\n      }\n      // We have separate tables & no pointers. 2 commented lines below not needed.\n      //state.next = state.codes;\n      //state.lencode = state.next;\n      // Switch to use dynamic table\n      state.lencode = state.lendyn;\n      state.lenbits = 7;\n\n      opts = { bits: state.lenbits };\n      ret = inflate_table(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts);\n      state.lenbits = opts.bits;\n\n      if (ret) {\n        strm.msg = 'invalid code lengths set';\n        state.mode = BAD;\n        break;\n      }\n      //Tracev((stderr, \"inflate:       code lengths ok\\n\"));\n      state.have = 0;\n      state.mode = CODELENS;\n      /* falls through */\n    case CODELENS:\n      while (state.have < state.nlen + state.ndist) {\n        for (;;) {\n          here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/\n          here_bits = here >>> 24;\n          here_op = (here >>> 16) & 0xff;\n          here_val = here & 0xffff;\n\n          if ((here_bits) <= bits) { break; }\n          //--- PULLBYTE() ---//\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n          //---//\n        }\n        if (here_val < 16) {\n          //--- DROPBITS(here.bits) ---//\n          hold >>>= here_bits;\n          bits -= here_bits;\n          //---//\n          state.lens[state.have++] = here_val;\n        }\n        else {\n          if (here_val === 16) {\n            //=== NEEDBITS(here.bits + 2);\n            n = here_bits + 2;\n            while (bits < n) {\n              if (have === 0) { break inf_leave; }\n              have--;\n              hold += input[next++] << bits;\n              bits += 8;\n            }\n            //===//\n            //--- DROPBITS(here.bits) ---//\n            hold >>>= here_bits;\n            bits -= here_bits;\n            //---//\n            if (state.have === 0) {\n              strm.msg = 'invalid bit length repeat';\n              state.mode = BAD;\n              break;\n            }\n            len = state.lens[state.have - 1];\n            copy = 3 + (hold & 0x03);//BITS(2);\n            //--- DROPBITS(2) ---//\n            hold >>>= 2;\n            bits -= 2;\n            //---//\n          }\n          else if (here_val === 17) {\n            //=== NEEDBITS(here.bits + 3);\n            n = here_bits + 3;\n            while (bits < n) {\n              if (have === 0) { break inf_leave; }\n              have--;\n              hold += input[next++] << bits;\n              bits += 8;\n            }\n            //===//\n            //--- DROPBITS(here.bits) ---//\n            hold >>>= here_bits;\n            bits -= here_bits;\n            //---//\n            len = 0;\n            copy = 3 + (hold & 0x07);//BITS(3);\n            //--- DROPBITS(3) ---//\n            hold >>>= 3;\n            bits -= 3;\n            //---//\n          }\n          else {\n            //=== NEEDBITS(here.bits + 7);\n            n = here_bits + 7;\n            while (bits < n) {\n              if (have === 0) { break inf_leave; }\n              have--;\n              hold += input[next++] << bits;\n              bits += 8;\n            }\n            //===//\n            //--- DROPBITS(here.bits) ---//\n            hold >>>= here_bits;\n            bits -= here_bits;\n            //---//\n            len = 0;\n            copy = 11 + (hold & 0x7f);//BITS(7);\n            //--- DROPBITS(7) ---//\n            hold >>>= 7;\n            bits -= 7;\n            //---//\n          }\n          if (state.have + copy > state.nlen + state.ndist) {\n            strm.msg = 'invalid bit length repeat';\n            state.mode = BAD;\n            break;\n          }\n          while (copy--) {\n            state.lens[state.have++] = len;\n          }\n        }\n      }\n\n      /* handle error breaks in while */\n      if (state.mode === BAD) { break; }\n\n      /* check for end-of-block code (better have one) */\n      if (state.lens[256] === 0) {\n        strm.msg = 'invalid code -- missing end-of-block';\n        state.mode = BAD;\n        break;\n      }\n\n      /* build code tables -- note: do not change the lenbits or distbits\n         values here (9 and 6) without reading the comments in inftrees.h\n         concerning the ENOUGH constants, which depend on those values */\n      state.lenbits = 9;\n\n      opts = { bits: state.lenbits };\n      ret = inflate_table(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts);\n      // We have separate tables & no pointers. 2 commented lines below not needed.\n      // state.next_index = opts.table_index;\n      state.lenbits = opts.bits;\n      // state.lencode = state.next;\n\n      if (ret) {\n        strm.msg = 'invalid literal/lengths set';\n        state.mode = BAD;\n        break;\n      }\n\n      state.distbits = 6;\n      //state.distcode.copy(state.codes);\n      // Switch to use dynamic table\n      state.distcode = state.distdyn;\n      opts = { bits: state.distbits };\n      ret = inflate_table(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts);\n      // We have separate tables & no pointers. 2 commented lines below not needed.\n      // state.next_index = opts.table_index;\n      state.distbits = opts.bits;\n      // state.distcode = state.next;\n\n      if (ret) {\n        strm.msg = 'invalid distances set';\n        state.mode = BAD;\n        break;\n      }\n      //Tracev((stderr, 'inflate:       codes ok\\n'));\n      state.mode = LEN_;\n      if (flush === Z_TREES) { break inf_leave; }\n      /* falls through */\n    case LEN_:\n      state.mode = LEN;\n      /* falls through */\n    case LEN:\n      if (have >= 6 && left >= 258) {\n        //--- RESTORE() ---\n        strm.next_out = put;\n        strm.avail_out = left;\n        strm.next_in = next;\n        strm.avail_in = have;\n        state.hold = hold;\n        state.bits = bits;\n        //---\n        inflate_fast(strm, _out);\n        //--- LOAD() ---\n        put = strm.next_out;\n        output = strm.output;\n        left = strm.avail_out;\n        next = strm.next_in;\n        input = strm.input;\n        have = strm.avail_in;\n        hold = state.hold;\n        bits = state.bits;\n        //---\n\n        if (state.mode === TYPE) {\n          state.back = -1;\n        }\n        break;\n      }\n      state.back = 0;\n      for (;;) {\n        here = state.lencode[hold & ((1 << state.lenbits) - 1)];  /*BITS(state.lenbits)*/\n        here_bits = here >>> 24;\n        here_op = (here >>> 16) & 0xff;\n        here_val = here & 0xffff;\n\n        if (here_bits <= bits) { break; }\n        //--- PULLBYTE() ---//\n        if (have === 0) { break inf_leave; }\n        have--;\n        hold += input[next++] << bits;\n        bits += 8;\n        //---//\n      }\n      if (here_op && (here_op & 0xf0) === 0) {\n        last_bits = here_bits;\n        last_op = here_op;\n        last_val = here_val;\n        for (;;) {\n          here = state.lencode[last_val +\n                  ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];\n          here_bits = here >>> 24;\n          here_op = (here >>> 16) & 0xff;\n          here_val = here & 0xffff;\n\n          if ((last_bits + here_bits) <= bits) { break; }\n          //--- PULLBYTE() ---//\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n          //---//\n        }\n        //--- DROPBITS(last.bits) ---//\n        hold >>>= last_bits;\n        bits -= last_bits;\n        //---//\n        state.back += last_bits;\n      }\n      //--- DROPBITS(here.bits) ---//\n      hold >>>= here_bits;\n      bits -= here_bits;\n      //---//\n      state.back += here_bits;\n      state.length = here_val;\n      if (here_op === 0) {\n        //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n        //        \"inflate:         literal '%c'\\n\" :\n        //        \"inflate:         literal 0x%02x\\n\", here.val));\n        state.mode = LIT;\n        break;\n      }\n      if (here_op & 32) {\n        //Tracevv((stderr, \"inflate:         end of block\\n\"));\n        state.back = -1;\n        state.mode = TYPE;\n        break;\n      }\n      if (here_op & 64) {\n        strm.msg = 'invalid literal/length code';\n        state.mode = BAD;\n        break;\n      }\n      state.extra = here_op & 15;\n      state.mode = LENEXT;\n      /* falls through */\n    case LENEXT:\n      if (state.extra) {\n        //=== NEEDBITS(state.extra);\n        n = state.extra;\n        while (bits < n) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        state.length += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;\n        //--- DROPBITS(state.extra) ---//\n        hold >>>= state.extra;\n        bits -= state.extra;\n        //---//\n        state.back += state.extra;\n      }\n      //Tracevv((stderr, \"inflate:         length %u\\n\", state.length));\n      state.was = state.length;\n      state.mode = DIST;\n      /* falls through */\n    case DIST:\n      for (;;) {\n        here = state.distcode[hold & ((1 << state.distbits) - 1)];/*BITS(state.distbits)*/\n        here_bits = here >>> 24;\n        here_op = (here >>> 16) & 0xff;\n        here_val = here & 0xffff;\n\n        if ((here_bits) <= bits) { break; }\n        //--- PULLBYTE() ---//\n        if (have === 0) { break inf_leave; }\n        have--;\n        hold += input[next++] << bits;\n        bits += 8;\n        //---//\n      }\n      if ((here_op & 0xf0) === 0) {\n        last_bits = here_bits;\n        last_op = here_op;\n        last_val = here_val;\n        for (;;) {\n          here = state.distcode[last_val +\n                  ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];\n          here_bits = here >>> 24;\n          here_op = (here >>> 16) & 0xff;\n          here_val = here & 0xffff;\n\n          if ((last_bits + here_bits) <= bits) { break; }\n          //--- PULLBYTE() ---//\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n          //---//\n        }\n        //--- DROPBITS(last.bits) ---//\n        hold >>>= last_bits;\n        bits -= last_bits;\n        //---//\n        state.back += last_bits;\n      }\n      //--- DROPBITS(here.bits) ---//\n      hold >>>= here_bits;\n      bits -= here_bits;\n      //---//\n      state.back += here_bits;\n      if (here_op & 64) {\n        strm.msg = 'invalid distance code';\n        state.mode = BAD;\n        break;\n      }\n      state.offset = here_val;\n      state.extra = (here_op) & 15;\n      state.mode = DISTEXT;\n      /* falls through */\n    case DISTEXT:\n      if (state.extra) {\n        //=== NEEDBITS(state.extra);\n        n = state.extra;\n        while (bits < n) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        state.offset += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;\n        //--- DROPBITS(state.extra) ---//\n        hold >>>= state.extra;\n        bits -= state.extra;\n        //---//\n        state.back += state.extra;\n      }\n//#ifdef INFLATE_STRICT\n      if (state.offset > state.dmax) {\n        strm.msg = 'invalid distance too far back';\n        state.mode = BAD;\n        break;\n      }\n//#endif\n      //Tracevv((stderr, \"inflate:         distance %u\\n\", state.offset));\n      state.mode = MATCH;\n      /* falls through */\n    case MATCH:\n      if (left === 0) { break inf_leave; }\n      copy = _out - left;\n      if (state.offset > copy) {         /* copy from window */\n        copy = state.offset - copy;\n        if (copy > state.whave) {\n          if (state.sane) {\n            strm.msg = 'invalid distance too far back';\n            state.mode = BAD;\n            break;\n          }\n// (!) This block is disabled in zlib defailts,\n// don't enable it for binary compatibility\n//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n//          Trace((stderr, \"inflate.c too far\\n\"));\n//          copy -= state.whave;\n//          if (copy > state.length) { copy = state.length; }\n//          if (copy > left) { copy = left; }\n//          left -= copy;\n//          state.length -= copy;\n//          do {\n//            output[put++] = 0;\n//          } while (--copy);\n//          if (state.length === 0) { state.mode = LEN; }\n//          break;\n//#endif\n        }\n        if (copy > state.wnext) {\n          copy -= state.wnext;\n          from = state.wsize - copy;\n        }\n        else {\n          from = state.wnext - copy;\n        }\n        if (copy > state.length) { copy = state.length; }\n        from_source = state.window;\n      }\n      else {                              /* copy from output */\n        from_source = output;\n        from = put - state.offset;\n        copy = state.length;\n      }\n      if (copy > left) { copy = left; }\n      left -= copy;\n      state.length -= copy;\n      do {\n        output[put++] = from_source[from++];\n      } while (--copy);\n      if (state.length === 0) { state.mode = LEN; }\n      break;\n    case LIT:\n      if (left === 0) { break inf_leave; }\n      output[put++] = state.length;\n      left--;\n      state.mode = LEN;\n      break;\n    case CHECK:\n      if (state.wrap) {\n        //=== NEEDBITS(32);\n        while (bits < 32) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          // Use '|' insdead of '+' to make sure that result is signed\n          hold |= input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        _out -= left;\n        strm.total_out += _out;\n        state.total += _out;\n        if (_out) {\n          strm.adler = state.check =\n              /*UPDATE(state.check, put - _out, _out);*/\n              (state.flags ? crc32(state.check, output, _out, put - _out) : adler32(state.check, output, _out, put - _out));\n\n        }\n        _out = left;\n        // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too\n        if ((state.flags ? hold : zswap32(hold)) !== state.check) {\n          strm.msg = 'incorrect data check';\n          state.mode = BAD;\n          break;\n        }\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n        //Tracev((stderr, \"inflate:   check matches trailer\\n\"));\n      }\n      state.mode = LENGTH;\n      /* falls through */\n    case LENGTH:\n      if (state.wrap && state.flags) {\n        //=== NEEDBITS(32);\n        while (bits < 32) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        if (hold !== (state.total & 0xffffffff)) {\n          strm.msg = 'incorrect length check';\n          state.mode = BAD;\n          break;\n        }\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n        //Tracev((stderr, \"inflate:   length matches trailer\\n\"));\n      }\n      state.mode = DONE;\n      /* falls through */\n    case DONE:\n      ret = Z_STREAM_END;\n      break inf_leave;\n    case BAD:\n      ret = Z_DATA_ERROR;\n      break inf_leave;\n    case MEM:\n      return Z_MEM_ERROR;\n    case SYNC:\n      /* falls through */\n    default:\n      return Z_STREAM_ERROR;\n    }\n  }\n\n  // inf_leave <- here is real place for \"goto inf_leave\", emulated via \"break inf_leave\"\n\n  /*\n     Return from inflate(), updating the total counts and the check value.\n     If there was no progress during the inflate() call, return a buffer\n     error.  Call updatewindow() to create and/or update the window state.\n     Note: a memory error from inflate() is non-recoverable.\n   */\n\n  //--- RESTORE() ---\n  strm.next_out = put;\n  strm.avail_out = left;\n  strm.next_in = next;\n  strm.avail_in = have;\n  state.hold = hold;\n  state.bits = bits;\n  //---\n\n  if (state.wsize || (_out !== strm.avail_out && state.mode < BAD &&\n                      (state.mode < CHECK || flush !== Z_FINISH))) {\n    if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) {\n      state.mode = MEM;\n      return Z_MEM_ERROR;\n    }\n  }\n  _in -= strm.avail_in;\n  _out -= strm.avail_out;\n  strm.total_in += _in;\n  strm.total_out += _out;\n  state.total += _out;\n  if (state.wrap && _out) {\n    strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/\n      (state.flags ? crc32(state.check, output, _out, strm.next_out - _out) : adler32(state.check, output, _out, strm.next_out - _out));\n  }\n  strm.data_type = state.bits + (state.last ? 64 : 0) +\n                    (state.mode === TYPE ? 128 : 0) +\n                    (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0);\n  if (((_in === 0 && _out === 0) || flush === Z_FINISH) && ret === Z_OK) {\n    ret = Z_BUF_ERROR;\n  }\n  return ret;\n}\n\nfunction inflateEnd(strm) {\n\n  if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) {\n    return Z_STREAM_ERROR;\n  }\n\n  var state = strm.state;\n  if (state.window) {\n    state.window = null;\n  }\n  strm.state = null;\n  return Z_OK;\n}\n\nfunction inflateGetHeader(strm, head) {\n  var state;\n\n  /* check state */\n  if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n  state = strm.state;\n  if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR; }\n\n  /* save header structure */\n  state.head = head;\n  head.done = false;\n  return Z_OK;\n}\n\nfunction inflateSetDictionary(strm, dictionary) {\n  var dictLength = dictionary.length;\n\n  var state;\n  var dictid;\n  var ret;\n\n  /* check state */\n  if (!strm /* == Z_NULL */ || !strm.state /* == Z_NULL */) { return Z_STREAM_ERROR; }\n  state = strm.state;\n\n  if (state.wrap !== 0 && state.mode !== DICT) {\n    return Z_STREAM_ERROR;\n  }\n\n  /* check for correct dictionary identifier */\n  if (state.mode === DICT) {\n    dictid = 1; /* adler32(0, null, 0)*/\n    /* dictid = adler32(dictid, dictionary, dictLength); */\n    dictid = adler32(dictid, dictionary, dictLength, 0);\n    if (dictid !== state.check) {\n      return Z_DATA_ERROR;\n    }\n  }\n  /* copy dictionary to window using updatewindow(), which will amend the\n   existing dictionary if appropriate */\n  ret = updatewindow(strm, dictionary, dictLength, dictLength);\n  if (ret) {\n    state.mode = MEM;\n    return Z_MEM_ERROR;\n  }\n  state.havedict = 1;\n  // Tracev((stderr, \"inflate:   dictionary set\\n\"));\n  return Z_OK;\n}\n\nexports.inflateReset = inflateReset;\nexports.inflateReset2 = inflateReset2;\nexports.inflateResetKeep = inflateResetKeep;\nexports.inflateInit = inflateInit;\nexports.inflateInit2 = inflateInit2;\nexports.inflate = inflate;\nexports.inflateEnd = inflateEnd;\nexports.inflateGetHeader = inflateGetHeader;\nexports.inflateSetDictionary = inflateSetDictionary;\nexports.inflateInfo = 'pako inflate (from Nodeca project)';\n\n/* Not implemented\nexports.inflateCopy = inflateCopy;\nexports.inflateGetDictionary = inflateGetDictionary;\nexports.inflateMark = inflateMark;\nexports.inflatePrime = inflatePrime;\nexports.inflateSync = inflateSync;\nexports.inflateSyncPoint = inflateSyncPoint;\nexports.inflateUndermine = inflateUndermine;\n*/\n\n},{\"../utils/common\":41,\"./adler32\":43,\"./crc32\":45,\"./inffast\":48,\"./inftrees\":50}],50:[function(require,module,exports){\n'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nvar utils = require('../utils/common');\n\nvar MAXBITS = 15;\nvar ENOUGH_LENS = 852;\nvar ENOUGH_DISTS = 592;\n//var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);\n\nvar CODES = 0;\nvar LENS = 1;\nvar DISTS = 2;\n\nvar lbase = [ /* Length codes 257..285 base */\n  3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,\n  35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0\n];\n\nvar lext = [ /* Length codes 257..285 extra */\n  16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,\n  19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78\n];\n\nvar dbase = [ /* Distance codes 0..29 base */\n  1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,\n  257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,\n  8193, 12289, 16385, 24577, 0, 0\n];\n\nvar dext = [ /* Distance codes 0..29 extra */\n  16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,\n  23, 23, 24, 24, 25, 25, 26, 26, 27, 27,\n  28, 28, 29, 29, 64, 64\n];\n\nmodule.exports = function inflate_table(type, lens, lens_index, codes, table, table_index, work, opts)\n{\n  var bits = opts.bits;\n      //here = opts.here; /* table entry for duplication */\n\n  var len = 0;               /* a code's length in bits */\n  var sym = 0;               /* index of code symbols */\n  var min = 0, max = 0;          /* minimum and maximum code lengths */\n  var root = 0;              /* number of index bits for root table */\n  var curr = 0;              /* number of index bits for current table */\n  var drop = 0;              /* code bits to drop for sub-table */\n  var left = 0;                   /* number of prefix codes available */\n  var used = 0;              /* code entries in table used */\n  var huff = 0;              /* Huffman code */\n  var incr;              /* for incrementing code, index */\n  var fill;              /* index for replicating entries */\n  var low;               /* low bits for current root entry */\n  var mask;              /* mask for low root bits */\n  var next;             /* next available space in table */\n  var base = null;     /* base value table to use */\n  var base_index = 0;\n//  var shoextra;    /* extra bits table to use */\n  var end;                    /* use base and extra for symbol > end */\n  var count = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1];    /* number of codes of each length */\n  var offs = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1];     /* offsets in table for each length */\n  var extra = null;\n  var extra_index = 0;\n\n  var here_bits, here_op, here_val;\n\n  /*\n   Process a set of code lengths to create a canonical Huffman code.  The\n   code lengths are lens[0..codes-1].  Each length corresponds to the\n   symbols 0..codes-1.  The Huffman code is generated by first sorting the\n   symbols by length from short to long, and retaining the symbol order\n   for codes with equal lengths.  Then the code starts with all zero bits\n   for the first code of the shortest length, and the codes are integer\n   increments for the same length, and zeros are appended as the length\n   increases.  For the deflate format, these bits are stored backwards\n   from their more natural integer increment ordering, and so when the\n   decoding tables are built in the large loop below, the integer codes\n   are incremented backwards.\n\n   This routine assumes, but does not check, that all of the entries in\n   lens[] are in the range 0..MAXBITS.  The caller must assure this.\n   1..MAXBITS is interpreted as that code length.  zero means that that\n   symbol does not occur in this code.\n\n   The codes are sorted by computing a count of codes for each length,\n   creating from that a table of starting indices for each length in the\n   sorted table, and then entering the symbols in order in the sorted\n   table.  The sorted table is work[], with that space being provided by\n   the caller.\n\n   The length counts are used for other purposes as well, i.e. finding\n   the minimum and maximum length codes, determining if there are any\n   codes at all, checking for a valid set of lengths, and looking ahead\n   at length counts to determine sub-table sizes when building the\n   decoding tables.\n   */\n\n  /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */\n  for (len = 0; len <= MAXBITS; len++) {\n    count[len] = 0;\n  }\n  for (sym = 0; sym < codes; sym++) {\n    count[lens[lens_index + sym]]++;\n  }\n\n  /* bound code lengths, force root to be within code lengths */\n  root = bits;\n  for (max = MAXBITS; max >= 1; max--) {\n    if (count[max] !== 0) { break; }\n  }\n  if (root > max) {\n    root = max;\n  }\n  if (max === 0) {                     /* no symbols to code at all */\n    //table.op[opts.table_index] = 64;  //here.op = (var char)64;    /* invalid code marker */\n    //table.bits[opts.table_index] = 1;   //here.bits = (var char)1;\n    //table.val[opts.table_index++] = 0;   //here.val = (var short)0;\n    table[table_index++] = (1 << 24) | (64 << 16) | 0;\n\n\n    //table.op[opts.table_index] = 64;\n    //table.bits[opts.table_index] = 1;\n    //table.val[opts.table_index++] = 0;\n    table[table_index++] = (1 << 24) | (64 << 16) | 0;\n\n    opts.bits = 1;\n    return 0;     /* no symbols, but wait for decoding to report error */\n  }\n  for (min = 1; min < max; min++) {\n    if (count[min] !== 0) { break; }\n  }\n  if (root < min) {\n    root = min;\n  }\n\n  /* check for an over-subscribed or incomplete set of lengths */\n  left = 1;\n  for (len = 1; len <= MAXBITS; len++) {\n    left <<= 1;\n    left -= count[len];\n    if (left < 0) {\n      return -1;\n    }        /* over-subscribed */\n  }\n  if (left > 0 && (type === CODES || max !== 1)) {\n    return -1;                      /* incomplete set */\n  }\n\n  /* generate offsets into symbol table for each length for sorting */\n  offs[1] = 0;\n  for (len = 1; len < MAXBITS; len++) {\n    offs[len + 1] = offs[len] + count[len];\n  }\n\n  /* sort symbols by length, by symbol order within each length */\n  for (sym = 0; sym < codes; sym++) {\n    if (lens[lens_index + sym] !== 0) {\n      work[offs[lens[lens_index + sym]]++] = sym;\n    }\n  }\n\n  /*\n   Create and fill in decoding tables.  In this loop, the table being\n   filled is at next and has curr index bits.  The code being used is huff\n   with length len.  That code is converted to an index by dropping drop\n   bits off of the bottom.  For codes where len is less than drop + curr,\n   those top drop + curr - len bits are incremented through all values to\n   fill the table with replicated entries.\n\n   root is the number of index bits for the root table.  When len exceeds\n   root, sub-tables are created pointed to by the root entry with an index\n   of the low root bits of huff.  This is saved in low to check for when a\n   new sub-table should be started.  drop is zero when the root table is\n   being filled, and drop is root when sub-tables are being filled.\n\n   When a new sub-table is needed, it is necessary to look ahead in the\n   code lengths to determine what size sub-table is needed.  The length\n   counts are used for this, and so count[] is decremented as codes are\n   entered in the tables.\n\n   used keeps track of how many table entries have been allocated from the\n   provided *table space.  It is checked for LENS and DIST tables against\n   the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in\n   the initial root table size constants.  See the comments in inftrees.h\n   for more information.\n\n   sym increments through all symbols, and the loop terminates when\n   all codes of length max, i.e. all codes, have been processed.  This\n   routine permits incomplete codes, so another loop after this one fills\n   in the rest of the decoding tables with invalid code markers.\n   */\n\n  /* set up for code type */\n  // poor man optimization - use if-else instead of switch,\n  // to avoid deopts in old v8\n  if (type === CODES) {\n    base = extra = work;    /* dummy value--not used */\n    end = 19;\n\n  } else if (type === LENS) {\n    base = lbase;\n    base_index -= 257;\n    extra = lext;\n    extra_index -= 257;\n    end = 256;\n\n  } else {                    /* DISTS */\n    base = dbase;\n    extra = dext;\n    end = -1;\n  }\n\n  /* initialize opts for loop */\n  huff = 0;                   /* starting code */\n  sym = 0;                    /* starting code symbol */\n  len = min;                  /* starting code length */\n  next = table_index;              /* current table to fill in */\n  curr = root;                /* current table index bits */\n  drop = 0;                   /* current bits to drop from code for index */\n  low = -1;                   /* trigger new sub-table when len > root */\n  used = 1 << root;          /* use root table entries */\n  mask = used - 1;            /* mask for comparing low */\n\n  /* check available table space */\n  if ((type === LENS && used > ENOUGH_LENS) ||\n    (type === DISTS && used > ENOUGH_DISTS)) {\n    return 1;\n  }\n\n  /* process all codes and make table entries */\n  for (;;) {\n    /* create table entry */\n    here_bits = len - drop;\n    if (work[sym] < end) {\n      here_op = 0;\n      here_val = work[sym];\n    }\n    else if (work[sym] > end) {\n      here_op = extra[extra_index + work[sym]];\n      here_val = base[base_index + work[sym]];\n    }\n    else {\n      here_op = 32 + 64;         /* end of block */\n      here_val = 0;\n    }\n\n    /* replicate for those indices with low len bits equal to huff */\n    incr = 1 << (len - drop);\n    fill = 1 << curr;\n    min = fill;                 /* save offset to next table */\n    do {\n      fill -= incr;\n      table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0;\n    } while (fill !== 0);\n\n    /* backwards increment the len-bit code huff */\n    incr = 1 << (len - 1);\n    while (huff & incr) {\n      incr >>= 1;\n    }\n    if (incr !== 0) {\n      huff &= incr - 1;\n      huff += incr;\n    } else {\n      huff = 0;\n    }\n\n    /* go to next symbol, update count, len */\n    sym++;\n    if (--count[len] === 0) {\n      if (len === max) { break; }\n      len = lens[lens_index + work[sym]];\n    }\n\n    /* create new sub-table if needed */\n    if (len > root && (huff & mask) !== low) {\n      /* if first time, transition to sub-tables */\n      if (drop === 0) {\n        drop = root;\n      }\n\n      /* increment past last table */\n      next += min;            /* here min is 1 << curr */\n\n      /* determine length of next table */\n      curr = len - drop;\n      left = 1 << curr;\n      while (curr + drop < max) {\n        left -= count[curr + drop];\n        if (left <= 0) { break; }\n        curr++;\n        left <<= 1;\n      }\n\n      /* check for enough space */\n      used += 1 << curr;\n      if ((type === LENS && used > ENOUGH_LENS) ||\n        (type === DISTS && used > ENOUGH_DISTS)) {\n        return 1;\n      }\n\n      /* point entry in root table to sub-table */\n      low = huff & mask;\n      /*table.op[low] = curr;\n      table.bits[low] = root;\n      table.val[low] = next - opts.table_index;*/\n      table[low] = (root << 24) | (curr << 16) | (next - table_index) |0;\n    }\n  }\n\n  /* fill in remaining table entry if code is incomplete (guaranteed to have\n   at most one remaining entry, since if the code is incomplete, the\n   maximum code length that was allowed to get this far is one bit) */\n  if (huff !== 0) {\n    //table.op[next + huff] = 64;            /* invalid code marker */\n    //table.bits[next + huff] = len - drop;\n    //table.val[next + huff] = 0;\n    table[next + huff] = ((len - drop) << 24) | (64 << 16) |0;\n  }\n\n  /* set return parameters */\n  //opts.table_index += used;\n  opts.bits = root;\n  return 0;\n};\n\n},{\"../utils/common\":41}],51:[function(require,module,exports){\n'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nmodule.exports = {\n  2:      'need dictionary',     /* Z_NEED_DICT       2  */\n  1:      'stream end',          /* Z_STREAM_END      1  */\n  0:      '',                    /* Z_OK              0  */\n  '-1':   'file error',          /* Z_ERRNO         (-1) */\n  '-2':   'stream error',        /* Z_STREAM_ERROR  (-2) */\n  '-3':   'data error',          /* Z_DATA_ERROR    (-3) */\n  '-4':   'insufficient memory', /* Z_MEM_ERROR     (-4) */\n  '-5':   'buffer error',        /* Z_BUF_ERROR     (-5) */\n  '-6':   'incompatible version' /* Z_VERSION_ERROR (-6) */\n};\n\n},{}],52:[function(require,module,exports){\n'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nvar utils = require('../utils/common');\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\n\n//var Z_FILTERED          = 1;\n//var Z_HUFFMAN_ONLY      = 2;\n//var Z_RLE               = 3;\nvar Z_FIXED               = 4;\n//var Z_DEFAULT_STRATEGY  = 0;\n\n/* Possible values of the data_type field (though see inflate()) */\nvar Z_BINARY              = 0;\nvar Z_TEXT                = 1;\n//var Z_ASCII             = 1; // = Z_TEXT\nvar Z_UNKNOWN             = 2;\n\n/*============================================================================*/\n\n\nfunction zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } }\n\n// From zutil.h\n\nvar STORED_BLOCK = 0;\nvar STATIC_TREES = 1;\nvar DYN_TREES    = 2;\n/* The three kinds of block type */\n\nvar MIN_MATCH    = 3;\nvar MAX_MATCH    = 258;\n/* The minimum and maximum match lengths */\n\n// From deflate.h\n/* ===========================================================================\n * Internal compression state.\n */\n\nvar LENGTH_CODES  = 29;\n/* number of length codes, not counting the special END_BLOCK code */\n\nvar LITERALS      = 256;\n/* number of literal bytes 0..255 */\n\nvar L_CODES       = LITERALS + 1 + LENGTH_CODES;\n/* number of Literal or Length codes, including the END_BLOCK code */\n\nvar D_CODES       = 30;\n/* number of distance codes */\n\nvar BL_CODES      = 19;\n/* number of codes used to transfer the bit lengths */\n\nvar HEAP_SIZE     = 2 * L_CODES + 1;\n/* maximum heap size */\n\nvar MAX_BITS      = 15;\n/* All codes must not exceed MAX_BITS bits */\n\nvar Buf_size      = 16;\n/* size of bit buffer in bi_buf */\n\n\n/* ===========================================================================\n * Constants\n */\n\nvar MAX_BL_BITS = 7;\n/* Bit length codes must not exceed MAX_BL_BITS bits */\n\nvar END_BLOCK   = 256;\n/* end of block literal code */\n\nvar REP_3_6     = 16;\n/* repeat previous bit length 3-6 times (2 bits of repeat count) */\n\nvar REPZ_3_10   = 17;\n/* repeat a zero length 3-10 times  (3 bits of repeat count) */\n\nvar REPZ_11_138 = 18;\n/* repeat a zero length 11-138 times  (7 bits of repeat count) */\n\n/* eslint-disable comma-spacing,array-bracket-spacing */\nvar extra_lbits =   /* extra bits for each length code */\n  [0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0];\n\nvar extra_dbits =   /* extra bits for each distance code */\n  [0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13];\n\nvar extra_blbits =  /* extra bits for each bit length code */\n  [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7];\n\nvar bl_order =\n  [16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];\n/* eslint-enable comma-spacing,array-bracket-spacing */\n\n/* The lengths of the bit length codes are sent in order of decreasing\n * probability, to avoid transmitting the lengths for unused bit length codes.\n */\n\n/* ===========================================================================\n * Local data. These are initialized only once.\n */\n\n// We pre-fill arrays with 0 to avoid uninitialized gaps\n\nvar DIST_CODE_LEN = 512; /* see definition of array dist_code below */\n\n// !!!! Use flat array insdead of structure, Freq = i*2, Len = i*2+1\nvar static_ltree  = new Array((L_CODES + 2) * 2);\nzero(static_ltree);\n/* The static literal tree. Since the bit lengths are imposed, there is no\n * need for the L_CODES extra codes used during heap construction. However\n * The codes 286 and 287 are needed to build a canonical tree (see _tr_init\n * below).\n */\n\nvar static_dtree  = new Array(D_CODES * 2);\nzero(static_dtree);\n/* The static distance tree. (Actually a trivial tree since all codes use\n * 5 bits.)\n */\n\nvar _dist_code    = new Array(DIST_CODE_LEN);\nzero(_dist_code);\n/* Distance codes. The first 256 values correspond to the distances\n * 3 .. 258, the last 256 values correspond to the top 8 bits of\n * the 15 bit distances.\n */\n\nvar _length_code  = new Array(MAX_MATCH - MIN_MATCH + 1);\nzero(_length_code);\n/* length code for each normalized match length (0 == MIN_MATCH) */\n\nvar base_length   = new Array(LENGTH_CODES);\nzero(base_length);\n/* First normalized length for each code (0 = MIN_MATCH) */\n\nvar base_dist     = new Array(D_CODES);\nzero(base_dist);\n/* First normalized distance for each code (0 = distance of 1) */\n\n\nfunction StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_length) {\n\n  this.static_tree  = static_tree;  /* static tree or NULL */\n  this.extra_bits   = extra_bits;   /* extra bits for each code or NULL */\n  this.extra_base   = extra_base;   /* base index for extra_bits */\n  this.elems        = elems;        /* max number of elements in the tree */\n  this.max_length   = max_length;   /* max bit length for the codes */\n\n  // show if `static_tree` has data or dummy - needed for monomorphic objects\n  this.has_stree    = static_tree && static_tree.length;\n}\n\n\nvar static_l_desc;\nvar static_d_desc;\nvar static_bl_desc;\n\n\nfunction TreeDesc(dyn_tree, stat_desc) {\n  this.dyn_tree = dyn_tree;     /* the dynamic tree */\n  this.max_code = 0;            /* largest code with non zero frequency */\n  this.stat_desc = stat_desc;   /* the corresponding static tree */\n}\n\n\n\nfunction d_code(dist) {\n  return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)];\n}\n\n\n/* ===========================================================================\n * Output a short LSB first on the stream.\n * IN assertion: there is enough room in pendingBuf.\n */\nfunction put_short(s, w) {\n//    put_byte(s, (uch)((w) & 0xff));\n//    put_byte(s, (uch)((ush)(w) >> 8));\n  s.pending_buf[s.pending++] = (w) & 0xff;\n  s.pending_buf[s.pending++] = (w >>> 8) & 0xff;\n}\n\n\n/* ===========================================================================\n * Send a value on a given number of bits.\n * IN assertion: length <= 16 and value fits in length bits.\n */\nfunction send_bits(s, value, length) {\n  if (s.bi_valid > (Buf_size - length)) {\n    s.bi_buf |= (value << s.bi_valid) & 0xffff;\n    put_short(s, s.bi_buf);\n    s.bi_buf = value >> (Buf_size - s.bi_valid);\n    s.bi_valid += length - Buf_size;\n  } else {\n    s.bi_buf |= (value << s.bi_valid) & 0xffff;\n    s.bi_valid += length;\n  }\n}\n\n\nfunction send_code(s, c, tree) {\n  send_bits(s, tree[c * 2]/*.Code*/, tree[c * 2 + 1]/*.Len*/);\n}\n\n\n/* ===========================================================================\n * Reverse the first len bits of a code, using straightforward code (a faster\n * method would use a table)\n * IN assertion: 1 <= len <= 15\n */\nfunction bi_reverse(code, len) {\n  var res = 0;\n  do {\n    res |= code & 1;\n    code >>>= 1;\n    res <<= 1;\n  } while (--len > 0);\n  return res >>> 1;\n}\n\n\n/* ===========================================================================\n * Flush the bit buffer, keeping at most 7 bits in it.\n */\nfunction bi_flush(s) {\n  if (s.bi_valid === 16) {\n    put_short(s, s.bi_buf);\n    s.bi_buf = 0;\n    s.bi_valid = 0;\n\n  } else if (s.bi_valid >= 8) {\n    s.pending_buf[s.pending++] = s.bi_buf & 0xff;\n    s.bi_buf >>= 8;\n    s.bi_valid -= 8;\n  }\n}\n\n\n/* ===========================================================================\n * Compute the optimal bit lengths for a tree and update the total bit length\n * for the current block.\n * IN assertion: the fields freq and dad are set, heap[heap_max] and\n *    above are the tree nodes sorted by increasing frequency.\n * OUT assertions: the field len is set to the optimal bit length, the\n *     array bl_count contains the frequencies for each bit length.\n *     The length opt_len is updated; static_len is also updated if stree is\n *     not null.\n */\nfunction gen_bitlen(s, desc)\n//    deflate_state *s;\n//    tree_desc *desc;    /* the tree descriptor */\n{\n  var tree            = desc.dyn_tree;\n  var max_code        = desc.max_code;\n  var stree           = desc.stat_desc.static_tree;\n  var has_stree       = desc.stat_desc.has_stree;\n  var extra           = desc.stat_desc.extra_bits;\n  var base            = desc.stat_desc.extra_base;\n  var max_length      = desc.stat_desc.max_length;\n  var h;              /* heap index */\n  var n, m;           /* iterate over the tree elements */\n  var bits;           /* bit length */\n  var xbits;          /* extra bits */\n  var f;              /* frequency */\n  var overflow = 0;   /* number of elements with bit length too large */\n\n  for (bits = 0; bits <= MAX_BITS; bits++) {\n    s.bl_count[bits] = 0;\n  }\n\n  /* In a first pass, compute the optimal bit lengths (which may\n   * overflow in the case of the bit length tree).\n   */\n  tree[s.heap[s.heap_max] * 2 + 1]/*.Len*/ = 0; /* root of the heap */\n\n  for (h = s.heap_max + 1; h < HEAP_SIZE; h++) {\n    n = s.heap[h];\n    bits = tree[tree[n * 2 + 1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1;\n    if (bits > max_length) {\n      bits = max_length;\n      overflow++;\n    }\n    tree[n * 2 + 1]/*.Len*/ = bits;\n    /* We overwrite tree[n].Dad which is no longer needed */\n\n    if (n > max_code) { continue; } /* not a leaf node */\n\n    s.bl_count[bits]++;\n    xbits = 0;\n    if (n >= base) {\n      xbits = extra[n - base];\n    }\n    f = tree[n * 2]/*.Freq*/;\n    s.opt_len += f * (bits + xbits);\n    if (has_stree) {\n      s.static_len += f * (stree[n * 2 + 1]/*.Len*/ + xbits);\n    }\n  }\n  if (overflow === 0) { return; }\n\n  // Trace((stderr,\"\\nbit length overflow\\n\"));\n  /* This happens for example on obj2 and pic of the Calgary corpus */\n\n  /* Find the first bit length which could increase: */\n  do {\n    bits = max_length - 1;\n    while (s.bl_count[bits] === 0) { bits--; }\n    s.bl_count[bits]--;      /* move one leaf down the tree */\n    s.bl_count[bits + 1] += 2; /* move one overflow item as its brother */\n    s.bl_count[max_length]--;\n    /* The brother of the overflow item also moves one step up,\n     * but this does not affect bl_count[max_length]\n     */\n    overflow -= 2;\n  } while (overflow > 0);\n\n  /* Now recompute all bit lengths, scanning in increasing frequency.\n   * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all\n   * lengths instead of fixing only the wrong ones. This idea is taken\n   * from 'ar' written by Haruhiko Okumura.)\n   */\n  for (bits = max_length; bits !== 0; bits--) {\n    n = s.bl_count[bits];\n    while (n !== 0) {\n      m = s.heap[--h];\n      if (m > max_code) { continue; }\n      if (tree[m * 2 + 1]/*.Len*/ !== bits) {\n        // Trace((stderr,\"code %d bits %d->%d\\n\", m, tree[m].Len, bits));\n        s.opt_len += (bits - tree[m * 2 + 1]/*.Len*/) * tree[m * 2]/*.Freq*/;\n        tree[m * 2 + 1]/*.Len*/ = bits;\n      }\n      n--;\n    }\n  }\n}\n\n\n/* ===========================================================================\n * Generate the codes for a given tree and bit counts (which need not be\n * optimal).\n * IN assertion: the array bl_count contains the bit length statistics for\n * the given tree and the field len is set for all tree elements.\n * OUT assertion: the field code is set for all tree elements of non\n *     zero code length.\n */\nfunction gen_codes(tree, max_code, bl_count)\n//    ct_data *tree;             /* the tree to decorate */\n//    int max_code;              /* largest code with non zero frequency */\n//    ushf *bl_count;            /* number of codes at each bit length */\n{\n  var next_code = new Array(MAX_BITS + 1); /* next code value for each bit length */\n  var code = 0;              /* running code value */\n  var bits;                  /* bit index */\n  var n;                     /* code index */\n\n  /* The distribution counts are first used to generate the code values\n   * without bit reversal.\n   */\n  for (bits = 1; bits <= MAX_BITS; bits++) {\n    next_code[bits] = code = (code + bl_count[bits - 1]) << 1;\n  }\n  /* Check that the bit counts in bl_count are consistent. The last code\n   * must be all ones.\n   */\n  //Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1,\n  //        \"inconsistent bit counts\");\n  //Tracev((stderr,\"\\ngen_codes: max_code %d \", max_code));\n\n  for (n = 0;  n <= max_code; n++) {\n    var len = tree[n * 2 + 1]/*.Len*/;\n    if (len === 0) { continue; }\n    /* Now reverse the bits */\n    tree[n * 2]/*.Code*/ = bi_reverse(next_code[len]++, len);\n\n    //Tracecv(tree != static_ltree, (stderr,\"\\nn %3d %c l %2d c %4x (%x) \",\n    //     n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1));\n  }\n}\n\n\n/* ===========================================================================\n * Initialize the various 'constant' tables.\n */\nfunction tr_static_init() {\n  var n;        /* iterates over tree elements */\n  var bits;     /* bit counter */\n  var length;   /* length value */\n  var code;     /* code value */\n  var dist;     /* distance index */\n  var bl_count = new Array(MAX_BITS + 1);\n  /* number of codes at each bit length for an optimal tree */\n\n  // do check in _tr_init()\n  //if (static_init_done) return;\n\n  /* For some embedded targets, global variables are not initialized: */\n/*#ifdef NO_INIT_GLOBAL_POINTERS\n  static_l_desc.static_tree = static_ltree;\n  static_l_desc.extra_bits = extra_lbits;\n  static_d_desc.static_tree = static_dtree;\n  static_d_desc.extra_bits = extra_dbits;\n  static_bl_desc.extra_bits = extra_blbits;\n#endif*/\n\n  /* Initialize the mapping length (0..255) -> length code (0..28) */\n  length = 0;\n  for (code = 0; code < LENGTH_CODES - 1; code++) {\n    base_length[code] = length;\n    for (n = 0; n < (1 << extra_lbits[code]); n++) {\n      _length_code[length++] = code;\n    }\n  }\n  //Assert (length == 256, \"tr_static_init: length != 256\");\n  /* Note that the length 255 (match length 258) can be represented\n   * in two different ways: code 284 + 5 bits or code 285, so we\n   * overwrite length_code[255] to use the best encoding:\n   */\n  _length_code[length - 1] = code;\n\n  /* Initialize the mapping dist (0..32K) -> dist code (0..29) */\n  dist = 0;\n  for (code = 0; code < 16; code++) {\n    base_dist[code] = dist;\n    for (n = 0; n < (1 << extra_dbits[code]); n++) {\n      _dist_code[dist++] = code;\n    }\n  }\n  //Assert (dist == 256, \"tr_static_init: dist != 256\");\n  dist >>= 7; /* from now on, all distances are divided by 128 */\n  for (; code < D_CODES; code++) {\n    base_dist[code] = dist << 7;\n    for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) {\n      _dist_code[256 + dist++] = code;\n    }\n  }\n  //Assert (dist == 256, \"tr_static_init: 256+dist != 512\");\n\n  /* Construct the codes of the static literal tree */\n  for (bits = 0; bits <= MAX_BITS; bits++) {\n    bl_count[bits] = 0;\n  }\n\n  n = 0;\n  while (n <= 143) {\n    static_ltree[n * 2 + 1]/*.Len*/ = 8;\n    n++;\n    bl_count[8]++;\n  }\n  while (n <= 255) {\n    static_ltree[n * 2 + 1]/*.Len*/ = 9;\n    n++;\n    bl_count[9]++;\n  }\n  while (n <= 279) {\n    static_ltree[n * 2 + 1]/*.Len*/ = 7;\n    n++;\n    bl_count[7]++;\n  }\n  while (n <= 287) {\n    static_ltree[n * 2 + 1]/*.Len*/ = 8;\n    n++;\n    bl_count[8]++;\n  }\n  /* Codes 286 and 287 do not exist, but we must include them in the\n   * tree construction to get a canonical Huffman tree (longest code\n   * all ones)\n   */\n  gen_codes(static_ltree, L_CODES + 1, bl_count);\n\n  /* The static distance tree is trivial: */\n  for (n = 0; n < D_CODES; n++) {\n    static_dtree[n * 2 + 1]/*.Len*/ = 5;\n    static_dtree[n * 2]/*.Code*/ = bi_reverse(n, 5);\n  }\n\n  // Now data ready and we can init static trees\n  static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS + 1, L_CODES, MAX_BITS);\n  static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0,          D_CODES, MAX_BITS);\n  static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0,         BL_CODES, MAX_BL_BITS);\n\n  //static_init_done = true;\n}\n\n\n/* ===========================================================================\n * Initialize a new block.\n */\nfunction init_block(s) {\n  var n; /* iterates over tree elements */\n\n  /* Initialize the trees. */\n  for (n = 0; n < L_CODES;  n++) { s.dyn_ltree[n * 2]/*.Freq*/ = 0; }\n  for (n = 0; n < D_CODES;  n++) { s.dyn_dtree[n * 2]/*.Freq*/ = 0; }\n  for (n = 0; n < BL_CODES; n++) { s.bl_tree[n * 2]/*.Freq*/ = 0; }\n\n  s.dyn_ltree[END_BLOCK * 2]/*.Freq*/ = 1;\n  s.opt_len = s.static_len = 0;\n  s.last_lit = s.matches = 0;\n}\n\n\n/* ===========================================================================\n * Flush the bit buffer and align the output on a byte boundary\n */\nfunction bi_windup(s)\n{\n  if (s.bi_valid > 8) {\n    put_short(s, s.bi_buf);\n  } else if (s.bi_valid > 0) {\n    //put_byte(s, (Byte)s->bi_buf);\n    s.pending_buf[s.pending++] = s.bi_buf;\n  }\n  s.bi_buf = 0;\n  s.bi_valid = 0;\n}\n\n/* ===========================================================================\n * Copy a stored block, storing first the length and its\n * one's complement if requested.\n */\nfunction copy_block(s, buf, len, header)\n//DeflateState *s;\n//charf    *buf;    /* the input data */\n//unsigned len;     /* its length */\n//int      header;  /* true if block header must be written */\n{\n  bi_windup(s);        /* align on byte boundary */\n\n  if (header) {\n    put_short(s, len);\n    put_short(s, ~len);\n  }\n//  while (len--) {\n//    put_byte(s, *buf++);\n//  }\n  utils.arraySet(s.pending_buf, s.window, buf, len, s.pending);\n  s.pending += len;\n}\n\n/* ===========================================================================\n * Compares to subtrees, using the tree depth as tie breaker when\n * the subtrees have equal frequency. This minimizes the worst case length.\n */\nfunction smaller(tree, n, m, depth) {\n  var _n2 = n * 2;\n  var _m2 = m * 2;\n  return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ ||\n         (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m]));\n}\n\n/* ===========================================================================\n * Restore the heap property by moving down the tree starting at node k,\n * exchanging a node with the smallest of its two sons if necessary, stopping\n * when the heap property is re-established (each father smaller than its\n * two sons).\n */\nfunction pqdownheap(s, tree, k)\n//    deflate_state *s;\n//    ct_data *tree;  /* the tree to restore */\n//    int k;               /* node to move down */\n{\n  var v = s.heap[k];\n  var j = k << 1;  /* left son of k */\n  while (j <= s.heap_len) {\n    /* Set j to the smallest of the two sons: */\n    if (j < s.heap_len &&\n      smaller(tree, s.heap[j + 1], s.heap[j], s.depth)) {\n      j++;\n    }\n    /* Exit if v is smaller than both sons */\n    if (smaller(tree, v, s.heap[j], s.depth)) { break; }\n\n    /* Exchange v with the smallest son */\n    s.heap[k] = s.heap[j];\n    k = j;\n\n    /* And continue down the tree, setting j to the left son of k */\n    j <<= 1;\n  }\n  s.heap[k] = v;\n}\n\n\n// inlined manually\n// var SMALLEST = 1;\n\n/* ===========================================================================\n * Send the block data compressed using the given Huffman trees\n */\nfunction compress_block(s, ltree, dtree)\n//    deflate_state *s;\n//    const ct_data *ltree; /* literal tree */\n//    const ct_data *dtree; /* distance tree */\n{\n  var dist;           /* distance of matched string */\n  var lc;             /* match length or unmatched char (if dist == 0) */\n  var lx = 0;         /* running index in l_buf */\n  var code;           /* the code to send */\n  var extra;          /* number of extra bits to send */\n\n  if (s.last_lit !== 0) {\n    do {\n      dist = (s.pending_buf[s.d_buf + lx * 2] << 8) | (s.pending_buf[s.d_buf + lx * 2 + 1]);\n      lc = s.pending_buf[s.l_buf + lx];\n      lx++;\n\n      if (dist === 0) {\n        send_code(s, lc, ltree); /* send a literal byte */\n        //Tracecv(isgraph(lc), (stderr,\" '%c' \", lc));\n      } else {\n        /* Here, lc is the match length - MIN_MATCH */\n        code = _length_code[lc];\n        send_code(s, code + LITERALS + 1, ltree); /* send the length code */\n        extra = extra_lbits[code];\n        if (extra !== 0) {\n          lc -= base_length[code];\n          send_bits(s, lc, extra);       /* send the extra length bits */\n        }\n        dist--; /* dist is now the match distance - 1 */\n        code = d_code(dist);\n        //Assert (code < D_CODES, \"bad d_code\");\n\n        send_code(s, code, dtree);       /* send the distance code */\n        extra = extra_dbits[code];\n        if (extra !== 0) {\n          dist -= base_dist[code];\n          send_bits(s, dist, extra);   /* send the extra distance bits */\n        }\n      } /* literal or match pair ? */\n\n      /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */\n      //Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx,\n      //       \"pendingBuf overflow\");\n\n    } while (lx < s.last_lit);\n  }\n\n  send_code(s, END_BLOCK, ltree);\n}\n\n\n/* ===========================================================================\n * Construct one Huffman tree and assigns the code bit strings and lengths.\n * Update the total bit length for the current block.\n * IN assertion: the field freq is set for all tree elements.\n * OUT assertions: the fields len and code are set to the optimal bit length\n *     and corresponding code. The length opt_len is updated; static_len is\n *     also updated if stree is not null. The field max_code is set.\n */\nfunction build_tree(s, desc)\n//    deflate_state *s;\n//    tree_desc *desc; /* the tree descriptor */\n{\n  var tree     = desc.dyn_tree;\n  var stree    = desc.stat_desc.static_tree;\n  var has_stree = desc.stat_desc.has_stree;\n  var elems    = desc.stat_desc.elems;\n  var n, m;          /* iterate over heap elements */\n  var max_code = -1; /* largest code with non zero frequency */\n  var node;          /* new node being created */\n\n  /* Construct the initial heap, with least frequent element in\n   * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].\n   * heap[0] is not used.\n   */\n  s.heap_len = 0;\n  s.heap_max = HEAP_SIZE;\n\n  for (n = 0; n < elems; n++) {\n    if (tree[n * 2]/*.Freq*/ !== 0) {\n      s.heap[++s.heap_len] = max_code = n;\n      s.depth[n] = 0;\n\n    } else {\n      tree[n * 2 + 1]/*.Len*/ = 0;\n    }\n  }\n\n  /* The pkzip format requires that at least one distance code exists,\n   * and that at least one bit should be sent even if there is only one\n   * possible code. So to avoid special checks later on we force at least\n   * two codes of non zero frequency.\n   */\n  while (s.heap_len < 2) {\n    node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0);\n    tree[node * 2]/*.Freq*/ = 1;\n    s.depth[node] = 0;\n    s.opt_len--;\n\n    if (has_stree) {\n      s.static_len -= stree[node * 2 + 1]/*.Len*/;\n    }\n    /* node is 0 or 1 so it does not have extra bits */\n  }\n  desc.max_code = max_code;\n\n  /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,\n   * establish sub-heaps of increasing lengths:\n   */\n  for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap(s, tree, n); }\n\n  /* Construct the Huffman tree by repeatedly combining the least two\n   * frequent nodes.\n   */\n  node = elems;              /* next internal node of the tree */\n  do {\n    //pqremove(s, tree, n);  /* n = node of least frequency */\n    /*** pqremove ***/\n    n = s.heap[1/*SMALLEST*/];\n    s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--];\n    pqdownheap(s, tree, 1/*SMALLEST*/);\n    /***/\n\n    m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */\n\n    s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */\n    s.heap[--s.heap_max] = m;\n\n    /* Create a new node father of n and m */\n    tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/;\n    s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1;\n    tree[n * 2 + 1]/*.Dad*/ = tree[m * 2 + 1]/*.Dad*/ = node;\n\n    /* and insert the new node in the heap */\n    s.heap[1/*SMALLEST*/] = node++;\n    pqdownheap(s, tree, 1/*SMALLEST*/);\n\n  } while (s.heap_len >= 2);\n\n  s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/];\n\n  /* At this point, the fields freq and dad are set. We can now\n   * generate the bit lengths.\n   */\n  gen_bitlen(s, desc);\n\n  /* The field len is now set, we can generate the bit codes */\n  gen_codes(tree, max_code, s.bl_count);\n}\n\n\n/* ===========================================================================\n * Scan a literal or distance tree to determine the frequencies of the codes\n * in the bit length tree.\n */\nfunction scan_tree(s, tree, max_code)\n//    deflate_state *s;\n//    ct_data *tree;   /* the tree to be scanned */\n//    int max_code;    /* and its largest code of non zero frequency */\n{\n  var n;                     /* iterates over all tree elements */\n  var prevlen = -1;          /* last emitted length */\n  var curlen;                /* length of current code */\n\n  var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */\n\n  var count = 0;             /* repeat count of the current code */\n  var max_count = 7;         /* max repeat count */\n  var min_count = 4;         /* min repeat count */\n\n  if (nextlen === 0) {\n    max_count = 138;\n    min_count = 3;\n  }\n  tree[(max_code + 1) * 2 + 1]/*.Len*/ = 0xffff; /* guard */\n\n  for (n = 0; n <= max_code; n++) {\n    curlen = nextlen;\n    nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;\n\n    if (++count < max_count && curlen === nextlen) {\n      continue;\n\n    } else if (count < min_count) {\n      s.bl_tree[curlen * 2]/*.Freq*/ += count;\n\n    } else if (curlen !== 0) {\n\n      if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; }\n      s.bl_tree[REP_3_6 * 2]/*.Freq*/++;\n\n    } else if (count <= 10) {\n      s.bl_tree[REPZ_3_10 * 2]/*.Freq*/++;\n\n    } else {\n      s.bl_tree[REPZ_11_138 * 2]/*.Freq*/++;\n    }\n\n    count = 0;\n    prevlen = curlen;\n\n    if (nextlen === 0) {\n      max_count = 138;\n      min_count = 3;\n\n    } else if (curlen === nextlen) {\n      max_count = 6;\n      min_count = 3;\n\n    } else {\n      max_count = 7;\n      min_count = 4;\n    }\n  }\n}\n\n\n/* ===========================================================================\n * Send a literal or distance tree in compressed form, using the codes in\n * bl_tree.\n */\nfunction send_tree(s, tree, max_code)\n//    deflate_state *s;\n//    ct_data *tree; /* the tree to be scanned */\n//    int max_code;       /* and its largest code of non zero frequency */\n{\n  var n;                     /* iterates over all tree elements */\n  var prevlen = -1;          /* last emitted length */\n  var curlen;                /* length of current code */\n\n  var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */\n\n  var count = 0;             /* repeat count of the current code */\n  var max_count = 7;         /* max repeat count */\n  var min_count = 4;         /* min repeat count */\n\n  /* tree[max_code+1].Len = -1; */  /* guard already set */\n  if (nextlen === 0) {\n    max_count = 138;\n    min_count = 3;\n  }\n\n  for (n = 0; n <= max_code; n++) {\n    curlen = nextlen;\n    nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;\n\n    if (++count < max_count && curlen === nextlen) {\n      continue;\n\n    } else if (count < min_count) {\n      do { send_code(s, curlen, s.bl_tree); } while (--count !== 0);\n\n    } else if (curlen !== 0) {\n      if (curlen !== prevlen) {\n        send_code(s, curlen, s.bl_tree);\n        count--;\n      }\n      //Assert(count >= 3 && count <= 6, \" 3_6?\");\n      send_code(s, REP_3_6, s.bl_tree);\n      send_bits(s, count - 3, 2);\n\n    } else if (count <= 10) {\n      send_code(s, REPZ_3_10, s.bl_tree);\n      send_bits(s, count - 3, 3);\n\n    } else {\n      send_code(s, REPZ_11_138, s.bl_tree);\n      send_bits(s, count - 11, 7);\n    }\n\n    count = 0;\n    prevlen = curlen;\n    if (nextlen === 0) {\n      max_count = 138;\n      min_count = 3;\n\n    } else if (curlen === nextlen) {\n      max_count = 6;\n      min_count = 3;\n\n    } else {\n      max_count = 7;\n      min_count = 4;\n    }\n  }\n}\n\n\n/* ===========================================================================\n * Construct the Huffman tree for the bit lengths and return the index in\n * bl_order of the last bit length code to send.\n */\nfunction build_bl_tree(s) {\n  var max_blindex;  /* index of last bit length code of non zero freq */\n\n  /* Determine the bit length frequencies for literal and distance trees */\n  scan_tree(s, s.dyn_ltree, s.l_desc.max_code);\n  scan_tree(s, s.dyn_dtree, s.d_desc.max_code);\n\n  /* Build the bit length tree: */\n  build_tree(s, s.bl_desc);\n  /* opt_len now includes the length of the tree representations, except\n   * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.\n   */\n\n  /* Determine the number of bit length codes to send. The pkzip format\n   * requires that at least 4 bit length codes be sent. (appnote.txt says\n   * 3 but the actual value used is 4.)\n   */\n  for (max_blindex = BL_CODES - 1; max_blindex >= 3; max_blindex--) {\n    if (s.bl_tree[bl_order[max_blindex] * 2 + 1]/*.Len*/ !== 0) {\n      break;\n    }\n  }\n  /* Update opt_len to include the bit length tree and counts */\n  s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4;\n  //Tracev((stderr, \"\\ndyn trees: dyn %ld, stat %ld\",\n  //        s->opt_len, s->static_len));\n\n  return max_blindex;\n}\n\n\n/* ===========================================================================\n * Send the header for a block using dynamic Huffman trees: the counts, the\n * lengths of the bit length codes, the literal tree and the distance tree.\n * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.\n */\nfunction send_all_trees(s, lcodes, dcodes, blcodes)\n//    deflate_state *s;\n//    int lcodes, dcodes, blcodes; /* number of codes for each tree */\n{\n  var rank;                    /* index in bl_order */\n\n  //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, \"not enough codes\");\n  //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,\n  //        \"too many codes\");\n  //Tracev((stderr, \"\\nbl counts: \"));\n  send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */\n  send_bits(s, dcodes - 1,   5);\n  send_bits(s, blcodes - 4,  4); /* not -3 as stated in appnote.txt */\n  for (rank = 0; rank < blcodes; rank++) {\n    //Tracev((stderr, \"\\nbl code %2d \", bl_order[rank]));\n    send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1]/*.Len*/, 3);\n  }\n  //Tracev((stderr, \"\\nbl tree: sent %ld\", s->bits_sent));\n\n  send_tree(s, s.dyn_ltree, lcodes - 1); /* literal tree */\n  //Tracev((stderr, \"\\nlit tree: sent %ld\", s->bits_sent));\n\n  send_tree(s, s.dyn_dtree, dcodes - 1); /* distance tree */\n  //Tracev((stderr, \"\\ndist tree: sent %ld\", s->bits_sent));\n}\n\n\n/* ===========================================================================\n * Check if the data type is TEXT or BINARY, using the following algorithm:\n * - TEXT if the two conditions below are satisfied:\n *    a) There are no non-portable control characters belonging to the\n *       \"black list\" (0..6, 14..25, 28..31).\n *    b) There is at least one printable character belonging to the\n *       \"white list\" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).\n * - BINARY otherwise.\n * - The following partially-portable control characters form a\n *   \"gray list\" that is ignored in this detection algorithm:\n *   (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}).\n * IN assertion: the fields Freq of dyn_ltree are set.\n */\nfunction detect_data_type(s) {\n  /* black_mask is the bit mask of black-listed bytes\n   * set bits 0..6, 14..25, and 28..31\n   * 0xf3ffc07f = binary 11110011111111111100000001111111\n   */\n  var black_mask = 0xf3ffc07f;\n  var n;\n\n  /* Check for non-textual (\"black-listed\") bytes. */\n  for (n = 0; n <= 31; n++, black_mask >>>= 1) {\n    if ((black_mask & 1) && (s.dyn_ltree[n * 2]/*.Freq*/ !== 0)) {\n      return Z_BINARY;\n    }\n  }\n\n  /* Check for textual (\"white-listed\") bytes. */\n  if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 ||\n      s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) {\n    return Z_TEXT;\n  }\n  for (n = 32; n < LITERALS; n++) {\n    if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) {\n      return Z_TEXT;\n    }\n  }\n\n  /* There are no \"black-listed\" or \"white-listed\" bytes:\n   * this stream either is empty or has tolerated (\"gray-listed\") bytes only.\n   */\n  return Z_BINARY;\n}\n\n\nvar static_init_done = false;\n\n/* ===========================================================================\n * Initialize the tree data structures for a new zlib stream.\n */\nfunction _tr_init(s)\n{\n\n  if (!static_init_done) {\n    tr_static_init();\n    static_init_done = true;\n  }\n\n  s.l_desc  = new TreeDesc(s.dyn_ltree, static_l_desc);\n  s.d_desc  = new TreeDesc(s.dyn_dtree, static_d_desc);\n  s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc);\n\n  s.bi_buf = 0;\n  s.bi_valid = 0;\n\n  /* Initialize the first block of the first file: */\n  init_block(s);\n}\n\n\n/* ===========================================================================\n * Send a stored block\n */\nfunction _tr_stored_block(s, buf, stored_len, last)\n//DeflateState *s;\n//charf *buf;       /* input block */\n//ulg stored_len;   /* length of input block */\n//int last;         /* one if this is the last block for a file */\n{\n  send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3);    /* send block type */\n  copy_block(s, buf, stored_len, true); /* with header */\n}\n\n\n/* ===========================================================================\n * Send one empty static block to give enough lookahead for inflate.\n * This takes 10 bits, of which 7 may remain in the bit buffer.\n */\nfunction _tr_align(s) {\n  send_bits(s, STATIC_TREES << 1, 3);\n  send_code(s, END_BLOCK, static_ltree);\n  bi_flush(s);\n}\n\n\n/* ===========================================================================\n * Determine the best encoding for the current block: dynamic trees, static\n * trees or store, and output the encoded block to the zip file.\n */\nfunction _tr_flush_block(s, buf, stored_len, last)\n//DeflateState *s;\n//charf *buf;       /* input block, or NULL if too old */\n//ulg stored_len;   /* length of input block */\n//int last;         /* one if this is the last block for a file */\n{\n  var opt_lenb, static_lenb;  /* opt_len and static_len in bytes */\n  var max_blindex = 0;        /* index of last bit length code of non zero freq */\n\n  /* Build the Huffman trees unless a stored block is forced */\n  if (s.level > 0) {\n\n    /* Check if the file is binary or text */\n    if (s.strm.data_type === Z_UNKNOWN) {\n      s.strm.data_type = detect_data_type(s);\n    }\n\n    /* Construct the literal and distance trees */\n    build_tree(s, s.l_desc);\n    // Tracev((stderr, \"\\nlit data: dyn %ld, stat %ld\", s->opt_len,\n    //        s->static_len));\n\n    build_tree(s, s.d_desc);\n    // Tracev((stderr, \"\\ndist data: dyn %ld, stat %ld\", s->opt_len,\n    //        s->static_len));\n    /* At this point, opt_len and static_len are the total bit lengths of\n     * the compressed block data, excluding the tree representations.\n     */\n\n    /* Build the bit length tree for the above two trees, and get the index\n     * in bl_order of the last bit length code to send.\n     */\n    max_blindex = build_bl_tree(s);\n\n    /* Determine the best encoding. Compute the block lengths in bytes. */\n    opt_lenb = (s.opt_len + 3 + 7) >>> 3;\n    static_lenb = (s.static_len + 3 + 7) >>> 3;\n\n    // Tracev((stderr, \"\\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u \",\n    //        opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,\n    //        s->last_lit));\n\n    if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; }\n\n  } else {\n    // Assert(buf != (char*)0, \"lost buf\");\n    opt_lenb = static_lenb = stored_len + 5; /* force a stored block */\n  }\n\n  if ((stored_len + 4 <= opt_lenb) && (buf !== -1)) {\n    /* 4: two words for the lengths */\n\n    /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.\n     * Otherwise we can't have processed more than WSIZE input bytes since\n     * the last block flush, because compression would have been\n     * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to\n     * transform a block into a stored block.\n     */\n    _tr_stored_block(s, buf, stored_len, last);\n\n  } else if (s.strategy === Z_FIXED || static_lenb === opt_lenb) {\n\n    send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3);\n    compress_block(s, static_ltree, static_dtree);\n\n  } else {\n    send_bits(s, (DYN_TREES << 1) + (last ? 1 : 0), 3);\n    send_all_trees(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1);\n    compress_block(s, s.dyn_ltree, s.dyn_dtree);\n  }\n  // Assert (s->compressed_len == s->bits_sent, \"bad compressed size\");\n  /* The above check is made mod 2^32, for files larger than 512 MB\n   * and uLong implemented on 32 bits.\n   */\n  init_block(s);\n\n  if (last) {\n    bi_windup(s);\n  }\n  // Tracev((stderr,\"\\ncomprlen %lu(%lu) \", s->compressed_len>>3,\n  //       s->compressed_len-7*last));\n}\n\n/* ===========================================================================\n * Save the match info and tally the frequency counts. Return true if\n * the current block must be flushed.\n */\nfunction _tr_tally(s, dist, lc)\n//    deflate_state *s;\n//    unsigned dist;  /* distance of matched string */\n//    unsigned lc;    /* match length-MIN_MATCH or unmatched char (if dist==0) */\n{\n  //var out_length, in_length, dcode;\n\n  s.pending_buf[s.d_buf + s.last_lit * 2]     = (dist >>> 8) & 0xff;\n  s.pending_buf[s.d_buf + s.last_lit * 2 + 1] = dist & 0xff;\n\n  s.pending_buf[s.l_buf + s.last_lit] = lc & 0xff;\n  s.last_lit++;\n\n  if (dist === 0) {\n    /* lc is the unmatched char */\n    s.dyn_ltree[lc * 2]/*.Freq*/++;\n  } else {\n    s.matches++;\n    /* Here, lc is the match length - MIN_MATCH */\n    dist--;             /* dist = match distance - 1 */\n    //Assert((ush)dist < (ush)MAX_DIST(s) &&\n    //       (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&\n    //       (ush)d_code(dist) < (ush)D_CODES,  \"_tr_tally: bad match\");\n\n    s.dyn_ltree[(_length_code[lc] + LITERALS + 1) * 2]/*.Freq*/++;\n    s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++;\n  }\n\n// (!) This block is disabled in zlib defailts,\n// don't enable it for binary compatibility\n\n//#ifdef TRUNCATE_BLOCK\n//  /* Try to guess if it is profitable to stop the current block here */\n//  if ((s.last_lit & 0x1fff) === 0 && s.level > 2) {\n//    /* Compute an upper bound for the compressed length */\n//    out_length = s.last_lit*8;\n//    in_length = s.strstart - s.block_start;\n//\n//    for (dcode = 0; dcode < D_CODES; dcode++) {\n//      out_length += s.dyn_dtree[dcode*2]/*.Freq*/ * (5 + extra_dbits[dcode]);\n//    }\n//    out_length >>>= 3;\n//    //Tracev((stderr,\"\\nlast_lit %u, in %ld, out ~%ld(%ld%%) \",\n//    //       s->last_lit, in_length, out_length,\n//    //       100L - out_length*100L/in_length));\n//    if (s.matches < (s.last_lit>>1)/*int /2*/ && out_length < (in_length>>1)/*int /2*/) {\n//      return true;\n//    }\n//  }\n//#endif\n\n  return (s.last_lit === s.lit_bufsize - 1);\n  /* We avoid equality with lit_bufsize because of wraparound at 64K\n   * on 16 bit machines and because stored blocks are restricted to\n   * 64K-1 bytes.\n   */\n}\n\nexports._tr_init  = _tr_init;\nexports._tr_stored_block = _tr_stored_block;\nexports._tr_flush_block  = _tr_flush_block;\nexports._tr_tally = _tr_tally;\nexports._tr_align = _tr_align;\n\n},{\"../utils/common\":41}],53:[function(require,module,exports){\n'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nfunction ZStream() {\n  /* next input byte */\n  this.input = null; // JS specific, because we have no pointers\n  this.next_in = 0;\n  /* number of bytes available at input */\n  this.avail_in = 0;\n  /* total number of input bytes read so far */\n  this.total_in = 0;\n  /* next output byte should be put there */\n  this.output = null; // JS specific, because we have no pointers\n  this.next_out = 0;\n  /* remaining free space at output */\n  this.avail_out = 0;\n  /* total number of bytes output so far */\n  this.total_out = 0;\n  /* last error message, NULL if no error */\n  this.msg = ''/*Z_NULL*/;\n  /* not visible by applications */\n  this.state = null;\n  /* best guess about the data type: binary or text */\n  this.data_type = 2/*Z_UNKNOWN*/;\n  /* adler32 value of the uncompressed data */\n  this.adler = 0;\n}\n\nmodule.exports = ZStream;\n\n},{}],54:[function(require,module,exports){\n'use strict';\nmodule.exports = typeof setImmediate === 'function' ? setImmediate :\n\tfunction setImmediate() {\n\t\tvar args = [].slice.apply(arguments);\n\t\targs.splice(1, 0, 0);\n\t\tsetTimeout.apply(null, args);\n\t};\n\n},{}]},{},[10])(10)\n});"
  },
  {
    "path": "themes/default/public/js/jszip.min.js",
    "content": "/*!\n\nJSZip v3.2.1 - A JavaScript class for generating and reading zip files\n<http://stuartk.com/jszip>\n\n(c) 2009-2016 Stuart Knightley <stuart [at] stuartk.com>\nDual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip/master/LICENSE.markdown.\n\nJSZip uses the library pako released under the MIT license :\nhttps://github.com/nodeca/pako/blob/master/LICENSE\n*/\n!function(a){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=a();else if(\"function\"==typeof define&&define.amd)define([],a);else{var b;b=\"undefined\"!=typeof window?window:\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:this,b.JSZip=a()}}(function(){return function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i=\"function\"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error(\"Cannot find module '\"+g+\"'\");throw j.code=\"MODULE_NOT_FOUND\",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c?c:a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f=\"function\"==typeof require&&require,g=0;g<d.length;g++)e(d[g]);return e}({1:[function(a,b,c){\"use strict\";var d=a(\"./utils\"),e=a(\"./support\"),f=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";c.encode=function(a){for(var b,c,e,g,h,i,j,k=[],l=0,m=a.length,n=m,o=\"string\"!==d.getTypeOf(a);l<a.length;)n=m-l,o?(b=a[l++],c=l<m?a[l++]:0,e=l<m?a[l++]:0):(b=a.charCodeAt(l++),c=l<m?a.charCodeAt(l++):0,e=l<m?a.charCodeAt(l++):0),g=b>>2,h=(3&b)<<4|c>>4,i=n>1?(15&c)<<2|e>>6:64,j=n>2?63&e:64,k.push(f.charAt(g)+f.charAt(h)+f.charAt(i)+f.charAt(j));return k.join(\"\")},c.decode=function(a){var b,c,d,g,h,i,j,k=0,l=0,m=\"data:\";if(a.substr(0,m.length)===m)throw new Error(\"Invalid base64 input, it looks like a data url.\");a=a.replace(/[^A-Za-z0-9\\+\\/\\=]/g,\"\");var n=3*a.length/4;if(a.charAt(a.length-1)===f.charAt(64)&&n--,a.charAt(a.length-2)===f.charAt(64)&&n--,n%1!==0)throw new Error(\"Invalid base64 input, bad content length.\");var o;for(o=e.uint8array?new Uint8Array(0|n):new Array(0|n);k<a.length;)g=f.indexOf(a.charAt(k++)),h=f.indexOf(a.charAt(k++)),i=f.indexOf(a.charAt(k++)),j=f.indexOf(a.charAt(k++)),b=g<<2|h>>4,c=(15&h)<<4|i>>2,d=(3&i)<<6|j,o[l++]=b,64!==i&&(o[l++]=c),64!==j&&(o[l++]=d);return o}},{\"./support\":30,\"./utils\":32}],2:[function(a,b,c){\"use strict\";function d(a,b,c,d,e){this.compressedSize=a,this.uncompressedSize=b,this.crc32=c,this.compression=d,this.compressedContent=e}var e=a(\"./external\"),f=a(\"./stream/DataWorker\"),g=a(\"./stream/DataLengthProbe\"),h=a(\"./stream/Crc32Probe\"),g=a(\"./stream/DataLengthProbe\");d.prototype={getContentWorker:function(){var a=new f(e.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new g(\"data_length\")),b=this;return a.on(\"end\",function(){if(this.streamInfo.data_length!==b.uncompressedSize)throw new Error(\"Bug : uncompressed data size mismatch\")}),a},getCompressedWorker:function(){return new f(e.Promise.resolve(this.compressedContent)).withStreamInfo(\"compressedSize\",this.compressedSize).withStreamInfo(\"uncompressedSize\",this.uncompressedSize).withStreamInfo(\"crc32\",this.crc32).withStreamInfo(\"compression\",this.compression)}},d.createWorkerFrom=function(a,b,c){return a.pipe(new h).pipe(new g(\"uncompressedSize\")).pipe(b.compressWorker(c)).pipe(new g(\"compressedSize\")).withStreamInfo(\"compression\",b)},b.exports=d},{\"./external\":6,\"./stream/Crc32Probe\":25,\"./stream/DataLengthProbe\":26,\"./stream/DataWorker\":27}],3:[function(a,b,c){\"use strict\";var d=a(\"./stream/GenericWorker\");c.STORE={magic:\"\\0\\0\",compressWorker:function(a){return new d(\"STORE compression\")},uncompressWorker:function(){return new d(\"STORE decompression\")}},c.DEFLATE=a(\"./flate\")},{\"./flate\":7,\"./stream/GenericWorker\":28}],4:[function(a,b,c){\"use strict\";function d(){for(var a,b=[],c=0;c<256;c++){a=c;for(var d=0;d<8;d++)a=1&a?3988292384^a>>>1:a>>>1;b[c]=a}return b}function e(a,b,c,d){var e=h,f=d+c;a^=-1;for(var g=d;g<f;g++)a=a>>>8^e[255&(a^b[g])];return a^-1}function f(a,b,c,d){var e=h,f=d+c;a^=-1;for(var g=d;g<f;g++)a=a>>>8^e[255&(a^b.charCodeAt(g))];return a^-1}var g=a(\"./utils\"),h=d();b.exports=function(a,b){if(\"undefined\"==typeof a||!a.length)return 0;var c=\"string\"!==g.getTypeOf(a);return c?e(0|b,a,a.length,0):f(0|b,a,a.length,0)}},{\"./utils\":32}],5:[function(a,b,c){\"use strict\";c.base64=!1,c.binary=!1,c.dir=!1,c.createFolders=!0,c.date=null,c.compression=null,c.compressionOptions=null,c.comment=null,c.unixPermissions=null,c.dosPermissions=null},{}],6:[function(a,b,c){\"use strict\";var d=null;d=\"undefined\"!=typeof Promise?Promise:a(\"lie\"),b.exports={Promise:d}},{lie:37}],7:[function(a,b,c){\"use strict\";function d(a,b){h.call(this,\"FlateWorker/\"+a),this._pako=null,this._pakoAction=a,this._pakoOptions=b,this.meta={}}var e=\"undefined\"!=typeof Uint8Array&&\"undefined\"!=typeof Uint16Array&&\"undefined\"!=typeof Uint32Array,f=a(\"pako\"),g=a(\"./utils\"),h=a(\"./stream/GenericWorker\"),i=e?\"uint8array\":\"array\";c.magic=\"\\b\\0\",g.inherits(d,h),d.prototype.processChunk=function(a){this.meta=a.meta,null===this._pako&&this._createPako(),this._pako.push(g.transformTo(i,a.data),!1)},d.prototype.flush=function(){h.prototype.flush.call(this),null===this._pako&&this._createPako(),this._pako.push([],!0)},d.prototype.cleanUp=function(){h.prototype.cleanUp.call(this),this._pako=null},d.prototype._createPako=function(){this._pako=new f[this._pakoAction]({raw:!0,level:this._pakoOptions.level||-1});var a=this;this._pako.onData=function(b){a.push({data:b,meta:a.meta})}},c.compressWorker=function(a){return new d(\"Deflate\",a)},c.uncompressWorker=function(){return new d(\"Inflate\",{})}},{\"./stream/GenericWorker\":28,\"./utils\":32,pako:38}],8:[function(a,b,c){\"use strict\";function d(a,b,c,d){f.call(this,\"ZipFileWorker\"),this.bytesWritten=0,this.zipComment=b,this.zipPlatform=c,this.encodeFileName=d,this.streamFiles=a,this.accumulate=!1,this.contentBuffer=[],this.dirRecords=[],this.currentSourceOffset=0,this.entriesCount=0,this.currentFile=null,this._sources=[]}var e=a(\"../utils\"),f=a(\"../stream/GenericWorker\"),g=a(\"../utf8\"),h=a(\"../crc32\"),i=a(\"../signature\"),j=function(a,b){var c,d=\"\";for(c=0;c<b;c++)d+=String.fromCharCode(255&a),a>>>=8;return d},k=function(a,b){var c=a;return a||(c=b?16893:33204),(65535&c)<<16},l=function(a,b){return 63&(a||0)},m=function(a,b,c,d,f,m){var n,o,p=a.file,q=a.compression,r=m!==g.utf8encode,s=e.transformTo(\"string\",m(p.name)),t=e.transformTo(\"string\",g.utf8encode(p.name)),u=p.comment,v=e.transformTo(\"string\",m(u)),w=e.transformTo(\"string\",g.utf8encode(u)),x=t.length!==p.name.length,y=w.length!==u.length,z=\"\",A=\"\",B=\"\",C=p.dir,D=p.date,E={crc32:0,compressedSize:0,uncompressedSize:0};b&&!c||(E.crc32=a.crc32,E.compressedSize=a.compressedSize,E.uncompressedSize=a.uncompressedSize);var F=0;b&&(F|=8),r||!x&&!y||(F|=2048);var G=0,H=0;C&&(G|=16),\"UNIX\"===f?(H=798,G|=k(p.unixPermissions,C)):(H=20,G|=l(p.dosPermissions,C)),n=D.getUTCHours(),n<<=6,n|=D.getUTCMinutes(),n<<=5,n|=D.getUTCSeconds()/2,o=D.getUTCFullYear()-1980,o<<=4,o|=D.getUTCMonth()+1,o<<=5,o|=D.getUTCDate(),x&&(A=j(1,1)+j(h(s),4)+t,z+=\"up\"+j(A.length,2)+A),y&&(B=j(1,1)+j(h(v),4)+w,z+=\"uc\"+j(B.length,2)+B);var I=\"\";I+=\"\\n\\0\",I+=j(F,2),I+=q.magic,I+=j(n,2),I+=j(o,2),I+=j(E.crc32,4),I+=j(E.compressedSize,4),I+=j(E.uncompressedSize,4),I+=j(s.length,2),I+=j(z.length,2);var J=i.LOCAL_FILE_HEADER+I+s+z,K=i.CENTRAL_FILE_HEADER+j(H,2)+I+j(v.length,2)+\"\\0\\0\\0\\0\"+j(G,4)+j(d,4)+s+z+v;return{fileRecord:J,dirRecord:K}},n=function(a,b,c,d,f){var g=\"\",h=e.transformTo(\"string\",f(d));return g=i.CENTRAL_DIRECTORY_END+\"\\0\\0\\0\\0\"+j(a,2)+j(a,2)+j(b,4)+j(c,4)+j(h.length,2)+h},o=function(a){var b=\"\";return b=i.DATA_DESCRIPTOR+j(a.crc32,4)+j(a.compressedSize,4)+j(a.uncompressedSize,4)};e.inherits(d,f),d.prototype.push=function(a){var b=a.meta.percent||0,c=this.entriesCount,d=this._sources.length;this.accumulate?this.contentBuffer.push(a):(this.bytesWritten+=a.data.length,f.prototype.push.call(this,{data:a.data,meta:{currentFile:this.currentFile,percent:c?(b+100*(c-d-1))/c:100}}))},d.prototype.openedSource=function(a){this.currentSourceOffset=this.bytesWritten,this.currentFile=a.file.name;var b=this.streamFiles&&!a.file.dir;if(b){var c=m(a,b,!1,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);this.push({data:c.fileRecord,meta:{percent:0}})}else this.accumulate=!0},d.prototype.closedSource=function(a){this.accumulate=!1;var b=this.streamFiles&&!a.file.dir,c=m(a,b,!0,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);if(this.dirRecords.push(c.dirRecord),b)this.push({data:o(a),meta:{percent:100}});else for(this.push({data:c.fileRecord,meta:{percent:0}});this.contentBuffer.length;)this.push(this.contentBuffer.shift());this.currentFile=null},d.prototype.flush=function(){for(var a=this.bytesWritten,b=0;b<this.dirRecords.length;b++)this.push({data:this.dirRecords[b],meta:{percent:100}});var c=this.bytesWritten-a,d=n(this.dirRecords.length,c,a,this.zipComment,this.encodeFileName);this.push({data:d,meta:{percent:100}})},d.prototype.prepareNextSource=function(){this.previous=this._sources.shift(),this.openedSource(this.previous.streamInfo),this.isPaused?this.previous.pause():this.previous.resume()},d.prototype.registerPrevious=function(a){this._sources.push(a);var b=this;return a.on(\"data\",function(a){b.processChunk(a)}),a.on(\"end\",function(){b.closedSource(b.previous.streamInfo),b._sources.length?b.prepareNextSource():b.end()}),a.on(\"error\",function(a){b.error(a)}),this},d.prototype.resume=function(){return!!f.prototype.resume.call(this)&&(!this.previous&&this._sources.length?(this.prepareNextSource(),!0):this.previous||this._sources.length||this.generatedError?void 0:(this.end(),!0))},d.prototype.error=function(a){var b=this._sources;if(!f.prototype.error.call(this,a))return!1;for(var c=0;c<b.length;c++)try{b[c].error(a)}catch(a){}return!0},d.prototype.lock=function(){f.prototype.lock.call(this);for(var a=this._sources,b=0;b<a.length;b++)a[b].lock()},b.exports=d},{\"../crc32\":4,\"../signature\":23,\"../stream/GenericWorker\":28,\"../utf8\":31,\"../utils\":32}],9:[function(a,b,c){\"use strict\";var d=a(\"../compressions\"),e=a(\"./ZipFileWorker\"),f=function(a,b){var c=a||b,e=d[c];if(!e)throw new Error(c+\" is not a valid compression method !\");return e};c.generateWorker=function(a,b,c){var d=new e(b.streamFiles,c,b.platform,b.encodeFileName),g=0;try{a.forEach(function(a,c){g++;var e=f(c.options.compression,b.compression),h=c.options.compressionOptions||b.compressionOptions||{},i=c.dir,j=c.date;c._compressWorker(e,h).withStreamInfo(\"file\",{name:a,dir:i,date:j,comment:c.comment||\"\",unixPermissions:c.unixPermissions,dosPermissions:c.dosPermissions}).pipe(d)}),d.entriesCount=g}catch(h){d.error(h)}return d}},{\"../compressions\":3,\"./ZipFileWorker\":8}],10:[function(a,b,c){\"use strict\";function d(){if(!(this instanceof d))return new d;if(arguments.length)throw new Error(\"The constructor with parameters has been removed in JSZip 3.0, please check the upgrade guide.\");this.files={},this.comment=null,this.root=\"\",this.clone=function(){var a=new d;for(var b in this)\"function\"!=typeof this[b]&&(a[b]=this[b]);return a}}d.prototype=a(\"./object\"),d.prototype.loadAsync=a(\"./load\"),d.support=a(\"./support\"),d.defaults=a(\"./defaults\"),d.version=\"3.2.0\",d.loadAsync=function(a,b){return(new d).loadAsync(a,b)},d.external=a(\"./external\"),b.exports=d},{\"./defaults\":5,\"./external\":6,\"./load\":11,\"./object\":15,\"./support\":30}],11:[function(a,b,c){\"use strict\";function d(a){return new f.Promise(function(b,c){var d=a.decompressed.getContentWorker().pipe(new i);d.on(\"error\",function(a){c(a)}).on(\"end\",function(){d.streamInfo.crc32!==a.decompressed.crc32?c(new Error(\"Corrupted zip : CRC32 mismatch\")):b()}).resume()})}var e=a(\"./utils\"),f=a(\"./external\"),g=a(\"./utf8\"),e=a(\"./utils\"),h=a(\"./zipEntries\"),i=a(\"./stream/Crc32Probe\"),j=a(\"./nodejsUtils\");b.exports=function(a,b){var c=this;return b=e.extend(b||{},{base64:!1,checkCRC32:!1,optimizedBinaryString:!1,createFolders:!1,decodeFileName:g.utf8decode}),j.isNode&&j.isStream(a)?f.Promise.reject(new Error(\"JSZip can't accept a stream when loading a zip file.\")):e.prepareContent(\"the loaded zip file\",a,!0,b.optimizedBinaryString,b.base64).then(function(a){var c=new h(b);return c.load(a),c}).then(function(a){var c=[f.Promise.resolve(a)],e=a.files;if(b.checkCRC32)for(var g=0;g<e.length;g++)c.push(d(e[g]));return f.Promise.all(c)}).then(function(a){for(var d=a.shift(),e=d.files,f=0;f<e.length;f++){var g=e[f];c.file(g.fileNameStr,g.decompressed,{binary:!0,optimizedBinaryString:!0,date:g.date,dir:g.dir,comment:g.fileCommentStr.length?g.fileCommentStr:null,unixPermissions:g.unixPermissions,dosPermissions:g.dosPermissions,createFolders:b.createFolders})}return d.zipComment.length&&(c.comment=d.zipComment),c})}},{\"./external\":6,\"./nodejsUtils\":14,\"./stream/Crc32Probe\":25,\"./utf8\":31,\"./utils\":32,\"./zipEntries\":33}],12:[function(a,b,c){\"use strict\";function d(a,b){f.call(this,\"Nodejs stream input adapter for \"+a),this._upstreamEnded=!1,this._bindStream(b)}var e=a(\"../utils\"),f=a(\"../stream/GenericWorker\");e.inherits(d,f),d.prototype._bindStream=function(a){var b=this;this._stream=a,a.pause(),a.on(\"data\",function(a){b.push({data:a,meta:{percent:0}})}).on(\"error\",function(a){b.isPaused?this.generatedError=a:b.error(a)}).on(\"end\",function(){b.isPaused?b._upstreamEnded=!0:b.end()})},d.prototype.pause=function(){return!!f.prototype.pause.call(this)&&(this._stream.pause(),!0)},d.prototype.resume=function(){return!!f.prototype.resume.call(this)&&(this._upstreamEnded?this.end():this._stream.resume(),!0)},b.exports=d},{\"../stream/GenericWorker\":28,\"../utils\":32}],13:[function(a,b,c){\"use strict\";function d(a,b,c){e.call(this,b),this._helper=a;var d=this;a.on(\"data\",function(a,b){d.push(a)||d._helper.pause(),c&&c(b)}).on(\"error\",function(a){d.emit(\"error\",a)}).on(\"end\",function(){d.push(null)})}var e=a(\"readable-stream\").Readable,f=a(\"../utils\");f.inherits(d,e),d.prototype._read=function(){this._helper.resume()},b.exports=d},{\"../utils\":32,\"readable-stream\":16}],14:[function(a,b,c){\"use strict\";b.exports={isNode:\"undefined\"!=typeof Buffer,newBufferFrom:function(a,b){if(Buffer.from&&Buffer.from!==Uint8Array.from)return Buffer.from(a,b);if(\"number\"==typeof a)throw new Error('The \"data\" argument must not be a number');return new Buffer(a,b)},allocBuffer:function(a){if(Buffer.alloc)return Buffer.alloc(a);var b=new Buffer(a);return b.fill(0),b},isBuffer:function(a){return Buffer.isBuffer(a)},isStream:function(a){return a&&\"function\"==typeof a.on&&\"function\"==typeof a.pause&&\"function\"==typeof a.resume}}},{}],15:[function(a,b,c){\"use strict\";function d(a){return\"[object RegExp]\"===Object.prototype.toString.call(a)}var e=a(\"./utf8\"),f=a(\"./utils\"),g=a(\"./stream/GenericWorker\"),h=a(\"./stream/StreamHelper\"),i=a(\"./defaults\"),j=a(\"./compressedObject\"),k=a(\"./zipObject\"),l=a(\"./generate\"),m=a(\"./nodejsUtils\"),n=a(\"./nodejs/NodejsStreamInputAdapter\"),o=function(a,b,c){var d,e=f.getTypeOf(b),h=f.extend(c||{},i);h.date=h.date||new Date,null!==h.compression&&(h.compression=h.compression.toUpperCase()),\"string\"==typeof h.unixPermissions&&(h.unixPermissions=parseInt(h.unixPermissions,8)),h.unixPermissions&&16384&h.unixPermissions&&(h.dir=!0),h.dosPermissions&&16&h.dosPermissions&&(h.dir=!0),h.dir&&(a=q(a)),h.createFolders&&(d=p(a))&&r.call(this,d,!0);var l=\"string\"===e&&h.binary===!1&&h.base64===!1;c&&\"undefined\"!=typeof c.binary||(h.binary=!l);var o=b instanceof j&&0===b.uncompressedSize;(o||h.dir||!b||0===b.length)&&(h.base64=!1,h.binary=!0,b=\"\",h.compression=\"STORE\",e=\"string\");var s=null;s=b instanceof j||b instanceof g?b:m.isNode&&m.isStream(b)?new n(a,b):f.prepareContent(a,b,h.binary,h.optimizedBinaryString,h.base64);var t=new k(a,s,h);this.files[a]=t},p=function(a){\"/\"===a.slice(-1)&&(a=a.substring(0,a.length-1));var b=a.lastIndexOf(\"/\");return b>0?a.substring(0,b):\"\"},q=function(a){return\"/\"!==a.slice(-1)&&(a+=\"/\"),a},r=function(a,b){return b=\"undefined\"!=typeof b?b:i.createFolders,a=q(a),this.files[a]||o.call(this,a,null,{dir:!0,createFolders:b}),this.files[a]},s={load:function(){throw new Error(\"This method has been removed in JSZip 3.0, please check the upgrade guide.\")},forEach:function(a){var b,c,d;for(b in this.files)this.files.hasOwnProperty(b)&&(d=this.files[b],c=b.slice(this.root.length,b.length),c&&b.slice(0,this.root.length)===this.root&&a(c,d))},filter:function(a){var b=[];return this.forEach(function(c,d){a(c,d)&&b.push(d)}),b},file:function(a,b,c){if(1===arguments.length){if(d(a)){var e=a;return this.filter(function(a,b){return!b.dir&&e.test(a)})}var f=this.files[this.root+a];return f&&!f.dir?f:null}return a=this.root+a,o.call(this,a,b,c),this},folder:function(a){if(!a)return this;if(d(a))return this.filter(function(b,c){return c.dir&&a.test(b)});var b=this.root+a,c=r.call(this,b),e=this.clone();return e.root=c.name,e},remove:function(a){a=this.root+a;var b=this.files[a];if(b||(\"/\"!==a.slice(-1)&&(a+=\"/\"),b=this.files[a]),b&&!b.dir)delete this.files[a];else for(var c=this.filter(function(b,c){return c.name.slice(0,a.length)===a}),d=0;d<c.length;d++)delete this.files[c[d].name];return this},generate:function(a){throw new Error(\"This method has been removed in JSZip 3.0, please check the upgrade guide.\")},generateInternalStream:function(a){var b,c={};try{if(c=f.extend(a||{},{streamFiles:!1,compression:\"STORE\",compressionOptions:null,type:\"\",platform:\"DOS\",comment:null,mimeType:\"application/zip\",encodeFileName:e.utf8encode}),c.type=c.type.toLowerCase(),c.compression=c.compression.toUpperCase(),\"binarystring\"===c.type&&(c.type=\"string\"),!c.type)throw new Error(\"No output type specified.\");f.checkSupport(c.type),\"darwin\"!==c.platform&&\"freebsd\"!==c.platform&&\"linux\"!==c.platform&&\"sunos\"!==c.platform||(c.platform=\"UNIX\"),\"win32\"===c.platform&&(c.platform=\"DOS\");var d=c.comment||this.comment||\"\";b=l.generateWorker(this,c,d)}catch(i){b=new g(\"error\"),b.error(i)}return new h(b,c.type||\"string\",c.mimeType)},generateAsync:function(a,b){return this.generateInternalStream(a).accumulate(b)},generateNodeStream:function(a,b){return a=a||{},a.type||(a.type=\"nodebuffer\"),this.generateInternalStream(a).toNodejsStream(b)}};b.exports=s},{\"./compressedObject\":2,\"./defaults\":5,\"./generate\":9,\"./nodejs/NodejsStreamInputAdapter\":12,\"./nodejsUtils\":14,\"./stream/GenericWorker\":28,\"./stream/StreamHelper\":29,\"./utf8\":31,\"./utils\":32,\"./zipObject\":35}],16:[function(a,b,c){b.exports=a(\"stream\")},{stream:void 0}],17:[function(a,b,c){\"use strict\";function d(a){e.call(this,a);for(var b=0;b<this.data.length;b++)a[b]=255&a[b]}var e=a(\"./DataReader\"),f=a(\"../utils\");f.inherits(d,e),d.prototype.byteAt=function(a){return this.data[this.zero+a]},d.prototype.lastIndexOfSignature=function(a){for(var b=a.charCodeAt(0),c=a.charCodeAt(1),d=a.charCodeAt(2),e=a.charCodeAt(3),f=this.length-4;f>=0;--f)if(this.data[f]===b&&this.data[f+1]===c&&this.data[f+2]===d&&this.data[f+3]===e)return f-this.zero;return-1},d.prototype.readAndCheckSignature=function(a){var b=a.charCodeAt(0),c=a.charCodeAt(1),d=a.charCodeAt(2),e=a.charCodeAt(3),f=this.readData(4);return b===f[0]&&c===f[1]&&d===f[2]&&e===f[3]},d.prototype.readData=function(a){if(this.checkOffset(a),0===a)return[];var b=this.data.slice(this.zero+this.index,this.zero+this.index+a);return this.index+=a,b},b.exports=d},{\"../utils\":32,\"./DataReader\":18}],18:[function(a,b,c){\"use strict\";function d(a){this.data=a,this.length=a.length,this.index=0,this.zero=0}var e=a(\"../utils\");d.prototype={checkOffset:function(a){this.checkIndex(this.index+a)},checkIndex:function(a){if(this.length<this.zero+a||a<0)throw new Error(\"End of data reached (data length = \"+this.length+\", asked index = \"+a+\"). Corrupted zip ?\")},setIndex:function(a){this.checkIndex(a),this.index=a},skip:function(a){this.setIndex(this.index+a)},byteAt:function(a){},readInt:function(a){var b,c=0;for(this.checkOffset(a),b=this.index+a-1;b>=this.index;b--)c=(c<<8)+this.byteAt(b);return this.index+=a,c},readString:function(a){return e.transformTo(\"string\",this.readData(a))},readData:function(a){},lastIndexOfSignature:function(a){},readAndCheckSignature:function(a){},readDate:function(){var a=this.readInt(4);return new Date(Date.UTC((a>>25&127)+1980,(a>>21&15)-1,a>>16&31,a>>11&31,a>>5&63,(31&a)<<1))}},b.exports=d},{\"../utils\":32}],19:[function(a,b,c){\"use strict\";function d(a){e.call(this,a)}var e=a(\"./Uint8ArrayReader\"),f=a(\"../utils\");f.inherits(d,e),d.prototype.readData=function(a){this.checkOffset(a);var b=this.data.slice(this.zero+this.index,this.zero+this.index+a);return this.index+=a,b},b.exports=d},{\"../utils\":32,\"./Uint8ArrayReader\":21}],20:[function(a,b,c){\"use strict\";function d(a){e.call(this,a)}var e=a(\"./DataReader\"),f=a(\"../utils\");f.inherits(d,e),d.prototype.byteAt=function(a){return this.data.charCodeAt(this.zero+a)},d.prototype.lastIndexOfSignature=function(a){return this.data.lastIndexOf(a)-this.zero},d.prototype.readAndCheckSignature=function(a){var b=this.readData(4);return a===b},d.prototype.readData=function(a){this.checkOffset(a);var b=this.data.slice(this.zero+this.index,this.zero+this.index+a);return this.index+=a,b},b.exports=d},{\"../utils\":32,\"./DataReader\":18}],21:[function(a,b,c){\"use strict\";function d(a){e.call(this,a)}var e=a(\"./ArrayReader\"),f=a(\"../utils\");f.inherits(d,e),d.prototype.readData=function(a){if(this.checkOffset(a),0===a)return new Uint8Array(0);var b=this.data.subarray(this.zero+this.index,this.zero+this.index+a);return this.index+=a,b},b.exports=d},{\"../utils\":32,\"./ArrayReader\":17}],22:[function(a,b,c){\"use strict\";var d=a(\"../utils\"),e=a(\"../support\"),f=a(\"./ArrayReader\"),g=a(\"./StringReader\"),h=a(\"./NodeBufferReader\"),i=a(\"./Uint8ArrayReader\");b.exports=function(a){var b=d.getTypeOf(a);return d.checkSupport(b),\"string\"!==b||e.uint8array?\"nodebuffer\"===b?new h(a):e.uint8array?new i(d.transformTo(\"uint8array\",a)):new f(d.transformTo(\"array\",a)):new g(a)}},{\"../support\":30,\"../utils\":32,\"./ArrayReader\":17,\"./NodeBufferReader\":19,\"./StringReader\":20,\"./Uint8ArrayReader\":21}],23:[function(a,b,c){\"use strict\";c.LOCAL_FILE_HEADER=\"PK\u0003\u0004\",c.CENTRAL_FILE_HEADER=\"PK\u0001\u0002\",c.CENTRAL_DIRECTORY_END=\"PK\u0005\u0006\",c.ZIP64_CENTRAL_DIRECTORY_LOCATOR=\"PK\u0006\u0007\",c.ZIP64_CENTRAL_DIRECTORY_END=\"PK\u0006\u0006\",c.DATA_DESCRIPTOR=\"PK\u0007\\b\"},{}],24:[function(a,b,c){\"use strict\";function d(a){e.call(this,\"ConvertWorker to \"+a),this.destType=a}var e=a(\"./GenericWorker\"),f=a(\"../utils\");f.inherits(d,e),d.prototype.processChunk=function(a){this.push({data:f.transformTo(this.destType,a.data),meta:a.meta})},b.exports=d},{\"../utils\":32,\"./GenericWorker\":28}],25:[function(a,b,c){\"use strict\";function d(){e.call(this,\"Crc32Probe\"),this.withStreamInfo(\"crc32\",0)}var e=a(\"./GenericWorker\"),f=a(\"../crc32\"),g=a(\"../utils\");g.inherits(d,e),d.prototype.processChunk=function(a){this.streamInfo.crc32=f(a.data,this.streamInfo.crc32||0),this.push(a)},b.exports=d},{\"../crc32\":4,\"../utils\":32,\"./GenericWorker\":28}],26:[function(a,b,c){\"use strict\";function d(a){f.call(this,\"DataLengthProbe for \"+a),this.propName=a,this.withStreamInfo(a,0)}var e=a(\"../utils\"),f=a(\"./GenericWorker\");e.inherits(d,f),d.prototype.processChunk=function(a){if(a){var b=this.streamInfo[this.propName]||0;this.streamInfo[this.propName]=b+a.data.length}f.prototype.processChunk.call(this,a)},b.exports=d},{\"../utils\":32,\"./GenericWorker\":28}],27:[function(a,b,c){\"use strict\";function d(a){f.call(this,\"DataWorker\");var b=this;this.dataIsReady=!1,this.index=0,this.max=0,this.data=null,this.type=\"\",this._tickScheduled=!1,a.then(function(a){b.dataIsReady=!0,b.data=a,b.max=a&&a.length||0,b.type=e.getTypeOf(a),b.isPaused||b._tickAndRepeat()},function(a){b.error(a)})}var e=a(\"../utils\"),f=a(\"./GenericWorker\"),g=16384;e.inherits(d,f),d.prototype.cleanUp=function(){f.prototype.cleanUp.call(this),this.data=null},d.prototype.resume=function(){return!!f.prototype.resume.call(this)&&(!this._tickScheduled&&this.dataIsReady&&(this._tickScheduled=!0,e.delay(this._tickAndRepeat,[],this)),!0)},d.prototype._tickAndRepeat=function(){this._tickScheduled=!1,this.isPaused||this.isFinished||(this._tick(),this.isFinished||(e.delay(this._tickAndRepeat,[],this),this._tickScheduled=!0))},d.prototype._tick=function(){if(this.isPaused||this.isFinished)return!1;var a=g,b=null,c=Math.min(this.max,this.index+a);if(this.index>=this.max)return this.end();switch(this.type){case\"string\":b=this.data.substring(this.index,c);break;case\"uint8array\":b=this.data.subarray(this.index,c);break;case\"array\":case\"nodebuffer\":b=this.data.slice(this.index,c)}return this.index=c,this.push({data:b,meta:{percent:this.max?this.index/this.max*100:0}})},b.exports=d},{\"../utils\":32,\"./GenericWorker\":28}],28:[function(a,b,c){\"use strict\";function d(a){this.name=a||\"default\",this.streamInfo={},this.generatedError=null,this.extraStreamInfo={},this.isPaused=!0,this.isFinished=!1,this.isLocked=!1,this._listeners={data:[],end:[],error:[]},this.previous=null}d.prototype={push:function(a){this.emit(\"data\",a)},end:function(){if(this.isFinished)return!1;this.flush();try{this.emit(\"end\"),this.cleanUp(),this.isFinished=!0}catch(a){this.emit(\"error\",a)}return!0},error:function(a){return!this.isFinished&&(this.isPaused?this.generatedError=a:(this.isFinished=!0,this.emit(\"error\",a),this.previous&&this.previous.error(a),this.cleanUp()),!0)},on:function(a,b){return this._listeners[a].push(b),this},cleanUp:function(){this.streamInfo=this.generatedError=this.extraStreamInfo=null,this._listeners=[]},emit:function(a,b){if(this._listeners[a])for(var c=0;c<this._listeners[a].length;c++)this._listeners[a][c].call(this,b)},pipe:function(a){return a.registerPrevious(this)},registerPrevious:function(a){if(this.isLocked)throw new Error(\"The stream '\"+this+\"' has already been used.\");this.streamInfo=a.streamInfo,this.mergeStreamInfo(),this.previous=a;var b=this;return a.on(\"data\",function(a){b.processChunk(a)}),a.on(\"end\",function(){b.end()}),a.on(\"error\",function(a){b.error(a)}),this},pause:function(){return!this.isPaused&&!this.isFinished&&(this.isPaused=!0,this.previous&&this.previous.pause(),!0)},resume:function(){if(!this.isPaused||this.isFinished)return!1;this.isPaused=!1;var a=!1;return this.generatedError&&(this.error(this.generatedError),a=!0),this.previous&&this.previous.resume(),!a},flush:function(){},processChunk:function(a){this.push(a)},withStreamInfo:function(a,b){return this.extraStreamInfo[a]=b,this.mergeStreamInfo(),this},mergeStreamInfo:function(){for(var a in this.extraStreamInfo)this.extraStreamInfo.hasOwnProperty(a)&&(this.streamInfo[a]=this.extraStreamInfo[a])},lock:function(){if(this.isLocked)throw new Error(\"The stream '\"+this+\"' has already been used.\");this.isLocked=!0,this.previous&&this.previous.lock()},toString:function(){var a=\"Worker \"+this.name;return this.previous?this.previous+\" -> \"+a:a}},b.exports=d},{}],29:[function(a,b,c){\"use strict\";function d(a,b,c){switch(a){case\"blob\":return h.newBlob(h.transformTo(\"arraybuffer\",b),c);case\"base64\":return k.encode(b);default:return h.transformTo(a,b)}}function e(a,b){var c,d=0,e=null,f=0;for(c=0;c<b.length;c++)f+=b[c].length;switch(a){case\"string\":return b.join(\"\");case\"array\":return Array.prototype.concat.apply([],b);case\"uint8array\":for(e=new Uint8Array(f),c=0;c<b.length;c++)e.set(b[c],d),d+=b[c].length;return e;case\"nodebuffer\":return Buffer.concat(b);default:throw new Error(\"concat : unsupported type '\"+a+\"'\")}}function f(a,b){return new m.Promise(function(c,f){var g=[],h=a._internalType,i=a._outputType,j=a._mimeType;a.on(\"data\",function(a,c){g.push(a),b&&b(c)}).on(\"error\",function(a){g=[],f(a)}).on(\"end\",function(){try{var a=d(i,e(h,g),j);c(a)}catch(b){f(b)}g=[]}).resume()})}function g(a,b,c){var d=b;switch(b){case\"blob\":case\"arraybuffer\":d=\"uint8array\";break;case\"base64\":d=\"string\"}try{this._internalType=d,this._outputType=b,this._mimeType=c,h.checkSupport(d),this._worker=a.pipe(new i(d)),a.lock()}catch(e){this._worker=new j(\"error\"),this._worker.error(e)}}var h=a(\"../utils\"),i=a(\"./ConvertWorker\"),j=a(\"./GenericWorker\"),k=a(\"../base64\"),l=a(\"../support\"),m=a(\"../external\"),n=null;if(l.nodestream)try{n=a(\"../nodejs/NodejsStreamOutputAdapter\")}catch(o){}g.prototype={accumulate:function(a){return f(this,a)},on:function(a,b){var c=this;return\"data\"===a?this._worker.on(a,function(a){b.call(c,a.data,a.meta)}):this._worker.on(a,function(){h.delay(b,arguments,c)}),this},resume:function(){return h.delay(this._worker.resume,[],this._worker),this},pause:function(){return this._worker.pause(),this},toNodejsStream:function(a){if(h.checkSupport(\"nodestream\"),\"nodebuffer\"!==this._outputType)throw new Error(this._outputType+\" is not supported by this method\");return new n(this,{objectMode:\"nodebuffer\"!==this._outputType},a)}},b.exports=g},{\"../base64\":1,\"../external\":6,\"../nodejs/NodejsStreamOutputAdapter\":13,\"../support\":30,\"../utils\":32,\"./ConvertWorker\":24,\"./GenericWorker\":28}],30:[function(a,b,c){\"use strict\";if(c.base64=!0,c.array=!0,c.string=!0,c.arraybuffer=\"undefined\"!=typeof ArrayBuffer&&\"undefined\"!=typeof Uint8Array,c.nodebuffer=\"undefined\"!=typeof Buffer,c.uint8array=\"undefined\"!=typeof Uint8Array,\"undefined\"==typeof ArrayBuffer)c.blob=!1;else{var d=new ArrayBuffer(0);try{c.blob=0===new Blob([d],{type:\"application/zip\"}).size}catch(e){try{var f=self.BlobBuilder||self.WebKitBlobBuilder||self.MozBlobBuilder||self.MSBlobBuilder,g=new f;g.append(d),c.blob=0===g.getBlob(\"application/zip\").size}catch(e){c.blob=!1}}}try{c.nodestream=!!a(\"readable-stream\").Readable}catch(e){c.nodestream=!1}},{\"readable-stream\":16}],31:[function(a,b,c){\"use strict\";function d(){i.call(this,\"utf-8 decode\"),this.leftOver=null}function e(){i.call(this,\"utf-8 encode\")}for(var f=a(\"./utils\"),g=a(\"./support\"),h=a(\"./nodejsUtils\"),i=a(\"./stream/GenericWorker\"),j=new Array(256),k=0;k<256;k++)j[k]=k>=252?6:k>=248?5:k>=240?4:k>=224?3:k>=192?2:1;j[254]=j[254]=1;var l=function(a){var b,c,d,e,f,h=a.length,i=0;for(e=0;e<h;e++)c=a.charCodeAt(e),55296===(64512&c)&&e+1<h&&(d=a.charCodeAt(e+1),56320===(64512&d)&&(c=65536+(c-55296<<10)+(d-56320),e++)),i+=c<128?1:c<2048?2:c<65536?3:4;for(b=g.uint8array?new Uint8Array(i):new Array(i),f=0,e=0;f<i;e++)c=a.charCodeAt(e),55296===(64512&c)&&e+1<h&&(d=a.charCodeAt(e+1),56320===(64512&d)&&(c=65536+(c-55296<<10)+(d-56320),e++)),c<128?b[f++]=c:c<2048?(b[f++]=192|c>>>6,b[f++]=128|63&c):c<65536?(b[f++]=224|c>>>12,b[f++]=128|c>>>6&63,b[f++]=128|63&c):(b[f++]=240|c>>>18,b[f++]=128|c>>>12&63,b[f++]=128|c>>>6&63,b[f++]=128|63&c);return b},m=function(a,b){var c;for(b=b||a.length,b>a.length&&(b=a.length),c=b-1;c>=0&&128===(192&a[c]);)c--;return c<0?b:0===c?b:c+j[a[c]]>b?c:b},n=function(a){var b,c,d,e,g=a.length,h=new Array(2*g);for(c=0,b=0;b<g;)if(d=a[b++],d<128)h[c++]=d;else if(e=j[d],e>4)h[c++]=65533,b+=e-1;else{for(d&=2===e?31:3===e?15:7;e>1&&b<g;)d=d<<6|63&a[b++],e--;e>1?h[c++]=65533:d<65536?h[c++]=d:(d-=65536,h[c++]=55296|d>>10&1023,h[c++]=56320|1023&d)}return h.length!==c&&(h.subarray?h=h.subarray(0,c):h.length=c),f.applyFromCharCode(h)};c.utf8encode=function(a){return g.nodebuffer?h.newBufferFrom(a,\"utf-8\"):l(a)},c.utf8decode=function(a){return g.nodebuffer?f.transformTo(\"nodebuffer\",a).toString(\"utf-8\"):(a=f.transformTo(g.uint8array?\"uint8array\":\"array\",a),n(a))},f.inherits(d,i),d.prototype.processChunk=function(a){var b=f.transformTo(g.uint8array?\"uint8array\":\"array\",a.data);if(this.leftOver&&this.leftOver.length){if(g.uint8array){var d=b;b=new Uint8Array(d.length+this.leftOver.length),b.set(this.leftOver,0),b.set(d,this.leftOver.length)}else b=this.leftOver.concat(b);this.leftOver=null}var e=m(b),h=b;e!==b.length&&(g.uint8array?(h=b.subarray(0,e),this.leftOver=b.subarray(e,b.length)):(h=b.slice(0,e),this.leftOver=b.slice(e,b.length))),this.push({data:c.utf8decode(h),meta:a.meta})},d.prototype.flush=function(){this.leftOver&&this.leftOver.length&&(this.push({data:c.utf8decode(this.leftOver),meta:{}}),this.leftOver=null)},c.Utf8DecodeWorker=d,f.inherits(e,i),e.prototype.processChunk=function(a){this.push({data:c.utf8encode(a.data),meta:a.meta})},c.Utf8EncodeWorker=e},{\"./nodejsUtils\":14,\"./stream/GenericWorker\":28,\"./support\":30,\"./utils\":32}],32:[function(a,b,c){\"use strict\";function d(a){var b=null;return b=i.uint8array?new Uint8Array(a.length):new Array(a.length),f(a,b)}function e(a){return a}function f(a,b){for(var c=0;c<a.length;++c)b[c]=255&a.charCodeAt(c);return b}function g(a){var b=65536,d=c.getTypeOf(a),e=!0;if(\"uint8array\"===d?e=n.applyCanBeUsed.uint8array:\"nodebuffer\"===d&&(e=n.applyCanBeUsed.nodebuffer),\ne)for(;b>1;)try{return n.stringifyByChunk(a,d,b)}catch(f){b=Math.floor(b/2)}return n.stringifyByChar(a)}function h(a,b){for(var c=0;c<a.length;c++)b[c]=a[c];return b}var i=a(\"./support\"),j=a(\"./base64\"),k=a(\"./nodejsUtils\"),l=a(\"set-immediate-shim\"),m=a(\"./external\");c.newBlob=function(a,b){c.checkSupport(\"blob\");try{return new Blob([a],{type:b})}catch(d){try{var e=self.BlobBuilder||self.WebKitBlobBuilder||self.MozBlobBuilder||self.MSBlobBuilder,f=new e;return f.append(a),f.getBlob(b)}catch(d){throw new Error(\"Bug : can't construct the Blob.\")}}};var n={stringifyByChunk:function(a,b,c){var d=[],e=0,f=a.length;if(f<=c)return String.fromCharCode.apply(null,a);for(;e<f;)\"array\"===b||\"nodebuffer\"===b?d.push(String.fromCharCode.apply(null,a.slice(e,Math.min(e+c,f)))):d.push(String.fromCharCode.apply(null,a.subarray(e,Math.min(e+c,f)))),e+=c;return d.join(\"\")},stringifyByChar:function(a){for(var b=\"\",c=0;c<a.length;c++)b+=String.fromCharCode(a[c]);return b},applyCanBeUsed:{uint8array:function(){try{return i.uint8array&&1===String.fromCharCode.apply(null,new Uint8Array(1)).length}catch(a){return!1}}(),nodebuffer:function(){try{return i.nodebuffer&&1===String.fromCharCode.apply(null,k.allocBuffer(1)).length}catch(a){return!1}}()}};c.applyFromCharCode=g;var o={};o.string={string:e,array:function(a){return f(a,new Array(a.length))},arraybuffer:function(a){return o.string.uint8array(a).buffer},uint8array:function(a){return f(a,new Uint8Array(a.length))},nodebuffer:function(a){return f(a,k.allocBuffer(a.length))}},o.array={string:g,array:e,arraybuffer:function(a){return new Uint8Array(a).buffer},uint8array:function(a){return new Uint8Array(a)},nodebuffer:function(a){return k.newBufferFrom(a)}},o.arraybuffer={string:function(a){return g(new Uint8Array(a))},array:function(a){return h(new Uint8Array(a),new Array(a.byteLength))},arraybuffer:e,uint8array:function(a){return new Uint8Array(a)},nodebuffer:function(a){return k.newBufferFrom(new Uint8Array(a))}},o.uint8array={string:g,array:function(a){return h(a,new Array(a.length))},arraybuffer:function(a){return a.buffer},uint8array:e,nodebuffer:function(a){return k.newBufferFrom(a)}},o.nodebuffer={string:g,array:function(a){return h(a,new Array(a.length))},arraybuffer:function(a){return o.nodebuffer.uint8array(a).buffer},uint8array:function(a){return h(a,new Uint8Array(a.length))},nodebuffer:e},c.transformTo=function(a,b){if(b||(b=\"\"),!a)return b;c.checkSupport(a);var d=c.getTypeOf(b),e=o[d][a](b);return e},c.getTypeOf=function(a){return\"string\"==typeof a?\"string\":\"[object Array]\"===Object.prototype.toString.call(a)?\"array\":i.nodebuffer&&k.isBuffer(a)?\"nodebuffer\":i.uint8array&&a instanceof Uint8Array?\"uint8array\":i.arraybuffer&&a instanceof ArrayBuffer?\"arraybuffer\":void 0},c.checkSupport=function(a){var b=i[a.toLowerCase()];if(!b)throw new Error(a+\" is not supported by this platform\")},c.MAX_VALUE_16BITS=65535,c.MAX_VALUE_32BITS=-1,c.pretty=function(a){var b,c,d=\"\";for(c=0;c<(a||\"\").length;c++)b=a.charCodeAt(c),d+=\"\\\\x\"+(b<16?\"0\":\"\")+b.toString(16).toUpperCase();return d},c.delay=function(a,b,c){l(function(){a.apply(c||null,b||[])})},c.inherits=function(a,b){var c=function(){};c.prototype=b.prototype,a.prototype=new c},c.extend=function(){var a,b,c={};for(a=0;a<arguments.length;a++)for(b in arguments[a])arguments[a].hasOwnProperty(b)&&\"undefined\"==typeof c[b]&&(c[b]=arguments[a][b]);return c},c.prepareContent=function(a,b,e,f,g){var h=m.Promise.resolve(b).then(function(a){var b=i.blob&&(a instanceof Blob||[\"[object File]\",\"[object Blob]\"].indexOf(Object.prototype.toString.call(a))!==-1);return b&&\"undefined\"!=typeof FileReader?new m.Promise(function(b,c){var d=new FileReader;d.onload=function(a){b(a.target.result)},d.onerror=function(a){c(a.target.error)},d.readAsArrayBuffer(a)}):a});return h.then(function(b){var h=c.getTypeOf(b);return h?(\"arraybuffer\"===h?b=c.transformTo(\"uint8array\",b):\"string\"===h&&(g?b=j.decode(b):e&&f!==!0&&(b=d(b))),b):m.Promise.reject(new Error(\"Can't read the data of '\"+a+\"'. Is it in a supported JavaScript type (String, Blob, ArrayBuffer, etc) ?\"))})}},{\"./base64\":1,\"./external\":6,\"./nodejsUtils\":14,\"./support\":30,\"set-immediate-shim\":54}],33:[function(a,b,c){\"use strict\";function d(a){this.files=[],this.loadOptions=a}var e=a(\"./reader/readerFor\"),f=a(\"./utils\"),g=a(\"./signature\"),h=a(\"./zipEntry\"),i=(a(\"./utf8\"),a(\"./support\"));d.prototype={checkSignature:function(a){if(!this.reader.readAndCheckSignature(a)){this.reader.index-=4;var b=this.reader.readString(4);throw new Error(\"Corrupted zip or bug: unexpected signature (\"+f.pretty(b)+\", expected \"+f.pretty(a)+\")\")}},isSignature:function(a,b){var c=this.reader.index;this.reader.setIndex(a);var d=this.reader.readString(4),e=d===b;return this.reader.setIndex(c),e},readBlockEndOfCentral:function(){this.diskNumber=this.reader.readInt(2),this.diskWithCentralDirStart=this.reader.readInt(2),this.centralDirRecordsOnThisDisk=this.reader.readInt(2),this.centralDirRecords=this.reader.readInt(2),this.centralDirSize=this.reader.readInt(4),this.centralDirOffset=this.reader.readInt(4),this.zipCommentLength=this.reader.readInt(2);var a=this.reader.readData(this.zipCommentLength),b=i.uint8array?\"uint8array\":\"array\",c=f.transformTo(b,a);this.zipComment=this.loadOptions.decodeFileName(c)},readBlockZip64EndOfCentral:function(){this.zip64EndOfCentralSize=this.reader.readInt(8),this.reader.skip(4),this.diskNumber=this.reader.readInt(4),this.diskWithCentralDirStart=this.reader.readInt(4),this.centralDirRecordsOnThisDisk=this.reader.readInt(8),this.centralDirRecords=this.reader.readInt(8),this.centralDirSize=this.reader.readInt(8),this.centralDirOffset=this.reader.readInt(8),this.zip64ExtensibleData={};for(var a,b,c,d=this.zip64EndOfCentralSize-44,e=0;e<d;)a=this.reader.readInt(2),b=this.reader.readInt(4),c=this.reader.readData(b),this.zip64ExtensibleData[a]={id:a,length:b,value:c}},readBlockZip64EndOfCentralLocator:function(){if(this.diskWithZip64CentralDirStart=this.reader.readInt(4),this.relativeOffsetEndOfZip64CentralDir=this.reader.readInt(8),this.disksCount=this.reader.readInt(4),this.disksCount>1)throw new Error(\"Multi-volumes zip are not supported\")},readLocalFiles:function(){var a,b;for(a=0;a<this.files.length;a++)b=this.files[a],this.reader.setIndex(b.localHeaderOffset),this.checkSignature(g.LOCAL_FILE_HEADER),b.readLocalPart(this.reader),b.handleUTF8(),b.processAttributes()},readCentralDir:function(){var a;for(this.reader.setIndex(this.centralDirOffset);this.reader.readAndCheckSignature(g.CENTRAL_FILE_HEADER);)a=new h({zip64:this.zip64},this.loadOptions),a.readCentralPart(this.reader),this.files.push(a);if(this.centralDirRecords!==this.files.length&&0!==this.centralDirRecords&&0===this.files.length)throw new Error(\"Corrupted zip or bug: expected \"+this.centralDirRecords+\" records in central dir, got \"+this.files.length)},readEndOfCentral:function(){var a=this.reader.lastIndexOfSignature(g.CENTRAL_DIRECTORY_END);if(a<0){var b=!this.isSignature(0,g.LOCAL_FILE_HEADER);throw b?new Error(\"Can't find end of central directory : is this a zip file ? If it is, see https://stuk.github.io/jszip/documentation/howto/read_zip.html\"):new Error(\"Corrupted zip: can't find end of central directory\")}this.reader.setIndex(a);var c=a;if(this.checkSignature(g.CENTRAL_DIRECTORY_END),this.readBlockEndOfCentral(),this.diskNumber===f.MAX_VALUE_16BITS||this.diskWithCentralDirStart===f.MAX_VALUE_16BITS||this.centralDirRecordsOnThisDisk===f.MAX_VALUE_16BITS||this.centralDirRecords===f.MAX_VALUE_16BITS||this.centralDirSize===f.MAX_VALUE_32BITS||this.centralDirOffset===f.MAX_VALUE_32BITS){if(this.zip64=!0,a=this.reader.lastIndexOfSignature(g.ZIP64_CENTRAL_DIRECTORY_LOCATOR),a<0)throw new Error(\"Corrupted zip: can't find the ZIP64 end of central directory locator\");if(this.reader.setIndex(a),this.checkSignature(g.ZIP64_CENTRAL_DIRECTORY_LOCATOR),this.readBlockZip64EndOfCentralLocator(),!this.isSignature(this.relativeOffsetEndOfZip64CentralDir,g.ZIP64_CENTRAL_DIRECTORY_END)&&(this.relativeOffsetEndOfZip64CentralDir=this.reader.lastIndexOfSignature(g.ZIP64_CENTRAL_DIRECTORY_END),this.relativeOffsetEndOfZip64CentralDir<0))throw new Error(\"Corrupted zip: can't find the ZIP64 end of central directory\");this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir),this.checkSignature(g.ZIP64_CENTRAL_DIRECTORY_END),this.readBlockZip64EndOfCentral()}var d=this.centralDirOffset+this.centralDirSize;this.zip64&&(d+=20,d+=12+this.zip64EndOfCentralSize);var e=c-d;if(e>0)this.isSignature(c,g.CENTRAL_FILE_HEADER)||(this.reader.zero=e);else if(e<0)throw new Error(\"Corrupted zip: missing \"+Math.abs(e)+\" bytes.\")},prepareReader:function(a){this.reader=e(a)},load:function(a){this.prepareReader(a),this.readEndOfCentral(),this.readCentralDir(),this.readLocalFiles()}},b.exports=d},{\"./reader/readerFor\":22,\"./signature\":23,\"./support\":30,\"./utf8\":31,\"./utils\":32,\"./zipEntry\":34}],34:[function(a,b,c){\"use strict\";function d(a,b){this.options=a,this.loadOptions=b}var e=a(\"./reader/readerFor\"),f=a(\"./utils\"),g=a(\"./compressedObject\"),h=a(\"./crc32\"),i=a(\"./utf8\"),j=a(\"./compressions\"),k=a(\"./support\"),l=0,m=3,n=function(a){for(var b in j)if(j.hasOwnProperty(b)&&j[b].magic===a)return j[b];return null};d.prototype={isEncrypted:function(){return 1===(1&this.bitFlag)},useUTF8:function(){return 2048===(2048&this.bitFlag)},readLocalPart:function(a){var b,c;if(a.skip(22),this.fileNameLength=a.readInt(2),c=a.readInt(2),this.fileName=a.readData(this.fileNameLength),a.skip(c),this.compressedSize===-1||this.uncompressedSize===-1)throw new Error(\"Bug or corrupted zip : didn't get enough informations from the central directory (compressedSize === -1 || uncompressedSize === -1)\");if(b=n(this.compressionMethod),null===b)throw new Error(\"Corrupted zip : compression \"+f.pretty(this.compressionMethod)+\" unknown (inner file : \"+f.transformTo(\"string\",this.fileName)+\")\");this.decompressed=new g(this.compressedSize,this.uncompressedSize,this.crc32,b,a.readData(this.compressedSize))},readCentralPart:function(a){this.versionMadeBy=a.readInt(2),a.skip(2),this.bitFlag=a.readInt(2),this.compressionMethod=a.readString(2),this.date=a.readDate(),this.crc32=a.readInt(4),this.compressedSize=a.readInt(4),this.uncompressedSize=a.readInt(4);var b=a.readInt(2);if(this.extraFieldsLength=a.readInt(2),this.fileCommentLength=a.readInt(2),this.diskNumberStart=a.readInt(2),this.internalFileAttributes=a.readInt(2),this.externalFileAttributes=a.readInt(4),this.localHeaderOffset=a.readInt(4),this.isEncrypted())throw new Error(\"Encrypted zip are not supported\");a.skip(b),this.readExtraFields(a),this.parseZIP64ExtraField(a),this.fileComment=a.readData(this.fileCommentLength)},processAttributes:function(){this.unixPermissions=null,this.dosPermissions=null;var a=this.versionMadeBy>>8;this.dir=!!(16&this.externalFileAttributes),a===l&&(this.dosPermissions=63&this.externalFileAttributes),a===m&&(this.unixPermissions=this.externalFileAttributes>>16&65535),this.dir||\"/\"!==this.fileNameStr.slice(-1)||(this.dir=!0)},parseZIP64ExtraField:function(a){if(this.extraFields[1]){var b=e(this.extraFields[1].value);this.uncompressedSize===f.MAX_VALUE_32BITS&&(this.uncompressedSize=b.readInt(8)),this.compressedSize===f.MAX_VALUE_32BITS&&(this.compressedSize=b.readInt(8)),this.localHeaderOffset===f.MAX_VALUE_32BITS&&(this.localHeaderOffset=b.readInt(8)),this.diskNumberStart===f.MAX_VALUE_32BITS&&(this.diskNumberStart=b.readInt(4))}},readExtraFields:function(a){var b,c,d,e=a.index+this.extraFieldsLength;for(this.extraFields||(this.extraFields={});a.index<e;)b=a.readInt(2),c=a.readInt(2),d=a.readData(c),this.extraFields[b]={id:b,length:c,value:d}},handleUTF8:function(){var a=k.uint8array?\"uint8array\":\"array\";if(this.useUTF8())this.fileNameStr=i.utf8decode(this.fileName),this.fileCommentStr=i.utf8decode(this.fileComment);else{var b=this.findExtraFieldUnicodePath();if(null!==b)this.fileNameStr=b;else{var c=f.transformTo(a,this.fileName);this.fileNameStr=this.loadOptions.decodeFileName(c)}var d=this.findExtraFieldUnicodeComment();if(null!==d)this.fileCommentStr=d;else{var e=f.transformTo(a,this.fileComment);this.fileCommentStr=this.loadOptions.decodeFileName(e)}}},findExtraFieldUnicodePath:function(){var a=this.extraFields[28789];if(a){var b=e(a.value);return 1!==b.readInt(1)?null:h(this.fileName)!==b.readInt(4)?null:i.utf8decode(b.readData(a.length-5))}return null},findExtraFieldUnicodeComment:function(){var a=this.extraFields[25461];if(a){var b=e(a.value);return 1!==b.readInt(1)?null:h(this.fileComment)!==b.readInt(4)?null:i.utf8decode(b.readData(a.length-5))}return null}},b.exports=d},{\"./compressedObject\":2,\"./compressions\":3,\"./crc32\":4,\"./reader/readerFor\":22,\"./support\":30,\"./utf8\":31,\"./utils\":32}],35:[function(a,b,c){\"use strict\";var d=a(\"./stream/StreamHelper\"),e=a(\"./stream/DataWorker\"),f=a(\"./utf8\"),g=a(\"./compressedObject\"),h=a(\"./stream/GenericWorker\"),i=function(a,b,c){this.name=a,this.dir=c.dir,this.date=c.date,this.comment=c.comment,this.unixPermissions=c.unixPermissions,this.dosPermissions=c.dosPermissions,this._data=b,this._dataBinary=c.binary,this.options={compression:c.compression,compressionOptions:c.compressionOptions}};i.prototype={internalStream:function(a){var b=null,c=\"string\";try{if(!a)throw new Error(\"No output type specified.\");c=a.toLowerCase();var e=\"string\"===c||\"text\"===c;\"binarystring\"!==c&&\"text\"!==c||(c=\"string\"),b=this._decompressWorker();var g=!this._dataBinary;g&&!e&&(b=b.pipe(new f.Utf8EncodeWorker)),!g&&e&&(b=b.pipe(new f.Utf8DecodeWorker))}catch(i){b=new h(\"error\"),b.error(i)}return new d(b,c,\"\")},async:function(a,b){return this.internalStream(a).accumulate(b)},nodeStream:function(a,b){return this.internalStream(a||\"nodebuffer\").toNodejsStream(b)},_compressWorker:function(a,b){if(this._data instanceof g&&this._data.compression.magic===a.magic)return this._data.getCompressedWorker();var c=this._decompressWorker();return this._dataBinary||(c=c.pipe(new f.Utf8EncodeWorker)),g.createWorkerFrom(c,a,b)},_decompressWorker:function(){return this._data instanceof g?this._data.getContentWorker():this._data instanceof h?this._data:new e(this._data)}};for(var j=[\"asText\",\"asBinary\",\"asNodeBuffer\",\"asUint8Array\",\"asArrayBuffer\"],k=function(){throw new Error(\"This method has been removed in JSZip 3.0, please check the upgrade guide.\")},l=0;l<j.length;l++)i.prototype[j[l]]=k;b.exports=i},{\"./compressedObject\":2,\"./stream/DataWorker\":27,\"./stream/GenericWorker\":28,\"./stream/StreamHelper\":29,\"./utf8\":31}],36:[function(a,b,c){(function(a){\"use strict\";function c(){k=!0;for(var a,b,c=l.length;c;){for(b=l,l=[],a=-1;++a<c;)b[a]();c=l.length}k=!1}function d(a){1!==l.push(a)||k||e()}var e,f=a.MutationObserver||a.WebKitMutationObserver;if(f){var g=0,h=new f(c),i=a.document.createTextNode(\"\");h.observe(i,{characterData:!0}),e=function(){i.data=g=++g%2}}else if(a.setImmediate||\"undefined\"==typeof a.MessageChannel)e=\"document\"in a&&\"onreadystatechange\"in a.document.createElement(\"script\")?function(){var b=a.document.createElement(\"script\");b.onreadystatechange=function(){c(),b.onreadystatechange=null,b.parentNode.removeChild(b),b=null},a.document.documentElement.appendChild(b)}:function(){setTimeout(c,0)};else{var j=new a.MessageChannel;j.port1.onmessage=c,e=function(){j.port2.postMessage(0)}}var k,l=[];b.exports=d}).call(this,\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{})},{}],37:[function(a,b,c){\"use strict\";function d(){}function e(a){if(\"function\"!=typeof a)throw new TypeError(\"resolver must be a function\");this.state=s,this.queue=[],this.outcome=void 0,a!==d&&i(this,a)}function f(a,b,c){this.promise=a,\"function\"==typeof b&&(this.onFulfilled=b,this.callFulfilled=this.otherCallFulfilled),\"function\"==typeof c&&(this.onRejected=c,this.callRejected=this.otherCallRejected)}function g(a,b,c){o(function(){var d;try{d=b(c)}catch(e){return p.reject(a,e)}d===a?p.reject(a,new TypeError(\"Cannot resolve promise with itself\")):p.resolve(a,d)})}function h(a){var b=a&&a.then;if(a&&(\"object\"==typeof a||\"function\"==typeof a)&&\"function\"==typeof b)return function(){b.apply(a,arguments)}}function i(a,b){function c(b){f||(f=!0,p.reject(a,b))}function d(b){f||(f=!0,p.resolve(a,b))}function e(){b(d,c)}var f=!1,g=j(e);\"error\"===g.status&&c(g.value)}function j(a,b){var c={};try{c.value=a(b),c.status=\"success\"}catch(d){c.status=\"error\",c.value=d}return c}function k(a){return a instanceof this?a:p.resolve(new this(d),a)}function l(a){var b=new this(d);return p.reject(b,a)}function m(a){function b(a,b){function d(a){g[b]=a,++h!==e||f||(f=!0,p.resolve(j,g))}c.resolve(a).then(d,function(a){f||(f=!0,p.reject(j,a))})}var c=this;if(\"[object Array]\"!==Object.prototype.toString.call(a))return this.reject(new TypeError(\"must be an array\"));var e=a.length,f=!1;if(!e)return this.resolve([]);for(var g=new Array(e),h=0,i=-1,j=new this(d);++i<e;)b(a[i],i);return j}function n(a){function b(a){c.resolve(a).then(function(a){f||(f=!0,p.resolve(h,a))},function(a){f||(f=!0,p.reject(h,a))})}var c=this;if(\"[object Array]\"!==Object.prototype.toString.call(a))return this.reject(new TypeError(\"must be an array\"));var e=a.length,f=!1;if(!e)return this.resolve([]);for(var g=-1,h=new this(d);++g<e;)b(a[g]);return h}var o=a(\"immediate\"),p={},q=[\"REJECTED\"],r=[\"FULFILLED\"],s=[\"PENDING\"];b.exports=e,e.prototype[\"finally\"]=function(a){function b(b){function c(){return b}return d.resolve(a()).then(c)}function c(b){function c(){throw b}return d.resolve(a()).then(c)}if(\"function\"!=typeof a)return this;var d=this.constructor;return this.then(b,c)},e.prototype[\"catch\"]=function(a){return this.then(null,a)},e.prototype.then=function(a,b){if(\"function\"!=typeof a&&this.state===r||\"function\"!=typeof b&&this.state===q)return this;var c=new this.constructor(d);if(this.state!==s){var e=this.state===r?a:b;g(c,e,this.outcome)}else this.queue.push(new f(c,a,b));return c},f.prototype.callFulfilled=function(a){p.resolve(this.promise,a)},f.prototype.otherCallFulfilled=function(a){g(this.promise,this.onFulfilled,a)},f.prototype.callRejected=function(a){p.reject(this.promise,a)},f.prototype.otherCallRejected=function(a){g(this.promise,this.onRejected,a)},p.resolve=function(a,b){var c=j(h,b);if(\"error\"===c.status)return p.reject(a,c.value);var d=c.value;if(d)i(a,d);else{a.state=r,a.outcome=b;for(var e=-1,f=a.queue.length;++e<f;)a.queue[e].callFulfilled(b)}return a},p.reject=function(a,b){a.state=q,a.outcome=b;for(var c=-1,d=a.queue.length;++c<d;)a.queue[c].callRejected(b);return a},e.resolve=k,e.reject=l,e.all=m,e.race=n},{immediate:36}],38:[function(a,b,c){\"use strict\";var d=a(\"./lib/utils/common\").assign,e=a(\"./lib/deflate\"),f=a(\"./lib/inflate\"),g=a(\"./lib/zlib/constants\"),h={};d(h,e,f,g),b.exports=h},{\"./lib/deflate\":39,\"./lib/inflate\":40,\"./lib/utils/common\":41,\"./lib/zlib/constants\":44}],39:[function(a,b,c){\"use strict\";function d(a){if(!(this instanceof d))return new d(a);this.options=i.assign({level:s,method:u,chunkSize:16384,windowBits:15,memLevel:8,strategy:t,to:\"\"},a||{});var b=this.options;b.raw&&b.windowBits>0?b.windowBits=-b.windowBits:b.gzip&&b.windowBits>0&&b.windowBits<16&&(b.windowBits+=16),this.err=0,this.msg=\"\",this.ended=!1,this.chunks=[],this.strm=new l,this.strm.avail_out=0;var c=h.deflateInit2(this.strm,b.level,b.method,b.windowBits,b.memLevel,b.strategy);if(c!==p)throw new Error(k[c]);if(b.header&&h.deflateSetHeader(this.strm,b.header),b.dictionary){var e;if(e=\"string\"==typeof b.dictionary?j.string2buf(b.dictionary):\"[object ArrayBuffer]\"===m.call(b.dictionary)?new Uint8Array(b.dictionary):b.dictionary,c=h.deflateSetDictionary(this.strm,e),c!==p)throw new Error(k[c]);this._dict_set=!0}}function e(a,b){var c=new d(b);if(c.push(a,!0),c.err)throw c.msg||k[c.err];return c.result}function f(a,b){return b=b||{},b.raw=!0,e(a,b)}function g(a,b){return b=b||{},b.gzip=!0,e(a,b)}var h=a(\"./zlib/deflate\"),i=a(\"./utils/common\"),j=a(\"./utils/strings\"),k=a(\"./zlib/messages\"),l=a(\"./zlib/zstream\"),m=Object.prototype.toString,n=0,o=4,p=0,q=1,r=2,s=-1,t=0,u=8;d.prototype.push=function(a,b){var c,d,e=this.strm,f=this.options.chunkSize;if(this.ended)return!1;d=b===~~b?b:b===!0?o:n,\"string\"==typeof a?e.input=j.string2buf(a):\"[object ArrayBuffer]\"===m.call(a)?e.input=new Uint8Array(a):e.input=a,e.next_in=0,e.avail_in=e.input.length;do{if(0===e.avail_out&&(e.output=new i.Buf8(f),e.next_out=0,e.avail_out=f),c=h.deflate(e,d),c!==q&&c!==p)return this.onEnd(c),this.ended=!0,!1;0!==e.avail_out&&(0!==e.avail_in||d!==o&&d!==r)||(\"string\"===this.options.to?this.onData(j.buf2binstring(i.shrinkBuf(e.output,e.next_out))):this.onData(i.shrinkBuf(e.output,e.next_out)))}while((e.avail_in>0||0===e.avail_out)&&c!==q);return d===o?(c=h.deflateEnd(this.strm),this.onEnd(c),this.ended=!0,c===p):d!==r||(this.onEnd(p),e.avail_out=0,!0)},d.prototype.onData=function(a){this.chunks.push(a)},d.prototype.onEnd=function(a){a===p&&(\"string\"===this.options.to?this.result=this.chunks.join(\"\"):this.result=i.flattenChunks(this.chunks)),this.chunks=[],this.err=a,this.msg=this.strm.msg},c.Deflate=d,c.deflate=e,c.deflateRaw=f,c.gzip=g},{\"./utils/common\":41,\"./utils/strings\":42,\"./zlib/deflate\":46,\"./zlib/messages\":51,\"./zlib/zstream\":53}],40:[function(a,b,c){\"use strict\";function d(a){if(!(this instanceof d))return new d(a);this.options=h.assign({chunkSize:16384,windowBits:0,to:\"\"},a||{});var b=this.options;b.raw&&b.windowBits>=0&&b.windowBits<16&&(b.windowBits=-b.windowBits,0===b.windowBits&&(b.windowBits=-15)),!(b.windowBits>=0&&b.windowBits<16)||a&&a.windowBits||(b.windowBits+=32),b.windowBits>15&&b.windowBits<48&&0===(15&b.windowBits)&&(b.windowBits|=15),this.err=0,this.msg=\"\",this.ended=!1,this.chunks=[],this.strm=new l,this.strm.avail_out=0;var c=g.inflateInit2(this.strm,b.windowBits);if(c!==j.Z_OK)throw new Error(k[c]);this.header=new m,g.inflateGetHeader(this.strm,this.header)}function e(a,b){var c=new d(b);if(c.push(a,!0),c.err)throw c.msg||k[c.err];return c.result}function f(a,b){return b=b||{},b.raw=!0,e(a,b)}var g=a(\"./zlib/inflate\"),h=a(\"./utils/common\"),i=a(\"./utils/strings\"),j=a(\"./zlib/constants\"),k=a(\"./zlib/messages\"),l=a(\"./zlib/zstream\"),m=a(\"./zlib/gzheader\"),n=Object.prototype.toString;d.prototype.push=function(a,b){var c,d,e,f,k,l,m=this.strm,o=this.options.chunkSize,p=this.options.dictionary,q=!1;if(this.ended)return!1;d=b===~~b?b:b===!0?j.Z_FINISH:j.Z_NO_FLUSH,\"string\"==typeof a?m.input=i.binstring2buf(a):\"[object ArrayBuffer]\"===n.call(a)?m.input=new Uint8Array(a):m.input=a,m.next_in=0,m.avail_in=m.input.length;do{if(0===m.avail_out&&(m.output=new h.Buf8(o),m.next_out=0,m.avail_out=o),c=g.inflate(m,j.Z_NO_FLUSH),c===j.Z_NEED_DICT&&p&&(l=\"string\"==typeof p?i.string2buf(p):\"[object ArrayBuffer]\"===n.call(p)?new Uint8Array(p):p,c=g.inflateSetDictionary(this.strm,l)),c===j.Z_BUF_ERROR&&q===!0&&(c=j.Z_OK,q=!1),c!==j.Z_STREAM_END&&c!==j.Z_OK)return this.onEnd(c),this.ended=!0,!1;m.next_out&&(0!==m.avail_out&&c!==j.Z_STREAM_END&&(0!==m.avail_in||d!==j.Z_FINISH&&d!==j.Z_SYNC_FLUSH)||(\"string\"===this.options.to?(e=i.utf8border(m.output,m.next_out),f=m.next_out-e,k=i.buf2string(m.output,e),m.next_out=f,m.avail_out=o-f,f&&h.arraySet(m.output,m.output,e,f,0),this.onData(k)):this.onData(h.shrinkBuf(m.output,m.next_out)))),0===m.avail_in&&0===m.avail_out&&(q=!0)}while((m.avail_in>0||0===m.avail_out)&&c!==j.Z_STREAM_END);return c===j.Z_STREAM_END&&(d=j.Z_FINISH),d===j.Z_FINISH?(c=g.inflateEnd(this.strm),this.onEnd(c),this.ended=!0,c===j.Z_OK):d!==j.Z_SYNC_FLUSH||(this.onEnd(j.Z_OK),m.avail_out=0,!0)},d.prototype.onData=function(a){this.chunks.push(a)},d.prototype.onEnd=function(a){a===j.Z_OK&&(\"string\"===this.options.to?this.result=this.chunks.join(\"\"):this.result=h.flattenChunks(this.chunks)),this.chunks=[],this.err=a,this.msg=this.strm.msg},c.Inflate=d,c.inflate=e,c.inflateRaw=f,c.ungzip=e},{\"./utils/common\":41,\"./utils/strings\":42,\"./zlib/constants\":44,\"./zlib/gzheader\":47,\"./zlib/inflate\":49,\"./zlib/messages\":51,\"./zlib/zstream\":53}],41:[function(a,b,c){\"use strict\";var d=\"undefined\"!=typeof Uint8Array&&\"undefined\"!=typeof Uint16Array&&\"undefined\"!=typeof Int32Array;c.assign=function(a){for(var b=Array.prototype.slice.call(arguments,1);b.length;){var c=b.shift();if(c){if(\"object\"!=typeof c)throw new TypeError(c+\"must be non-object\");for(var d in c)c.hasOwnProperty(d)&&(a[d]=c[d])}}return a},c.shrinkBuf=function(a,b){return a.length===b?a:a.subarray?a.subarray(0,b):(a.length=b,a)};var e={arraySet:function(a,b,c,d,e){if(b.subarray&&a.subarray)return void a.set(b.subarray(c,c+d),e);for(var f=0;f<d;f++)a[e+f]=b[c+f]},flattenChunks:function(a){var b,c,d,e,f,g;for(d=0,b=0,c=a.length;b<c;b++)d+=a[b].length;for(g=new Uint8Array(d),e=0,b=0,c=a.length;b<c;b++)f=a[b],g.set(f,e),e+=f.length;return g}},f={arraySet:function(a,b,c,d,e){for(var f=0;f<d;f++)a[e+f]=b[c+f]},flattenChunks:function(a){return[].concat.apply([],a)}};c.setTyped=function(a){a?(c.Buf8=Uint8Array,c.Buf16=Uint16Array,c.Buf32=Int32Array,c.assign(c,e)):(c.Buf8=Array,c.Buf16=Array,c.Buf32=Array,c.assign(c,f))},c.setTyped(d)},{}],42:[function(a,b,c){\"use strict\";function d(a,b){if(b<65537&&(a.subarray&&g||!a.subarray&&f))return String.fromCharCode.apply(null,e.shrinkBuf(a,b));for(var c=\"\",d=0;d<b;d++)c+=String.fromCharCode(a[d]);return c}var e=a(\"./common\"),f=!0,g=!0;try{String.fromCharCode.apply(null,[0])}catch(h){f=!1}try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(h){g=!1}for(var i=new e.Buf8(256),j=0;j<256;j++)i[j]=j>=252?6:j>=248?5:j>=240?4:j>=224?3:j>=192?2:1;i[254]=i[254]=1,c.string2buf=function(a){var b,c,d,f,g,h=a.length,i=0;for(f=0;f<h;f++)c=a.charCodeAt(f),55296===(64512&c)&&f+1<h&&(d=a.charCodeAt(f+1),56320===(64512&d)&&(c=65536+(c-55296<<10)+(d-56320),f++)),i+=c<128?1:c<2048?2:c<65536?3:4;for(b=new e.Buf8(i),g=0,f=0;g<i;f++)c=a.charCodeAt(f),55296===(64512&c)&&f+1<h&&(d=a.charCodeAt(f+1),56320===(64512&d)&&(c=65536+(c-55296<<10)+(d-56320),f++)),c<128?b[g++]=c:c<2048?(b[g++]=192|c>>>6,b[g++]=128|63&c):c<65536?(b[g++]=224|c>>>12,b[g++]=128|c>>>6&63,b[g++]=128|63&c):(b[g++]=240|c>>>18,b[g++]=128|c>>>12&63,b[g++]=128|c>>>6&63,b[g++]=128|63&c);return b},c.buf2binstring=function(a){return d(a,a.length)},c.binstring2buf=function(a){for(var b=new e.Buf8(a.length),c=0,d=b.length;c<d;c++)b[c]=a.charCodeAt(c);return b},c.buf2string=function(a,b){var c,e,f,g,h=b||a.length,j=new Array(2*h);for(e=0,c=0;c<h;)if(f=a[c++],f<128)j[e++]=f;else if(g=i[f],g>4)j[e++]=65533,c+=g-1;else{for(f&=2===g?31:3===g?15:7;g>1&&c<h;)f=f<<6|63&a[c++],g--;g>1?j[e++]=65533:f<65536?j[e++]=f:(f-=65536,j[e++]=55296|f>>10&1023,j[e++]=56320|1023&f)}return d(j,e)},c.utf8border=function(a,b){var c;for(b=b||a.length,b>a.length&&(b=a.length),c=b-1;c>=0&&128===(192&a[c]);)c--;return c<0?b:0===c?b:c+i[a[c]]>b?c:b}},{\"./common\":41}],43:[function(a,b,c){\"use strict\";function d(a,b,c,d){for(var e=65535&a|0,f=a>>>16&65535|0,g=0;0!==c;){g=c>2e3?2e3:c,c-=g;do e=e+b[d++]|0,f=f+e|0;while(--g);e%=65521,f%=65521}return e|f<<16|0}b.exports=d},{}],44:[function(a,b,c){\"use strict\";b.exports={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8}},{}],45:[function(a,b,c){\"use strict\";function d(){for(var a,b=[],c=0;c<256;c++){a=c;for(var d=0;d<8;d++)a=1&a?3988292384^a>>>1:a>>>1;b[c]=a}return b}function e(a,b,c,d){var e=f,g=d+c;a^=-1;for(var h=d;h<g;h++)a=a>>>8^e[255&(a^b[h])];return a^-1}var f=d();b.exports=e},{}],46:[function(a,b,c){\"use strict\";function d(a,b){return a.msg=I[b],b}function e(a){return(a<<1)-(a>4?9:0)}function f(a){for(var b=a.length;--b>=0;)a[b]=0}function g(a){var b=a.state,c=b.pending;c>a.avail_out&&(c=a.avail_out),0!==c&&(E.arraySet(a.output,b.pending_buf,b.pending_out,c,a.next_out),a.next_out+=c,b.pending_out+=c,a.total_out+=c,a.avail_out-=c,b.pending-=c,0===b.pending&&(b.pending_out=0))}function h(a,b){F._tr_flush_block(a,a.block_start>=0?a.block_start:-1,a.strstart-a.block_start,b),a.block_start=a.strstart,g(a.strm)}function i(a,b){a.pending_buf[a.pending++]=b}function j(a,b){a.pending_buf[a.pending++]=b>>>8&255,a.pending_buf[a.pending++]=255&b}function k(a,b,c,d){var e=a.avail_in;return e>d&&(e=d),0===e?0:(a.avail_in-=e,E.arraySet(b,a.input,a.next_in,e,c),1===a.state.wrap?a.adler=G(a.adler,b,e,c):2===a.state.wrap&&(a.adler=H(a.adler,b,e,c)),a.next_in+=e,a.total_in+=e,e)}function l(a,b){var c,d,e=a.max_chain_length,f=a.strstart,g=a.prev_length,h=a.nice_match,i=a.strstart>a.w_size-la?a.strstart-(a.w_size-la):0,j=a.window,k=a.w_mask,l=a.prev,m=a.strstart+ka,n=j[f+g-1],o=j[f+g];a.prev_length>=a.good_match&&(e>>=2),h>a.lookahead&&(h=a.lookahead);do if(c=b,j[c+g]===o&&j[c+g-1]===n&&j[c]===j[f]&&j[++c]===j[f+1]){f+=2,c++;do;while(j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&f<m);if(d=ka-(m-f),f=m-ka,d>g){if(a.match_start=b,g=d,d>=h)break;n=j[f+g-1],o=j[f+g]}}while((b=l[b&k])>i&&0!==--e);return g<=a.lookahead?g:a.lookahead}function m(a){var b,c,d,e,f,g=a.w_size;do{if(e=a.window_size-a.lookahead-a.strstart,a.strstart>=g+(g-la)){E.arraySet(a.window,a.window,g,g,0),a.match_start-=g,a.strstart-=g,a.block_start-=g,c=a.hash_size,b=c;do d=a.head[--b],a.head[b]=d>=g?d-g:0;while(--c);c=g,b=c;do d=a.prev[--b],a.prev[b]=d>=g?d-g:0;while(--c);e+=g}if(0===a.strm.avail_in)break;if(c=k(a.strm,a.window,a.strstart+a.lookahead,e),a.lookahead+=c,a.lookahead+a.insert>=ja)for(f=a.strstart-a.insert,a.ins_h=a.window[f],a.ins_h=(a.ins_h<<a.hash_shift^a.window[f+1])&a.hash_mask;a.insert&&(a.ins_h=(a.ins_h<<a.hash_shift^a.window[f+ja-1])&a.hash_mask,a.prev[f&a.w_mask]=a.head[a.ins_h],a.head[a.ins_h]=f,f++,a.insert--,!(a.lookahead+a.insert<ja)););}while(a.lookahead<la&&0!==a.strm.avail_in)}function n(a,b){var c=65535;for(c>a.pending_buf_size-5&&(c=a.pending_buf_size-5);;){if(a.lookahead<=1){if(m(a),0===a.lookahead&&b===J)return ua;if(0===a.lookahead)break}a.strstart+=a.lookahead,a.lookahead=0;var d=a.block_start+c;if((0===a.strstart||a.strstart>=d)&&(a.lookahead=a.strstart-d,a.strstart=d,h(a,!1),0===a.strm.avail_out))return ua;if(a.strstart-a.block_start>=a.w_size-la&&(h(a,!1),0===a.strm.avail_out))return ua}return a.insert=0,b===M?(h(a,!0),0===a.strm.avail_out?wa:xa):a.strstart>a.block_start&&(h(a,!1),0===a.strm.avail_out)?ua:ua}function o(a,b){for(var c,d;;){if(a.lookahead<la){if(m(a),a.lookahead<la&&b===J)return ua;if(0===a.lookahead)break}if(c=0,a.lookahead>=ja&&(a.ins_h=(a.ins_h<<a.hash_shift^a.window[a.strstart+ja-1])&a.hash_mask,c=a.prev[a.strstart&a.w_mask]=a.head[a.ins_h],a.head[a.ins_h]=a.strstart),0!==c&&a.strstart-c<=a.w_size-la&&(a.match_length=l(a,c)),a.match_length>=ja)if(d=F._tr_tally(a,a.strstart-a.match_start,a.match_length-ja),a.lookahead-=a.match_length,a.match_length<=a.max_lazy_match&&a.lookahead>=ja){a.match_length--;do a.strstart++,a.ins_h=(a.ins_h<<a.hash_shift^a.window[a.strstart+ja-1])&a.hash_mask,c=a.prev[a.strstart&a.w_mask]=a.head[a.ins_h],a.head[a.ins_h]=a.strstart;while(0!==--a.match_length);a.strstart++}else a.strstart+=a.match_length,a.match_length=0,a.ins_h=a.window[a.strstart],a.ins_h=(a.ins_h<<a.hash_shift^a.window[a.strstart+1])&a.hash_mask;else d=F._tr_tally(a,0,a.window[a.strstart]),a.lookahead--,a.strstart++;if(d&&(h(a,!1),0===a.strm.avail_out))return ua}return a.insert=a.strstart<ja-1?a.strstart:ja-1,b===M?(h(a,!0),0===a.strm.avail_out?wa:xa):a.last_lit&&(h(a,!1),0===a.strm.avail_out)?ua:va}function p(a,b){for(var c,d,e;;){if(a.lookahead<la){if(m(a),a.lookahead<la&&b===J)return ua;if(0===a.lookahead)break}if(c=0,a.lookahead>=ja&&(a.ins_h=(a.ins_h<<a.hash_shift^a.window[a.strstart+ja-1])&a.hash_mask,c=a.prev[a.strstart&a.w_mask]=a.head[a.ins_h],a.head[a.ins_h]=a.strstart),a.prev_length=a.match_length,a.prev_match=a.match_start,a.match_length=ja-1,0!==c&&a.prev_length<a.max_lazy_match&&a.strstart-c<=a.w_size-la&&(a.match_length=l(a,c),\na.match_length<=5&&(a.strategy===U||a.match_length===ja&&a.strstart-a.match_start>4096)&&(a.match_length=ja-1)),a.prev_length>=ja&&a.match_length<=a.prev_length){e=a.strstart+a.lookahead-ja,d=F._tr_tally(a,a.strstart-1-a.prev_match,a.prev_length-ja),a.lookahead-=a.prev_length-1,a.prev_length-=2;do++a.strstart<=e&&(a.ins_h=(a.ins_h<<a.hash_shift^a.window[a.strstart+ja-1])&a.hash_mask,c=a.prev[a.strstart&a.w_mask]=a.head[a.ins_h],a.head[a.ins_h]=a.strstart);while(0!==--a.prev_length);if(a.match_available=0,a.match_length=ja-1,a.strstart++,d&&(h(a,!1),0===a.strm.avail_out))return ua}else if(a.match_available){if(d=F._tr_tally(a,0,a.window[a.strstart-1]),d&&h(a,!1),a.strstart++,a.lookahead--,0===a.strm.avail_out)return ua}else a.match_available=1,a.strstart++,a.lookahead--}return a.match_available&&(d=F._tr_tally(a,0,a.window[a.strstart-1]),a.match_available=0),a.insert=a.strstart<ja-1?a.strstart:ja-1,b===M?(h(a,!0),0===a.strm.avail_out?wa:xa):a.last_lit&&(h(a,!1),0===a.strm.avail_out)?ua:va}function q(a,b){for(var c,d,e,f,g=a.window;;){if(a.lookahead<=ka){if(m(a),a.lookahead<=ka&&b===J)return ua;if(0===a.lookahead)break}if(a.match_length=0,a.lookahead>=ja&&a.strstart>0&&(e=a.strstart-1,d=g[e],d===g[++e]&&d===g[++e]&&d===g[++e])){f=a.strstart+ka;do;while(d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&e<f);a.match_length=ka-(f-e),a.match_length>a.lookahead&&(a.match_length=a.lookahead)}if(a.match_length>=ja?(c=F._tr_tally(a,1,a.match_length-ja),a.lookahead-=a.match_length,a.strstart+=a.match_length,a.match_length=0):(c=F._tr_tally(a,0,a.window[a.strstart]),a.lookahead--,a.strstart++),c&&(h(a,!1),0===a.strm.avail_out))return ua}return a.insert=0,b===M?(h(a,!0),0===a.strm.avail_out?wa:xa):a.last_lit&&(h(a,!1),0===a.strm.avail_out)?ua:va}function r(a,b){for(var c;;){if(0===a.lookahead&&(m(a),0===a.lookahead)){if(b===J)return ua;break}if(a.match_length=0,c=F._tr_tally(a,0,a.window[a.strstart]),a.lookahead--,a.strstart++,c&&(h(a,!1),0===a.strm.avail_out))return ua}return a.insert=0,b===M?(h(a,!0),0===a.strm.avail_out?wa:xa):a.last_lit&&(h(a,!1),0===a.strm.avail_out)?ua:va}function s(a,b,c,d,e){this.good_length=a,this.max_lazy=b,this.nice_length=c,this.max_chain=d,this.func=e}function t(a){a.window_size=2*a.w_size,f(a.head),a.max_lazy_match=D[a.level].max_lazy,a.good_match=D[a.level].good_length,a.nice_match=D[a.level].nice_length,a.max_chain_length=D[a.level].max_chain,a.strstart=0,a.block_start=0,a.lookahead=0,a.insert=0,a.match_length=a.prev_length=ja-1,a.match_available=0,a.ins_h=0}function u(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=$,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new E.Buf16(2*ha),this.dyn_dtree=new E.Buf16(2*(2*fa+1)),this.bl_tree=new E.Buf16(2*(2*ga+1)),f(this.dyn_ltree),f(this.dyn_dtree),f(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new E.Buf16(ia+1),this.heap=new E.Buf16(2*ea+1),f(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new E.Buf16(2*ea+1),f(this.depth),this.l_buf=0,this.lit_bufsize=0,this.last_lit=0,this.d_buf=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}function v(a){var b;return a&&a.state?(a.total_in=a.total_out=0,a.data_type=Z,b=a.state,b.pending=0,b.pending_out=0,b.wrap<0&&(b.wrap=-b.wrap),b.status=b.wrap?na:sa,a.adler=2===b.wrap?0:1,b.last_flush=J,F._tr_init(b),O):d(a,Q)}function w(a){var b=v(a);return b===O&&t(a.state),b}function x(a,b){return a&&a.state?2!==a.state.wrap?Q:(a.state.gzhead=b,O):Q}function y(a,b,c,e,f,g){if(!a)return Q;var h=1;if(b===T&&(b=6),e<0?(h=0,e=-e):e>15&&(h=2,e-=16),f<1||f>_||c!==$||e<8||e>15||b<0||b>9||g<0||g>X)return d(a,Q);8===e&&(e=9);var i=new u;return a.state=i,i.strm=a,i.wrap=h,i.gzhead=null,i.w_bits=e,i.w_size=1<<i.w_bits,i.w_mask=i.w_size-1,i.hash_bits=f+7,i.hash_size=1<<i.hash_bits,i.hash_mask=i.hash_size-1,i.hash_shift=~~((i.hash_bits+ja-1)/ja),i.window=new E.Buf8(2*i.w_size),i.head=new E.Buf16(i.hash_size),i.prev=new E.Buf16(i.w_size),i.lit_bufsize=1<<f+6,i.pending_buf_size=4*i.lit_bufsize,i.pending_buf=new E.Buf8(i.pending_buf_size),i.d_buf=1*i.lit_bufsize,i.l_buf=3*i.lit_bufsize,i.level=b,i.strategy=g,i.method=c,w(a)}function z(a,b){return y(a,b,$,aa,ba,Y)}function A(a,b){var c,h,k,l;if(!a||!a.state||b>N||b<0)return a?d(a,Q):Q;if(h=a.state,!a.output||!a.input&&0!==a.avail_in||h.status===ta&&b!==M)return d(a,0===a.avail_out?S:Q);if(h.strm=a,c=h.last_flush,h.last_flush=b,h.status===na)if(2===h.wrap)a.adler=0,i(h,31),i(h,139),i(h,8),h.gzhead?(i(h,(h.gzhead.text?1:0)+(h.gzhead.hcrc?2:0)+(h.gzhead.extra?4:0)+(h.gzhead.name?8:0)+(h.gzhead.comment?16:0)),i(h,255&h.gzhead.time),i(h,h.gzhead.time>>8&255),i(h,h.gzhead.time>>16&255),i(h,h.gzhead.time>>24&255),i(h,9===h.level?2:h.strategy>=V||h.level<2?4:0),i(h,255&h.gzhead.os),h.gzhead.extra&&h.gzhead.extra.length&&(i(h,255&h.gzhead.extra.length),i(h,h.gzhead.extra.length>>8&255)),h.gzhead.hcrc&&(a.adler=H(a.adler,h.pending_buf,h.pending,0)),h.gzindex=0,h.status=oa):(i(h,0),i(h,0),i(h,0),i(h,0),i(h,0),i(h,9===h.level?2:h.strategy>=V||h.level<2?4:0),i(h,ya),h.status=sa);else{var m=$+(h.w_bits-8<<4)<<8,n=-1;n=h.strategy>=V||h.level<2?0:h.level<6?1:6===h.level?2:3,m|=n<<6,0!==h.strstart&&(m|=ma),m+=31-m%31,h.status=sa,j(h,m),0!==h.strstart&&(j(h,a.adler>>>16),j(h,65535&a.adler)),a.adler=1}if(h.status===oa)if(h.gzhead.extra){for(k=h.pending;h.gzindex<(65535&h.gzhead.extra.length)&&(h.pending!==h.pending_buf_size||(h.gzhead.hcrc&&h.pending>k&&(a.adler=H(a.adler,h.pending_buf,h.pending-k,k)),g(a),k=h.pending,h.pending!==h.pending_buf_size));)i(h,255&h.gzhead.extra[h.gzindex]),h.gzindex++;h.gzhead.hcrc&&h.pending>k&&(a.adler=H(a.adler,h.pending_buf,h.pending-k,k)),h.gzindex===h.gzhead.extra.length&&(h.gzindex=0,h.status=pa)}else h.status=pa;if(h.status===pa)if(h.gzhead.name){k=h.pending;do{if(h.pending===h.pending_buf_size&&(h.gzhead.hcrc&&h.pending>k&&(a.adler=H(a.adler,h.pending_buf,h.pending-k,k)),g(a),k=h.pending,h.pending===h.pending_buf_size)){l=1;break}l=h.gzindex<h.gzhead.name.length?255&h.gzhead.name.charCodeAt(h.gzindex++):0,i(h,l)}while(0!==l);h.gzhead.hcrc&&h.pending>k&&(a.adler=H(a.adler,h.pending_buf,h.pending-k,k)),0===l&&(h.gzindex=0,h.status=qa)}else h.status=qa;if(h.status===qa)if(h.gzhead.comment){k=h.pending;do{if(h.pending===h.pending_buf_size&&(h.gzhead.hcrc&&h.pending>k&&(a.adler=H(a.adler,h.pending_buf,h.pending-k,k)),g(a),k=h.pending,h.pending===h.pending_buf_size)){l=1;break}l=h.gzindex<h.gzhead.comment.length?255&h.gzhead.comment.charCodeAt(h.gzindex++):0,i(h,l)}while(0!==l);h.gzhead.hcrc&&h.pending>k&&(a.adler=H(a.adler,h.pending_buf,h.pending-k,k)),0===l&&(h.status=ra)}else h.status=ra;if(h.status===ra&&(h.gzhead.hcrc?(h.pending+2>h.pending_buf_size&&g(a),h.pending+2<=h.pending_buf_size&&(i(h,255&a.adler),i(h,a.adler>>8&255),a.adler=0,h.status=sa)):h.status=sa),0!==h.pending){if(g(a),0===a.avail_out)return h.last_flush=-1,O}else if(0===a.avail_in&&e(b)<=e(c)&&b!==M)return d(a,S);if(h.status===ta&&0!==a.avail_in)return d(a,S);if(0!==a.avail_in||0!==h.lookahead||b!==J&&h.status!==ta){var o=h.strategy===V?r(h,b):h.strategy===W?q(h,b):D[h.level].func(h,b);if(o!==wa&&o!==xa||(h.status=ta),o===ua||o===wa)return 0===a.avail_out&&(h.last_flush=-1),O;if(o===va&&(b===K?F._tr_align(h):b!==N&&(F._tr_stored_block(h,0,0,!1),b===L&&(f(h.head),0===h.lookahead&&(h.strstart=0,h.block_start=0,h.insert=0))),g(a),0===a.avail_out))return h.last_flush=-1,O}return b!==M?O:h.wrap<=0?P:(2===h.wrap?(i(h,255&a.adler),i(h,a.adler>>8&255),i(h,a.adler>>16&255),i(h,a.adler>>24&255),i(h,255&a.total_in),i(h,a.total_in>>8&255),i(h,a.total_in>>16&255),i(h,a.total_in>>24&255)):(j(h,a.adler>>>16),j(h,65535&a.adler)),g(a),h.wrap>0&&(h.wrap=-h.wrap),0!==h.pending?O:P)}function B(a){var b;return a&&a.state?(b=a.state.status,b!==na&&b!==oa&&b!==pa&&b!==qa&&b!==ra&&b!==sa&&b!==ta?d(a,Q):(a.state=null,b===sa?d(a,R):O)):Q}function C(a,b){var c,d,e,g,h,i,j,k,l=b.length;if(!a||!a.state)return Q;if(c=a.state,g=c.wrap,2===g||1===g&&c.status!==na||c.lookahead)return Q;for(1===g&&(a.adler=G(a.adler,b,l,0)),c.wrap=0,l>=c.w_size&&(0===g&&(f(c.head),c.strstart=0,c.block_start=0,c.insert=0),k=new E.Buf8(c.w_size),E.arraySet(k,b,l-c.w_size,c.w_size,0),b=k,l=c.w_size),h=a.avail_in,i=a.next_in,j=a.input,a.avail_in=l,a.next_in=0,a.input=b,m(c);c.lookahead>=ja;){d=c.strstart,e=c.lookahead-(ja-1);do c.ins_h=(c.ins_h<<c.hash_shift^c.window[d+ja-1])&c.hash_mask,c.prev[d&c.w_mask]=c.head[c.ins_h],c.head[c.ins_h]=d,d++;while(--e);c.strstart=d,c.lookahead=ja-1,m(c)}return c.strstart+=c.lookahead,c.block_start=c.strstart,c.insert=c.lookahead,c.lookahead=0,c.match_length=c.prev_length=ja-1,c.match_available=0,a.next_in=i,a.input=j,a.avail_in=h,c.wrap=g,O}var D,E=a(\"../utils/common\"),F=a(\"./trees\"),G=a(\"./adler32\"),H=a(\"./crc32\"),I=a(\"./messages\"),J=0,K=1,L=3,M=4,N=5,O=0,P=1,Q=-2,R=-3,S=-5,T=-1,U=1,V=2,W=3,X=4,Y=0,Z=2,$=8,_=9,aa=15,ba=8,ca=29,da=256,ea=da+1+ca,fa=30,ga=19,ha=2*ea+1,ia=15,ja=3,ka=258,la=ka+ja+1,ma=32,na=42,oa=69,pa=73,qa=91,ra=103,sa=113,ta=666,ua=1,va=2,wa=3,xa=4,ya=3;D=[new s(0,0,0,0,n),new s(4,4,8,4,o),new s(4,5,16,8,o),new s(4,6,32,32,o),new s(4,4,16,16,p),new s(8,16,32,32,p),new s(8,16,128,128,p),new s(8,32,128,256,p),new s(32,128,258,1024,p),new s(32,258,258,4096,p)],c.deflateInit=z,c.deflateInit2=y,c.deflateReset=w,c.deflateResetKeep=v,c.deflateSetHeader=x,c.deflate=A,c.deflateEnd=B,c.deflateSetDictionary=C,c.deflateInfo=\"pako deflate (from Nodeca project)\"},{\"../utils/common\":41,\"./adler32\":43,\"./crc32\":45,\"./messages\":51,\"./trees\":52}],47:[function(a,b,c){\"use strict\";function d(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name=\"\",this.comment=\"\",this.hcrc=0,this.done=!1}b.exports=d},{}],48:[function(a,b,c){\"use strict\";var d=30,e=12;b.exports=function(a,b){var c,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C;c=a.state,f=a.next_in,B=a.input,g=f+(a.avail_in-5),h=a.next_out,C=a.output,i=h-(b-a.avail_out),j=h+(a.avail_out-257),k=c.dmax,l=c.wsize,m=c.whave,n=c.wnext,o=c.window,p=c.hold,q=c.bits,r=c.lencode,s=c.distcode,t=(1<<c.lenbits)-1,u=(1<<c.distbits)-1;a:do{q<15&&(p+=B[f++]<<q,q+=8,p+=B[f++]<<q,q+=8),v=r[p&t];b:for(;;){if(w=v>>>24,p>>>=w,q-=w,w=v>>>16&255,0===w)C[h++]=65535&v;else{if(!(16&w)){if(0===(64&w)){v=r[(65535&v)+(p&(1<<w)-1)];continue b}if(32&w){c.mode=e;break a}a.msg=\"invalid literal/length code\",c.mode=d;break a}x=65535&v,w&=15,w&&(q<w&&(p+=B[f++]<<q,q+=8),x+=p&(1<<w)-1,p>>>=w,q-=w),q<15&&(p+=B[f++]<<q,q+=8,p+=B[f++]<<q,q+=8),v=s[p&u];c:for(;;){if(w=v>>>24,p>>>=w,q-=w,w=v>>>16&255,!(16&w)){if(0===(64&w)){v=s[(65535&v)+(p&(1<<w)-1)];continue c}a.msg=\"invalid distance code\",c.mode=d;break a}if(y=65535&v,w&=15,q<w&&(p+=B[f++]<<q,q+=8,q<w&&(p+=B[f++]<<q,q+=8)),y+=p&(1<<w)-1,y>k){a.msg=\"invalid distance too far back\",c.mode=d;break a}if(p>>>=w,q-=w,w=h-i,y>w){if(w=y-w,w>m&&c.sane){a.msg=\"invalid distance too far back\",c.mode=d;break a}if(z=0,A=o,0===n){if(z+=l-w,w<x){x-=w;do C[h++]=o[z++];while(--w);z=h-y,A=C}}else if(n<w){if(z+=l+n-w,w-=n,w<x){x-=w;do C[h++]=o[z++];while(--w);if(z=0,n<x){w=n,x-=w;do C[h++]=o[z++];while(--w);z=h-y,A=C}}}else if(z+=n-w,w<x){x-=w;do C[h++]=o[z++];while(--w);z=h-y,A=C}for(;x>2;)C[h++]=A[z++],C[h++]=A[z++],C[h++]=A[z++],x-=3;x&&(C[h++]=A[z++],x>1&&(C[h++]=A[z++]))}else{z=h-y;do C[h++]=C[z++],C[h++]=C[z++],C[h++]=C[z++],x-=3;while(x>2);x&&(C[h++]=C[z++],x>1&&(C[h++]=C[z++]))}break}}break}}while(f<g&&h<j);x=q>>3,f-=x,q-=x<<3,p&=(1<<q)-1,a.next_in=f,a.next_out=h,a.avail_in=f<g?5+(g-f):5-(f-g),a.avail_out=h<j?257+(j-h):257-(h-j),c.hold=p,c.bits=q}},{}],49:[function(a,b,c){\"use strict\";function d(a){return(a>>>24&255)+(a>>>8&65280)+((65280&a)<<8)+((255&a)<<24)}function e(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new s.Buf16(320),this.work=new s.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function f(a){var b;return a&&a.state?(b=a.state,a.total_in=a.total_out=b.total=0,a.msg=\"\",b.wrap&&(a.adler=1&b.wrap),b.mode=L,b.last=0,b.havedict=0,b.dmax=32768,b.head=null,b.hold=0,b.bits=0,b.lencode=b.lendyn=new s.Buf32(pa),b.distcode=b.distdyn=new s.Buf32(qa),b.sane=1,b.back=-1,D):G}function g(a){var b;return a&&a.state?(b=a.state,b.wsize=0,b.whave=0,b.wnext=0,f(a)):G}function h(a,b){var c,d;return a&&a.state?(d=a.state,b<0?(c=0,b=-b):(c=(b>>4)+1,b<48&&(b&=15)),b&&(b<8||b>15)?G:(null!==d.window&&d.wbits!==b&&(d.window=null),d.wrap=c,d.wbits=b,g(a))):G}function i(a,b){var c,d;return a?(d=new e,a.state=d,d.window=null,c=h(a,b),c!==D&&(a.state=null),c):G}function j(a){return i(a,sa)}function k(a){if(ta){var b;for(q=new s.Buf32(512),r=new s.Buf32(32),b=0;b<144;)a.lens[b++]=8;for(;b<256;)a.lens[b++]=9;for(;b<280;)a.lens[b++]=7;for(;b<288;)a.lens[b++]=8;for(w(y,a.lens,0,288,q,0,a.work,{bits:9}),b=0;b<32;)a.lens[b++]=5;w(z,a.lens,0,32,r,0,a.work,{bits:5}),ta=!1}a.lencode=q,a.lenbits=9,a.distcode=r,a.distbits=5}function l(a,b,c,d){var e,f=a.state;return null===f.window&&(f.wsize=1<<f.wbits,f.wnext=0,f.whave=0,f.window=new s.Buf8(f.wsize)),d>=f.wsize?(s.arraySet(f.window,b,c-f.wsize,f.wsize,0),f.wnext=0,f.whave=f.wsize):(e=f.wsize-f.wnext,e>d&&(e=d),s.arraySet(f.window,b,c-d,e,f.wnext),d-=e,d?(s.arraySet(f.window,b,c-d,d,0),f.wnext=d,f.whave=f.wsize):(f.wnext+=e,f.wnext===f.wsize&&(f.wnext=0),f.whave<f.wsize&&(f.whave+=e))),0}function m(a,b){var c,e,f,g,h,i,j,m,n,o,p,q,r,pa,qa,ra,sa,ta,ua,va,wa,xa,ya,za,Aa=0,Ba=new s.Buf8(4),Ca=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];if(!a||!a.state||!a.output||!a.input&&0!==a.avail_in)return G;c=a.state,c.mode===W&&(c.mode=X),h=a.next_out,f=a.output,j=a.avail_out,g=a.next_in,e=a.input,i=a.avail_in,m=c.hold,n=c.bits,o=i,p=j,xa=D;a:for(;;)switch(c.mode){case L:if(0===c.wrap){c.mode=X;break}for(;n<16;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(2&c.wrap&&35615===m){c.check=0,Ba[0]=255&m,Ba[1]=m>>>8&255,c.check=u(c.check,Ba,2,0),m=0,n=0,c.mode=M;break}if(c.flags=0,c.head&&(c.head.done=!1),!(1&c.wrap)||(((255&m)<<8)+(m>>8))%31){a.msg=\"incorrect header check\",c.mode=ma;break}if((15&m)!==K){a.msg=\"unknown compression method\",c.mode=ma;break}if(m>>>=4,n-=4,wa=(15&m)+8,0===c.wbits)c.wbits=wa;else if(wa>c.wbits){a.msg=\"invalid window size\",c.mode=ma;break}c.dmax=1<<wa,a.adler=c.check=1,c.mode=512&m?U:W,m=0,n=0;break;case M:for(;n<16;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(c.flags=m,(255&c.flags)!==K){a.msg=\"unknown compression method\",c.mode=ma;break}if(57344&c.flags){a.msg=\"unknown header flags set\",c.mode=ma;break}c.head&&(c.head.text=m>>8&1),512&c.flags&&(Ba[0]=255&m,Ba[1]=m>>>8&255,c.check=u(c.check,Ba,2,0)),m=0,n=0,c.mode=N;case N:for(;n<32;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}c.head&&(c.head.time=m),512&c.flags&&(Ba[0]=255&m,Ba[1]=m>>>8&255,Ba[2]=m>>>16&255,Ba[3]=m>>>24&255,c.check=u(c.check,Ba,4,0)),m=0,n=0,c.mode=O;case O:for(;n<16;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}c.head&&(c.head.xflags=255&m,c.head.os=m>>8),512&c.flags&&(Ba[0]=255&m,Ba[1]=m>>>8&255,c.check=u(c.check,Ba,2,0)),m=0,n=0,c.mode=P;case P:if(1024&c.flags){for(;n<16;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}c.length=m,c.head&&(c.head.extra_len=m),512&c.flags&&(Ba[0]=255&m,Ba[1]=m>>>8&255,c.check=u(c.check,Ba,2,0)),m=0,n=0}else c.head&&(c.head.extra=null);c.mode=Q;case Q:if(1024&c.flags&&(q=c.length,q>i&&(q=i),q&&(c.head&&(wa=c.head.extra_len-c.length,c.head.extra||(c.head.extra=new Array(c.head.extra_len)),s.arraySet(c.head.extra,e,g,q,wa)),512&c.flags&&(c.check=u(c.check,e,q,g)),i-=q,g+=q,c.length-=q),c.length))break a;c.length=0,c.mode=R;case R:if(2048&c.flags){if(0===i)break a;q=0;do wa=e[g+q++],c.head&&wa&&c.length<65536&&(c.head.name+=String.fromCharCode(wa));while(wa&&q<i);if(512&c.flags&&(c.check=u(c.check,e,q,g)),i-=q,g+=q,wa)break a}else c.head&&(c.head.name=null);c.length=0,c.mode=S;case S:if(4096&c.flags){if(0===i)break a;q=0;do wa=e[g+q++],c.head&&wa&&c.length<65536&&(c.head.comment+=String.fromCharCode(wa));while(wa&&q<i);if(512&c.flags&&(c.check=u(c.check,e,q,g)),i-=q,g+=q,wa)break a}else c.head&&(c.head.comment=null);c.mode=T;case T:if(512&c.flags){for(;n<16;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(m!==(65535&c.check)){a.msg=\"header crc mismatch\",c.mode=ma;break}m=0,n=0}c.head&&(c.head.hcrc=c.flags>>9&1,c.head.done=!0),a.adler=c.check=0,c.mode=W;break;case U:for(;n<32;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}a.adler=c.check=d(m),m=0,n=0,c.mode=V;case V:if(0===c.havedict)return a.next_out=h,a.avail_out=j,a.next_in=g,a.avail_in=i,c.hold=m,c.bits=n,F;a.adler=c.check=1,c.mode=W;case W:if(b===B||b===C)break a;case X:if(c.last){m>>>=7&n,n-=7&n,c.mode=ja;break}for(;n<3;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}switch(c.last=1&m,m>>>=1,n-=1,3&m){case 0:c.mode=Y;break;case 1:if(k(c),c.mode=ca,b===C){m>>>=2,n-=2;break a}break;case 2:c.mode=_;break;case 3:a.msg=\"invalid block type\",c.mode=ma}m>>>=2,n-=2;break;case Y:for(m>>>=7&n,n-=7&n;n<32;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if((65535&m)!==(m>>>16^65535)){a.msg=\"invalid stored block lengths\",c.mode=ma;break}if(c.length=65535&m,m=0,n=0,c.mode=Z,b===C)break a;case Z:c.mode=$;case $:if(q=c.length){if(q>i&&(q=i),q>j&&(q=j),0===q)break a;s.arraySet(f,e,g,q,h),i-=q,g+=q,j-=q,h+=q,c.length-=q;break}c.mode=W;break;case _:for(;n<14;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(c.nlen=(31&m)+257,m>>>=5,n-=5,c.ndist=(31&m)+1,m>>>=5,n-=5,c.ncode=(15&m)+4,m>>>=4,n-=4,c.nlen>286||c.ndist>30){a.msg=\"too many length or distance symbols\",c.mode=ma;break}c.have=0,c.mode=aa;case aa:for(;c.have<c.ncode;){for(;n<3;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}c.lens[Ca[c.have++]]=7&m,m>>>=3,n-=3}for(;c.have<19;)c.lens[Ca[c.have++]]=0;if(c.lencode=c.lendyn,c.lenbits=7,ya={bits:c.lenbits},xa=w(x,c.lens,0,19,c.lencode,0,c.work,ya),c.lenbits=ya.bits,xa){a.msg=\"invalid code lengths set\",c.mode=ma;break}c.have=0,c.mode=ba;case ba:for(;c.have<c.nlen+c.ndist;){for(;Aa=c.lencode[m&(1<<c.lenbits)-1],qa=Aa>>>24,ra=Aa>>>16&255,sa=65535&Aa,!(qa<=n);){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(sa<16)m>>>=qa,n-=qa,c.lens[c.have++]=sa;else{if(16===sa){for(za=qa+2;n<za;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(m>>>=qa,n-=qa,0===c.have){a.msg=\"invalid bit length repeat\",c.mode=ma;break}wa=c.lens[c.have-1],q=3+(3&m),m>>>=2,n-=2}else if(17===sa){for(za=qa+3;n<za;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}m>>>=qa,n-=qa,wa=0,q=3+(7&m),m>>>=3,n-=3}else{for(za=qa+7;n<za;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}m>>>=qa,n-=qa,wa=0,q=11+(127&m),m>>>=7,n-=7}if(c.have+q>c.nlen+c.ndist){a.msg=\"invalid bit length repeat\",c.mode=ma;break}for(;q--;)c.lens[c.have++]=wa}}if(c.mode===ma)break;if(0===c.lens[256]){a.msg=\"invalid code -- missing end-of-block\",c.mode=ma;break}if(c.lenbits=9,ya={bits:c.lenbits},xa=w(y,c.lens,0,c.nlen,c.lencode,0,c.work,ya),c.lenbits=ya.bits,xa){a.msg=\"invalid literal/lengths set\",c.mode=ma;break}if(c.distbits=6,c.distcode=c.distdyn,ya={bits:c.distbits},xa=w(z,c.lens,c.nlen,c.ndist,c.distcode,0,c.work,ya),c.distbits=ya.bits,xa){a.msg=\"invalid distances set\",c.mode=ma;break}if(c.mode=ca,b===C)break a;case ca:c.mode=da;case da:if(i>=6&&j>=258){a.next_out=h,a.avail_out=j,a.next_in=g,a.avail_in=i,c.hold=m,c.bits=n,v(a,p),h=a.next_out,f=a.output,j=a.avail_out,g=a.next_in,e=a.input,i=a.avail_in,m=c.hold,n=c.bits,c.mode===W&&(c.back=-1);break}for(c.back=0;Aa=c.lencode[m&(1<<c.lenbits)-1],qa=Aa>>>24,ra=Aa>>>16&255,sa=65535&Aa,!(qa<=n);){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(ra&&0===(240&ra)){for(ta=qa,ua=ra,va=sa;Aa=c.lencode[va+((m&(1<<ta+ua)-1)>>ta)],qa=Aa>>>24,ra=Aa>>>16&255,sa=65535&Aa,!(ta+qa<=n);){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}m>>>=ta,n-=ta,c.back+=ta}if(m>>>=qa,n-=qa,c.back+=qa,c.length=sa,0===ra){c.mode=ia;break}if(32&ra){c.back=-1,c.mode=W;break}if(64&ra){a.msg=\"invalid literal/length code\",c.mode=ma;break}c.extra=15&ra,c.mode=ea;case ea:if(c.extra){for(za=c.extra;n<za;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}c.length+=m&(1<<c.extra)-1,m>>>=c.extra,n-=c.extra,c.back+=c.extra}c.was=c.length,c.mode=fa;case fa:for(;Aa=c.distcode[m&(1<<c.distbits)-1],qa=Aa>>>24,ra=Aa>>>16&255,sa=65535&Aa,!(qa<=n);){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(0===(240&ra)){for(ta=qa,ua=ra,va=sa;Aa=c.distcode[va+((m&(1<<ta+ua)-1)>>ta)],qa=Aa>>>24,ra=Aa>>>16&255,sa=65535&Aa,!(ta+qa<=n);){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}m>>>=ta,n-=ta,c.back+=ta}if(m>>>=qa,n-=qa,c.back+=qa,64&ra){a.msg=\"invalid distance code\",c.mode=ma;break}c.offset=sa,c.extra=15&ra,c.mode=ga;case ga:if(c.extra){for(za=c.extra;n<za;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}c.offset+=m&(1<<c.extra)-1,m>>>=c.extra,n-=c.extra,c.back+=c.extra}if(c.offset>c.dmax){a.msg=\"invalid distance too far back\",c.mode=ma;break}c.mode=ha;case ha:if(0===j)break a;if(q=p-j,c.offset>q){if(q=c.offset-q,q>c.whave&&c.sane){a.msg=\"invalid distance too far back\",c.mode=ma;break}q>c.wnext?(q-=c.wnext,r=c.wsize-q):r=c.wnext-q,q>c.length&&(q=c.length),pa=c.window}else pa=f,r=h-c.offset,q=c.length;q>j&&(q=j),j-=q,c.length-=q;do f[h++]=pa[r++];while(--q);0===c.length&&(c.mode=da);break;case ia:if(0===j)break a;f[h++]=c.length,j--,c.mode=da;break;case ja:if(c.wrap){for(;n<32;){if(0===i)break a;i--,m|=e[g++]<<n,n+=8}if(p-=j,a.total_out+=p,c.total+=p,p&&(a.adler=c.check=c.flags?u(c.check,f,p,h-p):t(c.check,f,p,h-p)),p=j,(c.flags?m:d(m))!==c.check){a.msg=\"incorrect data check\",c.mode=ma;break}m=0,n=0}c.mode=ka;case ka:if(c.wrap&&c.flags){for(;n<32;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(m!==(4294967295&c.total)){a.msg=\"incorrect length check\",c.mode=ma;break}m=0,n=0}c.mode=la;case la:xa=E;break a;case ma:xa=H;break a;case na:return I;case oa:default:return G}return a.next_out=h,a.avail_out=j,a.next_in=g,a.avail_in=i,c.hold=m,c.bits=n,(c.wsize||p!==a.avail_out&&c.mode<ma&&(c.mode<ja||b!==A))&&l(a,a.output,a.next_out,p-a.avail_out)?(c.mode=na,I):(o-=a.avail_in,p-=a.avail_out,a.total_in+=o,a.total_out+=p,c.total+=p,c.wrap&&p&&(a.adler=c.check=c.flags?u(c.check,f,p,a.next_out-p):t(c.check,f,p,a.next_out-p)),a.data_type=c.bits+(c.last?64:0)+(c.mode===W?128:0)+(c.mode===ca||c.mode===Z?256:0),(0===o&&0===p||b===A)&&xa===D&&(xa=J),xa)}function n(a){if(!a||!a.state)return G;var b=a.state;return b.window&&(b.window=null),a.state=null,D}function o(a,b){var c;return a&&a.state?(c=a.state,0===(2&c.wrap)?G:(c.head=b,b.done=!1,D)):G}function p(a,b){var c,d,e,f=b.length;return a&&a.state?(c=a.state,0!==c.wrap&&c.mode!==V?G:c.mode===V&&(d=1,d=t(d,b,f,0),d!==c.check)?H:(e=l(a,b,f,f))?(c.mode=na,I):(c.havedict=1,D)):G}var q,r,s=a(\"../utils/common\"),t=a(\"./adler32\"),u=a(\"./crc32\"),v=a(\"./inffast\"),w=a(\"./inftrees\"),x=0,y=1,z=2,A=4,B=5,C=6,D=0,E=1,F=2,G=-2,H=-3,I=-4,J=-5,K=8,L=1,M=2,N=3,O=4,P=5,Q=6,R=7,S=8,T=9,U=10,V=11,W=12,X=13,Y=14,Z=15,$=16,_=17,aa=18,ba=19,ca=20,da=21,ea=22,fa=23,ga=24,ha=25,ia=26,ja=27,ka=28,la=29,ma=30,na=31,oa=32,pa=852,qa=592,ra=15,sa=ra,ta=!0;c.inflateReset=g,c.inflateReset2=h,c.inflateResetKeep=f,c.inflateInit=j,c.inflateInit2=i,c.inflate=m,c.inflateEnd=n,c.inflateGetHeader=o,c.inflateSetDictionary=p,c.inflateInfo=\"pako inflate (from Nodeca project)\"},{\"../utils/common\":41,\"./adler32\":43,\"./crc32\":45,\"./inffast\":48,\"./inftrees\":50}],50:[function(a,b,c){\"use strict\";var d=a(\"../utils/common\"),e=15,f=852,g=592,h=0,i=1,j=2,k=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,0,0],l=[16,16,16,16,16,16,16,16,17,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,16,72,78],m=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0],n=[16,16,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,64,64];b.exports=function(a,b,c,o,p,q,r,s){var t,u,v,w,x,y,z,A,B,C=s.bits,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=null,O=0,P=new d.Buf16(e+1),Q=new d.Buf16(e+1),R=null,S=0;for(D=0;D<=e;D++)P[D]=0;for(E=0;E<o;E++)P[b[c+E]]++;for(H=C,G=e;G>=1&&0===P[G];G--);if(H>G&&(H=G),0===G)return p[q++]=20971520,p[q++]=20971520,s.bits=1,0;for(F=1;F<G&&0===P[F];F++);for(H<F&&(H=F),K=1,D=1;D<=e;D++)if(K<<=1,K-=P[D],K<0)return-1;if(K>0&&(a===h||1!==G))return-1;for(Q[1]=0,D=1;D<e;D++)Q[D+1]=Q[D]+P[D];for(E=0;E<o;E++)0!==b[c+E]&&(r[Q[b[c+E]]++]=E);if(a===h?(N=R=r,y=19):a===i?(N=k,O-=257,R=l,S-=257,y=256):(N=m,R=n,y=-1),M=0,E=0,D=F,x=q,I=H,J=0,v=-1,L=1<<H,w=L-1,a===i&&L>f||a===j&&L>g)return 1;for(;;){z=D-J,r[E]<y?(A=0,B=r[E]):r[E]>y?(A=R[S+r[E]],B=N[O+r[E]]):(A=96,B=0),t=1<<D-J,u=1<<I,F=u;do u-=t,p[x+(M>>J)+u]=z<<24|A<<16|B|0;while(0!==u);for(t=1<<D-1;M&t;)t>>=1;if(0!==t?(M&=t-1,M+=t):M=0,E++,0===--P[D]){if(D===G)break;D=b[c+r[E]]}if(D>H&&(M&w)!==v){for(0===J&&(J=H),x+=F,I=D-J,K=1<<I;I+J<G&&(K-=P[I+J],!(K<=0));)I++,K<<=1;if(L+=1<<I,a===i&&L>f||a===j&&L>g)return 1;v=M&w,p[v]=H<<24|I<<16|x-q|0}}return 0!==M&&(p[x+M]=D-J<<24|64<<16|0),s.bits=H,0}},{\"../utils/common\":41}],51:[function(a,b,c){\"use strict\";b.exports={2:\"need dictionary\",1:\"stream end\",0:\"\",\"-1\":\"file error\",\"-2\":\"stream error\",\"-3\":\"data error\",\"-4\":\"insufficient memory\",\"-5\":\"buffer error\",\"-6\":\"incompatible version\"}},{}],52:[function(a,b,c){\"use strict\";function d(a){for(var b=a.length;--b>=0;)a[b]=0}function e(a,b,c,d,e){this.static_tree=a,this.extra_bits=b,this.extra_base=c,this.elems=d,this.max_length=e,this.has_stree=a&&a.length}function f(a,b){this.dyn_tree=a,this.max_code=0,this.stat_desc=b}function g(a){return a<256?ia[a]:ia[256+(a>>>7)]}function h(a,b){a.pending_buf[a.pending++]=255&b,a.pending_buf[a.pending++]=b>>>8&255}function i(a,b,c){a.bi_valid>X-c?(a.bi_buf|=b<<a.bi_valid&65535,h(a,a.bi_buf),a.bi_buf=b>>X-a.bi_valid,a.bi_valid+=c-X):(a.bi_buf|=b<<a.bi_valid&65535,a.bi_valid+=c)}function j(a,b,c){i(a,c[2*b],c[2*b+1])}function k(a,b){var c=0;do c|=1&a,a>>>=1,c<<=1;while(--b>0);return c>>>1}function l(a){16===a.bi_valid?(h(a,a.bi_buf),a.bi_buf=0,a.bi_valid=0):a.bi_valid>=8&&(a.pending_buf[a.pending++]=255&a.bi_buf,a.bi_buf>>=8,a.bi_valid-=8)}function m(a,b){var c,d,e,f,g,h,i=b.dyn_tree,j=b.max_code,k=b.stat_desc.static_tree,l=b.stat_desc.has_stree,m=b.stat_desc.extra_bits,n=b.stat_desc.extra_base,o=b.stat_desc.max_length,p=0;for(f=0;f<=W;f++)a.bl_count[f]=0;for(i[2*a.heap[a.heap_max]+1]=0,c=a.heap_max+1;c<V;c++)d=a.heap[c],f=i[2*i[2*d+1]+1]+1,f>o&&(f=o,p++),i[2*d+1]=f,d>j||(a.bl_count[f]++,g=0,d>=n&&(g=m[d-n]),h=i[2*d],a.opt_len+=h*(f+g),l&&(a.static_len+=h*(k[2*d+1]+g)));if(0!==p){do{for(f=o-1;0===a.bl_count[f];)f--;a.bl_count[f]--,a.bl_count[f+1]+=2,a.bl_count[o]--,p-=2}while(p>0);for(f=o;0!==f;f--)for(d=a.bl_count[f];0!==d;)e=a.heap[--c],e>j||(i[2*e+1]!==f&&(a.opt_len+=(f-i[2*e+1])*i[2*e],i[2*e+1]=f),d--)}}function n(a,b,c){var d,e,f=new Array(W+1),g=0;for(d=1;d<=W;d++)f[d]=g=g+c[d-1]<<1;for(e=0;e<=b;e++){var h=a[2*e+1];0!==h&&(a[2*e]=k(f[h]++,h))}}function o(){var a,b,c,d,f,g=new Array(W+1);for(c=0,d=0;d<Q-1;d++)for(ka[d]=c,a=0;a<1<<ba[d];a++)ja[c++]=d;for(ja[c-1]=d,f=0,d=0;d<16;d++)for(la[d]=f,a=0;a<1<<ca[d];a++)ia[f++]=d;for(f>>=7;d<T;d++)for(la[d]=f<<7,a=0;a<1<<ca[d]-7;a++)ia[256+f++]=d;for(b=0;b<=W;b++)g[b]=0;for(a=0;a<=143;)ga[2*a+1]=8,a++,g[8]++;for(;a<=255;)ga[2*a+1]=9,a++,g[9]++;for(;a<=279;)ga[2*a+1]=7,a++,g[7]++;for(;a<=287;)ga[2*a+1]=8,a++,g[8]++;for(n(ga,S+1,g),a=0;a<T;a++)ha[2*a+1]=5,ha[2*a]=k(a,5);ma=new e(ga,ba,R+1,S,W),na=new e(ha,ca,0,T,W),oa=new e(new Array(0),da,0,U,Y)}function p(a){var b;for(b=0;b<S;b++)a.dyn_ltree[2*b]=0;for(b=0;b<T;b++)a.dyn_dtree[2*b]=0;for(b=0;b<U;b++)a.bl_tree[2*b]=0;a.dyn_ltree[2*Z]=1,a.opt_len=a.static_len=0,a.last_lit=a.matches=0}function q(a){a.bi_valid>8?h(a,a.bi_buf):a.bi_valid>0&&(a.pending_buf[a.pending++]=a.bi_buf),a.bi_buf=0,a.bi_valid=0}function r(a,b,c,d){q(a),d&&(h(a,c),h(a,~c)),G.arraySet(a.pending_buf,a.window,b,c,a.pending),a.pending+=c}function s(a,b,c,d){var e=2*b,f=2*c;return a[e]<a[f]||a[e]===a[f]&&d[b]<=d[c]}function t(a,b,c){for(var d=a.heap[c],e=c<<1;e<=a.heap_len&&(e<a.heap_len&&s(b,a.heap[e+1],a.heap[e],a.depth)&&e++,!s(b,d,a.heap[e],a.depth));)a.heap[c]=a.heap[e],c=e,e<<=1;a.heap[c]=d}function u(a,b,c){var d,e,f,h,k=0;if(0!==a.last_lit)do d=a.pending_buf[a.d_buf+2*k]<<8|a.pending_buf[a.d_buf+2*k+1],e=a.pending_buf[a.l_buf+k],k++,0===d?j(a,e,b):(f=ja[e],j(a,f+R+1,b),h=ba[f],0!==h&&(e-=ka[f],i(a,e,h)),d--,f=g(d),j(a,f,c),h=ca[f],0!==h&&(d-=la[f],i(a,d,h)));while(k<a.last_lit);j(a,Z,b)}function v(a,b){var c,d,e,f=b.dyn_tree,g=b.stat_desc.static_tree,h=b.stat_desc.has_stree,i=b.stat_desc.elems,j=-1;for(a.heap_len=0,a.heap_max=V,c=0;c<i;c++)0!==f[2*c]?(a.heap[++a.heap_len]=j=c,a.depth[c]=0):f[2*c+1]=0;for(;a.heap_len<2;)e=a.heap[++a.heap_len]=j<2?++j:0,f[2*e]=1,a.depth[e]=0,a.opt_len--,h&&(a.static_len-=g[2*e+1]);for(b.max_code=j,c=a.heap_len>>1;c>=1;c--)t(a,f,c);e=i;do c=a.heap[1],a.heap[1]=a.heap[a.heap_len--],t(a,f,1),d=a.heap[1],a.heap[--a.heap_max]=c,a.heap[--a.heap_max]=d,f[2*e]=f[2*c]+f[2*d],a.depth[e]=(a.depth[c]>=a.depth[d]?a.depth[c]:a.depth[d])+1,f[2*c+1]=f[2*d+1]=e,a.heap[1]=e++,t(a,f,1);while(a.heap_len>=2);a.heap[--a.heap_max]=a.heap[1],m(a,b),n(f,j,a.bl_count)}function w(a,b,c){var d,e,f=-1,g=b[1],h=0,i=7,j=4;for(0===g&&(i=138,j=3),b[2*(c+1)+1]=65535,d=0;d<=c;d++)e=g,g=b[2*(d+1)+1],++h<i&&e===g||(h<j?a.bl_tree[2*e]+=h:0!==e?(e!==f&&a.bl_tree[2*e]++,a.bl_tree[2*$]++):h<=10?a.bl_tree[2*_]++:a.bl_tree[2*aa]++,h=0,f=e,0===g?(i=138,j=3):e===g?(i=6,j=3):(i=7,j=4))}function x(a,b,c){var d,e,f=-1,g=b[1],h=0,k=7,l=4;for(0===g&&(k=138,l=3),d=0;d<=c;d++)if(e=g,g=b[2*(d+1)+1],!(++h<k&&e===g)){if(h<l){do j(a,e,a.bl_tree);while(0!==--h)}else 0!==e?(e!==f&&(j(a,e,a.bl_tree),h--),j(a,$,a.bl_tree),i(a,h-3,2)):h<=10?(j(a,_,a.bl_tree),i(a,h-3,3)):(j(a,aa,a.bl_tree),i(a,h-11,7));h=0,f=e,0===g?(k=138,l=3):e===g?(k=6,l=3):(k=7,l=4)}}function y(a){var b;for(w(a,a.dyn_ltree,a.l_desc.max_code),w(a,a.dyn_dtree,a.d_desc.max_code),v(a,a.bl_desc),b=U-1;b>=3&&0===a.bl_tree[2*ea[b]+1];b--);return a.opt_len+=3*(b+1)+5+5+4,b}function z(a,b,c,d){var e;for(i(a,b-257,5),i(a,c-1,5),i(a,d-4,4),e=0;e<d;e++)i(a,a.bl_tree[2*ea[e]+1],3);x(a,a.dyn_ltree,b-1),x(a,a.dyn_dtree,c-1)}function A(a){var b,c=4093624447;for(b=0;b<=31;b++,c>>>=1)if(1&c&&0!==a.dyn_ltree[2*b])return I;if(0!==a.dyn_ltree[18]||0!==a.dyn_ltree[20]||0!==a.dyn_ltree[26])return J;for(b=32;b<R;b++)if(0!==a.dyn_ltree[2*b])return J;return I}function B(a){pa||(o(),pa=!0),a.l_desc=new f(a.dyn_ltree,ma),a.d_desc=new f(a.dyn_dtree,na),a.bl_desc=new f(a.bl_tree,oa),a.bi_buf=0,a.bi_valid=0,p(a)}function C(a,b,c,d){i(a,(L<<1)+(d?1:0),3),r(a,b,c,!0)}function D(a){i(a,M<<1,3),j(a,Z,ga),l(a)}function E(a,b,c,d){var e,f,g=0;a.level>0?(a.strm.data_type===K&&(a.strm.data_type=A(a)),v(a,a.l_desc),v(a,a.d_desc),g=y(a),e=a.opt_len+3+7>>>3,f=a.static_len+3+7>>>3,f<=e&&(e=f)):e=f=c+5,c+4<=e&&b!==-1?C(a,b,c,d):a.strategy===H||f===e?(i(a,(M<<1)+(d?1:0),3),u(a,ga,ha)):(i(a,(N<<1)+(d?1:0),3),z(a,a.l_desc.max_code+1,a.d_desc.max_code+1,g+1),u(a,a.dyn_ltree,a.dyn_dtree)),p(a),d&&q(a)}function F(a,b,c){return a.pending_buf[a.d_buf+2*a.last_lit]=b>>>8&255,a.pending_buf[a.d_buf+2*a.last_lit+1]=255&b,a.pending_buf[a.l_buf+a.last_lit]=255&c,a.last_lit++,0===b?a.dyn_ltree[2*c]++:(a.matches++,b--,a.dyn_ltree[2*(ja[c]+R+1)]++,a.dyn_dtree[2*g(b)]++),a.last_lit===a.lit_bufsize-1}var G=a(\"../utils/common\"),H=4,I=0,J=1,K=2,L=0,M=1,N=2,O=3,P=258,Q=29,R=256,S=R+1+Q,T=30,U=19,V=2*S+1,W=15,X=16,Y=7,Z=256,$=16,_=17,aa=18,ba=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],ca=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],da=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],ea=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],fa=512,ga=new Array(2*(S+2));\nd(ga);var ha=new Array(2*T);d(ha);var ia=new Array(fa);d(ia);var ja=new Array(P-O+1);d(ja);var ka=new Array(Q);d(ka);var la=new Array(T);d(la);var ma,na,oa,pa=!1;c._tr_init=B,c._tr_stored_block=C,c._tr_flush_block=E,c._tr_tally=F,c._tr_align=D},{\"../utils/common\":41}],53:[function(a,b,c){\"use strict\";function d(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg=\"\",this.state=null,this.data_type=2,this.adler=0}b.exports=d},{}],54:[function(a,b,c){\"use strict\";b.exports=\"function\"==typeof setImmediate?setImmediate:function(){var a=[].slice.apply(arguments);a.splice(1,0,0),setTimeout.apply(null,a)}},{}]},{},[10])(10)});"
  },
  {
    "path": "themes/default/public/js/lufi-common.js",
    "content": "// vim:set sw=4 ts=4 sts=4 ft=javascript expandtab:\n// Escape HTML chars\nvar entityMap = {\n    \"&\": \"&amp;\",\n    \"<\": \"&lt;\",\n    \">\": \"&gt;\",\n    '\"': '&quot;',\n    \"'\": '&#39;',\n    \"/\": '&#x2F;'\n};\n\nfunction escapeHtml(string) {\n    return String(string).replace(/[&<>\"'\\/]/g, function (s) {\n        return entityMap[s];\n    });\n}\nfunction changeLang() {\n    window.location = langUrl+$(this).val();\n}\nfunction formatDate(unixTimestamp) {\n    return new Date(unixTimestamp * 1000).toLocaleString(window.navigator.language, {\n        year: 'numeric',\n        month: 'long',\n        day: 'numeric',\n        weekday: 'long',\n        hour: '2-digit',\n        minute: '2-digit',\n    })\n}\nfunction delItem(name) {\n    var files = localStorage.getItem(`${window.prefix}files`);\n    if (files === null) {\n        files = new Array();\n    } else {\n        files = JSON.parse(files);\n    }\n    var i;\n    for (i = 0; i < files.length; i++) {\n        if (files[i].short === name) {\n            files.splice(i, 1);\n        }\n    }\n    localStorage.setItem(`${window.prefix}files`, JSON.stringify(files));\n}\n$(document).ready(function(){\n    $('select').material_select();\n    $(\".select-lang select\").on('change', changeLang);\n    $(\".select-lang-mobile select\").on('change', changeLang);\n});\n"
  },
  {
    "path": "themes/default/public/js/lufi-down.js",
    "content": "// vim:set sw=4 ts=4 sts=4 ft=javascript expandtab:\n/*\n * Return the deciphering key stored in anchor part of the URL\n * Stolen from https://github.com/sebsauvage/ZeroBin/blob/master/js/zerobin.js\n */\nfunction pageKey() {\n    var key = window.location.hash.substring(1);  // Get key\n\n    // Some stupid web 2.0 services and redirectors add data AFTER the anchor\n    // (such as &utm_source=...).\n    // We will strip any additional data.\n\n    // First, strip everything after the equal sign (=) which signals end of base64 string.\n    i = key.indexOf('='); if (i>-1) { key = key.substring(0, i + 1); }\n\n    // If the equal sign was not present, some parameters may remain:\n    i = key.indexOf('&'); if (i>-1) { key = key.substring(0, i); }\n\n    // Then add trailing equal sign if it's missing\n    if (key.charAt(key.length-1)!=='=') key += '=';\n\n    return key;\n}\nfunction base64ToArrayBuffer(base64) {\n    var binary_string =  window.atob(base64);\n    var len = binary_string.length;\n    var bytes = new Uint8Array( len );\n    for (var i = 0; i < len; i++)        {\n        bytes[i] = binary_string.charCodeAt(i);\n    }\n    return bytes.buffer;\n}\n\n// Something's wring\nfunction addAlert(msg) {\n    $('#please-wait').remove();\n\n    var pbd = $('.file-progress');\n    pbd.attr('role', 'alert');\n    pbd.removeClass('progress');\n    pbd.html(`<div class=\"card pink\">\n                  <div class=\"card-content white-text\">\n                      <strong>${msg}</strong>\n                  </div>\n              </div>`);\n}\n\n// Spawn WebSocket\nfunction spawnWebsocket(pa) {\n    console.log('Spawning websocket…');\n    var ws       = new WebSocket(ws_url);\n    ws.onopen    = function() {\n        console.log('Connection is established!');\n\n        var l    = $('#loading');\n        l.html(i18n.loading.replace(/XX1/, (pa + 1)));\n        if ($('#file_pwd').length === 1) {\n            val = $('#file_pwd').val();\n            window.ws.send(`{\"part\":${pa}, \"file_pwd\": \"${val}\"}`);\n        } else {\n            window.ws.send(`{\"part\":${pa}}`);\n        }\n    };\n    ws.onclose   = function() {\n        console.log('Connection is closed');\n        if (!window.completed) {\n            window.attempts++;\n            if (window.attempts < 10) {\n                console.log(`Connection closed. Retrying to get slice ${pa}`);\n                window.ws = spawnWebsocket(pa);\n            } else {\n                alert(i18n.tooMuchAttempts);\n            }\n        }\n    }\n    ws.onmessage = function(e) {\n        var res  = e.data.split('XXMOJOXX');\n        var json = res.shift();\n        var data = JSON.parse(json);\n\n        // Reset counter since we succeded to open a websocket and got a message\n        window.attempts  = 0;\n\n        if (data.msg !== undefined) {\n            addAlert(data.msg);\n            console.log(data.msg);\n            if ($('#file_pwd').length === 1) {\n                $('.file-abort').addClass('hide');\n            }\n            window.onbeforeunload = null;\n            window.attempts  = 10;\n        } else {\n            console.log(`Getting slice ${data.part + 1} of ${data.total}`);\n            var slice   = JSON.parse(res.shift());\n            var percent = Math.round(1000 * (data.part + 1)/data.total)/10;\n            var wClass  = percent.toString().replace('.', '-');\n            var pb      = $('#pb');\n            pb.removeClass();\n            pb.addClass('determinate');\n            pb.addClass(`width-${wClass}`);\n            pb.attr('aria-valuenow', percent);\n            $('#pbt').html(`${percent}%`);\n            try {\n                var b64 = sjcl.decrypt(window.key, slice);\n                window.a[data.part] = base64ToArrayBuffer(b64);\n                if (data.part + 1 === data.total) {\n                    var blob = new Blob(a, {type: data.type});\n\n                    notify(i18n.fileDownloaded, data.name);\n                    $('#please-wait').remove();\n                    $('#loading').remove();\n\n                    var pbd  = $('#pbd');\n                    pbd.attr('class', 'center-align');\n                    // IE & Edge fix for downloading blob files, gives option to save or open the file when the link is opened.\n                    if (window.navigator && window.navigator.msSaveOrOpenBlob) {\n                        var fileName = escapeHtml(data.name);\n                        window.navigator.msSaveOrOpenBlob(blob, fileName);\n                    } else {\n                        var blobURL   = URL.createObjectURL(blob);\n                    }\n                    var innerHTML = `<p><a href=\"${blobURL}\" class=\"btn btn-primary\" download=\"${escapeHtml(data.name)}\">${i18n.download}</a></p>`;\n\n                    var isZip = ($('#filesize').attr('data-zipped') === 'true');\n                    if (data.type.match(/^image\\//) !== null) {\n                        innerHTML += `<img id=\"render-image\" class=\"responsive-img\" alt=\"${escapeHtml(data.name)}\" src=\"${blobURL}\">`;\n                    } else if (data.type.match(/^video\\//) !== null) {\n                        innerHTML += `<video class=\"responsive-video\" controls>\n                                           <source src=\"${blobURL}\" type=\"${data.type}\">\n                                      </video>`;\n                    } else if (data.type.match(/^audio\\//) !== null) {\n                        innerHTML += `<audio class=\"responsive-video\" controls>\n                                           <source src=\"${blobURL}\" type=\"${data.type}\">\n                                      </audio>`;\n                    } else if (isZip) {\n                        innerHTML += `<p><a class=\"btn btn-primary\" id=\"showZipContent\">${i18n.showZipContent}</a></p>`;\n                    }\n\n                    pbd.html(innerHTML);\n\n                    if (isZip) {\n                        $('#showZipContent').click(function() {\n                            JSZip.loadAsync(blob)\n                            .then(function (zip) {\n                                var innerHTML = `<h3>${i18n.zipContent}</h3><ul>`;\n                                zip.forEach(function (relativePath, zipEntry) {\n                                    innerHTML += `<li>\n                                                      ${escapeHtml(zipEntry.name)}\n                                                      (${filesize(zipEntry._data.uncompressedSize, {base: 10})})\n                                                      <a href=\"#\"\n                                                         download=\"${escapeHtml(zipEntry.name)}\"\n                                                         class=\"download-zip-content\"\n                                                         title=\"${i18n.download}\">\n                                                           <i class=\"mdi-file-file-download\"></i>\n                                                      </a>\n                                                  </li>`\n                                });\n                                innerHTML += '</ul>';\n                                pbd.append(innerHTML);\n                                $('.download-zip-content').click(function(e) {\n                                    e.preventDefault();\n                                    var t = $(this);\n                                    var filename = t.attr('download');\n                                    zip.files[filename].async('blob').then(function(blob) {\n                                        t.unbind('click');\n                                        t.attr('href', URL.createObjectURL(blob));\n                                        t[0].click();\n                                    });\n                                })\n                                $('#showZipContent').hide();\n                                $('#showZipContent').unbind('click');\n                            });\n                        });\n                    }\n                    if ($('#file_pwd').length === 1) {\n                        val = $('#file_pwd').val();\n                        window.ws.send(`{\"ended\":true, \"file_pwd\": \"${val}\"}`);\n                    } else {\n                        window.ws.send('{\"ended\":true}');\n                    }\n                    window.onbeforeunload = null;\n                    window.completed = true;\n                    $('#abort').remove();\n                } else {\n                    var l = $('#loading');\n                    l.html(i18n.loading.replace(/XX1/, (data.part + 1)));\n                    if (ws.readyState === 3) {\n                        window.ws = spawnWebsocket(data.part + 1);\n                    } else {\n                        window.ws.onclose = function() {\n                            console.log('Connection is closed');\n                            if (!window.completed) {\n                                console.log(`Connection closed. Retrying to get slice ${data.part + 1}`);\n                                window.ws = spawnWebsocket(data.part + 1);\n                            }\n                        }\n                        window.ws.onerror = function() {\n                            console.log(`Error. Retrying to get slice ${data.part + 1}`);\n                            window.ws = spawnWebsocket(data.part + 1);\n                        };\n                        if ($('#file_pwd').length === 1) {\n                            val = $('#file_pwd').val();\n                            window.ws.send(`{\"part\":${data.part + 1}, \"file_pwd\": \"${val}\"}`);\n                        } else {\n                            window.ws.send(`{\"part\":${data.part + 1}}`);\n                        }\n                    }\n                }\n            } catch(err) {\n                if (err.message === 'ccm: tag doesn\\'t match') {\n                    addAlert(i18n.badkey);\n                } else {\n                    addAlert(err.message);\n                }\n                window.onbeforeunload = null;\n            }\n        }\n    }\n    ws.onerror = function() {\n        window.attempts++;\n        if (window.attempts < 10) {\n            console.log(`Error. Retrying to get slice ${pa}`);\n            window.ws = spawnWebsocket(pa);\n        } else {\n            alert(i18n.tooMuchAttempts);\n        }\n    }\n    return ws;\n}\n// When it's ready\n$(document).ready(function(){\n    $('#abort').click(function() {\n        window.ws.onclose = function() {};\n        window.ws.close();\n        $('#please-wait, #loading, #pbd, #abort').remove();\n        $('#filesize').parent().append(`<h4>${i18n.aborted1}</h4>\n                                        <p>\n                                            <a id=\"reloadLocation\"\n                                               class=\"waves-effect waves-light btn\">\n                                                ${i18n.aborted2}\n                                            </a>\n                                        </p>`);\n        window.onbeforeunload = null;\n        $('#reloadLocation').on('click', function(e) {\n            e.preventDefault();\n            window.location.reload();\n        })\n    });\n    $('#filesize').html(filesize($('#filesize').attr('data-filesize'), {base: 10}));\n    window.a         = new Array();\n    window.key       = pageKey();\n    window.completed = false;\n    window.attempts  = 0;\n\n    if (key !== '=') {\n        var go = true;\n        if ($('#file_pwd').length === 1) {\n            go = false;\n            $('#go').click(function() {\n                $('.file-progress, .file-abort').removeClass('hide');\n                $('#file_pwd').parent().parent().addClass('hide');\n                // Set websocket\n                window.ws = spawnWebsocket(0);\n\n                // Prevent exiting page before full download\n                window.onbeforeunload = confirmExit;\n            });\n        }\n        if (go) {\n            // Set websocket\n            window.ws = spawnWebsocket(0);\n\n            // Prevent exiting page before full download\n            window.onbeforeunload = confirmExit;\n        }\n    } else {\n        addAlert(i18n.nokey);\n    }\n});\n"
  },
  {
    "path": "themes/default/public/js/lufi-files.js",
    "content": "// vim:set sw=4 ts=4 sts=4 ft=javascript expandtab:\n// Add item to localStorage\nfunction addItem(item) {\n    var files = localStorage.getItem(`${window.prefix}files`);\n    if (files === null) {\n        files = new Array();\n    } else {\n        files = JSON.parse(files);\n    }\n    files.push(item);\n    localStorage.setItem(`${window.prefix}files`, JSON.stringify(files));\n}\n\nfunction itemExists(name) {\n    var files = localStorage.getItem(`${window.prefix}files`);\n    if (files === null) {\n        return false;\n    } else {\n        files = JSON.parse(files);\n        var i;\n        for (i = 0; i < files.length; i++) {\n            if (files[i].short === name) {\n                return true;\n            }\n        }\n        return false;\n    }\n}\n\nfunction invertSelection(event) {\n    event.preventDefault();\n    $('input[type=\"checkbox\"]').each(function() {\n        var el = $(this);\n        el.click();\n        if (el.attr('data-checked') && el.attr('data-checked') === 'data-checked') {\n            el.attr('data-checked', null);\n        } else {\n            el.attr('data-checked', 'data-checked');\n        }\n    });\n    evaluateMassDelete();\n}\n\nfunction purgeExpired(event) {\n    event.preventDefault();\n    var files = JSON.parse(localStorage.getItem(`${window.prefix}files`));\n\n    files.forEach(function(element, index, array) {\n        $.ajax({\n            url: counterURL,\n            method: 'POST',\n            dataType: 'json',\n            data: {\n                short: element.short,\n                token: element.token\n            },\n            success: function(data, textStatus, jqXHR) {\n                if (data.success) {\n                    if (data.deleted) {\n                        $(`#count-${data.short}`).parent().remove();\n                        delItem(data.short);\n                    }\n                }\n            }\n        });\n    });\n}\n\nfunction exportStorage(event) {\n    event.preventDefault();\n    var a = $('<a id=\"data-json\">');\n    a.hide();\n    $('body').append(a);\n\n    var storageData = [localStorage.getItem(`${window.prefix}files`)];\n    var exportFile  = new Blob(storageData, {type : 'application/json'});\n    var url         = window.URL.createObjectURL(exportFile);\n\n    a.attr('href', url);\n    a.attr('download', 'data.json');\n    $('#data-json')[0].click();\n    $('#data-json').remove();\n}\n\nfunction importStorage(f) {\n    var reader = new FileReader();\n    reader.addEventListener(\"loadend\", function() {\n        try {\n            var newFiles = JSON.parse(String.fromCharCode.apply(null, new Uint8Array(reader.result)));\n            var i;\n            var hasImported = 0;\n            for (i = 0; i < newFiles.length; i++) {\n                var item = newFiles[i];\n                if (validURL(item.url) && !itemExists(item.short)) {\n                    addItem(item);\n                    hasImported++;\n                }\n            }\n            populateFilesTable();\n\n            Materialize.toast(i18n.importProcessed);\n        } catch(err) {\n            alert(err);\n        }\n    });\n    reader.readAsArrayBuffer(f[0]);\n}\n\nfunction validURL(str) {\n    try {\n        var url = new URL(str);\n        if (url.host) {\n            return true;\n        } else {\n            return false;\n        }\n    } catch(e) {\n        return false;\n    }\n}\n\nfunction delFile() {\n    var dlink = $(this).attr('data-dlink');\n    var short = $(this).attr('data-short');\n    $.ajax({\n        url: dlink,\n        method: 'POST',\n        data: {\n            _format: 'json'\n        },\n        success: function(data) {\n            if (data.success) {\n                $(`#row-${short}`).remove();\n                delItem(short);\n            } else {\n                alert(data.msg);\n            }\n            evaluateMassDelete();\n        },\n        error: function() {\n        },\n        complete: function() {\n        }\n    });\n}\n\nfunction evaluateMassDelete() {\n    if ($('input[data-checked=\"data-checked\"]').length > 0) {\n        $('#mass-delete').removeAttr('disabled');\n        $('#mass-delete').removeClass('disabled');\n    } else {\n        $('#mass-delete').attr('disabled');\n        $('#mass-delete').addClass('disabled');\n    }\n}\n\nfunction massDelete(event) {\n    event.preventDefault();\n    $('input[data-checked=\"data-checked\"]').each(delFile);\n}\n\nfunction populateFilesTable() {\n    $('#myfiles').empty();\n\n    var files = localStorage.getItem(`${window.prefix}files`);\n    if (files === null) {\n        var filesWithoutPrefix = localStorage.getItem('files');\n        if (filesWithoutPrefix !== null) {\n            if (window.confirm(i18n.importFilesWithoutPrefix)) {\n                localStorage.setItem(`${window.prefix}files`, filesWithoutPrefix);\n                files = JSON.parse(filesWithoutPrefix);\n            } else {\n                localStorage.setItem(`${window.prefix}files`, JSON.stringify([]));\n                files = new Array();\n            }\n        } else {\n            files = new Array();\n        }\n    } else {\n        files = JSON.parse(files);\n    }\n    files.sort(function(a, b) {\n        if (a.created_at < b.created_at) {\n            return -1;\n        } else if (a.created_at > b.created_at) {\n            return 1;\n        } else {\n            return 0\n        }\n    });\n    files.forEach(function(element, index, array) {\n        var del_view   = (element.del_at_first_view) ? '<i class=\"small mdi-action-done\"></i>' : '<i class=\"small mdi-navigation-close\"></i>';\n        var dlink      = `${actionURL}d/${element.short}/${element.token}`;\n        var limit      = (element.delay === 0) ? i18n.noExpiration : formatDate(element.delay * 86400 + element.created_at);\n        var created_at = formatDate(element.created_at);\n\n        var tr = $(`<tr id=\"row-${element.short}\">`);\n        tr.html(`<td class=\"center-align\">\n                      <input type=\"checkbox\"\n                             id=\"check-${element.short}\"\n                             data-short=\"${element.short}\"\n                             data-dlink=\"${dlink}\"\n                             data-checked=\"\">\n                      <label for=\"check-${element.short}\"></label>\n                  </td>\n                  <td class=\"left-align\">\n                      ${escapeHtml(element.name)}\n                  </td>\n                  <td class=\"center-align\">\n                      <a href=\"${element.url}\"\n                         class=\"classic\">\n                         <i class=\"small mdi-file-file-download\"></i>\n                      </a>\n                  </td>\n                  <td id=\"count-${element.short}\" class=\"center-align\">\n                  </td>\n                  <td class=\"center-align\">\n                      ${del_view}\n                  </td>\n                  <td>\n                      ${created_at}\n                  </td>\n                  <td>\n                      ${limit}\n                  </td>\n                  <td class=\"center-align\">\n                      <a id=\"del-${element.short}\"\n                         data-short=\"${element.short}\"\n                         data-dlink=\"${dlink}\"\n                         href=\"#\"\n                         class=\"classic\">\n                         <i class=\"small mdi-action-delete\"></i>\n                      </a>\n                  </td>\n                  <td class=\"center-align\">\n                      <a href=\"${actionURL}m?links=[&quot;${element.short}&quot;]\"\n                      class=\"classic\"><i class=\"small mdi-communication-email\"></i></a>\n                  </td>`);\n        $('#myfiles').append(tr);\n        $(`#del-${element.short}`).on('click', delFile);\n        $(`label[for=\"check-${element.short}\"]`).on('click', function(){\n            if ($(`#check-${element.short}`).attr('data-checked') && $(`#check-${element.short}`).attr('data-checked') === 'data-checked') {\n                $(`#check-${element.short}`).attr('data-checked', null);\n            } else {\n                $(`#check-${element.short}`).attr('data-checked', 'data-checked');\n            }\n            evaluateMassDelete();\n        });\n\n        $.ajax({\n            url: counterURL,\n            method: 'POST',\n            dataType: 'json',\n            data: {\n                short: element.short,\n                token: element.token\n            },\n            success: function(data, textStatus, jqXHR) {\n                if (data.success) {\n                    $(`#count-${data.short}`).html(data.counter);\n                    if (data.deleted) {\n                        $(`#count-${data.short}`).parent().addClass('purple lighten-4');\n                    }\n                } else {\n                    alert(data.msg);\n                    $(`#count-${data.short}`).parent().remove();\n                    if (data.missing) {\n                        delItem(data.short);\n                    }\n                }\n            }\n        });\n    });\n}\n\nfunction clickImport(event) {\n    event.preventDefault();\n    $('#import').click();\n}\n"
  },
  {
    "path": "themes/default/public/js/lufi-list-invitations.js",
    "content": "function invertSelection(e) {\n    e.preventDefault();\n    $('#myInvitations input[type=\"checkbox\"]').each(function () {\n        var el = $(this);\n        var tr = el.parent().parent();\n        if (!tr.hasClass('hide')) {\n            el.click();\n        }\n    })\n}\n\nfunction toggleHidden(e) {\n    e.preventDefault();\n    if ($('#myInvitations').attr('data-visibility') === 'hidden') {\n        $('#toggleHidden').text(i18n.hideText);\n        $('tr[data-visibility=\"0\"]').removeClass('hide');\n        $('#myInvitations').attr('data-visibility', 'shown');\n    } else {\n        $('#toggleHidden').text(i18n.showText);\n        $('tr[data-visibility=\"0\"]').addClass('hide');\n        $('tr[data-visibility=\"0\"] input[type=\"checkbox\"]').each(function() {\n            var el = $(this);\n            if (el.attr('data-checked') === 'data-checked') {\n                $('tr[data-visibility=\"0\"] input[type=\"checkbox\"]').click();\n            }\n        });\n        $('#myInvitations').attr('data-visibility', 'hidden');\n    }\n}\n\nfunction deleteInvit(e) {\n    e.preventDefault();\n    if (confirm(i18n.confirmDeleteInvit)) {\n        var tokens = selectChecked();\n        $.ajax({\n            url: deleteURL,\n            method: 'POST',\n            data: {\n                tokens: tokens\n            },\n            success: function(data, textStatus, jqXHR) {\n                if (data.success) {\n                    data.tokens.forEach(function(t) {\n                        Materialize.toast(t.msg, 6000, 'teal accent-3');\n                        $(`#row-${t.token}`).remove();\n                    });\n                    data.failures.forEach(function(msg) {\n                        Materialize.toast(msg, 10000, 'red accent-2');\n                    });\n                    disableButtons();\n                } else {\n                    data.failures.forEach(function(msg) {\n                        Materialize.toast(msg, 10000, 'red accent-2');\n                    });\n                    if (data.msg) {\n                        Materialize.toast(data.msg, 10000, 'red accent-2');\n                    }\n                }\n            }\n        });\n    }\n}\n\nfunction resendMail(e) {\n    e.preventDefault();\n    if (confirm(i18n.confirmResendMail)) {\n        var tokens = selectChecked();\n        $.ajax({\n            url: resendURL,\n            method: 'POST',\n            data: {\n                tokens: tokens\n            },\n            success: function(data, textStatus, jqXHR) {\n                data.success.forEach(function(s) {\n                    Materialize.toast(s.msg, 6000, 'teal accent-3');\n                    $(`#expire-${s.token}`).text(s.expires)\n                    $(`#${s.token}`).click();\n                });\n                data.failures.forEach(function(msg) {\n                    Materialize.toast(msg, 10000, 'red accent-2');\n                });\n            }\n        });\n    }\n}\n\nfunction toggleVisibility(e) {\n    e.preventDefault();\n    var tokens = selectChecked();\n    $.ajax({\n        url: toggleURL,\n        method: 'POST',\n        data: {\n            tokens: tokens\n        },\n        success: function(data, textStatus, jqXHR) {\n            if (data.success) {\n                data.tokens.forEach(function(t) {\n                    var row = $(`#row-${t.token}`)\n                    if (t.show) {\n                        row.attr('data-visibility', 1);\n                        row.removeClass('hide');\n                        $(`#row-${t.token} > td:first i`).remove();\n                    } else {\n                        row.attr('data-visibility', 0);\n                        if ($('#myInvitations').attr('data-visibility') === 'hidden') {\n                            row.addClass('hide');\n                        }\n                        $(`#row-${t.token} > td:first`).append(i18n.hiddenMark);\n                    }\n                    $(`#${t.token}`).click();\n                });\n                disableButtons();\n            } else {\n                Materialize.toast(data.msg, 10000, 'red accent-2');\n            }\n        }\n    });\n}\n\nfunction selectChecked() {\n    var tokens = [];\n    $('#myInvitations input[type=\"checkbox\"][data-checked=\"data-checked\"]').each(function() {\n        tokens.push($(this).attr('id'));\n    });\n    return tokens;\n}\n\nfunction handleCheckboxClic() {\n    var el = $(this);\n    if (el.attr('data-checked') === 'data-checked') {\n        el.attr('data-checked', null);\n    } else {\n        el.attr('data-checked', 'data-checked');\n    }\n    if ($('#myInvitations input[type=\"checkbox\"][data-checked=\"data-checked\"]').length !== 0) {\n        $('#deleteInvit').removeClass('disabled');\n        $('#deleteInvit').attr('disabled', null);\n        $('#resendMail').removeClass('disabled');\n        $('#resendMail').attr('disabled', null);\n        $('#toggleVisibility').removeClass('disabled');\n        $('#toggleVisibility').attr('disabled', null);\n    } else {\n        disableButtons();\n    }\n}\n\nfunction disableButtons() {\n    $('#deleteInvit').addClass('disabled');\n    $('#deleteInvit').attr('disabled', 'disabled');\n    $('#resendMail').addClass('disabled');\n    $('#resendMail').attr('disabled', 'disabled');\n    $('#toggleVisibility').addClass('disabled');\n    $('#toggleVisibility').attr('disabled', 'disabled');\n}\n\nfunction fillModal() {\n    var el = $(this);\n\n    $('#files-info h1').text('');\n    $('#files-ul').html('');\n\n    var token = el.attr('data-token');\n    var guest = el.attr('data-guest');\n    $('#files-info h1').text(\n        i18n.listFiles.replace('XX1', token)\n                      .replace('XX2', guest)\n    );\n\n    var files = JSON.parse(el.attr('data-files'));\n    var content = '';\n    for (i = 0; i < files.length; i++) {\n        var f = files[i];\n        var expires = i18n.expiration.replace('XXX', formatDate(f.delay * 86400 + f.created_at));\n        content += `<li>— <a href=\"${f.url}\">${f.name}</a>\n                        (${filesize(f.size)}, ${expires})\n                    </li>`;\n    }\n    $('#files-ul').html(content);\n}\n\n$(document).ready(function(){\n    $('.modal-trigger').leanModal();\n    $('.modal-trigger').on('click', fillModal);\n    $('#invertSelection').on('click', invertSelection);\n    $('#toggleHidden').on('click', toggleHidden);\n    $('#deleteInvit').on('click', deleteInvit);\n    $('#resendMail').on('click', resendMail);\n    $('#toggleVisibility').on('click', toggleVisibility);\n    $('#myInvitations input[type=\"checkbox\"]').on('click', handleCheckboxClic);\n});\n"
  },
  {
    "path": "themes/default/public/js/lufi-notifications.js",
    "content": "function notify(title, body) {\n    if (!'Notification' in window || typeof(Notification) === 'undefined') {\n        console.log(`This browser does not support desktop notification, cannot send following message: ${title} ${body}`);\n        return;\n    }\n\n    if (Notification.permission !== \"granted\") {\n        Notification.requestPermission();\n    } else {\n        let options = {\n            body: body,\n            icon: '/img/lufi196.png'\n        };\n        let n = new Notification(title, options);\n    }\n}\n\ndocument.addEventListener('DOMContentLoaded', function () {\n    if (!'Notification' in window || typeof(Notification) === 'undefined') {\n        return;\n    }\n\n    if (Notification.permission !== \"granted\") {\n        Notification.requestPermission();\n    }\n});\n"
  },
  {
    "path": "themes/default/public/js/lufi-up.js",
    "content": "// vim:set sw=4 ts=4 sts=4 ft=javascript expandtab:\n\n// total file counter\nwindow.fc = 0;\n// Cancelled files indexes\nwindow.cancelled = [];\n// Set websocket\nwindow.ws = spawnWebsocket(0, function() {return null;});\n// Use slice of 0.75MB\nwindow.sliceLength = 750000;\n// Global zip objects for currently created zip file\nwindow.zip = null;\nwindow.zipSize = 0;\n// Init the list of files (used by LDAP invitation feature)\nwindow.filesURLs = [];\n\n// Copy a link to clipboard\nfunction copyToClipboard(txt) {\n    var textArea = $('<textarea>');\n    textArea.addClass('textarea-hidden');\n    textArea.val(txt);\n\n    $('body').append(textArea);\n    textArea.select();\n\n    try {\n        var successful = document.execCommand('copy');\n        var msg = successful ? i18n.copySuccess : i18n.copyFail;\n        Materialize.toast(msg, 4000);\n    } catch (err) {\n        el.focus();\n        var len = el.value.length * 2;\n        el.setSelectionRange(0, len);\n        alert(i18n.hit);\n    }\n\n    textArea.remove();\n}\n\n// Copy all links to clipboard\nfunction copyAllToClipboard(event) {\n    event.preventDefault();\n    var text = new Array();\n    var a = $('.link-input');\n    var i;\n    for (i = 0; i < a.length; i++) {\n        text.push(a[i].value);\n    }\n    var textArea = $('<textarea>');\n    textArea.addClass('textarea-hidden');\n    textArea.val(text.join(\"\\n\"));\n\n    $('body').append(textArea);\n    textArea.select();\n\n    try {\n        var successful = document.execCommand('copy');\n        var msg = successful ? i18n.copySuccess : i18n.copyFail;\n        Materialize.toast(msg, 4000);\n    } catch (err) {\n        textArea.removeClass('textarea-hidden');\n        textArea.addClass('white-background');\n        alert(i18n.hits);\n    }\n\n    textArea.remove();\n}\n\n// Add item to localStorage\nfunction addItem(name, url, size, del_at_first_view, created_at, delay, short, token) {\n    var files = localStorage.getItem(`${window.prefix}files`);\n    if (files === null) {\n        files = new Array();\n    } else {\n        files = JSON.parse(files);\n    }\n    files.push({ name: name, short: short, url: url, size: size, del_at_first_view: del_at_first_view, created_at: created_at, delay: delay, token: token });\n    localStorage.setItem(`${window.prefix}files`, JSON.stringify(files));\n}\n\n// Remove a file block\nfunction destroyBlock(el) {\n    $(el).parents('li').remove();\n\n    if ($('.link-input').length === 0) {\n        $('#misc').empty();\n        if ($('#results li').length === 0 && window.fileList === null) {\n            $('#results').hide();\n        }\n    } else {\n        updateMailLink();\n    }\n}\n\n// When clicking on del at first view checkbox\nfunction firstViewClicking() {\n    if ($('#first-view').attr('data-checked') && $('#first-view').attr('data-checked') === 'data-checked') {\n        $('#first-view').attr('data-checked', null);\n    } else {\n        $('#first-view').attr('data-checked', 'data-checked');\n    }\n}\n\n// When clicking on zip checkbox\nfunction zipClicking() {\n    if ($('#zip-files').attr('data-checked') && $('#zip-files').attr('data-checked') === 'data-checked') {\n        window.zipSize = 0;\n        window.zip = null;\n        $('#zip-files').attr('data-checked', null);\n        $('#zipname').val('documents.zip');\n        $('#zipname-input').addClass('hide');\n        $('#zipping').addClass('hide');\n        $('#files').removeClass('m6').addClass('m12');\n        $('#zip-parts').html('');\n        $('#delete-day').attr('disabled', null);\n        $('#first-view').attr('disabled', null);\n    } else {\n        $('#zip-files').attr('data-checked', 'data-checked');\n        $('#zipname-input').removeClass('hide');\n        $('#zip-size').text(filesize(window.zipSize));\n    }\n}\n\n// Get the zip file name\nfunction getZipname() {\n    var zipname = $('#zipname').val();\n    if (zipname === '') {\n        zipname = 'documents.zip';\n    }\n    if (!zipname.endsWith('.zip')) {\n        if (zipname.endsWith('.')) {\n            zipname += 'zip';\n        } else {\n            zipname += '.zip';\n        }\n    }\n\n    return escapeHtml(zipname);\n}\n\n// Update the zip name\nfunction updateZipname() {\n    $('#zip-name').text(getZipname());\n}\n\n// Create blob from zip\nfunction uploadZip(e) {\n    e.preventDefault();\n    var delay             = $('#delete-day');\n    var del_at_first_view = $('#first-view');\n    $('#zip-files').attr('disabled', 'disabled');\n    $('#file-browser-button').attr('disabled', 'disabled');\n    $('#file-browser-span').addClass('disabled');\n    $('#uploadZip').addClass('hide');\n    $('#zip-parts').text('');\n\n    $('#zip-compressing').removeClass('hide');\n    window.zip.generateAsync({type:\"blob\"})\n        .then(function(zipFile) {\n            // if $('#zipping') is hidden, the zipping has been aborted\n            if (!$('#zipping').hasClass('hide')) {\n                window.zip = null;\n                $('#zipping').addClass('hide');\n                $('#files').removeClass('m6').addClass('m12');\n                $('#zipname-input').addClass('hide');\n                $('#zip-compressing').addClass('hide');\n                $('#uploadZip').removeClass('hide');\n                $('#results').show();\n                $('#zip-files').attr('disabled', null);\n\n                var zipname = getZipname();\n                var file = new File([zipFile], zipname, {type: 'application/zip'});\n\n                Materialize.toast(i18n.enqueued.replace('XXX', zipname), 3000, 'teal accent-3');\n                if (window.fileList === undefined || window.fileList === null) {\n                    window.fileList = [file];\n                    uploadFile(0, delay.val(), del_at_first_view.is(':checked'));\n                } else {\n                    window.fileList.push(file);\n                }\n            }\n            $('#file-browser-button').attr('disabled', null);\n            $('#file-browser-span').removeClass('disabled');\n        });\n}\n\n// Update the mail link\nfunction updateMailLink() {\n    var a = $('.link-input');\n    var l = new Array();\n    var i;\n    for (i = 0; i < a.length; i++) {\n        l.push(a[i].id);\n    }\n    var u = `${actionURL}m?links=${JSON.stringify(l)}`;\n    $('#mailto').attr('href', u);\n}\n\n// [Invitation feature] Send URLs of files to server\nfunction sendFilesURLs() {\n    if (window.filesURLs.length > 0) {\n        $.ajax({\n            url: sendFilesURLsURL,\n            method: 'POST',\n            dataType: 'json',\n            data: {\n                urls: window.filesURLs\n            },\n            success: function(data, textStatus, jqXHR) {\n                if (data.success) {\n                    Materialize.toast(data.msg, 6000, 'teal accent-3');\n                } else {\n                    Materialize.toast(data.msg, 10000, 'red accent-2');\n                }\n            }\n        });\n    }\n}\n\n\n// Start uploading the files (called from <input> and from drop zone)\nfunction handleFiles(f) {\n    var delay             = $('#delete-day');\n    var zip_files         = $('#zip-files');\n    var del_at_first_view = $('#first-view');\n\n    delay.attr('disabled', 'disabled');\n    del_at_first_view.attr('disabled', 'disabled');\n\n    if (zip_files.is(':checked')) {\n        if (window.zip === null) {\n            window.zip = new JSZip();\n        }\n        $('#zipping').removeClass('hide');\n        $('#files').removeClass('m12').addClass('m6');\n        for (var i = 0; i < f.length; i++) {\n            var element  = f.item(i);\n            var filename = element.name;\n            var origname = filename;\n            var counter  = 0;\n            while (typeof(window.zip.files[filename]) !== 'undefined') {\n                counter += 1;\n                filename = `${origname.substring(0, origname.lastIndexOf('.'))}_(${counter})${origname.substring(origname.lastIndexOf('.'))}`;\n            }\n\n            window.zip.file(filename, element);\n\n            window.zipSize += element.size;\n            $('#zip-size').text(filesize(window.zipSize));\n            $('#zip-parts').append(`<li>\n                                        — ${escapeHtml(filename)} (${filesize(element.size)})\n                                    </li>`);\n        }\n    } else {\n        if (window.fileList === undefined || window.fileList === null) {\n            window.fileList = Array.prototype.slice.call(f);\n            for (var i = 0; i < window.fileList.length; i++) {\n                var file = window.fileList[i];\n                Materialize.toast(i18n.enqueued.replace('XXX', escapeHtml(file.name)), 3000, 'teal accent-3');\n            }\n            window.nbFiles  = window.fileList.length;\n            $('#results').show();\n            uploadFile(0, delay.val(), del_at_first_view.is(':checked'));\n        } else {\n            window.fileList = window.fileList.concat(Array.prototype.slice.call(f));\n        }\n    }\n}\n\n// Create random key\nfunction genRandomKey() {\n    return sjcl.codec.base64.fromBits(sjcl.random.randomWords(8, 10), 0);\n}\n\n// Create progress bar and call slicing and uploading function\nfunction uploadFile(i, delay, del_at_first_view) {\n    // Prevent exiting page before full upload\n    window.onbeforeunload = confirmExit;\n\n    // Create a random key, different for all files\n    var randomkey = genRandomKey();\n\n    // Get the file and properties\n    var file  = window.fileList[i];\n    var name  = escapeHtml(file.name);\n    var size  = filesize(file.size);\n    var parts = Math.ceil(file.size/window.sliceLength);\n    if (parts === 0) {\n        parts = 1;\n    }\n\n    // Create a progress bar for the file\n    var r  = $('#ul-results');\n    var w  = $('<li>');\n    w.addClass('list-group-item');\n    w.html(`<div class=\"card\">\n                <div>\n                    <a href=\"#\" id=\"destroy-${window.fc}\">\n                        <i class=\"right mdi-navigation-close small\"></i>\n                    </a>\n                    <div class=\"card-content\">\n                        <span class=\"card-title\"\n                              id=\"name-${window.fc}\">${name}</span>\n                        <span id=\"size-${window.fc }\">(${size})</span>\n                        <p id=\"parts-${window.fc}\"></p>\n                    </div>\n                    <div class=\"progress\">\n                        <div id=\"progress-${window.fc}\"\n                             data-key=\"${randomkey}\"\n                             data-name=\"${name}\"\n                             aria-valuemax=\"100\"\n                             aria-valuemin=\"0\"\n                             aria-valuenow=\"0\"\n                             role=\"progressbar\"\n                             class=\"determinate width-0\">\n                            <span class=\"sr-only\">${name}0%</span>\n                        </div>\n                    </div>\n            <div>`);\n    r.prepend(w);\n    $(`#destroy-${window.fc}`).on('click', function(event) {\n        event.preventDefault();\n        window.cancelled.push(i);\n        destroyBlock(this);\n    });\n\n    sliceAndUpload(randomkey, i, parts, 0, delay, del_at_first_view, null, null);\n}\n\n// Get a slice of file and send it\nfunction sliceAndUpload(randomkey, i, parts, j, delay, del_at_first_view, short, mod_token) {\n    if (mod_token !== null && window.cancelled.includes(i)) {\n        var data = JSON.stringify({\n            id: short,\n            mod_token: mod_token,\n            cancel: true,\n            i: i\n        })+'XXMOJOXXuseless';\n        // Verify that we have a websocket and send json\n        if (window.ws.readyState === 3) {\n            window.ws = spawnWebsocket(0, function() {\n                window.ws.send(data);\n            });\n        } else {\n            window.ws.onclose = function() {\n                console.log('Websocket closed, waiting 10sec.');\n                window.ws = spawnWebsocket(0, function() {return null;});\n            };\n            window.ws.onerror = function() {\n                console.log('Error on Websocket, waiting 10sec.');\n                window.ws = spawnWebsocket(0, function() {return null;});\n            };\n            window.ws.send(data);\n        }\n    } else {\n        var file  = window.fileList[i];\n        var slice = file.slice(j * window.sliceLength, (j + 1) * window.sliceLength, file.type);\n        var fr = new FileReader();\n        fr.onloadend = function() {\n            var sl        = $(`#parts-${window.fc}`);\n\n            // Get the binary result, different result in IE browsers (see default.html.ep line 27:48)\n            if (isIE == true){\n                var bin = fr.content;\n            } else {\n                var bin = fr.result;\n            }\n\n            // Transform it in base64\n            var b         = window.btoa(bin);\n\n            // Encrypt it\n            var encrypted = sjcl.encrypt(randomkey, b);\n\n            // Prepare json\n            var data = {\n                // number of parts\n                total: parts,\n                // part X of total\n                part: j,\n                size: file.size,\n                name: file.name,\n                type: file.type,\n                delay: delay,\n                del_at_first_view: del_at_first_view,\n                zipped: $('#zip-files').is(':checked'),\n                id: short,\n                // number of the sent file in the queue\n                i: i\n            };\n            if ($('#file_pwd').length === 1) {\n                var pwd = $('#file_pwd').val();\n                if (pwd !== undefined && pwd !== null && pwd !== '') {\n                    data['file_pwd'] = $('#file_pwd').val();\n                }\n            }\n            data = `${JSON.stringify(data)}XXMOJOXX${JSON.stringify(encrypted)}`;\n\n            var percent = Math.round(1000 * j/parts)/10;\n            console.log(`sending slice ${j + 1}/${parts} of file ${file.name} (${percent}%)`);\n\n            sl.html(`${percent.toFixed(1)}%`);\n\n            // Verify that we have a websocket and send json\n            if (window.ws.readyState === 3) {\n                window.ws = spawnWebsocket(0, function() {\n                    window.ws.send(data);\n                });\n            } else {\n                window.ws.onclose = function() {\n                    console.log('Websocket closed, waiting 10sec.');\n                    window.ws = spawnWebsocket(0, function() {\n                        console.log(`sending again slice ${j + 1}/${parts} of file ${file.name}`);\n                        window.ws.send(data);\n                    });\n                };\n                window.ws.onerror = function() {\n                    console.log('Error on Websocket, waiting 10sec.');\n                    window.ws = spawnWebsocket(0, function() {\n                        console.log(`sending again slice ${j + 1}/${parts} of file ${file.name}`);\n                        window.ws.send(data);\n                    });\n                };\n                window.ws.send(data);\n            }\n        }\n        fr.readAsBinaryString(slice);\n    }\n}\n\n// Update the progress bar\nfunction updateProgressBar(data) {\n    if (typeof(data.action) !== 'undefined' && data.action === 'cancel') {\n        if (data.success) {\n            console.log('Upload successfully cancelled');\n        } else {\n            console.log(`Upload cancellation failed: ${data.msg}`);\n        }\n\n        // Remove the cancelled index\n        window.cancelled.splice(window.cancelled.indexOf(window.fc), 1);\n\n        // Upload next file\n        window.fc++;\n        data.i++;\n        if (data.i < window.fileList.length) {\n            uploadFile(data.i, $('#delete-day').val(), $('#first-view').is(':checked'));\n        } else {\n            // We have finished\n            window.cancelled = [];\n            window.fileList = null;\n            window.onbeforeunload = null;\n            $('#delete-day').attr('disabled', null);\n            $('#first-view').attr('disabled', null);\n            if ($('#zip-files').is(':checked') && window.zip === null) {\n                $('label[for=\"zip-files\"]').click();\n            }\n        }\n        if ($('#results li').length === 0 && window.fileList === null) {\n            $('#results').hide();\n        }\n    } else {\n        var i                 = data.i;\n        var sent_delay        = data.sent_delay;\n        var del_at_first_view = data.del_at_first_view;\n        if (data.success) {\n            var j          = data.j;\n            var delay      = data.delay;\n            var parts      = data.parts;\n            var short      = data.short;\n            var created_at = data.created_at;\n\n            console.log(`getting response for slice ${j + 1}/${parts} of file ${data.name} (${data.duration} sec)`);\n\n            var dp    = $(`#progress-${window.fc}`);\n            var key   = dp.attr('data-key');\n\n            if (j + 1 === parts) {\n                //\n                window.ws.onclose = function() {\n                    console.log('Connection is closed.');\n                };\n                window.ws.onerror = function() {\n                    console.log('Error on WebSocket connection but file has been fully send, so we don’t care.');\n                }\n\n                notify(i18n.fileUploaded, data.name);\n\n                $(`#parts-${window.fc}`).remove();\n                var n       = $(`#name-${window.fc}`);\n                var s       = $(`#size-${window.fc}`);\n                var d       = $('<div>');\n                var url     = `${baseURL}r/${short}#${key}`;\n                var del_url = `${actionURL}d/${short}/${data.token}`;\n                var links   = encodeURIComponent(`[\"${short}\"]`);\n                var limit   = (delay === 0) ? i18n.noLimit : `${i18n.expiration} ${formatDate(delay * 86400 + created_at)}`;\n                if (!isGuest) {\n                    n.html(`${n.html()} ${s.html()} <a href=\"${actionURL}m?links=${links}\"><i class=\"mdi-communication-email\"></i></a><br>${limit}`);\n                    d.html(`<div class=\"card-action\">\n                                <div class=\"input-field\">\n                                    <span class=\"prefix big-prefix\">\n                                        <a href=\"${url}\" target=\"_blank\">\n                                            <i class=\"mdi-file-file-download small\" title=\"${i18n.dlText}\"></i>\n                                        </a>\n                                        <a href=\"#\" id=\"copyurl-${window.fc}\" title=\"${i18n.cpText}\">\n                                            <i class=\"mdi-content-content-copy small\"></i>\n                                        </a>\n                                    </span>\n                                    <input id=\"${short}\" class=\"form-control link-input white-background\" value=\"${url}\" readonly=\"\" type=\"text\">\n                                    <label class=\"active\" for=\"${short}\">${i18n.dlText}</label>\n                                </div>\n                                <div class=\"input-field\">\n                                    <a href=\"${del_url}\" target=\"_blank\" class=\"prefix big-prefix\">\n                                        <i class=\"mdi-action-delete small\" title=\"${i18n.delText}\"></i>\n                                    </a>\n                                    <input id=\"delete-${short}\" class=\"form-control white-background\" value=\"${del_url}\" readonly=\"\" type=\"text\">\n                                    <label class=\"active\" for=\"delete-${short}\">${i18n.delText}</label>\n                                </div>\n                            </div>`);\n                } else {\n                    n.html(`${n.html()} ${s.html()}`);\n                }\n                s.remove();\n\n                var p2 = dp.parent();\n                var p1 = p2.parent();\n\n                p2.remove();\n                p1.append(d);\n\n                $(`#copyurl-${window.fc}`).on('click', function(e) {\n                    e.preventDefault();\n                    copyToClipboard(url);\n                });\n                $(\"input[type='text']\").on(\"click\", function () {\n                    $(this).select();\n                });\n                // Add copy all and mailto buttons\n                var misc = $('#misc');\n                if (misc.html() === '' && !isGuest) {\n                    misc.html(`<a href=\"#\"\n                                  id=\"copyall\"\n                                  class=\"btn btn-info\">${i18n.copyAll}</a>\n                               <a id=\"mailto\"\n                                  href=\"${actionURL}m?links=${links}\"\n                                  class=\"btn btn-info\">${i18n.mailTo}</a>`);\n                    $('#copyall').on('click', copyAllToClipboard);\n                } else {\n                    updateMailLink();\n                }\n\n                // Add the file to localStorage\n                if (!isGuest) {\n                    addItem(data.name, url, data.size, del_at_first_view, created_at, delay, data.short, data.token);\n                }\n\n                if (isGuest && short !== null) {\n                    window.filesURLs.push(JSON.stringify({ name: data.name, short: data.short, url: url, size: data.size, created_at: created_at, delay: delay, token: data.token }));\n                }\n\n                // Upload next file\n                window.fc++;\n                i++;\n                if (i < window.fileList.length) {\n                    uploadFile(i, sent_delay, del_at_first_view);\n                } else {\n                    // We have finished\n                    window.fileList = null;\n                    window.onbeforeunload = null;\n                    $('#delete-day').attr('disabled', null);\n                    $('#first-view').attr('disabled', null);\n                    if ($('#zip-files').is(':checked') && window.zip === null) {\n                        $('label[for=\"zip-files\"]').click();\n                    }\n                    if (isGuest) {\n                        sendFilesURLs();\n                    }\n                }\n                if ($('#results li').length === 0 && window.fileList === null) {\n                    $('#results').hide();\n                }\n            } else {\n                j++;\n                // Update progress bar\n                var percent = Math.round(1000 * j/parts)/10;\n                var wClass  = percent.toString().replace('.', '-');\n                dp.removeClass();\n                dp.addClass('determinate');\n                dp.addClass(`width-${wClass}`);\n                dp.attr('aria-valuenow', percent);\n\n                // Encrypt and upload next slice\n                sliceAndUpload(key, i, parts, j, delay, del_at_first_view, short, data.token);\n            }\n        } else {\n            addAlertOnFile(data.msg, i, delay, del_at_first_view);\n            if (isGuest) {\n                sendFilesURLs();\n            }\n        }\n    }\n}\n\n\n\n// Write message instead in a file block\nfunction addAlertOnFile(msg, i, sent_delay, del_at_first_view) {\n    var n       = $(`#name-${window.fc}`);\n    var p       = $(`#progress-${window.fc}`);\n    var d       = $('<div>');\n\n    p.parent().remove();\n    d.addClass('card pink');\n    d.html(`<div class=\"card-content white-text\">\n                <strong>${msg}</strong>\n            </div>`);\n    n.parent().append(d);\n\n    // Upload next file\n    window.fc++;\n    i++;\n    if (i < window.fileList.length) {\n        uploadFile(i, sent_delay, del_at_first_view);\n    } else {\n        // We have finished\n        window.onbeforeunload = null;\n        $('#zip-files').attr('disabled', null);\n        $('#delete-day').attr('disabled', null);\n        $('#first-view').attr('disabled', null);\n    }\n}\n\n// Dropzone events functions\nfunction handleDrop(evt) {\n    evt.stopPropagation();\n    evt.preventDefault();\n\n    var f = evt.dataTransfer.files; // FileList object\n    handleFiles(f);\n}\nfunction handleDragOver(evt) {\n    evt.stopPropagation();\n    evt.preventDefault();\n    evt.dataTransfer.dropEffect = 'copy'; // Explicitly show this is a copy.\n}\n\n// Spawn websocket\nfunction spawnWebsocket(i, callback) {\n    if (i === undefined || i === null) {\n        i = 0;\n    }\n    var ws       = new WebSocket(ws_url);\n    ws.onopen    = function() {\n        console.log('Connection is established!');\n        if (callback !== undefined) {\n            callback();\n        }\n    };\n    ws.onclose   = function() {\n        console.log('Connection is closed.');\n    }\n    ws.onmessage = function(e) {\n        updateProgressBar(JSON.parse(e.data));\n    }\n    ws.onerror = function() {\n        console.log('error');\n        if (i < 5 && callback !== undefined) {\n            console.log(`Retrying to send file (try ${i} of 5)`);\n            window.ws = spawnWebsocket(i + 1, callback);\n        }\n    }\n    return ws;\n}\n\n// Dropzone events binding\nfunction bindDropZone() {\n    var dropZone = document.getElementById('files');\n    dropZone.addEventListener('dragover', handleDragOver, false);\n    dropZone.addEventListener('drop', handleDrop, false);\n    $('#file-browser-span').removeClass('disabled');\n    $('#file-browser-span').addClass('cyan');\n    $('#file-browser-button').attr('disabled', null);\n    $('#file-browser-button').on('change', function(e) {\n        handleFiles(this.files);\n    });\n}\n\n// When it's ready\n$(document).ready(function() {\n    $('#zip-files').prop('checked', false);\n    $('#first-view').prop('checked', false);\n    $('#zipname').val('documents.zip');\n    if (!sjcl.random.isReady(10)) {\n        var loop = setInterval(function() {\n            if (!sjcl.random.isReady(10)) {\n                $('#not-enough-entropy').removeClass('hiddendiv');\n            } else {\n                $('#not-enough-entropy').addClass('hiddendiv');\n                bindDropZone();\n                clearInterval(loop);\n            }\n        }, 1000);\n    } else {\n        bindDropZone();\n    }\n    if (maxSize > 0) {\n        $('#max-file-size').text(i18n.maxSize.replace('XXX', filesize(maxSize)));\n    }\n    $('label[for=\"first-view\"]').on('click', firstViewClicking);\n    $('label[for=\"zip-files\"]').on('click', zipClicking);\n    $('#zipname').on('input', updateZipname);\n    $('#uploadZip').on('click', uploadZip);\n    $('#reset-zipping').on('click', function() {\n        window.zip = null;\n        $('label[for=\"zip-files\"]').click();\n        $('#zip-files').attr('disabled', null);\n        $('#zip-compressing').addClass('hide');\n        $('#file-browser-button').attr('disabled', null);\n        $('#file-browser-span').removeClass('disabled');\n        $('#files').removeClass('m6').addClass('m12');\n    });\n});\n"
  },
  {
    "path": "themes/default/public/js/materialize.js",
    "content": "// Check for jQuery.\nif (typeof(jQuery) === 'undefined') {\n  var jQuery = $ = require('jQuery');\n};/*\n * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/\n *\n * Uses the built in easing capabilities added In jQuery 1.1\n * to offer multiple easing options\n *\n * TERMS OF USE - jQuery Easing\n *\n * Open source under the BSD License.\n *\n * Copyright © 2008 George McGinley Smith\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n *\n * Neither the name of the author nor the names of contributors may be used to endorse\n * or promote products derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE\n *  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED\n * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n * OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n*/\n\n// t: current time, b: begInnIng value, c: change In value, d: duration\njQuery.easing['jswing'] = jQuery.easing['swing'];\n\njQuery.extend( jQuery.easing,\n{\n\tdef: 'easeOutQuad',\n\tswing: function (x, t, b, c, d) {\n\t\t//alert(jQuery.easing.default);\n\t\treturn jQuery.easing[jQuery.easing.def](x, t, b, c, d);\n\t},\n\teaseInQuad: function (x, t, b, c, d) {\n\t\treturn c*(t/=d)*t + b;\n\t},\n\teaseOutQuad: function (x, t, b, c, d) {\n\t\treturn -c *(t/=d)*(t-2) + b;\n\t},\n\teaseInOutQuad: function (x, t, b, c, d) {\n\t\tif ((t/=d/2) < 1) return c/2*t*t + b;\n\t\treturn -c/2 * ((--t)*(t-2) - 1) + b;\n\t},\n\teaseInCubic: function (x, t, b, c, d) {\n\t\treturn c*(t/=d)*t*t + b;\n\t},\n\teaseOutCubic: function (x, t, b, c, d) {\n\t\treturn c*((t=t/d-1)*t*t + 1) + b;\n\t},\n\teaseInOutCubic: function (x, t, b, c, d) {\n\t\tif ((t/=d/2) < 1) return c/2*t*t*t + b;\n\t\treturn c/2*((t-=2)*t*t + 2) + b;\n\t},\n\teaseInQuart: function (x, t, b, c, d) {\n\t\treturn c*(t/=d)*t*t*t + b;\n\t},\n\teaseOutQuart: function (x, t, b, c, d) {\n\t\treturn -c * ((t=t/d-1)*t*t*t - 1) + b;\n\t},\n\teaseInOutQuart: function (x, t, b, c, d) {\n\t\tif ((t/=d/2) < 1) return c/2*t*t*t*t + b;\n\t\treturn -c/2 * ((t-=2)*t*t*t - 2) + b;\n\t},\n\teaseInQuint: function (x, t, b, c, d) {\n\t\treturn c*(t/=d)*t*t*t*t + b;\n\t},\n\teaseOutQuint: function (x, t, b, c, d) {\n\t\treturn c*((t=t/d-1)*t*t*t*t + 1) + b;\n\t},\n\teaseInOutQuint: function (x, t, b, c, d) {\n\t\tif ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;\n\t\treturn c/2*((t-=2)*t*t*t*t + 2) + b;\n\t},\n\teaseInSine: function (x, t, b, c, d) {\n\t\treturn -c * Math.cos(t/d * (Math.PI/2)) + c + b;\n\t},\n\teaseOutSine: function (x, t, b, c, d) {\n\t\treturn c * Math.sin(t/d * (Math.PI/2)) + b;\n\t},\n\teaseInOutSine: function (x, t, b, c, d) {\n\t\treturn -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;\n\t},\n\teaseInExpo: function (x, t, b, c, d) {\n\t\treturn (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;\n\t},\n\teaseOutExpo: function (x, t, b, c, d) {\n\t\treturn (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;\n\t},\n\teaseInOutExpo: function (x, t, b, c, d) {\n\t\tif (t==0) return b;\n\t\tif (t==d) return b+c;\n\t\tif ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;\n\t\treturn c/2 * (-Math.pow(2, -10 * --t) + 2) + b;\n\t},\n\teaseInCirc: function (x, t, b, c, d) {\n\t\treturn -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b;\n\t},\n\teaseOutCirc: function (x, t, b, c, d) {\n\t\treturn c * Math.sqrt(1 - (t=t/d-1)*t) + b;\n\t},\n\teaseInOutCirc: function (x, t, b, c, d) {\n\t\tif ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;\n\t\treturn c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;\n\t},\n\teaseInElastic: function (x, t, b, c, d) {\n\t\tvar s=1.70158;var p=0;var a=c;\n\t\tif (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;\n\t\tif (a < Math.abs(c)) { a=c; var s=p/4; }\n\t\telse var s = p/(2*Math.PI) * Math.asin (c/a);\n\t\treturn -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;\n\t},\n\teaseOutElastic: function (x, t, b, c, d) {\n\t\tvar s=1.70158;var p=0;var a=c;\n\t\tif (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;\n\t\tif (a < Math.abs(c)) { a=c; var s=p/4; }\n\t\telse var s = p/(2*Math.PI) * Math.asin (c/a);\n\t\treturn a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;\n\t},\n\teaseInOutElastic: function (x, t, b, c, d) {\n\t\tvar s=1.70158;var p=0;var a=c;\n\t\tif (t==0) return b;  if ((t/=d/2)==2) return b+c;  if (!p) p=d*(.3*1.5);\n\t\tif (a < Math.abs(c)) { a=c; var s=p/4; }\n\t\telse var s = p/(2*Math.PI) * Math.asin (c/a);\n\t\tif (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;\n\t\treturn a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;\n\t},\n\teaseInBack: function (x, t, b, c, d, s) {\n\t\tif (s == undefined) s = 1.70158;\n\t\treturn c*(t/=d)*t*((s+1)*t - s) + b;\n\t},\n\teaseOutBack: function (x, t, b, c, d, s) {\n\t\tif (s == undefined) s = 1.70158;\n\t\treturn c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;\n\t},\n\teaseInOutBack: function (x, t, b, c, d, s) {\n\t\tif (s == undefined) s = 1.70158;\n\t\tif ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;\n\t\treturn c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;\n\t},\n\teaseInBounce: function (x, t, b, c, d) {\n\t\treturn c - jQuery.easing.easeOutBounce (x, d-t, 0, c, d) + b;\n\t},\n\teaseOutBounce: function (x, t, b, c, d) {\n\t\tif ((t/=d) < (1/2.75)) {\n\t\t\treturn c*(7.5625*t*t) + b;\n\t\t} else if (t < (2/2.75)) {\n\t\t\treturn c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;\n\t\t} else if (t < (2.5/2.75)) {\n\t\t\treturn c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;\n\t\t} else {\n\t\t\treturn c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;\n\t\t}\n\t},\n\teaseInOutBounce: function (x, t, b, c, d) {\n\t\tif (t < d/2) return jQuery.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b;\n\t\treturn jQuery.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b;\n\t}\n});\n\n/*\n *\n * TERMS OF USE - EASING EQUATIONS\n *\n * Open source under the BSD License.\n *\n * Copyright © 2001 Robert Penner\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n *\n * Neither the name of the author nor the names of contributors may be used to endorse\n * or promote products derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE\n *  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED\n * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n * OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n */;    // Custom Easing\n    jQuery.extend( jQuery.easing,\n    {\n      easeInOutMaterial: function (x, t, b, c, d) {\n        if ((t/=d/2) < 1) return c/2*t*t + b;\n        return c/4*((t-=2)*t*t + 2) + b;\n      }\n    });\n\n;/*! VelocityJS.org (1.2.3). (C) 2014 Julian Shapiro. MIT @license: en.wikipedia.org/wiki/MIT_License */\n/*! VelocityJS.org jQuery Shim (1.0.1). (C) 2014 The jQuery Foundation. MIT @license: en.wikipedia.org/wiki/MIT_License. */\n/*! Note that this has been modified by Materialize to confirm that Velocity is not already being imported. */\njQuery.Velocity?console.log(\"Velocity is already loaded. You may be needlessly importing Velocity again; note that Materialize includes Velocity.\"):(!function(e){function t(e){var t=e.length,a=r.type(e);return\"function\"===a||r.isWindow(e)?!1:1===e.nodeType&&t?!0:\"array\"===a||0===t||\"number\"==typeof t&&t>0&&t-1 in e}if(!e.jQuery){var r=function(e,t){return new r.fn.init(e,t)};r.isWindow=function(e){return null!=e&&e==e.window},r.type=function(e){return null==e?e+\"\":\"object\"==typeof e||\"function\"==typeof e?n[i.call(e)]||\"object\":typeof e},r.isArray=Array.isArray||function(e){return\"array\"===r.type(e)},r.isPlainObject=function(e){var t;if(!e||\"object\"!==r.type(e)||e.nodeType||r.isWindow(e))return!1;try{if(e.constructor&&!o.call(e,\"constructor\")&&!o.call(e.constructor.prototype,\"isPrototypeOf\"))return!1}catch(a){return!1}for(t in e);return void 0===t||o.call(e,t)},r.each=function(e,r,a){var n,o=0,i=e.length,s=t(e);if(a){if(s)for(;i>o&&(n=r.apply(e[o],a),n!==!1);o++);else for(o in e)if(n=r.apply(e[o],a),n===!1)break}else if(s)for(;i>o&&(n=r.call(e[o],o,e[o]),n!==!1);o++);else for(o in e)if(n=r.call(e[o],o,e[o]),n===!1)break;return e},r.data=function(e,t,n){if(void 0===n){var o=e[r.expando],i=o&&a[o];if(void 0===t)return i;if(i&&t in i)return i[t]}else if(void 0!==t){var o=e[r.expando]||(e[r.expando]=++r.uuid);return a[o]=a[o]||{},a[o][t]=n,n}},r.removeData=function(e,t){var n=e[r.expando],o=n&&a[n];o&&r.each(t,function(e,t){delete o[t]})},r.extend=function(){var e,t,a,n,o,i,s=arguments[0]||{},l=1,u=arguments.length,c=!1;for(\"boolean\"==typeof s&&(c=s,s=arguments[l]||{},l++),\"object\"!=typeof s&&\"function\"!==r.type(s)&&(s={}),l===u&&(s=this,l--);u>l;l++)if(null!=(o=arguments[l]))for(n in o)e=s[n],a=o[n],s!==a&&(c&&a&&(r.isPlainObject(a)||(t=r.isArray(a)))?(t?(t=!1,i=e&&r.isArray(e)?e:[]):i=e&&r.isPlainObject(e)?e:{},s[n]=r.extend(c,i,a)):void 0!==a&&(s[n]=a));return s},r.queue=function(e,a,n){function o(e,r){var a=r||[];return null!=e&&(t(Object(e))?!function(e,t){for(var r=+t.length,a=0,n=e.length;r>a;)e[n++]=t[a++];if(r!==r)for(;void 0!==t[a];)e[n++]=t[a++];return e.length=n,e}(a,\"string\"==typeof e?[e]:e):[].push.call(a,e)),a}if(e){a=(a||\"fx\")+\"queue\";var i=r.data(e,a);return n?(!i||r.isArray(n)?i=r.data(e,a,o(n)):i.push(n),i):i||[]}},r.dequeue=function(e,t){r.each(e.nodeType?[e]:e,function(e,a){t=t||\"fx\";var n=r.queue(a,t),o=n.shift();\"inprogress\"===o&&(o=n.shift()),o&&(\"fx\"===t&&n.unshift(\"inprogress\"),o.call(a,function(){r.dequeue(a,t)}))})},r.fn=r.prototype={init:function(e){if(e.nodeType)return this[0]=e,this;throw new Error(\"Not a DOM node.\")},offset:function(){var t=this[0].getBoundingClientRect?this[0].getBoundingClientRect():{top:0,left:0};return{top:t.top+(e.pageYOffset||document.scrollTop||0)-(document.clientTop||0),left:t.left+(e.pageXOffset||document.scrollLeft||0)-(document.clientLeft||0)}},position:function(){function e(){for(var e=this.offsetParent||document;e&&\"html\"===!e.nodeType.toLowerCase&&\"static\"===e.style.position;)e=e.offsetParent;return e||document}var t=this[0],e=e.apply(t),a=this.offset(),n=/^(?:body|html)$/i.test(e.nodeName)?{top:0,left:0}:r(e).offset();return a.top-=parseFloat(t.style.marginTop)||0,a.left-=parseFloat(t.style.marginLeft)||0,e.style&&(n.top+=parseFloat(e.style.borderTopWidth)||0,n.left+=parseFloat(e.style.borderLeftWidth)||0),{top:a.top-n.top,left:a.left-n.left}}};var a={};r.expando=\"velocity\"+(new Date).getTime(),r.uuid=0;for(var n={},o=n.hasOwnProperty,i=n.toString,s=\"Boolean Number String Function Array Date RegExp Object Error\".split(\" \"),l=0;l<s.length;l++)n[\"[object \"+s[l]+\"]\"]=s[l].toLowerCase();r.fn.init.prototype=r.fn,e.Velocity={Utilities:r}}}(window),function(e){\"object\"==typeof module&&\"object\"==typeof module.exports?module.exports=e():\"function\"==typeof define&&define.amd?define(e):e()}(function(){return function(e,t,r,a){function n(e){for(var t=-1,r=e?e.length:0,a=[];++t<r;){var n=e[t];n&&a.push(n)}return a}function o(e){return m.isWrapped(e)?e=[].slice.call(e):m.isNode(e)&&(e=[e]),e}function i(e){var t=f.data(e,\"velocity\");return null===t?a:t}function s(e){return function(t){return Math.round(t*e)*(1/e)}}function l(e,r,a,n){function o(e,t){return 1-3*t+3*e}function i(e,t){return 3*t-6*e}function s(e){return 3*e}function l(e,t,r){return((o(t,r)*e+i(t,r))*e+s(t))*e}function u(e,t,r){return 3*o(t,r)*e*e+2*i(t,r)*e+s(t)}function c(t,r){for(var n=0;m>n;++n){var o=u(r,e,a);if(0===o)return r;var i=l(r,e,a)-t;r-=i/o}return r}function p(){for(var t=0;b>t;++t)w[t]=l(t*x,e,a)}function f(t,r,n){var o,i,s=0;do i=r+(n-r)/2,o=l(i,e,a)-t,o>0?n=i:r=i;while(Math.abs(o)>h&&++s<v);return i}function d(t){for(var r=0,n=1,o=b-1;n!=o&&w[n]<=t;++n)r+=x;--n;var i=(t-w[n])/(w[n+1]-w[n]),s=r+i*x,l=u(s,e,a);return l>=y?c(t,s):0==l?s:f(t,r,r+x)}function g(){V=!0,(e!=r||a!=n)&&p()}var m=4,y=.001,h=1e-7,v=10,b=11,x=1/(b-1),S=\"Float32Array\"in t;if(4!==arguments.length)return!1;for(var P=0;4>P;++P)if(\"number\"!=typeof arguments[P]||isNaN(arguments[P])||!isFinite(arguments[P]))return!1;e=Math.min(e,1),a=Math.min(a,1),e=Math.max(e,0),a=Math.max(a,0);var w=S?new Float32Array(b):new Array(b),V=!1,C=function(t){return V||g(),e===r&&a===n?t:0===t?0:1===t?1:l(d(t),r,n)};C.getControlPoints=function(){return[{x:e,y:r},{x:a,y:n}]};var T=\"generateBezier(\"+[e,r,a,n]+\")\";return C.toString=function(){return T},C}function u(e,t){var r=e;return m.isString(e)?b.Easings[e]||(r=!1):r=m.isArray(e)&&1===e.length?s.apply(null,e):m.isArray(e)&&2===e.length?x.apply(null,e.concat([t])):m.isArray(e)&&4===e.length?l.apply(null,e):!1,r===!1&&(r=b.Easings[b.defaults.easing]?b.defaults.easing:v),r}function c(e){if(e){var t=(new Date).getTime(),r=b.State.calls.length;r>1e4&&(b.State.calls=n(b.State.calls));for(var o=0;r>o;o++)if(b.State.calls[o]){var s=b.State.calls[o],l=s[0],u=s[2],d=s[3],g=!!d,y=null;d||(d=b.State.calls[o][3]=t-16);for(var h=Math.min((t-d)/u.duration,1),v=0,x=l.length;x>v;v++){var P=l[v],V=P.element;if(i(V)){var C=!1;if(u.display!==a&&null!==u.display&&\"none\"!==u.display){if(\"flex\"===u.display){var T=[\"-webkit-box\",\"-moz-box\",\"-ms-flexbox\",\"-webkit-flex\"];f.each(T,function(e,t){S.setPropertyValue(V,\"display\",t)})}S.setPropertyValue(V,\"display\",u.display)}u.visibility!==a&&\"hidden\"!==u.visibility&&S.setPropertyValue(V,\"visibility\",u.visibility);for(var k in P)if(\"element\"!==k){var A,F=P[k],j=m.isString(F.easing)?b.Easings[F.easing]:F.easing;if(1===h)A=F.endValue;else{var E=F.endValue-F.startValue;if(A=F.startValue+E*j(h,u,E),!g&&A===F.currentValue)continue}if(F.currentValue=A,\"tween\"===k)y=A;else{if(S.Hooks.registered[k]){var H=S.Hooks.getRoot(k),N=i(V).rootPropertyValueCache[H];N&&(F.rootPropertyValue=N)}var L=S.setPropertyValue(V,k,F.currentValue+(0===parseFloat(A)?\"\":F.unitType),F.rootPropertyValue,F.scrollData);S.Hooks.registered[k]&&(i(V).rootPropertyValueCache[H]=S.Normalizations.registered[H]?S.Normalizations.registered[H](\"extract\",null,L[1]):L[1]),\"transform\"===L[0]&&(C=!0)}}u.mobileHA&&i(V).transformCache.translate3d===a&&(i(V).transformCache.translate3d=\"(0px, 0px, 0px)\",C=!0),C&&S.flushTransformCache(V)}}u.display!==a&&\"none\"!==u.display&&(b.State.calls[o][2].display=!1),u.visibility!==a&&\"hidden\"!==u.visibility&&(b.State.calls[o][2].visibility=!1),u.progress&&u.progress.call(s[1],s[1],h,Math.max(0,d+u.duration-t),d,y),1===h&&p(o)}}b.State.isTicking&&w(c)}function p(e,t){if(!b.State.calls[e])return!1;for(var r=b.State.calls[e][0],n=b.State.calls[e][1],o=b.State.calls[e][2],s=b.State.calls[e][4],l=!1,u=0,c=r.length;c>u;u++){var p=r[u].element;if(t||o.loop||(\"none\"===o.display&&S.setPropertyValue(p,\"display\",o.display),\"hidden\"===o.visibility&&S.setPropertyValue(p,\"visibility\",o.visibility)),o.loop!==!0&&(f.queue(p)[1]===a||!/\\.velocityQueueEntryFlag/i.test(f.queue(p)[1]))&&i(p)){i(p).isAnimating=!1,i(p).rootPropertyValueCache={};var d=!1;f.each(S.Lists.transforms3D,function(e,t){var r=/^scale/.test(t)?1:0,n=i(p).transformCache[t];i(p).transformCache[t]!==a&&new RegExp(\"^\\\\(\"+r+\"[^.]\").test(n)&&(d=!0,delete i(p).transformCache[t])}),o.mobileHA&&(d=!0,delete i(p).transformCache.translate3d),d&&S.flushTransformCache(p),S.Values.removeClass(p,\"velocity-animating\")}if(!t&&o.complete&&!o.loop&&u===c-1)try{o.complete.call(n,n)}catch(g){setTimeout(function(){throw g},1)}s&&o.loop!==!0&&s(n),i(p)&&o.loop===!0&&!t&&(f.each(i(p).tweensContainer,function(e,t){/^rotate/.test(e)&&360===parseFloat(t.endValue)&&(t.endValue=0,t.startValue=360),/^backgroundPosition/.test(e)&&100===parseFloat(t.endValue)&&\"%\"===t.unitType&&(t.endValue=0,t.startValue=100)}),b(p,\"reverse\",{loop:!0,delay:o.delay})),o.queue!==!1&&f.dequeue(p,o.queue)}b.State.calls[e]=!1;for(var m=0,y=b.State.calls.length;y>m;m++)if(b.State.calls[m]!==!1){l=!0;break}l===!1&&(b.State.isTicking=!1,delete b.State.calls,b.State.calls=[])}var f,d=function(){if(r.documentMode)return r.documentMode;for(var e=7;e>4;e--){var t=r.createElement(\"div\");if(t.innerHTML=\"<!--[if IE \"+e+\"]><span></span><![endif]-->\",t.getElementsByTagName(\"span\").length)return t=null,e}return a}(),g=function(){var e=0;return t.webkitRequestAnimationFrame||t.mozRequestAnimationFrame||function(t){var r,a=(new Date).getTime();return r=Math.max(0,16-(a-e)),e=a+r,setTimeout(function(){t(a+r)},r)}}(),m={isString:function(e){return\"string\"==typeof e},isArray:Array.isArray||function(e){return\"[object Array]\"===Object.prototype.toString.call(e)},isFunction:function(e){return\"[object Function]\"===Object.prototype.toString.call(e)},isNode:function(e){return e&&e.nodeType},isNodeList:function(e){return\"object\"==typeof e&&/^\\[object (HTMLCollection|NodeList|Object)\\]$/.test(Object.prototype.toString.call(e))&&e.length!==a&&(0===e.length||\"object\"==typeof e[0]&&e[0].nodeType>0)},isWrapped:function(e){return e&&(e.jquery||t.Zepto&&t.Zepto.zepto.isZ(e))},isSVG:function(e){return t.SVGElement&&e instanceof t.SVGElement},isEmptyObject:function(e){for(var t in e)return!1;return!0}},y=!1;if(e.fn&&e.fn.jquery?(f=e,y=!0):f=t.Velocity.Utilities,8>=d&&!y)throw new Error(\"Velocity: IE8 and below require jQuery to be loaded before Velocity.\");if(7>=d)return void(jQuery.fn.velocity=jQuery.fn.animate);var h=400,v=\"swing\",b={State:{isMobile:/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),isAndroid:/Android/i.test(navigator.userAgent),isGingerbread:/Android 2\\.3\\.[3-7]/i.test(navigator.userAgent),isChrome:t.chrome,isFirefox:/Firefox/i.test(navigator.userAgent),prefixElement:r.createElement(\"div\"),prefixMatches:{},scrollAnchor:null,scrollPropertyLeft:null,scrollPropertyTop:null,isTicking:!1,calls:[]},CSS:{},Utilities:f,Redirects:{},Easings:{},Promise:t.Promise,defaults:{queue:\"\",duration:h,easing:v,begin:a,complete:a,progress:a,display:a,visibility:a,loop:!1,delay:!1,mobileHA:!0,_cacheValues:!0},init:function(e){f.data(e,\"velocity\",{isSVG:m.isSVG(e),isAnimating:!1,computedStyle:null,tweensContainer:null,rootPropertyValueCache:{},transformCache:{}})},hook:null,mock:!1,version:{major:1,minor:2,patch:2},debug:!1};t.pageYOffset!==a?(b.State.scrollAnchor=t,b.State.scrollPropertyLeft=\"pageXOffset\",b.State.scrollPropertyTop=\"pageYOffset\"):(b.State.scrollAnchor=r.documentElement||r.body.parentNode||r.body,b.State.scrollPropertyLeft=\"scrollLeft\",b.State.scrollPropertyTop=\"scrollTop\");var x=function(){function e(e){return-e.tension*e.x-e.friction*e.v}function t(t,r,a){var n={x:t.x+a.dx*r,v:t.v+a.dv*r,tension:t.tension,friction:t.friction};return{dx:n.v,dv:e(n)}}function r(r,a){var n={dx:r.v,dv:e(r)},o=t(r,.5*a,n),i=t(r,.5*a,o),s=t(r,a,i),l=1/6*(n.dx+2*(o.dx+i.dx)+s.dx),u=1/6*(n.dv+2*(o.dv+i.dv)+s.dv);return r.x=r.x+l*a,r.v=r.v+u*a,r}return function a(e,t,n){var o,i,s,l={x:-1,v:0,tension:null,friction:null},u=[0],c=0,p=1e-4,f=.016;for(e=parseFloat(e)||500,t=parseFloat(t)||20,n=n||null,l.tension=e,l.friction=t,o=null!==n,o?(c=a(e,t),i=c/n*f):i=f;s=r(s||l,i),u.push(1+s.x),c+=16,Math.abs(s.x)>p&&Math.abs(s.v)>p;);return o?function(e){return u[e*(u.length-1)|0]}:c}}();b.Easings={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},spring:function(e){return 1-Math.cos(4.5*e*Math.PI)*Math.exp(6*-e)}},f.each([[\"ease\",[.25,.1,.25,1]],[\"ease-in\",[.42,0,1,1]],[\"ease-out\",[0,0,.58,1]],[\"ease-in-out\",[.42,0,.58,1]],[\"easeInSine\",[.47,0,.745,.715]],[\"easeOutSine\",[.39,.575,.565,1]],[\"easeInOutSine\",[.445,.05,.55,.95]],[\"easeInQuad\",[.55,.085,.68,.53]],[\"easeOutQuad\",[.25,.46,.45,.94]],[\"easeInOutQuad\",[.455,.03,.515,.955]],[\"easeInCubic\",[.55,.055,.675,.19]],[\"easeOutCubic\",[.215,.61,.355,1]],[\"easeInOutCubic\",[.645,.045,.355,1]],[\"easeInQuart\",[.895,.03,.685,.22]],[\"easeOutQuart\",[.165,.84,.44,1]],[\"easeInOutQuart\",[.77,0,.175,1]],[\"easeInQuint\",[.755,.05,.855,.06]],[\"easeOutQuint\",[.23,1,.32,1]],[\"easeInOutQuint\",[.86,0,.07,1]],[\"easeInExpo\",[.95,.05,.795,.035]],[\"easeOutExpo\",[.19,1,.22,1]],[\"easeInOutExpo\",[1,0,0,1]],[\"easeInCirc\",[.6,.04,.98,.335]],[\"easeOutCirc\",[.075,.82,.165,1]],[\"easeInOutCirc\",[.785,.135,.15,.86]]],function(e,t){b.Easings[t[0]]=l.apply(null,t[1])});var S=b.CSS={RegEx:{isHex:/^#([A-f\\d]{3}){1,2}$/i,valueUnwrap:/^[A-z]+\\((.*)\\)$/i,wrappedValueAlreadyExtracted:/[0-9.]+ [0-9.]+ [0-9.]+( [0-9.]+)?/,valueSplit:/([A-z]+\\(.+\\))|(([A-z0-9#-.]+?)(?=\\s|$))/gi},Lists:{colors:[\"fill\",\"stroke\",\"stopColor\",\"color\",\"backgroundColor\",\"borderColor\",\"borderTopColor\",\"borderRightColor\",\"borderBottomColor\",\"borderLeftColor\",\"outlineColor\"],transformsBase:[\"translateX\",\"translateY\",\"scale\",\"scaleX\",\"scaleY\",\"skewX\",\"skewY\",\"rotateZ\"],transforms3D:[\"transformPerspective\",\"translateZ\",\"scaleZ\",\"rotateX\",\"rotateY\"]},Hooks:{templates:{textShadow:[\"Color X Y Blur\",\"black 0px 0px 0px\"],boxShadow:[\"Color X Y Blur Spread\",\"black 0px 0px 0px 0px\"],clip:[\"Top Right Bottom Left\",\"0px 0px 0px 0px\"],backgroundPosition:[\"X Y\",\"0% 0%\"],transformOrigin:[\"X Y Z\",\"50% 50% 0px\"],perspectiveOrigin:[\"X Y\",\"50% 50%\"]},registered:{},register:function(){for(var e=0;e<S.Lists.colors.length;e++){var t=\"color\"===S.Lists.colors[e]?\"0 0 0 1\":\"255 255 255 1\";S.Hooks.templates[S.Lists.colors[e]]=[\"Red Green Blue Alpha\",t]}var r,a,n;if(d)for(r in S.Hooks.templates){a=S.Hooks.templates[r],n=a[0].split(\" \");var o=a[1].match(S.RegEx.valueSplit);\"Color\"===n[0]&&(n.push(n.shift()),o.push(o.shift()),S.Hooks.templates[r]=[n.join(\" \"),o.join(\" \")])}for(r in S.Hooks.templates){a=S.Hooks.templates[r],n=a[0].split(\" \");for(var e in n){var i=r+n[e],s=e;S.Hooks.registered[i]=[r,s]}}},getRoot:function(e){var t=S.Hooks.registered[e];return t?t[0]:e},cleanRootPropertyValue:function(e,t){return S.RegEx.valueUnwrap.test(t)&&(t=t.match(S.RegEx.valueUnwrap)[1]),S.Values.isCSSNullValue(t)&&(t=S.Hooks.templates[e][1]),t},extractValue:function(e,t){var r=S.Hooks.registered[e];if(r){var a=r[0],n=r[1];return t=S.Hooks.cleanRootPropertyValue(a,t),t.toString().match(S.RegEx.valueSplit)[n]}return t},injectValue:function(e,t,r){var a=S.Hooks.registered[e];if(a){var n,o,i=a[0],s=a[1];return r=S.Hooks.cleanRootPropertyValue(i,r),n=r.toString().match(S.RegEx.valueSplit),n[s]=t,o=n.join(\" \")}return r}},Normalizations:{registered:{clip:function(e,t,r){switch(e){case\"name\":return\"clip\";case\"extract\":var a;return S.RegEx.wrappedValueAlreadyExtracted.test(r)?a=r:(a=r.toString().match(S.RegEx.valueUnwrap),a=a?a[1].replace(/,(\\s+)?/g,\" \"):r),a;case\"inject\":return\"rect(\"+r+\")\"}},blur:function(e,t,r){switch(e){case\"name\":return b.State.isFirefox?\"filter\":\"-webkit-filter\";case\"extract\":var a=parseFloat(r);if(!a&&0!==a){var n=r.toString().match(/blur\\(([0-9]+[A-z]+)\\)/i);a=n?n[1]:0}return a;case\"inject\":return parseFloat(r)?\"blur(\"+r+\")\":\"none\"}},opacity:function(e,t,r){if(8>=d)switch(e){case\"name\":return\"filter\";case\"extract\":var a=r.toString().match(/alpha\\(opacity=(.*)\\)/i);return r=a?a[1]/100:1;case\"inject\":return t.style.zoom=1,parseFloat(r)>=1?\"\":\"alpha(opacity=\"+parseInt(100*parseFloat(r),10)+\")\"}else switch(e){case\"name\":return\"opacity\";case\"extract\":return r;case\"inject\":return r}}},register:function(){9>=d||b.State.isGingerbread||(S.Lists.transformsBase=S.Lists.transformsBase.concat(S.Lists.transforms3D));for(var e=0;e<S.Lists.transformsBase.length;e++)!function(){var t=S.Lists.transformsBase[e];S.Normalizations.registered[t]=function(e,r,n){switch(e){case\"name\":return\"transform\";case\"extract\":return i(r)===a||i(r).transformCache[t]===a?/^scale/i.test(t)?1:0:i(r).transformCache[t].replace(/[()]/g,\"\");case\"inject\":var o=!1;switch(t.substr(0,t.length-1)){case\"translate\":o=!/(%|px|em|rem|vw|vh|\\d)$/i.test(n);break;case\"scal\":case\"scale\":b.State.isAndroid&&i(r).transformCache[t]===a&&1>n&&(n=1),o=!/(\\d)$/i.test(n);break;case\"skew\":o=!/(deg|\\d)$/i.test(n);break;case\"rotate\":o=!/(deg|\\d)$/i.test(n)}return o||(i(r).transformCache[t]=\"(\"+n+\")\"),i(r).transformCache[t]}}}();for(var e=0;e<S.Lists.colors.length;e++)!function(){var t=S.Lists.colors[e];S.Normalizations.registered[t]=function(e,r,n){switch(e){case\"name\":return t;case\"extract\":var o;if(S.RegEx.wrappedValueAlreadyExtracted.test(n))o=n;else{var i,s={black:\"rgb(0, 0, 0)\",blue:\"rgb(0, 0, 255)\",gray:\"rgb(128, 128, 128)\",green:\"rgb(0, 128, 0)\",red:\"rgb(255, 0, 0)\",white:\"rgb(255, 255, 255)\"};/^[A-z]+$/i.test(n)?i=s[n]!==a?s[n]:s.black:S.RegEx.isHex.test(n)?i=\"rgb(\"+S.Values.hexToRgb(n).join(\" \")+\")\":/^rgba?\\(/i.test(n)||(i=s.black),o=(i||n).toString().match(S.RegEx.valueUnwrap)[1].replace(/,(\\s+)?/g,\" \")}return 8>=d||3!==o.split(\" \").length||(o+=\" 1\"),o;case\"inject\":return 8>=d?4===n.split(\" \").length&&(n=n.split(/\\s+/).slice(0,3).join(\" \")):3===n.split(\" \").length&&(n+=\" 1\"),(8>=d?\"rgb\":\"rgba\")+\"(\"+n.replace(/\\s+/g,\",\").replace(/\\.(\\d)+(?=,)/g,\"\")+\")\"}}}()}},Names:{camelCase:function(e){return e.replace(/-(\\w)/g,function(e,t){return t.toUpperCase()})},SVGAttribute:function(e){var t=\"width|height|x|y|cx|cy|r|rx|ry|x1|x2|y1|y2\";return(d||b.State.isAndroid&&!b.State.isChrome)&&(t+=\"|transform\"),new RegExp(\"^(\"+t+\")$\",\"i\").test(e)},prefixCheck:function(e){if(b.State.prefixMatches[e])return[b.State.prefixMatches[e],!0];for(var t=[\"\",\"Webkit\",\"Moz\",\"ms\",\"O\"],r=0,a=t.length;a>r;r++){var n;if(n=0===r?e:t[r]+e.replace(/^\\w/,function(e){return e.toUpperCase()}),m.isString(b.State.prefixElement.style[n]))return b.State.prefixMatches[e]=n,[n,!0]}return[e,!1]}},Values:{hexToRgb:function(e){var t,r=/^#?([a-f\\d])([a-f\\d])([a-f\\d])$/i,a=/^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i;return e=e.replace(r,function(e,t,r,a){return t+t+r+r+a+a}),t=a.exec(e),t?[parseInt(t[1],16),parseInt(t[2],16),parseInt(t[3],16)]:[0,0,0]},isCSSNullValue:function(e){return 0==e||/^(none|auto|transparent|(rgba\\(0, ?0, ?0, ?0\\)))$/i.test(e)},getUnitType:function(e){return/^(rotate|skew)/i.test(e)?\"deg\":/(^(scale|scaleX|scaleY|scaleZ|alpha|flexGrow|flexHeight|zIndex|fontWeight)$)|((opacity|red|green|blue|alpha)$)/i.test(e)?\"\":\"px\"},getDisplayType:function(e){var t=e&&e.tagName.toString().toLowerCase();return/^(b|big|i|small|tt|abbr|acronym|cite|code|dfn|em|kbd|strong|samp|var|a|bdo|br|img|map|object|q|script|span|sub|sup|button|input|label|select|textarea)$/i.test(t)?\"inline\":/^(li)$/i.test(t)?\"list-item\":/^(tr)$/i.test(t)?\"table-row\":/^(table)$/i.test(t)?\"table\":/^(tbody)$/i.test(t)?\"table-row-group\":\"block\"},addClass:function(e,t){e.classList?e.classList.add(t):e.className+=(e.className.length?\" \":\"\")+t},removeClass:function(e,t){e.classList?e.classList.remove(t):e.className=e.className.toString().replace(new RegExp(\"(^|\\\\s)\"+t.split(\" \").join(\"|\")+\"(\\\\s|$)\",\"gi\"),\" \")}},getPropertyValue:function(e,r,n,o){function s(e,r){function n(){u&&S.setPropertyValue(e,\"display\",\"none\")}var l=0;if(8>=d)l=f.css(e,r);else{var u=!1;if(/^(width|height)$/.test(r)&&0===S.getPropertyValue(e,\"display\")&&(u=!0,S.setPropertyValue(e,\"display\",S.Values.getDisplayType(e))),!o){if(\"height\"===r&&\"border-box\"!==S.getPropertyValue(e,\"boxSizing\").toString().toLowerCase()){var c=e.offsetHeight-(parseFloat(S.getPropertyValue(e,\"borderTopWidth\"))||0)-(parseFloat(S.getPropertyValue(e,\"borderBottomWidth\"))||0)-(parseFloat(S.getPropertyValue(e,\"paddingTop\"))||0)-(parseFloat(S.getPropertyValue(e,\"paddingBottom\"))||0);return n(),c}if(\"width\"===r&&\"border-box\"!==S.getPropertyValue(e,\"boxSizing\").toString().toLowerCase()){var p=e.offsetWidth-(parseFloat(S.getPropertyValue(e,\"borderLeftWidth\"))||0)-(parseFloat(S.getPropertyValue(e,\"borderRightWidth\"))||0)-(parseFloat(S.getPropertyValue(e,\"paddingLeft\"))||0)-(parseFloat(S.getPropertyValue(e,\"paddingRight\"))||0);return n(),p}}var g;g=i(e)===a?t.getComputedStyle(e,null):i(e).computedStyle?i(e).computedStyle:i(e).computedStyle=t.getComputedStyle(e,null),\"borderColor\"===r&&(r=\"borderTopColor\"),l=9===d&&\"filter\"===r?g.getPropertyValue(r):g[r],(\"\"===l||null===l)&&(l=e.style[r]),n()}if(\"auto\"===l&&/^(top|right|bottom|left)$/i.test(r)){var m=s(e,\"position\");(\"fixed\"===m||\"absolute\"===m&&/top|left/i.test(r))&&(l=f(e).position()[r]+\"px\")}return l}var l;if(S.Hooks.registered[r]){var u=r,c=S.Hooks.getRoot(u);n===a&&(n=S.getPropertyValue(e,S.Names.prefixCheck(c)[0])),S.Normalizations.registered[c]&&(n=S.Normalizations.registered[c](\"extract\",e,n)),l=S.Hooks.extractValue(u,n)}else if(S.Normalizations.registered[r]){var p,g;p=S.Normalizations.registered[r](\"name\",e),\"transform\"!==p&&(g=s(e,S.Names.prefixCheck(p)[0]),S.Values.isCSSNullValue(g)&&S.Hooks.templates[r]&&(g=S.Hooks.templates[r][1])),l=S.Normalizations.registered[r](\"extract\",e,g)}if(!/^[\\d-]/.test(l))if(i(e)&&i(e).isSVG&&S.Names.SVGAttribute(r))if(/^(height|width)$/i.test(r))try{l=e.getBBox()[r]}catch(m){l=0}else l=e.getAttribute(r);else l=s(e,S.Names.prefixCheck(r)[0]);return S.Values.isCSSNullValue(l)&&(l=0),b.debug>=2&&console.log(\"Get \"+r+\": \"+l),l},setPropertyValue:function(e,r,a,n,o){var s=r;if(\"scroll\"===r)o.container?o.container[\"scroll\"+o.direction]=a:\"Left\"===o.direction?t.scrollTo(a,o.alternateValue):t.scrollTo(o.alternateValue,a);else if(S.Normalizations.registered[r]&&\"transform\"===S.Normalizations.registered[r](\"name\",e))S.Normalizations.registered[r](\"inject\",e,a),s=\"transform\",a=i(e).transformCache[r];else{if(S.Hooks.registered[r]){var l=r,u=S.Hooks.getRoot(r);n=n||S.getPropertyValue(e,u),a=S.Hooks.injectValue(l,a,n),r=u}if(S.Normalizations.registered[r]&&(a=S.Normalizations.registered[r](\"inject\",e,a),r=S.Normalizations.registered[r](\"name\",e)),s=S.Names.prefixCheck(r)[0],8>=d)try{e.style[s]=a}catch(c){b.debug&&console.log(\"Browser does not support [\"+a+\"] for [\"+s+\"]\")}else i(e)&&i(e).isSVG&&S.Names.SVGAttribute(r)?e.setAttribute(r,a):e.style[s]=a;b.debug>=2&&console.log(\"Set \"+r+\" (\"+s+\"): \"+a)}return[s,a]},flushTransformCache:function(e){function t(t){return parseFloat(S.getPropertyValue(e,t))}var r=\"\";if((d||b.State.isAndroid&&!b.State.isChrome)&&i(e).isSVG){var a={translate:[t(\"translateX\"),t(\"translateY\")],skewX:[t(\"skewX\")],skewY:[t(\"skewY\")],scale:1!==t(\"scale\")?[t(\"scale\"),t(\"scale\")]:[t(\"scaleX\"),t(\"scaleY\")],rotate:[t(\"rotateZ\"),0,0]};f.each(i(e).transformCache,function(e){/^translate/i.test(e)?e=\"translate\":/^scale/i.test(e)?e=\"scale\":/^rotate/i.test(e)&&(e=\"rotate\"),a[e]&&(r+=e+\"(\"+a[e].join(\" \")+\") \",delete a[e])})}else{var n,o;f.each(i(e).transformCache,function(t){return n=i(e).transformCache[t],\"transformPerspective\"===t?(o=n,!0):(9===d&&\"rotateZ\"===t&&(t=\"rotate\"),void(r+=t+n+\" \"))}),o&&(r=\"perspective\"+o+\" \"+r)}S.setPropertyValue(e,\"transform\",r)}};S.Hooks.register(),S.Normalizations.register(),b.hook=function(e,t,r){var n=a;return e=o(e),f.each(e,function(e,o){if(i(o)===a&&b.init(o),r===a)n===a&&(n=b.CSS.getPropertyValue(o,t));else{var s=b.CSS.setPropertyValue(o,t,r);\"transform\"===s[0]&&b.CSS.flushTransformCache(o),n=s}}),n};var P=function(){function e(){return s?k.promise||null:l}function n(){function e(e){function p(e,t){var r=a,n=a,i=a;return m.isArray(e)?(r=e[0],!m.isArray(e[1])&&/^[\\d-]/.test(e[1])||m.isFunction(e[1])||S.RegEx.isHex.test(e[1])?i=e[1]:(m.isString(e[1])&&!S.RegEx.isHex.test(e[1])||m.isArray(e[1]))&&(n=t?e[1]:u(e[1],s.duration),e[2]!==a&&(i=e[2]))):r=e,t||(n=n||s.easing),m.isFunction(r)&&(r=r.call(o,V,w)),m.isFunction(i)&&(i=i.call(o,V,w)),[r||0,n,i]}function d(e,t){var r,a;return a=(t||\"0\").toString().toLowerCase().replace(/[%A-z]+$/,function(e){return r=e,\"\"}),r||(r=S.Values.getUnitType(e)),[a,r]}function h(){var e={myParent:o.parentNode||r.body,position:S.getPropertyValue(o,\"position\"),fontSize:S.getPropertyValue(o,\"fontSize\")},a=e.position===L.lastPosition&&e.myParent===L.lastParent,n=e.fontSize===L.lastFontSize;L.lastParent=e.myParent,L.lastPosition=e.position,L.lastFontSize=e.fontSize;var s=100,l={};if(n&&a)l.emToPx=L.lastEmToPx,l.percentToPxWidth=L.lastPercentToPxWidth,l.percentToPxHeight=L.lastPercentToPxHeight;else{var u=i(o).isSVG?r.createElementNS(\"http://www.w3.org/2000/svg\",\"rect\"):r.createElement(\"div\");b.init(u),e.myParent.appendChild(u),f.each([\"overflow\",\"overflowX\",\"overflowY\"],function(e,t){b.CSS.setPropertyValue(u,t,\"hidden\")}),b.CSS.setPropertyValue(u,\"position\",e.position),b.CSS.setPropertyValue(u,\"fontSize\",e.fontSize),b.CSS.setPropertyValue(u,\"boxSizing\",\"content-box\"),f.each([\"minWidth\",\"maxWidth\",\"width\",\"minHeight\",\"maxHeight\",\"height\"],function(e,t){b.CSS.setPropertyValue(u,t,s+\"%\")}),b.CSS.setPropertyValue(u,\"paddingLeft\",s+\"em\"),l.percentToPxWidth=L.lastPercentToPxWidth=(parseFloat(S.getPropertyValue(u,\"width\",null,!0))||1)/s,l.percentToPxHeight=L.lastPercentToPxHeight=(parseFloat(S.getPropertyValue(u,\"height\",null,!0))||1)/s,l.emToPx=L.lastEmToPx=(parseFloat(S.getPropertyValue(u,\"paddingLeft\"))||1)/s,e.myParent.removeChild(u)}return null===L.remToPx&&(L.remToPx=parseFloat(S.getPropertyValue(r.body,\"fontSize\"))||16),null===L.vwToPx&&(L.vwToPx=parseFloat(t.innerWidth)/100,L.vhToPx=parseFloat(t.innerHeight)/100),l.remToPx=L.remToPx,l.vwToPx=L.vwToPx,l.vhToPx=L.vhToPx,b.debug>=1&&console.log(\"Unit ratios: \"+JSON.stringify(l),o),l}if(s.begin&&0===V)try{s.begin.call(g,g)}catch(x){setTimeout(function(){throw x},1)}if(\"scroll\"===A){var P,C,T,F=/^x$/i.test(s.axis)?\"Left\":\"Top\",j=parseFloat(s.offset)||0;s.container?m.isWrapped(s.container)||m.isNode(s.container)?(s.container=s.container[0]||s.container,P=s.container[\"scroll\"+F],T=P+f(o).position()[F.toLowerCase()]+j):s.container=null:(P=b.State.scrollAnchor[b.State[\"scrollProperty\"+F]],C=b.State.scrollAnchor[b.State[\"scrollProperty\"+(\"Left\"===F?\"Top\":\"Left\")]],T=f(o).offset()[F.toLowerCase()]+j),l={scroll:{rootPropertyValue:!1,startValue:P,currentValue:P,endValue:T,unitType:\"\",easing:s.easing,scrollData:{container:s.container,direction:F,alternateValue:C}},element:o},b.debug&&console.log(\"tweensContainer (scroll): \",l.scroll,o)}else if(\"reverse\"===A){if(!i(o).tweensContainer)return void f.dequeue(o,s.queue);\"none\"===i(o).opts.display&&(i(o).opts.display=\"auto\"),\"hidden\"===i(o).opts.visibility&&(i(o).opts.visibility=\"visible\"),i(o).opts.loop=!1,i(o).opts.begin=null,i(o).opts.complete=null,v.easing||delete s.easing,v.duration||delete s.duration,s=f.extend({},i(o).opts,s);var E=f.extend(!0,{},i(o).tweensContainer);for(var H in E)if(\"element\"!==H){var N=E[H].startValue;E[H].startValue=E[H].currentValue=E[H].endValue,E[H].endValue=N,m.isEmptyObject(v)||(E[H].easing=s.easing),b.debug&&console.log(\"reverse tweensContainer (\"+H+\"): \"+JSON.stringify(E[H]),o)}l=E}else if(\"start\"===A){var E;i(o).tweensContainer&&i(o).isAnimating===!0&&(E=i(o).tweensContainer),f.each(y,function(e,t){if(RegExp(\"^\"+S.Lists.colors.join(\"$|^\")+\"$\").test(e)){var r=p(t,!0),n=r[0],o=r[1],i=r[2];if(S.RegEx.isHex.test(n)){for(var s=[\"Red\",\"Green\",\"Blue\"],l=S.Values.hexToRgb(n),u=i?S.Values.hexToRgb(i):a,c=0;c<s.length;c++){var f=[l[c]];o&&f.push(o),u!==a&&f.push(u[c]),y[e+s[c]]=f}delete y[e]}}});for(var z in y){var O=p(y[z]),q=O[0],$=O[1],M=O[2];z=S.Names.camelCase(z);var I=S.Hooks.getRoot(z),B=!1;if(i(o).isSVG||\"tween\"===I||S.Names.prefixCheck(I)[1]!==!1||S.Normalizations.registered[I]!==a){(s.display!==a&&null!==s.display&&\"none\"!==s.display||s.visibility!==a&&\"hidden\"!==s.visibility)&&/opacity|filter/.test(z)&&!M&&0!==q&&(M=0),s._cacheValues&&E&&E[z]?(M===a&&(M=E[z].endValue+E[z].unitType),B=i(o).rootPropertyValueCache[I]):S.Hooks.registered[z]?M===a?(B=S.getPropertyValue(o,I),M=S.getPropertyValue(o,z,B)):B=S.Hooks.templates[I][1]:M===a&&(M=S.getPropertyValue(o,z));var W,G,Y,D=!1;if(W=d(z,M),M=W[0],Y=W[1],W=d(z,q),q=W[0].replace(/^([+-\\/*])=/,function(e,t){return D=t,\"\"}),G=W[1],M=parseFloat(M)||0,q=parseFloat(q)||0,\"%\"===G&&(/^(fontSize|lineHeight)$/.test(z)?(q/=100,G=\"em\"):/^scale/.test(z)?(q/=100,G=\"\"):/(Red|Green|Blue)$/i.test(z)&&(q=q/100*255,G=\"\")),/[\\/*]/.test(D))G=Y;else if(Y!==G&&0!==M)if(0===q)G=Y;else{n=n||h();var Q=/margin|padding|left|right|width|text|word|letter/i.test(z)||/X$/.test(z)||\"x\"===z?\"x\":\"y\";switch(Y){case\"%\":M*=\"x\"===Q?n.percentToPxWidth:n.percentToPxHeight;break;case\"px\":break;default:M*=n[Y+\"ToPx\"]}switch(G){case\"%\":M*=1/(\"x\"===Q?n.percentToPxWidth:n.percentToPxHeight);break;case\"px\":break;default:M*=1/n[G+\"ToPx\"]}}switch(D){case\"+\":q=M+q;break;case\"-\":q=M-q;break;case\"*\":q=M*q;break;case\"/\":q=M/q}l[z]={rootPropertyValue:B,startValue:M,currentValue:M,endValue:q,unitType:G,easing:$},b.debug&&console.log(\"tweensContainer (\"+z+\"): \"+JSON.stringify(l[z]),o)}else b.debug&&console.log(\"Skipping [\"+I+\"] due to a lack of browser support.\")}l.element=o}l.element&&(S.Values.addClass(o,\"velocity-animating\"),R.push(l),\"\"===s.queue&&(i(o).tweensContainer=l,i(o).opts=s),i(o).isAnimating=!0,V===w-1?(b.State.calls.push([R,g,s,null,k.resolver]),b.State.isTicking===!1&&(b.State.isTicking=!0,c())):V++)}var n,o=this,s=f.extend({},b.defaults,v),l={};switch(i(o)===a&&b.init(o),parseFloat(s.delay)&&s.queue!==!1&&f.queue(o,s.queue,function(e){b.velocityQueueEntryFlag=!0,i(o).delayTimer={setTimeout:setTimeout(e,parseFloat(s.delay)),next:e}}),s.duration.toString().toLowerCase()){case\"fast\":s.duration=200;break;case\"normal\":s.duration=h;break;case\"slow\":s.duration=600;break;default:s.duration=parseFloat(s.duration)||1}b.mock!==!1&&(b.mock===!0?s.duration=s.delay=1:(s.duration*=parseFloat(b.mock)||1,s.delay*=parseFloat(b.mock)||1)),s.easing=u(s.easing,s.duration),s.begin&&!m.isFunction(s.begin)&&(s.begin=null),s.progress&&!m.isFunction(s.progress)&&(s.progress=null),s.complete&&!m.isFunction(s.complete)&&(s.complete=null),s.display!==a&&null!==s.display&&(s.display=s.display.toString().toLowerCase(),\"auto\"===s.display&&(s.display=b.CSS.Values.getDisplayType(o))),s.visibility!==a&&null!==s.visibility&&(s.visibility=s.visibility.toString().toLowerCase()),s.mobileHA=s.mobileHA&&b.State.isMobile&&!b.State.isGingerbread,s.queue===!1?s.delay?setTimeout(e,s.delay):e():f.queue(o,s.queue,function(t,r){return r===!0?(k.promise&&k.resolver(g),!0):(b.velocityQueueEntryFlag=!0,void e(t))}),\"\"!==s.queue&&\"fx\"!==s.queue||\"inprogress\"===f.queue(o)[0]||f.dequeue(o)}var s,l,d,g,y,v,x=arguments[0]&&(arguments[0].p||f.isPlainObject(arguments[0].properties)&&!arguments[0].properties.names||m.isString(arguments[0].properties));if(m.isWrapped(this)?(s=!1,d=0,g=this,l=this):(s=!0,d=1,g=x?arguments[0].elements||arguments[0].e:arguments[0]),g=o(g)){x?(y=arguments[0].properties||arguments[0].p,v=arguments[0].options||arguments[0].o):(y=arguments[d],v=arguments[d+1]);var w=g.length,V=0;if(!/^(stop|finish)$/i.test(y)&&!f.isPlainObject(v)){var C=d+1;v={};for(var T=C;T<arguments.length;T++)m.isArray(arguments[T])||!/^(fast|normal|slow)$/i.test(arguments[T])&&!/^\\d/.test(arguments[T])?m.isString(arguments[T])||m.isArray(arguments[T])?v.easing=arguments[T]:m.isFunction(arguments[T])&&(v.complete=arguments[T]):v.duration=arguments[T]}var k={promise:null,resolver:null,rejecter:null};s&&b.Promise&&(k.promise=new b.Promise(function(e,t){k.resolver=e,k.rejecter=t}));var A;switch(y){case\"scroll\":A=\"scroll\";break;case\"reverse\":A=\"reverse\";break;case\"finish\":case\"stop\":f.each(g,function(e,t){i(t)&&i(t).delayTimer&&(clearTimeout(i(t).delayTimer.setTimeout),i(t).delayTimer.next&&i(t).delayTimer.next(),delete i(t).delayTimer)});var F=[];return f.each(b.State.calls,function(e,t){t&&f.each(t[1],function(r,n){var o=v===a?\"\":v;return o===!0||t[2].queue===o||v===a&&t[2].queue===!1?void f.each(g,function(r,a){a===n&&((v===!0||m.isString(v))&&(f.each(f.queue(a,m.isString(v)?v:\"\"),function(e,t){\nm.isFunction(t)&&t(null,!0)}),f.queue(a,m.isString(v)?v:\"\",[])),\"stop\"===y?(i(a)&&i(a).tweensContainer&&o!==!1&&f.each(i(a).tweensContainer,function(e,t){t.endValue=t.currentValue}),F.push(e)):\"finish\"===y&&(t[2].duration=1))}):!0})}),\"stop\"===y&&(f.each(F,function(e,t){p(t,!0)}),k.promise&&k.resolver(g)),e();default:if(!f.isPlainObject(y)||m.isEmptyObject(y)){if(m.isString(y)&&b.Redirects[y]){var j=f.extend({},v),E=j.duration,H=j.delay||0;return j.backwards===!0&&(g=f.extend(!0,[],g).reverse()),f.each(g,function(e,t){parseFloat(j.stagger)?j.delay=H+parseFloat(j.stagger)*e:m.isFunction(j.stagger)&&(j.delay=H+j.stagger.call(t,e,w)),j.drag&&(j.duration=parseFloat(E)||(/^(callout|transition)/.test(y)?1e3:h),j.duration=Math.max(j.duration*(j.backwards?1-e/w:(e+1)/w),.75*j.duration,200)),b.Redirects[y].call(t,t,j||{},e,w,g,k.promise?k:a)}),e()}var N=\"Velocity: First argument (\"+y+\") was not a property map, a known action, or a registered redirect. Aborting.\";return k.promise?k.rejecter(new Error(N)):console.log(N),e()}A=\"start\"}var L={lastParent:null,lastPosition:null,lastFontSize:null,lastPercentToPxWidth:null,lastPercentToPxHeight:null,lastEmToPx:null,remToPx:null,vwToPx:null,vhToPx:null},R=[];f.each(g,function(e,t){m.isNode(t)&&n.call(t)});var z,j=f.extend({},b.defaults,v);if(j.loop=parseInt(j.loop),z=2*j.loop-1,j.loop)for(var O=0;z>O;O++){var q={delay:j.delay,progress:j.progress};O===z-1&&(q.display=j.display,q.visibility=j.visibility,q.complete=j.complete),P(g,\"reverse\",q)}return e()}};b=f.extend(P,b),b.animate=P;var w=t.requestAnimationFrame||g;return b.State.isMobile||r.hidden===a||r.addEventListener(\"visibilitychange\",function(){r.hidden?(w=function(e){return setTimeout(function(){e(!0)},16)},c()):w=t.requestAnimationFrame||g}),e.Velocity=b,e!==t&&(e.fn.velocity=P,e.fn.velocity.defaults=b.defaults),f.each([\"Down\",\"Up\"],function(e,t){b.Redirects[\"slide\"+t]=function(e,r,n,o,i,s){var l=f.extend({},r),u=l.begin,c=l.complete,p={height:\"\",marginTop:\"\",marginBottom:\"\",paddingTop:\"\",paddingBottom:\"\"},d={};l.display===a&&(l.display=\"Down\"===t?\"inline\"===b.CSS.Values.getDisplayType(e)?\"inline-block\":\"block\":\"none\"),l.begin=function(){u&&u.call(i,i);for(var r in p){d[r]=e.style[r];var a=b.CSS.getPropertyValue(e,r);p[r]=\"Down\"===t?[a,0]:[0,a]}d.overflow=e.style.overflow,e.style.overflow=\"hidden\"},l.complete=function(){for(var t in d)e.style[t]=d[t];c&&c.call(i,i),s&&s.resolver(i)},b(e,p,l)}}),f.each([\"In\",\"Out\"],function(e,t){b.Redirects[\"fade\"+t]=function(e,r,n,o,i,s){var l=f.extend({},r),u={opacity:\"In\"===t?1:0},c=l.complete;l.complete=n!==o-1?l.begin=null:function(){c&&c.call(i,i),s&&s.resolver(i)},l.display===a&&(l.display=\"In\"===t?\"auto\":\"none\"),b(this,u,l)}}),b}(window.jQuery||window.Zepto||window,window,document)}));\n;!function(a,b,c,d){\"use strict\";function k(a,b,c){return setTimeout(q(a,c),b)}function l(a,b,c){return Array.isArray(a)?(m(a,c[b],c),!0):!1}function m(a,b,c){var e;if(a)if(a.forEach)a.forEach(b,c);else if(a.length!==d)for(e=0;e<a.length;)b.call(c,a[e],e,a),e++;else for(e in a)a.hasOwnProperty(e)&&b.call(c,a[e],e,a)}function n(a,b,c){for(var e=Object.keys(b),f=0;f<e.length;)(!c||c&&a[e[f]]===d)&&(a[e[f]]=b[e[f]]),f++;return a}function o(a,b){return n(a,b,!0)}function p(a,b,c){var e,d=b.prototype;e=a.prototype=Object.create(d),e.constructor=a,e._super=d,c&&n(e,c)}function q(a,b){return function(){return a.apply(b,arguments)}}function r(a,b){return typeof a==g?a.apply(b?b[0]||d:d,b):a}function s(a,b){return a===d?b:a}function t(a,b,c){m(x(b),function(b){a.addEventListener(b,c,!1)})}function u(a,b,c){m(x(b),function(b){a.removeEventListener(b,c,!1)})}function v(a,b){for(;a;){if(a==b)return!0;a=a.parentNode}return!1}function w(a,b){return a.indexOf(b)>-1}function x(a){return a.trim().split(/\\s+/g)}function y(a,b,c){if(a.indexOf&&!c)return a.indexOf(b);for(var d=0;d<a.length;){if(c&&a[d][c]==b||!c&&a[d]===b)return d;d++}return-1}function z(a){return Array.prototype.slice.call(a,0)}function A(a,b,c){for(var d=[],e=[],f=0;f<a.length;){var g=b?a[f][b]:a[f];y(e,g)<0&&d.push(a[f]),e[f]=g,f++}return c&&(d=b?d.sort(function(a,c){return a[b]>c[b]}):d.sort()),d}function B(a,b){for(var c,f,g=b[0].toUpperCase()+b.slice(1),h=0;h<e.length;){if(c=e[h],f=c?c+g:b,f in a)return f;h++}return d}function D(){return C++}function E(a){var b=a.ownerDocument;return b.defaultView||b.parentWindow}function ab(a,b){var c=this;this.manager=a,this.callback=b,this.element=a.element,this.target=a.options.inputTarget,this.domHandler=function(b){r(a.options.enable,[a])&&c.handler(b)},this.init()}function bb(a){var b,c=a.options.inputClass;return b=c?c:H?wb:I?Eb:G?Gb:rb,new b(a,cb)}function cb(a,b,c){var d=c.pointers.length,e=c.changedPointers.length,f=b&O&&0===d-e,g=b&(Q|R)&&0===d-e;c.isFirst=!!f,c.isFinal=!!g,f&&(a.session={}),c.eventType=b,db(a,c),a.emit(\"hammer.input\",c),a.recognize(c),a.session.prevInput=c}function db(a,b){var c=a.session,d=b.pointers,e=d.length;c.firstInput||(c.firstInput=gb(b)),e>1&&!c.firstMultiple?c.firstMultiple=gb(b):1===e&&(c.firstMultiple=!1);var f=c.firstInput,g=c.firstMultiple,h=g?g.center:f.center,i=b.center=hb(d);b.timeStamp=j(),b.deltaTime=b.timeStamp-f.timeStamp,b.angle=lb(h,i),b.distance=kb(h,i),eb(c,b),b.offsetDirection=jb(b.deltaX,b.deltaY),b.scale=g?nb(g.pointers,d):1,b.rotation=g?mb(g.pointers,d):0,fb(c,b);var k=a.element;v(b.srcEvent.target,k)&&(k=b.srcEvent.target),b.target=k}function eb(a,b){var c=b.center,d=a.offsetDelta||{},e=a.prevDelta||{},f=a.prevInput||{};(b.eventType===O||f.eventType===Q)&&(e=a.prevDelta={x:f.deltaX||0,y:f.deltaY||0},d=a.offsetDelta={x:c.x,y:c.y}),b.deltaX=e.x+(c.x-d.x),b.deltaY=e.y+(c.y-d.y)}function fb(a,b){var f,g,h,j,c=a.lastInterval||b,e=b.timeStamp-c.timeStamp;if(b.eventType!=R&&(e>N||c.velocity===d)){var k=c.deltaX-b.deltaX,l=c.deltaY-b.deltaY,m=ib(e,k,l);g=m.x,h=m.y,f=i(m.x)>i(m.y)?m.x:m.y,j=jb(k,l),a.lastInterval=b}else f=c.velocity,g=c.velocityX,h=c.velocityY,j=c.direction;b.velocity=f,b.velocityX=g,b.velocityY=h,b.direction=j}function gb(a){for(var b=[],c=0;c<a.pointers.length;)b[c]={clientX:h(a.pointers[c].clientX),clientY:h(a.pointers[c].clientY)},c++;return{timeStamp:j(),pointers:b,center:hb(b),deltaX:a.deltaX,deltaY:a.deltaY}}function hb(a){var b=a.length;if(1===b)return{x:h(a[0].clientX),y:h(a[0].clientY)};for(var c=0,d=0,e=0;b>e;)c+=a[e].clientX,d+=a[e].clientY,e++;return{x:h(c/b),y:h(d/b)}}function ib(a,b,c){return{x:b/a||0,y:c/a||0}}function jb(a,b){return a===b?S:i(a)>=i(b)?a>0?T:U:b>0?V:W}function kb(a,b,c){c||(c=$);var d=b[c[0]]-a[c[0]],e=b[c[1]]-a[c[1]];return Math.sqrt(d*d+e*e)}function lb(a,b,c){c||(c=$);var d=b[c[0]]-a[c[0]],e=b[c[1]]-a[c[1]];return 180*Math.atan2(e,d)/Math.PI}function mb(a,b){return lb(b[1],b[0],_)-lb(a[1],a[0],_)}function nb(a,b){return kb(b[0],b[1],_)/kb(a[0],a[1],_)}function rb(){this.evEl=pb,this.evWin=qb,this.allow=!0,this.pressed=!1,ab.apply(this,arguments)}function wb(){this.evEl=ub,this.evWin=vb,ab.apply(this,arguments),this.store=this.manager.session.pointerEvents=[]}function Ab(){this.evTarget=yb,this.evWin=zb,this.started=!1,ab.apply(this,arguments)}function Bb(a,b){var c=z(a.touches),d=z(a.changedTouches);return b&(Q|R)&&(c=A(c.concat(d),\"identifier\",!0)),[c,d]}function Eb(){this.evTarget=Db,this.targetIds={},ab.apply(this,arguments)}function Fb(a,b){var c=z(a.touches),d=this.targetIds;if(b&(O|P)&&1===c.length)return d[c[0].identifier]=!0,[c,c];var e,f,g=z(a.changedTouches),h=[],i=this.target;if(f=c.filter(function(a){return v(a.target,i)}),b===O)for(e=0;e<f.length;)d[f[e].identifier]=!0,e++;for(e=0;e<g.length;)d[g[e].identifier]&&h.push(g[e]),b&(Q|R)&&delete d[g[e].identifier],e++;return h.length?[A(f.concat(h),\"identifier\",!0),h]:void 0}function Gb(){ab.apply(this,arguments);var a=q(this.handler,this);this.touch=new Eb(this.manager,a),this.mouse=new rb(this.manager,a)}function Pb(a,b){this.manager=a,this.set(b)}function Qb(a){if(w(a,Mb))return Mb;var b=w(a,Nb),c=w(a,Ob);return b&&c?Nb+\" \"+Ob:b||c?b?Nb:Ob:w(a,Lb)?Lb:Kb}function Yb(a){this.id=D(),this.manager=null,this.options=o(a||{},this.defaults),this.options.enable=s(this.options.enable,!0),this.state=Rb,this.simultaneous={},this.requireFail=[]}function Zb(a){return a&Wb?\"cancel\":a&Ub?\"end\":a&Tb?\"move\":a&Sb?\"start\":\"\"}function $b(a){return a==W?\"down\":a==V?\"up\":a==T?\"left\":a==U?\"right\":\"\"}function _b(a,b){var c=b.manager;return c?c.get(a):a}function ac(){Yb.apply(this,arguments)}function bc(){ac.apply(this,arguments),this.pX=null,this.pY=null}function cc(){ac.apply(this,arguments)}function dc(){Yb.apply(this,arguments),this._timer=null,this._input=null}function ec(){ac.apply(this,arguments)}function fc(){ac.apply(this,arguments)}function gc(){Yb.apply(this,arguments),this.pTime=!1,this.pCenter=!1,this._timer=null,this._input=null,this.count=0}function hc(a,b){return b=b||{},b.recognizers=s(b.recognizers,hc.defaults.preset),new kc(a,b)}function kc(a,b){b=b||{},this.options=o(b,hc.defaults),this.options.inputTarget=this.options.inputTarget||a,this.handlers={},this.session={},this.recognizers=[],this.element=a,this.input=bb(this),this.touchAction=new Pb(this,this.options.touchAction),lc(this,!0),m(b.recognizers,function(a){var b=this.add(new a[0](a[1]));a[2]&&b.recognizeWith(a[2]),a[3]&&b.requireFailure(a[3])},this)}function lc(a,b){var c=a.element;m(a.options.cssProps,function(a,d){c.style[B(c.style,d)]=b?a:\"\"})}function mc(a,c){var d=b.createEvent(\"Event\");d.initEvent(a,!0,!0),d.gesture=c,c.target.dispatchEvent(d)}var e=[\"\",\"webkit\",\"moz\",\"MS\",\"ms\",\"o\"],f=b.createElement(\"div\"),g=\"function\",h=Math.round,i=Math.abs,j=Date.now,C=1,F=/mobile|tablet|ip(ad|hone|od)|android/i,G=\"ontouchstart\"in a,H=B(a,\"PointerEvent\")!==d,I=G&&F.test(navigator.userAgent),J=\"touch\",K=\"pen\",L=\"mouse\",M=\"kinect\",N=25,O=1,P=2,Q=4,R=8,S=1,T=2,U=4,V=8,W=16,X=T|U,Y=V|W,Z=X|Y,$=[\"x\",\"y\"],_=[\"clientX\",\"clientY\"];ab.prototype={handler:function(){},init:function(){this.evEl&&t(this.element,this.evEl,this.domHandler),this.evTarget&&t(this.target,this.evTarget,this.domHandler),this.evWin&&t(E(this.element),this.evWin,this.domHandler)},destroy:function(){this.evEl&&u(this.element,this.evEl,this.domHandler),this.evTarget&&u(this.target,this.evTarget,this.domHandler),this.evWin&&u(E(this.element),this.evWin,this.domHandler)}};var ob={mousedown:O,mousemove:P,mouseup:Q},pb=\"mousedown\",qb=\"mousemove mouseup\";p(rb,ab,{handler:function(a){var b=ob[a.type];b&O&&0===a.button&&(this.pressed=!0),b&P&&1!==a.which&&(b=Q),this.pressed&&this.allow&&(b&Q&&(this.pressed=!1),this.callback(this.manager,b,{pointers:[a],changedPointers:[a],pointerType:L,srcEvent:a}))}});var sb={pointerdown:O,pointermove:P,pointerup:Q,pointercancel:R,pointerout:R},tb={2:J,3:K,4:L,5:M},ub=\"pointerdown\",vb=\"pointermove pointerup pointercancel\";a.MSPointerEvent&&(ub=\"MSPointerDown\",vb=\"MSPointerMove MSPointerUp MSPointerCancel\"),p(wb,ab,{handler:function(a){var b=this.store,c=!1,d=a.type.toLowerCase().replace(\"ms\",\"\"),e=sb[d],f=tb[a.pointerType]||a.pointerType,g=f==J,h=y(b,a.pointerId,\"pointerId\");e&O&&(0===a.button||g)?0>h&&(b.push(a),h=b.length-1):e&(Q|R)&&(c=!0),0>h||(b[h]=a,this.callback(this.manager,e,{pointers:b,changedPointers:[a],pointerType:f,srcEvent:a}),c&&b.splice(h,1))}});var xb={touchstart:O,touchmove:P,touchend:Q,touchcancel:R},yb=\"touchstart\",zb=\"touchstart touchmove touchend touchcancel\";p(Ab,ab,{handler:function(a){var b=xb[a.type];if(b===O&&(this.started=!0),this.started){var c=Bb.call(this,a,b);b&(Q|R)&&0===c[0].length-c[1].length&&(this.started=!1),this.callback(this.manager,b,{pointers:c[0],changedPointers:c[1],pointerType:J,srcEvent:a})}}});var Cb={touchstart:O,touchmove:P,touchend:Q,touchcancel:R},Db=\"touchstart touchmove touchend touchcancel\";p(Eb,ab,{handler:function(a){var b=Cb[a.type],c=Fb.call(this,a,b);c&&this.callback(this.manager,b,{pointers:c[0],changedPointers:c[1],pointerType:J,srcEvent:a})}}),p(Gb,ab,{handler:function(a,b,c){var d=c.pointerType==J,e=c.pointerType==L;if(d)this.mouse.allow=!1;else if(e&&!this.mouse.allow)return;b&(Q|R)&&(this.mouse.allow=!0),this.callback(a,b,c)},destroy:function(){this.touch.destroy(),this.mouse.destroy()}});var Hb=B(f.style,\"touchAction\"),Ib=Hb!==d,Jb=\"compute\",Kb=\"auto\",Lb=\"manipulation\",Mb=\"none\",Nb=\"pan-x\",Ob=\"pan-y\";Pb.prototype={set:function(a){a==Jb&&(a=this.compute()),Ib&&(this.manager.element.style[Hb]=a),this.actions=a.toLowerCase().trim()},update:function(){this.set(this.manager.options.touchAction)},compute:function(){var a=[];return m(this.manager.recognizers,function(b){r(b.options.enable,[b])&&(a=a.concat(b.getTouchAction()))}),Qb(a.join(\" \"))},preventDefaults:function(a){if(!Ib){var b=a.srcEvent,c=a.offsetDirection;if(this.manager.session.prevented)return b.preventDefault(),void 0;var d=this.actions,e=w(d,Mb),f=w(d,Ob),g=w(d,Nb);return e||f&&c&X||g&&c&Y?this.preventSrc(b):void 0}},preventSrc:function(a){this.manager.session.prevented=!0,a.preventDefault()}};var Rb=1,Sb=2,Tb=4,Ub=8,Vb=Ub,Wb=16,Xb=32;Yb.prototype={defaults:{},set:function(a){return n(this.options,a),this.manager&&this.manager.touchAction.update(),this},recognizeWith:function(a){if(l(a,\"recognizeWith\",this))return this;var b=this.simultaneous;return a=_b(a,this),b[a.id]||(b[a.id]=a,a.recognizeWith(this)),this},dropRecognizeWith:function(a){return l(a,\"dropRecognizeWith\",this)?this:(a=_b(a,this),delete this.simultaneous[a.id],this)},requireFailure:function(a){if(l(a,\"requireFailure\",this))return this;var b=this.requireFail;return a=_b(a,this),-1===y(b,a)&&(b.push(a),a.requireFailure(this)),this},dropRequireFailure:function(a){if(l(a,\"dropRequireFailure\",this))return this;a=_b(a,this);var b=y(this.requireFail,a);return b>-1&&this.requireFail.splice(b,1),this},hasRequireFailures:function(){return this.requireFail.length>0},canRecognizeWith:function(a){return!!this.simultaneous[a.id]},emit:function(a){function d(d){b.manager.emit(b.options.event+(d?Zb(c):\"\"),a)}var b=this,c=this.state;Ub>c&&d(!0),d(),c>=Ub&&d(!0)},tryEmit:function(a){return this.canEmit()?this.emit(a):(this.state=Xb,void 0)},canEmit:function(){for(var a=0;a<this.requireFail.length;){if(!(this.requireFail[a].state&(Xb|Rb)))return!1;a++}return!0},recognize:function(a){var b=n({},a);return r(this.options.enable,[this,b])?(this.state&(Vb|Wb|Xb)&&(this.state=Rb),this.state=this.process(b),this.state&(Sb|Tb|Ub|Wb)&&this.tryEmit(b),void 0):(this.reset(),this.state=Xb,void 0)},process:function(){},getTouchAction:function(){},reset:function(){}},p(ac,Yb,{defaults:{pointers:1},attrTest:function(a){var b=this.options.pointers;return 0===b||a.pointers.length===b},process:function(a){var b=this.state,c=a.eventType,d=b&(Sb|Tb),e=this.attrTest(a);return d&&(c&R||!e)?b|Wb:d||e?c&Q?b|Ub:b&Sb?b|Tb:Sb:Xb}}),p(bc,ac,{defaults:{event:\"pan\",threshold:10,pointers:1,direction:Z},getTouchAction:function(){var a=this.options.direction,b=[];return a&X&&b.push(Ob),a&Y&&b.push(Nb),b},directionTest:function(a){var b=this.options,c=!0,d=a.distance,e=a.direction,f=a.deltaX,g=a.deltaY;return e&b.direction||(b.direction&X?(e=0===f?S:0>f?T:U,c=f!=this.pX,d=Math.abs(a.deltaX)):(e=0===g?S:0>g?V:W,c=g!=this.pY,d=Math.abs(a.deltaY))),a.direction=e,c&&d>b.threshold&&e&b.direction},attrTest:function(a){return ac.prototype.attrTest.call(this,a)&&(this.state&Sb||!(this.state&Sb)&&this.directionTest(a))},emit:function(a){this.pX=a.deltaX,this.pY=a.deltaY;var b=$b(a.direction);b&&this.manager.emit(this.options.event+b,a),this._super.emit.call(this,a)}}),p(cc,ac,{defaults:{event:\"pinch\",threshold:0,pointers:2},getTouchAction:function(){return[Mb]},attrTest:function(a){return this._super.attrTest.call(this,a)&&(Math.abs(a.scale-1)>this.options.threshold||this.state&Sb)},emit:function(a){if(this._super.emit.call(this,a),1!==a.scale){var b=a.scale<1?\"in\":\"out\";this.manager.emit(this.options.event+b,a)}}}),p(dc,Yb,{defaults:{event:\"press\",pointers:1,time:500,threshold:5},getTouchAction:function(){return[Kb]},process:function(a){var b=this.options,c=a.pointers.length===b.pointers,d=a.distance<b.threshold,e=a.deltaTime>b.time;if(this._input=a,!d||!c||a.eventType&(Q|R)&&!e)this.reset();else if(a.eventType&O)this.reset(),this._timer=k(function(){this.state=Vb,this.tryEmit()},b.time,this);else if(a.eventType&Q)return Vb;return Xb},reset:function(){clearTimeout(this._timer)},emit:function(a){this.state===Vb&&(a&&a.eventType&Q?this.manager.emit(this.options.event+\"up\",a):(this._input.timeStamp=j(),this.manager.emit(this.options.event,this._input)))}}),p(ec,ac,{defaults:{event:\"rotate\",threshold:0,pointers:2},getTouchAction:function(){return[Mb]},attrTest:function(a){return this._super.attrTest.call(this,a)&&(Math.abs(a.rotation)>this.options.threshold||this.state&Sb)}}),p(fc,ac,{defaults:{event:\"swipe\",threshold:10,velocity:.65,direction:X|Y,pointers:1},getTouchAction:function(){return bc.prototype.getTouchAction.call(this)},attrTest:function(a){var c,b=this.options.direction;return b&(X|Y)?c=a.velocity:b&X?c=a.velocityX:b&Y&&(c=a.velocityY),this._super.attrTest.call(this,a)&&b&a.direction&&a.distance>this.options.threshold&&i(c)>this.options.velocity&&a.eventType&Q},emit:function(a){var b=$b(a.direction);b&&this.manager.emit(this.options.event+b,a),this.manager.emit(this.options.event,a)}}),p(gc,Yb,{defaults:{event:\"tap\",pointers:1,taps:1,interval:300,time:250,threshold:2,posThreshold:10},getTouchAction:function(){return[Lb]},process:function(a){var b=this.options,c=a.pointers.length===b.pointers,d=a.distance<b.threshold,e=a.deltaTime<b.time;if(this.reset(),a.eventType&O&&0===this.count)return this.failTimeout();if(d&&e&&c){if(a.eventType!=Q)return this.failTimeout();var f=this.pTime?a.timeStamp-this.pTime<b.interval:!0,g=!this.pCenter||kb(this.pCenter,a.center)<b.posThreshold;this.pTime=a.timeStamp,this.pCenter=a.center,g&&f?this.count+=1:this.count=1,this._input=a;var h=this.count%b.taps;if(0===h)return this.hasRequireFailures()?(this._timer=k(function(){this.state=Vb,this.tryEmit()},b.interval,this),Sb):Vb}return Xb},failTimeout:function(){return this._timer=k(function(){this.state=Xb},this.options.interval,this),Xb},reset:function(){clearTimeout(this._timer)},emit:function(){this.state==Vb&&(this._input.tapCount=this.count,this.manager.emit(this.options.event,this._input))}}),hc.VERSION=\"2.0.4\",hc.defaults={domEvents:!1,touchAction:Jb,enable:!0,inputTarget:null,inputClass:null,preset:[[ec,{enable:!1}],[cc,{enable:!1},[\"rotate\"]],[fc,{direction:X}],[bc,{direction:X},[\"swipe\"]],[gc],[gc,{event:\"doubletap\",taps:2},[\"tap\"]],[dc]],cssProps:{userSelect:\"default\",touchSelect:\"none\",touchCallout:\"none\",contentZooming:\"none\",userDrag:\"none\",tapHighlightColor:\"rgba(0,0,0,0)\"}};var ic=1,jc=2;kc.prototype={set:function(a){return n(this.options,a),a.touchAction&&this.touchAction.update(),a.inputTarget&&(this.input.destroy(),this.input.target=a.inputTarget,this.input.init()),this},stop:function(a){this.session.stopped=a?jc:ic},recognize:function(a){var b=this.session;if(!b.stopped){this.touchAction.preventDefaults(a);var c,d=this.recognizers,e=b.curRecognizer;(!e||e&&e.state&Vb)&&(e=b.curRecognizer=null);for(var f=0;f<d.length;)c=d[f],b.stopped===jc||e&&c!=e&&!c.canRecognizeWith(e)?c.reset():c.recognize(a),!e&&c.state&(Sb|Tb|Ub)&&(e=b.curRecognizer=c),f++}},get:function(a){if(a instanceof Yb)return a;for(var b=this.recognizers,c=0;c<b.length;c++)if(b[c].options.event==a)return b[c];return null},add:function(a){if(l(a,\"add\",this))return this;var b=this.get(a.options.event);return b&&this.remove(b),this.recognizers.push(a),a.manager=this,this.touchAction.update(),a},remove:function(a){if(l(a,\"remove\",this))return this;var b=this.recognizers;return a=this.get(a),b.splice(y(b,a),1),this.touchAction.update(),this},on:function(a,b){var c=this.handlers;return m(x(a),function(a){c[a]=c[a]||[],c[a].push(b)}),this},off:function(a,b){var c=this.handlers;return m(x(a),function(a){b?c[a].splice(y(c[a],b),1):delete c[a]}),this},emit:function(a,b){this.options.domEvents&&mc(a,b);var c=this.handlers[a]&&this.handlers[a].slice();if(c&&c.length){b.type=a,b.preventDefault=function(){b.srcEvent.preventDefault()};for(var d=0;d<c.length;)c[d](b),d++}},destroy:function(){this.element&&lc(this,!1),this.handlers={},this.session={},this.input.destroy(),this.element=null}},n(hc,{INPUT_START:O,INPUT_MOVE:P,INPUT_END:Q,INPUT_CANCEL:R,STATE_POSSIBLE:Rb,STATE_BEGAN:Sb,STATE_CHANGED:Tb,STATE_ENDED:Ub,STATE_RECOGNIZED:Vb,STATE_CANCELLED:Wb,STATE_FAILED:Xb,DIRECTION_NONE:S,DIRECTION_LEFT:T,DIRECTION_RIGHT:U,DIRECTION_UP:V,DIRECTION_DOWN:W,DIRECTION_HORIZONTAL:X,DIRECTION_VERTICAL:Y,DIRECTION_ALL:Z,Manager:kc,Input:ab,TouchAction:Pb,TouchInput:Eb,MouseInput:rb,PointerEventInput:wb,TouchMouseInput:Gb,SingleTouchInput:Ab,Recognizer:Yb,AttrRecognizer:ac,Tap:gc,Pan:bc,Swipe:fc,Pinch:cc,Rotate:ec,Press:dc,on:t,off:u,each:m,merge:o,extend:n,inherit:p,bindFn:q,prefixed:B}),typeof define==g&&define.amd?define(function(){return hc}):\"undefined\"!=typeof module&&module.exports?module.exports=hc:a[c]=hc}(window,document,\"Hammer\");;(function(factory) {\n    if (typeof define === 'function' && define.amd) {\n        define(['jquery', 'hammerjs'], factory);\n    } else if (typeof exports === 'object') {\n        factory(require('jquery'), require('hammerjs'));\n    } else {\n        factory(jQuery, Hammer);\n    }\n}(function($, Hammer) {\n    function hammerify(el, options) {\n        var $el = $(el);\n        if(!$el.data(\"hammer\")) {\n            $el.data(\"hammer\", new Hammer($el[0], options));\n        }\n    }\n\n    $.fn.hammer = function(options) {\n        return this.each(function() {\n            hammerify(this, options);\n        });\n    };\n\n    // extend the emit method to also trigger jQuery events\n    Hammer.Manager.prototype.emit = (function(originalEmit) {\n        return function(type, data) {\n            originalEmit.call(this, type, data);\n            $(this.element).trigger({\n                type: type,\n                gesture: data\n            });\n        };\n    })(Hammer.Manager.prototype.emit);\n}));\n;// Required for Meteor package, the use of window prevents export by Meteor\n(function(window){\n  if(window.Package){\n    Materialize = {};\n  } else {\n    window.Materialize = {};\n  }\n})(window);\n\n\n// Unique ID\nMaterialize.guid = (function() {\n  function s4() {\n    return Math.floor((1 + Math.random()) * 0x10000)\n      .toString(16)\n      .substring(1);\n  }\n  return function() {\n    return s4() + s4() + '-' + s4() + '-' + s4() + '-' +\n           s4() + '-' + s4() + s4() + s4();\n  };\n})();\n\nMaterialize.elementOrParentIsFixed = function(element) {\n    var $element = $(element);\n    var $checkElements = $element.add($element.parents());\n    var isFixed = false;\n    $checkElements.each(function(){\n        if ($(this).css(\"position\") === \"fixed\") {\n            isFixed = true;\n            return false;\n        }\n    });\n    return isFixed;\n};\n\n// Velocity has conflicts when loaded with jQuery, this will check for it\nvar Vel;\nif ($) {\n  Vel = $.Velocity;\n} else if (jQuery) {\n  Vel = jQuery.Velocity;\n} else {\n  Vel = Velocity;\n}\n;  (function ($) {\n  $.fn.collapsible = function(options) {\n    var defaults = {\n        accordion: undefined\n    };\n\n    options = $.extend(defaults, options);\n\n\n    return this.each(function() {\n\n      var $this = $(this);\n\n      var $panel_headers = $(this).find('> li > .collapsible-header');\n\n      var collapsible_type = $this.data(\"collapsible\");\n\n      // Turn off any existing event handlers\n       $this.off('click.collapse', '> li > .collapsible-header');\n       $panel_headers.off('click.collapse');\n\n\n       /****************\n       Helper Functions\n       ****************/\n\n      // Accordion Open\n      function accordionOpen(object) {\n        $panel_headers = $this.find('> li > .collapsible-header');\n        if (object.hasClass('active')) {\n            object.parent().addClass('active');\n        }\n        else {\n            object.parent().removeClass('active');\n        }\n        if (object.parent().hasClass('active')){\n          object.siblings('.collapsible-body').stop(true,false).slideDown({ duration: 350, easing: \"easeOutQuart\", queue: false, complete: function() {$(this).css('height', '');}});\n        }\n        else{\n          object.siblings('.collapsible-body').stop(true,false).slideUp({ duration: 350, easing: \"easeOutQuart\", queue: false, complete: function() {$(this).css('height', '');}});\n        }\n\n        $panel_headers.not(object).removeClass('active').parent().removeClass('active');\n        $panel_headers.not(object).parent().children('.collapsible-body').stop(true,false).slideUp(\n          {\n            duration: 350,\n            easing: \"easeOutQuart\",\n            queue: false,\n            complete:\n              function() {\n                $(this).css('height', '');\n              }\n          });\n      }\n\n      // Expandable Open\n      function expandableOpen(object) {\n        if (object.hasClass('active')) {\n            object.parent().addClass('active');\n        }\n        else {\n            object.parent().removeClass('active');\n        }\n        if (object.parent().hasClass('active')){\n          object.siblings('.collapsible-body').stop(true,false).slideDown({ duration: 350, easing: \"easeOutQuart\", queue: false, complete: function() {$(this).css('height', '');}});\n        }\n        else{\n          object.siblings('.collapsible-body').stop(true,false).slideUp({ duration: 350, easing: \"easeOutQuart\", queue: false, complete: function() {$(this).css('height', '');}});\n        }\n      }\n\n      /**\n       * Check if object is children of panel header\n       * @param  {Object}  object Jquery object\n       * @return {Boolean} true if it is children\n       */\n      function isChildrenOfPanelHeader(object) {\n\n        var panelHeader = getPanelHeader(object);\n\n        return panelHeader.length > 0;\n      }\n\n      /**\n       * Get panel header from a children element\n       * @param  {Object} object Jquery object\n       * @return {Object} panel header object\n       */\n      function getPanelHeader(object) {\n\n        return object.closest('li > .collapsible-header');\n      }\n\n      /*****  End Helper Functions  *****/\n\n\n\n      // Add click handler to only direct collapsible header children\n      $this.on('click.collapse', '> li > .collapsible-header', function(e) {\n        var $header = $(this),\n            element = $(e.target);\n\n        if (isChildrenOfPanelHeader(element)) {\n          element = getPanelHeader(element);\n        }\n\n        element.toggleClass('active');\n\n        if (options.accordion || collapsible_type === \"accordion\" || collapsible_type === undefined) { // Handle Accordion\n          accordionOpen(element);\n        } else { // Handle Expandables\n          expandableOpen(element);\n\n          if ($header.hasClass('active')) {\n            expandableOpen($header);\n          }\n        }\n      });\n\n      // Open first active\n      var $panel_headers = $this.find('> li > .collapsible-header');\n      if (options.accordion || collapsible_type === \"accordion\" || collapsible_type === undefined) { // Handle Accordion\n        accordionOpen($panel_headers.filter('.active').first());\n      }\n      else { // Handle Expandables\n        $panel_headers.filter('.active').each(function() {\n          expandableOpen($(this));\n        });\n      }\n\n    });\n  };\n\n  $(document).ready(function(){\n    $('.collapsible').collapsible();\n  });\n}( jQuery ));;(function ($) {\n\n  // Add posibility to scroll to selected option\n  // usefull for select for example\n  $.fn.scrollTo = function(elem) {\n    $(this).scrollTop($(this).scrollTop() - $(this).offset().top + $(elem).offset().top);\n    return this;\n  };\n\n  $.fn.dropdown = function (option) {\n    var defaults = {\n      inDuration: 300,\n      outDuration: 225,\n      constrain_width: true, // Constrains width of dropdown to the activator\n      hover: false,\n      gutter: 0, // Spacing from edge\n      belowOrigin: false,\n      alignment: 'left'\n    };\n\n    this.each(function(){\n    var origin = $(this);\n    var options = $.extend({}, defaults, option);\n    var isFocused = false;\n\n    // Dropdown menu\n    var activates = $(\"#\"+ origin.attr('data-activates'));\n\n    function updateOptions() {\n      if (origin.data('induration') !== undefined)\n        options.inDuration = origin.data('inDuration');\n      if (origin.data('outduration') !== undefined)\n        options.outDuration = origin.data('outDuration');\n      if (origin.data('constrainwidth') !== undefined)\n        options.constrain_width = origin.data('constrainwidth');\n      if (origin.data('hover') !== undefined)\n        options.hover = origin.data('hover');\n      if (origin.data('gutter') !== undefined)\n        options.gutter = origin.data('gutter');\n      if (origin.data('beloworigin') !== undefined)\n        options.belowOrigin = origin.data('beloworigin');\n      if (origin.data('alignment') !== undefined)\n        options.alignment = origin.data('alignment');\n    }\n\n    updateOptions();\n\n    // Attach dropdown to its activator\n    origin.after(activates);\n\n    /*\n      Helper function to position and resize dropdown.\n      Used in hover and click handler.\n    */\n    function placeDropdown(eventType) {\n      // Check for simultaneous focus and click events.\n      if (eventType === 'focus') {\n        isFocused = true;\n      }\n\n      // Check html data attributes\n      updateOptions();\n\n      // Set Dropdown state\n      activates.addClass('active');\n      origin.addClass('active');\n\n      // Constrain width\n      if (options.constrain_width === true) {\n        activates.css('width', origin.outerWidth());\n\n      } else {\n        activates.css('white-space', 'nowrap');\n      }\n\n      // Offscreen detection\n      var windowHeight = window.innerHeight;\n      var originHeight = origin.innerHeight();\n      var offsetLeft = origin.offset().left;\n      var offsetTop = origin.offset().top - $(window).scrollTop();\n      var currAlignment = options.alignment;\n      var activatesLeft, gutterSpacing;\n\n      // Below Origin\n      var verticalOffset = 0;\n      if (options.belowOrigin === true) {\n        verticalOffset = originHeight;\n      }\n\n      if (offsetLeft + activates.innerWidth() > $(window).width()) {\n        // Dropdown goes past screen on right, force right alignment\n        currAlignment = 'right';\n\n      } else if (offsetLeft - activates.innerWidth() + origin.innerWidth() < 0) {\n        // Dropdown goes past screen on left, force left alignment\n        currAlignment = 'left';\n      }\n      // Vertical bottom offscreen detection\n      if (offsetTop + activates.innerHeight() > windowHeight) {\n        // If going upwards still goes offscreen, just crop height of dropdown.\n        if (offsetTop + originHeight - activates.innerHeight() < 0) {\n          var adjustedHeight = windowHeight - offsetTop - verticalOffset;\n          activates.css('max-height', adjustedHeight);\n        } else {\n          // Flow upwards.\n          if (!verticalOffset) {\n            verticalOffset += originHeight;\n          }\n          verticalOffset -= activates.innerHeight();\n        }\n      }\n\n      // Handle edge alignment\n      if (currAlignment === 'left') {\n        gutterSpacing = options.gutter;\n        leftPosition = origin.position().left + gutterSpacing;\n      }\n      else if (currAlignment === 'right') {\n        var offsetRight = origin.position().left + origin.outerWidth() - activates.outerWidth();\n        gutterSpacing = -options.gutter;\n        leftPosition =  offsetRight + gutterSpacing;\n      }\n\n      // Position dropdown\n      activates.css({\n        position: 'absolute',\n        top: origin.position().top + verticalOffset,\n        left: leftPosition\n      });\n\n\n      // Show dropdown\n      activates.stop(true, true).css('opacity', 0)\n        .slideDown({\n        queue: false,\n        duration: options.inDuration,\n        easing: 'easeOutCubic',\n        complete: function() {\n          $(this).css('height', '');\n        }\n      })\n        .animate( {opacity: 1}, {queue: false, duration: options.inDuration, easing: 'easeOutSine'});\n    }\n\n    function hideDropdown() {\n      // Check for simultaneous focus and click events.\n      isFocused = false;\n      activates.fadeOut(options.outDuration);\n      activates.removeClass('active');\n      origin.removeClass('active');\n      setTimeout(function() { activates.css('max-height', ''); }, options.outDuration);\n    }\n\n    // Hover\n    if (options.hover) {\n      var open = false;\n      origin.unbind('click.' + origin.attr('id'));\n      // Hover handler to show dropdown\n      origin.on('mouseenter', function(e){ // Mouse over\n        if (open === false) {\n          placeDropdown();\n          open = true;\n        }\n      });\n      origin.on('mouseleave', function(e){\n        // If hover on origin then to something other than dropdown content, then close\n        var toEl = e.toElement || e.relatedTarget; // added browser compatibility for target element\n        if(!$(toEl).closest('.dropdown-content').is(activates)) {\n          activates.stop(true, true);\n          hideDropdown();\n          open = false;\n        }\n      });\n\n      activates.on('mouseleave', function(e){ // Mouse out\n        var toEl = e.toElement || e.relatedTarget;\n        if(!$(toEl).closest('.dropdown-button').is(origin)) {\n          activates.stop(true, true);\n          hideDropdown();\n          open = false;\n        }\n      });\n\n    // Click\n    } else {\n      // Click handler to show dropdown\n      origin.unbind('click.' + origin.attr('id'));\n      origin.bind('click.'+origin.attr('id'), function(e){\n        if (!isFocused) {\n          if ( origin[0] == e.currentTarget &&\n               !origin.hasClass('active') &&\n               ($(e.target).closest('.dropdown-content').length === 0)) {\n            e.preventDefault(); // Prevents button click from moving window\n            placeDropdown('click');\n          }\n          // If origin is clicked and menu is open, close menu\n          else if (origin.hasClass('active')) {\n            hideDropdown();\n            $(document).unbind('click.'+ activates.attr('id') + ' touchstart.' + activates.attr('id'));\n          }\n          // If menu open, add click close handler to document\n          if (activates.hasClass('active')) {\n            $(document).bind('click.'+ activates.attr('id') + ' touchstart.' + activates.attr('id'), function (e) {\n              if (!activates.is(e.target) && !origin.is(e.target) && (!origin.find(e.target).length) ) {\n                hideDropdown();\n                $(document).unbind('click.'+ activates.attr('id') + ' touchstart.' + activates.attr('id'));\n              }\n            });\n          }\n        }\n      });\n\n    } // End else\n\n    // Listen to open and close event - useful for select component\n    origin.on('open', function(e, eventType) {\n      placeDropdown(eventType);\n    });\n    origin.on('close', hideDropdown);\n\n\n   });\n  }; // End dropdown plugin\n\n  $(document).ready(function(){\n    $('.dropdown-button').dropdown();\n  });\n}( jQuery ));;(function($) {\n    var _stack = 0,\n    _lastID = 0,\n    _generateID = function() {\n      _lastID++;\n      return 'materialize-lean-overlay-' + _lastID;\n    };\n\n  $.fn.extend({\n    openModal: function(options) {\n\n      $('body').css('overflow', 'hidden');\n\n      var defaults = {\n        opacity: 0.5,\n        in_duration: 350,\n        out_duration: 250,\n        ready: undefined,\n        complete: undefined,\n        dismissible: true,\n        starting_top: '4%'\n      },\n      overlayID = _generateID(),\n      $modal = $(this),\n      $overlay = $('<div class=\"lean-overlay\"></div>'),\n      lStack = (++_stack);\n\n      // Store a reference of the overlay\n      $overlay.attr('id', overlayID).css('z-index', 1000 + lStack * 2);\n      $modal.data('overlay-id', overlayID).css('z-index', 1000 + lStack * 2 + 1);\n\n      $(\"body\").append($overlay);\n\n      // Override defaults\n      options = $.extend(defaults, options);\n\n      if (options.dismissible) {\n        $overlay.click(function() {\n          $modal.closeModal(options);\n        });\n        // Return on ESC\n        $(document).on('keyup.leanModal' + overlayID, function(e) {\n          if (e.keyCode === 27) {   // ESC key\n            $modal.closeModal(options);\n          }\n        });\n      }\n\n      $modal.find(\".modal-close\").on('click.close', function(e) {\n        $modal.closeModal(options);\n      });\n\n      $overlay.css({ display : \"block\", opacity : 0 });\n\n      $modal.css({\n        display : \"block\",\n        opacity: 0\n      });\n\n      $overlay.velocity({opacity: options.opacity}, {duration: options.in_duration, queue: false, ease: \"easeOutCubic\"});\n      $modal.data('associated-overlay', $overlay[0]);\n\n      // Define Bottom Sheet animation\n      if ($modal.hasClass('bottom-sheet')) {\n        $modal.velocity({bottom: \"0\", opacity: 1}, {\n          duration: options.in_duration,\n          queue: false,\n          ease: \"easeOutCubic\",\n          // Handle modal ready callback\n          complete: function() {\n            if (typeof(options.ready) === \"function\") {\n              options.ready();\n            }\n          }\n        });\n      }\n      else {\n        $.Velocity.hook($modal, \"scaleX\", 0.7);\n        $modal.css({ top: options.starting_top });\n        $modal.velocity({top: \"10%\", opacity: 1, scaleX: '1'}, {\n          duration: options.in_duration,\n          queue: false,\n          ease: \"easeOutCubic\",\n          // Handle modal ready callback\n          complete: function() {\n            if (typeof(options.ready) === \"function\") {\n              options.ready();\n            }\n          }\n        });\n      }\n\n\n    }\n  });\n\n  $.fn.extend({\n    closeModal: function(options) {\n      var defaults = {\n        out_duration: 250,\n        complete: undefined\n      },\n      $modal = $(this),\n      overlayID = $modal.data('overlay-id'),\n      $overlay = $('#' + overlayID);\n\n      options = $.extend(defaults, options);\n\n      // Disable scrolling\n      $('body').css('overflow', '');\n\n      $modal.find('.modal-close').off('click.close');\n      $(document).off('keyup.leanModal' + overlayID);\n\n      $overlay.velocity( { opacity: 0}, {duration: options.out_duration, queue: false, ease: \"easeOutQuart\"});\n\n\n      // Define Bottom Sheet animation\n      if ($modal.hasClass('bottom-sheet')) {\n        $modal.velocity({bottom: \"-100%\", opacity: 0}, {\n          duration: options.out_duration,\n          queue: false,\n          ease: \"easeOutCubic\",\n          // Handle modal ready callback\n          complete: function() {\n            $overlay.css({display:\"none\"});\n\n            // Call complete callback\n            if (typeof(options.complete) === \"function\") {\n              options.complete();\n            }\n            $overlay.remove();\n            _stack--;\n          }\n        });\n      }\n      else {\n        $modal.velocity(\n          { top: options.starting_top, opacity: 0, scaleX: 0.7}, {\n          duration: options.out_duration,\n          complete:\n            function() {\n\n              $(this).css('display', 'none');\n              // Call complete callback\n              if (typeof(options.complete) === \"function\") {\n                options.complete();\n              }\n              $overlay.remove();\n              _stack--;\n            }\n          }\n        );\n      }\n    }\n  });\n\n  $.fn.extend({\n    leanModal: function(option) {\n      return this.each(function() {\n\n        var defaults = {\n          starting_top: '4%'\n        },\n        // Override defaults\n        options = $.extend(defaults, option);\n\n        // Close Handlers\n        $(this).click(function(e) {\n          options.starting_top = ($(this).offset().top - $(window).scrollTop()) /1.15;\n          var modal_id = $(this).attr(\"href\") || '#' + $(this).data('target');\n          $(modal_id).openModal(options);\n          e.preventDefault();\n        }); // done set on click\n      }); // done return\n    }\n  });\n})(jQuery);\n;(function ($) {\n\n  $.fn.materialbox = function () {\n\n    return this.each(function() {\n\n      if ($(this).hasClass('initialized')) {\n        return;\n      }\n\n      $(this).addClass('initialized');\n\n      var overlayActive = false;\n      var doneAnimating = true;\n      var inDuration = 275;\n      var outDuration = 200;\n      var origin = $(this);\n      var placeholder = $('<div></div>').addClass('material-placeholder');\n      var originalWidth = 0;\n      var originalHeight = 0;\n      var ancestorsChanged;\n      var ancestor;\n      origin.wrap(placeholder);\n\n\n      origin.on('click', function(){\n        var placeholder = origin.parent('.material-placeholder');\n        var windowWidth = window.innerWidth;\n        var windowHeight = window.innerHeight;\n        var originalWidth = origin.width();\n        var originalHeight = origin.height();\n\n\n        // If already modal, return to original\n        if (doneAnimating === false) {\n          returnToOriginal();\n          return false;\n        }\n        else if (overlayActive && doneAnimating===true) {\n          returnToOriginal();\n          return false;\n        }\n\n\n        // Set states\n        doneAnimating = false;\n        origin.addClass('active');\n        overlayActive = true;\n\n        // Set positioning for placeholder\n        placeholder.css({\n          width: placeholder[0].getBoundingClientRect().width,\n          height: placeholder[0].getBoundingClientRect().height,\n          position: 'relative',\n          top: 0,\n          left: 0\n        });\n\n        // Find ancestor with overflow: hidden; and remove it\n        ancestorsChanged = undefined;\n        ancestor = placeholder[0].parentNode;\n        var count = 0;\n        while (ancestor !== null && !$(ancestor).is(document)) {\n          var curr = $(ancestor);\n          if (curr.css('overflow') === 'hidden') {\n            curr.css('overflow', 'visible');\n            if (ancestorsChanged === undefined) {\n              ancestorsChanged = curr;\n            }\n            else {\n              ancestorsChanged = ancestorsChanged.add(curr);\n            }\n          }\n          ancestor = ancestor.parentNode;\n        }\n\n        // Set css on origin\n        origin.css({position: 'absolute', 'z-index': 1000})\n        .data('width', originalWidth)\n        .data('height', originalHeight);\n\n        // Add overlay\n        var overlay = $('<div id=\"materialbox-overlay\"></div>')\n          .css({\n            opacity: 0\n          })\n          .click(function(){\n            if (doneAnimating === true)\n            returnToOriginal();\n          });\n          // Animate Overlay\n          $('body').append(overlay);\n          overlay.velocity({opacity: 1}, {duration: inDuration, queue: false, easing: 'easeOutQuad'}\n            );\n\n\n        // Add and animate caption if it exists\n        if (origin.data('caption') !== \"\") {\n          var $photo_caption = $('<div class=\"materialbox-caption\"></div>');\n          $photo_caption.text(origin.data('caption'));\n          $('body').append($photo_caption);\n          $photo_caption.css({ \"display\": \"inline\" });\n          $photo_caption.velocity({opacity: 1}, {duration: inDuration, queue: false, easing: 'easeOutQuad'});\n        }\n\n\n\n        // Resize Image\n        var ratio = 0;\n        var widthPercent = originalWidth / windowWidth;\n        var heightPercent = originalHeight / windowHeight;\n        var newWidth = 0;\n        var newHeight = 0;\n\n        if (widthPercent > heightPercent) {\n          ratio = originalHeight / originalWidth;\n          newWidth = windowWidth * 0.9;\n          newHeight = windowWidth * 0.9 * ratio;\n        }\n        else {\n          ratio = originalWidth / originalHeight;\n          newWidth = (windowHeight * 0.9) * ratio;\n          newHeight = windowHeight * 0.9;\n        }\n\n        // Animate image + set z-index\n        if(origin.hasClass('responsive-img')) {\n          origin.velocity({'max-width': newWidth, 'width': originalWidth}, {duration: 0, queue: false,\n            complete: function(){\n              origin.css({left: 0, top: 0})\n              .velocity(\n                {\n                  height: newHeight,\n                  width: newWidth,\n                  left: $(document).scrollLeft() + windowWidth/2 - origin.parent('.material-placeholder').offset().left - newWidth/2,\n                  top: $(document).scrollTop() + windowHeight/2 - origin.parent('.material-placeholder').offset().top - newHeight/ 2\n                },\n                {\n                  duration: inDuration,\n                  queue: false,\n                  easing: 'easeOutQuad',\n                  complete: function(){doneAnimating = true;}\n                }\n              );\n            } // End Complete\n          }); // End Velocity\n        }\n        else {\n          origin.css('left', 0)\n          .css('top', 0)\n          .velocity(\n            {\n              height: newHeight,\n              width: newWidth,\n              left: $(document).scrollLeft() + windowWidth/2 - origin.parent('.material-placeholder').offset().left - newWidth/2,\n              top: $(document).scrollTop() + windowHeight/2 - origin.parent('.material-placeholder').offset().top - newHeight/ 2\n            },\n            {\n              duration: inDuration,\n              queue: false,\n              easing: 'easeOutQuad',\n              complete: function(){doneAnimating = true;}\n            }\n            ); // End Velocity\n        }\n\n    }); // End origin on click\n\n\n      // Return on scroll\n      $(window).scroll(function() {\n        if (overlayActive ) {\n          returnToOriginal();\n        }\n      });\n\n      // Return on ESC\n      $(document).keyup(function(e) {\n\n        if (e.keyCode === 27 && doneAnimating === true) {   // ESC key\n          if (overlayActive) {\n            returnToOriginal();\n          }\n        }\n      });\n\n\n      // This function returns the modaled image to the original spot\n      function returnToOriginal() {\n\n          doneAnimating = false;\n\n          var placeholder = origin.parent('.material-placeholder');\n          var windowWidth = window.innerWidth;\n          var windowHeight = window.innerHeight;\n          var originalWidth = origin.data('width');\n          var originalHeight = origin.data('height');\n\n          origin.velocity(\"stop\", true);\n          $('#materialbox-overlay').velocity(\"stop\", true);\n          $('.materialbox-caption').velocity(\"stop\", true);\n\n\n          $('#materialbox-overlay').velocity({opacity: 0}, {\n            duration: outDuration, // Delay prevents animation overlapping\n            queue: false, easing: 'easeOutQuad',\n            complete: function(){\n              // Remove Overlay\n              overlayActive = false;\n              $(this).remove();\n            }\n          });\n\n          // Resize Image\n          origin.velocity(\n            {\n              width: originalWidth,\n              height: originalHeight,\n              left: 0,\n              top: 0\n            },\n            {\n              duration: outDuration,\n              queue: false, easing: 'easeOutQuad'\n            }\n          );\n\n          // Remove Caption + reset css settings on image\n          $('.materialbox-caption').velocity({opacity: 0}, {\n            duration: outDuration, // Delay prevents animation overlapping\n            queue: false, easing: 'easeOutQuad',\n            complete: function(){\n              placeholder.css({\n                height: '',\n                width: '',\n                position: '',\n                top: '',\n                left: ''\n              });\n\n              origin.css({\n                height: '',\n                top: '',\n                left: '',\n                width: '',\n                'max-width': '',\n                position: '',\n                'z-index': ''\n              });\n\n              // Remove class\n              origin.removeClass('active');\n              doneAnimating = true;\n              $(this).remove();\n\n              // Remove overflow overrides on ancestors\n              ancestorsChanged.css('overflow', '');\n            }\n          });\n\n        }\n        });\n};\n\n$(document).ready(function(){\n  $('.materialboxed').materialbox();\n});\n\n}( jQuery ));\n;(function ($) {\n\n    $.fn.parallax = function () {\n      var window_width = $(window).width();\n      // Parallax Scripts\n      return this.each(function(i) {\n        var $this = $(this);\n        $this.addClass('parallax');\n\n        function updateParallax(initial) {\n          var container_height;\n          if (window_width < 601) {\n            container_height = ($this.height() > 0) ? $this.height() : $this.children(\"img\").height();\n          }\n          else {\n            container_height = ($this.height() > 0) ? $this.height() : 500;\n          }\n          var $img = $this.children(\"img\").first();\n          var img_height = $img.height();\n          var parallax_dist = img_height - container_height;\n          var bottom = $this.offset().top + container_height;\n          var top = $this.offset().top;\n          var scrollTop = $(window).scrollTop();\n          var windowHeight = window.innerHeight;\n          var windowBottom = scrollTop + windowHeight;\n          var percentScrolled = (windowBottom - top) / (container_height + windowHeight);\n          var parallax = Math.round((parallax_dist * percentScrolled));\n\n          if (initial) {\n            $img.css('display', 'block');\n          }\n          if ((bottom > scrollTop) && (top < (scrollTop + windowHeight))) {\n            $img.css('transform', \"translate3D(-50%,\" + parallax + \"px, 0)\");\n          }\n\n        }\n\n        // Wait for image load\n        $this.children(\"img\").one(\"load\", function() {\n          updateParallax(true);\n        }).each(function() {\n          if(this.complete) $(this).load();\n        });\n\n        $(window).scroll(function() {\n          window_width = $(window).width();\n          updateParallax(false);\n        });\n\n        $(window).resize(function() {\n          window_width = $(window).width();\n          updateParallax(false);\n        });\n\n      });\n\n    };\n}( jQuery ));;(function ($) {\n\n  var methods = {\n    init : function() {\n      return this.each(function() {\n\n      // For each set of tabs, we want to keep track of\n      // which tab is active and its associated content\n      var $this = $(this),\n          window_width = $(window).width();\n\n      $this.width('100%');\n      var $active, $content, $links = $this.find('li.tab a'),\n          $tabs_width = $this.width(),\n          $tab_width = $this.find('li').first().outerWidth(),\n          $index = 0;\n\n      // If the location.hash matches one of the links, use that as the active tab.\n      $active = $($links.filter('[href=\"'+location.hash+'\"]'));\n\n      // If no match is found, use the first link or any with class 'active' as the initial active tab.\n      if ($active.length === 0) {\n          $active = $(this).find('li.tab a.active').first();\n      }\n      if ($active.length === 0) {\n        $active = $(this).find('li.tab a').first();\n      }\n\n      $active.addClass('active');\n      $index = $links.index($active);\n      if ($index < 0) {\n        $index = 0;\n      }\n\n      $content = $($active[0].hash);\n\n      // append indicator then set indicator width to tab width\n      $this.append('<div class=\"indicator\"></div>');\n      var $indicator = $this.find('.indicator');\n      if ($this.is(\":visible\")) {\n        $indicator.css({\"right\": $tabs_width - (($index + 1) * $tab_width)});\n        $indicator.css({\"left\": $index * $tab_width});\n      }\n      $(window).resize(function () {\n        $tabs_width = $this.width();\n        $tab_width = $this.find('li').first().outerWidth();\n        if ($index < 0) {\n          $index = 0;\n        }\n        if ($tab_width !== 0 && $tabs_width !== 0) {\n          $indicator.css({\"right\": $tabs_width - (($index + 1) * $tab_width)});\n          $indicator.css({\"left\": $index * $tab_width});\n        }\n      });\n\n      // Hide the remaining content\n      $links.not($active).each(function () {\n        $(this.hash).hide();\n      });\n\n\n      // Bind the click event handler\n      $this.on('click', 'a', function(e) {\n        if ($(this).parent().hasClass('disabled')) {\n          e.preventDefault();\n          return;\n        }\n\n        $tabs_width = $this.width();\n        $tab_width = $this.find('li').first().outerWidth();\n\n        // Make the old tab inactive.\n        $active.removeClass('active');\n        $content.hide();\n\n        // Update the variables with the new link and content\n        $active = $(this);\n        $content = $(this.hash);\n        $links = $this.find('li.tab a');\n\n        // Make the tab active.\n        $active.addClass('active');\n        var $prev_index = $index;\n        $index = $links.index($(this));\n        if ($index < 0) {\n          $index = 0;\n        }\n        // Change url to current tab\n        // window.location.hash = $active.attr('href');\n\n        $content.show();\n\n        // Update indicator\n        if (($index - $prev_index) >= 0) {\n          $indicator.velocity({\"right\": $tabs_width - (($index + 1) * $tab_width)}, { duration: 300, queue: false, easing: 'easeOutQuad'});\n          $indicator.velocity({\"left\": $index * $tab_width}, {duration: 300, queue: false, easing: 'easeOutQuad', delay: 90});\n\n        }\n        else {\n          $indicator.velocity({\"left\": $index * $tab_width}, { duration: 300, queue: false, easing: 'easeOutQuad'});\n          $indicator.velocity({\"right\": $tabs_width - (($index + 1) * $tab_width)}, {duration: 300, queue: false, easing: 'easeOutQuad', delay: 90});\n        }\n\n        // Prevent the anchor's default click action\n        e.preventDefault();\n      });\n    });\n\n    },\n    select_tab : function( id ) {\n      this.find('a[href=\"#' + id + '\"]').trigger('click');\n    }\n  };\n\n  $.fn.tabs = function(methodOrOptions) {\n    if ( methods[methodOrOptions] ) {\n      return methods[ methodOrOptions ].apply( this, Array.prototype.slice.call( arguments, 1 ));\n    } else if ( typeof methodOrOptions === 'object' || ! methodOrOptions ) {\n      // Default to \"init\"\n      return methods.init.apply( this, arguments );\n    } else {\n      $.error( 'Method ' +  methodOrOptions + ' does not exist on jQuery.tooltip' );\n    }\n  };\n\n  $(document).ready(function(){\n    $('ul.tabs').tabs();\n  });\n}( jQuery ));\n;(function ($) {\n    $.fn.tooltip = function (options) {\n        var timeout = null,\n        margin = 5;\n\n      // Defaults\n      var defaults = {\n        delay: 350\n      };\n\n      // Remove tooltip from the activator\n      if (options === \"remove\") {\n        this.each(function(){\n          $('#' + $(this).attr('data-tooltip-id')).remove();\n          $(this).off('mouseenter.tooltip mouseleave.tooltip');\n        });\n        return false;\n      }\n\n      options = $.extend(defaults, options);\n\n\n      return this.each(function(){\n        var tooltipId = Materialize.guid();\n        var origin = $(this);\n        origin.attr('data-tooltip-id', tooltipId);\n\n        // Create Text span\n        var tooltip_text = $('<span></span>').text(origin.attr('data-tooltip'));\n\n        // Create tooltip\n        var newTooltip = $('<div></div>');\n        newTooltip.addClass('material-tooltip').append(tooltip_text)\n          .appendTo($('body'))\n          .attr('id', tooltipId);\n\n        var backdrop = $('<div></div>').addClass('backdrop');\n        backdrop.appendTo(newTooltip);\n        backdrop.css({ top: 0, left:0 });\n\n\n      //Destroy previously binded events\n      origin.off('mouseenter.tooltip mouseleave.tooltip');\n      // Mouse In\n      var started = false, timeoutRef;\n      origin.on({\n        'mouseenter.tooltip': function(e) {\n          var tooltip_delay = origin.attr('data-delay');\n          tooltip_delay = (tooltip_delay === undefined || tooltip_delay === '') ?\n              options.delay : tooltip_delay;\n          timeoutRef = setTimeout(function(){\n            started = true;\n            newTooltip.velocity('stop');\n            backdrop.velocity('stop');\n            newTooltip.css({ display: 'block', left: '0px', top: '0px' });\n\n            // Set Tooltip text\n            newTooltip.children('span').text(origin.attr('data-tooltip'));\n\n            // Tooltip positioning\n            var originWidth = origin.outerWidth();\n            var originHeight = origin.outerHeight();\n            var tooltipPosition =  origin.attr('data-position');\n            var tooltipHeight = newTooltip.outerHeight();\n            var tooltipWidth = newTooltip.outerWidth();\n            var tooltipVerticalMovement = '0px';\n            var tooltipHorizontalMovement = '0px';\n            var scale_factor = 8;\n            var targetTop, targetLeft, newCoordinates;\n\n            if (tooltipPosition === \"top\") {\n              // Top Position\n              targetTop = origin.offset().top - tooltipHeight - margin;\n              targetLeft = origin.offset().left + originWidth/2 - tooltipWidth/2;\n              newCoordinates = repositionWithinScreen(targetLeft, targetTop, tooltipWidth, tooltipHeight);\n\n              tooltipVerticalMovement = '-10px';\n              backdrop.css({\n                borderRadius: '14px 14px 0 0',\n                transformOrigin: '50% 90%',\n                marginTop: tooltipHeight,\n                marginLeft: (tooltipWidth/2) - (backdrop.width()/2)\n              });\n            }\n            // Left Position\n            else if (tooltipPosition === \"left\") {\n              targetTop = origin.offset().top + originHeight/2 - tooltipHeight/2;\n              targetLeft =  origin.offset().left - tooltipWidth - margin;\n              newCoordinates = repositionWithinScreen(targetLeft, targetTop, tooltipWidth, tooltipHeight);\n\n              tooltipHorizontalMovement = '-10px';\n              backdrop.css({\n                width: '14px',\n                height: '14px',\n                borderRadius: '14px 0 0 14px',\n                transformOrigin: '95% 50%',\n                marginTop: tooltipHeight/2,\n                marginLeft: tooltipWidth\n              });\n            }\n            // Right Position\n            else if (tooltipPosition === \"right\") {\n              targetTop = origin.offset().top + originHeight/2 - tooltipHeight/2;\n              targetLeft = origin.offset().left + originWidth + margin;\n              newCoordinates = repositionWithinScreen(targetLeft, targetTop, tooltipWidth, tooltipHeight);\n\n              tooltipHorizontalMovement = '+10px';\n              backdrop.css({\n                width: '14px',\n                height: '14px',\n                borderRadius: '0 14px 14px 0',\n                transformOrigin: '5% 50%',\n                marginTop: tooltipHeight/2,\n                marginLeft: '0px'\n              });\n            }\n            else {\n              // Bottom Position\n              targetTop = origin.offset().top + origin.outerHeight() + margin;\n              targetLeft = origin.offset().left + originWidth/2 - tooltipWidth/2;\n              newCoordinates = repositionWithinScreen(targetLeft, targetTop, tooltipWidth, tooltipHeight);\n              tooltipVerticalMovement = '+10px';\n              backdrop.css({\n                marginLeft: (tooltipWidth/2) - (backdrop.width()/2)\n              });\n            }\n\n            // Set tooptip css placement\n            newTooltip.css({\n              top: newCoordinates.y,\n              left: newCoordinates.x\n            });\n\n            // Calculate Scale to fill\n            scale_factor = tooltipWidth / 8;\n            if (scale_factor < 8) {\n              scale_factor = 8;\n            }\n            if (tooltipPosition === \"right\" || tooltipPosition === \"left\") {\n              scale_factor = tooltipWidth / 10;\n              if (scale_factor < 6)\n                scale_factor = 6;\n            }\n\n            newTooltip.velocity({ marginTop: tooltipVerticalMovement, marginLeft: tooltipHorizontalMovement}, { duration: 350, queue: false })\n              .velocity({opacity: 1}, {duration: 300, delay: 50, queue: false});\n            backdrop.css({ display: 'block' })\n              .velocity({opacity:1},{duration: 55, delay: 0, queue: false})\n              .velocity({scale: scale_factor}, {duration: 300, delay: 0, queue: false, easing: 'easeInOutQuad'});\n\n\n          }, tooltip_delay); // End Interval\n\n        // Mouse Out\n        },\n        'mouseleave.tooltip': function(){\n          // Reset State\n          started = false;\n          clearTimeout(timeoutRef);\n\n          // Animate back\n          setTimeout(function() {\n            if (started != true) {\n              newTooltip.velocity({\n                opacity: 0, marginTop: 0, marginLeft: 0}, { duration: 225, queue: false});\n              backdrop.velocity({opacity: 0, scale: 1}, {\n                duration:225,\n                queue: false,\n                complete: function(){\n                  backdrop.css('display', 'none');\n                  newTooltip.css('display', 'none');\n                  started = false;}\n              });\n            }\n          },225);\n        }\n        });\n    });\n  };\n\n  var repositionWithinScreen = function(x, y, width, height) {\n    var newX = x\n    var newY = y;\n\n    if (newX < 0) {\n      newX = 4;\n    } else if (newX + width > window.innerWidth) {\n      newX -= newX + width - window.innerWidth;\n    }\n\n    if (newY < 0) {\n      newY = 4;\n    } else if (newY + height > window.innerHeight + $(window).scrollTop) {\n      newY -= newY + height - window.innerHeight;\n    }\n\n    return {x: newX, y: newY};\n  };\n\n  $(document).ready(function(){\n     $('.tooltipped').tooltip();\n   });\n}( jQuery ));\n;/*!\n * Waves v0.6.4\n * http://fian.my.id/Waves\n *\n * Copyright 2014 Alfiana E. Sibuea and other contributors\n * Released under the MIT license\n * https://github.com/fians/Waves/blob/master/LICENSE\n */\n\n;(function(window) {\n    'use strict';\n\n    var Waves = Waves || {};\n    var $$ = document.querySelectorAll.bind(document);\n\n    // Find exact position of element\n    function isWindow(obj) {\n        return obj !== null && obj === obj.window;\n    }\n\n    function getWindow(elem) {\n        return isWindow(elem) ? elem : elem.nodeType === 9 && elem.defaultView;\n    }\n\n    function offset(elem) {\n        var docElem, win,\n            box = {top: 0, left: 0},\n            doc = elem && elem.ownerDocument;\n\n        docElem = doc.documentElement;\n\n        if (typeof elem.getBoundingClientRect !== typeof undefined) {\n            box = elem.getBoundingClientRect();\n        }\n        win = getWindow(doc);\n        return {\n            top: box.top + win.pageYOffset - docElem.clientTop,\n            left: box.left + win.pageXOffset - docElem.clientLeft\n        };\n    }\n\n    function convertStyle(obj) {\n        var style = '';\n\n        for (var a in obj) {\n            if (obj.hasOwnProperty(a)) {\n                style += (a + ':' + obj[a] + ';');\n            }\n        }\n\n        return style;\n    }\n\n    var Effect = {\n\n        // Effect delay\n        duration: 750,\n\n        show: function(e, element) {\n\n            // Disable right click\n            if (e.button === 2) {\n                return false;\n            }\n\n            var el = element || this;\n\n            // Create ripple\n            var ripple = document.createElement('div');\n            ripple.className = 'waves-ripple';\n            el.appendChild(ripple);\n\n            // Get click coordinate and element witdh\n            var pos         = offset(el);\n            var relativeY   = (e.pageY - pos.top);\n            var relativeX   = (e.pageX - pos.left);\n            var scale       = 'scale('+((el.clientWidth / 100) * 10)+')';\n\n            // Support for touch devices\n            if ('touches' in e) {\n              relativeY   = (e.touches[0].pageY - pos.top);\n              relativeX   = (e.touches[0].pageX - pos.left);\n            }\n\n            // Attach data to element\n            ripple.setAttribute('data-hold', Date.now());\n            ripple.setAttribute('data-scale', scale);\n            ripple.setAttribute('data-x', relativeX);\n            ripple.setAttribute('data-y', relativeY);\n\n            // Set ripple position\n            var rippleStyle = {\n                'top': relativeY+'px',\n                'left': relativeX+'px'\n            };\n\n            ripple.className = ripple.className + ' waves-notransition';\n            ripple.setAttribute('style', convertStyle(rippleStyle));\n            ripple.className = ripple.className.replace('waves-notransition', '');\n\n            // Scale the ripple\n            rippleStyle['-webkit-transform'] = scale;\n            rippleStyle['-moz-transform'] = scale;\n            rippleStyle['-ms-transform'] = scale;\n            rippleStyle['-o-transform'] = scale;\n            rippleStyle.transform = scale;\n            rippleStyle.opacity   = '1';\n\n            rippleStyle['-webkit-transition-duration'] = Effect.duration + 'ms';\n            rippleStyle['-moz-transition-duration']    = Effect.duration + 'ms';\n            rippleStyle['-o-transition-duration']      = Effect.duration + 'ms';\n            rippleStyle['transition-duration']         = Effect.duration + 'ms';\n\n            rippleStyle['-webkit-transition-timing-function'] = 'cubic-bezier(0.250, 0.460, 0.450, 0.940)';\n            rippleStyle['-moz-transition-timing-function']    = 'cubic-bezier(0.250, 0.460, 0.450, 0.940)';\n            rippleStyle['-o-transition-timing-function']      = 'cubic-bezier(0.250, 0.460, 0.450, 0.940)';\n            rippleStyle['transition-timing-function']         = 'cubic-bezier(0.250, 0.460, 0.450, 0.940)';\n\n            ripple.setAttribute('style', convertStyle(rippleStyle));\n        },\n\n        hide: function(e) {\n            TouchHandler.touchup(e);\n\n            var el = this;\n            var width = el.clientWidth * 1.4;\n\n            // Get first ripple\n            var ripple = null;\n            var ripples = el.getElementsByClassName('waves-ripple');\n            if (ripples.length > 0) {\n                ripple = ripples[ripples.length - 1];\n            } else {\n                return false;\n            }\n\n            var relativeX   = ripple.getAttribute('data-x');\n            var relativeY   = ripple.getAttribute('data-y');\n            var scale       = ripple.getAttribute('data-scale');\n\n            // Get delay beetween mousedown and mouse leave\n            var diff = Date.now() - Number(ripple.getAttribute('data-hold'));\n            var delay = 350 - diff;\n\n            if (delay < 0) {\n                delay = 0;\n            }\n\n            // Fade out ripple after delay\n            setTimeout(function() {\n                var style = {\n                    'top': relativeY+'px',\n                    'left': relativeX+'px',\n                    'opacity': '0',\n\n                    // Duration\n                    '-webkit-transition-duration': Effect.duration + 'ms',\n                    '-moz-transition-duration': Effect.duration + 'ms',\n                    '-o-transition-duration': Effect.duration + 'ms',\n                    'transition-duration': Effect.duration + 'ms',\n                    '-webkit-transform': scale,\n                    '-moz-transform': scale,\n                    '-ms-transform': scale,\n                    '-o-transform': scale,\n                    'transform': scale,\n                };\n\n                ripple.setAttribute('style', convertStyle(style));\n\n                setTimeout(function() {\n                    try {\n                        el.removeChild(ripple);\n                    } catch(e) {\n                        return false;\n                    }\n                }, Effect.duration);\n            }, delay);\n        },\n\n        // Little hack to make <input> can perform waves effect\n        wrapInput: function(elements) {\n            for (var a = 0; a < elements.length; a++) {\n                var el = elements[a];\n\n                if (el.tagName.toLowerCase() === 'input') {\n                    var parent = el.parentNode;\n\n                    // If input already have parent just pass through\n                    if (parent.tagName.toLowerCase() === 'i' && parent.className.indexOf('waves-effect') !== -1) {\n                        continue;\n                    }\n\n                    // Put element class and style to the specified parent\n                    var wrapper = document.createElement('i');\n                    wrapper.className = el.className + ' waves-input-wrapper';\n\n                    var elementStyle = el.getAttribute('style');\n\n                    if (!elementStyle) {\n                        elementStyle = '';\n                    }\n\n                    wrapper.setAttribute('style', elementStyle);\n\n                    el.className = 'waves-button-input';\n                    el.removeAttribute('style');\n\n                    // Put element as child\n                    parent.replaceChild(wrapper, el);\n                    wrapper.appendChild(el);\n                }\n            }\n        }\n    };\n\n\n    /**\n     * Disable mousedown event for 500ms during and after touch\n     */\n    var TouchHandler = {\n        /* uses an integer rather than bool so there's no issues with\n         * needing to clear timeouts if another touch event occurred\n         * within the 500ms. Cannot mouseup between touchstart and\n         * touchend, nor in the 500ms after touchend. */\n        touches: 0,\n        allowEvent: function(e) {\n            var allow = true;\n\n            if (e.type === 'touchstart') {\n                TouchHandler.touches += 1; //push\n            } else if (e.type === 'touchend' || e.type === 'touchcancel') {\n                setTimeout(function() {\n                    if (TouchHandler.touches > 0) {\n                        TouchHandler.touches -= 1; //pop after 500ms\n                    }\n                }, 500);\n            } else if (e.type === 'mousedown' && TouchHandler.touches > 0) {\n                allow = false;\n            }\n\n            return allow;\n        },\n        touchup: function(e) {\n            TouchHandler.allowEvent(e);\n        }\n    };\n\n\n    /**\n     * Delegated click handler for .waves-effect element.\n     * returns null when .waves-effect element not in \"click tree\"\n     */\n    function getWavesEffectElement(e) {\n        if (TouchHandler.allowEvent(e) === false) {\n            return null;\n        }\n\n        var element = null;\n        var target = e.target || e.srcElement;\n\n        while (target.parentElement !== null) {\n            if (!(target instanceof SVGElement) && target.className.indexOf('waves-effect') !== -1) {\n                element = target;\n                break;\n            } else if (target.classList.contains('waves-effect')) {\n                element = target;\n                break;\n            }\n            target = target.parentElement;\n        }\n\n        return element;\n    }\n\n    /**\n     * Bubble the click and show effect if .waves-effect elem was found\n     */\n    function showEffect(e) {\n        var element = getWavesEffectElement(e);\n\n        if (element !== null) {\n            Effect.show(e, element);\n\n            if ('ontouchstart' in window) {\n                element.addEventListener('touchend', Effect.hide, false);\n                element.addEventListener('touchcancel', Effect.hide, false);\n            }\n\n            element.addEventListener('mouseup', Effect.hide, false);\n            element.addEventListener('mouseleave', Effect.hide, false);\n        }\n    }\n\n    Waves.displayEffect = function(options) {\n        options = options || {};\n\n        if ('duration' in options) {\n            Effect.duration = options.duration;\n        }\n\n        //Wrap input inside <i> tag\n        Effect.wrapInput($$('.waves-effect'));\n\n        if ('ontouchstart' in window) {\n            document.body.addEventListener('touchstart', showEffect, false);\n        }\n\n        document.body.addEventListener('mousedown', showEffect, false);\n    };\n\n    /**\n     * Attach Waves to an input element (or any element which doesn't\n     * bubble mouseup/mousedown events).\n     *   Intended to be used with dynamically loaded forms/inputs, or\n     * where the user doesn't want a delegated click handler.\n     */\n    Waves.attach = function(element) {\n        //FUTURE: automatically add waves classes and allow users\n        // to specify them with an options param? Eg. light/classic/button\n        if (element.tagName.toLowerCase() === 'input') {\n            Effect.wrapInput([element]);\n            element = element.parentElement;\n        }\n\n        if ('ontouchstart' in window) {\n            element.addEventListener('touchstart', showEffect, false);\n        }\n\n        element.addEventListener('mousedown', showEffect, false);\n    };\n\n    window.Waves = Waves;\n\n    document.addEventListener('DOMContentLoaded', function() {\n        Waves.displayEffect();\n    }, false);\n\n})(window);\n;Materialize.toast = function (message, displayLength, className, completeCallback) {\n    className = className || \"\";\n\n    var container = document.getElementById('toast-container');\n\n    // Create toast container if it does not exist\n    if (container === null) {\n        // create notification container\n        container = document.createElement('div');\n        container.id = 'toast-container';\n        document.body.appendChild(container);\n    }\n\n    // Select and append toast\n    var newToast = createToast(message);\n\n    // only append toast if message is not undefined\n    if(message){\n        container.appendChild(newToast);\n    }\n\n    newToast.style.top = '35px';\n    newToast.style.opacity = 0;\n\n    // Animate toast in\n    Vel(newToast, { \"top\" : \"0px\", opacity: 1 }, {duration: 300,\n      easing: 'easeOutCubic',\n      queue: false});\n\n    // Allows timer to be pause while being panned\n    var timeLeft = displayLength;\n    var counterInterval = setInterval (function(){\n\n\n      if (newToast.parentNode === null)\n        window.clearInterval(counterInterval);\n\n      // If toast is not being dragged, decrease its time remaining\n      if (!newToast.classList.contains('panning')) {\n        timeLeft -= 20;\n      }\n\n      if (timeLeft <= 0) {\n        // Animate toast out\n        Vel(newToast, {\"opacity\": 0, marginTop: '-40px'}, { duration: 375,\n            easing: 'easeOutExpo',\n            queue: false,\n            complete: function(){\n              // Call the optional callback\n              if(typeof(completeCallback) === \"function\")\n                completeCallback();\n              // Remove toast after it times out\n              this[0].parentNode.removeChild(this[0]);\n            }\n          });\n        window.clearInterval(counterInterval);\n      }\n    }, 20);\n\n\n\n    function createToast(html) {\n\n        // Create toast\n        var toast = document.createElement('div');\n        toast.classList.add('toast');\n        if (className) {\n            var classes = className.split(' ');\n\n            for (var i = 0, count = classes.length; i < count; i++) {\n                toast.classList.add(classes[i]);\n            }\n        }\n        // If type of parameter is HTML Element\n        if ( typeof HTMLElement === \"object\" ? html instanceof HTMLElement : html && typeof html === \"object\" && html !== null && html.nodeType === 1 && typeof html.nodeName===\"string\"\n) {\n          toast.appendChild(html);\n        }\n        else if (html instanceof jQuery) {\n          // Check if it is jQuery object\n          toast.appendChild(html[0]);\n        }\n        else {\n          // Insert as text;\n          toast.innerHTML = html; \n        }\n        // Bind hammer\n        var hammerHandler = new Hammer(toast, {prevent_default: false});\n        hammerHandler.on('pan', function(e) {\n          var deltaX = e.deltaX;\n          var activationDistance = 80;\n\n          // Change toast state\n          if (!toast.classList.contains('panning')){\n            toast.classList.add('panning');\n          }\n\n          var opacityPercent = 1-Math.abs(deltaX / activationDistance);\n          if (opacityPercent < 0)\n            opacityPercent = 0;\n\n          Vel(toast, {left: deltaX, opacity: opacityPercent }, {duration: 50, queue: false, easing: 'easeOutQuad'});\n\n        });\n\n        hammerHandler.on('panend', function(e) {\n          var deltaX = e.deltaX;\n          var activationDistance = 80;\n\n          // If toast dragged past activation point\n          if (Math.abs(deltaX) > activationDistance) {\n            Vel(toast, {marginTop: '-40px'}, { duration: 375,\n                easing: 'easeOutExpo',\n                queue: false,\n                complete: function(){\n                  if(typeof(completeCallback) === \"function\") {\n                    completeCallback();\n                  }\n                  toast.parentNode.removeChild(toast);\n                }\n            });\n\n          } else {\n            toast.classList.remove('panning');\n            // Put toast back into original position\n            Vel(toast, { left: 0, opacity: 1 }, { duration: 300,\n              easing: 'easeOutExpo',\n              queue: false\n            });\n\n          }\n        });\n\n        return toast;\n    }\n};\n;(function ($) {\n\n  var methods = {\n    init : function(options) {\n      var defaults = {\n        menuWidth: 240,\n        edge: 'left',\n        closeOnClick: false\n      };\n      options = $.extend(defaults, options);\n\n      $(this).each(function(){\n        var $this = $(this);\n        var menu_id = $(\"#\"+ $this.attr('data-activates'));\n\n        // Set to width\n        if (options.menuWidth != 240) {\n          menu_id.css('width', options.menuWidth);\n        }\n\n        // Add Touch Area\n        var dragTarget = $('<div class=\"drag-target\"></div>');\n        $('body').append(dragTarget);\n\n        if (options.edge == 'left') {\n          menu_id.css('left', -1 * (options.menuWidth + 10));\n          dragTarget.css({'left': 0}); // Add Touch Area\n        }\n        else {\n          menu_id.addClass('right-aligned') // Change text-alignment to right\n            .css('right', -1 * (options.menuWidth + 10))\n            .css('left', '');\n          dragTarget.css({'right': 0}); // Add Touch Area\n        }\n\n        // If fixed sidenav, bring menu out\n        if (menu_id.hasClass('fixed')) {\n            if (window.innerWidth > 992) {\n              menu_id.css('left', 0);\n            }\n          }\n\n        // Window resize to reset on large screens fixed\n        if (menu_id.hasClass('fixed')) {\n          $(window).resize( function() {\n            if (window.innerWidth > 992) {\n              // Close menu if window is resized bigger than 992 and user has fixed sidenav\n              if ($('#sidenav-overlay').css('opacity') !== 0 && menuOut) {\n                removeMenu(true);\n              }\n              else {\n                menu_id.removeAttr('style');\n                menu_id.css('width', options.menuWidth);\n              }\n            }\n            else if (menuOut === false){\n              if (options.edge === 'left')\n                menu_id.css('left', -1 * (options.menuWidth + 10));\n              else\n                menu_id.css('right', -1 * (options.menuWidth + 10));\n            }\n\n          });\n        }\n\n        // if closeOnClick, then add close event for all a tags in side sideNav\n        if (options.closeOnClick === true) {\n          menu_id.on(\"click.itemclick\", \"a:not(.collapsible-header)\", function(){\n            removeMenu();\n          });\n        }\n\n        function removeMenu(restoreNav) {\n          panning = false;\n          menuOut = false;\n\n          // Reenable scrolling\n          $('body').css('overflow', '');\n\n          $('#sidenav-overlay').velocity({opacity: 0}, {duration: 200, queue: false, easing: 'easeOutQuad',\n            complete: function() {\n              $(this).remove();\n            } });\n          if (options.edge === 'left') {\n            // Reset phantom div\n            dragTarget.css({width: '', right: '', left: '0'});\n            menu_id.velocity(\n              {left: -1 * (options.menuWidth + 10)},\n              { duration: 200,\n                queue: false,\n                easing: 'easeOutCubic',\n                complete: function() {\n                  if (restoreNav === true) {\n                    // Restore Fixed sidenav\n                    menu_id.removeAttr('style');\n                    menu_id.css('width', options.menuWidth);\n                  }\n                }\n\n            });\n          }\n          else {\n            // Reset phantom div\n            dragTarget.css({width: '', right: '0', left: ''});\n            menu_id.velocity(\n              {right: -1 * (options.menuWidth + 10)},\n              { duration: 200,\n                queue: false,\n                easing: 'easeOutCubic',\n                complete: function() {\n                  if (restoreNav === true) {\n                    // Restore Fixed sidenav\n                    menu_id.removeAttr('style');\n                    menu_id.css('width', options.menuWidth);\n                  }\n                }\n              });\n          }\n        }\n\n\n\n        // Touch Event\n        var panning = false;\n        var menuOut = false;\n\n        dragTarget.on('click', function(){\n          removeMenu();\n        });\n\n        dragTarget.hammer({\n          prevent_default: false\n        }).bind('pan', function(e) {\n\n          if (e.gesture.pointerType == \"touch\") {\n\n            var direction = e.gesture.direction;\n            var x = e.gesture.center.x;\n            var y = e.gesture.center.y;\n            var velocityX = e.gesture.velocityX;\n\n            // Disable Scrolling\n            $('body').css('overflow', 'hidden');\n\n            // If overlay does not exist, create one and if it is clicked, close menu\n            if ($('#sidenav-overlay').length === 0) {\n              var overlay = $('<div id=\"sidenav-overlay\"></div>');\n              overlay.css('opacity', 0).click( function(){\n                removeMenu();\n              });\n              $('body').append(overlay);\n            }\n\n            // Keep within boundaries\n            if (options.edge === 'left') {\n              if (x > options.menuWidth) { x = options.menuWidth; }\n              else if (x < 0) { x = 0; }\n            }\n\n            if (options.edge === 'left') {\n              // Left Direction\n              if (x < (options.menuWidth / 2)) { menuOut = false; }\n              // Right Direction\n              else if (x >= (options.menuWidth / 2)) { menuOut = true; }\n\n              menu_id.css('left', (x - options.menuWidth));\n            }\n            else {\n              // Left Direction\n              if (x < (window.innerWidth - options.menuWidth / 2)) {\n                menuOut = true;\n              }\n              // Right Direction\n              else if (x >= (window.innerWidth - options.menuWidth / 2)) {\n               menuOut = false;\n             }\n              var rightPos = -1 *(x - options.menuWidth / 2);\n              if (rightPos > 0) {\n                rightPos = 0;\n              }\n\n              menu_id.css('right', rightPos);\n            }\n\n\n\n\n            // Percentage overlay\n            var overlayPerc;\n            if (options.edge === 'left') {\n              overlayPerc = x / options.menuWidth;\n              $('#sidenav-overlay').velocity({opacity: overlayPerc }, {duration: 50, queue: false, easing: 'easeOutQuad'});\n            }\n            else {\n              overlayPerc = Math.abs((x - window.innerWidth) / options.menuWidth);\n              $('#sidenav-overlay').velocity({opacity: overlayPerc }, {duration: 50, queue: false, easing: 'easeOutQuad'});\n            }\n          }\n\n        }).bind('panend', function(e) {\n\n          if (e.gesture.pointerType == \"touch\") {\n            var velocityX = e.gesture.velocityX;\n            panning = false;\n            if (options.edge === 'left') {\n              // If velocityX <= 0.3 then the user is flinging the menu closed so ignore menuOut\n              if ((menuOut && velocityX <= 0.3) || velocityX < -0.5) {\n                menu_id.velocity({left: 0}, {duration: 300, queue: false, easing: 'easeOutQuad'});\n                $('#sidenav-overlay').velocity({opacity: 1 }, {duration: 50, queue: false, easing: 'easeOutQuad'});\n                dragTarget.css({width: '50%', right: 0, left: ''});\n              }\n              else if (!menuOut || velocityX > 0.3) {\n                // Enable Scrolling\n                $('body').css('overflow', '');\n                // Slide menu closed\n                menu_id.velocity({left: -1 * (options.menuWidth + 10)}, {duration: 200, queue: false, easing: 'easeOutQuad'});\n                $('#sidenav-overlay').velocity({opacity: 0 }, {duration: 200, queue: false, easing: 'easeOutQuad',\n                  complete: function () {\n                    $(this).remove();\n                  }});\n                dragTarget.css({width: '10px', right: '', left: 0});\n              }\n            }\n            else {\n              if ((menuOut && velocityX >= -0.3) || velocityX > 0.5) {\n                menu_id.velocity({right: 0}, {duration: 300, queue: false, easing: 'easeOutQuad'});\n                $('#sidenav-overlay').velocity({opacity: 1 }, {duration: 50, queue: false, easing: 'easeOutQuad'});\n                dragTarget.css({width: '50%', right: '', left: 0});\n              }\n              else if (!menuOut || velocityX < -0.3) {\n                // Enable Scrolling\n                $('body').css('overflow', '');\n                // Slide menu closed\n                menu_id.velocity({right: -1 * (options.menuWidth + 10)}, {duration: 200, queue: false, easing: 'easeOutQuad'});\n                $('#sidenav-overlay').velocity({opacity: 0 }, {duration: 200, queue: false, easing: 'easeOutQuad',\n                  complete: function () {\n                    $(this).remove();\n                  }});\n                dragTarget.css({width: '10px', right: 0, left: ''});\n              }\n            }\n\n          }\n        });\n\n          $this.click(function() {\n            if (menuOut === true) {\n              menuOut = false;\n              panning = false;\n              removeMenu();\n            }\n            else {\n\n              // Disable Scrolling\n              $('body').css('overflow', 'hidden');\n              // Push current drag target on top of DOM tree\n              $('body').append(dragTarget);\n              \n              if (options.edge === 'left') {\n                dragTarget.css({width: '50%', right: 0, left: ''});\n                menu_id.velocity({left: 0}, {duration: 300, queue: false, easing: 'easeOutQuad'});\n              }\n              else {\n                dragTarget.css({width: '50%', right: '', left: 0});\n                menu_id.velocity({right: 0}, {duration: 300, queue: false, easing: 'easeOutQuad'});\n                menu_id.css('left','');\n              }\n\n              var overlay = $('<div id=\"sidenav-overlay\"></div>');\n              overlay.css('opacity', 0)\n              .click(function(){\n                menuOut = false;\n                panning = false;\n                removeMenu();\n                overlay.velocity({opacity: 0}, {duration: 300, queue: false, easing: 'easeOutQuad',\n                  complete: function() {\n                    $(this).remove();\n                  } });\n\n              });\n              $('body').append(overlay);\n              overlay.velocity({opacity: 1}, {duration: 300, queue: false, easing: 'easeOutQuad',\n                complete: function () {\n                  menuOut = true;\n                  panning = false;\n                }\n              });\n            }\n\n            return false;\n          });\n      });\n\n\n    },\n    show : function() {\n      this.trigger('click');\n    },\n    hide : function() {\n      $('#sidenav-overlay').trigger('click');\n    }\n  };\n\n\n    $.fn.sideNav = function(methodOrOptions) {\n      if ( methods[methodOrOptions] ) {\n        return methods[ methodOrOptions ].apply( this, Array.prototype.slice.call( arguments, 1 ));\n      } else if ( typeof methodOrOptions === 'object' || ! methodOrOptions ) {\n        // Default to \"init\"\n        return methods.init.apply( this, arguments );\n      } else {\n        $.error( 'Method ' +  methodOrOptions + ' does not exist on jQuery.sideNav' );\n      }\n    }; // Plugin end\n}( jQuery ));\n;/**\n * Extend jquery with a scrollspy plugin.\n * This watches the window scroll and fires events when elements are scrolled into viewport.\n *\n * throttle() and getTime() taken from Underscore.js\n * https://github.com/jashkenas/underscore\n *\n * @author Copyright 2013 John Smart\n * @license https://raw.github.com/thesmart/jquery-scrollspy/master/LICENSE\n * @see https://github.com/thesmart\n * @version 0.1.2\n */\n(function($) {\n\n\tvar jWindow = $(window);\n\tvar elements = [];\n\tvar elementsInView = [];\n\tvar isSpying = false;\n\tvar ticks = 0;\n\tvar unique_id = 1;\n\tvar offset = {\n\t\ttop : 0,\n\t\tright : 0,\n\t\tbottom : 0,\n\t\tleft : 0,\n\t}\n\n\t/**\n\t * Find elements that are within the boundary\n\t * @param {number} top\n\t * @param {number} right\n\t * @param {number} bottom\n\t * @param {number} left\n\t * @return {jQuery}\t\tA collection of elements\n\t */\n\tfunction findElements(top, right, bottom, left) {\n\t\tvar hits = $();\n\t\t$.each(elements, function(i, element) {\n\t\t\tif (element.height() > 0) {\n\t\t\t\tvar elTop = element.offset().top,\n\t\t\t\t\telLeft = element.offset().left,\n\t\t\t\t\telRight = elLeft + element.width(),\n\t\t\t\t\telBottom = elTop + element.height();\n\n\t\t\t\tvar isIntersect = !(elLeft > right ||\n\t\t\t\t\telRight < left ||\n\t\t\t\t\telTop > bottom ||\n\t\t\t\t\telBottom < top);\n\n\t\t\t\tif (isIntersect) {\n\t\t\t\t\thits.push(element);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn hits;\n\t}\n\n\n\t/**\n\t * Called when the user scrolls the window\n\t */\n\tfunction onScroll() {\n\t\t// unique tick id\n\t\t++ticks;\n\n\t\t// viewport rectangle\n\t\tvar top = jWindow.scrollTop(),\n\t\t\tleft = jWindow.scrollLeft(),\n\t\t\tright = left + jWindow.width(),\n\t\t\tbottom = top + jWindow.height();\n\n\t\t// determine which elements are in view\n//        + 60 accounts for fixed nav\n\t\tvar intersections = findElements(top+offset.top + 200, right+offset.right, bottom+offset.bottom, left+offset.left);\n\t\t$.each(intersections, function(i, element) {\n\n\t\t\tvar lastTick = element.data('scrollSpy:ticks');\n\t\t\tif (typeof lastTick != 'number') {\n\t\t\t\t// entered into view\n\t\t\t\telement.triggerHandler('scrollSpy:enter');\n\t\t\t}\n\n\t\t\t// update tick id\n\t\t\telement.data('scrollSpy:ticks', ticks);\n\t\t});\n\n\t\t// determine which elements are no longer in view\n\t\t$.each(elementsInView, function(i, element) {\n\t\t\tvar lastTick = element.data('scrollSpy:ticks');\n\t\t\tif (typeof lastTick == 'number' && lastTick !== ticks) {\n\t\t\t\t// exited from view\n\t\t\t\telement.triggerHandler('scrollSpy:exit');\n\t\t\t\telement.data('scrollSpy:ticks', null);\n\t\t\t}\n\t\t});\n\n\t\t// remember elements in view for next tick\n\t\telementsInView = intersections;\n\t}\n\n\t/**\n\t * Called when window is resized\n\t*/\n\tfunction onWinSize() {\n\t\tjWindow.trigger('scrollSpy:winSize');\n\t}\n\n\t/**\n\t * Get time in ms\n   * @license https://raw.github.com/jashkenas/underscore/master/LICENSE\n\t * @type {function}\n\t * @return {number}\n\t */\n\tvar getTime = (Date.now || function () {\n\t\treturn new Date().getTime();\n\t});\n\n\t/**\n\t * Returns a function, that, when invoked, will only be triggered at most once\n\t * during a given window of time. Normally, the throttled function will run\n\t * as much as it can, without ever going more than once per `wait` duration;\n\t * but if you'd like to disable the execution on the leading edge, pass\n\t * `{leading: false}`. To disable execution on the trailing edge, ditto.\n\t * @license https://raw.github.com/jashkenas/underscore/master/LICENSE\n\t * @param {function} func\n\t * @param {number} wait\n\t * @param {Object=} options\n\t * @returns {Function}\n\t */\n\tfunction throttle(func, wait, options) {\n\t\tvar context, args, result;\n\t\tvar timeout = null;\n\t\tvar previous = 0;\n\t\toptions || (options = {});\n\t\tvar later = function () {\n\t\t\tprevious = options.leading === false ? 0 : getTime();\n\t\t\ttimeout = null;\n\t\t\tresult = func.apply(context, args);\n\t\t\tcontext = args = null;\n\t\t};\n\t\treturn function () {\n\t\t\tvar now = getTime();\n\t\t\tif (!previous && options.leading === false) previous = now;\n\t\t\tvar remaining = wait - (now - previous);\n\t\t\tcontext = this;\n\t\t\targs = arguments;\n\t\t\tif (remaining <= 0) {\n\t\t\t\tclearTimeout(timeout);\n\t\t\t\ttimeout = null;\n\t\t\t\tprevious = now;\n\t\t\t\tresult = func.apply(context, args);\n\t\t\t\tcontext = args = null;\n\t\t\t} else if (!timeout && options.trailing !== false) {\n\t\t\t\ttimeout = setTimeout(later, remaining);\n\t\t\t}\n\t\t\treturn result;\n\t\t};\n\t};\n\n\t/**\n\t * Enables ScrollSpy using a selector\n\t * @param {jQuery|string} selector  The elements collection, or a selector\n\t * @param {Object=} options\tOptional.\n        throttle : number -> scrollspy throttling. Default: 100 ms\n        offsetTop : number -> offset from top. Default: 0\n        offsetRight : number -> offset from right. Default: 0\n        offsetBottom : number -> offset from bottom. Default: 0\n        offsetLeft : number -> offset from left. Default: 0\n\t * @returns {jQuery}\n\t */\n\t$.scrollSpy = function(selector, options) {\n\t\tvar visible = [];\n\t\tselector = $(selector);\n\t\tselector.each(function(i, element) {\n\t\t\telements.push($(element));\n\t\t\t$(element).data(\"scrollSpy:id\", i);\n\t\t\t// Smooth scroll to section\n\t\t  $('a[href=#' + $(element).attr('id') + ']').click(function(e) {\n\t\t    e.preventDefault();\n\t\t    var offset = $(this.hash).offset().top + 1;\n\n//          offset - 200 allows elements near bottom of page to scroll\n\t\t\t\n\t    \t$('html, body').animate({ scrollTop: offset - 200 }, {duration: 400, queue: false, easing: 'easeOutCubic'});\n\t\t\t\n\t\t  });\n\t\t});\n\t\toptions = options || {\n\t\t\tthrottle: 100\n\t\t};\n\n\t\toffset.top = options.offsetTop || 0;\n\t\toffset.right = options.offsetRight || 0;\n\t\toffset.bottom = options.offsetBottom || 0;\n\t\toffset.left = options.offsetLeft || 0;\n\n\t\tvar throttledScroll = throttle(onScroll, options.throttle || 100);\n\t\tvar readyScroll = function(){\n\t\t\t$(document).ready(throttledScroll);\n\t\t};\n\n\t\tif (!isSpying) {\n\t\t\tjWindow.on('scroll', readyScroll);\n\t\t\tjWindow.on('resize', readyScroll);\n\t\t\tisSpying = true;\n\t\t}\n\n\t\t// perform a scan once, after current execution context, and after dom is ready\n\t\tsetTimeout(readyScroll, 0);\n\n\n\t\tselector.on('scrollSpy:enter', function() {\n\t\t\tvisible = $.grep(visible, function(value) {\n\t      return value.height() != 0;\n\t    });\n\n\t\t\tvar $this = $(this);\n\n\t\t\tif (visible[0]) {\n\t\t\t\t$('a[href=#' + visible[0].attr('id') + ']').removeClass('active');\n\t\t\t\tif ($this.data('scrollSpy:id') < visible[0].data('scrollSpy:id')) {\n\t\t\t\t\tvisible.unshift($(this));\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tvisible.push($(this));\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tvisible.push($(this));\n\t\t\t}\n\n\n\t\t\t$('a[href=#' + visible[0].attr('id') + ']').addClass('active');\n\t\t});\n\t\tselector.on('scrollSpy:exit', function() {\n\t\t\tvisible = $.grep(visible, function(value) {\n\t      return value.height() != 0;\n\t    });\n\n\t\t\tif (visible[0]) {\n\t\t\t\t$('a[href=#' + visible[0].attr('id') + ']').removeClass('active');\n\t\t\t\tvar $this = $(this);\n\t\t\t\tvisible = $.grep(visible, function(value) {\n\t        return value.attr('id') != $this.attr('id');\n\t      });\n\t      if (visible[0]) { // Check if empty\n\t\t\t\t\t$('a[href=#' + visible[0].attr('id') + ']').addClass('active');\n\t      }\n\t\t\t}\n\t\t});\n\n\t\treturn selector;\n\t};\n\n\t/**\n\t * Listen for window resize events\n\t * @param {Object=} options\t\t\t\t\t\tOptional. Set { throttle: number } to change throttling. Default: 100 ms\n\t * @returns {jQuery}\t\t$(window)\n\t */\n\t$.winSizeSpy = function(options) {\n\t\t$.winSizeSpy = function() { return jWindow; }; // lock from multiple calls\n\t\toptions = options || {\n\t\t\tthrottle: 100\n\t\t};\n\t\treturn jWindow.on('resize', throttle(onWinSize, options.throttle || 100));\n\t};\n\n\t/**\n\t * Enables ScrollSpy on a collection of elements\n\t * e.g. $('.scrollSpy').scrollSpy()\n\t * @param {Object=} options\tOptional.\n\t\t\t\t\t\t\t\t\t\t\tthrottle : number -> scrollspy throttling. Default: 100 ms\n\t\t\t\t\t\t\t\t\t\t\toffsetTop : number -> offset from top. Default: 0\n\t\t\t\t\t\t\t\t\t\t\toffsetRight : number -> offset from right. Default: 0\n\t\t\t\t\t\t\t\t\t\t\toffsetBottom : number -> offset from bottom. Default: 0\n\t\t\t\t\t\t\t\t\t\t\toffsetLeft : number -> offset from left. Default: 0\n\t * @returns {jQuery}\n\t */\n\t$.fn.scrollSpy = function(options) {\n\t\treturn $.scrollSpy($(this), options);\n\t};\n\n})(jQuery);;(function ($) {\n  $(document).ready(function() {\n\n    // Function to update labels of text fields\n    Materialize.updateTextFields = function() {\n      var input_selector = 'input[type=text], input[type=password], input[type=email], input[type=url], input[type=tel], input[type=number], input[type=search], textarea';\n      $(input_selector).each(function(index, element) {\n        if ($(element).val().length > 0 || element.autofocus ||$(this).attr('placeholder') !== undefined || $(element)[0].validity.badInput === true) {\n          $(this).siblings('label, i').addClass('active');\n        }\n        else {\n          $(this).siblings('label, i').removeClass('active');\n        }\n      });\n    };\n\n    // Text based inputs\n    var input_selector = 'input[type=text], input[type=password], input[type=email], input[type=url], input[type=tel], input[type=number], input[type=search], textarea';\n\n    // Add active if form auto complete\n    $(document).on('change', input_selector, function () {\n      if($(this).val().length !== 0 || $(this).attr('placeholder') !== undefined) {\n        $(this).siblings('label').addClass('active');\n      }\n      validate_field($(this));\n    });\n\n    // Add active if input element has been pre-populated on document ready\n    $(document).ready(function() {\n      Materialize.updateTextFields();\n    });\n\n    // HTML DOM FORM RESET handling\n    $(document).on('reset', function(e) {\n      var formReset = $(e.target);\n      if (formReset.is('form')) {\n        formReset.find(input_selector).removeClass('valid').removeClass('invalid');\n        formReset.find(input_selector).each(function () {\n          if ($(this).attr('value') === '') {\n            $(this).siblings('label, i').removeClass('active');\n          }\n        });\n\n        // Reset select\n        formReset.find('select.initialized').each(function () {\n          var reset_text = formReset.find('option[selected]').text();\n          formReset.siblings('input.select-dropdown').val(reset_text);\n        });\n      }\n    });\n\n    // Add active when element has focus\n    $(document).on('focus', input_selector, function () {\n      $(this).siblings('label, i').addClass('active');\n    });\n\n    $(document).on('blur', input_selector, function () {\n      var $inputElement = $(this);\n      if ($inputElement.val().length === 0 && $inputElement[0].validity.badInput !== true && $inputElement.attr('placeholder') === undefined) {\n        $inputElement.siblings('label, i').removeClass('active');\n      }\n\n      if ($inputElement.val().length === 0 && $inputElement[0].validity.badInput !== true && $inputElement.attr('placeholder') !== undefined) {\n        $inputElement.siblings('i').removeClass('active');\n      }\n      validate_field($inputElement);\n    });\n\n    window.validate_field = function(object) {\n      var hasLength = object.attr('length') !== undefined;\n      var lenAttr = parseInt(object.attr('length'));\n      var len = object.val().length;\n\n      if (object.val().length === 0 && object[0].validity.badInput === false) {\n        if (object.hasClass('validate')) {\n          object.removeClass('valid');\n          object.removeClass('invalid');\n        }\n      }\n      else {\n        if (object.hasClass('validate')) {\n          // Check for character counter attributes\n          if ((object.is(':valid') && hasLength && (len <= lenAttr)) || (object.is(':valid') && !hasLength)) {\n            object.removeClass('invalid');\n            object.addClass('valid');\n          }\n          else {\n            object.removeClass('valid');\n            object.addClass('invalid');\n          }\n        }\n      }\n    };\n\n\n    // Textarea Auto Resize\n    var hiddenDiv = $('.hiddendiv').first();\n    if (!hiddenDiv.length) {\n      hiddenDiv = $('<div class=\"hiddendiv common\"></div>');\n      $('body').append(hiddenDiv);\n    }\n    var text_area_selector = '.materialize-textarea';\n\n    function textareaAutoResize($textarea) {\n      // Set font properties of hiddenDiv\n\n      var fontFamily = $textarea.css('font-family');\n      var fontSize = $textarea.css('font-size');\n\n      if (fontSize) { hiddenDiv.css('font-size', fontSize); }\n      if (fontFamily) { hiddenDiv.css('font-family', fontFamily); }\n\n      if ($textarea.attr('wrap') === \"off\") {\n        hiddenDiv.css('overflow-wrap', \"normal\")\n                 .css('white-space', \"pre\");\n      }\n\n      hiddenDiv.text($textarea.val() + '\\n');\n      var content = hiddenDiv.html().replace(/\\n/g, '<br>');\n      hiddenDiv.html(content);\n\n\n      // When textarea is hidden, width goes crazy.\n      // Approximate with half of window size\n\n      if ($textarea.is(':visible')) {\n        hiddenDiv.css('width', $textarea.width());\n      }\n      else {\n        hiddenDiv.css('width', $(window).width()/2);\n      }\n\n      $textarea.css('height', hiddenDiv.height());\n    }\n\n    $(text_area_selector).each(function () {\n      var $textarea = $(this);\n      if ($textarea.val().length) {\n        textareaAutoResize($textarea);\n      }\n    });\n\n    $('body').on('keyup keydown autoresize', text_area_selector, function () {\n      textareaAutoResize($(this));\n    });\n\n    // File Input Path\n    $(document).on('change', '.file-field input[type=\"file\"]', function () {\n      var file_field = $(this).closest('.file-field');\n      var path_input = file_field.find('input.file-path');\n      var files      = $(this)[0].files;\n      var file_names = [];\n      for (var i = 0; i < files.length; i++) {\n        file_names.push(files[i].name);\n      }\n      path_input.val(file_names.join(\", \"));\n      path_input.trigger('change');\n    });\n\n    /****************\n    *  Range Input  *\n    ****************/\n\n    var range_type = 'input[type=range]';\n    var range_mousedown = false;\n    var left;\n\n    $(range_type).each(function () {\n      var thumb = $('<span class=\"thumb\"><span class=\"value\"></span></span>');\n      $(this).after(thumb);\n    });\n\n    var range_wrapper = '.range-field';\n    $(document).on('change', range_type, function(e) {\n      var thumb = $(this).siblings('.thumb');\n      thumb.find('.value').html($(this).val());\n    });\n\n    $(document).on('input mousedown touchstart', range_type, function(e) {\n      var thumb = $(this).siblings('.thumb');\n      var width = $(this).outerWidth();\n\n      // If thumb indicator does not exist yet, create it\n      if (thumb.length <= 0) {\n        thumb = $('<span class=\"thumb\"><span class=\"value\"></span></span>');\n        $(this).after(thumb);\n      }\n\n      // Set indicator value\n      thumb.find('.value').html($(this).val());\n\n      range_mousedown = true;\n      $(this).addClass('active');\n\n      if (!thumb.hasClass('active')) {\n        thumb.velocity({ height: \"30px\", width: \"30px\", top: \"-20px\", marginLeft: \"-15px\"}, { duration: 300, easing: 'easeOutExpo' });\n      }\n\n      if (e.type !== 'input') {\n        if(e.pageX === undefined || e.pageX === null){//mobile\n           left = e.originalEvent.touches[0].pageX - $(this).offset().left;\n        }\n        else{ // desktop\n           left = e.pageX - $(this).offset().left;\n        }\n        if (left < 0) {\n          left = 0;\n        }\n        else if (left > width) {\n          left = width;\n        }\n        thumb.addClass('active').css('left', left);\n      }\n\n      thumb.find('.value').html($(this).val());\n    });\n\n    $(document).on('mouseup touchend', range_wrapper, function() {\n      range_mousedown = false;\n      $(this).removeClass('active');\n    });\n\n    $(document).on('mousemove touchmove', range_wrapper, function(e) {\n      var thumb = $(this).children('.thumb');\n      var left;\n      if (range_mousedown) {\n        if (!thumb.hasClass('active')) {\n          thumb.velocity({ height: '30px', width: '30px', top: '-20px', marginLeft: '-15px'}, { duration: 300, easing: 'easeOutExpo' });\n        }\n        if (e.pageX === undefined || e.pageX === null) { //mobile\n          left = e.originalEvent.touches[0].pageX - $(this).offset().left;\n        }\n        else{ // desktop\n          left = e.pageX - $(this).offset().left;\n        }\n        var width = $(this).outerWidth();\n\n        if (left < 0) {\n          left = 0;\n        }\n        else if (left > width) {\n          left = width;\n        }\n        thumb.addClass('active').css('left', left);\n        thumb.find('.value').html(thumb.siblings(range_type).val());\n      }\n    });\n\n    $(document).on('mouseout touchleave', range_wrapper, function() {\n      if (!range_mousedown) {\n\n        var thumb = $(this).children('.thumb');\n\n        if (thumb.hasClass('active')) {\n          thumb.velocity({ height: '0', width: '0', top: '10px', marginLeft: '-6px'}, { duration: 100 });\n        }\n        thumb.removeClass('active');\n      }\n    });\n  }); // End of $(document).ready\n\n  /*******************\n   *  Select Plugin  *\n   ******************/\n  $.fn.material_select = function (callback) {\n    $(this).each(function(){\n      var $select = $(this);\n\n      if ($select.hasClass('browser-default')) {\n        return; // Continue to next (return false breaks out of entire loop)\n      }\n\n      var multiple = $select.attr('multiple') ? true : false,\n          lastID = $select.data('select-id'); // Tear down structure if Select needs to be rebuilt\n\n      if (lastID) {\n        $select.parent().find('span.caret').remove();\n        $select.parent().find('input').remove();\n\n        $select.unwrap();\n        $('ul#select-options-'+lastID).remove();\n      }\n\n      // If destroying the select, remove the selelct-id and reset it to it's uninitialized state.\n      if(callback === 'destroy') {\n        $select.data('select-id', null).removeClass('initialized');\n        return;\n      }\n\n      var uniqueID = Materialize.guid();\n      $select.data('select-id', uniqueID);\n      var wrapper = $('<div class=\"select-wrapper\"></div>');\n      wrapper.addClass($select.attr('class'));\n      var options = $('<ul id=\"select-options-' + uniqueID +'\" class=\"dropdown-content select-dropdown ' + (multiple ? 'multiple-select-dropdown' : '') + '\"></ul>'),\n          selectChildren = $select.children('option, optgroup'),\n          valuesSelected = [],\n          optionsHover = false;\n\n      var label = $select.find('option:selected').html() || $select.find('option:first').html() || \"\";\n\n      // Function that renders and appends the option taking into\n      // account type and possible image icon.\n      var appendOptionWithIcon = function(select, option, type) {\n        // Add disabled attr if disabled\n        var disabledClass = (option.is(':disabled')) ? 'disabled ' : '';\n\n        // add icons\n        var icon_url = option.data('icon');\n        var classes = option.attr('class');\n        if (!!icon_url) {\n          var classString = '';\n          if (!!classes) classString = ' class=\"' + classes + '\"';\n\n          // Check for multiple type.\n          if (type === 'multiple') {\n            options.append($('<li class=\"' + disabledClass + '\"><img src=\"' + icon_url + '\"' + classString + '><span><input type=\"checkbox\"' + disabledClass + '/><label></label>' + option.html() + '</span></li>'));\n          } else {\n            options.append($('<li class=\"' + disabledClass + '\"><img src=\"' + icon_url + '\"' + classString + '><span>' + option.html() + '</span></li>'));\n          }\n          return true;\n        }\n\n        // Check for multiple type.\n        if (type === 'multiple') {\n          options.append($('<li class=\"' + disabledClass + '\"><span><input type=\"checkbox\"' + disabledClass + '/><label></label>' + option.html() + '</span></li>'));\n        } else {\n          options.append($('<li class=\"' + disabledClass + '\"><span>' + option.html() + '</span></li>'));\n        }\n      };\n\n      /* Create dropdown structure. */\n      if (selectChildren.length) {\n        selectChildren.each(function() {\n          if ($(this).is('option')) {\n            // Direct descendant option.\n            if (multiple) {\n              appendOptionWithIcon($select, $(this), 'multiple');\n\n            } else {\n              appendOptionWithIcon($select, $(this));\n            }\n          } else if ($(this).is('optgroup')) {\n            // Optgroup.\n            var selectOptions = $(this).children('option');\n            options.append($('<li class=\"optgroup\"><span>' + $(this).attr('label') + '</span></li>'));\n\n            selectOptions.each(function() {\n              appendOptionWithIcon($select, $(this));\n            });\n          }\n        });\n      }\n\n      options.find('li:not(.optgroup)').each(function (i) {\n        $(this).click(function (e) {\n          // Check if option element is disabled\n          if (!$(this).hasClass('disabled') && !$(this).hasClass('optgroup')) {\n            var selected = true;\n\n            if (multiple) {\n              $('input[type=\"checkbox\"]', this).prop('checked', function(i, v) { return !v; });\n              selected = toggleEntryFromArray(valuesSelected, $(this).index(), $select);\n              $newSelect.trigger('focus');\n            } else {\n              options.find('li').removeClass('active');\n              $(this).toggleClass('active');\n              $newSelect.val($(this).text());\n            }\n\n            activateOption(options, $(this));\n            $select.find('option').eq(i).prop('selected', selected);\n            // Trigger onchange() event\n            $select.trigger('change');\n            if (typeof callback !== 'undefined') callback();\n          }\n\n          e.stopPropagation();\n        });\n      });\n\n      // Wrap Elements\n      $select.wrap(wrapper);\n      // Add Select Display Element\n      var dropdownIcon = $('<span class=\"caret\">&#9660;</span>');\n      if ($select.is(':disabled'))\n        dropdownIcon.addClass('disabled');\n\n      // escape double quotes\n      var sanitizedLabelHtml = label.replace(/\"/g, '&quot;');\n\n      var $newSelect = $('<input type=\"text\" class=\"select-dropdown\" readonly=\"true\" ' + (($select.is(':disabled')) ? 'disabled' : '') + ' data-activates=\"select-options-' + uniqueID +'\" value=\"'+ sanitizedLabelHtml +'\"/>');\n      $select.before($newSelect);\n      $newSelect.before(dropdownIcon);\n\n      $newSelect.after(options);\n      // Check if section element is disabled\n      if (!$select.is(':disabled')) {\n        $newSelect.dropdown({'hover': false, 'closeOnClick': false});\n      }\n\n      // Copy tabindex\n      if ($select.attr('tabindex')) {\n        $($newSelect[0]).attr('tabindex', $select.attr('tabindex'));\n      }\n\n      $select.addClass('initialized');\n\n      $newSelect.on({\n        'focus': function (){\n          if ($('ul.select-dropdown').not(options[0]).is(':visible')) {\n            $('input.select-dropdown').trigger('close');\n          }\n          if (!options.is(':visible')) {\n            $(this).trigger('open', ['focus']);\n            var label = $(this).val();\n            var selectedOption = options.find('li').filter(function() {\n              return $(this).text().toLowerCase() === label.toLowerCase();\n            })[0];\n            activateOption(options, selectedOption);\n          }\n        },\n        'click': function (e){\n          e.stopPropagation();\n        }\n      });\n\n      $newSelect.on('blur', function() {\n        if (!multiple) {\n          $(this).trigger('close');\n        }\n        options.find('li.selected').removeClass('selected');\n      });\n\n      options.hover(function() {\n        optionsHover = true;\n      }, function () {\n        optionsHover = false;\n      });\n\n      $(window).on({\n        'click': function () {\n          multiple && (optionsHover || $newSelect.trigger('close'));\n        }\n      });\n\n      // Add initial multiple selections.\n      if (multiple) {\n        $select.find(\"option:selected:not(:disabled)\").each(function () {\n          var index = $(this).index();\n\n          toggleEntryFromArray(valuesSelected, index, $select);\n          options.find(\"li\").eq(index).find(\":checkbox\").prop(\"checked\", true);\n        });\n      }\n\n      // Make option as selected and scroll to selected position\n      activateOption = function(collection, newOption) {\n        if (newOption) {\n          collection.find('li.selected').removeClass('selected');\n          var option = $(newOption);\n          option.addClass('selected');\n          options.scrollTo(option);\n        }\n      };\n\n      // Allow user to search by typing\n      // this array is cleared after 1 second\n      var filterQuery = [],\n          onKeyDown = function(e){\n            // TAB - switch to another input\n            if(e.which == 9){\n              $newSelect.trigger('close');\n              return;\n            }\n\n            // ARROW DOWN WHEN SELECT IS CLOSED - open select options\n            if(e.which == 40 && !options.is(':visible')){\n              $newSelect.trigger('open');\n              return;\n            }\n\n            // ENTER WHEN SELECT IS CLOSED - submit form\n            if(e.which == 13 && !options.is(':visible')){\n              return;\n            }\n\n            e.preventDefault();\n\n            // CASE WHEN USER TYPE LETTERS\n            var letter = String.fromCharCode(e.which).toLowerCase(),\n                nonLetters = [9,13,27,38,40];\n            if (letter && (nonLetters.indexOf(e.which) === -1)) {\n              filterQuery.push(letter);\n\n              var string = filterQuery.join(''),\n                  newOption = options.find('li').filter(function() {\n                    return $(this).text().toLowerCase().indexOf(string) === 0;\n                  })[0];\n\n              if (newOption) {\n                activateOption(options, newOption);\n              }\n            }\n\n            // ENTER - select option and close when select options are opened\n            if (e.which == 13) {\n              var activeOption = options.find('li.selected:not(.disabled)')[0];\n              if(activeOption){\n                $(activeOption).trigger('click');\n                if (!multiple) {\n                  $newSelect.trigger('close');\n                }\n              }\n            }\n\n            // ARROW DOWN - move to next not disabled option\n            if (e.which == 40) {\n              if (options.find('li.selected').length) {\n                newOption = options.find('li.selected').next('li:not(.disabled)')[0];\n              } else {\n                newOption = options.find('li:not(.disabled)')[0];\n              }\n              activateOption(options, newOption);\n            }\n\n            // ESC - close options\n            if (e.which == 27) {\n              $newSelect.trigger('close');\n            }\n\n            // ARROW UP - move to previous not disabled option\n            if (e.which == 38) {\n              newOption = options.find('li.selected').prev('li:not(.disabled)')[0];\n              if(newOption)\n                activateOption(options, newOption);\n            }\n\n            // Automaticaly clean filter query so user can search again by starting letters\n            setTimeout(function(){ filterQuery = []; }, 1000);\n          };\n\n      $newSelect.on('keydown', onKeyDown);\n    });\n\n    function toggleEntryFromArray(entriesArray, entryIndex, select) {\n      var index = entriesArray.indexOf(entryIndex),\n          notAdded = index === -1;\n\n      if (notAdded) {\n        entriesArray.push(entryIndex);\n      } else {\n        entriesArray.splice(index, 1);\n      }\n\n      select.siblings('ul.dropdown-content').find('li').eq(entryIndex).toggleClass('active');\n\n      // use notAdded instead of true (to detect if the option is selected or not)\n      select.find('option').eq(entryIndex).prop('selected', notAdded);\n      setValueToInput(entriesArray, select);\n\n      return notAdded;\n    }\n\n    function setValueToInput(entriesArray, select) {\n      var value = '';\n\n      for (var i = 0, count = entriesArray.length; i < count; i++) {\n        var text = select.find('option').eq(entriesArray[i]).text();\n\n        i === 0 ? value += text : value += ', ' + text;\n      }\n\n      if (value === '') {\n        value = select.find('option:disabled').eq(0).text();\n      }\n\n      select.siblings('input.select-dropdown').val(value);\n    }\n  };\n\n}( jQuery ));\n;(function ($) {\n\n  var methods = {\n\n    init : function(options) {\n      var defaults = {\n        indicators: true,\n        height: 400,\n        transition: 500,\n        interval: 6000\n      };\n      options = $.extend(defaults, options);\n\n      return this.each(function() {\n\n        // For each slider, we want to keep track of\n        // which slide is active and its associated content\n        var $this = $(this);\n        var $slider = $this.find('ul.slides').first();\n        var $slides = $slider.find('li');\n        var $active_index = $slider.find('.active').index();\n        var $active, $indicators, $interval;\n        if ($active_index != -1) { $active = $slides.eq($active_index); }\n\n        // Transitions the caption depending on alignment\n        function captionTransition(caption, duration) {\n          if (caption.hasClass(\"center-align\")) {\n            caption.velocity({opacity: 0, translateY: -100}, {duration: duration, queue: false});\n          }\n          else if (caption.hasClass(\"right-align\")) {\n            caption.velocity({opacity: 0, translateX: 100}, {duration: duration, queue: false});\n          }\n          else if (caption.hasClass(\"left-align\")) {\n            caption.velocity({opacity: 0, translateX: -100}, {duration: duration, queue: false});\n          }\n        }\n\n        // This function will transition the slide to any index of the next slide\n        function moveToSlide(index) {\n          // Wrap around indices.\n          if (index >= $slides.length) index = 0;\n          else if (index < 0) index = $slides.length -1;\n\n          $active_index = $slider.find('.active').index();\n\n          // Only do if index changes\n          if ($active_index != index) {\n            $active = $slides.eq($active_index);\n            $caption = $active.find('.caption');\n\n            $active.removeClass('active');\n            $active.velocity({opacity: 0}, {duration: options.transition, queue: false, easing: 'easeOutQuad',\n                              complete: function() {\n                                $slides.not('.active').velocity({opacity: 0, translateX: 0, translateY: 0}, {duration: 0, queue: false});\n                              } });\n            captionTransition($caption, options.transition);\n\n\n            // Update indicators\n            if (options.indicators) {\n              $indicators.eq($active_index).removeClass('active');\n            }\n\n            $slides.eq(index).velocity({opacity: 1}, {duration: options.transition, queue: false, easing: 'easeOutQuad'});\n            $slides.eq(index).find('.caption').velocity({opacity: 1, translateX: 0, translateY: 0}, {duration: options.transition, delay: options.transition, queue: false, easing: 'easeOutQuad'});\n            $slides.eq(index).addClass('active');\n\n\n            // Update indicators\n            if (options.indicators) {\n              $indicators.eq(index).addClass('active');\n            }\n          }\n        }\n\n        // Set height of slider\n        // If fullscreen, do nothing\n        if (!$this.hasClass('fullscreen')) {\n          if (options.indicators) {\n            // Add height if indicators are present\n            $this.height(options.height + 40);\n          }\n          else {\n            $this.height(options.height);\n          }\n          $slider.height(options.height);\n        }\n\n\n        // Set initial positions of captions\n        $slides.find('.caption').each(function () {\n          captionTransition($(this), 0);\n        });\n\n        // Move img src into background-image\n        $slides.find('img').each(function () {\n          var placeholderBase64 = 'data:image/gif;base64,R0lGODlhAQABAIABAP///wAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==';\n          if ($(this).attr('src') !== placeholderBase64) {\n            $(this).css('background-image', 'url(' + $(this).attr('src') + ')' );\n            $(this).attr('src', placeholderBase64);\n          }\n        });\n\n        // dynamically add indicators\n        if (options.indicators) {\n          $indicators = $('<ul class=\"indicators\"></ul>');\n          $slides.each(function( index ) {\n            var $indicator = $('<li class=\"indicator-item\"></li>');\n\n            // Handle clicks on indicators\n            $indicator.click(function () {\n              var $parent = $slider.parent();\n              var curr_index = $parent.find($(this)).index();\n              moveToSlide(curr_index);\n\n              // reset interval\n              clearInterval($interval);\n              $interval = setInterval(\n                function(){\n                  $active_index = $slider.find('.active').index();\n                  if ($slides.length == $active_index + 1) $active_index = 0; // loop to start\n                  else $active_index += 1;\n\n                  moveToSlide($active_index);\n\n                }, options.transition + options.interval\n              );\n            });\n            $indicators.append($indicator);\n          });\n          $this.append($indicators);\n          $indicators = $this.find('ul.indicators').find('li.indicator-item');\n        }\n\n        if ($active) {\n          $active.show();\n        }\n        else {\n          $slides.first().addClass('active').velocity({opacity: 1}, {duration: options.transition, queue: false, easing: 'easeOutQuad'});\n\n          $active_index = 0;\n          $active = $slides.eq($active_index);\n\n          // Update indicators\n          if (options.indicators) {\n            $indicators.eq($active_index).addClass('active');\n          }\n        }\n\n        // Adjust height to current slide\n        $active.find('img').each(function() {\n          $active.find('.caption').velocity({opacity: 1, translateX: 0, translateY: 0}, {duration: options.transition, queue: false, easing: 'easeOutQuad'});\n        });\n\n        // auto scroll\n        $interval = setInterval(\n          function(){\n            $active_index = $slider.find('.active').index();\n            moveToSlide($active_index + 1);\n\n          }, options.transition + options.interval\n        );\n\n\n        // HammerJS, Swipe navigation\n\n        // Touch Event\n        var panning = false;\n        var swipeLeft = false;\n        var swipeRight = false;\n\n        $this.hammer({\n            prevent_default: false\n        }).bind('pan', function(e) {\n          if (e.gesture.pointerType === \"touch\") {\n\n            // reset interval\n            clearInterval($interval);\n\n            var direction = e.gesture.direction;\n            var x = e.gesture.deltaX;\n            var velocityX = e.gesture.velocityX;\n\n            $curr_slide = $slider.find('.active');\n            $curr_slide.velocity({ translateX: x\n                }, {duration: 50, queue: false, easing: 'easeOutQuad'});\n\n            // Swipe Left\n            if (direction === 4 && (x > ($this.innerWidth() / 2) || velocityX < -0.65)) {\n              swipeRight = true;\n            }\n            // Swipe Right\n            else if (direction === 2 && (x < (-1 * $this.innerWidth() / 2) || velocityX > 0.65)) {\n              swipeLeft = true;\n            }\n\n            // Make Slide Behind active slide visible\n            var next_slide;\n            if (swipeLeft) {\n              next_slide = $curr_slide.next();\n              if (next_slide.length === 0) {\n                next_slide = $slides.first();\n              }\n              next_slide.velocity({ opacity: 1\n                  }, {duration: 300, queue: false, easing: 'easeOutQuad'});\n            }\n            if (swipeRight) {\n              next_slide = $curr_slide.prev();\n              if (next_slide.length === 0) {\n                next_slide = $slides.last();\n              }\n              next_slide.velocity({ opacity: 1\n                  }, {duration: 300, queue: false, easing: 'easeOutQuad'});\n            }\n\n\n          }\n\n        }).bind('panend', function(e) {\n          if (e.gesture.pointerType === \"touch\") {\n\n            $curr_slide = $slider.find('.active');\n            panning = false;\n            curr_index = $slider.find('.active').index();\n\n            if (!swipeRight && !swipeLeft) {\n              // Return to original spot\n              $curr_slide.velocity({ translateX: 0\n                  }, {duration: 300, queue: false, easing: 'easeOutQuad'});\n            }\n            else if (swipeLeft) {\n              moveToSlide(curr_index + 1);\n              $curr_slide.velocity({translateX: -1 * $this.innerWidth() }, {duration: 300, queue: false, easing: 'easeOutQuad',\n                                    complete: function() {\n                                      $curr_slide.velocity({opacity: 0, translateX: 0}, {duration: 0, queue: false});\n                                    } });\n            }\n            else if (swipeRight) {\n              moveToSlide(curr_index - 1);\n              $curr_slide.velocity({translateX: $this.innerWidth() }, {duration: 300, queue: false, easing: 'easeOutQuad',\n                                    complete: function() {\n                                      $curr_slide.velocity({opacity: 0, translateX: 0}, {duration: 0, queue: false});\n                                    } });\n            }\n            swipeLeft = false;\n            swipeRight = false;\n\n            // Restart interval\n            clearInterval($interval);\n            $interval = setInterval(\n              function(){\n                $active_index = $slider.find('.active').index();\n                if ($slides.length == $active_index + 1) $active_index = 0; // loop to start\n                else $active_index += 1;\n\n                moveToSlide($active_index);\n\n              }, options.transition + options.interval\n            );\n          }\n        });\n\n        $this.on('sliderPause', function() {\n          clearInterval($interval);\n        });\n\n        $this.on('sliderStart', function() {\n          clearInterval($interval);\n          $interval = setInterval(\n            function(){\n              $active_index = $slider.find('.active').index();\n              if ($slides.length == $active_index + 1) $active_index = 0; // loop to start\n              else $active_index += 1;\n\n              moveToSlide($active_index);\n\n            }, options.transition + options.interval\n          );\n        });\n\n        $this.on('sliderNext', function() {\n          $active_index = $slider.find('.active').index();\n          moveToSlide($active_index + 1);\n        });\n\n        $this.on('sliderPrev', function() {\n          $active_index = $slider.find('.active').index();\n          moveToSlide($active_index - 1);\n        });\n\n      });\n\n\n\n    },\n    pause : function() {\n      $(this).trigger('sliderPause');\n    },\n    start : function() {\n      $(this).trigger('sliderStart');\n    },\n    next : function() {\n      $(this).trigger('sliderNext');\n    },\n    prev : function() {\n      $(this).trigger('sliderPrev');\n    }\n  };\n\n\n    $.fn.slider = function(methodOrOptions) {\n      if ( methods[methodOrOptions] ) {\n        return methods[ methodOrOptions ].apply( this, Array.prototype.slice.call( arguments, 1 ));\n      } else if ( typeof methodOrOptions === 'object' || ! methodOrOptions ) {\n        // Default to \"init\"\n        return methods.init.apply( this, arguments );\n      } else {\n        $.error( 'Method ' +  methodOrOptions + ' does not exist on jQuery.tooltip' );\n      }\n    }; // Plugin end\n}( jQuery ));;(function ($) {\n  $(document).ready(function() {\n\n    $(document).on('click.card', '.card', function (e) {\n      if ($(this).find('> .card-reveal').length) {\n        if ($(e.target).is($('.card-reveal .card-title')) || $(e.target).is($('.card-reveal .card-title i'))) {\n          // Make Reveal animate down and display none\n          $(this).find('.card-reveal').velocity(\n            {translateY: 0}, {\n              duration: 225,\n              queue: false,\n              easing: 'easeInOutQuad',\n              complete: function() { $(this).css({ display: 'none'}); }\n            }\n          );\n        }\n        else if ($(e.target).is($('.card .activator')) ||\n                 $(e.target).is($('.card .activator i')) ) {\n          $(e.target).closest('.card').css('overflow', 'hidden');\n          $(this).find('.card-reveal').css({ display: 'block'}).velocity(\"stop\", false).velocity({translateY: '-100%'}, {duration: 300, queue: false, easing: 'easeInOutQuad'});\n        }\n      }\n\n      $('.card-reveal').closest('.card').css('overflow', 'hidden');\n\n    });\n\n  });\n}( jQuery ));;(function ($) {\n  $(document).ready(function() {\n\n    $(document).on('click.chip', '.chip .material-icons', function (e) {\n      $(this).parent().remove();\n    });\n\n  });\n}( jQuery ));;(function ($) {\n  $(document).ready(function() {\n\n    $.fn.pushpin = function (options) {\n\n      var defaults = {\n        top: 0,\n        bottom: Infinity,\n        offset: 0\n      }\n      options = $.extend(defaults, options);\n\n      $index = 0;\n      return this.each(function() {\n        var $uniqueId = Materialize.guid(),\n            $this = $(this),\n            $original_offset = $(this).offset().top;\n\n        function removePinClasses(object) {\n          object.removeClass('pin-top');\n          object.removeClass('pinned');\n          object.removeClass('pin-bottom');\n        }\n\n        function updateElements(objects, scrolled) {\n          objects.each(function () {\n            // Add position fixed (because its between top and bottom)\n            if (options.top <= scrolled && options.bottom >= scrolled && !$(this).hasClass('pinned')) {\n              removePinClasses($(this));\n              $(this).css('top', options.offset);\n              $(this).addClass('pinned');\n            }\n\n            // Add pin-top (when scrolled position is above top)\n            if (scrolled < options.top && !$(this).hasClass('pin-top')) {\n              removePinClasses($(this));\n              $(this).css('top', 0);\n              $(this).addClass('pin-top');\n            }\n\n            // Add pin-bottom (when scrolled position is below bottom)\n            if (scrolled > options.bottom && !$(this).hasClass('pin-bottom')) {\n              removePinClasses($(this));\n              $(this).addClass('pin-bottom');\n              $(this).css('top', options.bottom - $original_offset);\n            }\n          });\n        }\n\n        updateElements($this, $(window).scrollTop());\n        $(window).on('scroll.' + $uniqueId, function () {\n          var $scrolled = $(window).scrollTop() + options.offset;\n          updateElements($this, $scrolled);\n        });\n\n      });\n\n    };\n\n\n  });\n}( jQuery ));;(function ($) {\n  $(document).ready(function() {\n\n    // jQuery reverse\n    $.fn.reverse = [].reverse;\n\n    // Hover behaviour: make sure this doesn't work on .click-to-toggle FABs!\n    $(document).on('mouseenter.fixedActionBtn', '.fixed-action-btn:not(.click-to-toggle)', function(e) {\n      var $this = $(this);\n      openFABMenu($this);\n    });\n    $(document).on('mouseleave.fixedActionBtn', '.fixed-action-btn:not(.click-to-toggle)', function(e) {\n      var $this = $(this);\n      closeFABMenu($this);\n    });\n\n    // Toggle-on-click behaviour.\n    $(document).on('click.fixedActionBtn', '.fixed-action-btn.click-to-toggle > a', function(e) {\n      var $this = $(this);\n      var $menu = $this.parent();\n      if ($menu.hasClass('active')) {\n        closeFABMenu($menu);\n      } else {\n        openFABMenu($menu);\n      }\n    });\n\n  });\n\n  $.fn.extend({\n    openFAB: function() {\n      openFABMenu($(this));\n    },\n    closeFAB: function() {\n      closeFABMenu($(this));\n    }\n  });\n\n\n  var openFABMenu = function (btn) {\n    $this = btn;\n    if ($this.hasClass('active') === false) {\n\n      // Get direction option\n      var horizontal = $this.hasClass('horizontal');\n      var offsetY, offsetX;\n\n      if (horizontal === true) {\n        offsetX = 40;\n      } else {\n        offsetY = 40;\n      }\n\n      $this.addClass('active');\n      $this.find('ul .btn-floating').velocity(\n        { scaleY: \".4\", scaleX: \".4\", translateY: offsetY + 'px', translateX: offsetX + 'px'},\n        { duration: 0 });\n\n      var time = 0;\n      $this.find('ul .btn-floating').reverse().each( function () {\n        $(this).velocity(\n          { opacity: \"1\", scaleX: \"1\", scaleY: \"1\", translateY: \"0\", translateX: '0'},\n          { duration: 80, delay: time });\n        time += 40;\n      });\n    }\n  };\n\n  var closeFABMenu = function (btn) {\n    $this = btn;\n    // Get direction option\n    var horizontal = $this.hasClass('horizontal');\n    var offsetY, offsetX;\n\n    if (horizontal === true) {\n      offsetX = 40;\n    } else {\n      offsetY = 40;\n    }\n\n    $this.removeClass('active');\n    var time = 0;\n    $this.find('ul .btn-floating').velocity(\"stop\", true);\n    $this.find('ul .btn-floating').velocity(\n      { opacity: \"0\", scaleX: \".4\", scaleY: \".4\", translateY: offsetY + 'px', translateX: offsetX + 'px'},\n      { duration: 80 }\n    );\n  };\n\n\n}( jQuery ));\n;(function ($) {\n  // Image transition function\n  Materialize.fadeInImage =  function(selector){\n    var element = $(selector);\n    element.css({opacity: 0});\n    $(element).velocity({opacity: 1}, {\n        duration: 650,\n        queue: false,\n        easing: 'easeOutSine'\n      });\n    $(element).velocity({opacity: 1}, {\n          duration: 1300,\n          queue: false,\n          easing: 'swing',\n          step: function(now, fx) {\n              fx.start = 100;\n              var grayscale_setting = now/100;\n              var brightness_setting = 150 - (100 - now)/1.75;\n\n              if (brightness_setting < 100) {\n                brightness_setting = 100;\n              }\n              if (now >= 0) {\n                $(this).css({\n                    \"-webkit-filter\": \"grayscale(\"+grayscale_setting+\")\" + \"brightness(\"+brightness_setting+\"%)\",\n                    \"filter\": \"grayscale(\"+grayscale_setting+\")\" + \"brightness(\"+brightness_setting+\"%)\"\n                });\n              }\n          }\n      });\n  };\n\n  // Horizontal staggered list\n  Materialize.showStaggeredList = function(selector) {\n    var time = 0;\n    $(selector).find('li').velocity(\n        { translateX: \"-100px\"},\n        { duration: 0 });\n\n    $(selector).find('li').each(function() {\n      $(this).velocity(\n        { opacity: \"1\", translateX: \"0\"},\n        { duration: 800, delay: time, easing: [60, 10] });\n      time += 120;\n    });\n  };\n\n\n  $(document).ready(function() {\n    // Hardcoded .staggered-list scrollFire\n    // var staggeredListOptions = [];\n    // $('ul.staggered-list').each(function (i) {\n\n    //   var label = 'scrollFire-' + i;\n    //   $(this).addClass(label);\n    //   staggeredListOptions.push(\n    //     {selector: 'ul.staggered-list.' + label,\n    //      offset: 200,\n    //      callback: 'showStaggeredList(\"ul.staggered-list.' + label + '\")'});\n    // });\n    // scrollFire(staggeredListOptions);\n\n    // HammerJS, Swipe navigation\n\n    // Touch Event\n    var swipeLeft = false;\n    var swipeRight = false;\n\n\n    // Dismissible Collections\n    $('.dismissable').each(function() {\n      $(this).hammer({\n        prevent_default: false\n      }).bind('pan', function(e) {\n        if (e.gesture.pointerType === \"touch\") {\n          var $this = $(this);\n          var direction = e.gesture.direction;\n          var x = e.gesture.deltaX;\n          var velocityX = e.gesture.velocityX;\n\n          $this.velocity({ translateX: x\n              }, {duration: 50, queue: false, easing: 'easeOutQuad'});\n\n          // Swipe Left\n          if (direction === 4 && (x > ($this.innerWidth() / 2) || velocityX < -0.75)) {\n            swipeLeft = true;\n          }\n\n          // Swipe Right\n          if (direction === 2 && (x < (-1 * $this.innerWidth() / 2) || velocityX > 0.75)) {\n            swipeRight = true;\n          }\n        }\n      }).bind('panend', function(e) {\n        // Reset if collection is moved back into original position\n        if (Math.abs(e.gesture.deltaX) < ($(this).innerWidth() / 2)) {\n          swipeRight = false;\n          swipeLeft = false;\n        }\n\n        if (e.gesture.pointerType === \"touch\") {\n          var $this = $(this);\n          if (swipeLeft || swipeRight) {\n            var fullWidth;\n            if (swipeLeft) { fullWidth = $this.innerWidth(); }\n            else { fullWidth = -1 * $this.innerWidth(); }\n\n            $this.velocity({ translateX: fullWidth,\n              }, {duration: 100, queue: false, easing: 'easeOutQuad', complete:\n              function() {\n                $this.css('border', 'none');\n                $this.velocity({ height: 0, padding: 0,\n                  }, {duration: 200, queue: false, easing: 'easeOutQuad', complete:\n                    function() { $this.remove(); }\n                  });\n              }\n            });\n          }\n          else {\n            $this.velocity({ translateX: 0,\n              }, {duration: 100, queue: false, easing: 'easeOutQuad'});\n          }\n          swipeLeft = false;\n          swipeRight = false;\n        }\n      });\n\n    });\n\n\n    // time = 0\n    // // Vertical Staggered list\n    // $('ul.staggered-list.vertical li').velocity(\n    //     { translateY: \"100px\"},\n    //     { duration: 0 });\n\n    // $('ul.staggered-list.vertical li').each(function() {\n    //   $(this).velocity(\n    //     { opacity: \"1\", translateY: \"0\"},\n    //     { duration: 800, delay: time, easing: [60, 25] });\n    //   time += 120;\n    // });\n\n    // // Fade in and Scale\n    // $('.fade-in.scale').velocity(\n    //     { scaleX: .4, scaleY: .4, translateX: -600},\n    //     { duration: 0});\n    // $('.fade-in').each(function() {\n    //   $(this).velocity(\n    //     { opacity: \"1\", scaleX: 1, scaleY: 1, translateX: 0},\n    //     { duration: 800, easing: [60, 10] });\n    // });\n  });\n}( jQuery ));\n;(function($) {\n\n  // Input: Array of JSON objects {selector, offset, callback}\n\n  Materialize.scrollFire = function(options) {\n\n    var didScroll = false;\n\n    window.addEventListener(\"scroll\", function() {\n      didScroll = true;\n    });\n\n    // Rate limit to 100ms\n    setInterval(function() {\n      if(didScroll) {\n          didScroll = false;\n\n          var windowScroll = window.pageYOffset + window.innerHeight;\n\n          for (var i = 0 ; i < options.length; i++) {\n            // Get options from each line\n            var value = options[i];\n            var selector = value.selector,\n                offset = value.offset,\n                callback = value.callback;\n\n            var currentElement = document.querySelector(selector);\n            if ( currentElement !== null) {\n              var elementOffset = currentElement.getBoundingClientRect().top + window.pageYOffset;\n\n              if (windowScroll > (elementOffset + offset)) {\n                if (value.done !== true) {\n                  var callbackFunc = new Function(callback);\n                  callbackFunc();\n                  value.done = true;\n                }\n              }\n            }\n          }\n      }\n    }, 100);\n  };\n\n})(jQuery);;/*!\n * pickadate.js v3.5.0, 2014/04/13\n * By Amsul, http://amsul.ca\n * Hosted on http://amsul.github.io/pickadate.js\n * Licensed under MIT\n */\n\n(function ( factory ) {\n\n    // AMD.\n    if ( typeof define == 'function' && define.amd )\n        define( 'picker', ['jquery'], factory )\n\n    // Node.js/browserify.\n    else if ( typeof exports == 'object' )\n        module.exports = factory( require('jquery') )\n\n    // Browser globals.\n    else this.Picker = factory( jQuery )\n\n}(function( $ ) {\n\nvar $window = $( window )\nvar $document = $( document )\nvar $html = $( document.documentElement )\n\n\n/**\n * The picker constructor that creates a blank picker.\n */\nfunction PickerConstructor( ELEMENT, NAME, COMPONENT, OPTIONS ) {\n\n    // If there’s no element, return the picker constructor.\n    if ( !ELEMENT ) return PickerConstructor\n\n\n    var\n        IS_DEFAULT_THEME = false,\n\n\n        // The state of the picker.\n        STATE = {\n            id: ELEMENT.id || 'P' + Math.abs( ~~(Math.random() * new Date()) )\n        },\n\n\n        // Merge the defaults and options passed.\n        SETTINGS = COMPONENT ? $.extend( true, {}, COMPONENT.defaults, OPTIONS ) : OPTIONS || {},\n\n\n        // Merge the default classes with the settings classes.\n        CLASSES = $.extend( {}, PickerConstructor.klasses(), SETTINGS.klass ),\n\n\n        // The element node wrapper into a jQuery object.\n        $ELEMENT = $( ELEMENT ),\n\n\n        // Pseudo picker constructor.\n        PickerInstance = function() {\n            return this.start()\n        },\n\n\n        // The picker prototype.\n        P = PickerInstance.prototype = {\n\n            constructor: PickerInstance,\n\n            $node: $ELEMENT,\n\n\n            /**\n             * Initialize everything\n             */\n            start: function() {\n\n                // If it’s already started, do nothing.\n                if ( STATE && STATE.start ) return P\n\n\n                // Update the picker states.\n                STATE.methods = {}\n                STATE.start = true\n                STATE.open = false\n                STATE.type = ELEMENT.type\n\n\n                // Confirm focus state, convert into text input to remove UA stylings,\n                // and set as readonly to prevent keyboard popup.\n                ELEMENT.autofocus = ELEMENT == getActiveElement()\n                ELEMENT.readOnly = !SETTINGS.editable\n                ELEMENT.id = ELEMENT.id || STATE.id\n                if ( ELEMENT.type != 'text' ) {\n                    ELEMENT.type = 'text'\n                }\n\n\n                // Create a new picker component with the settings.\n                P.component = new COMPONENT(P, SETTINGS)\n\n\n                // Create the picker root with a holder and then prepare it.\n                P.$root = $( PickerConstructor._.node('div', createWrappedComponent(), CLASSES.picker, 'id=\"' + ELEMENT.id + '_root\" tabindex=\"0\"') )\n                prepareElementRoot()\n\n\n                // If there’s a format for the hidden input element, create the element.\n                if ( SETTINGS.formatSubmit ) {\n                    prepareElementHidden()\n                }\n\n\n                // Prepare the input element.\n                prepareElement()\n\n\n                // Insert the root as specified in the settings.\n                if ( SETTINGS.container ) $( SETTINGS.container ).append( P.$root )\n                else $ELEMENT.after( P.$root )\n\n\n                // Bind the default component and settings events.\n                P.on({\n                    start: P.component.onStart,\n                    render: P.component.onRender,\n                    stop: P.component.onStop,\n                    open: P.component.onOpen,\n                    close: P.component.onClose,\n                    set: P.component.onSet\n                }).on({\n                    start: SETTINGS.onStart,\n                    render: SETTINGS.onRender,\n                    stop: SETTINGS.onStop,\n                    open: SETTINGS.onOpen,\n                    close: SETTINGS.onClose,\n                    set: SETTINGS.onSet\n                })\n\n\n                // Once we’re all set, check the theme in use.\n                IS_DEFAULT_THEME = isUsingDefaultTheme( P.$root.children()[ 0 ] )\n\n\n                // If the element has autofocus, open the picker.\n                if ( ELEMENT.autofocus ) {\n                    P.open()\n                }\n\n\n                // Trigger queued the “start” and “render” events.\n                return P.trigger( 'start' ).trigger( 'render' )\n            }, //start\n\n\n            /**\n             * Render a new picker\n             */\n            render: function( entireComponent ) {\n\n                // Insert a new component holder in the root or box.\n                if ( entireComponent ) P.$root.html( createWrappedComponent() )\n                else P.$root.find( '.' + CLASSES.box ).html( P.component.nodes( STATE.open ) )\n\n                // Trigger the queued “render” events.\n                return P.trigger( 'render' )\n            }, //render\n\n\n            /**\n             * Destroy everything\n             */\n            stop: function() {\n\n                // If it’s already stopped, do nothing.\n                if ( !STATE.start ) return P\n\n                // Then close the picker.\n                P.close()\n\n                // Remove the hidden field.\n                if ( P._hidden ) {\n                    P._hidden.parentNode.removeChild( P._hidden )\n                }\n\n                // Remove the root.\n                P.$root.remove()\n\n                // Remove the input class, remove the stored data, and unbind\n                // the events (after a tick for IE - see `P.close`).\n                $ELEMENT.removeClass( CLASSES.input ).removeData( NAME )\n                setTimeout( function() {\n                    $ELEMENT.off( '.' + STATE.id )\n                }, 0)\n\n                // Restore the element state\n                ELEMENT.type = STATE.type\n                ELEMENT.readOnly = false\n\n                // Trigger the queued “stop” events.\n                P.trigger( 'stop' )\n\n                // Reset the picker states.\n                STATE.methods = {}\n                STATE.start = false\n\n                return P\n            }, //stop\n\n\n            /**\n             * Open up the picker\n             */\n            open: function( dontGiveFocus ) {\n\n                // If it’s already open, do nothing.\n                if ( STATE.open ) return P\n\n                // Add the “active” class.\n                $ELEMENT.addClass( CLASSES.active )\n                aria( ELEMENT, 'expanded', true )\n\n                // * A Firefox bug, when `html` has `overflow:hidden`, results in\n                //   killing transitions :(. So add the “opened” state on the next tick.\n                //   Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=625289\n                setTimeout( function() {\n\n                    // Add the “opened” class to the picker root.\n                    P.$root.addClass( CLASSES.opened )\n                    aria( P.$root[0], 'hidden', false )\n\n                }, 0 )\n\n                // If we have to give focus, bind the element and doc events.\n                if ( dontGiveFocus !== false ) {\n\n                    // Set it as open.\n                    STATE.open = true\n\n                    // Prevent the page from scrolling.\n                    if ( IS_DEFAULT_THEME ) {\n                        $html.\n                            css( 'overflow', 'hidden' ).\n                            css( 'padding-right', '+=' + getScrollbarWidth() )\n                    }\n\n                    // Pass focus to the root element’s jQuery object.\n                    // * Workaround for iOS8 to bring the picker’s root into view.\n                    P.$root[0].focus()\n\n                    // Bind the document events.\n                    $document.on( 'click.' + STATE.id + ' focusin.' + STATE.id, function( event ) {\n\n                        var target = event.target\n\n                        // If the target of the event is not the element, close the picker picker.\n                        // * Don’t worry about clicks or focusins on the root because those don’t bubble up.\n                        //   Also, for Firefox, a click on an `option` element bubbles up directly\n                        //   to the doc. So make sure the target wasn't the doc.\n                        // * In Firefox stopPropagation() doesn’t prevent right-click events from bubbling,\n                        //   which causes the picker to unexpectedly close when right-clicking it. So make\n                        //   sure the event wasn’t a right-click.\n                        if ( target != ELEMENT && target != document && event.which != 3 ) {\n\n                            // If the target was the holder that covers the screen,\n                            // keep the element focused to maintain tabindex.\n                            P.close( target === P.$root.children()[0] )\n                        }\n\n                    }).on( 'keydown.' + STATE.id, function( event ) {\n\n                        var\n                            // Get the keycode.\n                            keycode = event.keyCode,\n\n                            // Translate that to a selection change.\n                            keycodeToMove = P.component.key[ keycode ],\n\n                            // Grab the target.\n                            target = event.target\n\n\n                        // On escape, close the picker and give focus.\n                        if ( keycode == 27 ) {\n                            P.close( true )\n                        }\n\n\n                        // Check if there is a key movement or “enter” keypress on the element.\n                        else if ( target == P.$root[0] && ( keycodeToMove || keycode == 13 ) ) {\n\n                            // Prevent the default action to stop page movement.\n                            event.preventDefault()\n\n                            // Trigger the key movement action.\n                            if ( keycodeToMove ) {\n                                PickerConstructor._.trigger( P.component.key.go, P, [ PickerConstructor._.trigger( keycodeToMove ) ] )\n                            }\n\n                            // On “enter”, if the highlighted item isn’t disabled, set the value and close.\n                            else if ( !P.$root.find( '.' + CLASSES.highlighted ).hasClass( CLASSES.disabled ) ) {\n                                P.set( 'select', P.component.item.highlight ).close()\n                            }\n                        }\n\n\n                        // If the target is within the root and “enter” is pressed,\n                        // prevent the default action and trigger a click on the target instead.\n                        else if ( $.contains( P.$root[0], target ) && keycode == 13 ) {\n                            event.preventDefault()\n                            target.click()\n                        }\n                    })\n                }\n\n                // Trigger the queued “open” events.\n                return P.trigger( 'open' )\n            }, //open\n\n\n            /**\n             * Close the picker\n             */\n            close: function( giveFocus ) {\n\n                // If we need to give focus, do it before changing states.\n                if ( giveFocus ) {\n                    // ....ah yes! It would’ve been incomplete without a crazy workaround for IE :|\n                    // The focus is triggered *after* the close has completed - causing it\n                    // to open again. So unbind and rebind the event at the next tick.\n                    P.$root.off( 'focus.toOpen' )[0].focus()\n                    setTimeout( function() {\n                        P.$root.on( 'focus.toOpen', handleFocusToOpenEvent )\n                    }, 0 )\n                }\n\n                // Remove the “active” class.\n                $ELEMENT.removeClass( CLASSES.active )\n                aria( ELEMENT, 'expanded', false )\n\n                // * A Firefox bug, when `html` has `overflow:hidden`, results in\n                //   killing transitions :(. So remove the “opened” state on the next tick.\n                //   Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=625289\n                setTimeout( function() {\n\n                    // Remove the “opened” and “focused” class from the picker root.\n                    P.$root.removeClass( CLASSES.opened + ' ' + CLASSES.focused )\n                    aria( P.$root[0], 'hidden', true )\n\n                }, 0 )\n\n                // If it’s already closed, do nothing more.\n                if ( !STATE.open ) return P\n\n                // Set it as closed.\n                STATE.open = false\n\n                // Allow the page to scroll.\n                if ( IS_DEFAULT_THEME ) {\n                    $html.\n                        css( 'overflow', '' ).\n                        css( 'padding-right', '-=' + getScrollbarWidth() )\n                }\n\n                // Unbind the document events.\n                $document.off( '.' + STATE.id )\n\n                // Trigger the queued “close” events.\n                return P.trigger( 'close' )\n            }, //close\n\n\n            /**\n             * Clear the values\n             */\n            clear: function( options ) {\n                return P.set( 'clear', null, options )\n            }, //clear\n\n\n            /**\n             * Set something\n             */\n            set: function( thing, value, options ) {\n\n                var thingItem, thingValue,\n                    thingIsObject = $.isPlainObject( thing ),\n                    thingObject = thingIsObject ? thing : {}\n\n                // Make sure we have usable options.\n                options = thingIsObject && $.isPlainObject( value ) ? value : options || {}\n\n                if ( thing ) {\n\n                    // If the thing isn’t an object, make it one.\n                    if ( !thingIsObject ) {\n                        thingObject[ thing ] = value\n                    }\n\n                    // Go through the things of items to set.\n                    for ( thingItem in thingObject ) {\n\n                        // Grab the value of the thing.\n                        thingValue = thingObject[ thingItem ]\n\n                        // First, if the item exists and there’s a value, set it.\n                        if ( thingItem in P.component.item ) {\n                            if ( thingValue === undefined ) thingValue = null\n                            P.component.set( thingItem, thingValue, options )\n                        }\n\n                        // Then, check to update the element value and broadcast a change.\n                        if ( thingItem == 'select' || thingItem == 'clear' ) {\n                            $ELEMENT.\n                                val( thingItem == 'clear' ? '' : P.get( thingItem, SETTINGS.format ) ).\n                                trigger( 'change' )\n                        }\n                    }\n\n                    // Render a new picker.\n                    P.render()\n                }\n\n                // When the method isn’t muted, trigger queued “set” events and pass the `thingObject`.\n                return options.muted ? P : P.trigger( 'set', thingObject )\n            }, //set\n\n\n            /**\n             * Get something\n             */\n            get: function( thing, format ) {\n\n                // Make sure there’s something to get.\n                thing = thing || 'value'\n\n                // If a picker state exists, return that.\n                if ( STATE[ thing ] != null ) {\n                    return STATE[ thing ]\n                }\n\n                // Return the submission value, if that.\n                if ( thing == 'valueSubmit' ) {\n                    if ( P._hidden ) {\n                        return P._hidden.value\n                    }\n                    thing = 'value'\n                }\n\n                // Return the value, if that.\n                if ( thing == 'value' ) {\n                    return ELEMENT.value\n                }\n\n                // Check if a component item exists, return that.\n                if ( thing in P.component.item ) {\n                    if ( typeof format == 'string' ) {\n                        var thingValue = P.component.get( thing )\n                        return thingValue ?\n                            PickerConstructor._.trigger(\n                                P.component.formats.toString,\n                                P.component,\n                                [ format, thingValue ]\n                            ) : ''\n                    }\n                    return P.component.get( thing )\n                }\n            }, //get\n\n\n\n            /**\n             * Bind events on the things.\n             */\n            on: function( thing, method, internal ) {\n\n                var thingName, thingMethod,\n                    thingIsObject = $.isPlainObject( thing ),\n                    thingObject = thingIsObject ? thing : {}\n\n                if ( thing ) {\n\n                    // If the thing isn’t an object, make it one.\n                    if ( !thingIsObject ) {\n                        thingObject[ thing ] = method\n                    }\n\n                    // Go through the things to bind to.\n                    for ( thingName in thingObject ) {\n\n                        // Grab the method of the thing.\n                        thingMethod = thingObject[ thingName ]\n\n                        // If it was an internal binding, prefix it.\n                        if ( internal ) {\n                            thingName = '_' + thingName\n                        }\n\n                        // Make sure the thing methods collection exists.\n                        STATE.methods[ thingName ] = STATE.methods[ thingName ] || []\n\n                        // Add the method to the relative method collection.\n                        STATE.methods[ thingName ].push( thingMethod )\n                    }\n                }\n\n                return P\n            }, //on\n\n\n\n            /**\n             * Unbind events on the things.\n             */\n            off: function() {\n                var i, thingName,\n                    names = arguments;\n                for ( i = 0, namesCount = names.length; i < namesCount; i += 1 ) {\n                    thingName = names[i]\n                    if ( thingName in STATE.methods ) {\n                        delete STATE.methods[thingName]\n                    }\n                }\n                return P\n            },\n\n\n            /**\n             * Fire off method events.\n             */\n            trigger: function( name, data ) {\n                var _trigger = function( name ) {\n                    var methodList = STATE.methods[ name ]\n                    if ( methodList ) {\n                        methodList.map( function( method ) {\n                            PickerConstructor._.trigger( method, P, [ data ] )\n                        })\n                    }\n                }\n                _trigger( '_' + name )\n                _trigger( name )\n                return P\n            } //trigger\n        } //PickerInstance.prototype\n\n\n    /**\n     * Wrap the picker holder components together.\n     */\n    function createWrappedComponent() {\n\n        // Create a picker wrapper holder\n        return PickerConstructor._.node( 'div',\n\n            // Create a picker wrapper node\n            PickerConstructor._.node( 'div',\n\n                // Create a picker frame\n                PickerConstructor._.node( 'div',\n\n                    // Create a picker box node\n                    PickerConstructor._.node( 'div',\n\n                        // Create the components nodes.\n                        P.component.nodes( STATE.open ),\n\n                        // The picker box class\n                        CLASSES.box\n                    ),\n\n                    // Picker wrap class\n                    CLASSES.wrap\n                ),\n\n                // Picker frame class\n                CLASSES.frame\n            ),\n\n            // Picker holder class\n            CLASSES.holder\n        ) //endreturn\n    } //createWrappedComponent\n\n\n\n    /**\n     * Prepare the input element with all bindings.\n     */\n    function prepareElement() {\n\n        $ELEMENT.\n\n            // Store the picker data by component name.\n            data(NAME, P).\n\n            // Add the “input” class name.\n            addClass(CLASSES.input).\n\n            // Remove the tabindex.\n            attr('tabindex', -1).\n\n            // If there’s a `data-value`, update the value of the element.\n            val( $ELEMENT.data('value') ?\n                P.get('select', SETTINGS.format) :\n                ELEMENT.value\n            )\n\n\n        // Only bind keydown events if the element isn’t editable.\n        if ( !SETTINGS.editable ) {\n\n            $ELEMENT.\n\n                // On focus/click, focus onto the root to open it up.\n                on( 'focus.' + STATE.id + ' click.' + STATE.id, function( event ) {\n                    event.preventDefault()\n                    P.$root[0].focus()\n                }).\n\n                // Handle keyboard event based on the picker being opened or not.\n                on( 'keydown.' + STATE.id, handleKeydownEvent )\n        }\n\n\n        // Update the aria attributes.\n        aria(ELEMENT, {\n            haspopup: true,\n            expanded: false,\n            readonly: false,\n            owns: ELEMENT.id + '_root'\n        })\n    }\n\n\n    /**\n     * Prepare the root picker element with all bindings.\n     */\n    function prepareElementRoot() {\n\n        P.$root.\n\n            on({\n\n                // For iOS8.\n                keydown: handleKeydownEvent,\n\n                // When something within the root is focused, stop from bubbling\n                // to the doc and remove the “focused” state from the root.\n                focusin: function( event ) {\n                    P.$root.removeClass( CLASSES.focused )\n                    event.stopPropagation()\n                },\n\n                // When something within the root holder is clicked, stop it\n                // from bubbling to the doc.\n                'mousedown click': function( event ) {\n\n                    var target = event.target\n\n                    // Make sure the target isn’t the root holder so it can bubble up.\n                    if ( target != P.$root.children()[ 0 ] ) {\n\n                        event.stopPropagation()\n\n                        // * For mousedown events, cancel the default action in order to\n                        //   prevent cases where focus is shifted onto external elements\n                        //   when using things like jQuery mobile or MagnificPopup (ref: #249 & #120).\n                        //   Also, for Firefox, don’t prevent action on the `option` element.\n                        if ( event.type == 'mousedown' && !$( target ).is( 'input, select, textarea, button, option' )) {\n\n                            event.preventDefault()\n\n                            // Re-focus onto the root so that users can click away\n                            // from elements focused within the picker.\n                            P.$root[0].focus()\n                        }\n                    }\n                }\n            }).\n\n            // Add/remove the “target” class on focus and blur.\n            on({\n                focus: function() {\n                    $ELEMENT.addClass( CLASSES.target )\n                },\n                blur: function() {\n                    $ELEMENT.removeClass( CLASSES.target )\n                }\n            }).\n\n            // Open the picker and adjust the root “focused” state\n            on( 'focus.toOpen', handleFocusToOpenEvent ).\n\n            // If there’s a click on an actionable element, carry out the actions.\n            on( 'click', '[data-pick], [data-nav], [data-clear], [data-close]', function() {\n\n                var $target = $( this ),\n                    targetData = $target.data(),\n                    targetDisabled = $target.hasClass( CLASSES.navDisabled ) || $target.hasClass( CLASSES.disabled ),\n\n                    // * For IE, non-focusable elements can be active elements as well\n                    //   (http://stackoverflow.com/a/2684561).\n                    activeElement = getActiveElement()\n                    activeElement = activeElement && ( activeElement.type || activeElement.href )\n\n                // If it’s disabled or nothing inside is actively focused, re-focus the element.\n                if ( targetDisabled || activeElement && !$.contains( P.$root[0], activeElement ) ) {\n                    P.$root[0].focus()\n                }\n\n                // If something is superficially changed, update the `highlight` based on the `nav`.\n                if ( !targetDisabled && targetData.nav ) {\n                    P.set( 'highlight', P.component.item.highlight, { nav: targetData.nav } )\n                }\n\n                // If something is picked, set `select` then close with focus.\n                else if ( !targetDisabled && 'pick' in targetData ) {\n                    P.set( 'select', targetData.pick )\n                }\n\n                // If a “clear” button is pressed, empty the values and close with focus.\n                else if ( targetData.clear ) {\n                    P.clear().close( true )\n                }\n\n                else if ( targetData.close ) {\n                    P.close( true )\n                }\n\n            }) //P.$root\n\n        aria( P.$root[0], 'hidden', true )\n    }\n\n\n     /**\n      * Prepare the hidden input element along with all bindings.\n      */\n    function prepareElementHidden() {\n\n        var name\n\n        if ( SETTINGS.hiddenName === true ) {\n            name = ELEMENT.name\n            ELEMENT.name = ''\n        }\n        else {\n            name = [\n                typeof SETTINGS.hiddenPrefix == 'string' ? SETTINGS.hiddenPrefix : '',\n                typeof SETTINGS.hiddenSuffix == 'string' ? SETTINGS.hiddenSuffix : '_submit'\n            ]\n            name = name[0] + ELEMENT.name + name[1]\n        }\n\n        P._hidden = $(\n            '<input ' +\n            'type=hidden ' +\n\n            // Create the name using the original input’s with a prefix and suffix.\n            'name=\"' + name + '\"' +\n\n            // If the element has a value, set the hidden value as well.\n            (\n                $ELEMENT.data('value') || ELEMENT.value ?\n                    ' value=\"' + P.get('select', SETTINGS.formatSubmit) + '\"' :\n                    ''\n            ) +\n            '>'\n        )[0]\n\n        $ELEMENT.\n\n            // If the value changes, update the hidden input with the correct format.\n            on('change.' + STATE.id, function() {\n                P._hidden.value = ELEMENT.value ?\n                    P.get('select', SETTINGS.formatSubmit) :\n                    ''\n            })\n\n\n        // Insert the hidden input as specified in the settings.\n        if ( SETTINGS.container ) $( SETTINGS.container ).append( P._hidden )\n        else $ELEMENT.after( P._hidden )\n    }\n\n\n    // For iOS8.\n    function handleKeydownEvent( event ) {\n\n        var keycode = event.keyCode,\n\n            // Check if one of the delete keys was pressed.\n            isKeycodeDelete = /^(8|46)$/.test(keycode)\n\n        // For some reason IE clears the input value on “escape”.\n        if ( keycode == 27 ) {\n            P.close()\n            return false\n        }\n\n        // Check if `space` or `delete` was pressed or the picker is closed with a key movement.\n        if ( keycode == 32 || isKeycodeDelete || !STATE.open && P.component.key[keycode] ) {\n\n            // Prevent it from moving the page and bubbling to doc.\n            event.preventDefault()\n            event.stopPropagation()\n\n            // If `delete` was pressed, clear the values and close the picker.\n            // Otherwise open the picker.\n            if ( isKeycodeDelete ) { P.clear().close() }\n            else { P.open() }\n        }\n    }\n\n\n    // Separated for IE\n    function handleFocusToOpenEvent( event ) {\n\n        // Stop the event from propagating to the doc.\n        event.stopPropagation()\n\n        // If it’s a focus event, add the “focused” class to the root.\n        if ( event.type == 'focus' ) {\n            P.$root.addClass( CLASSES.focused )\n        }\n\n        // And then finally open the picker.\n        P.open()\n    }\n\n\n    // Return a new picker instance.\n    return new PickerInstance()\n} //PickerConstructor\n\n\n\n/**\n * The default classes and prefix to use for the HTML classes.\n */\nPickerConstructor.klasses = function( prefix ) {\n    prefix = prefix || 'picker'\n    return {\n\n        picker: prefix,\n        opened: prefix + '--opened',\n        focused: prefix + '--focused',\n\n        input: prefix + '__input',\n        active: prefix + '__input--active',\n        target: prefix + '__input--target',\n\n        holder: prefix + '__holder',\n\n        frame: prefix + '__frame',\n        wrap: prefix + '__wrap',\n\n        box: prefix + '__box'\n    }\n} //PickerConstructor.klasses\n\n\n\n/**\n * Check if the default theme is being used.\n */\nfunction isUsingDefaultTheme( element ) {\n\n    var theme,\n        prop = 'position'\n\n    // For IE.\n    if ( element.currentStyle ) {\n        theme = element.currentStyle[prop]\n    }\n\n    // For normal browsers.\n    else if ( window.getComputedStyle ) {\n        theme = getComputedStyle( element )[prop]\n    }\n\n    return theme == 'fixed'\n}\n\n\n\n/**\n * Get the width of the browser’s scrollbar.\n * Taken from: https://github.com/VodkaBears/Remodal/blob/master/src/jquery.remodal.js\n */\nfunction getScrollbarWidth() {\n\n    if ( $html.height() <= $window.height() ) {\n        return 0\n    }\n\n    var $outer = $( '<div style=\"visibility:hidden;width:100px\" />' ).\n        appendTo( 'body' )\n\n    // Get the width without scrollbars.\n    var widthWithoutScroll = $outer[0].offsetWidth\n\n    // Force adding scrollbars.\n    $outer.css( 'overflow', 'scroll' )\n\n    // Add the inner div.\n    var $inner = $( '<div style=\"width:100%\" />' ).appendTo( $outer )\n\n    // Get the width with scrollbars.\n    var widthWithScroll = $inner[0].offsetWidth\n\n    // Remove the divs.\n    $outer.remove()\n\n    // Return the difference between the widths.\n    return widthWithoutScroll - widthWithScroll\n}\n\n\n\n/**\n * PickerConstructor helper methods.\n */\nPickerConstructor._ = {\n\n    /**\n     * Create a group of nodes. Expects:\n     * `\n        {\n            min:    {Integer},\n            max:    {Integer},\n            i:      {Integer},\n            node:   {String},\n            item:   {Function}\n        }\n     * `\n     */\n    group: function( groupObject ) {\n\n        var\n            // Scope for the looped object\n            loopObjectScope,\n\n            // Create the nodes list\n            nodesList = '',\n\n            // The counter starts from the `min`\n            counter = PickerConstructor._.trigger( groupObject.min, groupObject )\n\n\n        // Loop from the `min` to `max`, incrementing by `i`\n        for ( ; counter <= PickerConstructor._.trigger( groupObject.max, groupObject, [ counter ] ); counter += groupObject.i ) {\n\n            // Trigger the `item` function within scope of the object\n            loopObjectScope = PickerConstructor._.trigger( groupObject.item, groupObject, [ counter ] )\n\n            // Splice the subgroup and create nodes out of the sub nodes\n            nodesList += PickerConstructor._.node(\n                groupObject.node,\n                loopObjectScope[ 0 ],   // the node\n                loopObjectScope[ 1 ],   // the classes\n                loopObjectScope[ 2 ]    // the attributes\n            )\n        }\n\n        // Return the list of nodes\n        return nodesList\n    }, //group\n\n\n    /**\n     * Create a dom node string\n     */\n    node: function( wrapper, item, klass, attribute ) {\n\n        // If the item is false-y, just return an empty string\n        if ( !item ) return ''\n\n        // If the item is an array, do a join\n        item = $.isArray( item ) ? item.join( '' ) : item\n\n        // Check for the class\n        klass = klass ? ' class=\"' + klass + '\"' : ''\n\n        // Check for any attributes\n        attribute = attribute ? ' ' + attribute : ''\n\n        // Return the wrapped item\n        return '<' + wrapper + klass + attribute + '>' + item + '</' + wrapper + '>'\n    }, //node\n\n\n    /**\n     * Lead numbers below 10 with a zero.\n     */\n    lead: function( number ) {\n        return ( number < 10 ? '0': '' ) + number\n    },\n\n\n    /**\n     * Trigger a function otherwise return the value.\n     */\n    trigger: function( callback, scope, args ) {\n        return typeof callback == 'function' ? callback.apply( scope, args || [] ) : callback\n    },\n\n\n    /**\n     * If the second character is a digit, length is 2 otherwise 1.\n     */\n    digits: function( string ) {\n        return ( /\\d/ ).test( string[ 1 ] ) ? 2 : 1\n    },\n\n\n    /**\n     * Tell if something is a date object.\n     */\n    isDate: function( value ) {\n        return {}.toString.call( value ).indexOf( 'Date' ) > -1 && this.isInteger( value.getDate() )\n    },\n\n\n    /**\n     * Tell if something is an integer.\n     */\n    isInteger: function( value ) {\n        return {}.toString.call( value ).indexOf( 'Number' ) > -1 && value % 1 === 0\n    },\n\n\n    /**\n     * Create ARIA attribute strings.\n     */\n    ariaAttr: ariaAttr\n} //PickerConstructor._\n\n\n\n/**\n * Extend the picker with a component and defaults.\n */\nPickerConstructor.extend = function( name, Component ) {\n\n    // Extend jQuery.\n    $.fn[ name ] = function( options, action ) {\n\n        // Grab the component data.\n        var componentData = this.data( name )\n\n        // If the picker is requested, return the data object.\n        if ( options == 'picker' ) {\n            return componentData\n        }\n\n        // If the component data exists and `options` is a string, carry out the action.\n        if ( componentData && typeof options == 'string' ) {\n            return PickerConstructor._.trigger( componentData[ options ], componentData, [ action ] )\n        }\n\n        // Otherwise go through each matched element and if the component\n        // doesn’t exist, create a new picker using `this` element\n        // and merging the defaults and options with a deep copy.\n        return this.each( function() {\n            var $this = $( this )\n            if ( !$this.data( name ) ) {\n                new PickerConstructor( this, name, Component, options )\n            }\n        })\n    }\n\n    // Set the defaults.\n    $.fn[ name ].defaults = Component.defaults\n} //PickerConstructor.extend\n\n\n\nfunction aria(element, attribute, value) {\n    if ( $.isPlainObject(attribute) ) {\n        for ( var key in attribute ) {\n            ariaSet(element, key, attribute[key])\n        }\n    }\n    else {\n        ariaSet(element, attribute, value)\n    }\n}\nfunction ariaSet(element, attribute, value) {\n    element.setAttribute(\n        (attribute == 'role' ? '' : 'aria-') + attribute,\n        value\n    )\n}\nfunction ariaAttr(attribute, data) {\n    if ( !$.isPlainObject(attribute) ) {\n        attribute = { attribute: data }\n    }\n    data = ''\n    for ( var key in attribute ) {\n        var attr = (key == 'role' ? '' : 'aria-') + key,\n            attrVal = attribute[key]\n        data += attrVal == null ? '' : attr + '=\"' + attribute[key] + '\"'\n    }\n    return data\n}\n\n// IE8 bug throws an error for activeElements within iframes.\nfunction getActiveElement() {\n    try {\n        return document.activeElement\n    } catch ( err ) { }\n}\n\n\n\n// Expose the picker constructor.\nreturn PickerConstructor\n\n\n}));\n\n\n;/*!\n * Date picker for pickadate.js v3.5.0\n * http://amsul.github.io/pickadate.js/date.htm\n */\n\n(function ( factory ) {\n\n    // AMD.\n    if ( typeof define == 'function' && define.amd )\n        define( ['picker', 'jquery'], factory )\n\n    // Node.js/browserify.\n    else if ( typeof exports == 'object' )\n        module.exports = factory( require('./picker.js'), require('jquery') )\n\n    // Browser globals.\n    else factory( Picker, jQuery )\n\n}(function( Picker, $ ) {\n\n\n/**\n * Globals and constants\n */\nvar DAYS_IN_WEEK = 7,\n    WEEKS_IN_CALENDAR = 6,\n    _ = Picker._\n\n\n\n/**\n * The date picker constructor\n */\nfunction DatePicker( picker, settings ) {\n\n    var calendar = this,\n        element = picker.$node[ 0 ],\n        elementValue = element.value,\n        elementDataValue = picker.$node.data( 'value' ),\n        valueString = elementDataValue || elementValue,\n        formatString = elementDataValue ? settings.formatSubmit : settings.format,\n        isRTL = function() {\n\n            return element.currentStyle ?\n\n                // For IE.\n                element.currentStyle.direction == 'rtl' :\n\n                // For normal browsers.\n                getComputedStyle( picker.$root[0] ).direction == 'rtl'\n        }\n\n    calendar.settings = settings\n    calendar.$node = picker.$node\n\n    // The queue of methods that will be used to build item objects.\n    calendar.queue = {\n        min: 'measure create',\n        max: 'measure create',\n        now: 'now create',\n        select: 'parse create validate',\n        highlight: 'parse navigate create validate',\n        view: 'parse create validate viewset',\n        disable: 'deactivate',\n        enable: 'activate'\n    }\n\n    // The component's item object.\n    calendar.item = {}\n\n    calendar.item.clear = null\n    calendar.item.disable = ( settings.disable || [] ).slice( 0 )\n    calendar.item.enable = -(function( collectionDisabled ) {\n        return collectionDisabled[ 0 ] === true ? collectionDisabled.shift() : -1\n    })( calendar.item.disable )\n\n    calendar.\n        set( 'min', settings.min ).\n        set( 'max', settings.max ).\n        set( 'now' )\n\n    // When there’s a value, set the `select`, which in turn\n    // also sets the `highlight` and `view`.\n    if ( valueString ) {\n        calendar.set( 'select', valueString, { format: formatString })\n    }\n\n    // If there’s no value, default to highlighting “today”.\n    else {\n        calendar.\n            set( 'select', null ).\n            set( 'highlight', calendar.item.now )\n    }\n\n\n    // The keycode to movement mapping.\n    calendar.key = {\n        40: 7, // Down\n        38: -7, // Up\n        39: function() { return isRTL() ? -1 : 1 }, // Right\n        37: function() { return isRTL() ? 1 : -1 }, // Left\n        go: function( timeChange ) {\n            var highlightedObject = calendar.item.highlight,\n                targetDate = new Date( highlightedObject.year, highlightedObject.month, highlightedObject.date + timeChange )\n            calendar.set(\n                'highlight',\n                targetDate,\n                { interval: timeChange }\n            )\n            this.render()\n        }\n    }\n\n\n    // Bind some picker events.\n    picker.\n        on( 'render', function() {\n            picker.$root.find( '.' + settings.klass.selectMonth ).on( 'change', function() {\n                var value = this.value\n                if ( value ) {\n                    picker.set( 'highlight', [ picker.get( 'view' ).year, value, picker.get( 'highlight' ).date ] )\n                    picker.$root.find( '.' + settings.klass.selectMonth ).trigger( 'focus' )\n                }\n            })\n            picker.$root.find( '.' + settings.klass.selectYear ).on( 'change', function() {\n                var value = this.value\n                if ( value ) {\n                    picker.set( 'highlight', [ value, picker.get( 'view' ).month, picker.get( 'highlight' ).date ] )\n                    picker.$root.find( '.' + settings.klass.selectYear ).trigger( 'focus' )\n                }\n            })\n        }, 1 ).\n        on( 'open', function() {\n            var includeToday = ''\n            if ( calendar.disabled( calendar.get('now') ) ) {\n                includeToday = ':not(.' + settings.klass.buttonToday + ')'\n            }\n            picker.$root.find( 'button' + includeToday + ', select' ).attr( 'disabled', false )\n        }, 1 ).\n        on( 'close', function() {\n            picker.$root.find( 'button, select' ).attr( 'disabled', true )\n        }, 1 )\n\n} //DatePicker\n\n\n/**\n * Set a datepicker item object.\n */\nDatePicker.prototype.set = function( type, value, options ) {\n\n    var calendar = this,\n        calendarItem = calendar.item\n\n    // If the value is `null` just set it immediately.\n    if ( value === null ) {\n        if ( type == 'clear' ) type = 'select'\n        calendarItem[ type ] = value\n        return calendar\n    }\n\n    // Otherwise go through the queue of methods, and invoke the functions.\n    // Update this as the time unit, and set the final value as this item.\n    // * In the case of `enable`, keep the queue but set `disable` instead.\n    //   And in the case of `flip`, keep the queue but set `enable` instead.\n    calendarItem[ ( type == 'enable' ? 'disable' : type == 'flip' ? 'enable' : type ) ] = calendar.queue[ type ].split( ' ' ).map( function( method ) {\n        value = calendar[ method ]( type, value, options )\n        return value\n    }).pop()\n\n    // Check if we need to cascade through more updates.\n    if ( type == 'select' ) {\n        calendar.set( 'highlight', calendarItem.select, options )\n    }\n    else if ( type == 'highlight' ) {\n        calendar.set( 'view', calendarItem.highlight, options )\n    }\n    else if ( type.match( /^(flip|min|max|disable|enable)$/ ) ) {\n        if ( calendarItem.select && calendar.disabled( calendarItem.select ) ) {\n            calendar.set( 'select', calendarItem.select, options )\n        }\n        if ( calendarItem.highlight && calendar.disabled( calendarItem.highlight ) ) {\n            calendar.set( 'highlight', calendarItem.highlight, options )\n        }\n    }\n\n    return calendar\n} //DatePicker.prototype.set\n\n\n/**\n * Get a datepicker item object.\n */\nDatePicker.prototype.get = function( type ) {\n    return this.item[ type ]\n} //DatePicker.prototype.get\n\n\n/**\n * Create a picker date object.\n */\nDatePicker.prototype.create = function( type, value, options ) {\n\n    var isInfiniteValue,\n        calendar = this\n\n    // If there’s no value, use the type as the value.\n    value = value === undefined ? type : value\n\n\n    // If it’s infinity, update the value.\n    if ( value == -Infinity || value == Infinity ) {\n        isInfiniteValue = value\n    }\n\n    // If it’s an object, use the native date object.\n    else if ( $.isPlainObject( value ) && _.isInteger( value.pick ) ) {\n        value = value.obj\n    }\n\n    // If it’s an array, convert it into a date and make sure\n    // that it’s a valid date – otherwise default to today.\n    else if ( $.isArray( value ) ) {\n        value = new Date( value[ 0 ], value[ 1 ], value[ 2 ] )\n        value = _.isDate( value ) ? value : calendar.create().obj\n    }\n\n    // If it’s a number or date object, make a normalized date.\n    else if ( _.isInteger( value ) || _.isDate( value ) ) {\n        value = calendar.normalize( new Date( value ), options )\n    }\n\n    // If it’s a literal true or any other case, set it to now.\n    else /*if ( value === true )*/ {\n        value = calendar.now( type, value, options )\n    }\n\n    // Return the compiled object.\n    return {\n        year: isInfiniteValue || value.getFullYear(),\n        month: isInfiniteValue || value.getMonth(),\n        date: isInfiniteValue || value.getDate(),\n        day: isInfiniteValue || value.getDay(),\n        obj: isInfiniteValue || value,\n        pick: isInfiniteValue || value.getTime()\n    }\n} //DatePicker.prototype.create\n\n\n/**\n * Create a range limit object using an array, date object,\n * literal “true”, or integer relative to another time.\n */\nDatePicker.prototype.createRange = function( from, to ) {\n\n    var calendar = this,\n        createDate = function( date ) {\n            if ( date === true || $.isArray( date ) || _.isDate( date ) ) {\n                return calendar.create( date )\n            }\n            return date\n        }\n\n    // Create objects if possible.\n    if ( !_.isInteger( from ) ) {\n        from = createDate( from )\n    }\n    if ( !_.isInteger( to ) ) {\n        to = createDate( to )\n    }\n\n    // Create relative dates.\n    if ( _.isInteger( from ) && $.isPlainObject( to ) ) {\n        from = [ to.year, to.month, to.date + from ];\n    }\n    else if ( _.isInteger( to ) && $.isPlainObject( from ) ) {\n        to = [ from.year, from.month, from.date + to ];\n    }\n\n    return {\n        from: createDate( from ),\n        to: createDate( to )\n    }\n} //DatePicker.prototype.createRange\n\n\n/**\n * Check if a date unit falls within a date range object.\n */\nDatePicker.prototype.withinRange = function( range, dateUnit ) {\n    range = this.createRange(range.from, range.to)\n    return dateUnit.pick >= range.from.pick && dateUnit.pick <= range.to.pick\n}\n\n\n/**\n * Check if two date range objects overlap.\n */\nDatePicker.prototype.overlapRanges = function( one, two ) {\n\n    var calendar = this\n\n    // Convert the ranges into comparable dates.\n    one = calendar.createRange( one.from, one.to )\n    two = calendar.createRange( two.from, two.to )\n\n    return calendar.withinRange( one, two.from ) || calendar.withinRange( one, two.to ) ||\n        calendar.withinRange( two, one.from ) || calendar.withinRange( two, one.to )\n}\n\n\n/**\n * Get the date today.\n */\nDatePicker.prototype.now = function( type, value, options ) {\n    value = new Date()\n    if ( options && options.rel ) {\n        value.setDate( value.getDate() + options.rel )\n    }\n    return this.normalize( value, options )\n}\n\n\n/**\n * Navigate to next/prev month.\n */\nDatePicker.prototype.navigate = function( type, value, options ) {\n\n    var targetDateObject,\n        targetYear,\n        targetMonth,\n        targetDate,\n        isTargetArray = $.isArray( value ),\n        isTargetObject = $.isPlainObject( value ),\n        viewsetObject = this.item.view/*,\n        safety = 100*/\n\n\n    if ( isTargetArray || isTargetObject ) {\n\n        if ( isTargetObject ) {\n            targetYear = value.year\n            targetMonth = value.month\n            targetDate = value.date\n        }\n        else {\n            targetYear = +value[0]\n            targetMonth = +value[1]\n            targetDate = +value[2]\n        }\n\n        // If we’re navigating months but the view is in a different\n        // month, navigate to the view’s year and month.\n        if ( options && options.nav && viewsetObject && viewsetObject.month !== targetMonth ) {\n            targetYear = viewsetObject.year\n            targetMonth = viewsetObject.month\n        }\n\n        // Figure out the expected target year and month.\n        targetDateObject = new Date( targetYear, targetMonth + ( options && options.nav ? options.nav : 0 ), 1 )\n        targetYear = targetDateObject.getFullYear()\n        targetMonth = targetDateObject.getMonth()\n\n        // If the month we’re going to doesn’t have enough days,\n        // keep decreasing the date until we reach the month’s last date.\n        while ( /*safety &&*/ new Date( targetYear, targetMonth, targetDate ).getMonth() !== targetMonth ) {\n            targetDate -= 1\n            /*safety -= 1\n            if ( !safety ) {\n                throw 'Fell into an infinite loop while navigating to ' + new Date( targetYear, targetMonth, targetDate ) + '.'\n            }*/\n        }\n\n        value = [ targetYear, targetMonth, targetDate ]\n    }\n\n    return value\n} //DatePicker.prototype.navigate\n\n\n/**\n * Normalize a date by setting the hours to midnight.\n */\nDatePicker.prototype.normalize = function( value/*, options*/ ) {\n    value.setHours( 0, 0, 0, 0 )\n    return value\n}\n\n\n/**\n * Measure the range of dates.\n */\nDatePicker.prototype.measure = function( type, value/*, options*/ ) {\n\n    var calendar = this\n\n    // If it’s anything false-y, remove the limits.\n    if ( !value ) {\n        value = type == 'min' ? -Infinity : Infinity\n    }\n\n    // If it’s a string, parse it.\n    else if ( typeof value == 'string' ) {\n        value = calendar.parse( type, value )\n    }\n\n    // If it's an integer, get a date relative to today.\n    else if ( _.isInteger( value ) ) {\n        value = calendar.now( type, value, { rel: value } )\n    }\n\n    return value\n} ///DatePicker.prototype.measure\n\n\n/**\n * Create a viewset object based on navigation.\n */\nDatePicker.prototype.viewset = function( type, dateObject/*, options*/ ) {\n    return this.create([ dateObject.year, dateObject.month, 1 ])\n}\n\n\n/**\n * Validate a date as enabled and shift if needed.\n */\nDatePicker.prototype.validate = function( type, dateObject, options ) {\n\n    var calendar = this,\n\n        // Keep a reference to the original date.\n        originalDateObject = dateObject,\n\n        // Make sure we have an interval.\n        interval = options && options.interval ? options.interval : 1,\n\n        // Check if the calendar enabled dates are inverted.\n        isFlippedBase = calendar.item.enable === -1,\n\n        // Check if we have any enabled dates after/before now.\n        hasEnabledBeforeTarget, hasEnabledAfterTarget,\n\n        // The min & max limits.\n        minLimitObject = calendar.item.min,\n        maxLimitObject = calendar.item.max,\n\n        // Check if we’ve reached the limit during shifting.\n        reachedMin, reachedMax,\n\n        // Check if the calendar is inverted and at least one weekday is enabled.\n        hasEnabledWeekdays = isFlippedBase && calendar.item.disable.filter( function( value ) {\n\n            // If there’s a date, check where it is relative to the target.\n            if ( $.isArray( value ) ) {\n                var dateTime = calendar.create( value ).pick\n                if ( dateTime < dateObject.pick ) hasEnabledBeforeTarget = true\n                else if ( dateTime > dateObject.pick ) hasEnabledAfterTarget = true\n            }\n\n            // Return only integers for enabled weekdays.\n            return _.isInteger( value )\n        }).length/*,\n\n        safety = 100*/\n\n\n\n    // Cases to validate for:\n    // [1] Not inverted and date disabled.\n    // [2] Inverted and some dates enabled.\n    // [3] Not inverted and out of range.\n    //\n    // Cases to **not** validate for:\n    // • Navigating months.\n    // • Not inverted and date enabled.\n    // • Inverted and all dates disabled.\n    // • ..and anything else.\n    if ( !options || !options.nav ) if (\n        /* 1 */ ( !isFlippedBase && calendar.disabled( dateObject ) ) ||\n        /* 2 */ ( isFlippedBase && calendar.disabled( dateObject ) && ( hasEnabledWeekdays || hasEnabledBeforeTarget || hasEnabledAfterTarget ) ) ||\n        /* 3 */ ( !isFlippedBase && (dateObject.pick <= minLimitObject.pick || dateObject.pick >= maxLimitObject.pick) )\n    ) {\n\n\n        // When inverted, flip the direction if there aren’t any enabled weekdays\n        // and there are no enabled dates in the direction of the interval.\n        if ( isFlippedBase && !hasEnabledWeekdays && ( ( !hasEnabledAfterTarget && interval > 0 ) || ( !hasEnabledBeforeTarget && interval < 0 ) ) ) {\n            interval *= -1\n        }\n\n\n        // Keep looping until we reach an enabled date.\n        while ( /*safety &&*/ calendar.disabled( dateObject ) ) {\n\n            /*safety -= 1\n            if ( !safety ) {\n                throw 'Fell into an infinite loop while validating ' + dateObject.obj + '.'\n            }*/\n\n\n            // If we’ve looped into the next/prev month with a large interval, return to the original date and flatten the interval.\n            if ( Math.abs( interval ) > 1 && ( dateObject.month < originalDateObject.month || dateObject.month > originalDateObject.month ) ) {\n                dateObject = originalDateObject\n                interval = interval > 0 ? 1 : -1\n            }\n\n\n            // If we’ve reached the min/max limit, reverse the direction, flatten the interval and set it to the limit.\n            if ( dateObject.pick <= minLimitObject.pick ) {\n                reachedMin = true\n                interval = 1\n                dateObject = calendar.create([\n                    minLimitObject.year,\n                    minLimitObject.month,\n                    minLimitObject.date + (dateObject.pick === minLimitObject.pick ? 0 : -1)\n                ])\n            }\n            else if ( dateObject.pick >= maxLimitObject.pick ) {\n                reachedMax = true\n                interval = -1\n                dateObject = calendar.create([\n                    maxLimitObject.year,\n                    maxLimitObject.month,\n                    maxLimitObject.date + (dateObject.pick === maxLimitObject.pick ? 0 : 1)\n                ])\n            }\n\n\n            // If we’ve reached both limits, just break out of the loop.\n            if ( reachedMin && reachedMax ) {\n                break\n            }\n\n\n            // Finally, create the shifted date using the interval and keep looping.\n            dateObject = calendar.create([ dateObject.year, dateObject.month, dateObject.date + interval ])\n        }\n\n    } //endif\n\n\n    // Return the date object settled on.\n    return dateObject\n} //DatePicker.prototype.validate\n\n\n/**\n * Check if a date is disabled.\n */\nDatePicker.prototype.disabled = function( dateToVerify ) {\n\n    var\n        calendar = this,\n\n        // Filter through the disabled dates to check if this is one.\n        isDisabledMatch = calendar.item.disable.filter( function( dateToDisable ) {\n\n            // If the date is a number, match the weekday with 0index and `firstDay` check.\n            if ( _.isInteger( dateToDisable ) ) {\n                return dateToVerify.day === ( calendar.settings.firstDay ? dateToDisable : dateToDisable - 1 ) % 7\n            }\n\n            // If it’s an array or a native JS date, create and match the exact date.\n            if ( $.isArray( dateToDisable ) || _.isDate( dateToDisable ) ) {\n                return dateToVerify.pick === calendar.create( dateToDisable ).pick\n            }\n\n            // If it’s an object, match a date within the “from” and “to” range.\n            if ( $.isPlainObject( dateToDisable ) ) {\n                return calendar.withinRange( dateToDisable, dateToVerify )\n            }\n        })\n\n    // If this date matches a disabled date, confirm it’s not inverted.\n    isDisabledMatch = isDisabledMatch.length && !isDisabledMatch.filter(function( dateToDisable ) {\n        return $.isArray( dateToDisable ) && dateToDisable[3] == 'inverted' ||\n            $.isPlainObject( dateToDisable ) && dateToDisable.inverted\n    }).length\n\n    // Check the calendar “enabled” flag and respectively flip the\n    // disabled state. Then also check if it’s beyond the min/max limits.\n    return calendar.item.enable === -1 ? !isDisabledMatch : isDisabledMatch ||\n        dateToVerify.pick < calendar.item.min.pick ||\n        dateToVerify.pick > calendar.item.max.pick\n\n} //DatePicker.prototype.disabled\n\n\n/**\n * Parse a string into a usable type.\n */\nDatePicker.prototype.parse = function( type, value, options ) {\n\n    var calendar = this,\n        parsingObject = {}\n\n    // If it’s already parsed, we’re good.\n    if ( !value || typeof value != 'string' ) {\n        return value\n    }\n\n    // We need a `.format` to parse the value with.\n    if ( !( options && options.format ) ) {\n        options = options || {}\n        options.format = calendar.settings.format\n    }\n\n    // Convert the format into an array and then map through it.\n    calendar.formats.toArray( options.format ).map( function( label ) {\n\n        var\n            // Grab the formatting label.\n            formattingLabel = calendar.formats[ label ],\n\n            // The format length is from the formatting label function or the\n            // label length without the escaping exclamation (!) mark.\n            formatLength = formattingLabel ? _.trigger( formattingLabel, calendar, [ value, parsingObject ] ) : label.replace( /^!/, '' ).length\n\n        // If there's a format label, split the value up to the format length.\n        // Then add it to the parsing object with appropriate label.\n        if ( formattingLabel ) {\n            parsingObject[ label ] = value.substr( 0, formatLength )\n        }\n\n        // Update the value as the substring from format length to end.\n        value = value.substr( formatLength )\n    })\n\n    // Compensate for month 0index.\n    return [\n        parsingObject.yyyy || parsingObject.yy,\n        +( parsingObject.mm || parsingObject.m ) - 1,\n        parsingObject.dd || parsingObject.d\n    ]\n} //DatePicker.prototype.parse\n\n\n/**\n * Various formats to display the object in.\n */\nDatePicker.prototype.formats = (function() {\n\n    // Return the length of the first word in a collection.\n    function getWordLengthFromCollection( string, collection, dateObject ) {\n\n        // Grab the first word from the string.\n        var word = string.match( /\\w+/ )[ 0 ]\n\n        // If there's no month index, add it to the date object\n        if ( !dateObject.mm && !dateObject.m ) {\n            dateObject.m = collection.indexOf( word ) + 1\n        }\n\n        // Return the length of the word.\n        return word.length\n    }\n\n    // Get the length of the first word in a string.\n    function getFirstWordLength( string ) {\n        return string.match( /\\w+/ )[ 0 ].length\n    }\n\n    return {\n\n        d: function( string, dateObject ) {\n\n            // If there's string, then get the digits length.\n            // Otherwise return the selected date.\n            return string ? _.digits( string ) : dateObject.date\n        },\n        dd: function( string, dateObject ) {\n\n            // If there's a string, then the length is always 2.\n            // Otherwise return the selected date with a leading zero.\n            return string ? 2 : _.lead( dateObject.date )\n        },\n        ddd: function( string, dateObject ) {\n\n            // If there's a string, then get the length of the first word.\n            // Otherwise return the short selected weekday.\n            return string ? getFirstWordLength( string ) : this.settings.weekdaysShort[ dateObject.day ]\n        },\n        dddd: function( string, dateObject ) {\n\n            // If there's a string, then get the length of the first word.\n            // Otherwise return the full selected weekday.\n            return string ? getFirstWordLength( string ) : this.settings.weekdaysFull[ dateObject.day ]\n        },\n        m: function( string, dateObject ) {\n\n            // If there's a string, then get the length of the digits\n            // Otherwise return the selected month with 0index compensation.\n            return string ? _.digits( string ) : dateObject.month + 1\n        },\n        mm: function( string, dateObject ) {\n\n            // If there's a string, then the length is always 2.\n            // Otherwise return the selected month with 0index and leading zero.\n            return string ? 2 : _.lead( dateObject.month + 1 )\n        },\n        mmm: function( string, dateObject ) {\n\n            var collection = this.settings.monthsShort\n\n            // If there's a string, get length of the relevant month from the short\n            // months collection. Otherwise return the selected month from that collection.\n            return string ? getWordLengthFromCollection( string, collection, dateObject ) : collection[ dateObject.month ]\n        },\n        mmmm: function( string, dateObject ) {\n\n            var collection = this.settings.monthsFull\n\n            // If there's a string, get length of the relevant month from the full\n            // months collection. Otherwise return the selected month from that collection.\n            return string ? getWordLengthFromCollection( string, collection, dateObject ) : collection[ dateObject.month ]\n        },\n        yy: function( string, dateObject ) {\n\n            // If there's a string, then the length is always 2.\n            // Otherwise return the selected year by slicing out the first 2 digits.\n            return string ? 2 : ( '' + dateObject.year ).slice( 2 )\n        },\n        yyyy: function( string, dateObject ) {\n\n            // If there's a string, then the length is always 4.\n            // Otherwise return the selected year.\n            return string ? 4 : dateObject.year\n        },\n\n        // Create an array by splitting the formatting string passed.\n        toArray: function( formatString ) { return formatString.split( /(d{1,4}|m{1,4}|y{4}|yy|!.)/g ) },\n\n        // Format an object into a string using the formatting options.\n        toString: function ( formatString, itemObject ) {\n            var calendar = this\n            return calendar.formats.toArray( formatString ).map( function( label ) {\n                return _.trigger( calendar.formats[ label ], calendar, [ 0, itemObject ] ) || label.replace( /^!/, '' )\n            }).join( '' )\n        }\n    }\n})() //DatePicker.prototype.formats\n\n\n\n\n/**\n * Check if two date units are the exact.\n */\nDatePicker.prototype.isDateExact = function( one, two ) {\n\n    var calendar = this\n\n    // When we’re working with weekdays, do a direct comparison.\n    if (\n        ( _.isInteger( one ) && _.isInteger( two ) ) ||\n        ( typeof one == 'boolean' && typeof two == 'boolean' )\n     ) {\n        return one === two\n    }\n\n    // When we’re working with date representations, compare the “pick” value.\n    if (\n        ( _.isDate( one ) || $.isArray( one ) ) &&\n        ( _.isDate( two ) || $.isArray( two ) )\n    ) {\n        return calendar.create( one ).pick === calendar.create( two ).pick\n    }\n\n    // When we’re working with range objects, compare the “from” and “to”.\n    if ( $.isPlainObject( one ) && $.isPlainObject( two ) ) {\n        return calendar.isDateExact( one.from, two.from ) && calendar.isDateExact( one.to, two.to )\n    }\n\n    return false\n}\n\n\n/**\n * Check if two date units overlap.\n */\nDatePicker.prototype.isDateOverlap = function( one, two ) {\n\n    var calendar = this,\n        firstDay = calendar.settings.firstDay ? 1 : 0\n\n    // When we’re working with a weekday index, compare the days.\n    if ( _.isInteger( one ) && ( _.isDate( two ) || $.isArray( two ) ) ) {\n        one = one % 7 + firstDay\n        return one === calendar.create( two ).day + 1\n    }\n    if ( _.isInteger( two ) && ( _.isDate( one ) || $.isArray( one ) ) ) {\n        two = two % 7 + firstDay\n        return two === calendar.create( one ).day + 1\n    }\n\n    // When we’re working with range objects, check if the ranges overlap.\n    if ( $.isPlainObject( one ) && $.isPlainObject( two ) ) {\n        return calendar.overlapRanges( one, two )\n    }\n\n    return false\n}\n\n\n/**\n * Flip the “enabled” state.\n */\nDatePicker.prototype.flipEnable = function(val) {\n    var itemObject = this.item\n    itemObject.enable = val || (itemObject.enable == -1 ? 1 : -1)\n}\n\n\n/**\n * Mark a collection of dates as “disabled”.\n */\nDatePicker.prototype.deactivate = function( type, datesToDisable ) {\n\n    var calendar = this,\n        disabledItems = calendar.item.disable.slice(0)\n\n\n    // If we’re flipping, that’s all we need to do.\n    if ( datesToDisable == 'flip' ) {\n        calendar.flipEnable()\n    }\n\n    else if ( datesToDisable === false ) {\n        calendar.flipEnable(1)\n        disabledItems = []\n    }\n\n    else if ( datesToDisable === true ) {\n        calendar.flipEnable(-1)\n        disabledItems = []\n    }\n\n    // Otherwise go through the dates to disable.\n    else {\n\n        datesToDisable.map(function( unitToDisable ) {\n\n            var matchFound\n\n            // When we have disabled items, check for matches.\n            // If something is matched, immediately break out.\n            for ( var index = 0; index < disabledItems.length; index += 1 ) {\n                if ( calendar.isDateExact( unitToDisable, disabledItems[index] ) ) {\n                    matchFound = true\n                    break\n                }\n            }\n\n            // If nothing was found, add the validated unit to the collection.\n            if ( !matchFound ) {\n                if (\n                    _.isInteger( unitToDisable ) ||\n                    _.isDate( unitToDisable ) ||\n                    $.isArray( unitToDisable ) ||\n                    ( $.isPlainObject( unitToDisable ) && unitToDisable.from && unitToDisable.to )\n                ) {\n                    disabledItems.push( unitToDisable )\n                }\n            }\n        })\n    }\n\n    // Return the updated collection.\n    return disabledItems\n} //DatePicker.prototype.deactivate\n\n\n/**\n * Mark a collection of dates as “enabled”.\n */\nDatePicker.prototype.activate = function( type, datesToEnable ) {\n\n    var calendar = this,\n        disabledItems = calendar.item.disable,\n        disabledItemsCount = disabledItems.length\n\n    // If we’re flipping, that’s all we need to do.\n    if ( datesToEnable == 'flip' ) {\n        calendar.flipEnable()\n    }\n\n    else if ( datesToEnable === true ) {\n        calendar.flipEnable(1)\n        disabledItems = []\n    }\n\n    else if ( datesToEnable === false ) {\n        calendar.flipEnable(-1)\n        disabledItems = []\n    }\n\n    // Otherwise go through the disabled dates.\n    else {\n\n        datesToEnable.map(function( unitToEnable ) {\n\n            var matchFound,\n                disabledUnit,\n                index,\n                isExactRange\n\n            // Go through the disabled items and try to find a match.\n            for ( index = 0; index < disabledItemsCount; index += 1 ) {\n\n                disabledUnit = disabledItems[index]\n\n                // When an exact match is found, remove it from the collection.\n                if ( calendar.isDateExact( disabledUnit, unitToEnable ) ) {\n                    matchFound = disabledItems[index] = null\n                    isExactRange = true\n                    break\n                }\n\n                // When an overlapped match is found, add the “inverted” state to it.\n                else if ( calendar.isDateOverlap( disabledUnit, unitToEnable ) ) {\n                    if ( $.isPlainObject( unitToEnable ) ) {\n                        unitToEnable.inverted = true\n                        matchFound = unitToEnable\n                    }\n                    else if ( $.isArray( unitToEnable ) ) {\n                        matchFound = unitToEnable\n                        if ( !matchFound[3] ) matchFound.push( 'inverted' )\n                    }\n                    else if ( _.isDate( unitToEnable ) ) {\n                        matchFound = [ unitToEnable.getFullYear(), unitToEnable.getMonth(), unitToEnable.getDate(), 'inverted' ]\n                    }\n                    break\n                }\n            }\n\n            // If a match was found, remove a previous duplicate entry.\n            if ( matchFound ) for ( index = 0; index < disabledItemsCount; index += 1 ) {\n                if ( calendar.isDateExact( disabledItems[index], unitToEnable ) ) {\n                    disabledItems[index] = null\n                    break\n                }\n            }\n\n            // In the event that we’re dealing with an exact range of dates,\n            // make sure there are no “inverted” dates because of it.\n            if ( isExactRange ) for ( index = 0; index < disabledItemsCount; index += 1 ) {\n                if ( calendar.isDateOverlap( disabledItems[index], unitToEnable ) ) {\n                    disabledItems[index] = null\n                    break\n                }\n            }\n\n            // If something is still matched, add it into the collection.\n            if ( matchFound ) {\n                disabledItems.push( matchFound )\n            }\n        })\n    }\n\n    // Return the updated collection.\n    return disabledItems.filter(function( val ) { return val != null })\n} //DatePicker.prototype.activate\n\n\n/**\n * Create a string for the nodes in the picker.\n */\nDatePicker.prototype.nodes = function( isOpen ) {\n\n    var\n        calendar = this,\n        settings = calendar.settings,\n        calendarItem = calendar.item,\n        nowObject = calendarItem.now,\n        selectedObject = calendarItem.select,\n        highlightedObject = calendarItem.highlight,\n        viewsetObject = calendarItem.view,\n        disabledCollection = calendarItem.disable,\n        minLimitObject = calendarItem.min,\n        maxLimitObject = calendarItem.max,\n\n\n        // Create the calendar table head using a copy of weekday labels collection.\n        // * We do a copy so we don't mutate the original array.\n        tableHead = (function( collection, fullCollection ) {\n\n            // If the first day should be Monday, move Sunday to the end.\n            if ( settings.firstDay ) {\n                collection.push( collection.shift() )\n                fullCollection.push( fullCollection.shift() )\n            }\n\n            // Create and return the table head group.\n            return _.node(\n                'thead',\n                _.node(\n                    'tr',\n                    _.group({\n                        min: 0,\n                        max: DAYS_IN_WEEK - 1,\n                        i: 1,\n                        node: 'th',\n                        item: function( counter ) {\n                            return [\n                                collection[ counter ],\n                                settings.klass.weekdays,\n                                'scope=col title=\"' + fullCollection[ counter ] + '\"'\n                            ]\n                        }\n                    })\n                )\n            ) //endreturn\n\n        // Materialize modified\n        })( ( settings.showWeekdaysFull ? settings.weekdaysFull : settings.weekdaysLetter ).slice( 0 ), settings.weekdaysFull.slice( 0 ) ), //tableHead\n\n\n        // Create the nav for next/prev month.\n        createMonthNav = function( next ) {\n\n            // Otherwise, return the created month tag.\n            return _.node(\n                'div',\n                ' ',\n                settings.klass[ 'nav' + ( next ? 'Next' : 'Prev' ) ] + (\n\n                    // If the focused month is outside the range, disabled the button.\n                    ( next && viewsetObject.year >= maxLimitObject.year && viewsetObject.month >= maxLimitObject.month ) ||\n                    ( !next && viewsetObject.year <= minLimitObject.year && viewsetObject.month <= minLimitObject.month ) ?\n                    ' ' + settings.klass.navDisabled : ''\n                ),\n                'data-nav=' + ( next || -1 ) + ' ' +\n                _.ariaAttr({\n                    role: 'button',\n                    controls: calendar.$node[0].id + '_table'\n                }) + ' ' +\n                'title=\"' + (next ? settings.labelMonthNext : settings.labelMonthPrev ) + '\"'\n            ) //endreturn\n        }, //createMonthNav\n\n\n        // Create the month label.\n        //Materialize modified\n        createMonthLabel = function(override) {\n\n            var monthsCollection = settings.showMonthsShort ? settings.monthsShort : settings.monthsFull\n\n             // Materialize modified\n            if (override == \"short_months\") {\n              monthsCollection = settings.monthsShort;\n            }\n\n            // If there are months to select, add a dropdown menu.\n            if ( settings.selectMonths  && override == undefined) {\n\n                return _.node( 'select',\n                    _.group({\n                        min: 0,\n                        max: 11,\n                        i: 1,\n                        node: 'option',\n                        item: function( loopedMonth ) {\n\n                            return [\n\n                                // The looped month and no classes.\n                                monthsCollection[ loopedMonth ], 0,\n\n                                // Set the value and selected index.\n                                'value=' + loopedMonth +\n                                ( viewsetObject.month == loopedMonth ? ' selected' : '' ) +\n                                (\n                                    (\n                                        ( viewsetObject.year == minLimitObject.year && loopedMonth < minLimitObject.month ) ||\n                                        ( viewsetObject.year == maxLimitObject.year && loopedMonth > maxLimitObject.month )\n                                    ) ?\n                                    ' disabled' : ''\n                                )\n                            ]\n                        }\n                    }),\n                    settings.klass.selectMonth + ' browser-default',\n                    ( isOpen ? '' : 'disabled' ) + ' ' +\n                    _.ariaAttr({ controls: calendar.$node[0].id + '_table' }) + ' ' +\n                    'title=\"' + settings.labelMonthSelect + '\"'\n                )\n            }\n\n            // Materialize modified\n            if (override == \"short_months\")\n                if (selectedObject != null)\n                return _.node( 'div', monthsCollection[ selectedObject.month ] );\n                else return _.node( 'div', monthsCollection[ viewsetObject.month ] );\n\n            // If there's a need for a month selector\n            return _.node( 'div', monthsCollection[ viewsetObject.month ], settings.klass.month )\n        }, //createMonthLabel\n\n\n        // Create the year label.\n        // Materialize modified\n        createYearLabel = function(override) {\n\n            var focusedYear = viewsetObject.year,\n\n            // If years selector is set to a literal \"true\", set it to 5. Otherwise\n            // divide in half to get half before and half after focused year.\n            numberYears = settings.selectYears === true ? 5 : ~~( settings.selectYears / 2 )\n\n            // If there are years to select, add a dropdown menu.\n            if ( numberYears ) {\n\n                var\n                    minYear = minLimitObject.year,\n                    maxYear = maxLimitObject.year,\n                    lowestYear = focusedYear - numberYears,\n                    highestYear = focusedYear + numberYears\n\n                // If the min year is greater than the lowest year, increase the highest year\n                // by the difference and set the lowest year to the min year.\n                if ( minYear > lowestYear ) {\n                    highestYear += minYear - lowestYear\n                    lowestYear = minYear\n                }\n\n                // If the max year is less than the highest year, decrease the lowest year\n                // by the lower of the two: available and needed years. Then set the\n                // highest year to the max year.\n                if ( maxYear < highestYear ) {\n\n                    var availableYears = lowestYear - minYear,\n                        neededYears = highestYear - maxYear\n\n                    lowestYear -= availableYears > neededYears ? neededYears : availableYears\n                    highestYear = maxYear\n                }\n\n                if ( settings.selectYears  && override == undefined ) {\n                    return _.node( 'select',\n                        _.group({\n                            min: lowestYear,\n                            max: highestYear,\n                            i: 1,\n                            node: 'option',\n                            item: function( loopedYear ) {\n                                return [\n\n                                    // The looped year and no classes.\n                                    loopedYear, 0,\n\n                                    // Set the value and selected index.\n                                    'value=' + loopedYear + ( focusedYear == loopedYear ? ' selected' : '' )\n                                ]\n                            }\n                        }),\n                        settings.klass.selectYear + ' browser-default',\n                        ( isOpen ? '' : 'disabled' ) + ' ' + _.ariaAttr({ controls: calendar.$node[0].id + '_table' }) + ' ' +\n                        'title=\"' + settings.labelYearSelect + '\"'\n                    )\n                }\n            }\n\n            // Materialize modified\n            if (override == \"raw\")\n                return _.node( 'div', focusedYear )\n\n            // Otherwise just return the year focused\n            return _.node( 'div', focusedYear, settings.klass.year )\n        } //createYearLabel\n\n\n        // Materialize modified\n        createDayLabel = function() {\n                if (selectedObject != null)\n                    return _.node( 'div', selectedObject.date)\n                else return _.node( 'div', nowObject.date)\n            }\n        createWeekdayLabel = function() {\n            var display_day;\n\n            if (selectedObject != null)\n                display_day = selectedObject.day;\n            else\n                display_day = nowObject.day;\n            var weekday = settings.weekdaysFull[ display_day ]\n            return weekday\n        }\n\n\n    // Create and return the entire calendar.\nreturn _.node(\n        // Date presentation View\n        'div',\n            _.node(\n                'div',\n                createWeekdayLabel(),\n                \"picker__weekday-display\"\n            )+\n            _.node(\n                // Div for short Month\n                'div',\n                createMonthLabel(\"short_months\"),\n                settings.klass.month_display\n            )+\n            _.node(\n                // Div for Day\n                'div',\n                createDayLabel() ,\n                settings.klass.day_display\n            )+\n            _.node(\n                // Div for Year\n                'div',\n                createYearLabel(\"raw\") ,\n                settings.klass.year_display\n            ),\n        settings.klass.date_display\n    )+\n    // Calendar container\n    _.node('div',\n        _.node('div',\n        ( settings.selectYears ?  createMonthLabel() + createYearLabel() : createMonthLabel() + createYearLabel() ) +\n        createMonthNav() + createMonthNav( 1 ),\n        settings.klass.header\n    ) + _.node(\n        'table',\n        tableHead +\n        _.node(\n            'tbody',\n            _.group({\n                min: 0,\n                max: WEEKS_IN_CALENDAR - 1,\n                i: 1,\n                node: 'tr',\n                item: function( rowCounter ) {\n\n                    // If Monday is the first day and the month starts on Sunday, shift the date back a week.\n                    var shiftDateBy = settings.firstDay && calendar.create([ viewsetObject.year, viewsetObject.month, 1 ]).day === 0 ? -7 : 0\n\n                    return [\n                        _.group({\n                            min: DAYS_IN_WEEK * rowCounter - viewsetObject.day + shiftDateBy + 1, // Add 1 for weekday 0index\n                            max: function() {\n                                return this.min + DAYS_IN_WEEK - 1\n                            },\n                            i: 1,\n                            node: 'td',\n                            item: function( targetDate ) {\n\n                                // Convert the time date from a relative date to a target date.\n                                targetDate = calendar.create([ viewsetObject.year, viewsetObject.month, targetDate + ( settings.firstDay ? 1 : 0 ) ])\n\n                                var isSelected = selectedObject && selectedObject.pick == targetDate.pick,\n                                    isHighlighted = highlightedObject && highlightedObject.pick == targetDate.pick,\n                                    isDisabled = disabledCollection && calendar.disabled( targetDate ) || targetDate.pick < minLimitObject.pick || targetDate.pick > maxLimitObject.pick,\n                                    formattedDate = _.trigger( calendar.formats.toString, calendar, [ settings.format, targetDate ] )\n\n                                return [\n                                    _.node(\n                                        'div',\n                                        targetDate.date,\n                                        (function( klasses ) {\n\n                                            // Add the `infocus` or `outfocus` classes based on month in view.\n                                            klasses.push( viewsetObject.month == targetDate.month ? settings.klass.infocus : settings.klass.outfocus )\n\n                                            // Add the `today` class if needed.\n                                            if ( nowObject.pick == targetDate.pick ) {\n                                                klasses.push( settings.klass.now )\n                                            }\n\n                                            // Add the `selected` class if something's selected and the time matches.\n                                            if ( isSelected ) {\n                                                klasses.push( settings.klass.selected )\n                                            }\n\n                                            // Add the `highlighted` class if something's highlighted and the time matches.\n                                            if ( isHighlighted ) {\n                                                klasses.push( settings.klass.highlighted )\n                                            }\n\n                                            // Add the `disabled` class if something's disabled and the object matches.\n                                            if ( isDisabled ) {\n                                                klasses.push( settings.klass.disabled )\n                                            }\n\n                                            return klasses.join( ' ' )\n                                        })([ settings.klass.day ]),\n                                        'data-pick=' + targetDate.pick + ' ' + _.ariaAttr({\n                                            role: 'gridcell',\n                                            label: formattedDate,\n                                            selected: isSelected && calendar.$node.val() === formattedDate ? true : null,\n                                            activedescendant: isHighlighted ? true : null,\n                                            disabled: isDisabled ? true : null\n                                        })\n                                    ),\n                                    '',\n                                    _.ariaAttr({ role: 'presentation' })\n                                ] //endreturn\n                            }\n                        })\n                    ] //endreturn\n                }\n            })\n        ),\n        settings.klass.table,\n        'id=\"' + calendar.$node[0].id + '_table' + '\" ' + _.ariaAttr({\n            role: 'grid',\n            controls: calendar.$node[0].id,\n            readonly: true\n        })\n    )\n    , settings.klass.calendar_container) // end calendar\n\n     +\n\n    // * For Firefox forms to submit, make sure to set the buttons’ `type` attributes as “button”.\n    _.node(\n        'div',\n        _.node( 'button', settings.today, \"btn-flat picker__today\",\n            'type=button data-pick=' + nowObject.pick +\n            ( isOpen && !calendar.disabled(nowObject) ? '' : ' disabled' ) + ' ' +\n            _.ariaAttr({ controls: calendar.$node[0].id }) ) +\n        _.node( 'button', settings.clear, \"btn-flat picker__clear\",\n            'type=button data-clear=1' +\n            ( isOpen ? '' : ' disabled' ) + ' ' +\n            _.ariaAttr({ controls: calendar.$node[0].id }) ) +\n        _.node('button', settings.close, \"btn-flat picker__close\",\n            'type=button data-close=true ' +\n            ( isOpen ? '' : ' disabled' ) + ' ' +\n            _.ariaAttr({ controls: calendar.$node[0].id }) ),\n        settings.klass.footer\n    ) //endreturn\n} //DatePicker.prototype.nodes\n\n\n\n\n/**\n * The date picker defaults.\n */\nDatePicker.defaults = (function( prefix ) {\n\n    return {\n\n        // The title label to use for the month nav buttons\n        labelMonthNext: 'Next month',\n        labelMonthPrev: 'Previous month',\n\n        // The title label to use for the dropdown selectors\n        labelMonthSelect: 'Select a month',\n        labelYearSelect: 'Select a year',\n\n        // Months and weekdays\n        monthsFull: [ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' ],\n        monthsShort: [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ],\n        weekdaysFull: [ 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday' ],\n        weekdaysShort: [ 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat' ],\n\n        // Materialize modified\n        weekdaysLetter: [ 'S', 'M', 'T', 'W', 'T', 'F', 'S' ],\n\n        // Today and clear\n        today: 'Today',\n        clear: 'Clear',\n        close: 'Close',\n\n        // The format to show on the `input` element\n        format: 'd mmmm, yyyy',\n\n        // Classes\n        klass: {\n\n            table: prefix + 'table',\n\n            header: prefix + 'header',\n\n\n            // Materialize Added klasses\n            date_display: prefix + 'date-display',\n            day_display: prefix + 'day-display',\n            month_display: prefix + 'month-display',\n            year_display: prefix + 'year-display',\n            calendar_container: prefix + 'calendar-container',\n            // end\n\n\n\n            navPrev: prefix + 'nav--prev',\n            navNext: prefix + 'nav--next',\n            navDisabled: prefix + 'nav--disabled',\n\n            month: prefix + 'month',\n            year: prefix + 'year',\n\n            selectMonth: prefix + 'select--month',\n            selectYear: prefix + 'select--year',\n\n            weekdays: prefix + 'weekday',\n\n            day: prefix + 'day',\n            disabled: prefix + 'day--disabled',\n            selected: prefix + 'day--selected',\n            highlighted: prefix + 'day--highlighted',\n            now: prefix + 'day--today',\n            infocus: prefix + 'day--infocus',\n            outfocus: prefix + 'day--outfocus',\n\n            footer: prefix + 'footer',\n\n            buttonClear: prefix + 'button--clear',\n            buttonToday: prefix + 'button--today',\n            buttonClose: prefix + 'button--close'\n        }\n    }\n})( Picker.klasses().picker + '__' )\n\n\n\n\n\n/**\n * Extend the picker to add the date picker.\n */\nPicker.extend( 'pickadate', DatePicker )\n\n\n}));\n\n\n;(function ($) {\n\n  $.fn.characterCounter = function(){\n    return this.each(function(){\n\n      var itHasLengthAttribute = $(this).attr('length') !== undefined;\n\n      if(itHasLengthAttribute){\n        $(this).on('input', updateCounter);\n        $(this).on('focus', updateCounter);\n        $(this).on('blur', removeCounterElement);\n\n        addCounterElement($(this));\n      }\n\n    });\n  };\n\n  function updateCounter(){\n    var maxLength     = +$(this).attr('length'),\n    actualLength      = +$(this).val().length,\n    isValidLength     = actualLength <= maxLength;\n\n    $(this).parent().find('span[class=\"character-counter\"]')\n                    .html( actualLength + '/' + maxLength);\n\n    addInputStyle(isValidLength, $(this));\n  }\n\n  function addCounterElement($input){\n    var $counterElement = $('<span/>')\n                        .addClass('character-counter')\n                        .css('float','right')\n                        .css('font-size','12px')\n                        .css('height', 1);\n\n    $input.parent().append($counterElement);\n  }\n\n  function removeCounterElement(){\n    $(this).parent().find('span[class=\"character-counter\"]').html('');\n  }\n\n  function addInputStyle(isValidLength, $input){\n    var inputHasInvalidClass = $input.hasClass('invalid');\n    if (isValidLength && inputHasInvalidClass) {\n      $input.removeClass('invalid');\n    }\n    else if(!isValidLength && !inputHasInvalidClass){\n      $input.removeClass('valid');\n      $input.addClass('invalid');\n    }\n  }\n\n  $(document).ready(function(){\n    $('input, textarea').characterCounter();\n  });\n\n}( jQuery ));\n;(function ($) {\n\n  var methods = {\n\n    init : function(options) {\n      var defaults = {\n        time_constant: 200, // ms\n        dist: -100, // zoom scale TODO: make this more intuitive as an option\n        shift: 0, // spacing for center image\n        padding: 0, // Padding between non center items\n        full_width: false // Change to full width styles\n      };\n      options = $.extend(defaults, options);\n\n      return this.each(function() {\n\n        var images, offset, center, pressed, dim, count,\n            reference, referenceY, amplitude, target, velocity,\n            xform, frame, timestamp, ticker, dragged, vertical_dragged;\n\n        // Initialize\n        var view = $(this);\n        // Don't double initialize.\n        if (view.hasClass('initialized')) {\n          return true;\n        }\n\n        // Options\n        if (options.full_width) {\n          options.dist = 0;\n          imageHeight = view.find('.carousel-item img').first().load(function(){\n            view.css('height', $(this).height());\n          });\n        }\n\n        view.addClass('initialized');\n        pressed = false;\n        offset = target = 0;\n        images = [];\n        item_width = view.find('.carousel-item').first().innerWidth();\n        dim = item_width * 2 + options.padding;\n\n        view.find('.carousel-item').each(function () {\n          images.push($(this)[0]);\n        });\n\n        count = images.length;\n\n\n        function setupEvents() {\n          if (typeof window.ontouchstart !== 'undefined') {\n            view[0].addEventListener('touchstart', tap);\n            view[0].addEventListener('touchmove', drag);\n            view[0].addEventListener('touchend', release);\n          }\n          view[0].addEventListener('mousedown', tap);\n          view[0].addEventListener('mousemove', drag);\n          view[0].addEventListener('mouseup', release);\n          view[0].addEventListener('click', click);\n        }\n\n        function xpos(e) {\n          // touch event\n          if (e.targetTouches && (e.targetTouches.length >= 1)) {\n            return e.targetTouches[0].clientX;\n          }\n\n          // mouse event\n          return e.clientX;\n        }\n\n        function ypos(e) {\n          // touch event\n          if (e.targetTouches && (e.targetTouches.length >= 1)) {\n            return e.targetTouches[0].clientY;\n          }\n\n          // mouse event\n          return e.clientY;\n        }\n\n        function wrap(x) {\n          return (x >= count) ? (x % count) : (x < 0) ? wrap(count + (x % count)) : x;\n        }\n\n        function scroll(x) {\n          var i, half, delta, dir, tween, el, alignment, xTranslation;\n\n          offset = (typeof x === 'number') ? x : offset;\n          center = Math.floor((offset + dim / 2) / dim);\n          delta = offset - center * dim;\n          dir = (delta < 0) ? 1 : -1;\n          tween = -dir * delta * 2 / dim;\n\n          if (!options.full_width) {\n            alignment = 'translateX(' + (view[0].clientWidth - item_width) / 2 + 'px) ';\n            alignment += 'translateY(' + (view[0].clientHeight - item_width) / 2 + 'px)';\n          } else {\n            alignment = 'translateX(0)';\n          }\n\n          // center\n          el = images[wrap(center)];\n          el.style[xform] = alignment +\n            ' translateX(' + (-delta / 2) + 'px)' +\n            ' translateX(' + (dir * options.shift * tween * i) + 'px)' +\n            ' translateZ(' + (options.dist * tween) + 'px)';\n          el.style.zIndex = 0;\n          if (options.full_width) { tweenedOpacity = 1; }\n          else { tweenedOpacity = 1 - 0.2 * tween; }\n          el.style.opacity = tweenedOpacity;\n          half = count >> 1;\n\n          for (i = 1; i <= half; ++i) {\n            // right side\n            if (options.full_width) {\n              zTranslation = options.dist;\n              tweenedOpacity = (i === half && delta < 0) ? 1 - tween : 1;\n            } else {\n              zTranslation = options.dist * (i * 2 + tween * dir);\n              tweenedOpacity = 1 - 0.2 * (i * 2 + tween * dir);\n            }\n            el = images[wrap(center + i)];\n            el.style[xform] = alignment +\n              ' translateX(' + (options.shift + (dim * i - delta) / 2) + 'px)' +\n              ' translateZ(' + zTranslation + 'px)';\n            el.style.zIndex = -i;\n            el.style.opacity = tweenedOpacity;\n\n\n            // left side\n            if (options.full_width) {\n              zTranslation = options.dist;\n              tweenedOpacity = (i === half && delta > 0) ? 1 - tween : 1;\n            } else {\n              zTranslation = options.dist * (i * 2 - tween * dir);\n              tweenedOpacity = 1 - 0.2 * (i * 2 - tween * dir);\n            }\n            el = images[wrap(center - i)];\n            el.style[xform] = alignment +\n              ' translateX(' + (-options.shift + (-dim * i - delta) / 2) + 'px)' +\n              ' translateZ(' + zTranslation + 'px)';\n            el.style.zIndex = -i;\n            el.style.opacity = tweenedOpacity;\n          }\n\n          // center\n          el = images[wrap(center)];\n          el.style[xform] = alignment +\n            ' translateX(' + (-delta / 2) + 'px)' +\n            ' translateX(' + (dir * options.shift * tween) + 'px)' +\n            ' translateZ(' + (options.dist * tween) + 'px)';\n          el.style.zIndex = 0;\n          if (options.full_width) { tweenedOpacity = 1; }\n          else { tweenedOpacity = 1 - 0.2 * tween; }\n          el.style.opacity = tweenedOpacity;\n        }\n\n        function track() {\n          var now, elapsed, delta, v;\n\n          now = Date.now();\n          elapsed = now - timestamp;\n          timestamp = now;\n          delta = offset - frame;\n          frame = offset;\n\n          v = 1000 * delta / (1 + elapsed);\n          velocity = 0.8 * v + 0.2 * velocity;\n        }\n\n        function autoScroll() {\n          var elapsed, delta;\n\n          if (amplitude) {\n            elapsed = Date.now() - timestamp;\n            delta = amplitude * Math.exp(-elapsed / options.time_constant);\n            if (delta > 2 || delta < -2) {\n                scroll(target - delta);\n                requestAnimationFrame(autoScroll);\n            } else {\n                scroll(target);\n            }\n          }\n        }\n\n        function click(e) {\n          // Disable clicks if carousel was dragged.\n          if (dragged) {\n            e.preventDefault();\n            e.stopPropagation();\n            return false;\n\n          } else if (!options.full_width) {\n            var clickedIndex = $(e.target).closest('.carousel-item').index();\n            var diff = (center % count) - clickedIndex;\n\n            // Account for wraparound.\n            if (diff < 0) {\n              if (Math.abs(diff + count) < Math.abs(diff)) { diff += count; }\n\n            } else if (diff > 0) {\n              if (Math.abs(diff - count) < diff) { diff -= count; }\n            }\n\n            // Call prev or next accordingly.\n            if (diff < 0) {\n              $(this).trigger('carouselNext', [Math.abs(diff)]);\n\n            } else if (diff > 0) {\n              $(this).trigger('carouselPrev', [diff]);\n            }\n          }\n        }\n\n        function tap(e) {\n          pressed = true;\n          dragged = false;\n          vertical_dragged = false;\n          reference = xpos(e);\n          referenceY = ypos(e);\n\n          velocity = amplitude = 0;\n          frame = offset;\n          timestamp = Date.now();\n          clearInterval(ticker);\n          ticker = setInterval(track, 100);\n\n        }\n\n        function drag(e) {\n          var x, delta, deltaY;\n          if (pressed) {\n            x = xpos(e);\n            y = ypos(e);\n            delta = reference - x;\n            deltaY = Math.abs(referenceY - y);\n            if (deltaY < 30 && !vertical_dragged) {\n              // If vertical scrolling don't allow dragging.\n              if (delta > 2 || delta < -2) {\n                dragged = true;\n                reference = x;\n                scroll(offset + delta);\n              }\n\n            } else if (dragged) {\n              // If dragging don't allow vertical scroll.\n              e.preventDefault();\n              e.stopPropagation();\n              return false;\n\n            } else {\n              // Vertical scrolling.\n              vertical_dragged = true;\n            }\n          }\n\n          if (dragged) {\n            // If dragging don't allow vertical scroll.\n            e.preventDefault();\n            e.stopPropagation();\n            return false;\n          }\n        }\n\n        function release(e) {\n          pressed = false;\n\n          clearInterval(ticker);\n          target = offset;\n          if (velocity > 10 || velocity < -10) {\n            amplitude = 0.9 * velocity;\n            target = offset + amplitude;\n          }\n          target = Math.round(target / dim) * dim;\n          amplitude = target - offset;\n          timestamp = Date.now();\n          requestAnimationFrame(autoScroll);\n\n          e.preventDefault();\n          e.stopPropagation();\n          return false;\n        }\n\n        xform = 'transform';\n        ['webkit', 'Moz', 'O', 'ms'].every(function (prefix) {\n          var e = prefix + 'Transform';\n          if (typeof document.body.style[e] !== 'undefined') {\n            xform = e;\n            return false;\n          }\n          return true;\n        });\n\n\n\n        window.onresize = scroll;\n\n        setupEvents();\n        scroll(offset);\n\n        $(this).on('carouselNext', function(e, n) {\n          if (n === undefined) {\n            n = 1;\n          }\n          target = offset + dim * n;\n          if (offset !== target) {\n            amplitude = target - offset;\n            timestamp = Date.now();\n            requestAnimationFrame(autoScroll);\n          }\n        });\n\n        $(this).on('carouselPrev', function(e, n) {\n          if (n === undefined) {\n            n = 1;\n          }\n          target = offset - dim * n;\n          if (offset !== target) {\n            amplitude = target - offset;\n            timestamp = Date.now();\n            requestAnimationFrame(autoScroll);\n          }\n        });\n\n      });\n\n\n\n    },\n    next : function(n) {\n      $(this).trigger('carouselNext', [n]);\n    },\n    prev : function(n) {\n      $(this).trigger('carouselPrev', [n]);\n    },\n  };\n\n\n    $.fn.carousel = function(methodOrOptions) {\n      if ( methods[methodOrOptions] ) {\n        return methods[ methodOrOptions ].apply( this, Array.prototype.slice.call( arguments, 1 ));\n      } else if ( typeof methodOrOptions === 'object' || ! methodOrOptions ) {\n        // Default to \"init\"\n        return methods.init.apply( this, arguments );\n      } else {\n        $.error( 'Method ' +  methodOrOptions + ' does not exist on jQuery.carousel' );\n      }\n    }; // Plugin end\n}( jQuery ));"
  },
  {
    "path": "themes/default/public/js/materialize.min.js",
    "content": "if(\"undefined\"==typeof jQuery)var jQuery=$=require(\"jQuery\");jQuery.easing.jswing=jQuery.easing.swing,jQuery.extend(jQuery.easing,{def:\"easeOutQuad\",swing:function(a,b,c,d,e){return jQuery.easing[jQuery.easing.def](a,b,c,d,e)},easeInQuad:function(a,b,c,d,e){return d*(b/=e)*b+c},easeOutQuad:function(a,b,c,d,e){return-d*(b/=e)*(b-2)+c},easeInOutQuad:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b+c:-d/2*(--b*(b-2)-1)+c},easeInCubic:function(a,b,c,d,e){return d*(b/=e)*b*b+c},easeOutCubic:function(a,b,c,d,e){return d*((b=b/e-1)*b*b+1)+c},easeInOutCubic:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b*b+c:d/2*((b-=2)*b*b+2)+c},easeInQuart:function(a,b,c,d,e){return d*(b/=e)*b*b*b+c},easeOutQuart:function(a,b,c,d,e){return-d*((b=b/e-1)*b*b*b-1)+c},easeInOutQuart:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b*b*b+c:-d/2*((b-=2)*b*b*b-2)+c},easeInQuint:function(a,b,c,d,e){return d*(b/=e)*b*b*b*b+c},easeOutQuint:function(a,b,c,d,e){return d*((b=b/e-1)*b*b*b*b+1)+c},easeInOutQuint:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b*b*b*b+c:d/2*((b-=2)*b*b*b*b+2)+c},easeInSine:function(a,b,c,d,e){return-d*Math.cos(b/e*(Math.PI/2))+d+c},easeOutSine:function(a,b,c,d,e){return d*Math.sin(b/e*(Math.PI/2))+c},easeInOutSine:function(a,b,c,d,e){return-d/2*(Math.cos(Math.PI*b/e)-1)+c},easeInExpo:function(a,b,c,d,e){return 0==b?c:d*Math.pow(2,10*(b/e-1))+c},easeOutExpo:function(a,b,c,d,e){return b==e?c+d:d*(-Math.pow(2,-10*b/e)+1)+c},easeInOutExpo:function(a,b,c,d,e){return 0==b?c:b==e?c+d:(b/=e/2)<1?d/2*Math.pow(2,10*(b-1))+c:d/2*(-Math.pow(2,-10*--b)+2)+c},easeInCirc:function(a,b,c,d,e){return-d*(Math.sqrt(1-(b/=e)*b)-1)+c},easeOutCirc:function(a,b,c,d,e){return d*Math.sqrt(1-(b=b/e-1)*b)+c},easeInOutCirc:function(a,b,c,d,e){return(b/=e/2)<1?-d/2*(Math.sqrt(1-b*b)-1)+c:d/2*(Math.sqrt(1-(b-=2)*b)+1)+c},easeInElastic:function(a,b,c,d,e){var f=1.70158,g=0,h=d;if(0==b)return c;if(1==(b/=e))return c+d;if(g||(g=.3*e),h<Math.abs(d)){h=d;var f=g/4}else var f=g/(2*Math.PI)*Math.asin(d/h);return-(h*Math.pow(2,10*(b-=1))*Math.sin((b*e-f)*(2*Math.PI)/g))+c},easeOutElastic:function(a,b,c,d,e){var f=1.70158,g=0,h=d;if(0==b)return c;if(1==(b/=e))return c+d;if(g||(g=.3*e),h<Math.abs(d)){h=d;var f=g/4}else var f=g/(2*Math.PI)*Math.asin(d/h);return h*Math.pow(2,-10*b)*Math.sin((b*e-f)*(2*Math.PI)/g)+d+c},easeInOutElastic:function(a,b,c,d,e){var f=1.70158,g=0,h=d;if(0==b)return c;if(2==(b/=e/2))return c+d;if(g||(g=e*(.3*1.5)),h<Math.abs(d)){h=d;var f=g/4}else var f=g/(2*Math.PI)*Math.asin(d/h);return 1>b?-.5*(h*Math.pow(2,10*(b-=1))*Math.sin((b*e-f)*(2*Math.PI)/g))+c:h*Math.pow(2,-10*(b-=1))*Math.sin((b*e-f)*(2*Math.PI)/g)*.5+d+c},easeInBack:function(a,b,c,d,e,f){return void 0==f&&(f=1.70158),d*(b/=e)*b*((f+1)*b-f)+c},easeOutBack:function(a,b,c,d,e,f){return void 0==f&&(f=1.70158),d*((b=b/e-1)*b*((f+1)*b+f)+1)+c},easeInOutBack:function(a,b,c,d,e,f){return void 0==f&&(f=1.70158),(b/=e/2)<1?d/2*(b*b*(((f*=1.525)+1)*b-f))+c:d/2*((b-=2)*b*(((f*=1.525)+1)*b+f)+2)+c},easeInBounce:function(a,b,c,d,e){return d-jQuery.easing.easeOutBounce(a,e-b,0,d,e)+c},easeOutBounce:function(a,b,c,d,e){return(b/=e)<1/2.75?d*(7.5625*b*b)+c:2/2.75>b?d*(7.5625*(b-=1.5/2.75)*b+.75)+c:2.5/2.75>b?d*(7.5625*(b-=2.25/2.75)*b+.9375)+c:d*(7.5625*(b-=2.625/2.75)*b+.984375)+c},easeInOutBounce:function(a,b,c,d,e){return e/2>b?.5*jQuery.easing.easeInBounce(a,2*b,0,d,e)+c:.5*jQuery.easing.easeOutBounce(a,2*b-e,0,d,e)+.5*d+c}}),jQuery.extend(jQuery.easing,{easeInOutMaterial:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b+c:d/4*((b-=2)*b*b+2)+c}}),jQuery.Velocity?console.log(\"Velocity is already loaded. You may be needlessly importing Velocity again; note that Materialize includes Velocity.\"):(!function(a){function b(a){var b=a.length,d=c.type(a);return\"function\"===d||c.isWindow(a)?!1:1===a.nodeType&&b?!0:\"array\"===d||0===b||\"number\"==typeof b&&b>0&&b-1 in a}if(!a.jQuery){var c=function(a,b){return new c.fn.init(a,b)};c.isWindow=function(a){return null!=a&&a==a.window},c.type=function(a){return null==a?a+\"\":\"object\"==typeof a||\"function\"==typeof a?e[g.call(a)]||\"object\":typeof a},c.isArray=Array.isArray||function(a){return\"array\"===c.type(a)},c.isPlainObject=function(a){var b;if(!a||\"object\"!==c.type(a)||a.nodeType||c.isWindow(a))return!1;try{if(a.constructor&&!f.call(a,\"constructor\")&&!f.call(a.constructor.prototype,\"isPrototypeOf\"))return!1}catch(d){return!1}for(b in a);return void 0===b||f.call(a,b)},c.each=function(a,c,d){var e,f=0,g=a.length,h=b(a);if(d){if(h)for(;g>f&&(e=c.apply(a[f],d),e!==!1);f++);else for(f in a)if(e=c.apply(a[f],d),e===!1)break}else if(h)for(;g>f&&(e=c.call(a[f],f,a[f]),e!==!1);f++);else for(f in a)if(e=c.call(a[f],f,a[f]),e===!1)break;return a},c.data=function(a,b,e){if(void 0===e){var f=a[c.expando],g=f&&d[f];if(void 0===b)return g;if(g&&b in g)return g[b]}else if(void 0!==b){var f=a[c.expando]||(a[c.expando]=++c.uuid);return d[f]=d[f]||{},d[f][b]=e,e}},c.removeData=function(a,b){var e=a[c.expando],f=e&&d[e];f&&c.each(b,function(a,b){delete f[b]})},c.extend=function(){var a,b,d,e,f,g,h=arguments[0]||{},i=1,j=arguments.length,k=!1;for(\"boolean\"==typeof h&&(k=h,h=arguments[i]||{},i++),\"object\"!=typeof h&&\"function\"!==c.type(h)&&(h={}),i===j&&(h=this,i--);j>i;i++)if(null!=(f=arguments[i]))for(e in f)a=h[e],d=f[e],h!==d&&(k&&d&&(c.isPlainObject(d)||(b=c.isArray(d)))?(b?(b=!1,g=a&&c.isArray(a)?a:[]):g=a&&c.isPlainObject(a)?a:{},h[e]=c.extend(k,g,d)):void 0!==d&&(h[e]=d));return h},c.queue=function(a,d,e){function f(a,c){var d=c||[];return null!=a&&(b(Object(a))?!function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;)a[e++]=b[d++];if(c!==c)for(;void 0!==b[d];)a[e++]=b[d++];return a.length=e,a}(d,\"string\"==typeof a?[a]:a):[].push.call(d,a)),d}if(a){d=(d||\"fx\")+\"queue\";var g=c.data(a,d);return e?(!g||c.isArray(e)?g=c.data(a,d,f(e)):g.push(e),g):g||[]}},c.dequeue=function(a,b){c.each(a.nodeType?[a]:a,function(a,d){b=b||\"fx\";var e=c.queue(d,b),f=e.shift();\"inprogress\"===f&&(f=e.shift()),f&&(\"fx\"===b&&e.unshift(\"inprogress\"),f.call(d,function(){c.dequeue(d,b)}))})},c.fn=c.prototype={init:function(a){if(a.nodeType)return this[0]=a,this;throw new Error(\"Not a DOM node.\")},offset:function(){var b=this[0].getBoundingClientRect?this[0].getBoundingClientRect():{top:0,left:0};return{top:b.top+(a.pageYOffset||document.scrollTop||0)-(document.clientTop||0),left:b.left+(a.pageXOffset||document.scrollLeft||0)-(document.clientLeft||0)}},position:function(){function a(){for(var a=this.offsetParent||document;a&&\"html\"===!a.nodeType.toLowerCase&&\"static\"===a.style.position;)a=a.offsetParent;return a||document}var b=this[0],a=a.apply(b),d=this.offset(),e=/^(?:body|html)$/i.test(a.nodeName)?{top:0,left:0}:c(a).offset();return d.top-=parseFloat(b.style.marginTop)||0,d.left-=parseFloat(b.style.marginLeft)||0,a.style&&(e.top+=parseFloat(a.style.borderTopWidth)||0,e.left+=parseFloat(a.style.borderLeftWidth)||0),{top:d.top-e.top,left:d.left-e.left}}};var d={};c.expando=\"velocity\"+(new Date).getTime(),c.uuid=0;for(var e={},f=e.hasOwnProperty,g=e.toString,h=\"Boolean Number String Function Array Date RegExp Object Error\".split(\" \"),i=0;i<h.length;i++)e[\"[object \"+h[i]+\"]\"]=h[i].toLowerCase();c.fn.init.prototype=c.fn,a.Velocity={Utilities:c}}}(window),function(a){\"object\"==typeof module&&\"object\"==typeof module.exports?module.exports=a():\"function\"==typeof define&&define.amd?define(a):a()}(function(){return function(a,b,c,d){function e(a){for(var b=-1,c=a?a.length:0,d=[];++b<c;){var e=a[b];e&&d.push(e)}return d}function f(a){return p.isWrapped(a)?a=[].slice.call(a):p.isNode(a)&&(a=[a]),a}function g(a){var b=m.data(a,\"velocity\");return null===b?d:b}function h(a){return function(b){return Math.round(b*a)*(1/a)}}function i(a,c,d,e){function f(a,b){return 1-3*b+3*a}function g(a,b){return 3*b-6*a}function h(a){return 3*a}function i(a,b,c){return((f(b,c)*a+g(b,c))*a+h(b))*a}function j(a,b,c){return 3*f(b,c)*a*a+2*g(b,c)*a+h(b)}function k(b,c){for(var e=0;p>e;++e){var f=j(c,a,d);if(0===f)return c;var g=i(c,a,d)-b;c-=g/f}return c}function l(){for(var b=0;t>b;++b)x[b]=i(b*u,a,d)}function m(b,c,e){var f,g,h=0;do g=c+(e-c)/2,f=i(g,a,d)-b,f>0?e=g:c=g;while(Math.abs(f)>r&&++h<s);return g}function n(b){for(var c=0,e=1,f=t-1;e!=f&&x[e]<=b;++e)c+=u;--e;var g=(b-x[e])/(x[e+1]-x[e]),h=c+g*u,i=j(h,a,d);return i>=q?k(b,h):0==i?h:m(b,c,c+u)}function o(){y=!0,(a!=c||d!=e)&&l()}var p=4,q=.001,r=1e-7,s=10,t=11,u=1/(t-1),v=\"Float32Array\"in b;if(4!==arguments.length)return!1;for(var w=0;4>w;++w)if(\"number\"!=typeof arguments[w]||isNaN(arguments[w])||!isFinite(arguments[w]))return!1;a=Math.min(a,1),d=Math.min(d,1),a=Math.max(a,0),d=Math.max(d,0);var x=v?new Float32Array(t):new Array(t),y=!1,z=function(b){return y||o(),a===c&&d===e?b:0===b?0:1===b?1:i(n(b),c,e)};z.getControlPoints=function(){return[{x:a,y:c},{x:d,y:e}]};var A=\"generateBezier(\"+[a,c,d,e]+\")\";return z.toString=function(){return A},z}function j(a,b){var c=a;return p.isString(a)?t.Easings[a]||(c=!1):c=p.isArray(a)&&1===a.length?h.apply(null,a):p.isArray(a)&&2===a.length?u.apply(null,a.concat([b])):p.isArray(a)&&4===a.length?i.apply(null,a):!1,c===!1&&(c=t.Easings[t.defaults.easing]?t.defaults.easing:s),c}function k(a){if(a){var b=(new Date).getTime(),c=t.State.calls.length;c>1e4&&(t.State.calls=e(t.State.calls));for(var f=0;c>f;f++)if(t.State.calls[f]){var h=t.State.calls[f],i=h[0],j=h[2],n=h[3],o=!!n,q=null;n||(n=t.State.calls[f][3]=b-16);for(var r=Math.min((b-n)/j.duration,1),s=0,u=i.length;u>s;s++){var w=i[s],y=w.element;if(g(y)){var z=!1;if(j.display!==d&&null!==j.display&&\"none\"!==j.display){if(\"flex\"===j.display){var A=[\"-webkit-box\",\"-moz-box\",\"-ms-flexbox\",\"-webkit-flex\"];m.each(A,function(a,b){v.setPropertyValue(y,\"display\",b)})}v.setPropertyValue(y,\"display\",j.display)}j.visibility!==d&&\"hidden\"!==j.visibility&&v.setPropertyValue(y,\"visibility\",j.visibility);for(var B in w)if(\"element\"!==B){var C,D=w[B],E=p.isString(D.easing)?t.Easings[D.easing]:D.easing;if(1===r)C=D.endValue;else{var F=D.endValue-D.startValue;if(C=D.startValue+F*E(r,j,F),!o&&C===D.currentValue)continue}if(D.currentValue=C,\"tween\"===B)q=C;else{if(v.Hooks.registered[B]){var G=v.Hooks.getRoot(B),H=g(y).rootPropertyValueCache[G];H&&(D.rootPropertyValue=H)}var I=v.setPropertyValue(y,B,D.currentValue+(0===parseFloat(C)?\"\":D.unitType),D.rootPropertyValue,D.scrollData);v.Hooks.registered[B]&&(g(y).rootPropertyValueCache[G]=v.Normalizations.registered[G]?v.Normalizations.registered[G](\"extract\",null,I[1]):I[1]),\"transform\"===I[0]&&(z=!0)}}j.mobileHA&&g(y).transformCache.translate3d===d&&(g(y).transformCache.translate3d=\"(0px, 0px, 0px)\",z=!0),z&&v.flushTransformCache(y)}}j.display!==d&&\"none\"!==j.display&&(t.State.calls[f][2].display=!1),j.visibility!==d&&\"hidden\"!==j.visibility&&(t.State.calls[f][2].visibility=!1),j.progress&&j.progress.call(h[1],h[1],r,Math.max(0,n+j.duration-b),n,q),1===r&&l(f)}}t.State.isTicking&&x(k)}function l(a,b){if(!t.State.calls[a])return!1;for(var c=t.State.calls[a][0],e=t.State.calls[a][1],f=t.State.calls[a][2],h=t.State.calls[a][4],i=!1,j=0,k=c.length;k>j;j++){var l=c[j].element;if(b||f.loop||(\"none\"===f.display&&v.setPropertyValue(l,\"display\",f.display),\"hidden\"===f.visibility&&v.setPropertyValue(l,\"visibility\",f.visibility)),f.loop!==!0&&(m.queue(l)[1]===d||!/\\.velocityQueueEntryFlag/i.test(m.queue(l)[1]))&&g(l)){g(l).isAnimating=!1,g(l).rootPropertyValueCache={};var n=!1;m.each(v.Lists.transforms3D,function(a,b){var c=/^scale/.test(b)?1:0,e=g(l).transformCache[b];g(l).transformCache[b]!==d&&new RegExp(\"^\\\\(\"+c+\"[^.]\").test(e)&&(n=!0,delete g(l).transformCache[b])}),f.mobileHA&&(n=!0,delete g(l).transformCache.translate3d),n&&v.flushTransformCache(l),v.Values.removeClass(l,\"velocity-animating\")}if(!b&&f.complete&&!f.loop&&j===k-1)try{f.complete.call(e,e)}catch(o){setTimeout(function(){throw o},1)}h&&f.loop!==!0&&h(e),g(l)&&f.loop===!0&&!b&&(m.each(g(l).tweensContainer,function(a,b){/^rotate/.test(a)&&360===parseFloat(b.endValue)&&(b.endValue=0,b.startValue=360),/^backgroundPosition/.test(a)&&100===parseFloat(b.endValue)&&\"%\"===b.unitType&&(b.endValue=0,b.startValue=100)}),t(l,\"reverse\",{loop:!0,delay:f.delay})),f.queue!==!1&&m.dequeue(l,f.queue)}t.State.calls[a]=!1;for(var p=0,q=t.State.calls.length;q>p;p++)if(t.State.calls[p]!==!1){i=!0;break}i===!1&&(t.State.isTicking=!1,delete t.State.calls,t.State.calls=[])}var m,n=function(){if(c.documentMode)return c.documentMode;for(var a=7;a>4;a--){var b=c.createElement(\"div\");if(b.innerHTML=\"<!--[if IE \"+a+\"]><span></span><![endif]-->\",b.getElementsByTagName(\"span\").length)return b=null,a}return d}(),o=function(){var a=0;return b.webkitRequestAnimationFrame||b.mozRequestAnimationFrame||function(b){var c,d=(new Date).getTime();return c=Math.max(0,16-(d-a)),a=d+c,setTimeout(function(){b(d+c)},c)}}(),p={isString:function(a){return\"string\"==typeof a},isArray:Array.isArray||function(a){return\"[object Array]\"===Object.prototype.toString.call(a)},isFunction:function(a){return\"[object Function]\"===Object.prototype.toString.call(a)},isNode:function(a){return a&&a.nodeType},isNodeList:function(a){return\"object\"==typeof a&&/^\\[object (HTMLCollection|NodeList|Object)\\]$/.test(Object.prototype.toString.call(a))&&a.length!==d&&(0===a.length||\"object\"==typeof a[0]&&a[0].nodeType>0)},isWrapped:function(a){return a&&(a.jquery||b.Zepto&&b.Zepto.zepto.isZ(a))},isSVG:function(a){return b.SVGElement&&a instanceof b.SVGElement},isEmptyObject:function(a){for(var b in a)return!1;return!0}},q=!1;if(a.fn&&a.fn.jquery?(m=a,q=!0):m=b.Velocity.Utilities,8>=n&&!q)throw new Error(\"Velocity: IE8 and below require jQuery to be loaded before Velocity.\");if(7>=n)return void(jQuery.fn.velocity=jQuery.fn.animate);var r=400,s=\"swing\",t={State:{isMobile:/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),isAndroid:/Android/i.test(navigator.userAgent),isGingerbread:/Android 2\\.3\\.[3-7]/i.test(navigator.userAgent),isChrome:b.chrome,isFirefox:/Firefox/i.test(navigator.userAgent),prefixElement:c.createElement(\"div\"),prefixMatches:{},scrollAnchor:null,scrollPropertyLeft:null,scrollPropertyTop:null,isTicking:!1,calls:[]},CSS:{},Utilities:m,Redirects:{},Easings:{},Promise:b.Promise,defaults:{queue:\"\",duration:r,easing:s,begin:d,complete:d,progress:d,display:d,visibility:d,loop:!1,delay:!1,mobileHA:!0,_cacheValues:!0},init:function(a){m.data(a,\"velocity\",{isSVG:p.isSVG(a),isAnimating:!1,computedStyle:null,tweensContainer:null,rootPropertyValueCache:{},transformCache:{}})},hook:null,mock:!1,version:{major:1,minor:2,patch:2},debug:!1};b.pageYOffset!==d?(t.State.scrollAnchor=b,t.State.scrollPropertyLeft=\"pageXOffset\",t.State.scrollPropertyTop=\"pageYOffset\"):(t.State.scrollAnchor=c.documentElement||c.body.parentNode||c.body,t.State.scrollPropertyLeft=\"scrollLeft\",t.State.scrollPropertyTop=\"scrollTop\");var u=function(){function a(a){return-a.tension*a.x-a.friction*a.v}function b(b,c,d){var e={x:b.x+d.dx*c,v:b.v+d.dv*c,tension:b.tension,friction:b.friction};return{dx:e.v,dv:a(e)}}function c(c,d){var e={dx:c.v,dv:a(c)},f=b(c,.5*d,e),g=b(c,.5*d,f),h=b(c,d,g),i=1/6*(e.dx+2*(f.dx+g.dx)+h.dx),j=1/6*(e.dv+2*(f.dv+g.dv)+h.dv);return c.x=c.x+i*d,c.v=c.v+j*d,c}return function d(a,b,e){var f,g,h,i={x:-1,v:0,tension:null,friction:null},j=[0],k=0,l=1e-4,m=.016;for(a=parseFloat(a)||500,b=parseFloat(b)||20,e=e||null,i.tension=a,i.friction=b,f=null!==e,f?(k=d(a,b),g=k/e*m):g=m;h=c(h||i,g),j.push(1+h.x),k+=16,Math.abs(h.x)>l&&Math.abs(h.v)>l;);return f?function(a){return j[a*(j.length-1)|0]}:k}}();t.Easings={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},spring:function(a){return 1-Math.cos(4.5*a*Math.PI)*Math.exp(6*-a)}},m.each([[\"ease\",[.25,.1,.25,1]],[\"ease-in\",[.42,0,1,1]],[\"ease-out\",[0,0,.58,1]],[\"ease-in-out\",[.42,0,.58,1]],[\"easeInSine\",[.47,0,.745,.715]],[\"easeOutSine\",[.39,.575,.565,1]],[\"easeInOutSine\",[.445,.05,.55,.95]],[\"easeInQuad\",[.55,.085,.68,.53]],[\"easeOutQuad\",[.25,.46,.45,.94]],[\"easeInOutQuad\",[.455,.03,.515,.955]],[\"easeInCubic\",[.55,.055,.675,.19]],[\"easeOutCubic\",[.215,.61,.355,1]],[\"easeInOutCubic\",[.645,.045,.355,1]],[\"easeInQuart\",[.895,.03,.685,.22]],[\"easeOutQuart\",[.165,.84,.44,1]],[\"easeInOutQuart\",[.77,0,.175,1]],[\"easeInQuint\",[.755,.05,.855,.06]],[\"easeOutQuint\",[.23,1,.32,1]],[\"easeInOutQuint\",[.86,0,.07,1]],[\"easeInExpo\",[.95,.05,.795,.035]],[\"easeOutExpo\",[.19,1,.22,1]],[\"easeInOutExpo\",[1,0,0,1]],[\"easeInCirc\",[.6,.04,.98,.335]],[\"easeOutCirc\",[.075,.82,.165,1]],[\"easeInOutCirc\",[.785,.135,.15,.86]]],function(a,b){t.Easings[b[0]]=i.apply(null,b[1])});var v=t.CSS={RegEx:{isHex:/^#([A-f\\d]{3}){1,2}$/i,valueUnwrap:/^[A-z]+\\((.*)\\)$/i,wrappedValueAlreadyExtracted:/[0-9.]+ [0-9.]+ [0-9.]+( [0-9.]+)?/,valueSplit:/([A-z]+\\(.+\\))|(([A-z0-9#-.]+?)(?=\\s|$))/gi},Lists:{colors:[\"fill\",\"stroke\",\"stopColor\",\"color\",\"backgroundColor\",\"borderColor\",\"borderTopColor\",\"borderRightColor\",\"borderBottomColor\",\"borderLeftColor\",\"outlineColor\"],transformsBase:[\"translateX\",\"translateY\",\"scale\",\"scaleX\",\"scaleY\",\"skewX\",\"skewY\",\"rotateZ\"],transforms3D:[\"transformPerspective\",\"translateZ\",\"scaleZ\",\"rotateX\",\"rotateY\"]},Hooks:{templates:{textShadow:[\"Color X Y Blur\",\"black 0px 0px 0px\"],boxShadow:[\"Color X Y Blur Spread\",\"black 0px 0px 0px 0px\"],clip:[\"Top Right Bottom Left\",\"0px 0px 0px 0px\"],backgroundPosition:[\"X Y\",\"0% 0%\"],transformOrigin:[\"X Y Z\",\"50% 50% 0px\"],perspectiveOrigin:[\"X Y\",\"50% 50%\"]},registered:{},register:function(){for(var a=0;a<v.Lists.colors.length;a++){var b=\"color\"===v.Lists.colors[a]?\"0 0 0 1\":\"255 255 255 1\";v.Hooks.templates[v.Lists.colors[a]]=[\"Red Green Blue Alpha\",b]}var c,d,e;if(n)for(c in v.Hooks.templates){d=v.Hooks.templates[c],e=d[0].split(\" \");var f=d[1].match(v.RegEx.valueSplit);\"Color\"===e[0]&&(e.push(e.shift()),f.push(f.shift()),v.Hooks.templates[c]=[e.join(\" \"),f.join(\" \")])}for(c in v.Hooks.templates){d=v.Hooks.templates[c],e=d[0].split(\" \");for(var a in e){var g=c+e[a],h=a;v.Hooks.registered[g]=[c,h]}}},getRoot:function(a){var b=v.Hooks.registered[a];return b?b[0]:a},cleanRootPropertyValue:function(a,b){return v.RegEx.valueUnwrap.test(b)&&(b=b.match(v.RegEx.valueUnwrap)[1]),v.Values.isCSSNullValue(b)&&(b=v.Hooks.templates[a][1]),b},extractValue:function(a,b){var c=v.Hooks.registered[a];if(c){var d=c[0],e=c[1];return b=v.Hooks.cleanRootPropertyValue(d,b),b.toString().match(v.RegEx.valueSplit)[e]}return b},injectValue:function(a,b,c){var d=v.Hooks.registered[a];if(d){var e,f,g=d[0],h=d[1];return c=v.Hooks.cleanRootPropertyValue(g,c),e=c.toString().match(v.RegEx.valueSplit),e[h]=b,f=e.join(\" \")}return c}},Normalizations:{registered:{clip:function(a,b,c){switch(a){case\"name\":return\"clip\";case\"extract\":var d;return v.RegEx.wrappedValueAlreadyExtracted.test(c)?d=c:(d=c.toString().match(v.RegEx.valueUnwrap),d=d?d[1].replace(/,(\\s+)?/g,\" \"):c),d;case\"inject\":return\"rect(\"+c+\")\"}},blur:function(a,b,c){switch(a){case\"name\":return t.State.isFirefox?\"filter\":\"-webkit-filter\";case\"extract\":var d=parseFloat(c);if(!d&&0!==d){var e=c.toString().match(/blur\\(([0-9]+[A-z]+)\\)/i);d=e?e[1]:0}return d;case\"inject\":return parseFloat(c)?\"blur(\"+c+\")\":\"none\"}},opacity:function(a,b,c){if(8>=n)switch(a){case\"name\":return\"filter\";case\"extract\":var d=c.toString().match(/alpha\\(opacity=(.*)\\)/i);return c=d?d[1]/100:1;case\"inject\":return b.style.zoom=1,parseFloat(c)>=1?\"\":\"alpha(opacity=\"+parseInt(100*parseFloat(c),10)+\")\"}else switch(a){case\"name\":return\"opacity\";case\"extract\":return c;case\"inject\":return c}}},register:function(){9>=n||t.State.isGingerbread||(v.Lists.transformsBase=v.Lists.transformsBase.concat(v.Lists.transforms3D));for(var a=0;a<v.Lists.transformsBase.length;a++)!function(){var b=v.Lists.transformsBase[a];v.Normalizations.registered[b]=function(a,c,e){switch(a){case\"name\":return\"transform\";case\"extract\":return g(c)===d||g(c).transformCache[b]===d?/^scale/i.test(b)?1:0:g(c).transformCache[b].replace(/[()]/g,\"\");case\"inject\":var f=!1;switch(b.substr(0,b.length-1)){case\"translate\":f=!/(%|px|em|rem|vw|vh|\\d)$/i.test(e);break;case\"scal\":case\"scale\":t.State.isAndroid&&g(c).transformCache[b]===d&&1>e&&(e=1),f=!/(\\d)$/i.test(e);break;case\"skew\":f=!/(deg|\\d)$/i.test(e);break;case\"rotate\":f=!/(deg|\\d)$/i.test(e)}return f||(g(c).transformCache[b]=\"(\"+e+\")\"),g(c).transformCache[b]}}}();for(var a=0;a<v.Lists.colors.length;a++)!function(){var b=v.Lists.colors[a];v.Normalizations.registered[b]=function(a,c,e){switch(a){case\"name\":return b;case\"extract\":var f;if(v.RegEx.wrappedValueAlreadyExtracted.test(e))f=e;else{var g,h={black:\"rgb(0, 0, 0)\",blue:\"rgb(0, 0, 255)\",gray:\"rgb(128, 128, 128)\",green:\"rgb(0, 128, 0)\",red:\"rgb(255, 0, 0)\",white:\"rgb(255, 255, 255)\"};/^[A-z]+$/i.test(e)?g=h[e]!==d?h[e]:h.black:v.RegEx.isHex.test(e)?g=\"rgb(\"+v.Values.hexToRgb(e).join(\" \")+\")\":/^rgba?\\(/i.test(e)||(g=h.black),f=(g||e).toString().match(v.RegEx.valueUnwrap)[1].replace(/,(\\s+)?/g,\" \")}return 8>=n||3!==f.split(\" \").length||(f+=\" 1\"),f;case\"inject\":return 8>=n?4===e.split(\" \").length&&(e=e.split(/\\s+/).slice(0,3).join(\" \")):3===e.split(\" \").length&&(e+=\" 1\"),(8>=n?\"rgb\":\"rgba\")+\"(\"+e.replace(/\\s+/g,\",\").replace(/\\.(\\d)+(?=,)/g,\"\")+\")\"}}}()}},Names:{camelCase:function(a){return a.replace(/-(\\w)/g,function(a,b){return b.toUpperCase()})},SVGAttribute:function(a){var b=\"width|height|x|y|cx|cy|r|rx|ry|x1|x2|y1|y2\";return(n||t.State.isAndroid&&!t.State.isChrome)&&(b+=\"|transform\"),new RegExp(\"^(\"+b+\")$\",\"i\").test(a)},prefixCheck:function(a){if(t.State.prefixMatches[a])return[t.State.prefixMatches[a],!0];for(var b=[\"\",\"Webkit\",\"Moz\",\"ms\",\"O\"],c=0,d=b.length;d>c;c++){var e;if(e=0===c?a:b[c]+a.replace(/^\\w/,function(a){return a.toUpperCase()}),p.isString(t.State.prefixElement.style[e]))return t.State.prefixMatches[a]=e,[e,!0]}return[a,!1]}},Values:{hexToRgb:function(a){var b,c=/^#?([a-f\\d])([a-f\\d])([a-f\\d])$/i,d=/^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i;return a=a.replace(c,function(a,b,c,d){return b+b+c+c+d+d}),b=d.exec(a),b?[parseInt(b[1],16),parseInt(b[2],16),parseInt(b[3],16)]:[0,0,0]},isCSSNullValue:function(a){return 0==a||/^(none|auto|transparent|(rgba\\(0, ?0, ?0, ?0\\)))$/i.test(a)},getUnitType:function(a){return/^(rotate|skew)/i.test(a)?\"deg\":/(^(scale|scaleX|scaleY|scaleZ|alpha|flexGrow|flexHeight|zIndex|fontWeight)$)|((opacity|red|green|blue|alpha)$)/i.test(a)?\"\":\"px\"},getDisplayType:function(a){var b=a&&a.tagName.toString().toLowerCase();return/^(b|big|i|small|tt|abbr|acronym|cite|code|dfn|em|kbd|strong|samp|var|a|bdo|br|img|map|object|q|script|span|sub|sup|button|input|label|select|textarea)$/i.test(b)?\"inline\":/^(li)$/i.test(b)?\"list-item\":/^(tr)$/i.test(b)?\"table-row\":/^(table)$/i.test(b)?\"table\":/^(tbody)$/i.test(b)?\"table-row-group\":\"block\"},addClass:function(a,b){a.classList?a.classList.add(b):a.className+=(a.className.length?\" \":\"\")+b},removeClass:function(a,b){a.classList?a.classList.remove(b):a.className=a.className.toString().replace(new RegExp(\"(^|\\\\s)\"+b.split(\" \").join(\"|\")+\"(\\\\s|$)\",\"gi\"),\" \")}},getPropertyValue:function(a,c,e,f){function h(a,c){function e(){j&&v.setPropertyValue(a,\"display\",\"none\")}var i=0;if(8>=n)i=m.css(a,c);else{var j=!1;if(/^(width|height)$/.test(c)&&0===v.getPropertyValue(a,\"display\")&&(j=!0,v.setPropertyValue(a,\"display\",v.Values.getDisplayType(a))),!f){if(\"height\"===c&&\"border-box\"!==v.getPropertyValue(a,\"boxSizing\").toString().toLowerCase()){var k=a.offsetHeight-(parseFloat(v.getPropertyValue(a,\"borderTopWidth\"))||0)-(parseFloat(v.getPropertyValue(a,\"borderBottomWidth\"))||0)-(parseFloat(v.getPropertyValue(a,\"paddingTop\"))||0)-(parseFloat(v.getPropertyValue(a,\"paddingBottom\"))||0);return e(),k}if(\"width\"===c&&\"border-box\"!==v.getPropertyValue(a,\"boxSizing\").toString().toLowerCase()){var l=a.offsetWidth-(parseFloat(v.getPropertyValue(a,\"borderLeftWidth\"))||0)-(parseFloat(v.getPropertyValue(a,\"borderRightWidth\"))||0)-(parseFloat(v.getPropertyValue(a,\"paddingLeft\"))||0)-(parseFloat(v.getPropertyValue(a,\"paddingRight\"))||0);return e(),l}}var o;o=g(a)===d?b.getComputedStyle(a,null):g(a).computedStyle?g(a).computedStyle:g(a).computedStyle=b.getComputedStyle(a,null),\"borderColor\"===c&&(c=\"borderTopColor\"),i=9===n&&\"filter\"===c?o.getPropertyValue(c):o[c],(\"\"===i||null===i)&&(i=a.style[c]),e()}if(\"auto\"===i&&/^(top|right|bottom|left)$/i.test(c)){var p=h(a,\"position\");(\"fixed\"===p||\"absolute\"===p&&/top|left/i.test(c))&&(i=m(a).position()[c]+\"px\")}return i}var i;if(v.Hooks.registered[c]){var j=c,k=v.Hooks.getRoot(j);e===d&&(e=v.getPropertyValue(a,v.Names.prefixCheck(k)[0])),v.Normalizations.registered[k]&&(e=v.Normalizations.registered[k](\"extract\",a,e)),i=v.Hooks.extractValue(j,e)}else if(v.Normalizations.registered[c]){var l,o;l=v.Normalizations.registered[c](\"name\",a),\"transform\"!==l&&(o=h(a,v.Names.prefixCheck(l)[0]),v.Values.isCSSNullValue(o)&&v.Hooks.templates[c]&&(o=v.Hooks.templates[c][1])),i=v.Normalizations.registered[c](\"extract\",a,o)}if(!/^[\\d-]/.test(i))if(g(a)&&g(a).isSVG&&v.Names.SVGAttribute(c))if(/^(height|width)$/i.test(c))try{i=a.getBBox()[c]}catch(p){i=0}else i=a.getAttribute(c);else i=h(a,v.Names.prefixCheck(c)[0]);return v.Values.isCSSNullValue(i)&&(i=0),t.debug>=2&&console.log(\"Get \"+c+\": \"+i),i},setPropertyValue:function(a,c,d,e,f){var h=c;if(\"scroll\"===c)f.container?f.container[\"scroll\"+f.direction]=d:\"Left\"===f.direction?b.scrollTo(d,f.alternateValue):b.scrollTo(f.alternateValue,d);else if(v.Normalizations.registered[c]&&\"transform\"===v.Normalizations.registered[c](\"name\",a))v.Normalizations.registered[c](\"inject\",a,d),h=\"transform\",d=g(a).transformCache[c];else{if(v.Hooks.registered[c]){var i=c,j=v.Hooks.getRoot(c);e=e||v.getPropertyValue(a,j),d=v.Hooks.injectValue(i,d,e),c=j}if(v.Normalizations.registered[c]&&(d=v.Normalizations.registered[c](\"inject\",a,d),c=v.Normalizations.registered[c](\"name\",a)),h=v.Names.prefixCheck(c)[0],8>=n)try{a.style[h]=d}catch(k){t.debug&&console.log(\"Browser does not support [\"+d+\"] for [\"+h+\"]\")}else g(a)&&g(a).isSVG&&v.Names.SVGAttribute(c)?a.setAttribute(c,d):a.style[h]=d;t.debug>=2&&console.log(\"Set \"+c+\" (\"+h+\"): \"+d)}return[h,d]},flushTransformCache:function(a){function b(b){return parseFloat(v.getPropertyValue(a,b))}var c=\"\";if((n||t.State.isAndroid&&!t.State.isChrome)&&g(a).isSVG){var d={translate:[b(\"translateX\"),b(\"translateY\")],skewX:[b(\"skewX\")],skewY:[b(\"skewY\")],scale:1!==b(\"scale\")?[b(\"scale\"),b(\"scale\")]:[b(\"scaleX\"),b(\"scaleY\")],rotate:[b(\"rotateZ\"),0,0]};m.each(g(a).transformCache,function(a){/^translate/i.test(a)?a=\"translate\":/^scale/i.test(a)?a=\"scale\":/^rotate/i.test(a)&&(a=\"rotate\"),d[a]&&(c+=a+\"(\"+d[a].join(\" \")+\") \",delete d[a])})}else{var e,f;m.each(g(a).transformCache,function(b){return e=g(a).transformCache[b],\"transformPerspective\"===b?(f=e,!0):(9===n&&\"rotateZ\"===b&&(b=\"rotate\"),void(c+=b+e+\" \"))}),f&&(c=\"perspective\"+f+\" \"+c)}v.setPropertyValue(a,\"transform\",c)}};v.Hooks.register(),v.Normalizations.register(),t.hook=function(a,b,c){var e=d;return a=f(a),m.each(a,function(a,f){if(g(f)===d&&t.init(f),c===d)e===d&&(e=t.CSS.getPropertyValue(f,b));else{var h=t.CSS.setPropertyValue(f,b,c);\"transform\"===h[0]&&t.CSS.flushTransformCache(f),e=h}}),e};var w=function(){function a(){return h?B.promise||null:i}function e(){function a(a){function l(a,b){var c=d,e=d,g=d;return p.isArray(a)?(c=a[0],!p.isArray(a[1])&&/^[\\d-]/.test(a[1])||p.isFunction(a[1])||v.RegEx.isHex.test(a[1])?g=a[1]:(p.isString(a[1])&&!v.RegEx.isHex.test(a[1])||p.isArray(a[1]))&&(e=b?a[1]:j(a[1],h.duration),a[2]!==d&&(g=a[2]))):c=a,b||(e=e||h.easing),p.isFunction(c)&&(c=c.call(f,y,x)),p.isFunction(g)&&(g=g.call(f,y,x)),[c||0,e,g]}function n(a,b){var c,d;return d=(b||\"0\").toString().toLowerCase().replace(/[%A-z]+$/,function(a){return c=a,\"\"}),c||(c=v.Values.getUnitType(a)),[d,c]}function r(){var a={myParent:f.parentNode||c.body,position:v.getPropertyValue(f,\"position\"),fontSize:v.getPropertyValue(f,\"fontSize\")},d=a.position===I.lastPosition&&a.myParent===I.lastParent,e=a.fontSize===I.lastFontSize;I.lastParent=a.myParent,I.lastPosition=a.position,I.lastFontSize=a.fontSize;var h=100,i={};if(e&&d)i.emToPx=I.lastEmToPx,i.percentToPxWidth=I.lastPercentToPxWidth,i.percentToPxHeight=I.lastPercentToPxHeight;else{var j=g(f).isSVG?c.createElementNS(\"http://www.w3.org/2000/svg\",\"rect\"):c.createElement(\"div\");t.init(j),a.myParent.appendChild(j),m.each([\"overflow\",\"overflowX\",\"overflowY\"],function(a,b){t.CSS.setPropertyValue(j,b,\"hidden\")}),t.CSS.setPropertyValue(j,\"position\",a.position),t.CSS.setPropertyValue(j,\"fontSize\",a.fontSize),t.CSS.setPropertyValue(j,\"boxSizing\",\"content-box\"),m.each([\"minWidth\",\"maxWidth\",\"width\",\"minHeight\",\"maxHeight\",\"height\"],function(a,b){t.CSS.setPropertyValue(j,b,h+\"%\")}),t.CSS.setPropertyValue(j,\"paddingLeft\",h+\"em\"),i.percentToPxWidth=I.lastPercentToPxWidth=(parseFloat(v.getPropertyValue(j,\"width\",null,!0))||1)/h,i.percentToPxHeight=I.lastPercentToPxHeight=(parseFloat(v.getPropertyValue(j,\"height\",null,!0))||1)/h,i.emToPx=I.lastEmToPx=(parseFloat(v.getPropertyValue(j,\"paddingLeft\"))||1)/h,a.myParent.removeChild(j)}return null===I.remToPx&&(I.remToPx=parseFloat(v.getPropertyValue(c.body,\"fontSize\"))||16),null===I.vwToPx&&(I.vwToPx=parseFloat(b.innerWidth)/100,I.vhToPx=parseFloat(b.innerHeight)/100),i.remToPx=I.remToPx,i.vwToPx=I.vwToPx,i.vhToPx=I.vhToPx,t.debug>=1&&console.log(\"Unit ratios: \"+JSON.stringify(i),f),i}if(h.begin&&0===y)try{h.begin.call(o,o)}catch(u){setTimeout(function(){throw u},1)}if(\"scroll\"===C){var w,z,A,D=/^x$/i.test(h.axis)?\"Left\":\"Top\",E=parseFloat(h.offset)||0;h.container?p.isWrapped(h.container)||p.isNode(h.container)?(h.container=h.container[0]||h.container,w=h.container[\"scroll\"+D],A=w+m(f).position()[D.toLowerCase()]+E):h.container=null:(w=t.State.scrollAnchor[t.State[\"scrollProperty\"+D]],z=t.State.scrollAnchor[t.State[\"scrollProperty\"+(\"Left\"===D?\"Top\":\"Left\")]],A=m(f).offset()[D.toLowerCase()]+E),i={scroll:{rootPropertyValue:!1,startValue:w,currentValue:w,endValue:A,unitType:\"\",easing:h.easing,scrollData:{container:h.container,direction:D,alternateValue:z}},element:f},t.debug&&console.log(\"tweensContainer (scroll): \",i.scroll,f)}else if(\"reverse\"===C){if(!g(f).tweensContainer)return void m.dequeue(f,h.queue);\"none\"===g(f).opts.display&&(g(f).opts.display=\"auto\"),\"hidden\"===g(f).opts.visibility&&(g(f).opts.visibility=\"visible\"),g(f).opts.loop=!1,g(f).opts.begin=null,g(f).opts.complete=null,s.easing||delete h.easing,s.duration||delete h.duration,h=m.extend({},g(f).opts,h);var F=m.extend(!0,{},g(f).tweensContainer);for(var G in F)if(\"element\"!==G){var H=F[G].startValue;F[G].startValue=F[G].currentValue=F[G].endValue,F[G].endValue=H,p.isEmptyObject(s)||(F[G].easing=h.easing),t.debug&&console.log(\"reverse tweensContainer (\"+G+\"): \"+JSON.stringify(F[G]),f)}i=F}else if(\"start\"===C){var F;g(f).tweensContainer&&g(f).isAnimating===!0&&(F=g(f).tweensContainer),m.each(q,function(a,b){if(RegExp(\"^\"+v.Lists.colors.join(\"$|^\")+\"$\").test(a)){var c=l(b,!0),e=c[0],f=c[1],g=c[2];if(v.RegEx.isHex.test(e)){for(var h=[\"Red\",\"Green\",\"Blue\"],i=v.Values.hexToRgb(e),j=g?v.Values.hexToRgb(g):d,k=0;k<h.length;k++){var m=[i[k]];f&&m.push(f),j!==d&&m.push(j[k]),q[a+h[k]]=m}delete q[a]}}});for(var K in q){var L=l(q[K]),M=L[0],N=L[1],O=L[2];K=v.Names.camelCase(K);var P=v.Hooks.getRoot(K),Q=!1;if(g(f).isSVG||\"tween\"===P||v.Names.prefixCheck(P)[1]!==!1||v.Normalizations.registered[P]!==d){(h.display!==d&&null!==h.display&&\"none\"!==h.display||h.visibility!==d&&\"hidden\"!==h.visibility)&&/opacity|filter/.test(K)&&!O&&0!==M&&(O=0),h._cacheValues&&F&&F[K]?(O===d&&(O=F[K].endValue+F[K].unitType),Q=g(f).rootPropertyValueCache[P]):v.Hooks.registered[K]?O===d?(Q=v.getPropertyValue(f,P),O=v.getPropertyValue(f,K,Q)):Q=v.Hooks.templates[P][1]:O===d&&(O=v.getPropertyValue(f,K));var R,S,T,U=!1;if(R=n(K,O),O=R[0],T=R[1],R=n(K,M),M=R[0].replace(/^([+-\\/*])=/,function(a,b){return U=b,\"\"}),S=R[1],O=parseFloat(O)||0,M=parseFloat(M)||0,\"%\"===S&&(/^(fontSize|lineHeight)$/.test(K)?(M/=100,S=\"em\"):/^scale/.test(K)?(M/=100,S=\"\"):/(Red|Green|Blue)$/i.test(K)&&(M=M/100*255,S=\"\")),/[\\/*]/.test(U))S=T;else if(T!==S&&0!==O)if(0===M)S=T;else{e=e||r();var V=/margin|padding|left|right|width|text|word|letter/i.test(K)||/X$/.test(K)||\"x\"===K?\"x\":\"y\";\nswitch(T){case\"%\":O*=\"x\"===V?e.percentToPxWidth:e.percentToPxHeight;break;case\"px\":break;default:O*=e[T+\"ToPx\"]}switch(S){case\"%\":O*=1/(\"x\"===V?e.percentToPxWidth:e.percentToPxHeight);break;case\"px\":break;default:O*=1/e[S+\"ToPx\"]}}switch(U){case\"+\":M=O+M;break;case\"-\":M=O-M;break;case\"*\":M=O*M;break;case\"/\":M=O/M}i[K]={rootPropertyValue:Q,startValue:O,currentValue:O,endValue:M,unitType:S,easing:N},t.debug&&console.log(\"tweensContainer (\"+K+\"): \"+JSON.stringify(i[K]),f)}else t.debug&&console.log(\"Skipping [\"+P+\"] due to a lack of browser support.\")}i.element=f}i.element&&(v.Values.addClass(f,\"velocity-animating\"),J.push(i),\"\"===h.queue&&(g(f).tweensContainer=i,g(f).opts=h),g(f).isAnimating=!0,y===x-1?(t.State.calls.push([J,o,h,null,B.resolver]),t.State.isTicking===!1&&(t.State.isTicking=!0,k())):y++)}var e,f=this,h=m.extend({},t.defaults,s),i={};switch(g(f)===d&&t.init(f),parseFloat(h.delay)&&h.queue!==!1&&m.queue(f,h.queue,function(a){t.velocityQueueEntryFlag=!0,g(f).delayTimer={setTimeout:setTimeout(a,parseFloat(h.delay)),next:a}}),h.duration.toString().toLowerCase()){case\"fast\":h.duration=200;break;case\"normal\":h.duration=r;break;case\"slow\":h.duration=600;break;default:h.duration=parseFloat(h.duration)||1}t.mock!==!1&&(t.mock===!0?h.duration=h.delay=1:(h.duration*=parseFloat(t.mock)||1,h.delay*=parseFloat(t.mock)||1)),h.easing=j(h.easing,h.duration),h.begin&&!p.isFunction(h.begin)&&(h.begin=null),h.progress&&!p.isFunction(h.progress)&&(h.progress=null),h.complete&&!p.isFunction(h.complete)&&(h.complete=null),h.display!==d&&null!==h.display&&(h.display=h.display.toString().toLowerCase(),\"auto\"===h.display&&(h.display=t.CSS.Values.getDisplayType(f))),h.visibility!==d&&null!==h.visibility&&(h.visibility=h.visibility.toString().toLowerCase()),h.mobileHA=h.mobileHA&&t.State.isMobile&&!t.State.isGingerbread,h.queue===!1?h.delay?setTimeout(a,h.delay):a():m.queue(f,h.queue,function(b,c){return c===!0?(B.promise&&B.resolver(o),!0):(t.velocityQueueEntryFlag=!0,void a(b))}),\"\"!==h.queue&&\"fx\"!==h.queue||\"inprogress\"===m.queue(f)[0]||m.dequeue(f)}var h,i,n,o,q,s,u=arguments[0]&&(arguments[0].p||m.isPlainObject(arguments[0].properties)&&!arguments[0].properties.names||p.isString(arguments[0].properties));if(p.isWrapped(this)?(h=!1,n=0,o=this,i=this):(h=!0,n=1,o=u?arguments[0].elements||arguments[0].e:arguments[0]),o=f(o)){u?(q=arguments[0].properties||arguments[0].p,s=arguments[0].options||arguments[0].o):(q=arguments[n],s=arguments[n+1]);var x=o.length,y=0;if(!/^(stop|finish)$/i.test(q)&&!m.isPlainObject(s)){var z=n+1;s={};for(var A=z;A<arguments.length;A++)p.isArray(arguments[A])||!/^(fast|normal|slow)$/i.test(arguments[A])&&!/^\\d/.test(arguments[A])?p.isString(arguments[A])||p.isArray(arguments[A])?s.easing=arguments[A]:p.isFunction(arguments[A])&&(s.complete=arguments[A]):s.duration=arguments[A]}var B={promise:null,resolver:null,rejecter:null};h&&t.Promise&&(B.promise=new t.Promise(function(a,b){B.resolver=a,B.rejecter=b}));var C;switch(q){case\"scroll\":C=\"scroll\";break;case\"reverse\":C=\"reverse\";break;case\"finish\":case\"stop\":m.each(o,function(a,b){g(b)&&g(b).delayTimer&&(clearTimeout(g(b).delayTimer.setTimeout),g(b).delayTimer.next&&g(b).delayTimer.next(),delete g(b).delayTimer)});var D=[];return m.each(t.State.calls,function(a,b){b&&m.each(b[1],function(c,e){var f=s===d?\"\":s;return f===!0||b[2].queue===f||s===d&&b[2].queue===!1?void m.each(o,function(c,d){d===e&&((s===!0||p.isString(s))&&(m.each(m.queue(d,p.isString(s)?s:\"\"),function(a,b){p.isFunction(b)&&b(null,!0)}),m.queue(d,p.isString(s)?s:\"\",[])),\"stop\"===q?(g(d)&&g(d).tweensContainer&&f!==!1&&m.each(g(d).tweensContainer,function(a,b){b.endValue=b.currentValue}),D.push(a)):\"finish\"===q&&(b[2].duration=1))}):!0})}),\"stop\"===q&&(m.each(D,function(a,b){l(b,!0)}),B.promise&&B.resolver(o)),a();default:if(!m.isPlainObject(q)||p.isEmptyObject(q)){if(p.isString(q)&&t.Redirects[q]){var E=m.extend({},s),F=E.duration,G=E.delay||0;return E.backwards===!0&&(o=m.extend(!0,[],o).reverse()),m.each(o,function(a,b){parseFloat(E.stagger)?E.delay=G+parseFloat(E.stagger)*a:p.isFunction(E.stagger)&&(E.delay=G+E.stagger.call(b,a,x)),E.drag&&(E.duration=parseFloat(F)||(/^(callout|transition)/.test(q)?1e3:r),E.duration=Math.max(E.duration*(E.backwards?1-a/x:(a+1)/x),.75*E.duration,200)),t.Redirects[q].call(b,b,E||{},a,x,o,B.promise?B:d)}),a()}var H=\"Velocity: First argument (\"+q+\") was not a property map, a known action, or a registered redirect. Aborting.\";return B.promise?B.rejecter(new Error(H)):console.log(H),a()}C=\"start\"}var I={lastParent:null,lastPosition:null,lastFontSize:null,lastPercentToPxWidth:null,lastPercentToPxHeight:null,lastEmToPx:null,remToPx:null,vwToPx:null,vhToPx:null},J=[];m.each(o,function(a,b){p.isNode(b)&&e.call(b)});var K,E=m.extend({},t.defaults,s);if(E.loop=parseInt(E.loop),K=2*E.loop-1,E.loop)for(var L=0;K>L;L++){var M={delay:E.delay,progress:E.progress};L===K-1&&(M.display=E.display,M.visibility=E.visibility,M.complete=E.complete),w(o,\"reverse\",M)}return a()}};t=m.extend(w,t),t.animate=w;var x=b.requestAnimationFrame||o;return t.State.isMobile||c.hidden===d||c.addEventListener(\"visibilitychange\",function(){c.hidden?(x=function(a){return setTimeout(function(){a(!0)},16)},k()):x=b.requestAnimationFrame||o}),a.Velocity=t,a!==b&&(a.fn.velocity=w,a.fn.velocity.defaults=t.defaults),m.each([\"Down\",\"Up\"],function(a,b){t.Redirects[\"slide\"+b]=function(a,c,e,f,g,h){var i=m.extend({},c),j=i.begin,k=i.complete,l={height:\"\",marginTop:\"\",marginBottom:\"\",paddingTop:\"\",paddingBottom:\"\"},n={};i.display===d&&(i.display=\"Down\"===b?\"inline\"===t.CSS.Values.getDisplayType(a)?\"inline-block\":\"block\":\"none\"),i.begin=function(){j&&j.call(g,g);for(var c in l){n[c]=a.style[c];var d=t.CSS.getPropertyValue(a,c);l[c]=\"Down\"===b?[d,0]:[0,d]}n.overflow=a.style.overflow,a.style.overflow=\"hidden\"},i.complete=function(){for(var b in n)a.style[b]=n[b];k&&k.call(g,g),h&&h.resolver(g)},t(a,l,i)}}),m.each([\"In\",\"Out\"],function(a,b){t.Redirects[\"fade\"+b]=function(a,c,e,f,g,h){var i=m.extend({},c),j={opacity:\"In\"===b?1:0},k=i.complete;i.complete=e!==f-1?i.begin=null:function(){k&&k.call(g,g),h&&h.resolver(g)},i.display===d&&(i.display=\"In\"===b?\"auto\":\"none\"),t(this,j,i)}}),t}(window.jQuery||window.Zepto||window,window,document)})),!function(a,b,c,d){\"use strict\";function e(a,b,c){return setTimeout(k(a,c),b)}function f(a,b,c){return Array.isArray(a)?(g(a,c[b],c),!0):!1}function g(a,b,c){var e;if(a)if(a.forEach)a.forEach(b,c);else if(a.length!==d)for(e=0;e<a.length;)b.call(c,a[e],e,a),e++;else for(e in a)a.hasOwnProperty(e)&&b.call(c,a[e],e,a)}function h(a,b,c){for(var e=Object.keys(b),f=0;f<e.length;)(!c||c&&a[e[f]]===d)&&(a[e[f]]=b[e[f]]),f++;return a}function i(a,b){return h(a,b,!0)}function j(a,b,c){var d,e=b.prototype;d=a.prototype=Object.create(e),d.constructor=a,d._super=e,c&&h(d,c)}function k(a,b){return function(){return a.apply(b,arguments)}}function l(a,b){return typeof a==ka?a.apply(b?b[0]||d:d,b):a}function m(a,b){return a===d?b:a}function n(a,b,c){g(r(b),function(b){a.addEventListener(b,c,!1)})}function o(a,b,c){g(r(b),function(b){a.removeEventListener(b,c,!1)})}function p(a,b){for(;a;){if(a==b)return!0;a=a.parentNode}return!1}function q(a,b){return a.indexOf(b)>-1}function r(a){return a.trim().split(/\\s+/g)}function s(a,b,c){if(a.indexOf&&!c)return a.indexOf(b);for(var d=0;d<a.length;){if(c&&a[d][c]==b||!c&&a[d]===b)return d;d++}return-1}function t(a){return Array.prototype.slice.call(a,0)}function u(a,b,c){for(var d=[],e=[],f=0;f<a.length;){var g=b?a[f][b]:a[f];s(e,g)<0&&d.push(a[f]),e[f]=g,f++}return c&&(d=b?d.sort(function(a,c){return a[b]>c[b]}):d.sort()),d}function v(a,b){for(var c,e,f=b[0].toUpperCase()+b.slice(1),g=0;g<ia.length;){if(c=ia[g],e=c?c+f:b,e in a)return e;g++}return d}function w(){return oa++}function x(a){var b=a.ownerDocument;return b.defaultView||b.parentWindow}function y(a,b){var c=this;this.manager=a,this.callback=b,this.element=a.element,this.target=a.options.inputTarget,this.domHandler=function(b){l(a.options.enable,[a])&&c.handler(b)},this.init()}function z(a){var b,c=a.options.inputClass;return new(b=c?c:ra?N:sa?Q:qa?S:M)(a,A)}function A(a,b,c){var d=c.pointers.length,e=c.changedPointers.length,f=b&ya&&0===d-e,g=b&(Aa|Ba)&&0===d-e;c.isFirst=!!f,c.isFinal=!!g,f&&(a.session={}),c.eventType=b,B(a,c),a.emit(\"hammer.input\",c),a.recognize(c),a.session.prevInput=c}function B(a,b){var c=a.session,d=b.pointers,e=d.length;c.firstInput||(c.firstInput=E(b)),e>1&&!c.firstMultiple?c.firstMultiple=E(b):1===e&&(c.firstMultiple=!1);var f=c.firstInput,g=c.firstMultiple,h=g?g.center:f.center,i=b.center=F(d);b.timeStamp=na(),b.deltaTime=b.timeStamp-f.timeStamp,b.angle=J(h,i),b.distance=I(h,i),C(c,b),b.offsetDirection=H(b.deltaX,b.deltaY),b.scale=g?L(g.pointers,d):1,b.rotation=g?K(g.pointers,d):0,D(c,b);var j=a.element;p(b.srcEvent.target,j)&&(j=b.srcEvent.target),b.target=j}function C(a,b){var c=b.center,d=a.offsetDelta||{},e=a.prevDelta||{},f=a.prevInput||{};(b.eventType===ya||f.eventType===Aa)&&(e=a.prevDelta={x:f.deltaX||0,y:f.deltaY||0},d=a.offsetDelta={x:c.x,y:c.y}),b.deltaX=e.x+(c.x-d.x),b.deltaY=e.y+(c.y-d.y)}function D(a,b){var c,e,f,g,h=a.lastInterval||b,i=b.timeStamp-h.timeStamp;if(b.eventType!=Ba&&(i>xa||h.velocity===d)){var j=h.deltaX-b.deltaX,k=h.deltaY-b.deltaY,l=G(i,j,k);e=l.x,f=l.y,c=ma(l.x)>ma(l.y)?l.x:l.y,g=H(j,k),a.lastInterval=b}else c=h.velocity,e=h.velocityX,f=h.velocityY,g=h.direction;b.velocity=c,b.velocityX=e,b.velocityY=f,b.direction=g}function E(a){for(var b=[],c=0;c<a.pointers.length;)b[c]={clientX:la(a.pointers[c].clientX),clientY:la(a.pointers[c].clientY)},c++;return{timeStamp:na(),pointers:b,center:F(b),deltaX:a.deltaX,deltaY:a.deltaY}}function F(a){var b=a.length;if(1===b)return{x:la(a[0].clientX),y:la(a[0].clientY)};for(var c=0,d=0,e=0;b>e;)c+=a[e].clientX,d+=a[e].clientY,e++;return{x:la(c/b),y:la(d/b)}}function G(a,b,c){return{x:b/a||0,y:c/a||0}}function H(a,b){return a===b?Ca:ma(a)>=ma(b)?a>0?Da:Ea:b>0?Fa:Ga}function I(a,b,c){c||(c=Ka);var d=b[c[0]]-a[c[0]],e=b[c[1]]-a[c[1]];return Math.sqrt(d*d+e*e)}function J(a,b,c){c||(c=Ka);var d=b[c[0]]-a[c[0]],e=b[c[1]]-a[c[1]];return 180*Math.atan2(e,d)/Math.PI}function K(a,b){return J(b[1],b[0],La)-J(a[1],a[0],La)}function L(a,b){return I(b[0],b[1],La)/I(a[0],a[1],La)}function M(){this.evEl=Na,this.evWin=Oa,this.allow=!0,this.pressed=!1,y.apply(this,arguments)}function N(){this.evEl=Ra,this.evWin=Sa,y.apply(this,arguments),this.store=this.manager.session.pointerEvents=[]}function O(){this.evTarget=Ua,this.evWin=Va,this.started=!1,y.apply(this,arguments)}function P(a,b){var c=t(a.touches),d=t(a.changedTouches);return b&(Aa|Ba)&&(c=u(c.concat(d),\"identifier\",!0)),[c,d]}function Q(){this.evTarget=Xa,this.targetIds={},y.apply(this,arguments)}function R(a,b){var c=t(a.touches),d=this.targetIds;if(b&(ya|za)&&1===c.length)return d[c[0].identifier]=!0,[c,c];var e,f,g=t(a.changedTouches),h=[],i=this.target;if(f=c.filter(function(a){return p(a.target,i)}),b===ya)for(e=0;e<f.length;)d[f[e].identifier]=!0,e++;for(e=0;e<g.length;)d[g[e].identifier]&&h.push(g[e]),b&(Aa|Ba)&&delete d[g[e].identifier],e++;return h.length?[u(f.concat(h),\"identifier\",!0),h]:void 0}function S(){y.apply(this,arguments);var a=k(this.handler,this);this.touch=new Q(this.manager,a),this.mouse=new M(this.manager,a)}function T(a,b){this.manager=a,this.set(b)}function U(a){if(q(a,bb))return bb;var b=q(a,cb),c=q(a,db);return b&&c?cb+\" \"+db:b||c?b?cb:db:q(a,ab)?ab:_a}function V(a){this.id=w(),this.manager=null,this.options=i(a||{},this.defaults),this.options.enable=m(this.options.enable,!0),this.state=eb,this.simultaneous={},this.requireFail=[]}function W(a){return a&jb?\"cancel\":a&hb?\"end\":a&gb?\"move\":a&fb?\"start\":\"\"}function X(a){return a==Ga?\"down\":a==Fa?\"up\":a==Da?\"left\":a==Ea?\"right\":\"\"}function Y(a,b){var c=b.manager;return c?c.get(a):a}function Z(){V.apply(this,arguments)}function $(){Z.apply(this,arguments),this.pX=null,this.pY=null}function _(){Z.apply(this,arguments)}function aa(){V.apply(this,arguments),this._timer=null,this._input=null}function ba(){Z.apply(this,arguments)}function ca(){Z.apply(this,arguments)}function da(){V.apply(this,arguments),this.pTime=!1,this.pCenter=!1,this._timer=null,this._input=null,this.count=0}function ea(a,b){return b=b||{},b.recognizers=m(b.recognizers,ea.defaults.preset),new fa(a,b)}function fa(a,b){b=b||{},this.options=i(b,ea.defaults),this.options.inputTarget=this.options.inputTarget||a,this.handlers={},this.session={},this.recognizers=[],this.element=a,this.input=z(this),this.touchAction=new T(this,this.options.touchAction),ga(this,!0),g(b.recognizers,function(a){var b=this.add(new a[0](a[1]));a[2]&&b.recognizeWith(a[2]),a[3]&&b.requireFailure(a[3])},this)}function ga(a,b){var c=a.element;g(a.options.cssProps,function(a,d){c.style[v(c.style,d)]=b?a:\"\"})}function ha(a,c){var d=b.createEvent(\"Event\");d.initEvent(a,!0,!0),d.gesture=c,c.target.dispatchEvent(d)}var ia=[\"\",\"webkit\",\"moz\",\"MS\",\"ms\",\"o\"],ja=b.createElement(\"div\"),ka=\"function\",la=Math.round,ma=Math.abs,na=Date.now,oa=1,pa=/mobile|tablet|ip(ad|hone|od)|android/i,qa=\"ontouchstart\"in a,ra=v(a,\"PointerEvent\")!==d,sa=qa&&pa.test(navigator.userAgent),ta=\"touch\",ua=\"pen\",va=\"mouse\",wa=\"kinect\",xa=25,ya=1,za=2,Aa=4,Ba=8,Ca=1,Da=2,Ea=4,Fa=8,Ga=16,Ha=Da|Ea,Ia=Fa|Ga,Ja=Ha|Ia,Ka=[\"x\",\"y\"],La=[\"clientX\",\"clientY\"];y.prototype={handler:function(){},init:function(){this.evEl&&n(this.element,this.evEl,this.domHandler),this.evTarget&&n(this.target,this.evTarget,this.domHandler),this.evWin&&n(x(this.element),this.evWin,this.domHandler)},destroy:function(){this.evEl&&o(this.element,this.evEl,this.domHandler),this.evTarget&&o(this.target,this.evTarget,this.domHandler),this.evWin&&o(x(this.element),this.evWin,this.domHandler)}};var Ma={mousedown:ya,mousemove:za,mouseup:Aa},Na=\"mousedown\",Oa=\"mousemove mouseup\";j(M,y,{handler:function(a){var b=Ma[a.type];b&ya&&0===a.button&&(this.pressed=!0),b&za&&1!==a.which&&(b=Aa),this.pressed&&this.allow&&(b&Aa&&(this.pressed=!1),this.callback(this.manager,b,{pointers:[a],changedPointers:[a],pointerType:va,srcEvent:a}))}});var Pa={pointerdown:ya,pointermove:za,pointerup:Aa,pointercancel:Ba,pointerout:Ba},Qa={2:ta,3:ua,4:va,5:wa},Ra=\"pointerdown\",Sa=\"pointermove pointerup pointercancel\";a.MSPointerEvent&&(Ra=\"MSPointerDown\",Sa=\"MSPointerMove MSPointerUp MSPointerCancel\"),j(N,y,{handler:function(a){var b=this.store,c=!1,d=a.type.toLowerCase().replace(\"ms\",\"\"),e=Pa[d],f=Qa[a.pointerType]||a.pointerType,g=f==ta,h=s(b,a.pointerId,\"pointerId\");e&ya&&(0===a.button||g)?0>h&&(b.push(a),h=b.length-1):e&(Aa|Ba)&&(c=!0),0>h||(b[h]=a,this.callback(this.manager,e,{pointers:b,changedPointers:[a],pointerType:f,srcEvent:a}),c&&b.splice(h,1))}});var Ta={touchstart:ya,touchmove:za,touchend:Aa,touchcancel:Ba},Ua=\"touchstart\",Va=\"touchstart touchmove touchend touchcancel\";j(O,y,{handler:function(a){var b=Ta[a.type];if(b===ya&&(this.started=!0),this.started){var c=P.call(this,a,b);b&(Aa|Ba)&&0===c[0].length-c[1].length&&(this.started=!1),this.callback(this.manager,b,{pointers:c[0],changedPointers:c[1],pointerType:ta,srcEvent:a})}}});var Wa={touchstart:ya,touchmove:za,touchend:Aa,touchcancel:Ba},Xa=\"touchstart touchmove touchend touchcancel\";j(Q,y,{handler:function(a){var b=Wa[a.type],c=R.call(this,a,b);c&&this.callback(this.manager,b,{pointers:c[0],changedPointers:c[1],pointerType:ta,srcEvent:a})}}),j(S,y,{handler:function(a,b,c){var d=c.pointerType==ta,e=c.pointerType==va;if(d)this.mouse.allow=!1;else if(e&&!this.mouse.allow)return;b&(Aa|Ba)&&(this.mouse.allow=!0),this.callback(a,b,c)},destroy:function(){this.touch.destroy(),this.mouse.destroy()}});var Ya=v(ja.style,\"touchAction\"),Za=Ya!==d,$a=\"compute\",_a=\"auto\",ab=\"manipulation\",bb=\"none\",cb=\"pan-x\",db=\"pan-y\";T.prototype={set:function(a){a==$a&&(a=this.compute()),Za&&(this.manager.element.style[Ya]=a),this.actions=a.toLowerCase().trim()},update:function(){this.set(this.manager.options.touchAction)},compute:function(){var a=[];return g(this.manager.recognizers,function(b){l(b.options.enable,[b])&&(a=a.concat(b.getTouchAction()))}),U(a.join(\" \"))},preventDefaults:function(a){if(!Za){var b=a.srcEvent,c=a.offsetDirection;if(this.manager.session.prevented)return void b.preventDefault();var d=this.actions,e=q(d,bb),f=q(d,db),g=q(d,cb);return e||f&&c&Ha||g&&c&Ia?this.preventSrc(b):void 0}},preventSrc:function(a){this.manager.session.prevented=!0,a.preventDefault()}};var eb=1,fb=2,gb=4,hb=8,ib=hb,jb=16,kb=32;V.prototype={defaults:{},set:function(a){return h(this.options,a),this.manager&&this.manager.touchAction.update(),this},recognizeWith:function(a){if(f(a,\"recognizeWith\",this))return this;var b=this.simultaneous;return a=Y(a,this),b[a.id]||(b[a.id]=a,a.recognizeWith(this)),this},dropRecognizeWith:function(a){return f(a,\"dropRecognizeWith\",this)?this:(a=Y(a,this),delete this.simultaneous[a.id],this)},requireFailure:function(a){if(f(a,\"requireFailure\",this))return this;var b=this.requireFail;return a=Y(a,this),-1===s(b,a)&&(b.push(a),a.requireFailure(this)),this},dropRequireFailure:function(a){if(f(a,\"dropRequireFailure\",this))return this;a=Y(a,this);var b=s(this.requireFail,a);return b>-1&&this.requireFail.splice(b,1),this},hasRequireFailures:function(){return this.requireFail.length>0},canRecognizeWith:function(a){return!!this.simultaneous[a.id]},emit:function(a){function b(b){c.manager.emit(c.options.event+(b?W(d):\"\"),a)}var c=this,d=this.state;hb>d&&b(!0),b(),d>=hb&&b(!0)},tryEmit:function(a){return this.canEmit()?this.emit(a):void(this.state=kb)},canEmit:function(){for(var a=0;a<this.requireFail.length;){if(!(this.requireFail[a].state&(kb|eb)))return!1;a++}return!0},recognize:function(a){var b=h({},a);return l(this.options.enable,[this,b])?(this.state&(ib|jb|kb)&&(this.state=eb),this.state=this.process(b),void(this.state&(fb|gb|hb|jb)&&this.tryEmit(b))):(this.reset(),void(this.state=kb))},process:function(){},getTouchAction:function(){},reset:function(){}},j(Z,V,{defaults:{pointers:1},attrTest:function(a){var b=this.options.pointers;return 0===b||a.pointers.length===b},process:function(a){var b=this.state,c=a.eventType,d=b&(fb|gb),e=this.attrTest(a);return d&&(c&Ba||!e)?b|jb:d||e?c&Aa?b|hb:b&fb?b|gb:fb:kb}}),j($,Z,{defaults:{event:\"pan\",threshold:10,pointers:1,direction:Ja},getTouchAction:function(){var a=this.options.direction,b=[];return a&Ha&&b.push(db),a&Ia&&b.push(cb),b},directionTest:function(a){var b=this.options,c=!0,d=a.distance,e=a.direction,f=a.deltaX,g=a.deltaY;return e&b.direction||(b.direction&Ha?(e=0===f?Ca:0>f?Da:Ea,c=f!=this.pX,d=Math.abs(a.deltaX)):(e=0===g?Ca:0>g?Fa:Ga,c=g!=this.pY,d=Math.abs(a.deltaY))),a.direction=e,c&&d>b.threshold&&e&b.direction},attrTest:function(a){return Z.prototype.attrTest.call(this,a)&&(this.state&fb||!(this.state&fb)&&this.directionTest(a))},emit:function(a){this.pX=a.deltaX,this.pY=a.deltaY;var b=X(a.direction);b&&this.manager.emit(this.options.event+b,a),this._super.emit.call(this,a)}}),j(_,Z,{defaults:{event:\"pinch\",threshold:0,pointers:2},getTouchAction:function(){return[bb]},attrTest:function(a){return this._super.attrTest.call(this,a)&&(Math.abs(a.scale-1)>this.options.threshold||this.state&fb)},emit:function(a){if(this._super.emit.call(this,a),1!==a.scale){var b=a.scale<1?\"in\":\"out\";this.manager.emit(this.options.event+b,a)}}}),j(aa,V,{defaults:{event:\"press\",pointers:1,time:500,threshold:5},getTouchAction:function(){return[_a]},process:function(a){var b=this.options,c=a.pointers.length===b.pointers,d=a.distance<b.threshold,f=a.deltaTime>b.time;if(this._input=a,!d||!c||a.eventType&(Aa|Ba)&&!f)this.reset();else if(a.eventType&ya)this.reset(),this._timer=e(function(){this.state=ib,this.tryEmit()},b.time,this);else if(a.eventType&Aa)return ib;return kb},reset:function(){clearTimeout(this._timer)},emit:function(a){this.state===ib&&(a&&a.eventType&Aa?this.manager.emit(this.options.event+\"up\",a):(this._input.timeStamp=na(),this.manager.emit(this.options.event,this._input)))}}),j(ba,Z,{defaults:{event:\"rotate\",threshold:0,pointers:2},getTouchAction:function(){return[bb]},attrTest:function(a){return this._super.attrTest.call(this,a)&&(Math.abs(a.rotation)>this.options.threshold||this.state&fb)}}),j(ca,Z,{defaults:{event:\"swipe\",threshold:10,velocity:.65,direction:Ha|Ia,pointers:1},getTouchAction:function(){return $.prototype.getTouchAction.call(this)},attrTest:function(a){var b,c=this.options.direction;return c&(Ha|Ia)?b=a.velocity:c&Ha?b=a.velocityX:c&Ia&&(b=a.velocityY),this._super.attrTest.call(this,a)&&c&a.direction&&a.distance>this.options.threshold&&ma(b)>this.options.velocity&&a.eventType&Aa},emit:function(a){var b=X(a.direction);b&&this.manager.emit(this.options.event+b,a),this.manager.emit(this.options.event,a)}}),j(da,V,{defaults:{event:\"tap\",pointers:1,taps:1,interval:300,time:250,threshold:2,posThreshold:10},getTouchAction:function(){return[ab]},process:function(a){var b=this.options,c=a.pointers.length===b.pointers,d=a.distance<b.threshold,f=a.deltaTime<b.time;if(this.reset(),a.eventType&ya&&0===this.count)return this.failTimeout();if(d&&f&&c){if(a.eventType!=Aa)return this.failTimeout();var g=this.pTime?a.timeStamp-this.pTime<b.interval:!0,h=!this.pCenter||I(this.pCenter,a.center)<b.posThreshold;this.pTime=a.timeStamp,this.pCenter=a.center,h&&g?this.count+=1:this.count=1,this._input=a;var i=this.count%b.taps;if(0===i)return this.hasRequireFailures()?(this._timer=e(function(){this.state=ib,this.tryEmit()},b.interval,this),fb):ib}return kb},failTimeout:function(){return this._timer=e(function(){this.state=kb},this.options.interval,this),kb},reset:function(){clearTimeout(this._timer)},emit:function(){this.state==ib&&(this._input.tapCount=this.count,this.manager.emit(this.options.event,this._input))}}),ea.VERSION=\"2.0.4\",ea.defaults={domEvents:!1,touchAction:$a,enable:!0,inputTarget:null,inputClass:null,preset:[[ba,{enable:!1}],[_,{enable:!1},[\"rotate\"]],[ca,{direction:Ha}],[$,{direction:Ha},[\"swipe\"]],[da],[da,{event:\"doubletap\",taps:2},[\"tap\"]],[aa]],cssProps:{userSelect:\"default\",touchSelect:\"none\",touchCallout:\"none\",contentZooming:\"none\",userDrag:\"none\",tapHighlightColor:\"rgba(0,0,0,0)\"}};var lb=1,mb=2;fa.prototype={set:function(a){return h(this.options,a),a.touchAction&&this.touchAction.update(),a.inputTarget&&(this.input.destroy(),this.input.target=a.inputTarget,this.input.init()),this},stop:function(a){this.session.stopped=a?mb:lb},recognize:function(a){var b=this.session;if(!b.stopped){this.touchAction.preventDefaults(a);var c,d=this.recognizers,e=b.curRecognizer;(!e||e&&e.state&ib)&&(e=b.curRecognizer=null);for(var f=0;f<d.length;)c=d[f],b.stopped===mb||e&&c!=e&&!c.canRecognizeWith(e)?c.reset():c.recognize(a),!e&&c.state&(fb|gb|hb)&&(e=b.curRecognizer=c),f++}},get:function(a){if(a instanceof V)return a;for(var b=this.recognizers,c=0;c<b.length;c++)if(b[c].options.event==a)return b[c];return null},add:function(a){if(f(a,\"add\",this))return this;var b=this.get(a.options.event);return b&&this.remove(b),this.recognizers.push(a),a.manager=this,this.touchAction.update(),a},remove:function(a){if(f(a,\"remove\",this))return this;var b=this.recognizers;return a=this.get(a),b.splice(s(b,a),1),this.touchAction.update(),this},on:function(a,b){var c=this.handlers;return g(r(a),function(a){c[a]=c[a]||[],c[a].push(b)}),this},off:function(a,b){var c=this.handlers;return g(r(a),function(a){b?c[a].splice(s(c[a],b),1):delete c[a]}),this},emit:function(a,b){this.options.domEvents&&ha(a,b);var c=this.handlers[a]&&this.handlers[a].slice();if(c&&c.length){b.type=a,b.preventDefault=function(){b.srcEvent.preventDefault()};for(var d=0;d<c.length;)c[d](b),d++}},destroy:function(){this.element&&ga(this,!1),this.handlers={},this.session={},this.input.destroy(),this.element=null}},h(ea,{INPUT_START:ya,INPUT_MOVE:za,INPUT_END:Aa,INPUT_CANCEL:Ba,STATE_POSSIBLE:eb,STATE_BEGAN:fb,STATE_CHANGED:gb,STATE_ENDED:hb,STATE_RECOGNIZED:ib,STATE_CANCELLED:jb,STATE_FAILED:kb,DIRECTION_NONE:Ca,DIRECTION_LEFT:Da,DIRECTION_RIGHT:Ea,DIRECTION_UP:Fa,DIRECTION_DOWN:Ga,DIRECTION_HORIZONTAL:Ha,DIRECTION_VERTICAL:Ia,DIRECTION_ALL:Ja,Manager:fa,Input:y,TouchAction:T,TouchInput:Q,MouseInput:M,PointerEventInput:N,TouchMouseInput:S,SingleTouchInput:O,Recognizer:V,AttrRecognizer:Z,Tap:da,Pan:$,Swipe:ca,Pinch:_,Rotate:ba,Press:aa,on:n,off:o,each:g,merge:i,extend:h,inherit:j,bindFn:k,prefixed:v}),typeof define==ka&&define.amd?define(function(){return ea}):\"undefined\"!=typeof module&&module.exports?module.exports=ea:a[c]=ea}(window,document,\"Hammer\"),function(a){\"function\"==typeof define&&define.amd?define([\"jquery\",\"hammerjs\"],a):\"object\"==typeof exports?a(require(\"jquery\"),require(\"hammerjs\")):a(jQuery,Hammer)}(function(a,b){function c(c,d){var e=a(c);e.data(\"hammer\")||e.data(\"hammer\",new b(e[0],d))}a.fn.hammer=function(a){return this.each(function(){c(this,a)})},b.Manager.prototype.emit=function(b){return function(c,d){b.call(this,c,d),a(this.element).trigger({type:c,gesture:d})}}(b.Manager.prototype.emit)}),function(a){a.Package?Materialize={}:a.Materialize={}}(window),Materialize.guid=function(){function a(){return Math.floor(65536*(1+Math.random())).toString(16).substring(1)}return function(){return a()+a()+\"-\"+a()+\"-\"+a()+\"-\"+a()+\"-\"+a()+a()+a()}}(),Materialize.elementOrParentIsFixed=function(a){var b=$(a),c=b.add(b.parents()),d=!1;return c.each(function(){return\"fixed\"===$(this).css(\"position\")?(d=!0,!1):void 0}),d};var Vel;Vel=$?$.Velocity:jQuery?jQuery.Velocity:Velocity,function(a){a.fn.collapsible=function(b){var c={accordion:void 0};return b=a.extend(c,b),this.each(function(){function c(b){h=g.find(\"> li > .collapsible-header\"),b.hasClass(\"active\")?b.parent().addClass(\"active\"):b.parent().removeClass(\"active\"),b.parent().hasClass(\"active\")?b.siblings(\".collapsible-body\").stop(!0,!1).slideDown({duration:350,easing:\"easeOutQuart\",queue:!1,complete:function(){a(this).css(\"height\",\"\")}}):b.siblings(\".collapsible-body\").stop(!0,!1).slideUp({duration:350,easing:\"easeOutQuart\",queue:!1,complete:function(){a(this).css(\"height\",\"\")}}),h.not(b).removeClass(\"active\").parent().removeClass(\"active\"),h.not(b).parent().children(\".collapsible-body\").stop(!0,!1).slideUp({duration:350,easing:\"easeOutQuart\",queue:!1,complete:function(){a(this).css(\"height\",\"\")}})}function d(b){b.hasClass(\"active\")?b.parent().addClass(\"active\"):b.parent().removeClass(\"active\"),b.parent().hasClass(\"active\")?b.siblings(\".collapsible-body\").stop(!0,!1).slideDown({duration:350,easing:\"easeOutQuart\",queue:!1,complete:function(){a(this).css(\"height\",\"\")}}):b.siblings(\".collapsible-body\").stop(!0,!1).slideUp({duration:350,easing:\"easeOutQuart\",queue:!1,complete:function(){a(this).css(\"height\",\"\")}})}function e(a){var b=f(a);return b.length>0}function f(a){return a.closest(\"li > .collapsible-header\")}var g=a(this),h=a(this).find(\"> li > .collapsible-header\"),i=g.data(\"collapsible\");g.off(\"click.collapse\",\"> li > .collapsible-header\"),h.off(\"click.collapse\"),g.on(\"click.collapse\",\"> li > .collapsible-header\",function(g){var h=a(this),j=a(g.target);e(j)&&(j=f(j)),j.toggleClass(\"active\"),b.accordion||\"accordion\"===i||void 0===i?c(j):(d(j),h.hasClass(\"active\")&&d(h))});var h=g.find(\"> li > .collapsible-header\");b.accordion||\"accordion\"===i||void 0===i?c(h.filter(\".active\").first()):h.filter(\".active\").each(function(){d(a(this))})})},a(document).ready(function(){a(\".collapsible\").collapsible()})}(jQuery),function(a){a.fn.scrollTo=function(b){return a(this).scrollTop(a(this).scrollTop()-a(this).offset().top+a(b).offset().top),this},a.fn.dropdown=function(b){var c={inDuration:300,outDuration:225,constrain_width:!0,hover:!1,gutter:0,belowOrigin:!1,alignment:\"left\"};this.each(function(){function d(){void 0!==g.data(\"induration\")&&(h.inDuration=g.data(\"inDuration\")),void 0!==g.data(\"outduration\")&&(h.outDuration=g.data(\"outDuration\")),void 0!==g.data(\"constrainwidth\")&&(h.constrain_width=g.data(\"constrainwidth\")),void 0!==g.data(\"hover\")&&(h.hover=g.data(\"hover\")),void 0!==g.data(\"gutter\")&&(h.gutter=g.data(\"gutter\")),void 0!==g.data(\"beloworigin\")&&(h.belowOrigin=g.data(\"beloworigin\")),void 0!==g.data(\"alignment\")&&(h.alignment=g.data(\"alignment\"))}function e(b){\"focus\"===b&&(i=!0),d(),j.addClass(\"active\"),g.addClass(\"active\"),h.constrain_width===!0?j.css(\"width\",g.outerWidth()):j.css(\"white-space\",\"nowrap\");var c,e=window.innerHeight,f=g.innerHeight(),k=g.offset().left,l=g.offset().top-a(window).scrollTop(),m=h.alignment,n=0;if(h.belowOrigin===!0&&(n=f),k+j.innerWidth()>a(window).width()?m=\"right\":k-j.innerWidth()+g.innerWidth()<0&&(m=\"left\"),l+j.innerHeight()>e)if(l+f-j.innerHeight()<0){var o=e-l-n;j.css(\"max-height\",o)}else n||(n+=f),n-=j.innerHeight();if(\"left\"===m)c=h.gutter,leftPosition=g.position().left+c;else if(\"right\"===m){var p=g.position().left+g.outerWidth()-j.outerWidth();c=-h.gutter,leftPosition=p+c}j.css({position:\"absolute\",top:g.position().top+n,left:leftPosition}),j.stop(!0,!0).css(\"opacity\",0).slideDown({queue:!1,duration:h.inDuration,easing:\"easeOutCubic\",complete:function(){a(this).css(\"height\",\"\")}}).animate({opacity:1},{queue:!1,duration:h.inDuration,easing:\"easeOutSine\"})}function f(){i=!1,j.fadeOut(h.outDuration),j.removeClass(\"active\"),g.removeClass(\"active\"),setTimeout(function(){j.css(\"max-height\",\"\")},h.outDuration)}var g=a(this),h=a.extend({},c,b),i=!1,j=a(\"#\"+g.attr(\"data-activates\"));if(d(),g.after(j),h.hover){var k=!1;g.unbind(\"click.\"+g.attr(\"id\")),g.on(\"mouseenter\",function(a){k===!1&&(e(),k=!0)}),g.on(\"mouseleave\",function(b){var c=b.toElement||b.relatedTarget;a(c).closest(\".dropdown-content\").is(j)||(j.stop(!0,!0),f(),k=!1)}),j.on(\"mouseleave\",function(b){var c=b.toElement||b.relatedTarget;a(c).closest(\".dropdown-button\").is(g)||(j.stop(!0,!0),f(),k=!1)})}else g.unbind(\"click.\"+g.attr(\"id\")),g.bind(\"click.\"+g.attr(\"id\"),function(b){i||(g[0]!=b.currentTarget||g.hasClass(\"active\")||0!==a(b.target).closest(\".dropdown-content\").length?g.hasClass(\"active\")&&(f(),a(document).unbind(\"click.\"+j.attr(\"id\")+\" touchstart.\"+j.attr(\"id\"))):(b.preventDefault(),e(\"click\")),j.hasClass(\"active\")&&a(document).bind(\"click.\"+j.attr(\"id\")+\" touchstart.\"+j.attr(\"id\"),function(b){j.is(b.target)||g.is(b.target)||g.find(b.target).length||(f(),a(document).unbind(\"click.\"+j.attr(\"id\")+\" touchstart.\"+j.attr(\"id\")))}))});g.on(\"open\",function(a,b){e(b)}),g.on(\"close\",f)})},a(document).ready(function(){a(\".dropdown-button\").dropdown()})}(jQuery),function(a){var b=0,c=0,d=function(){return c++,\"materialize-lean-overlay-\"+c};a.fn.extend({openModal:function(c){a(\"body\").css(\"overflow\",\"hidden\");var e={opacity:.5,in_duration:350,out_duration:250,ready:void 0,complete:void 0,dismissible:!0,starting_top:\"4%\"},f=d(),g=a(this),h=a('<div class=\"lean-overlay\"></div>'),i=++b;h.attr(\"id\",f).css(\"z-index\",1e3+2*i),g.data(\"overlay-id\",f).css(\"z-index\",1e3+2*i+1),a(\"body\").append(h),c=a.extend(e,c),c.dismissible&&(h.click(function(){g.closeModal(c)}),a(document).on(\"keyup.leanModal\"+f,function(a){27===a.keyCode&&g.closeModal(c)})),g.find(\".modal-close\").on(\"click.close\",function(a){g.closeModal(c)}),h.css({display:\"block\",opacity:0}),g.css({display:\"block\",opacity:0}),h.velocity({opacity:c.opacity},{duration:c.in_duration,queue:!1,ease:\"easeOutCubic\"}),g.data(\"associated-overlay\",h[0]),g.hasClass(\"bottom-sheet\")?g.velocity({bottom:\"0\",opacity:1},{duration:c.in_duration,queue:!1,ease:\"easeOutCubic\",complete:function(){\"function\"==typeof c.ready&&c.ready()}}):(a.Velocity.hook(g,\"scaleX\",.7),g.css({top:c.starting_top}),g.velocity({top:\"10%\",opacity:1,scaleX:\"1\"},{duration:c.in_duration,queue:!1,ease:\"easeOutCubic\",complete:function(){\"function\"==typeof c.ready&&c.ready()}}))}}),a.fn.extend({closeModal:function(c){var d={out_duration:250,complete:void 0},e=a(this),f=e.data(\"overlay-id\"),g=a(\"#\"+f);c=a.extend(d,c),a(\"body\").css(\"overflow\",\"\"),e.find(\".modal-close\").off(\"click.close\"),a(document).off(\"keyup.leanModal\"+f),g.velocity({opacity:0},{duration:c.out_duration,queue:!1,ease:\"easeOutQuart\"}),e.hasClass(\"bottom-sheet\")?e.velocity({bottom:\"-100%\",opacity:0},{duration:c.out_duration,queue:!1,ease:\"easeOutCubic\",complete:function(){\ng.css({display:\"none\"}),\"function\"==typeof c.complete&&c.complete(),g.remove(),b--}}):e.velocity({top:c.starting_top,opacity:0,scaleX:.7},{duration:c.out_duration,complete:function(){a(this).css(\"display\",\"none\"),\"function\"==typeof c.complete&&c.complete(),g.remove(),b--}})}}),a.fn.extend({leanModal:function(b){return this.each(function(){var c={starting_top:\"4%\"},d=a.extend(c,b);a(this).click(function(b){d.starting_top=(a(this).offset().top-a(window).scrollTop())/1.15;var c=a(this).attr(\"href\")||\"#\"+a(this).data(\"target\");a(c).openModal(d),b.preventDefault()})})}})}(jQuery),function(a){a.fn.materialbox=function(){return this.each(function(){function b(){f=!1;var b=i.parent(\".material-placeholder\"),d=(window.innerWidth,window.innerHeight,i.data(\"width\")),g=i.data(\"height\");i.velocity(\"stop\",!0),a(\"#materialbox-overlay\").velocity(\"stop\",!0),a(\".materialbox-caption\").velocity(\"stop\",!0),a(\"#materialbox-overlay\").velocity({opacity:0},{duration:h,queue:!1,easing:\"easeOutQuad\",complete:function(){e=!1,a(this).remove()}}),i.velocity({width:d,height:g,left:0,top:0},{duration:h,queue:!1,easing:\"easeOutQuad\"}),a(\".materialbox-caption\").velocity({opacity:0},{duration:h,queue:!1,easing:\"easeOutQuad\",complete:function(){b.css({height:\"\",width:\"\",position:\"\",top:\"\",left:\"\"}),i.css({height:\"\",top:\"\",left:\"\",width:\"\",\"max-width\":\"\",position:\"\",\"z-index\":\"\"}),i.removeClass(\"active\"),f=!0,a(this).remove(),c.css(\"overflow\",\"\")}})}if(!a(this).hasClass(\"initialized\")){a(this).addClass(\"initialized\");var c,d,e=!1,f=!0,g=275,h=200,i=a(this),j=a(\"<div></div>\").addClass(\"material-placeholder\");i.wrap(j),i.on(\"click\",function(){var h=i.parent(\".material-placeholder\"),j=window.innerWidth,k=window.innerHeight,l=i.width(),m=i.height();if(f===!1)return b(),!1;if(e&&f===!0)return b(),!1;f=!1,i.addClass(\"active\"),e=!0,h.css({width:h[0].getBoundingClientRect().width,height:h[0].getBoundingClientRect().height,position:\"relative\",top:0,left:0}),c=void 0,d=h[0].parentNode;for(;null!==d&&!a(d).is(document);){var n=a(d);\"hidden\"===n.css(\"overflow\")&&(n.css(\"overflow\",\"visible\"),c=void 0===c?n:c.add(n)),d=d.parentNode}i.css({position:\"absolute\",\"z-index\":1e3}).data(\"width\",l).data(\"height\",m);var o=a('<div id=\"materialbox-overlay\"></div>').css({opacity:0}).click(function(){f===!0&&b()});if(a(\"body\").append(o),o.velocity({opacity:1},{duration:g,queue:!1,easing:\"easeOutQuad\"}),\"\"!==i.data(\"caption\")){var p=a('<div class=\"materialbox-caption\"></div>');p.text(i.data(\"caption\")),a(\"body\").append(p),p.css({display:\"inline\"}),p.velocity({opacity:1},{duration:g,queue:!1,easing:\"easeOutQuad\"})}var q=0,r=l/j,s=m/k,t=0,u=0;r>s?(q=m/l,t=.9*j,u=.9*j*q):(q=l/m,t=.9*k*q,u=.9*k),i.hasClass(\"responsive-img\")?i.velocity({\"max-width\":t,width:l},{duration:0,queue:!1,complete:function(){i.css({left:0,top:0}).velocity({height:u,width:t,left:a(document).scrollLeft()+j/2-i.parent(\".material-placeholder\").offset().left-t/2,top:a(document).scrollTop()+k/2-i.parent(\".material-placeholder\").offset().top-u/2},{duration:g,queue:!1,easing:\"easeOutQuad\",complete:function(){f=!0}})}}):i.css(\"left\",0).css(\"top\",0).velocity({height:u,width:t,left:a(document).scrollLeft()+j/2-i.parent(\".material-placeholder\").offset().left-t/2,top:a(document).scrollTop()+k/2-i.parent(\".material-placeholder\").offset().top-u/2},{duration:g,queue:!1,easing:\"easeOutQuad\",complete:function(){f=!0}})}),a(window).scroll(function(){e&&b()}),a(document).keyup(function(a){27===a.keyCode&&f===!0&&e&&b()})}})},a(document).ready(function(){a(\".materialboxed\").materialbox()})}(jQuery),function(a){a.fn.parallax=function(){var b=a(window).width();return this.each(function(c){function d(c){var d;d=601>b?e.height()>0?e.height():e.children(\"img\").height():e.height()>0?e.height():500;var f=e.children(\"img\").first(),g=f.height(),h=g-d,i=e.offset().top+d,j=e.offset().top,k=a(window).scrollTop(),l=window.innerHeight,m=k+l,n=(m-j)/(d+l),o=Math.round(h*n);c&&f.css(\"display\",\"block\"),i>k&&k+l>j&&f.css(\"transform\",\"translate3D(-50%,\"+o+\"px, 0)\")}var e=a(this);e.addClass(\"parallax\"),e.children(\"img\").one(\"load\",function(){d(!0)}).each(function(){this.complete&&a(this).load()}),a(window).scroll(function(){b=a(window).width(),d(!1)}),a(window).resize(function(){b=a(window).width(),d(!1)})})}}(jQuery),function(a){var b={init:function(){return this.each(function(){var b=a(this);a(window).width();b.width(\"100%\");var c,d,e=b.find(\"li.tab a\"),f=b.width(),g=b.find(\"li\").first().outerWidth(),h=0;c=a(e.filter('[href=\"'+location.hash+'\"]')),0===c.length&&(c=a(this).find(\"li.tab a.active\").first()),0===c.length&&(c=a(this).find(\"li.tab a\").first()),c.addClass(\"active\"),h=e.index(c),0>h&&(h=0),d=a(c[0].hash),b.append('<div class=\"indicator\"></div>');var i=b.find(\".indicator\");b.is(\":visible\")&&(i.css({right:f-(h+1)*g}),i.css({left:h*g})),a(window).resize(function(){f=b.width(),g=b.find(\"li\").first().outerWidth(),0>h&&(h=0),0!==g&&0!==f&&(i.css({right:f-(h+1)*g}),i.css({left:h*g}))}),e.not(c).each(function(){a(this.hash).hide()}),b.on(\"click\",\"a\",function(j){if(a(this).parent().hasClass(\"disabled\"))return void j.preventDefault();f=b.width(),g=b.find(\"li\").first().outerWidth(),c.removeClass(\"active\"),d.hide(),c=a(this),d=a(this.hash),e=b.find(\"li.tab a\"),c.addClass(\"active\");var k=h;h=e.index(a(this)),0>h&&(h=0),d.show(),h-k>=0?(i.velocity({right:f-(h+1)*g},{duration:300,queue:!1,easing:\"easeOutQuad\"}),i.velocity({left:h*g},{duration:300,queue:!1,easing:\"easeOutQuad\",delay:90})):(i.velocity({left:h*g},{duration:300,queue:!1,easing:\"easeOutQuad\"}),i.velocity({right:f-(h+1)*g},{duration:300,queue:!1,easing:\"easeOutQuad\",delay:90})),j.preventDefault()})})},select_tab:function(a){this.find('a[href=\"#'+a+'\"]').trigger(\"click\")}};a.fn.tabs=function(c){return b[c]?b[c].apply(this,Array.prototype.slice.call(arguments,1)):\"object\"!=typeof c&&c?void a.error(\"Method \"+c+\" does not exist on jQuery.tooltip\"):b.init.apply(this,arguments)},a(document).ready(function(){a(\"ul.tabs\").tabs()})}(jQuery),function(a){a.fn.tooltip=function(c){var d=5,e={delay:350};return\"remove\"===c?(this.each(function(){a(\"#\"+a(this).attr(\"data-tooltip-id\")).remove(),a(this).off(\"mouseenter.tooltip mouseleave.tooltip\")}),!1):(c=a.extend(e,c),this.each(function(){var e=Materialize.guid(),f=a(this);f.attr(\"data-tooltip-id\",e);var g=a(\"<span></span>\").text(f.attr(\"data-tooltip\")),h=a(\"<div></div>\");h.addClass(\"material-tooltip\").append(g).appendTo(a(\"body\")).attr(\"id\",e);var i=a(\"<div></div>\").addClass(\"backdrop\");i.appendTo(h),i.css({top:0,left:0}),f.off(\"mouseenter.tooltip mouseleave.tooltip\");var j,k=!1;f.on({\"mouseenter.tooltip\":function(a){var e=f.attr(\"data-delay\");e=void 0===e||\"\"===e?c.delay:e,j=setTimeout(function(){k=!0,h.velocity(\"stop\"),i.velocity(\"stop\"),h.css({display:\"block\",left:\"0px\",top:\"0px\"}),h.children(\"span\").text(f.attr(\"data-tooltip\"));var a,c,e,g=f.outerWidth(),j=f.outerHeight(),l=f.attr(\"data-position\"),m=h.outerHeight(),n=h.outerWidth(),o=\"0px\",p=\"0px\",q=8;\"top\"===l?(a=f.offset().top-m-d,c=f.offset().left+g/2-n/2,e=b(c,a,n,m),o=\"-10px\",i.css({borderRadius:\"14px 14px 0 0\",transformOrigin:\"50% 90%\",marginTop:m,marginLeft:n/2-i.width()/2})):\"left\"===l?(a=f.offset().top+j/2-m/2,c=f.offset().left-n-d,e=b(c,a,n,m),p=\"-10px\",i.css({width:\"14px\",height:\"14px\",borderRadius:\"14px 0 0 14px\",transformOrigin:\"95% 50%\",marginTop:m/2,marginLeft:n})):\"right\"===l?(a=f.offset().top+j/2-m/2,c=f.offset().left+g+d,e=b(c,a,n,m),p=\"+10px\",i.css({width:\"14px\",height:\"14px\",borderRadius:\"0 14px 14px 0\",transformOrigin:\"5% 50%\",marginTop:m/2,marginLeft:\"0px\"})):(a=f.offset().top+f.outerHeight()+d,c=f.offset().left+g/2-n/2,e=b(c,a,n,m),o=\"+10px\",i.css({marginLeft:n/2-i.width()/2})),h.css({top:e.y,left:e.x}),q=n/8,8>q&&(q=8),(\"right\"===l||\"left\"===l)&&(q=n/10,6>q&&(q=6)),h.velocity({marginTop:o,marginLeft:p},{duration:350,queue:!1}).velocity({opacity:1},{duration:300,delay:50,queue:!1}),i.css({display:\"block\"}).velocity({opacity:1},{duration:55,delay:0,queue:!1}).velocity({scale:q},{duration:300,delay:0,queue:!1,easing:\"easeInOutQuad\"})},e)},\"mouseleave.tooltip\":function(){k=!1,clearTimeout(j),setTimeout(function(){1!=k&&(h.velocity({opacity:0,marginTop:0,marginLeft:0},{duration:225,queue:!1}),i.velocity({opacity:0,scale:1},{duration:225,queue:!1,complete:function(){i.css(\"display\",\"none\"),h.css(\"display\",\"none\"),k=!1}}))},225)}})}))};var b=function(b,c,d,e){var f=b,g=c;return 0>f?f=4:f+d>window.innerWidth&&(f-=f+d-window.innerWidth),0>g?g=4:g+e>window.innerHeight+a(window).scrollTop&&(g-=g+e-window.innerHeight),{x:f,y:g}};a(document).ready(function(){a(\".tooltipped\").tooltip()})}(jQuery),function(a){\"use strict\";function b(a){return null!==a&&a===a.window}function c(a){return b(a)?a:9===a.nodeType&&a.defaultView}function d(a){var b,d,e={top:0,left:0},f=a&&a.ownerDocument;return b=f.documentElement,\"undefined\"!=typeof a.getBoundingClientRect&&(e=a.getBoundingClientRect()),d=c(f),{top:e.top+d.pageYOffset-b.clientTop,left:e.left+d.pageXOffset-b.clientLeft}}function e(a){var b=\"\";for(var c in a)a.hasOwnProperty(c)&&(b+=c+\":\"+a[c]+\";\");return b}function f(a){if(k.allowEvent(a)===!1)return null;for(var b=null,c=a.target||a.srcElement;null!==c.parentElement;){if(!(c instanceof SVGElement||-1===c.className.indexOf(\"waves-effect\"))){b=c;break}if(c.classList.contains(\"waves-effect\")){b=c;break}c=c.parentElement}return b}function g(b){var c=f(b);null!==c&&(j.show(b,c),\"ontouchstart\"in a&&(c.addEventListener(\"touchend\",j.hide,!1),c.addEventListener(\"touchcancel\",j.hide,!1)),c.addEventListener(\"mouseup\",j.hide,!1),c.addEventListener(\"mouseleave\",j.hide,!1))}var h=h||{},i=document.querySelectorAll.bind(document),j={duration:750,show:function(a,b){if(2===a.button)return!1;var c=b||this,f=document.createElement(\"div\");f.className=\"waves-ripple\",c.appendChild(f);var g=d(c),h=a.pageY-g.top,i=a.pageX-g.left,k=\"scale(\"+c.clientWidth/100*10+\")\";\"touches\"in a&&(h=a.touches[0].pageY-g.top,i=a.touches[0].pageX-g.left),f.setAttribute(\"data-hold\",Date.now()),f.setAttribute(\"data-scale\",k),f.setAttribute(\"data-x\",i),f.setAttribute(\"data-y\",h);var l={top:h+\"px\",left:i+\"px\"};f.className=f.className+\" waves-notransition\",f.setAttribute(\"style\",e(l)),f.className=f.className.replace(\"waves-notransition\",\"\"),l[\"-webkit-transform\"]=k,l[\"-moz-transform\"]=k,l[\"-ms-transform\"]=k,l[\"-o-transform\"]=k,l.transform=k,l.opacity=\"1\",l[\"-webkit-transition-duration\"]=j.duration+\"ms\",l[\"-moz-transition-duration\"]=j.duration+\"ms\",l[\"-o-transition-duration\"]=j.duration+\"ms\",l[\"transition-duration\"]=j.duration+\"ms\",l[\"-webkit-transition-timing-function\"]=\"cubic-bezier(0.250, 0.460, 0.450, 0.940)\",l[\"-moz-transition-timing-function\"]=\"cubic-bezier(0.250, 0.460, 0.450, 0.940)\",l[\"-o-transition-timing-function\"]=\"cubic-bezier(0.250, 0.460, 0.450, 0.940)\",l[\"transition-timing-function\"]=\"cubic-bezier(0.250, 0.460, 0.450, 0.940)\",f.setAttribute(\"style\",e(l))},hide:function(a){k.touchup(a);var b=this,c=(1.4*b.clientWidth,null),d=b.getElementsByClassName(\"waves-ripple\");if(!(d.length>0))return!1;c=d[d.length-1];var f=c.getAttribute(\"data-x\"),g=c.getAttribute(\"data-y\"),h=c.getAttribute(\"data-scale\"),i=Date.now()-Number(c.getAttribute(\"data-hold\")),l=350-i;0>l&&(l=0),setTimeout(function(){var a={top:g+\"px\",left:f+\"px\",opacity:\"0\",\"-webkit-transition-duration\":j.duration+\"ms\",\"-moz-transition-duration\":j.duration+\"ms\",\"-o-transition-duration\":j.duration+\"ms\",\"transition-duration\":j.duration+\"ms\",\"-webkit-transform\":h,\"-moz-transform\":h,\"-ms-transform\":h,\"-o-transform\":h,transform:h};c.setAttribute(\"style\",e(a)),setTimeout(function(){try{b.removeChild(c)}catch(a){return!1}},j.duration)},l)},wrapInput:function(a){for(var b=0;b<a.length;b++){var c=a[b];if(\"input\"===c.tagName.toLowerCase()){var d=c.parentNode;if(\"i\"===d.tagName.toLowerCase()&&-1!==d.className.indexOf(\"waves-effect\"))continue;var e=document.createElement(\"i\");e.className=c.className+\" waves-input-wrapper\";var f=c.getAttribute(\"style\");f||(f=\"\"),e.setAttribute(\"style\",f),c.className=\"waves-button-input\",c.removeAttribute(\"style\"),d.replaceChild(e,c),e.appendChild(c)}}}},k={touches:0,allowEvent:function(a){var b=!0;return\"touchstart\"===a.type?k.touches+=1:\"touchend\"===a.type||\"touchcancel\"===a.type?setTimeout(function(){k.touches>0&&(k.touches-=1)},500):\"mousedown\"===a.type&&k.touches>0&&(b=!1),b},touchup:function(a){k.allowEvent(a)}};h.displayEffect=function(b){b=b||{},\"duration\"in b&&(j.duration=b.duration),j.wrapInput(i(\".waves-effect\")),\"ontouchstart\"in a&&document.body.addEventListener(\"touchstart\",g,!1),document.body.addEventListener(\"mousedown\",g,!1)},h.attach=function(b){\"input\"===b.tagName.toLowerCase()&&(j.wrapInput([b]),b=b.parentElement),\"ontouchstart\"in a&&b.addEventListener(\"touchstart\",g,!1),b.addEventListener(\"mousedown\",g,!1)},a.Waves=h,document.addEventListener(\"DOMContentLoaded\",function(){h.displayEffect()},!1)}(window),Materialize.toast=function(a,b,c,d){function e(a){var b=document.createElement(\"div\");if(b.classList.add(\"toast\"),c)for(var e=c.split(\" \"),f=0,g=e.length;g>f;f++)b.classList.add(e[f]);(\"object\"==typeof HTMLElement?a instanceof HTMLElement:a&&\"object\"==typeof a&&null!==a&&1===a.nodeType&&\"string\"==typeof a.nodeName)?b.appendChild(a):a instanceof jQuery?b.appendChild(a[0]):b.innerHTML=a;var h=new Hammer(b,{prevent_default:!1});return h.on(\"pan\",function(a){var c=a.deltaX,d=80;b.classList.contains(\"panning\")||b.classList.add(\"panning\");var e=1-Math.abs(c/d);0>e&&(e=0),Vel(b,{left:c,opacity:e},{duration:50,queue:!1,easing:\"easeOutQuad\"})}),h.on(\"panend\",function(a){var c=a.deltaX,e=80;Math.abs(c)>e?Vel(b,{marginTop:\"-40px\"},{duration:375,easing:\"easeOutExpo\",queue:!1,complete:function(){\"function\"==typeof d&&d(),b.parentNode.removeChild(b)}}):(b.classList.remove(\"panning\"),Vel(b,{left:0,opacity:1},{duration:300,easing:\"easeOutExpo\",queue:!1}))}),b}c=c||\"\";var f=document.getElementById(\"toast-container\");null===f&&(f=document.createElement(\"div\"),f.id=\"toast-container\",document.body.appendChild(f));var g=e(a);a&&f.appendChild(g),g.style.top=\"35px\",g.style.opacity=0,Vel(g,{top:\"0px\",opacity:1},{duration:300,easing:\"easeOutCubic\",queue:!1});var h=b,i=setInterval(function(){null===g.parentNode&&window.clearInterval(i),g.classList.contains(\"panning\")||(h-=20),0>=h&&(Vel(g,{opacity:0,marginTop:\"-40px\"},{duration:375,easing:\"easeOutExpo\",queue:!1,complete:function(){\"function\"==typeof d&&d(),this[0].parentNode.removeChild(this[0])}}),window.clearInterval(i))},20)},function(a){var b={init:function(b){var c={menuWidth:240,edge:\"left\",closeOnClick:!1};b=a.extend(c,b),a(this).each(function(){function c(c){g=!1,h=!1,a(\"body\").css(\"overflow\",\"\"),a(\"#sidenav-overlay\").velocity({opacity:0},{duration:200,queue:!1,easing:\"easeOutQuad\",complete:function(){a(this).remove()}}),\"left\"===b.edge?(f.css({width:\"\",right:\"\",left:\"0\"}),e.velocity({left:-1*(b.menuWidth+10)},{duration:200,queue:!1,easing:\"easeOutCubic\",complete:function(){c===!0&&(e.removeAttr(\"style\"),e.css(\"width\",b.menuWidth))}})):(f.css({width:\"\",right:\"0\",left:\"\"}),e.velocity({right:-1*(b.menuWidth+10)},{duration:200,queue:!1,easing:\"easeOutCubic\",complete:function(){c===!0&&(e.removeAttr(\"style\"),e.css(\"width\",b.menuWidth))}}))}var d=a(this),e=a(\"#\"+d.attr(\"data-activates\"));240!=b.menuWidth&&e.css(\"width\",b.menuWidth);var f=a('<div class=\"drag-target\"></div>');a(\"body\").append(f),\"left\"==b.edge?(e.css(\"left\",-1*(b.menuWidth+10)),f.css({left:0})):(e.addClass(\"right-aligned\").css(\"right\",-1*(b.menuWidth+10)).css(\"left\",\"\"),f.css({right:0})),e.hasClass(\"fixed\")&&window.innerWidth>992&&e.css(\"left\",0),e.hasClass(\"fixed\")&&a(window).resize(function(){window.innerWidth>992?0!==a(\"#sidenav-overlay\").css(\"opacity\")&&h?c(!0):(e.removeAttr(\"style\"),e.css(\"width\",b.menuWidth)):h===!1&&(\"left\"===b.edge?e.css(\"left\",-1*(b.menuWidth+10)):e.css(\"right\",-1*(b.menuWidth+10)))}),b.closeOnClick===!0&&e.on(\"click.itemclick\",\"a:not(.collapsible-header)\",function(){c()});var g=!1,h=!1;f.on(\"click\",function(){c()}),f.hammer({prevent_default:!1}).bind(\"pan\",function(d){if(\"touch\"==d.gesture.pointerType){var f=(d.gesture.direction,d.gesture.center.x);d.gesture.center.y,d.gesture.velocityX;if(a(\"body\").css(\"overflow\",\"hidden\"),0===a(\"#sidenav-overlay\").length){var g=a('<div id=\"sidenav-overlay\"></div>');g.css(\"opacity\",0).click(function(){c()}),a(\"body\").append(g)}if(\"left\"===b.edge&&(f>b.menuWidth?f=b.menuWidth:0>f&&(f=0)),\"left\"===b.edge)f<b.menuWidth/2?h=!1:f>=b.menuWidth/2&&(h=!0),e.css(\"left\",f-b.menuWidth);else{f<window.innerWidth-b.menuWidth/2?h=!0:f>=window.innerWidth-b.menuWidth/2&&(h=!1);var i=-1*(f-b.menuWidth/2);i>0&&(i=0),e.css(\"right\",i)}var j;\"left\"===b.edge?(j=f/b.menuWidth,a(\"#sidenav-overlay\").velocity({opacity:j},{duration:50,queue:!1,easing:\"easeOutQuad\"})):(j=Math.abs((f-window.innerWidth)/b.menuWidth),a(\"#sidenav-overlay\").velocity({opacity:j},{duration:50,queue:!1,easing:\"easeOutQuad\"}))}}).bind(\"panend\",function(c){if(\"touch\"==c.gesture.pointerType){var d=c.gesture.velocityX;g=!1,\"left\"===b.edge?h&&.3>=d||-.5>d?(e.velocity({left:0},{duration:300,queue:!1,easing:\"easeOutQuad\"}),a(\"#sidenav-overlay\").velocity({opacity:1},{duration:50,queue:!1,easing:\"easeOutQuad\"}),f.css({width:\"50%\",right:0,left:\"\"})):(!h||d>.3)&&(a(\"body\").css(\"overflow\",\"\"),e.velocity({left:-1*(b.menuWidth+10)},{duration:200,queue:!1,easing:\"easeOutQuad\"}),a(\"#sidenav-overlay\").velocity({opacity:0},{duration:200,queue:!1,easing:\"easeOutQuad\",complete:function(){a(this).remove()}}),f.css({width:\"10px\",right:\"\",left:0})):h&&d>=-.3||d>.5?(e.velocity({right:0},{duration:300,queue:!1,easing:\"easeOutQuad\"}),a(\"#sidenav-overlay\").velocity({opacity:1},{duration:50,queue:!1,easing:\"easeOutQuad\"}),f.css({width:\"50%\",right:\"\",left:0})):(!h||-.3>d)&&(a(\"body\").css(\"overflow\",\"\"),e.velocity({right:-1*(b.menuWidth+10)},{duration:200,queue:!1,easing:\"easeOutQuad\"}),a(\"#sidenav-overlay\").velocity({opacity:0},{duration:200,queue:!1,easing:\"easeOutQuad\",complete:function(){a(this).remove()}}),f.css({width:\"10px\",right:0,left:\"\"}))}}),d.click(function(){if(h===!0)h=!1,g=!1,c();else{a(\"body\").css(\"overflow\",\"hidden\"),a(\"body\").append(f),\"left\"===b.edge?(f.css({width:\"50%\",right:0,left:\"\"}),e.velocity({left:0},{duration:300,queue:!1,easing:\"easeOutQuad\"})):(f.css({width:\"50%\",right:\"\",left:0}),e.velocity({right:0},{duration:300,queue:!1,easing:\"easeOutQuad\"}),e.css(\"left\",\"\"));var d=a('<div id=\"sidenav-overlay\"></div>');d.css(\"opacity\",0).click(function(){h=!1,g=!1,c(),d.velocity({opacity:0},{duration:300,queue:!1,easing:\"easeOutQuad\",complete:function(){a(this).remove()}})}),a(\"body\").append(d),d.velocity({opacity:1},{duration:300,queue:!1,easing:\"easeOutQuad\",complete:function(){h=!0,g=!1}})}return!1})})},show:function(){this.trigger(\"click\")},hide:function(){a(\"#sidenav-overlay\").trigger(\"click\")}};a.fn.sideNav=function(c){return b[c]?b[c].apply(this,Array.prototype.slice.call(arguments,1)):\"object\"!=typeof c&&c?void a.error(\"Method \"+c+\" does not exist on jQuery.sideNav\"):b.init.apply(this,arguments)}}(jQuery),function(a){function b(b,c,d,e){var f=a();return a.each(g,function(a,g){if(g.height()>0){var h=g.offset().top,i=g.offset().left,j=i+g.width(),k=h+g.height(),l=!(i>c||e>j||h>d||b>k);l&&f.push(g)}}),f}function c(){++j;var c=f.scrollTop(),d=f.scrollLeft(),e=d+f.width(),g=c+f.height(),i=b(c+k.top+200,e+k.right,g+k.bottom,d+k.left);a.each(i,function(a,b){var c=b.data(\"scrollSpy:ticks\");\"number\"!=typeof c&&b.triggerHandler(\"scrollSpy:enter\"),b.data(\"scrollSpy:ticks\",j)}),a.each(h,function(a,b){var c=b.data(\"scrollSpy:ticks\");\"number\"==typeof c&&c!==j&&(b.triggerHandler(\"scrollSpy:exit\"),b.data(\"scrollSpy:ticks\",null))}),h=i}function d(){f.trigger(\"scrollSpy:winSize\")}function e(a,b,c){var d,e,f,g=null,h=0;c||(c={});var i=function(){h=c.leading===!1?0:l(),g=null,f=a.apply(d,e),d=e=null};return function(){var j=l();h||c.leading!==!1||(h=j);var k=b-(j-h);return d=this,e=arguments,0>=k?(clearTimeout(g),g=null,h=j,f=a.apply(d,e),d=e=null):g||c.trailing===!1||(g=setTimeout(i,k)),f}}var f=a(window),g=[],h=[],i=!1,j=0,k={top:0,right:0,bottom:0,left:0},l=Date.now||function(){return(new Date).getTime()};a.scrollSpy=function(b,d){var h=[];b=a(b),b.each(function(b,c){g.push(a(c)),a(c).data(\"scrollSpy:id\",b),a(\"a[href=#\"+a(c).attr(\"id\")+\"]\").click(function(b){b.preventDefault();var c=a(this.hash).offset().top+1;a(\"html, body\").animate({scrollTop:c-200},{duration:400,queue:!1,easing:\"easeOutCubic\"})})}),d=d||{throttle:100},k.top=d.offsetTop||0,k.right=d.offsetRight||0,k.bottom=d.offsetBottom||0,k.left=d.offsetLeft||0;var j=e(c,d.throttle||100),l=function(){a(document).ready(j)};return i||(f.on(\"scroll\",l),f.on(\"resize\",l),i=!0),setTimeout(l,0),b.on(\"scrollSpy:enter\",function(){h=a.grep(h,function(a){return 0!=a.height()});var b=a(this);h[0]?(a(\"a[href=#\"+h[0].attr(\"id\")+\"]\").removeClass(\"active\"),b.data(\"scrollSpy:id\")<h[0].data(\"scrollSpy:id\")?h.unshift(a(this)):h.push(a(this))):h.push(a(this)),a(\"a[href=#\"+h[0].attr(\"id\")+\"]\").addClass(\"active\")}),b.on(\"scrollSpy:exit\",function(){if(h=a.grep(h,function(a){return 0!=a.height()}),h[0]){a(\"a[href=#\"+h[0].attr(\"id\")+\"]\").removeClass(\"active\");var b=a(this);h=a.grep(h,function(a){return a.attr(\"id\")!=b.attr(\"id\")}),h[0]&&a(\"a[href=#\"+h[0].attr(\"id\")+\"]\").addClass(\"active\")}}),b},a.winSizeSpy=function(b){return a.winSizeSpy=function(){return f},b=b||{throttle:100},f.on(\"resize\",e(d,b.throttle||100))},a.fn.scrollSpy=function(b){return a.scrollSpy(a(this),b)}}(jQuery),function(a){a(document).ready(function(){function b(b){var c=b.css(\"font-family\"),e=b.css(\"font-size\");e&&d.css(\"font-size\",e),c&&d.css(\"font-family\",c),\"off\"===b.attr(\"wrap\")&&d.css(\"overflow-wrap\",\"normal\").css(\"white-space\",\"pre\"),d.text(b.val()+\"\\n\");var f=d.html().replace(/\\n/g,\"<br>\");d.html(f),b.is(\":visible\")?d.css(\"width\",b.width()):d.css(\"width\",a(window).width()/2),b.css(\"height\",d.height())}Materialize.updateTextFields=function(){var b=\"input[type=text], input[type=password], input[type=email], input[type=url], input[type=tel], input[type=number], input[type=search], textarea\";a(b).each(function(b,c){a(c).val().length>0||c.autofocus||void 0!==a(this).attr(\"placeholder\")||a(c)[0].validity.badInput===!0?a(this).siblings(\"label, i\").addClass(\"active\"):a(this).siblings(\"label, i\").removeClass(\"active\")})};var c=\"input[type=text], input[type=password], input[type=email], input[type=url], input[type=tel], input[type=number], input[type=search], textarea\";a(document).on(\"change\",c,function(){(0!==a(this).val().length||void 0!==a(this).attr(\"placeholder\"))&&a(this).siblings(\"label\").addClass(\"active\"),validate_field(a(this))}),a(document).ready(function(){Materialize.updateTextFields()}),a(document).on(\"reset\",function(b){var d=a(b.target);d.is(\"form\")&&(d.find(c).removeClass(\"valid\").removeClass(\"invalid\"),d.find(c).each(function(){\"\"===a(this).attr(\"value\")&&a(this).siblings(\"label, i\").removeClass(\"active\")}),d.find(\"select.initialized\").each(function(){var a=d.find(\"option[selected]\").text();d.siblings(\"input.select-dropdown\").val(a)}))}),a(document).on(\"focus\",c,function(){a(this).siblings(\"label, i\").addClass(\"active\")}),a(document).on(\"blur\",c,function(){var b=a(this);0===b.val().length&&b[0].validity.badInput!==!0&&void 0===b.attr(\"placeholder\")&&b.siblings(\"label, i\").removeClass(\"active\"),0===b.val().length&&b[0].validity.badInput!==!0&&void 0!==b.attr(\"placeholder\")&&b.siblings(\"i\").removeClass(\"active\"),validate_field(b)}),window.validate_field=function(a){var b=void 0!==a.attr(\"length\"),c=parseInt(a.attr(\"length\")),d=a.val().length;0===a.val().length&&a[0].validity.badInput===!1?a.hasClass(\"validate\")&&(a.removeClass(\"valid\"),a.removeClass(\"invalid\")):a.hasClass(\"validate\")&&(a.is(\":valid\")&&b&&c>=d||a.is(\":valid\")&&!b?(a.removeClass(\"invalid\"),a.addClass(\"valid\")):(a.removeClass(\"valid\"),a.addClass(\"invalid\")))};var d=a(\".hiddendiv\").first();d.length||(d=a('<div class=\"hiddendiv common\"></div>'),a(\"body\").append(d));var e=\".materialize-textarea\";a(e).each(function(){var c=a(this);c.val().length&&b(c)}),a(\"body\").on(\"keyup keydown autoresize\",e,function(){b(a(this))}),a(document).on(\"change\",'.file-field input[type=\"file\"]',function(){for(var b=a(this).closest(\".file-field\"),c=b.find(\"input.file-path\"),d=a(this)[0].files,e=[],f=0;f<d.length;f++)e.push(d[f].name);c.val(e.join(\", \")),c.trigger(\"change\")});var f,g=\"input[type=range]\",h=!1;a(g).each(function(){var b=a('<span class=\"thumb\"><span class=\"value\"></span></span>');a(this).after(b)});var i=\".range-field\";a(document).on(\"change\",g,function(b){var c=a(this).siblings(\".thumb\");c.find(\".value\").html(a(this).val())}),a(document).on(\"input mousedown touchstart\",g,function(b){var c=a(this).siblings(\".thumb\"),d=a(this).outerWidth();c.length<=0&&(c=a('<span class=\"thumb\"><span class=\"value\"></span></span>'),a(this).after(c)),c.find(\".value\").html(a(this).val()),h=!0,a(this).addClass(\"active\"),c.hasClass(\"active\")||c.velocity({height:\"30px\",width:\"30px\",top:\"-20px\",marginLeft:\"-15px\"},{duration:300,easing:\"easeOutExpo\"}),\"input\"!==b.type&&(f=void 0===b.pageX||null===b.pageX?b.originalEvent.touches[0].pageX-a(this).offset().left:b.pageX-a(this).offset().left,0>f?f=0:f>d&&(f=d),c.addClass(\"active\").css(\"left\",f)),c.find(\".value\").html(a(this).val())}),a(document).on(\"mouseup touchend\",i,function(){h=!1,a(this).removeClass(\"active\")}),a(document).on(\"mousemove touchmove\",i,function(b){var c,d=a(this).children(\".thumb\");if(h){d.hasClass(\"active\")||d.velocity({height:\"30px\",width:\"30px\",top:\"-20px\",marginLeft:\"-15px\"},{duration:300,easing:\"easeOutExpo\"}),c=void 0===b.pageX||null===b.pageX?b.originalEvent.touches[0].pageX-a(this).offset().left:b.pageX-a(this).offset().left;var e=a(this).outerWidth();0>c?c=0:c>e&&(c=e),d.addClass(\"active\").css(\"left\",c),d.find(\".value\").html(d.siblings(g).val())}}),a(document).on(\"mouseout touchleave\",i,function(){if(!h){var b=a(this).children(\".thumb\");b.hasClass(\"active\")&&b.velocity({height:\"0\",width:\"0\",top:\"10px\",marginLeft:\"-6px\"},{duration:100}),b.removeClass(\"active\")}})}),a.fn.material_select=function(b){function c(a,b,c){var e=a.indexOf(b),f=-1===e;return f?a.push(b):a.splice(e,1),c.siblings(\"ul.dropdown-content\").find(\"li\").eq(b).toggleClass(\"active\"),c.find(\"option\").eq(b).prop(\"selected\",f),d(a,c),f}function d(a,b){for(var c=\"\",d=0,e=a.length;e>d;d++){var f=b.find(\"option\").eq(a[d]).text();c+=0===d?f:\", \"+f}\"\"===c&&(c=b.find(\"option:disabled\").eq(0).text()),b.siblings(\"input.select-dropdown\").val(c)}a(this).each(function(){var d=a(this);if(!d.hasClass(\"browser-default\")){var e=d.attr(\"multiple\")?!0:!1,f=d.data(\"select-id\");if(f&&(d.parent().find(\"span.caret\").remove(),d.parent().find(\"input\").remove(),d.unwrap(),a(\"ul#select-options-\"+f).remove()),\"destroy\"===b)return void d.data(\"select-id\",null).removeClass(\"initialized\");var g=Materialize.guid();d.data(\"select-id\",g);var h=a('<div class=\"select-wrapper\"></div>');h.addClass(d.attr(\"class\"));var i=a('<ul id=\"select-options-'+g+'\" class=\"dropdown-content select-dropdown '+(e?\"multiple-select-dropdown\":\"\")+'\"></ul>'),j=d.children(\"option, optgroup\"),k=[],l=!1,m=d.find(\"option:selected\").html()||d.find(\"option:first\").html()||\"\",n=function(b,c,d){var e=c.is(\":disabled\")?\"disabled \":\"\",f=c.data(\"icon\"),g=c.attr(\"class\");if(f){var h=\"\";return g&&(h=' class=\"'+g+'\"'),\"multiple\"===d?i.append(a('<li class=\"'+e+'\"><img src=\"'+f+'\"'+h+'><span><input type=\"checkbox\"'+e+\"/><label></label>\"+c.html()+\"</span></li>\")):i.append(a('<li class=\"'+e+'\"><img src=\"'+f+'\"'+h+\"><span>\"+c.html()+\"</span></li>\")),!0}\"multiple\"===d?i.append(a('<li class=\"'+e+'\"><span><input type=\"checkbox\"'+e+\"/><label></label>\"+c.html()+\"</span></li>\")):i.append(a('<li class=\"'+e+'\"><span>'+c.html()+\"</span></li>\"))};j.length&&j.each(function(){if(a(this).is(\"option\"))e?n(d,a(this),\"multiple\"):n(d,a(this));else if(a(this).is(\"optgroup\")){var b=a(this).children(\"option\");i.append(a('<li class=\"optgroup\"><span>'+a(this).attr(\"label\")+\"</span></li>\")),b.each(function(){n(d,a(this))})}}),i.find(\"li:not(.optgroup)\").each(function(f){a(this).click(function(g){if(!a(this).hasClass(\"disabled\")&&!a(this).hasClass(\"optgroup\")){var h=!0;e?(a('input[type=\"checkbox\"]',this).prop(\"checked\",function(a,b){return!b}),h=c(k,a(this).index(),d),q.trigger(\"focus\")):(i.find(\"li\").removeClass(\"active\"),a(this).toggleClass(\"active\"),q.val(a(this).text())),activateOption(i,a(this)),d.find(\"option\").eq(f).prop(\"selected\",h),d.trigger(\"change\"),\"undefined\"!=typeof b&&b()}g.stopPropagation()})}),d.wrap(h);var o=a('<span class=\"caret\">&#9660;</span>');d.is(\":disabled\")&&o.addClass(\"disabled\");var p=m.replace(/\"/g,\"&quot;\"),q=a('<input type=\"text\" class=\"select-dropdown\" readonly=\"true\" '+(d.is(\":disabled\")?\"disabled\":\"\")+' data-activates=\"select-options-'+g+'\" value=\"'+p+'\"/>');d.before(q),q.before(o),q.after(i),d.is(\":disabled\")||q.dropdown({hover:!1,closeOnClick:!1}),d.attr(\"tabindex\")&&a(q[0]).attr(\"tabindex\",d.attr(\"tabindex\")),d.addClass(\"initialized\"),q.on({focus:function(){if(a(\"ul.select-dropdown\").not(i[0]).is(\":visible\")&&a(\"input.select-dropdown\").trigger(\"close\"),!i.is(\":visible\")){a(this).trigger(\"open\",[\"focus\"]);var b=a(this).val(),c=i.find(\"li\").filter(function(){return a(this).text().toLowerCase()===b.toLowerCase()})[0];activateOption(i,c)}},click:function(a){a.stopPropagation()}}),q.on(\"blur\",function(){e||a(this).trigger(\"close\"),i.find(\"li.selected\").removeClass(\"selected\")}),i.hover(function(){l=!0},function(){l=!1}),a(window).on({click:function(){e&&(l||q.trigger(\"close\"))}}),e&&d.find(\"option:selected:not(:disabled)\").each(function(){var b=a(this).index();c(k,b,d),i.find(\"li\").eq(b).find(\":checkbox\").prop(\"checked\",!0)}),activateOption=function(b,c){if(c){b.find(\"li.selected\").removeClass(\"selected\");var d=a(c);d.addClass(\"selected\"),i.scrollTo(d)}};var r=[],s=function(b){if(9==b.which)return void q.trigger(\"close\");if(40==b.which&&!i.is(\":visible\"))return void q.trigger(\"open\");if(13!=b.which||i.is(\":visible\")){b.preventDefault();var c=String.fromCharCode(b.which).toLowerCase(),d=[9,13,27,38,40];if(c&&-1===d.indexOf(b.which)){r.push(c);var f=r.join(\"\"),g=i.find(\"li\").filter(function(){return 0===a(this).text().toLowerCase().indexOf(f)})[0];g&&activateOption(i,g)}if(13==b.which){var h=i.find(\"li.selected:not(.disabled)\")[0];h&&(a(h).trigger(\"click\"),e||q.trigger(\"close\"))}40==b.which&&(g=i.find(\"li.selected\").length?i.find(\"li.selected\").next(\"li:not(.disabled)\")[0]:i.find(\"li:not(.disabled)\")[0],activateOption(i,g)),27==b.which&&q.trigger(\"close\"),38==b.which&&(g=i.find(\"li.selected\").prev(\"li:not(.disabled)\")[0],g&&activateOption(i,g)),setTimeout(function(){r=[]},1e3)}};q.on(\"keydown\",s)}})}}(jQuery),function(a){var b={init:function(b){var c={indicators:!0,height:400,transition:500,interval:6e3};return b=a.extend(c,b),this.each(function(){function c(a,b){a.hasClass(\"center-align\")?a.velocity({opacity:0,translateY:-100},{duration:b,queue:!1}):a.hasClass(\"right-align\")?a.velocity({opacity:0,translateX:100},{duration:b,queue:!1}):a.hasClass(\"left-align\")&&a.velocity({opacity:0,translateX:-100},{duration:b,queue:!1})}function d(a){a>=j.length?a=0:0>a&&(a=j.length-1),k=i.find(\".active\").index(),k!=a&&(e=j.eq(k),$caption=e.find(\".caption\"),e.removeClass(\"active\"),e.velocity({opacity:0},{duration:b.transition,queue:!1,easing:\"easeOutQuad\",complete:function(){j.not(\".active\").velocity({opacity:0,translateX:0,translateY:0},{duration:0,queue:!1})}}),c($caption,b.transition),b.indicators&&f.eq(k).removeClass(\"active\"),j.eq(a).velocity({opacity:1},{duration:b.transition,queue:!1,easing:\"easeOutQuad\"}),j.eq(a).find(\".caption\").velocity({opacity:1,translateX:0,translateY:0},{duration:b.transition,delay:b.transition,queue:!1,easing:\"easeOutQuad\"}),j.eq(a).addClass(\"active\"),b.indicators&&f.eq(a).addClass(\"active\"))}var e,f,g,h=a(this),i=h.find(\"ul.slides\").first(),j=i.find(\"li\"),k=i.find(\".active\").index();-1!=k&&(e=j.eq(k)),h.hasClass(\"fullscreen\")||(b.indicators?h.height(b.height+40):h.height(b.height),i.height(b.height)),j.find(\".caption\").each(function(){c(a(this),0)}),j.find(\"img\").each(function(){var b=\"data:image/gif;base64,R0lGODlhAQABAIABAP///wAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\";\na(this).attr(\"src\")!==b&&(a(this).css(\"background-image\",\"url(\"+a(this).attr(\"src\")+\")\"),a(this).attr(\"src\",b))}),b.indicators&&(f=a('<ul class=\"indicators\"></ul>'),j.each(function(c){var e=a('<li class=\"indicator-item\"></li>');e.click(function(){var c=i.parent(),e=c.find(a(this)).index();d(e),clearInterval(g),g=setInterval(function(){k=i.find(\".active\").index(),j.length==k+1?k=0:k+=1,d(k)},b.transition+b.interval)}),f.append(e)}),h.append(f),f=h.find(\"ul.indicators\").find(\"li.indicator-item\")),e?e.show():(j.first().addClass(\"active\").velocity({opacity:1},{duration:b.transition,queue:!1,easing:\"easeOutQuad\"}),k=0,e=j.eq(k),b.indicators&&f.eq(k).addClass(\"active\")),e.find(\"img\").each(function(){e.find(\".caption\").velocity({opacity:1,translateX:0,translateY:0},{duration:b.transition,queue:!1,easing:\"easeOutQuad\"})}),g=setInterval(function(){k=i.find(\".active\").index(),d(k+1)},b.transition+b.interval);var l=!1,m=!1,n=!1;h.hammer({prevent_default:!1}).bind(\"pan\",function(a){if(\"touch\"===a.gesture.pointerType){clearInterval(g);var b=a.gesture.direction,c=a.gesture.deltaX,d=a.gesture.velocityX;$curr_slide=i.find(\".active\"),$curr_slide.velocity({translateX:c},{duration:50,queue:!1,easing:\"easeOutQuad\"}),4===b&&(c>h.innerWidth()/2||-.65>d)?n=!0:2===b&&(c<-1*h.innerWidth()/2||d>.65)&&(m=!0);var e;m&&(e=$curr_slide.next(),0===e.length&&(e=j.first()),e.velocity({opacity:1},{duration:300,queue:!1,easing:\"easeOutQuad\"})),n&&(e=$curr_slide.prev(),0===e.length&&(e=j.last()),e.velocity({opacity:1},{duration:300,queue:!1,easing:\"easeOutQuad\"}))}}).bind(\"panend\",function(a){\"touch\"===a.gesture.pointerType&&($curr_slide=i.find(\".active\"),l=!1,curr_index=i.find(\".active\").index(),n||m?m?(d(curr_index+1),$curr_slide.velocity({translateX:-1*h.innerWidth()},{duration:300,queue:!1,easing:\"easeOutQuad\",complete:function(){$curr_slide.velocity({opacity:0,translateX:0},{duration:0,queue:!1})}})):n&&(d(curr_index-1),$curr_slide.velocity({translateX:h.innerWidth()},{duration:300,queue:!1,easing:\"easeOutQuad\",complete:function(){$curr_slide.velocity({opacity:0,translateX:0},{duration:0,queue:!1})}})):$curr_slide.velocity({translateX:0},{duration:300,queue:!1,easing:\"easeOutQuad\"}),m=!1,n=!1,clearInterval(g),g=setInterval(function(){k=i.find(\".active\").index(),j.length==k+1?k=0:k+=1,d(k)},b.transition+b.interval))}),h.on(\"sliderPause\",function(){clearInterval(g)}),h.on(\"sliderStart\",function(){clearInterval(g),g=setInterval(function(){k=i.find(\".active\").index(),j.length==k+1?k=0:k+=1,d(k)},b.transition+b.interval)}),h.on(\"sliderNext\",function(){k=i.find(\".active\").index(),d(k+1)}),h.on(\"sliderPrev\",function(){k=i.find(\".active\").index(),d(k-1)})})},pause:function(){a(this).trigger(\"sliderPause\")},start:function(){a(this).trigger(\"sliderStart\")},next:function(){a(this).trigger(\"sliderNext\")},prev:function(){a(this).trigger(\"sliderPrev\")}};a.fn.slider=function(c){return b[c]?b[c].apply(this,Array.prototype.slice.call(arguments,1)):\"object\"!=typeof c&&c?void a.error(\"Method \"+c+\" does not exist on jQuery.tooltip\"):b.init.apply(this,arguments)}}(jQuery),function(a){a(document).ready(function(){a(document).on(\"click.card\",\".card\",function(b){a(this).find(\"> .card-reveal\").length&&(a(b.target).is(a(\".card-reveal .card-title\"))||a(b.target).is(a(\".card-reveal .card-title i\"))?a(this).find(\".card-reveal\").velocity({translateY:0},{duration:225,queue:!1,easing:\"easeInOutQuad\",complete:function(){a(this).css({display:\"none\"})}}):(a(b.target).is(a(\".card .activator\"))||a(b.target).is(a(\".card .activator i\")))&&(a(b.target).closest(\".card\").css(\"overflow\",\"hidden\"),a(this).find(\".card-reveal\").css({display:\"block\"}).velocity(\"stop\",!1).velocity({translateY:\"-100%\"},{duration:300,queue:!1,easing:\"easeInOutQuad\"}))),a(\".card-reveal\").closest(\".card\").css(\"overflow\",\"hidden\")})})}(jQuery),function(a){a(document).ready(function(){a(document).on(\"click.chip\",\".chip .material-icons\",function(b){a(this).parent().remove()})})}(jQuery),function(a){a(document).ready(function(){a.fn.pushpin=function(b){var c={top:0,bottom:1/0,offset:0};return b=a.extend(c,b),$index=0,this.each(function(){function c(a){a.removeClass(\"pin-top\"),a.removeClass(\"pinned\"),a.removeClass(\"pin-bottom\")}function d(d,e){d.each(function(){b.top<=e&&b.bottom>=e&&!a(this).hasClass(\"pinned\")&&(c(a(this)),a(this).css(\"top\",b.offset),a(this).addClass(\"pinned\")),e<b.top&&!a(this).hasClass(\"pin-top\")&&(c(a(this)),a(this).css(\"top\",0),a(this).addClass(\"pin-top\")),e>b.bottom&&!a(this).hasClass(\"pin-bottom\")&&(c(a(this)),a(this).addClass(\"pin-bottom\"),a(this).css(\"top\",b.bottom-g))})}var e=Materialize.guid(),f=a(this),g=a(this).offset().top;d(f,a(window).scrollTop()),a(window).on(\"scroll.\"+e,function(){var c=a(window).scrollTop()+b.offset;d(f,c)})})}})}(jQuery),function(a){a(document).ready(function(){a.fn.reverse=[].reverse,a(document).on(\"mouseenter.fixedActionBtn\",\".fixed-action-btn:not(.click-to-toggle)\",function(c){var d=a(this);b(d)}),a(document).on(\"mouseleave.fixedActionBtn\",\".fixed-action-btn:not(.click-to-toggle)\",function(b){var d=a(this);c(d)}),a(document).on(\"click.fixedActionBtn\",\".fixed-action-btn.click-to-toggle > a\",function(d){var e=a(this),f=e.parent();f.hasClass(\"active\")?c(f):b(f)})}),a.fn.extend({openFAB:function(){b(a(this))},closeFAB:function(){c(a(this))}});var b=function(b){if($this=b,$this.hasClass(\"active\")===!1){var c,d,e=$this.hasClass(\"horizontal\");e===!0?d=40:c=40,$this.addClass(\"active\"),$this.find(\"ul .btn-floating\").velocity({scaleY:\".4\",scaleX:\".4\",translateY:c+\"px\",translateX:d+\"px\"},{duration:0});var f=0;$this.find(\"ul .btn-floating\").reverse().each(function(){a(this).velocity({opacity:\"1\",scaleX:\"1\",scaleY:\"1\",translateY:\"0\",translateX:\"0\"},{duration:80,delay:f}),f+=40})}},c=function(a){$this=a;var b,c,d=$this.hasClass(\"horizontal\");d===!0?c=40:b=40,$this.removeClass(\"active\");$this.find(\"ul .btn-floating\").velocity(\"stop\",!0),$this.find(\"ul .btn-floating\").velocity({opacity:\"0\",scaleX:\".4\",scaleY:\".4\",translateY:b+\"px\",translateX:c+\"px\"},{duration:80})}}(jQuery),function(a){Materialize.fadeInImage=function(b){var c=a(b);c.css({opacity:0}),a(c).velocity({opacity:1},{duration:650,queue:!1,easing:\"easeOutSine\"}),a(c).velocity({opacity:1},{duration:1300,queue:!1,easing:\"swing\",step:function(b,c){c.start=100;var d=b/100,e=150-(100-b)/1.75;100>e&&(e=100),b>=0&&a(this).css({\"-webkit-filter\":\"grayscale(\"+d+\")brightness(\"+e+\"%)\",filter:\"grayscale(\"+d+\")brightness(\"+e+\"%)\"})}})},Materialize.showStaggeredList=function(b){var c=0;a(b).find(\"li\").velocity({translateX:\"-100px\"},{duration:0}),a(b).find(\"li\").each(function(){a(this).velocity({opacity:\"1\",translateX:\"0\"},{duration:800,delay:c,easing:[60,10]}),c+=120})},a(document).ready(function(){var b=!1,c=!1;a(\".dismissable\").each(function(){a(this).hammer({prevent_default:!1}).bind(\"pan\",function(d){if(\"touch\"===d.gesture.pointerType){var e=a(this),f=d.gesture.direction,g=d.gesture.deltaX,h=d.gesture.velocityX;e.velocity({translateX:g},{duration:50,queue:!1,easing:\"easeOutQuad\"}),4===f&&(g>e.innerWidth()/2||-.75>h)&&(b=!0),2===f&&(g<-1*e.innerWidth()/2||h>.75)&&(c=!0)}}).bind(\"panend\",function(d){if(Math.abs(d.gesture.deltaX)<a(this).innerWidth()/2&&(c=!1,b=!1),\"touch\"===d.gesture.pointerType){var e=a(this);if(b||c){var f;f=b?e.innerWidth():-1*e.innerWidth(),e.velocity({translateX:f},{duration:100,queue:!1,easing:\"easeOutQuad\",complete:function(){e.css(\"border\",\"none\"),e.velocity({height:0,padding:0},{duration:200,queue:!1,easing:\"easeOutQuad\",complete:function(){e.remove()}})}})}else e.velocity({translateX:0},{duration:100,queue:!1,easing:\"easeOutQuad\"});b=!1,c=!1}})})})}(jQuery),function(a){Materialize.scrollFire=function(a){var b=!1;window.addEventListener(\"scroll\",function(){b=!0}),setInterval(function(){if(b){b=!1;for(var c=window.pageYOffset+window.innerHeight,d=0;d<a.length;d++){var e=a[d],f=e.selector,g=e.offset,h=e.callback,i=document.querySelector(f);if(null!==i){var j=i.getBoundingClientRect().top+window.pageYOffset;if(c>j+g&&e.done!==!0){var k=new Function(h);k(),e.done=!0}}}}},100)}}(jQuery),function(a){\"function\"==typeof define&&define.amd?define(\"picker\",[\"jquery\"],a):\"object\"==typeof exports?module.exports=a(require(\"jquery\")):this.Picker=a(jQuery)}(function(a){function b(f,g,i,l){function m(){return b._.node(\"div\",b._.node(\"div\",b._.node(\"div\",b._.node(\"div\",y.component.nodes(t.open),v.box),v.wrap),v.frame),v.holder)}function n(){w.data(g,y).addClass(v.input).attr(\"tabindex\",-1).val(w.data(\"value\")?y.get(\"select\",u.format):f.value),u.editable||w.on(\"focus.\"+t.id+\" click.\"+t.id,function(a){a.preventDefault(),y.$root[0].focus()}).on(\"keydown.\"+t.id,q),e(f,{haspopup:!0,expanded:!1,readonly:!1,owns:f.id+\"_root\"})}function o(){y.$root.on({keydown:q,focusin:function(a){y.$root.removeClass(v.focused),a.stopPropagation()},\"mousedown click\":function(b){var c=b.target;c!=y.$root.children()[0]&&(b.stopPropagation(),\"mousedown\"!=b.type||a(c).is(\"input, select, textarea, button, option\")||(b.preventDefault(),y.$root[0].focus()))}}).on({focus:function(){w.addClass(v.target)},blur:function(){w.removeClass(v.target)}}).on(\"focus.toOpen\",r).on(\"click\",\"[data-pick], [data-nav], [data-clear], [data-close]\",function(){var b=a(this),c=b.data(),d=b.hasClass(v.navDisabled)||b.hasClass(v.disabled),e=h();e=e&&(e.type||e.href),(d||e&&!a.contains(y.$root[0],e))&&y.$root[0].focus(),!d&&c.nav?y.set(\"highlight\",y.component.item.highlight,{nav:c.nav}):!d&&\"pick\"in c?y.set(\"select\",c.pick):c.clear?y.clear().close(!0):c.close&&y.close(!0)}),e(y.$root[0],\"hidden\",!0)}function p(){var b;u.hiddenName===!0?(b=f.name,f.name=\"\"):(b=[\"string\"==typeof u.hiddenPrefix?u.hiddenPrefix:\"\",\"string\"==typeof u.hiddenSuffix?u.hiddenSuffix:\"_submit\"],b=b[0]+f.name+b[1]),y._hidden=a('<input type=hidden name=\"'+b+'\"'+(w.data(\"value\")||f.value?' value=\"'+y.get(\"select\",u.formatSubmit)+'\"':\"\")+\">\")[0],w.on(\"change.\"+t.id,function(){y._hidden.value=f.value?y.get(\"select\",u.formatSubmit):\"\"}),u.container?a(u.container).append(y._hidden):w.after(y._hidden)}function q(a){var b=a.keyCode,c=/^(8|46)$/.test(b);return 27==b?(y.close(),!1):void((32==b||c||!t.open&&y.component.key[b])&&(a.preventDefault(),a.stopPropagation(),c?y.clear().close():y.open()))}function r(a){a.stopPropagation(),\"focus\"==a.type&&y.$root.addClass(v.focused),y.open()}if(!f)return b;var s=!1,t={id:f.id||\"P\"+Math.abs(~~(Math.random()*new Date))},u=i?a.extend(!0,{},i.defaults,l):l||{},v=a.extend({},b.klasses(),u.klass),w=a(f),x=function(){return this.start()},y=x.prototype={constructor:x,$node:w,start:function(){return t&&t.start?y:(t.methods={},t.start=!0,t.open=!1,t.type=f.type,f.autofocus=f==h(),f.readOnly=!u.editable,f.id=f.id||t.id,\"text\"!=f.type&&(f.type=\"text\"),y.component=new i(y,u),y.$root=a(b._.node(\"div\",m(),v.picker,'id=\"'+f.id+'_root\" tabindex=\"0\"')),o(),u.formatSubmit&&p(),n(),u.container?a(u.container).append(y.$root):w.after(y.$root),y.on({start:y.component.onStart,render:y.component.onRender,stop:y.component.onStop,open:y.component.onOpen,close:y.component.onClose,set:y.component.onSet}).on({start:u.onStart,render:u.onRender,stop:u.onStop,open:u.onOpen,close:u.onClose,set:u.onSet}),s=c(y.$root.children()[0]),f.autofocus&&y.open(),y.trigger(\"start\").trigger(\"render\"))},render:function(a){return a?y.$root.html(m()):y.$root.find(\".\"+v.box).html(y.component.nodes(t.open)),y.trigger(\"render\")},stop:function(){return t.start?(y.close(),y._hidden&&y._hidden.parentNode.removeChild(y._hidden),y.$root.remove(),w.removeClass(v.input).removeData(g),setTimeout(function(){w.off(\".\"+t.id)},0),f.type=t.type,f.readOnly=!1,y.trigger(\"stop\"),t.methods={},t.start=!1,y):y},open:function(c){return t.open?y:(w.addClass(v.active),e(f,\"expanded\",!0),setTimeout(function(){y.$root.addClass(v.opened),e(y.$root[0],\"hidden\",!1)},0),c!==!1&&(t.open=!0,s&&k.css(\"overflow\",\"hidden\").css(\"padding-right\",\"+=\"+d()),y.$root[0].focus(),j.on(\"click.\"+t.id+\" focusin.\"+t.id,function(a){var b=a.target;b!=f&&b!=document&&3!=a.which&&y.close(b===y.$root.children()[0])}).on(\"keydown.\"+t.id,function(c){var d=c.keyCode,e=y.component.key[d],f=c.target;27==d?y.close(!0):f!=y.$root[0]||!e&&13!=d?a.contains(y.$root[0],f)&&13==d&&(c.preventDefault(),f.click()):(c.preventDefault(),e?b._.trigger(y.component.key.go,y,[b._.trigger(e)]):y.$root.find(\".\"+v.highlighted).hasClass(v.disabled)||y.set(\"select\",y.component.item.highlight).close())})),y.trigger(\"open\"))},close:function(a){return a&&(y.$root.off(\"focus.toOpen\")[0].focus(),setTimeout(function(){y.$root.on(\"focus.toOpen\",r)},0)),w.removeClass(v.active),e(f,\"expanded\",!1),setTimeout(function(){y.$root.removeClass(v.opened+\" \"+v.focused),e(y.$root[0],\"hidden\",!0)},0),t.open?(t.open=!1,s&&k.css(\"overflow\",\"\").css(\"padding-right\",\"-=\"+d()),j.off(\".\"+t.id),y.trigger(\"close\")):y},clear:function(a){return y.set(\"clear\",null,a)},set:function(b,c,d){var e,f,g=a.isPlainObject(b),h=g?b:{};if(d=g&&a.isPlainObject(c)?c:d||{},b){g||(h[b]=c);for(e in h)f=h[e],e in y.component.item&&(void 0===f&&(f=null),y.component.set(e,f,d)),(\"select\"==e||\"clear\"==e)&&w.val(\"clear\"==e?\"\":y.get(e,u.format)).trigger(\"change\");y.render()}return d.muted?y:y.trigger(\"set\",h)},get:function(a,c){if(a=a||\"value\",null!=t[a])return t[a];if(\"valueSubmit\"==a){if(y._hidden)return y._hidden.value;a=\"value\"}if(\"value\"==a)return f.value;if(a in y.component.item){if(\"string\"==typeof c){var d=y.component.get(a);return d?b._.trigger(y.component.formats.toString,y.component,[c,d]):\"\"}return y.component.get(a)}},on:function(b,c,d){var e,f,g=a.isPlainObject(b),h=g?b:{};if(b){g||(h[b]=c);for(e in h)f=h[e],d&&(e=\"_\"+e),t.methods[e]=t.methods[e]||[],t.methods[e].push(f)}return y},off:function(){var a,b,c=arguments;for(a=0,namesCount=c.length;a<namesCount;a+=1)b=c[a],b in t.methods&&delete t.methods[b];return y},trigger:function(a,c){var d=function(a){var d=t.methods[a];d&&d.map(function(a){b._.trigger(a,y,[c])})};return d(\"_\"+a),d(a),y}};return new x}function c(a){var b,c=\"position\";return a.currentStyle?b=a.currentStyle[c]:window.getComputedStyle&&(b=getComputedStyle(a)[c]),\"fixed\"==b}function d(){if(k.height()<=i.height())return 0;var b=a('<div style=\"visibility:hidden;width:100px\" />').appendTo(\"body\"),c=b[0].offsetWidth;b.css(\"overflow\",\"scroll\");var d=a('<div style=\"width:100%\" />').appendTo(b),e=d[0].offsetWidth;return b.remove(),c-e}function e(b,c,d){if(a.isPlainObject(c))for(var e in c)f(b,e,c[e]);else f(b,c,d)}function f(a,b,c){a.setAttribute((\"role\"==b?\"\":\"aria-\")+b,c)}function g(b,c){a.isPlainObject(b)||(b={attribute:c}),c=\"\";for(var d in b){var e=(\"role\"==d?\"\":\"aria-\")+d,f=b[d];c+=null==f?\"\":e+'=\"'+b[d]+'\"'}return c}function h(){try{return document.activeElement}catch(a){}}var i=a(window),j=a(document),k=a(document.documentElement);return b.klasses=function(a){return a=a||\"picker\",{picker:a,opened:a+\"--opened\",focused:a+\"--focused\",input:a+\"__input\",active:a+\"__input--active\",target:a+\"__input--target\",holder:a+\"__holder\",frame:a+\"__frame\",wrap:a+\"__wrap\",box:a+\"__box\"}},b._={group:function(a){for(var c,d=\"\",e=b._.trigger(a.min,a);e<=b._.trigger(a.max,a,[e]);e+=a.i)c=b._.trigger(a.item,a,[e]),d+=b._.node(a.node,c[0],c[1],c[2]);return d},node:function(b,c,d,e){return c?(c=a.isArray(c)?c.join(\"\"):c,d=d?' class=\"'+d+'\"':\"\",e=e?\" \"+e:\"\",\"<\"+b+d+e+\">\"+c+\"</\"+b+\">\"):\"\"},lead:function(a){return(10>a?\"0\":\"\")+a},trigger:function(a,b,c){return\"function\"==typeof a?a.apply(b,c||[]):a},digits:function(a){return/\\d/.test(a[1])?2:1},isDate:function(a){return{}.toString.call(a).indexOf(\"Date\")>-1&&this.isInteger(a.getDate())},isInteger:function(a){return{}.toString.call(a).indexOf(\"Number\")>-1&&a%1===0},ariaAttr:g},b.extend=function(c,d){a.fn[c]=function(e,f){var g=this.data(c);return\"picker\"==e?g:g&&\"string\"==typeof e?b._.trigger(g[e],g,[f]):this.each(function(){var f=a(this);f.data(c)||new b(this,c,d,e)})},a.fn[c].defaults=d.defaults},b}),function(a){\"function\"==typeof define&&define.amd?define([\"picker\",\"jquery\"],a):\"object\"==typeof exports?module.exports=a(require(\"./picker.js\"),require(\"jquery\")):a(Picker,jQuery)}(function(a,b){function c(a,b){var c=this,d=a.$node[0],e=d.value,f=a.$node.data(\"value\"),g=f||e,h=f?b.formatSubmit:b.format,i=function(){return d.currentStyle?\"rtl\"==d.currentStyle.direction:\"rtl\"==getComputedStyle(a.$root[0]).direction};c.settings=b,c.$node=a.$node,c.queue={min:\"measure create\",max:\"measure create\",now:\"now create\",select:\"parse create validate\",highlight:\"parse navigate create validate\",view:\"parse create validate viewset\",disable:\"deactivate\",enable:\"activate\"},c.item={},c.item.clear=null,c.item.disable=(b.disable||[]).slice(0),c.item.enable=-function(a){return a[0]===!0?a.shift():-1}(c.item.disable),c.set(\"min\",b.min).set(\"max\",b.max).set(\"now\"),g?c.set(\"select\",g,{format:h}):c.set(\"select\",null).set(\"highlight\",c.item.now),c.key={40:7,38:-7,39:function(){return i()?-1:1},37:function(){return i()?1:-1},go:function(a){var b=c.item.highlight,d=new Date(b.year,b.month,b.date+a);c.set(\"highlight\",d,{interval:a}),this.render()}},a.on(\"render\",function(){a.$root.find(\".\"+b.klass.selectMonth).on(\"change\",function(){var c=this.value;c&&(a.set(\"highlight\",[a.get(\"view\").year,c,a.get(\"highlight\").date]),a.$root.find(\".\"+b.klass.selectMonth).trigger(\"focus\"))}),a.$root.find(\".\"+b.klass.selectYear).on(\"change\",function(){var c=this.value;c&&(a.set(\"highlight\",[c,a.get(\"view\").month,a.get(\"highlight\").date]),a.$root.find(\".\"+b.klass.selectYear).trigger(\"focus\"))})},1).on(\"open\",function(){var d=\"\";c.disabled(c.get(\"now\"))&&(d=\":not(.\"+b.klass.buttonToday+\")\"),a.$root.find(\"button\"+d+\", select\").attr(\"disabled\",!1)},1).on(\"close\",function(){a.$root.find(\"button, select\").attr(\"disabled\",!0)},1)}var d=7,e=6,f=a._;c.prototype.set=function(a,b,c){var d=this,e=d.item;return null===b?(\"clear\"==a&&(a=\"select\"),e[a]=b,d):(e[\"enable\"==a?\"disable\":\"flip\"==a?\"enable\":a]=d.queue[a].split(\" \").map(function(e){return b=d[e](a,b,c)}).pop(),\"select\"==a?d.set(\"highlight\",e.select,c):\"highlight\"==a?d.set(\"view\",e.highlight,c):a.match(/^(flip|min|max|disable|enable)$/)&&(e.select&&d.disabled(e.select)&&d.set(\"select\",e.select,c),e.highlight&&d.disabled(e.highlight)&&d.set(\"highlight\",e.highlight,c)),d)},c.prototype.get=function(a){return this.item[a]},c.prototype.create=function(a,c,d){var e,g=this;return c=void 0===c?a:c,c==-(1/0)||c==1/0?e=c:b.isPlainObject(c)&&f.isInteger(c.pick)?c=c.obj:b.isArray(c)?(c=new Date(c[0],c[1],c[2]),c=f.isDate(c)?c:g.create().obj):c=f.isInteger(c)||f.isDate(c)?g.normalize(new Date(c),d):g.now(a,c,d),{year:e||c.getFullYear(),month:e||c.getMonth(),date:e||c.getDate(),day:e||c.getDay(),obj:e||c,pick:e||c.getTime()}},c.prototype.createRange=function(a,c){var d=this,e=function(a){return a===!0||b.isArray(a)||f.isDate(a)?d.create(a):a};return f.isInteger(a)||(a=e(a)),f.isInteger(c)||(c=e(c)),f.isInteger(a)&&b.isPlainObject(c)?a=[c.year,c.month,c.date+a]:f.isInteger(c)&&b.isPlainObject(a)&&(c=[a.year,a.month,a.date+c]),{from:e(a),to:e(c)}},c.prototype.withinRange=function(a,b){return a=this.createRange(a.from,a.to),b.pick>=a.from.pick&&b.pick<=a.to.pick},c.prototype.overlapRanges=function(a,b){var c=this;return a=c.createRange(a.from,a.to),b=c.createRange(b.from,b.to),c.withinRange(a,b.from)||c.withinRange(a,b.to)||c.withinRange(b,a.from)||c.withinRange(b,a.to)},c.prototype.now=function(a,b,c){return b=new Date,c&&c.rel&&b.setDate(b.getDate()+c.rel),this.normalize(b,c)},c.prototype.navigate=function(a,c,d){var e,f,g,h,i=b.isArray(c),j=b.isPlainObject(c),k=this.item.view;if(i||j){for(j?(f=c.year,g=c.month,h=c.date):(f=+c[0],g=+c[1],h=+c[2]),d&&d.nav&&k&&k.month!==g&&(f=k.year,g=k.month),e=new Date(f,g+(d&&d.nav?d.nav:0),1),f=e.getFullYear(),g=e.getMonth();new Date(f,g,h).getMonth()!==g;)h-=1;c=[f,g,h]}return c},c.prototype.normalize=function(a){return a.setHours(0,0,0,0),a},c.prototype.measure=function(a,b){var c=this;return b?\"string\"==typeof b?b=c.parse(a,b):f.isInteger(b)&&(b=c.now(a,b,{rel:b})):b=\"min\"==a?-(1/0):1/0,b},c.prototype.viewset=function(a,b){return this.create([b.year,b.month,1])},c.prototype.validate=function(a,c,d){var e,g,h,i,j=this,k=c,l=d&&d.interval?d.interval:1,m=-1===j.item.enable,n=j.item.min,o=j.item.max,p=m&&j.item.disable.filter(function(a){if(b.isArray(a)){var d=j.create(a).pick;d<c.pick?e=!0:d>c.pick&&(g=!0)}return f.isInteger(a)}).length;if((!d||!d.nav)&&(!m&&j.disabled(c)||m&&j.disabled(c)&&(p||e||g)||!m&&(c.pick<=n.pick||c.pick>=o.pick)))for(m&&!p&&(!g&&l>0||!e&&0>l)&&(l*=-1);j.disabled(c)&&(Math.abs(l)>1&&(c.month<k.month||c.month>k.month)&&(c=k,l=l>0?1:-1),c.pick<=n.pick?(h=!0,l=1,c=j.create([n.year,n.month,n.date+(c.pick===n.pick?0:-1)])):c.pick>=o.pick&&(i=!0,l=-1,c=j.create([o.year,o.month,o.date+(c.pick===o.pick?0:1)])),!h||!i);)c=j.create([c.year,c.month,c.date+l]);return c},c.prototype.disabled=function(a){var c=this,d=c.item.disable.filter(function(d){return f.isInteger(d)?a.day===(c.settings.firstDay?d:d-1)%7:b.isArray(d)||f.isDate(d)?a.pick===c.create(d).pick:b.isPlainObject(d)?c.withinRange(d,a):void 0});return d=d.length&&!d.filter(function(a){return b.isArray(a)&&\"inverted\"==a[3]||b.isPlainObject(a)&&a.inverted}).length,-1===c.item.enable?!d:d||a.pick<c.item.min.pick||a.pick>c.item.max.pick},c.prototype.parse=function(a,b,c){var d=this,e={};return b&&\"string\"==typeof b?(c&&c.format||(c=c||{},c.format=d.settings.format),d.formats.toArray(c.format).map(function(a){var c=d.formats[a],g=c?f.trigger(c,d,[b,e]):a.replace(/^!/,\"\").length;c&&(e[a]=b.substr(0,g)),b=b.substr(g)}),[e.yyyy||e.yy,+(e.mm||e.m)-1,e.dd||e.d]):b},c.prototype.formats=function(){function a(a,b,c){var d=a.match(/\\w+/)[0];return c.mm||c.m||(c.m=b.indexOf(d)+1),d.length}function b(a){return a.match(/\\w+/)[0].length}return{d:function(a,b){return a?f.digits(a):b.date},dd:function(a,b){return a?2:f.lead(b.date)},ddd:function(a,c){return a?b(a):this.settings.weekdaysShort[c.day]},dddd:function(a,c){return a?b(a):this.settings.weekdaysFull[c.day]},m:function(a,b){return a?f.digits(a):b.month+1},mm:function(a,b){return a?2:f.lead(b.month+1)},mmm:function(b,c){var d=this.settings.monthsShort;return b?a(b,d,c):d[c.month]},mmmm:function(b,c){var d=this.settings.monthsFull;return b?a(b,d,c):d[c.month]},yy:function(a,b){return a?2:(\"\"+b.year).slice(2)},yyyy:function(a,b){return a?4:b.year},toArray:function(a){return a.split(/(d{1,4}|m{1,4}|y{4}|yy|!.)/g)},toString:function(a,b){var c=this;return c.formats.toArray(a).map(function(a){return f.trigger(c.formats[a],c,[0,b])||a.replace(/^!/,\"\")}).join(\"\")}}}(),c.prototype.isDateExact=function(a,c){var d=this;return f.isInteger(a)&&f.isInteger(c)||\"boolean\"==typeof a&&\"boolean\"==typeof c?a===c:(f.isDate(a)||b.isArray(a))&&(f.isDate(c)||b.isArray(c))?d.create(a).pick===d.create(c).pick:b.isPlainObject(a)&&b.isPlainObject(c)?d.isDateExact(a.from,c.from)&&d.isDateExact(a.to,c.to):!1},c.prototype.isDateOverlap=function(a,c){var d=this,e=d.settings.firstDay?1:0;return f.isInteger(a)&&(f.isDate(c)||b.isArray(c))?(a=a%7+e,a===d.create(c).day+1):f.isInteger(c)&&(f.isDate(a)||b.isArray(a))?(c=c%7+e,c===d.create(a).day+1):b.isPlainObject(a)&&b.isPlainObject(c)?d.overlapRanges(a,c):!1},c.prototype.flipEnable=function(a){var b=this.item;b.enable=a||(-1==b.enable?1:-1)},c.prototype.deactivate=function(a,c){var d=this,e=d.item.disable.slice(0);return\"flip\"==c?d.flipEnable():c===!1?(d.flipEnable(1),e=[]):c===!0?(d.flipEnable(-1),e=[]):c.map(function(a){for(var c,g=0;g<e.length;g+=1)if(d.isDateExact(a,e[g])){c=!0;break}c||(f.isInteger(a)||f.isDate(a)||b.isArray(a)||b.isPlainObject(a)&&a.from&&a.to)&&e.push(a)}),e},c.prototype.activate=function(a,c){var d=this,e=d.item.disable,g=e.length;return\"flip\"==c?d.flipEnable():c===!0?(d.flipEnable(1),e=[]):c===!1?(d.flipEnable(-1),e=[]):c.map(function(a){var c,h,i,j;for(i=0;g>i;i+=1){if(h=e[i],d.isDateExact(h,a)){c=e[i]=null,j=!0;break}if(d.isDateOverlap(h,a)){b.isPlainObject(a)?(a.inverted=!0,c=a):b.isArray(a)?(c=a,c[3]||c.push(\"inverted\")):f.isDate(a)&&(c=[a.getFullYear(),a.getMonth(),a.getDate(),\"inverted\"]);break}}if(c)for(i=0;g>i;i+=1)if(d.isDateExact(e[i],a)){e[i]=null;break}if(j)for(i=0;g>i;i+=1)if(d.isDateOverlap(e[i],a)){e[i]=null;break}c&&e.push(c)}),e.filter(function(a){return null!=a})},c.prototype.nodes=function(a){var b=this,c=b.settings,g=b.item,h=g.now,i=g.select,j=g.highlight,k=g.view,l=g.disable,m=g.min,n=g.max,o=function(a,b){return c.firstDay&&(a.push(a.shift()),b.push(b.shift())),f.node(\"thead\",f.node(\"tr\",f.group({min:0,max:d-1,i:1,node:\"th\",item:function(d){return[a[d],c.klass.weekdays,'scope=col title=\"'+b[d]+'\"']}})))}((c.showWeekdaysFull?c.weekdaysFull:c.weekdaysLetter).slice(0),c.weekdaysFull.slice(0)),p=function(a){return f.node(\"div\",\" \",c.klass[\"nav\"+(a?\"Next\":\"Prev\")]+(a&&k.year>=n.year&&k.month>=n.month||!a&&k.year<=m.year&&k.month<=m.month?\" \"+c.klass.navDisabled:\"\"),\"data-nav=\"+(a||-1)+\" \"+f.ariaAttr({role:\"button\",controls:b.$node[0].id+\"_table\"})+' title=\"'+(a?c.labelMonthNext:c.labelMonthPrev)+'\"')},q=function(d){var e=c.showMonthsShort?c.monthsShort:c.monthsFull;return\"short_months\"==d&&(e=c.monthsShort),c.selectMonths&&void 0==d?f.node(\"select\",f.group({min:0,max:11,i:1,node:\"option\",item:function(a){return[e[a],0,\"value=\"+a+(k.month==a?\" selected\":\"\")+(k.year==m.year&&a<m.month||k.year==n.year&&a>n.month?\" disabled\":\"\")]}}),c.klass.selectMonth+\" browser-default\",(a?\"\":\"disabled\")+\" \"+f.ariaAttr({controls:b.$node[0].id+\"_table\"})+' title=\"'+c.labelMonthSelect+'\"'):\"short_months\"==d?null!=i?f.node(\"div\",e[i.month]):f.node(\"div\",e[k.month]):f.node(\"div\",e[k.month],c.klass.month)},r=function(d){var e=k.year,g=c.selectYears===!0?5:~~(c.selectYears/2);if(g){var h=m.year,i=n.year,j=e-g,l=e+g;if(h>j&&(l+=h-j,j=h),l>i){var o=j-h,p=l-i;j-=o>p?p:o,l=i}if(c.selectYears&&void 0==d)return f.node(\"select\",f.group({min:j,max:l,i:1,node:\"option\",item:function(a){return[a,0,\"value=\"+a+(e==a?\" selected\":\"\")]}}),c.klass.selectYear+\" browser-default\",(a?\"\":\"disabled\")+\" \"+f.ariaAttr({controls:b.$node[0].id+\"_table\"})+' title=\"'+c.labelYearSelect+'\"')}return\"raw\"==d?f.node(\"div\",e):f.node(\"div\",e,c.klass.year)};return createDayLabel=function(){return null!=i?f.node(\"div\",i.date):f.node(\"div\",h.date)},createWeekdayLabel=function(){var a;a=null!=i?i.day:h.day;var b=c.weekdaysFull[a];return b},f.node(\"div\",f.node(\"div\",createWeekdayLabel(),\"picker__weekday-display\")+f.node(\"div\",q(\"short_months\"),c.klass.month_display)+f.node(\"div\",createDayLabel(),c.klass.day_display)+f.node(\"div\",r(\"raw\"),c.klass.year_display),c.klass.date_display)+f.node(\"div\",f.node(\"div\",(c.selectYears?q()+r():q()+r())+p()+p(1),c.klass.header)+f.node(\"table\",o+f.node(\"tbody\",f.group({min:0,max:e-1,i:1,node:\"tr\",item:function(a){var e=c.firstDay&&0===b.create([k.year,k.month,1]).day?-7:0;return[f.group({min:d*a-k.day+e+1,max:function(){return this.min+d-1},i:1,node:\"td\",item:function(a){a=b.create([k.year,k.month,a+(c.firstDay?1:0)]);var d=i&&i.pick==a.pick,e=j&&j.pick==a.pick,g=l&&b.disabled(a)||a.pick<m.pick||a.pick>n.pick,o=f.trigger(b.formats.toString,b,[c.format,a]);return[f.node(\"div\",a.date,function(b){return b.push(k.month==a.month?c.klass.infocus:c.klass.outfocus),h.pick==a.pick&&b.push(c.klass.now),d&&b.push(c.klass.selected),e&&b.push(c.klass.highlighted),g&&b.push(c.klass.disabled),b.join(\" \")}([c.klass.day]),\"data-pick=\"+a.pick+\" \"+f.ariaAttr({role:\"gridcell\",label:o,selected:d&&b.$node.val()===o?!0:null,activedescendant:e?!0:null,disabled:g?!0:null})),\"\",f.ariaAttr({role:\"presentation\"})]}})]}})),c.klass.table,'id=\"'+b.$node[0].id+'_table\" '+f.ariaAttr({role:\"grid\",controls:b.$node[0].id,readonly:!0})),c.klass.calendar_container)+f.node(\"div\",f.node(\"button\",c.today,\"btn-flat picker__today\",\"type=button data-pick=\"+h.pick+(a&&!b.disabled(h)?\"\":\" disabled\")+\" \"+f.ariaAttr({controls:b.$node[0].id}))+f.node(\"button\",c.clear,\"btn-flat picker__clear\",\"type=button data-clear=1\"+(a?\"\":\" disabled\")+\" \"+f.ariaAttr({controls:b.$node[0].id}))+f.node(\"button\",c.close,\"btn-flat picker__close\",\"type=button data-close=true \"+(a?\"\":\" disabled\")+\" \"+f.ariaAttr({controls:b.$node[0].id})),c.klass.footer)},c.defaults=function(a){return{labelMonthNext:\"Next month\",labelMonthPrev:\"Previous month\",labelMonthSelect:\"Select a month\",labelYearSelect:\"Select a year\",monthsFull:[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"],monthsShort:[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"],weekdaysFull:[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],weekdaysShort:[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],weekdaysLetter:[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],today:\"Today\",clear:\"Clear\",close:\"Close\",format:\"d mmmm, yyyy\",klass:{table:a+\"table\",header:a+\"header\",date_display:a+\"date-display\",day_display:a+\"day-display\",month_display:a+\"month-display\",year_display:a+\"year-display\",calendar_container:a+\"calendar-container\",navPrev:a+\"nav--prev\",navNext:a+\"nav--next\",navDisabled:a+\"nav--disabled\",month:a+\"month\",year:a+\"year\",selectMonth:a+\"select--month\",selectYear:a+\"select--year\",weekdays:a+\"weekday\",day:a+\"day\",disabled:a+\"day--disabled\",selected:a+\"day--selected\",highlighted:a+\"day--highlighted\",now:a+\"day--today\",infocus:a+\"day--infocus\",outfocus:a+\"day--outfocus\",footer:a+\"footer\",buttonClear:a+\"button--clear\",buttonToday:a+\"button--today\",buttonClose:a+\"button--close\"}}}(a.klasses().picker+\"__\"),a.extend(\"pickadate\",c)}),function(a){function b(){var b=+a(this).attr(\"length\"),c=+a(this).val().length,d=b>=c;a(this).parent().find('span[class=\"character-counter\"]').html(c+\"/\"+b),e(d,a(this))}function c(b){var c=a(\"<span/>\").addClass(\"character-counter\").css(\"float\",\"right\").css(\"font-size\",\"12px\").css(\"height\",1);b.parent().append(c)}function d(){a(this).parent().find('span[class=\"character-counter\"]').html(\"\")}function e(a,b){var c=b.hasClass(\"invalid\");a&&c?b.removeClass(\"invalid\"):a||c||(b.removeClass(\"valid\"),b.addClass(\"invalid\"))}a.fn.characterCounter=function(){return this.each(function(){var e=void 0!==a(this).attr(\"length\");e&&(a(this).on(\"input\",b),a(this).on(\"focus\",b),a(this).on(\"blur\",d),c(a(this)))})},a(document).ready(function(){a(\"input, textarea\").characterCounter()})}(jQuery),function(a){var b={init:function(b){var c={time_constant:200,dist:-100,shift:0,padding:0,full_width:!1};return b=a.extend(c,b),this.each(function(){function c(){\"undefined\"!=typeof window.ontouchstart&&(F[0].addEventListener(\"touchstart\",k),F[0].addEventListener(\"touchmove\",l),F[0].addEventListener(\"touchend\",m)),F[0].addEventListener(\"mousedown\",k),F[0].addEventListener(\"mousemove\",l),F[0].addEventListener(\"mouseup\",m),F[0].addEventListener(\"click\",j)}function d(a){return a.targetTouches&&a.targetTouches.length>=1?a.targetTouches[0].clientX:a.clientX}function e(a){return a.targetTouches&&a.targetTouches.length>=1?a.targetTouches[0].clientY:a.clientY}function f(a){return a>=s?a%s:0>a?f(s+a%s):a}function g(a){var c,d,e,g,h,i,j;for(o=\"number\"==typeof a?a:o,p=Math.floor((o+r/2)/r),e=o-p*r,g=0>e?1:-1,h=-g*e*2/r,b.full_width?j=\"translateX(0)\":(j=\"translateX(\"+(F[0].clientWidth-item_width)/2+\"px) \",j+=\"translateY(\"+(F[0].clientHeight-item_width)/2+\"px)\"),i=n[f(p)],i.style[z]=j+\" translateX(\"+-e/2+\"px) translateX(\"+g*b.shift*h*c+\"px) translateZ(\"+b.dist*h+\"px)\",i.style.zIndex=0,b.full_width?tweenedOpacity=1:tweenedOpacity=1-.2*h,i.style.opacity=tweenedOpacity,d=s>>1,c=1;d>=c;++c)b.full_width?(zTranslation=b.dist,tweenedOpacity=c===d&&0>e?1-h:1):(zTranslation=b.dist*(2*c+h*g),tweenedOpacity=1-.2*(2*c+h*g)),i=n[f(p+c)],i.style[z]=j+\" translateX(\"+(b.shift+(r*c-e)/2)+\"px) translateZ(\"+zTranslation+\"px)\",i.style.zIndex=-c,i.style.opacity=tweenedOpacity,b.full_width?(zTranslation=b.dist,tweenedOpacity=c===d&&e>0?1-h:1):(zTranslation=b.dist*(2*c-h*g),tweenedOpacity=1-.2*(2*c-h*g)),i=n[f(p-c)],i.style[z]=j+\" translateX(\"+(-b.shift+(-r*c-e)/2)+\"px) translateZ(\"+zTranslation+\"px)\",i.style.zIndex=-c,i.style.opacity=tweenedOpacity;i=n[f(p)],i.style[z]=j+\" translateX(\"+-e/2+\"px) translateX(\"+g*b.shift*h+\"px) translateZ(\"+b.dist*h+\"px)\",i.style.zIndex=0,b.full_width?tweenedOpacity=1:tweenedOpacity=1-.2*h,\ni.style.opacity=tweenedOpacity}function h(){var a,b,c,d;a=Date.now(),b=a-B,B=a,c=o-A,A=o,d=1e3*c/(1+b),x=.8*d+.2*x}function i(){var a,c;v&&(a=Date.now()-B,c=v*Math.exp(-a/b.time_constant),c>2||-2>c?(g(w-c),requestAnimationFrame(i)):g(w))}function j(c){if(D)return c.preventDefault(),c.stopPropagation(),!1;if(!b.full_width){var d=a(c.target).closest(\".carousel-item\").index(),e=p%s-d;0>e?Math.abs(e+s)<Math.abs(e)&&(e+=s):e>0&&Math.abs(e-s)<e&&(e-=s),0>e?a(this).trigger(\"carouselNext\",[Math.abs(e)]):e>0&&a(this).trigger(\"carouselPrev\",[e])}}function k(a){q=!0,D=!1,E=!1,t=d(a),u=e(a),x=v=0,A=o,B=Date.now(),clearInterval(C),C=setInterval(h,100)}function l(a){var b,c,f;if(q)if(b=d(a),y=e(a),c=t-b,f=Math.abs(u-y),30>f&&!E)(c>2||-2>c)&&(D=!0,t=b,g(o+c));else{if(D)return a.preventDefault(),a.stopPropagation(),!1;E=!0}return D?(a.preventDefault(),a.stopPropagation(),!1):void 0}function m(a){return q=!1,clearInterval(C),w=o,(x>10||-10>x)&&(v=.9*x,w=o+v),w=Math.round(w/r)*r,v=w-o,B=Date.now(),requestAnimationFrame(i),a.preventDefault(),a.stopPropagation(),!1}var n,o,p,q,r,s,t,u,v,w,x,z,A,B,C,D,E,F=a(this);return F.hasClass(\"initialized\")?!0:(b.full_width&&(b.dist=0,imageHeight=F.find(\".carousel-item img\").first().load(function(){F.css(\"height\",a(this).height())})),F.addClass(\"initialized\"),q=!1,o=w=0,n=[],item_width=F.find(\".carousel-item\").first().innerWidth(),r=2*item_width+b.padding,F.find(\".carousel-item\").each(function(){n.push(a(this)[0])}),s=n.length,z=\"transform\",[\"webkit\",\"Moz\",\"O\",\"ms\"].every(function(a){var b=a+\"Transform\";return\"undefined\"!=typeof document.body.style[b]?(z=b,!1):!0}),window.onresize=g,c(),g(o),a(this).on(\"carouselNext\",function(a,b){void 0===b&&(b=1),w=o+r*b,o!==w&&(v=w-o,B=Date.now(),requestAnimationFrame(i))}),void a(this).on(\"carouselPrev\",function(a,b){void 0===b&&(b=1),w=o-r*b,o!==w&&(v=w-o,B=Date.now(),requestAnimationFrame(i))}))})},next:function(b){a(this).trigger(\"carouselNext\",[b])},prev:function(b){a(this).trigger(\"carouselPrev\",[b])}};a.fn.carousel=function(c){return b[c]?b[c].apply(this,Array.prototype.slice.call(arguments,1)):\"object\"!=typeof c&&c?void a.error(\"Method \"+c+\" does not exist on jQuery.carousel\"):b.init.apply(this,arguments)}}(jQuery);"
  },
  {
    "path": "themes/default/public/js/sidenav.js",
    "content": "$(document).ready(function() {\n    $(\".button-collapse\").sideNav();\n});\n"
  },
  {
    "path": "themes/default/public/js/sjcl.js",
    "content": "\"use strict\";var sjcl={cipher:{},hash:{},keyexchange:{},mode:{},misc:{},codec:{},exception:{corrupt:function(a){this.toString=function(){return\"CORRUPT: \"+this.message};this.message=a},invalid:function(a){this.toString=function(){return\"INVALID: \"+this.message};this.message=a},bug:function(a){this.toString=function(){return\"BUG: \"+this.message};this.message=a},notReady:function(a){this.toString=function(){return\"NOT READY: \"+this.message};this.message=a}}};\nsjcl.cipher.aes=function(a){this.s[0][0][0]||this.O();var b,c,d,e,f=this.s[0][4],g=this.s[1];b=a.length;var h=1;if(4!==b&&6!==b&&8!==b)throw new sjcl.exception.invalid(\"invalid aes key size\");this.b=[d=a.slice(0),e=[]];for(a=b;a<4*b+28;a++){c=d[a-1];if(0===a%b||8===b&&4===a%b)c=f[c>>>24]<<24^f[c>>16&255]<<16^f[c>>8&255]<<8^f[c&255],0===a%b&&(c=c<<8^c>>>24^h<<24,h=h<<1^283*(h>>7));d[a]=d[a-b]^c}for(b=0;a;b++,a--)c=d[b&3?a:a-4],e[b]=4>=a||4>b?c:g[0][f[c>>>24]]^g[1][f[c>>16&255]]^g[2][f[c>>8&255]]^g[3][f[c&\n255]]};\nsjcl.cipher.aes.prototype={encrypt:function(a){return t(this,a,0)},decrypt:function(a){return t(this,a,1)},s:[[[],[],[],[],[]],[[],[],[],[],[]]],O:function(){var a=this.s[0],b=this.s[1],c=a[4],d=b[4],e,f,g,h=[],k=[],l,n,m,p;for(e=0;0x100>e;e++)k[(h[e]=e<<1^283*(e>>7))^e]=e;for(f=g=0;!c[f];f^=l||1,g=k[g]||1)for(m=g^g<<1^g<<2^g<<3^g<<4,m=m>>8^m&255^99,c[f]=m,d[m]=f,n=h[e=h[l=h[f]]],p=0x1010101*n^0x10001*e^0x101*l^0x1010100*f,n=0x101*h[m]^0x1010100*m,e=0;4>e;e++)a[e][f]=n=n<<24^n>>>8,b[e][m]=p=p<<24^p>>>8;for(e=\n0;5>e;e++)a[e]=a[e].slice(0),b[e]=b[e].slice(0)}};\nfunction t(a,b,c){if(4!==b.length)throw new sjcl.exception.invalid(\"invalid aes block size\");var d=a.b[c],e=b[0]^d[0],f=b[c?3:1]^d[1],g=b[2]^d[2];b=b[c?1:3]^d[3];var h,k,l,n=d.length/4-2,m,p=4,r=[0,0,0,0];h=a.s[c];a=h[0];var q=h[1],v=h[2],w=h[3],x=h[4];for(m=0;m<n;m++)h=a[e>>>24]^q[f>>16&255]^v[g>>8&255]^w[b&255]^d[p],k=a[f>>>24]^q[g>>16&255]^v[b>>8&255]^w[e&255]^d[p+1],l=a[g>>>24]^q[b>>16&255]^v[e>>8&255]^w[f&255]^d[p+2],b=a[b>>>24]^q[e>>16&255]^v[f>>8&255]^w[g&255]^d[p+3],p+=4,e=h,f=k,g=l;for(m=\n0;4>m;m++)r[c?3&-m:m]=x[e>>>24]<<24^x[f>>16&255]<<16^x[g>>8&255]<<8^x[b&255]^d[p++],h=e,e=f,f=g,g=b,b=h;return r}\nsjcl.bitArray={bitSlice:function(a,b,c){a=sjcl.bitArray.$(a.slice(b/32),32-(b&31)).slice(1);return void 0===c?a:sjcl.bitArray.clamp(a,c-b)},extract:function(a,b,c){var d=Math.floor(-b-c&31);return((b+c-1^b)&-32?a[b/32|0]<<32-d^a[b/32+1|0]>>>d:a[b/32|0]>>>d)&(1<<c)-1},concat:function(a,b){if(0===a.length||0===b.length)return a.concat(b);var c=a[a.length-1],d=sjcl.bitArray.getPartial(c);return 32===d?a.concat(b):sjcl.bitArray.$(b,d,c|0,a.slice(0,a.length-1))},bitLength:function(a){var b=a.length;return 0===\nb?0:32*(b-1)+sjcl.bitArray.getPartial(a[b-1])},clamp:function(a,b){if(32*a.length<b)return a;a=a.slice(0,Math.ceil(b/32));var c=a.length;b=b&31;0<c&&b&&(a[c-1]=sjcl.bitArray.partial(b,a[c-1]&2147483648>>b-1,1));return a},partial:function(a,b,c){return 32===a?b:(c?b|0:b<<32-a)+0x10000000000*a},getPartial:function(a){return Math.round(a/0x10000000000)||32},equal:function(a,b){if(sjcl.bitArray.bitLength(a)!==sjcl.bitArray.bitLength(b))return!1;var c=0,d;for(d=0;d<a.length;d++)c|=a[d]^b[d];return 0===\nc},$:function(a,b,c,d){var e;e=0;for(void 0===d&&(d=[]);32<=b;b-=32)d.push(c),c=0;if(0===b)return d.concat(a);for(e=0;e<a.length;e++)d.push(c|a[e]>>>b),c=a[e]<<32-b;e=a.length?a[a.length-1]:0;a=sjcl.bitArray.getPartial(e);d.push(sjcl.bitArray.partial(b+a&31,32<b+a?c:d.pop(),1));return d},i:function(a,b){return[a[0]^b[0],a[1]^b[1],a[2]^b[2],a[3]^b[3]]},byteswapM:function(a){var b,c;for(b=0;b<a.length;++b)c=a[b],a[b]=c>>>24|c>>>8&0xff00|(c&0xff00)<<8|c<<24;return a}};\nsjcl.codec.utf8String={fromBits:function(a){var b=\"\",c=sjcl.bitArray.bitLength(a),d,e;for(d=0;d<c/8;d++)0===(d&3)&&(e=a[d/4]),b+=String.fromCharCode(e>>>8>>>8>>>8),e<<=8;return decodeURIComponent(escape(b))},toBits:function(a){a=unescape(encodeURIComponent(a));var b=[],c,d=0;for(c=0;c<a.length;c++)d=d<<8|a.charCodeAt(c),3===(c&3)&&(b.push(d),d=0);c&3&&b.push(sjcl.bitArray.partial(8*(c&3),d));return b}};\nsjcl.codec.hex={fromBits:function(a){var b=\"\",c;for(c=0;c<a.length;c++)b+=((a[c]|0)+0xf00000000000).toString(16).substr(4);return b.substr(0,sjcl.bitArray.bitLength(a)/4)},toBits:function(a){var b,c=[],d;a=a.replace(/\\s|0x/g,\"\");d=a.length;a=a+\"00000000\";for(b=0;b<a.length;b+=8)c.push(parseInt(a.substr(b,8),16)^0);return sjcl.bitArray.clamp(c,4*d)}};\nsjcl.codec.base32={B:\"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567\",X:\"0123456789ABCDEFGHIJKLMNOPQRSTUV\",BITS:32,BASE:5,REMAINING:27,fromBits:function(a,b,c){var d=sjcl.codec.base32.BASE,e=sjcl.codec.base32.REMAINING,f=\"\",g=0,h=sjcl.codec.base32.B,k=0,l=sjcl.bitArray.bitLength(a);c&&(h=sjcl.codec.base32.X);for(c=0;f.length*d<l;)f+=h.charAt((k^a[c]>>>g)>>>e),g<d?(k=a[c]<<d-g,g+=e,c++):(k<<=d,g-=d);for(;f.length&7&&!b;)f+=\"=\";return f},toBits:function(a,b){a=a.replace(/\\s|=/g,\"\").toUpperCase();var c=sjcl.codec.base32.BITS,\nd=sjcl.codec.base32.BASE,e=sjcl.codec.base32.REMAINING,f=[],g,h=0,k=sjcl.codec.base32.B,l=0,n,m=\"base32\";b&&(k=sjcl.codec.base32.X,m=\"base32hex\");for(g=0;g<a.length;g++){n=k.indexOf(a.charAt(g));if(0>n){if(!b)try{return sjcl.codec.base32hex.toBits(a)}catch(p){}throw new sjcl.exception.invalid(\"this isn't \"+m+\"!\");}h>e?(h-=e,f.push(l^n>>>h),l=n<<c-h):(h+=d,l^=n<<c-h)}h&56&&f.push(sjcl.bitArray.partial(h&56,l,1));return f}};\nsjcl.codec.base32hex={fromBits:function(a,b){return sjcl.codec.base32.fromBits(a,b,1)},toBits:function(a){return sjcl.codec.base32.toBits(a,1)}};\nsjcl.codec.base64={B:\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\",fromBits:function(a,b,c){var d=\"\",e=0,f=sjcl.codec.base64.B,g=0,h=sjcl.bitArray.bitLength(a);c&&(f=f.substr(0,62)+\"-_\");for(c=0;6*d.length<h;)d+=f.charAt((g^a[c]>>>e)>>>26),6>e?(g=a[c]<<6-e,e+=26,c++):(g<<=6,e-=6);for(;d.length&3&&!b;)d+=\"=\";return d},toBits:function(a,b){a=a.replace(/\\s|=/g,\"\");var c=[],d,e=0,f=sjcl.codec.base64.B,g=0,h;b&&(f=f.substr(0,62)+\"-_\");for(d=0;d<a.length;d++){h=f.indexOf(a.charAt(d));\nif(0>h)throw new sjcl.exception.invalid(\"this isn't base64!\");26<e?(e-=26,c.push(g^h>>>e),g=h<<32-e):(e+=6,g^=h<<32-e)}e&56&&c.push(sjcl.bitArray.partial(e&56,g,1));return c}};sjcl.codec.base64url={fromBits:function(a){return sjcl.codec.base64.fromBits(a,1,1)},toBits:function(a){return sjcl.codec.base64.toBits(a,1)}};sjcl.hash.sha256=function(a){this.b[0]||this.O();a?(this.F=a.F.slice(0),this.A=a.A.slice(0),this.l=a.l):this.reset()};sjcl.hash.sha256.hash=function(a){return(new sjcl.hash.sha256).update(a).finalize()};\nsjcl.hash.sha256.prototype={blockSize:512,reset:function(){this.F=this.Y.slice(0);this.A=[];this.l=0;return this},update:function(a){\"string\"===typeof a&&(a=sjcl.codec.utf8String.toBits(a));var b,c=this.A=sjcl.bitArray.concat(this.A,a);b=this.l;a=this.l=b+sjcl.bitArray.bitLength(a);if(0x1fffffffffffff<a)throw new sjcl.exception.invalid(\"Cannot hash more than 2^53 - 1 bits\");if(\"undefined\"!==typeof Uint32Array){var d=new Uint32Array(c),e=0;for(b=512+b-(512+b&0x1ff);b<=a;b+=512)u(this,d.subarray(16*e,\n16*(e+1))),e+=1;c.splice(0,16*e)}else for(b=512+b-(512+b&0x1ff);b<=a;b+=512)u(this,c.splice(0,16));return this},finalize:function(){var a,b=this.A,c=this.F,b=sjcl.bitArray.concat(b,[sjcl.bitArray.partial(1,1)]);for(a=b.length+2;a&15;a++)b.push(0);b.push(Math.floor(this.l/0x100000000));for(b.push(this.l|0);b.length;)u(this,b.splice(0,16));this.reset();return c},Y:[],b:[],O:function(){function a(a){return 0x100000000*(a-Math.floor(a))|0}for(var b=0,c=2,d,e;64>b;c++){e=!0;for(d=2;d*d<=c;d++)if(0===c%d){e=\n!1;break}e&&(8>b&&(this.Y[b]=a(Math.pow(c,.5))),this.b[b]=a(Math.pow(c,1/3)),b++)}}};\nfunction u(a,b){var c,d,e,f=a.F,g=a.b,h=f[0],k=f[1],l=f[2],n=f[3],m=f[4],p=f[5],r=f[6],q=f[7];for(c=0;64>c;c++)16>c?d=b[c]:(d=b[c+1&15],e=b[c+14&15],d=b[c&15]=(d>>>7^d>>>18^d>>>3^d<<25^d<<14)+(e>>>17^e>>>19^e>>>10^e<<15^e<<13)+b[c&15]+b[c+9&15]|0),d=d+q+(m>>>6^m>>>11^m>>>25^m<<26^m<<21^m<<7)+(r^m&(p^r))+g[c],q=r,r=p,p=m,m=n+d|0,n=l,l=k,k=h,h=d+(k&l^n&(k^l))+(k>>>2^k>>>13^k>>>22^k<<30^k<<19^k<<10)|0;f[0]=f[0]+h|0;f[1]=f[1]+k|0;f[2]=f[2]+l|0;f[3]=f[3]+n|0;f[4]=f[4]+m|0;f[5]=f[5]+p|0;f[6]=f[6]+r|0;f[7]=\nf[7]+q|0}\nsjcl.mode.ccm={name:\"ccm\",G:[],listenProgress:function(a){sjcl.mode.ccm.G.push(a)},unListenProgress:function(a){a=sjcl.mode.ccm.G.indexOf(a);-1<a&&sjcl.mode.ccm.G.splice(a,1)},fa:function(a){var b=sjcl.mode.ccm.G.slice(),c;for(c=0;c<b.length;c+=1)b[c](a)},encrypt:function(a,b,c,d,e){var f,g=b.slice(0),h=sjcl.bitArray,k=h.bitLength(c)/8,l=h.bitLength(g)/8;e=e||64;d=d||[];if(7>k)throw new sjcl.exception.invalid(\"ccm: iv must be at least 7 bytes\");for(f=2;4>f&&l>>>8*f;f++);f<15-k&&(f=15-k);c=h.clamp(c,\n8*(15-f));b=sjcl.mode.ccm.V(a,b,c,d,e,f);g=sjcl.mode.ccm.C(a,g,c,b,e,f);return h.concat(g.data,g.tag)},decrypt:function(a,b,c,d,e){e=e||64;d=d||[];var f=sjcl.bitArray,g=f.bitLength(c)/8,h=f.bitLength(b),k=f.clamp(b,h-e),l=f.bitSlice(b,h-e),h=(h-e)/8;if(7>g)throw new sjcl.exception.invalid(\"ccm: iv must be at least 7 bytes\");for(b=2;4>b&&h>>>8*b;b++);b<15-g&&(b=15-g);c=f.clamp(c,8*(15-b));k=sjcl.mode.ccm.C(a,k,c,l,e,b);a=sjcl.mode.ccm.V(a,k.data,c,d,e,b);if(!f.equal(k.tag,a))throw new sjcl.exception.corrupt(\"ccm: tag doesn't match\");\nreturn k.data},na:function(a,b,c,d,e,f){var g=[],h=sjcl.bitArray,k=h.i;d=[h.partial(8,(b.length?64:0)|d-2<<2|f-1)];d=h.concat(d,c);d[3]|=e;d=a.encrypt(d);if(b.length)for(c=h.bitLength(b)/8,65279>=c?g=[h.partial(16,c)]:0xffffffff>=c&&(g=h.concat([h.partial(16,65534)],[c])),g=h.concat(g,b),b=0;b<g.length;b+=4)d=a.encrypt(k(d,g.slice(b,b+4).concat([0,0,0])));return d},V:function(a,b,c,d,e,f){var g=sjcl.bitArray,h=g.i;e/=8;if(e%2||4>e||16<e)throw new sjcl.exception.invalid(\"ccm: invalid tag length\");\nif(0xffffffff<d.length||0xffffffff<b.length)throw new sjcl.exception.bug(\"ccm: can't deal with 4GiB or more data\");c=sjcl.mode.ccm.na(a,d,c,e,g.bitLength(b)/8,f);for(d=0;d<b.length;d+=4)c=a.encrypt(h(c,b.slice(d,d+4).concat([0,0,0])));return g.clamp(c,8*e)},C:function(a,b,c,d,e,f){var g,h=sjcl.bitArray;g=h.i;var k=b.length,l=h.bitLength(b),n=k/50,m=n;c=h.concat([h.partial(8,f-1)],c).concat([0,0,0]).slice(0,4);d=h.bitSlice(g(d,a.encrypt(c)),0,e);if(!k)return{tag:d,data:[]};for(g=0;g<k;g+=4)g>n&&(sjcl.mode.ccm.fa(g/\nk),n+=m),c[3]++,e=a.encrypt(c),b[g]^=e[0],b[g+1]^=e[1],b[g+2]^=e[2],b[g+3]^=e[3];return{tag:d,data:h.clamp(b,l)}}};\nsjcl.mode.ocb2={name:\"ocb2\",encrypt:function(a,b,c,d,e,f){if(128!==sjcl.bitArray.bitLength(c))throw new sjcl.exception.invalid(\"ocb iv must be 128 bits\");var g,h=sjcl.mode.ocb2.S,k=sjcl.bitArray,l=k.i,n=[0,0,0,0];c=h(a.encrypt(c));var m,p=[];d=d||[];e=e||64;for(g=0;g+4<b.length;g+=4)m=b.slice(g,g+4),n=l(n,m),p=p.concat(l(c,a.encrypt(l(c,m)))),c=h(c);m=b.slice(g);b=k.bitLength(m);g=a.encrypt(l(c,[0,0,0,b]));m=k.clamp(l(m.concat([0,0,0]),g),b);n=l(n,l(m.concat([0,0,0]),g));n=a.encrypt(l(n,l(c,h(c))));\nd.length&&(n=l(n,f?d:sjcl.mode.ocb2.pmac(a,d)));return p.concat(k.concat(m,k.clamp(n,e)))},decrypt:function(a,b,c,d,e,f){if(128!==sjcl.bitArray.bitLength(c))throw new sjcl.exception.invalid(\"ocb iv must be 128 bits\");e=e||64;var g=sjcl.mode.ocb2.S,h=sjcl.bitArray,k=h.i,l=[0,0,0,0],n=g(a.encrypt(c)),m,p,r=sjcl.bitArray.bitLength(b)-e,q=[];d=d||[];for(c=0;c+4<r/32;c+=4)m=k(n,a.decrypt(k(n,b.slice(c,c+4)))),l=k(l,m),q=q.concat(m),n=g(n);p=r-32*c;m=a.encrypt(k(n,[0,0,0,p]));m=k(m,h.clamp(b.slice(c),p).concat([0,\n0,0]));l=k(l,m);l=a.encrypt(k(l,k(n,g(n))));d.length&&(l=k(l,f?d:sjcl.mode.ocb2.pmac(a,d)));if(!h.equal(h.clamp(l,e),h.bitSlice(b,r)))throw new sjcl.exception.corrupt(\"ocb: tag doesn't match\");return q.concat(h.clamp(m,p))},pmac:function(a,b){var c,d=sjcl.mode.ocb2.S,e=sjcl.bitArray,f=e.i,g=[0,0,0,0],h=a.encrypt([0,0,0,0]),h=f(h,d(d(h)));for(c=0;c+4<b.length;c+=4)h=d(h),g=f(g,a.encrypt(f(h,b.slice(c,c+4))));c=b.slice(c);128>e.bitLength(c)&&(h=f(h,d(h)),c=e.concat(c,[-2147483648,0,0,0]));g=f(g,c);\nreturn a.encrypt(f(d(f(h,d(h))),g))},S:function(a){return[a[0]<<1^a[1]>>>31,a[1]<<1^a[2]>>>31,a[2]<<1^a[3]>>>31,a[3]<<1^135*(a[0]>>>31)]}};\nsjcl.mode.gcm={name:\"gcm\",encrypt:function(a,b,c,d,e){var f=b.slice(0);b=sjcl.bitArray;d=d||[];a=sjcl.mode.gcm.C(!0,a,f,d,c,e||128);return b.concat(a.data,a.tag)},decrypt:function(a,b,c,d,e){var f=b.slice(0),g=sjcl.bitArray,h=g.bitLength(f);e=e||128;d=d||[];e<=h?(b=g.bitSlice(f,h-e),f=g.bitSlice(f,0,h-e)):(b=f,f=[]);a=sjcl.mode.gcm.C(!1,a,f,d,c,e);if(!g.equal(a.tag,b))throw new sjcl.exception.corrupt(\"gcm: tag doesn't match\");return a.data},ka:function(a,b){var c,d,e,f,g,h=sjcl.bitArray.i;e=[0,0,\n0,0];f=b.slice(0);for(c=0;128>c;c++){(d=0!==(a[Math.floor(c/32)]&1<<31-c%32))&&(e=h(e,f));g=0!==(f[3]&1);for(d=3;0<d;d--)f[d]=f[d]>>>1|(f[d-1]&1)<<31;f[0]>>>=1;g&&(f[0]^=-0x1f000000)}return e},j:function(a,b,c){var d,e=c.length;b=b.slice(0);for(d=0;d<e;d+=4)b[0]^=0xffffffff&c[d],b[1]^=0xffffffff&c[d+1],b[2]^=0xffffffff&c[d+2],b[3]^=0xffffffff&c[d+3],b=sjcl.mode.gcm.ka(b,a);return b},C:function(a,b,c,d,e,f){var g,h,k,l,n,m,p,r,q=sjcl.bitArray;m=c.length;p=q.bitLength(c);r=q.bitLength(d);h=q.bitLength(e);\ng=b.encrypt([0,0,0,0]);96===h?(e=e.slice(0),e=q.concat(e,[1])):(e=sjcl.mode.gcm.j(g,[0,0,0,0],e),e=sjcl.mode.gcm.j(g,e,[0,0,Math.floor(h/0x100000000),h&0xffffffff]));h=sjcl.mode.gcm.j(g,[0,0,0,0],d);n=e.slice(0);d=h.slice(0);a||(d=sjcl.mode.gcm.j(g,h,c));for(l=0;l<m;l+=4)n[3]++,k=b.encrypt(n),c[l]^=k[0],c[l+1]^=k[1],c[l+2]^=k[2],c[l+3]^=k[3];c=q.clamp(c,p);a&&(d=sjcl.mode.gcm.j(g,h,c));a=[Math.floor(r/0x100000000),r&0xffffffff,Math.floor(p/0x100000000),p&0xffffffff];d=sjcl.mode.gcm.j(g,d,a);k=b.encrypt(e);\nd[0]^=k[0];d[1]^=k[1];d[2]^=k[2];d[3]^=k[3];return{tag:q.bitSlice(d,0,f),data:c}}};sjcl.misc.hmac=function(a,b){this.W=b=b||sjcl.hash.sha256;var c=[[],[]],d,e=b.prototype.blockSize/32;this.w=[new b,new b];a.length>e&&(a=b.hash(a));for(d=0;d<e;d++)c[0][d]=a[d]^909522486,c[1][d]=a[d]^1549556828;this.w[0].update(c[0]);this.w[1].update(c[1]);this.R=new b(this.w[0])};\nsjcl.misc.hmac.prototype.encrypt=sjcl.misc.hmac.prototype.mac=function(a){if(this.aa)throw new sjcl.exception.invalid(\"encrypt on already updated hmac called!\");this.update(a);return this.digest(a)};sjcl.misc.hmac.prototype.reset=function(){this.R=new this.W(this.w[0]);this.aa=!1};sjcl.misc.hmac.prototype.update=function(a){this.aa=!0;this.R.update(a)};sjcl.misc.hmac.prototype.digest=function(){var a=this.R.finalize(),a=(new this.W(this.w[1])).update(a).finalize();this.reset();return a};\nsjcl.misc.pbkdf2=function(a,b,c,d,e){c=c||1E4;if(0>d||0>c)throw new sjcl.exception.invalid(\"invalid params to pbkdf2\");\"string\"===typeof a&&(a=sjcl.codec.utf8String.toBits(a));\"string\"===typeof b&&(b=sjcl.codec.utf8String.toBits(b));e=e||sjcl.misc.hmac;a=new e(a);var f,g,h,k,l=[],n=sjcl.bitArray;for(k=1;32*l.length<(d||1);k++){e=f=a.encrypt(n.concat(b,[k]));for(g=1;g<c;g++)for(f=a.encrypt(f),h=0;h<f.length;h++)e[h]^=f[h];l=l.concat(e)}d&&(l=n.clamp(l,d));return l};\nsjcl.prng=function(a){this.c=[new sjcl.hash.sha256];this.m=[0];this.P=0;this.H={};this.N=0;this.U={};this.Z=this.f=this.o=this.ha=0;this.b=[0,0,0,0,0,0,0,0];this.h=[0,0,0,0];this.L=void 0;this.M=a;this.D=!1;this.K={progress:{},seeded:{}};this.u=this.ga=0;this.I=1;this.J=2;this.ca=0x10000;this.T=[0,48,64,96,128,192,0x100,384,512,768,1024];this.da=3E4;this.ba=80};\nsjcl.prng.prototype={randomWords:function(a,b){var c=[],d;d=this.isReady(b);var e;if(d===this.u)throw new sjcl.exception.notReady(\"generator isn't seeded\");if(d&this.J){d=!(d&this.I);e=[];var f=0,g;this.Z=e[0]=(new Date).valueOf()+this.da;for(g=0;16>g;g++)e.push(0x100000000*Math.random()|0);for(g=0;g<this.c.length&&(e=e.concat(this.c[g].finalize()),f+=this.m[g],this.m[g]=0,d||!(this.P&1<<g));g++);this.P>=1<<this.c.length&&(this.c.push(new sjcl.hash.sha256),this.m.push(0));this.f-=f;f>this.o&&(this.o=\nf);this.P++;this.b=sjcl.hash.sha256.hash(this.b.concat(e));this.L=new sjcl.cipher.aes(this.b);for(d=0;4>d&&(this.h[d]=this.h[d]+1|0,!this.h[d]);d++);}for(d=0;d<a;d+=4)0===(d+1)%this.ca&&y(this),e=z(this),c.push(e[0],e[1],e[2],e[3]);y(this);return c.slice(0,a)},setDefaultParanoia:function(a,b){if(0===a&&\"Setting paranoia=0 will ruin your security; use it only for testing\"!==b)throw new sjcl.exception.invalid(\"Setting paranoia=0 will ruin your security; use it only for testing\");this.M=a},addEntropy:function(a,\nb,c){c=c||\"user\";var d,e,f=(new Date).valueOf(),g=this.H[c],h=this.isReady(),k=0;d=this.U[c];void 0===d&&(d=this.U[c]=this.ha++);void 0===g&&(g=this.H[c]=0);this.H[c]=(this.H[c]+1)%this.c.length;switch(typeof a){case \"number\":void 0===b&&(b=1);this.c[g].update([d,this.N++,1,b,f,1,a|0]);break;case \"object\":c=Object.prototype.toString.call(a);if(\"[object Uint32Array]\"===c){e=[];for(c=0;c<a.length;c++)e.push(a[c]);a=e}else for(\"[object Array]\"!==c&&(k=1),c=0;c<a.length&&!k;c++)\"number\"!==typeof a[c]&&\n(k=1);if(!k){if(void 0===b)for(c=b=0;c<a.length;c++)for(e=a[c];0<e;)b++,e=e>>>1;this.c[g].update([d,this.N++,2,b,f,a.length].concat(a))}break;case \"string\":void 0===b&&(b=a.length);this.c[g].update([d,this.N++,3,b,f,a.length]);this.c[g].update(a);break;default:k=1}if(k)throw new sjcl.exception.bug(\"random: addEntropy only supports number, array of numbers or string\");this.m[g]+=b;this.f+=b;h===this.u&&(this.isReady()!==this.u&&A(\"seeded\",Math.max(this.o,this.f)),A(\"progress\",this.getProgress()))},\nisReady:function(a){a=this.T[void 0!==a?a:this.M];return this.o&&this.o>=a?this.m[0]>this.ba&&(new Date).valueOf()>this.Z?this.J|this.I:this.I:this.f>=a?this.J|this.u:this.u},getProgress:function(a){a=this.T[a?a:this.M];return this.o>=a?1:this.f>a?1:this.f/a},startCollectors:function(){if(!this.D){this.a={loadTimeCollector:B(this,this.ma),mouseCollector:B(this,this.oa),keyboardCollector:B(this,this.la),accelerometerCollector:B(this,this.ea),touchCollector:B(this,this.qa)};if(window.addEventListener)window.addEventListener(\"load\",\nthis.a.loadTimeCollector,!1),window.addEventListener(\"mousemove\",this.a.mouseCollector,!1),window.addEventListener(\"keypress\",this.a.keyboardCollector,!1),window.addEventListener(\"devicemotion\",this.a.accelerometerCollector,!1),window.addEventListener(\"touchmove\",this.a.touchCollector,!1);else if(document.attachEvent)document.attachEvent(\"onload\",this.a.loadTimeCollector),document.attachEvent(\"onmousemove\",this.a.mouseCollector),document.attachEvent(\"keypress\",this.a.keyboardCollector);else throw new sjcl.exception.bug(\"can't attach event\");\nthis.D=!0}},stopCollectors:function(){this.D&&(window.removeEventListener?(window.removeEventListener(\"load\",this.a.loadTimeCollector,!1),window.removeEventListener(\"mousemove\",this.a.mouseCollector,!1),window.removeEventListener(\"keypress\",this.a.keyboardCollector,!1),window.removeEventListener(\"devicemotion\",this.a.accelerometerCollector,!1),window.removeEventListener(\"touchmove\",this.a.touchCollector,!1)):document.detachEvent&&(document.detachEvent(\"onload\",this.a.loadTimeCollector),document.detachEvent(\"onmousemove\",\nthis.a.mouseCollector),document.detachEvent(\"keypress\",this.a.keyboardCollector)),this.D=!1)},addEventListener:function(a,b){this.K[a][this.ga++]=b},removeEventListener:function(a,b){var c,d,e=this.K[a],f=[];for(d in e)e.hasOwnProperty(d)&&e[d]===b&&f.push(d);for(c=0;c<f.length;c++)d=f[c],delete e[d]},la:function(){C(this,1)},oa:function(a){var b,c;try{b=a.x||a.clientX||a.offsetX||0,c=a.y||a.clientY||a.offsetY||0}catch(d){c=b=0}0!=b&&0!=c&&this.addEntropy([b,c],2,\"mouse\");C(this,0)},qa:function(a){a=\na.touches[0]||a.changedTouches[0];this.addEntropy([a.pageX||a.clientX,a.pageY||a.clientY],1,\"touch\");C(this,0)},ma:function(){C(this,2)},ea:function(a){a=a.accelerationIncludingGravity.x||a.accelerationIncludingGravity.y||a.accelerationIncludingGravity.z;if(window.orientation){var b=window.orientation;\"number\"===typeof b&&this.addEntropy(b,1,\"accelerometer\")}a&&this.addEntropy(a,2,\"accelerometer\");C(this,0)}};\nfunction A(a,b){var c,d=sjcl.random.K[a],e=[];for(c in d)d.hasOwnProperty(c)&&e.push(d[c]);for(c=0;c<e.length;c++)e[c](b)}function C(a,b){\"undefined\"!==typeof window&&window.performance&&\"function\"===typeof window.performance.now?a.addEntropy(window.performance.now(),b,\"loadtime\"):a.addEntropy((new Date).valueOf(),b,\"loadtime\")}function y(a){a.b=z(a).concat(z(a));a.L=new sjcl.cipher.aes(a.b)}function z(a){for(var b=0;4>b&&(a.h[b]=a.h[b]+1|0,!a.h[b]);b++);return a.L.encrypt(a.h)}\nfunction B(a,b){return function(){b.apply(a,arguments)}}sjcl.random=new sjcl.prng(6);\na:try{var D,E,F,G;if(G=\"undefined\"!==typeof module&&module.exports){var H;try{H=require(\"crypto\")}catch(a){H=null}G=E=H}if(G&&E.randomBytes)D=E.randomBytes(128),D=new Uint32Array((new Uint8Array(D)).buffer),sjcl.random.addEntropy(D,1024,\"crypto['randomBytes']\");else if(\"undefined\"!==typeof window&&\"undefined\"!==typeof Uint32Array){F=new Uint32Array(32);if(window.crypto&&window.crypto.getRandomValues)window.crypto.getRandomValues(F);else if(window.msCrypto&&window.msCrypto.getRandomValues)window.msCrypto.getRandomValues(F);\nelse break a;sjcl.random.addEntropy(F,1024,\"crypto['getRandomValues']\")}}catch(a){\"undefined\"!==typeof window&&window.console&&(console.log(\"There was an error collecting entropy from the browser:\"),console.log(a))}\nsjcl.json={defaults:{v:1,iter:1E4,ks:128,ts:64,mode:\"ccm\",adata:\"\",cipher:\"aes\"},ja:function(a,b,c,d){c=c||{};d=d||{};var e=sjcl.json,f=e.g({iv:sjcl.random.randomWords(4,0)},e.defaults),g;e.g(f,c);c=f.adata;\"string\"===typeof f.salt&&(f.salt=sjcl.codec.base64.toBits(f.salt));\"string\"===typeof f.iv&&(f.iv=sjcl.codec.base64.toBits(f.iv));if(!sjcl.mode[f.mode]||!sjcl.cipher[f.cipher]||\"string\"===typeof a&&100>=f.iter||64!==f.ts&&96!==f.ts&&128!==f.ts||128!==f.ks&&192!==f.ks&&0x100!==f.ks||2>f.iv.length||\n4<f.iv.length)throw new sjcl.exception.invalid(\"json encrypt: invalid parameters\");\"string\"===typeof a?(g=sjcl.misc.cachedPbkdf2(a,f),a=g.key.slice(0,f.ks/32),f.salt=g.salt):sjcl.ecc&&a instanceof sjcl.ecc.elGamal.publicKey&&(g=a.kem(),f.kemtag=g.tag,a=g.key.slice(0,f.ks/32));\"string\"===typeof b&&(b=sjcl.codec.utf8String.toBits(b));\"string\"===typeof c&&(f.adata=c=sjcl.codec.utf8String.toBits(c));g=new sjcl.cipher[f.cipher](a);e.g(d,f);d.key=a;f.ct=\"ccm\"===f.mode&&sjcl.arrayBuffer&&sjcl.arrayBuffer.ccm&&\nb instanceof ArrayBuffer?sjcl.arrayBuffer.ccm.encrypt(g,b,f.iv,c,f.ts):sjcl.mode[f.mode].encrypt(g,b,f.iv,c,f.ts);return f},encrypt:function(a,b,c,d){var e=sjcl.json,f=e.ja.apply(e,arguments);return e.encode(f)},ia:function(a,b,c,d){c=c||{};d=d||{};var e=sjcl.json;b=e.g(e.g(e.g({},e.defaults),b),c,!0);var f,g;f=b.adata;\"string\"===typeof b.salt&&(b.salt=sjcl.codec.base64.toBits(b.salt));\"string\"===typeof b.iv&&(b.iv=sjcl.codec.base64.toBits(b.iv));if(!sjcl.mode[b.mode]||!sjcl.cipher[b.cipher]||\"string\"===\ntypeof a&&100>=b.iter||64!==b.ts&&96!==b.ts&&128!==b.ts||128!==b.ks&&192!==b.ks&&0x100!==b.ks||!b.iv||2>b.iv.length||4<b.iv.length)throw new sjcl.exception.invalid(\"json decrypt: invalid parameters\");\"string\"===typeof a?(g=sjcl.misc.cachedPbkdf2(a,b),a=g.key.slice(0,b.ks/32),b.salt=g.salt):sjcl.ecc&&a instanceof sjcl.ecc.elGamal.secretKey&&(a=a.unkem(sjcl.codec.base64.toBits(b.kemtag)).slice(0,b.ks/32));\"string\"===typeof f&&(f=sjcl.codec.utf8String.toBits(f));g=new sjcl.cipher[b.cipher](a);f=\"ccm\"===\nb.mode&&sjcl.arrayBuffer&&sjcl.arrayBuffer.ccm&&b.ct instanceof ArrayBuffer?sjcl.arrayBuffer.ccm.decrypt(g,b.ct,b.iv,b.tag,f,b.ts):sjcl.mode[b.mode].decrypt(g,b.ct,b.iv,f,b.ts);e.g(d,b);d.key=a;return 1===c.raw?f:sjcl.codec.utf8String.fromBits(f)},decrypt:function(a,b,c,d){var e=sjcl.json;return e.ia(a,e.decode(b),c,d)},encode:function(a){var b,c=\"{\",d=\"\";for(b in a)if(a.hasOwnProperty(b)){if(!b.match(/^[a-z0-9]+$/i))throw new sjcl.exception.invalid(\"json encode: invalid property name\");c+=d+'\"'+\nb+'\":';d=\",\";switch(typeof a[b]){case \"number\":case \"boolean\":c+=a[b];break;case \"string\":c+='\"'+escape(a[b])+'\"';break;case \"object\":c+='\"'+sjcl.codec.base64.fromBits(a[b],0)+'\"';break;default:throw new sjcl.exception.bug(\"json encode: unsupported type\");}}return c+\"}\"},decode:function(a){a=a.replace(/\\s/g,\"\");if(!a.match(/^\\{.*\\}$/))throw new sjcl.exception.invalid(\"json decode: this isn't json!\");a=a.replace(/^\\{|\\}$/g,\"\").split(/,/);var b={},c,d;for(c=0;c<a.length;c++){if(!(d=a[c].match(/^\\s*(?:([\"']?)([a-z][a-z0-9]*)\\1)\\s*:\\s*(?:(-?\\d+)|\"([a-z0-9+\\/%*_.@=\\-]*)\"|(true|false))$/i)))throw new sjcl.exception.invalid(\"json decode: this isn't json!\");\nnull!=d[3]?b[d[2]]=parseInt(d[3],10):null!=d[4]?b[d[2]]=d[2].match(/^(ct|adata|salt|iv)$/)?sjcl.codec.base64.toBits(d[4]):unescape(d[4]):null!=d[5]&&(b[d[2]]=\"true\"===d[5])}return b},g:function(a,b,c){void 0===a&&(a={});if(void 0===b)return a;for(var d in b)if(b.hasOwnProperty(d)){if(c&&void 0!==a[d]&&a[d]!==b[d])throw new sjcl.exception.invalid(\"required parameter overridden\");a[d]=b[d]}return a},sa:function(a,b){var c={},d;for(d in a)a.hasOwnProperty(d)&&a[d]!==b[d]&&(c[d]=a[d]);return c},ra:function(a,\nb){var c={},d;for(d=0;d<b.length;d++)void 0!==a[b[d]]&&(c[b[d]]=a[b[d]]);return c}};sjcl.encrypt=sjcl.json.encrypt;sjcl.decrypt=sjcl.json.decrypt;sjcl.misc.pa={};sjcl.misc.cachedPbkdf2=function(a,b){var c=sjcl.misc.pa,d;b=b||{};d=b.iter||1E3;c=c[a]=c[a]||{};d=c[d]=c[d]||{firstSalt:b.salt&&b.salt.length?b.salt.slice(0):sjcl.random.randomWords(2,0)};c=void 0===b.salt?d.firstSalt:b.salt;d[c]=d[c]||sjcl.misc.pbkdf2(a,c,b.iter);return{key:d[c].slice(0),salt:c.slice(0)}};\n\"undefined\"!==typeof module&&module.exports&&(module.exports=sjcl);\"function\"===typeof define&&define([],function(){return sjcl});\n"
  },
  {
    "path": "themes/default/templates/about.html.ep",
    "content": "% # vim:set sw=4 ts=4 sts=4 ft=html.epl expandtab:\n<div class=\"text-left\">\n    <h3><%= l('What is Lufi?') %></h3>\n    <p><%= l('Lufi is a free (as in free speech) file hosting software.') %></p>\n    <h3><%= l('Privacy') %></h3>\n    <p><%= l('The files uploaded on a Lufi instance are encrypted before the upload to the server: the administrator of the server can not see the file\\'s content.') %><br>\n    <%= l('The administrator can only see the file\\'s name, its size and its mimetype (what kind of file it is: video, text, etc.).') %></p>\n    <p><%= l('You don\\'t need to register yourself to upload files but be aware that, for legal reasons, your IP address will be stored when you send a file. Don\\'t panic, this is normally the case for all sites on which you send files.') %></p>\n    <h3><%= l('How does it work?') %></h3>\n    <p><%= l('Drag and drop files in the appropriate area or use the traditional way to send files and the files will be chunked, encrypted and sent to the server. You will get two links per file: a download link, that you give to the people you want to share the file with and a deletion link, allowing you to delete the file whenever you want.') %></p>\n    <p><%= l('You can see the list of your files by clicking on the \"My files\" link at the top right of this page.') %></p>\n    <h3><%= l('How to report an illegal file?') %></h3>\n    <p><%== l('Please contact the administrator: %1', config('contact')) %></p>\n    <h3><%= l('Who wrote this software?') %></h3>\n    <p><%== l('The original (and only for now) author is <a href=\"https://fiat-tux.fr\" class=\"classic\">Luc Didry</a>.') %></p>\n    <h3><%= l('How to install the software on my server?') %></h3>\n    <p><%== l('As Lufi is a free software licensed under of the terms of the <a href=\"https://gnu.org/licenses/agpl.html\" class=\"classic\">AGPLv3</a>, you can install it on you own server. Have a look on the <a href=\"https://framagit.org/fiat-tux/hat-softwares/lufi/wikis/home\" class=\"classic\">Wiki</a> for the procedure.') %><br>\n       <%== l('Get the source code on <a href=\"https://framagit.org/fiat-tux/hat-softwares/lufi\" class=\"classic\">the official repository</a> or on its <a href=\"https://github.com/ldidry/lufi\" class=\"classic\">Github mirror</a>') %>\n    </p>\n    <h3><%= l('Version') %></h3>\n    <p><%== l('Latest tag of this instance: %1', sprintf('<a href=\"https://framagit.org/fiat-tux/hat-softwares/lufi/-/releases/%s\" class=\"classic\">%s</a>', stash('version')->{tag}, stash('version')->{tag})) %></p>\n    <p><%== l('Latest commit of this instance: %1', sprintf('<a href=\"https://framagit.org/fiat-tux/hat-softwares/lufi/-/commit/%s\" class=\"classic\">%s</a>', stash('version')->{commit}, stash('version')->{commit})) %></p>\n    <p><%= link_to url_for('/') => ( class => \"btn waves-effect waves-light cyan\" ) => begin %><%= l('Back to homepage') %><% end%></p>\n</div>\n"
  },
  {
    "path": "themes/default/templates/delays.html.ep",
    "content": "% # vim:set sw=4 ts=4 sts=4 ft=html.epl expandtab:\n% use Number::Bytes::Human qw(format_bytes);\n<div id=\"delays-info\" class=\"modal\">\n    <div class=\"modal-content\">\n        <h1><%= l('Information about delays') %></h1>\n        <div class=\"text-left\">\n            <p>\n                <%= l('If you choose a delay, the file will be deleted after that delay.') %><br>\n                <%= l('Don\\'t worry: if a user begins to download the file before the expiration and the download ends after the expiration, he will be able to get the file.') %>\n            </p>\n            % if (defined(config('delay_for_size'))) {\n                <p>\n                    <%= l('This server sets limitations according to the file size. The expiration delay of your file will be the minimum between what you choose and the following limitations:') %>\n                </p>\n                <ul>\n                % my $delays   = config('delay_for_size');\n                % $delays->{0} = max_delay;\n                % my @keys     = sort {$a <=> $b} keys %{$delays};\n                % my $i        = 0;\n                % for my $key (@keys) {\n                    % my $delay = $delays->{$keys[$i]};\n                    % if ($i + 1 < scalar(@keys)) {\n                        % if ($delay) {\n                            <li><%= l('between %1 and %2, the file will be kept %3 day(s).', format_bytes($keys[$i]), format_bytes($keys[$i + 1]), $delay) %></li>\n                        % } else {\n                            <li><%= l('between %1 and %2, the file will be kept forever.', format_bytes($keys[$i]), format_bytes($keys[$i + 1]), $delay) %></li>\n                        % }\n                    % } else {\n                        % if ($delay) {\n                            <li><%= l('for %1 and more, the file will be kept %2 day(s)', format_bytes($keys[$i]), $delay) %></li>\n                        % } else {\n                            <li><%= l('for %1 and more, the file will be kept forever.', format_bytes($keys[$i]), $delay) %></li>\n                        % }\n                    % }\n                    % $i++;\n                % }\n                </ul>\n            % }\n        </div>\n    </div>\n    <div class=\"modal-footer\">\n        <a href=\"#!\" class=\"modal-action modal-close waves-effect waves-green btn-flat\"><%= l('Close') %></a>\n    </div>\n</div>\n"
  },
  {
    "path": "themes/default/templates/delete_file.html.ep",
    "content": "% # vim:set sw=4 ts=4 sts=4 ft=html.epl expandtab:\n% if (defined stash('msg')) {\n<div class=\"col s12\">\n    <div class=\"card pink\">\n        <div class=\"card-content white-text\">\n            <strong><%= stash('msg') %></strong>\n        </div>\n    </div>\n</div>\n% }\n<form class=\"row\" method=\"post\" action=\"<%= url_for('really_delete', stash('short'), stash('token')) %>\">\n    <div class=\"col s8 m8 offset-s2 offset-m2\">\n        <h1><%= stash('filename') %></h1>\n    </div>\n    %= csrf_field\n    <div class=\"col s8 m8 offset-s2 offset-m2\">\n        <button class=\"btn waves-effect waves-light\" type=\"submit\" name=\"action\">\n            <%= l('Are you sure you want to delete that file?') %>\n        </button>\n    </div>\n</form>\n"
  },
  {
    "path": "themes/default/templates/files.html.ep",
    "content": "% # vim:set sts=4 sw=4 ts=4 ft=html.epl expandtab:\n\n<h2><%= l('My files') %></h2>\n<hr>\n\n\n<p>\n    <%= l('Only the files sent with this browser will be listed here. This list is stored in localStorage: if you delete your localStorage data, you\\'ll lose this list.') %><br>\n    <%= l('Rows in red mean that the files have expired and are no longer available.') %>\n</p>\n<div class=\"files-buttons\">\n    <a href=\"#\" id=\"exportStorage\"   class=\"btn left-mg cyan\"><%= l('Export localStorage data') %></a>\n    <a href=\"#\" id=\"purgeExpired\"    class=\"btn left-mg cyan\"><%= l('Purge expired files from localStorage') %></a>\n    <a href=\"#\" id=\"clickImport\"     class=\"btn left-mg cyan\"><%= l('Import localStorage data') %></a>\n    <span class=\"file-field input-field\">\n        <input type=\"file\" id=\"import\" onchange=\"importStorage(this.files)\">\n    </span>\n    <a href=\"#\" id=\"invertSelection\" class=\"btn left-mg cyan\"><%= l('Invert selection') %></a>\n    <a href=\"#\" class=\"btn left-mg cyan disabled\" id=\"mass-delete\" disabled><%= l('Delete selected files') %></a>\n</div>\n\n<div>\n    <table class=\"responsive-table highlight striped\">\n        <thead>\n            <tr>\n                <th class=\"center-align\"></th>\n                <th class=\"center-align\"><%= l('File name') %></th>\n                <th class=\"center-align\"><%= l('Download link') %></th>\n                <th class=\"center-align\"><%= l('Counter') %></th>\n                <th class=\"center-align\"><%= l('Delete at first download?') %></th>\n                <th class=\"center-align\"><%= l('Uploaded at') %></th>\n                <th class=\"center-align\"><%= l('Expires at') %></th>\n                <th class=\"center-align\"><%= l('Deletion link') %></th>\n                <th class=\"center-align\"><%= l('Mail') %></th>\n            </tr>\n        </thead>\n        <tbody id=\"myfiles\">\n        </tbody>\n    </table>\n</div>\n\n%= javascript '/partial/files.js'\n%= javascript '/js/lufi-files.js'\n"
  },
  {
    "path": "themes/default/templates/index.html.ep",
    "content": "% # vim:set sw=4 ts=4 sts=4 ft=html.epl expandtab:\n% my %d = (\n%   delay_0   => l('no time limit'),\n%   delay_1   => l('24 hours'),\n%   delay_365 => l('1 year')\n% );\n    <form class=\"row\">\n        <noscript>\n            <div class=\"col s12\">\n                <div class=\"card pink\">\n                    <div class=\"card-content white-text\">\n                        <strong><%= l('Javascript is disabled. You won\\'t be able to use Lufi.') %></strong>\n                    </div>\n                </div>\n            </div>\n        </noscript>\n% if (defined(config('broadcast_message'))) {\n        <div class=\"col s12\">\n            <div class=\"card pink\">\n                <div class=\"card-content white-text\">\n                    <strong><%= config('broadcast_message') %></strong>\n                </div>\n            </div>\n        </div>\n% }\n% if (stash('invitation')) {\n        <div class=\"col s12\">\n            <div class=\"card blue\">\n                <div class=\"card-content white-text\">\n                    <strong><%= l('The link(s) of your file(s) will automatically be sent by mail to %1 (%2)', stash('invitation')->ldap_user, stash('invitation')->ldap_user_mail) %></strong>\n                </div>\n            </div>\n        </div>\n% }\n        <div class=\"col s12 hiddendiv\" id=\"not-enough-entropy\">\n            <div class=\"card pink\">\n                <div class=\"card-content white-text\">\n                    <strong><%= l('Your browser does not have enough entropy to generate a strong encryption key. Please wait (it\\'s better if you do things on your computer while waiting).') %></strong>\n                </div>\n            </div>\n        </div>\n% if (stop_upload) {\n        <div class=\"col s12\">\n            <div class=\"card pink\">\n                <div class=\"card-content white-text\">\n                    <strong><%= l('Sorry, the uploading is currently disabled. Please try again later.') %></strong>\n                </div>\n            </div>\n        </div>\n% } else {\n        <div class=\"col s12 m6\">\n            <div class=\"input-field\">\n                <a class=\"waves-effect waves-light modal-trigger prefix\" href=\"#delays-info\" title=\"<%= l('Important: more information on delays') %>\"><i class=\"mdi-action-info small\"></i></a>\n                <select id=\"delete-day\">\n% for my $delay (qw/0 1 7 30 365/) {\n%   my $text = ($delay == 7 || $delay == 30) ? l('%1 days', $delay) : $d{'delay_'.$delay};\n%   if (max_delay) {\n%       if ($delay) {\n%           if ($delay < max_delay) {\n                    <option value=\"<%= $delay %>\" <%== is_selected($delay) %>><%= $text %></option>\n%           } elsif ($delay == max_delay) {\n                    <option value=\"<%= $delay %>\" <%== is_selected($delay) %>><%= $text %></option>\n%               last;\n%           } else {\n%               my $text = ($delay == 1) ? l('24 hours') : l('%1 days', $delay);\n                    <option value=\"<%= max_delay %>\" <%== is_selected(max_delay) %>><%= l('%1 days', max_delay) %></option>\n%               last;\n%           }\n%       }\n%   } else {\n                    <option value=\"<%= $delay %>\" <%== is_selected($delay) %>><%= $text %></option>\n%   }\n% }\n                </select>\n            </div>\n        </div>\n        <div class=\"input-field\">\n        % if ($self->config('force_burn_after_reading')) {\n            <p class=\"col s12 m6 text-left like-label\">\n                <%= l('Files deleted at first download') %>\n            </p>\n        % }\n            <p class=\"col s12 m6 text-left<%= ' hiddendiv' if (config('force_burn_after_reading') || stash('invitation')) %>\">\n                <input\n                    type=\"checkbox\"\n                    id=\"first-view\"\n                    data-checked=\"<%= 'data-checked' if config('force_burn_after_reading') %>\"\n                    <%= 'disabled=\"disabled\"' if config('force_burn_after_reading') %>\n                >\n                <label for=\"first-view\"><%= l('Delete at first download?') %></label>\n            </p>\n        </div>\n        <div class=\"input-field\">\n            <p class=\"col s12 m6 text-left\">\n                <input\n                    type=\"checkbox\"\n                    id=\"zip-files\"\n                    data-checked=\"\"\n                >\n                <label for=\"zip-files\"><%= l('Create a zip archive with the files before uploading?') %></label>\n            </p>\n        </div>\n    % if (config('allow_pwd_on_files') && (!stash('invitation'))) {\n        <div class=\"col s12 m6\">\n            <div class=\"input-field\">\n                <input type=\"password\" id=\"file_pwd\" placeholder=\"<%= l('Password') %>\" class=\"validate\" autocomplete=\"off\">\n                <label for=\"file_pwd\"><%= l('Add a password to file(s)') %></label>\n            </div>\n        </div>\n    % }\n        <div class=\"col s12 m12 hide\" id=\"zipname-input\">\n            <div class=\"col s12 m6\">\n                <div class=\"input-field\">\n                    <input type=\"text\" id=\"zipname\" placeholder=\"documents.zip\" value=\"documents.zip\" class=\"validate\">\n                    <label for=\"zipname\"><%= l('Name of the zip file') %></label>\n                </div>\n            </div>\n        </div>\n    </form>\n    <div class=\"row\">\n        <div id=\"files\" class=\"col s12 m12\">\n            <h2><%= l('Drop files here') %></h2>\n            <p id=\"max-file-size\"></p>\n            <p><small><%= l('or') %></small></p>\n            <label>\n                <span id=\"file-browser-span\" class=\"btn disabled waves-effect waves-light\"><%= l('Click to open the file browser') %></span>\n                <input type=\"file\" id=\"file-browser-button\" multiple disabled>\n            </label>\n        </div>\n        <div id=\"zipping\" class=\"col s12 m6 hide\">\n            <div class=\"card\">\n                <div>\n                    <a href=\"#\" id=\"reset-zipping\">\n                        <i class=\"right mdi-navigation-close small\"></i>\n                    </a>\n                    <div class=\"card-content\">\n                        <span class=\"card-title\" id=\"zip-name\">documents.zip</span> (<span id=\"zip-size\"></span>)\n                        <p id=\"zip-compressing\" class=\"hide\">\n                            <button class=\"btn-floating pulse\"><i class=\"mdi-content-archive\"></i></button>\n                            <%= l('Compressing zip file…') %>\n                        </p>\n                        <ul id=\"zip-parts\">\n                        </ul>\n                        <div class=\"right-align\">\n                            <a href=\"#\" id=\"uploadZip\" class=\"btn waves-effect waves-light\"><%= l('Upload generated zip file') %></a>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </div>\n    </div>\n    <div id=\"results\">\n        <h2><%= l('Uploaded files') %></h2>\n        <div id=\"misc\"></div>\n        <ul class=\"list-group\" id=\"ul-results\">\n        </ul>\n    </div>\n%= include 'delays'\n% if (defined stash('invitation')) {\n%= javascript '/partial/index.js?token=' . stash('invitation')->token\n% } else {\n%= javascript '/partial/index.js'\n% }\n%= javascript '/js/sjcl.js'\n%= javascript '/js/filesize.min.js'\n%= javascript '/js/jszip.min.js'\n%= javascript '/js/lufi-notifications.js'\n%= javascript '/js/lufi-up.js'\n% }\n"
  },
  {
    "path": "themes/default/templates/invitations/exception.html.ep",
    "content": "% # vim:set sw=4 ts=4 sts=4 ft=html.epl expandtab:\n\n% if (stash('expired_or_deleted_invitation')) {\n    <div class=\"col s12\">\n        <div class=\"card pink\">\n            <div class=\"card-content white-text\">\n                <strong><%= l('Sorry, your invitation has expired or has been deleted.') %></strong>\n            </div>\n        </div>\n    </div>\n% }\n% if (stash('invitation_not_found')) {\n    <div class=\"col s12\">\n        <div class=\"card pink\">\n            <div class=\"card-content white-text\">\n                <strong><%= l('Sorry, the invitation doesn’t exist. Are you sure you are on the right URL?') %></strong>\n            </div>\n        </div>\n    </div>\n% }\n"
  },
  {
    "path": "themes/default/templates/invitations/invite.html.ep",
    "content": "% # vim:set sw=4 ts=4 sts=4 ft=html.epl expandtab:\n\n% if (scalar(@{$self->stash('fails')})) {\n    <div class=\"col s12\">\n        <div class=\"card pink\">\n            <div class=\"card-content white-text\">\n                % for my $msg (@{$self->stash('fails')}) {\n                    <strong><%= $msg %></strong>\n                % }\n            </div>\n        </div>\n    </div>\n% }\n% if (scalar(@{$self->stash('success')})) {\n    <div class=\"col s12\">\n        <div class=\"card blue\">\n            <div class=\"card-content white-text\">\n                % for my $msg (@{$self->stash('success')}) {\n                    <strong><%== $msg %></strong>\n                % }\n            </div>\n        </div>\n    </div>\n% }\n\n<form class=\"row\" method=\"post\">\n    <h1><%= l('Invite a guest') %></h1>\n    <div class=\"margin-bottom-35\">\n        <p>\n            <%= l('You can invite someone to send you files through this Lufi instance even if they don’t have an account on it.') %>\n        </p>\n        % if (stash('send_with_user_email')) {\n            <p>\n                <%= l('The invitation mail will be send from your email address (%1).', stash('user_mail')) %>\n            </p>\n        % }\n    </div>\n    <div class=\"input-field\">\n        <label for=\"guest_mail\">\n            <%= l('Email address of your guest') %>\n        </label>\n        <input id=\"guest_mail\" name=\"guest_mail\" type=\"email\" placeholder=\"name@example.org\" required>\n    </div>\n    <div class=\"input-field\">\n        <label for=\"expire_at\">\n            <%= l('How many days would you like the invitation to be valid?') %>\n        </label>\n        <input id=\"expire_at\" name=\"expire_at\" type=\"number\" min=\"1\" max=\"<%= stash('max_expire_at') %>\" step=\"1\" value=\"<%= stash('max_expire_at') %>\" required>\n    </div>\n    <button class=\"btn waves-effect waves-light\" type=\"submit\"><%= l('Send the invitation') %></button>\n</form>\n"
  },
  {
    "path": "themes/default/templates/invitations/invite.mail.ep",
    "content": "% # vim:set sw=4 ts=4 sts=4 ft=mail.epl expandtab:\n% stash subject => l('%1 invites you to send him/her files', stash('ldap_user'));\n\n%= l('Hello,')\n\n%= l('%1 invites you to send him/her files through Lufi.', stash('ldap_user'))\n\n%= l('Click on the following URL to upload files on Lufi:')\n%== stash('url')\n\n%= l('The links of your file(s) will automatically be sent by mail to %1.', stash('ldap_user'))\n\n%= l('This invitation is valid until %1.', stash('expires'))\n\n%= l('Regards.')\n"
  },
  {
    "path": "themes/default/templates/invitations/my_invitations.html.ep",
    "content": "% # vim:set sw=4 ts=4 sts=4 ft=html.epl expandtab:\n% use Number::Bytes::Human qw(format_bytes);\n% my $lang = $self->get_date_lang();\n\n<h2><%= l('My invitations') %></h2>\n<hr>\n\n<p>\n    <%= l('Rows in purple mean that the invitations have expired.') %>\n</p>\n<div class=\"invitations-buttons\">\n    <a href=\"#\" id=\"invertSelection\"  class=\"btn left-mg cyan\"><%= l('Invert selection') %></a>\n    <a href=\"#\" id=\"toggleHidden\"     class=\"btn left-mg cyan\"><%= l('Show hidden invitations') %></a>\n    <a href=\"#\" id=\"deleteInvit\"      class=\"btn left-mg cyan disabled\" disabled><%= l('Delete') %></a>\n    <a href=\"#\" id=\"resendMail\"       class=\"btn left-mg cyan disabled\" disabled><%= l('Resend invitation mail') %></a>\n    <a href=\"#\" id=\"toggleVisibility\" class=\"btn left-mg cyan disabled\" disabled><%= l('Toggle visibility') %></a>\n</div>\n\n<div>\n    <table class=\"responsive-table highlight striped\">\n        <thead>\n            <tr>\n                <th class=\"center-align\">&nbsp;</th>\n                <th class=\"center-align\"><%= l('Guest mail') %></th>\n                <th class=\"center-align\"><%= l('URL') %></th>\n                <th class=\"center-align\"><%= l('Created at') %></th>\n                <th class=\"center-align\"><%= l('Expire at') %></th>\n                <th class=\"center-align\"><%= l('Files sent at') %></th>\n                <th class=\"center-align\">&nbsp;</th>\n            </tr>\n        </thead>\n        <tbody id=\"myInvitations\" data-visibility=\"hidden\">\n        % my $time = time;\n        % $invitations->each(sub {\n            % my ($e, $num) = @_;\n            % return if $e->deleted;\n            % my $class = '';\n            % $class = 'purple lighten-4' unless $e->is_valid;\n            % $class .= ' hide' unless $e->show_in_list;\n            <tr id=\"row-<%= $e->token %>\" class=\"<%= $class %>\" data-visibility=\"<%= ($e->show_in_list) ? 1 : 0 %>\">\n                <td>\n                    <input type=\"checkbox\" id=\"<%= $e->token %>\" data-checked=\"\">\n                    <label for=\"<%= $e->token %>\" hidden></label>\n\n                    % unless ($e->show_in_list) {\n                        <i class=\"mdi-navigation-cancel\" title=\"<%= l('This invitation is normally hidden') %>\"></i>\n                    % }\n                </td>\n                <td><%= $e->guest_mail %></td>\n                <td><%= url_for('guest', token => $e->token)->to_abs %></td>\n                <td><%= $lang->time2str(l('%A %d %B %Y at %T'), $e->created_at) %></td>\n                <td id=\"expire-<%= $e->token %>\"><%= $lang->time2str(l('%A %d %B %Y at %T'), $e->expire_at) %></td>\n                <td><%= $lang->time2str(l('%A %d %B %Y at %T'), $e->files_sent_at) if $e->files_sent_at %></td>\n                <td>\n                    % if ($e->files) {\n                        <a href=\"#files-info\"\n                           data-files=\"<%= $e->files %>\"\n                           data-token=\"<%= $e->token %>\"\n                           data-guest=\"<%= $e->guest_mail %>\"\n                           class=\"btn left-mg cyan waves-effect waves-light modal-trigger prefix\">\n                            <%= l('Files') %>\n                        </a>\n                    % }\n                </td>\n            </tr>\n        % });\n        </tbody>\n    </table>\n</div>\n\n<div id=\"files-info\" class=\"modal\">\n    <div class=\"modal-content\">\n        <h1 class=\"small-h1\"></h1>\n        <div class=\"text-left\">\n            <ul id=\"files-ul\">\n            </ul>\n        </div>\n    </div>\n    <div class=\"modal-footer\">\n        <a href=\"#!\" class=\"modal-action modal-close waves-effect waves-green btn-flat\"><%= l('Close') %></a>\n    </div>\n</div>\n\n%= javascript '/partial/invitations.js'\n%= javascript '/js/lufi-list-invitations.js'\n%= javascript '/js/filesize.min.js'\n"
  },
  {
    "path": "themes/default/templates/invitations/notification_files_sent.mail.ep",
    "content": "% # vim:set sw=4 ts=4 sts=4 ft=mail.epl expandtab:\n% use Number::Bytes::Human qw(format_bytes);\n% my $lang = $self->get_date_lang();\n% stash subject => l('%1 sent you files', stash('invitation')->guest_mail);\n\n%= l('Hello %1,', ucfirst(stash('invitation')->ldap_user))\n\n%= l('%1 used your invitation to send you files:', stash('invitation')->guest_mail)\n\n% stash('files')->each(sub {\n%     my ($e, $num) = @_;\n%= l('— %1 (%2), that will expire on %3', $e->{name}, format_bytes($e->{size}), $lang->time2str(l('%A %d %B %Y at %T'), $e->{created_at} + $e->{delay} * 86400))\n%=   '  '.$e->{url}\n% });\n\n% if (config('invitations')->{'save_files_url_in_db'} && stash('already_notified')) {\n%=     l('NB: this list includes the list of files that have already been sent to you.')\n\n% }\n%= l('Regards,')\n-- \nLufi\n"
  },
  {
    "path": "themes/default/templates/layouts/default.html.ep",
    "content": "% # vim:set sw=4 ts=4 sts=4 ft=html.epl expandtab:\n% my $lang = $self->languages;\n%    $lang =~ s/-(.*)/_\\U$1/;\n<!DOCTYPE html>\n<html>\n    <head>\n        <title><%= config('instance_name') %></title>\n        <meta charset=\"utf-8\">\n        <meta name=\"mobile-web-app-capable\" content=\"yes\">\n        <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n        <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n        <link rel=\"icon\" type=\"image/png\" href=\"<%= url_for('/img/favicon.png') %>\">\n        <link rel=\"icon\" sizes=\"128x128\" href=\"<%= url_for('/img/lufi128.png') %>\">\n        <link rel=\"icon\" sizes=\"196x196\" href=\"<%= url_for('/img/lufi196.png') %>\">\n        <link rel=\"apple-touch-icon\" href=\"<%= url_for('/img/lufi60.png') %>\">\n        <link rel=\"apple-touch-icon\" sizes=\"76x76\" href=\"<%= url_for('/img/lufi76.png') %>\">\n        <link rel=\"apple-touch-icon\" sizes=\"120x120\" href=\"<%= url_for('/img/lufi120.png') %>\">\n        <link rel=\"apple-touch-icon\" sizes=\"152x152\" href=\"<%= url_for('/img/lufi152.png') %>\">\n        <link rel=\"apple-touch-icon-precomposed\" sizes=\"128x128\" href=\"<%= url_for('/img/lufi128.png') %>\">\n        %= stylesheet '/css/materialize.min.css'\n        %= stylesheet '/css/lufi.css'\n        %= javascript '/js/ie-detection.js'\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    </head>\n    <body>\n        <nav class=\"cyan\">\n            <div class=\"nav-wrapper container\">\n                <a href=\"<%= url_for('/') %>\" class=\"brand-logo\">&nbsp;<img src=\"<%= url_for('/img/lufi-min.png') %>\" alt=\"logo\"> <%= config('instance_name') %></a>\n                <a href=\"#\" data-activates=\"mobile\" class=\"button-collapse\"><i class=\"mdi-navigation-menu\"></i></a>\n                <ul id=\"nav-mobile\" class=\"right hide-on-med-and-down\">\n                    <li><a href=\"<%= $self->config('report') %>\"><%= l('Report file') %></a></li>\n                % if ((!defined(config('ldap')) && !defined(config('htpasswd')) && !defined(config('auth_headers'))) || is_user_authenticated()) {\n                    <li<%== ' class=\"active\"' if (current_route eq 'index') %>><a href=\"<%= url_for('/') %>\"><%= l('Upload files') %></a></li>\n                    <li<%== ' class=\"active\"' if (current_route eq 'files') %>><a href=\"<%= url_for('/files') %>\"><%= l('My files') %></a></li>\n                    % if ((defined config('ldap') || defined config('auth_headers')) && defined config('invitations')) {\n                        <li<%== ' class=\"active\"' if (current_route eq 'invite') %>><a href=\"<%= url_for('/invite') %>\"><%= l('Invite a guest') %></a></li>\n                        <li<%== ' class=\"active\"' if (current_route eq 'invite/list') %>><a href=\"<%= url_for('/invite/list') %>\"><%= l('My invitations') %></a></li>\n                    % }\n                % } else {\n                    <li><a href=\"<%= url_for('/login') %>\"><%= l('Signin') %></a></li>\n                % }\n                    <li>\n                        <div class=\"input-field select-lang\">\n                            <label class=\"hiddendiv\"><%= l('Language') %></label>\n                            <select>\n                                <option value=\"\" disabled selected><%= l('Language') %></option>\n                            % for my $i (@{$self->available_langs}) {\n                                <option value=\"<%= $i %>\"><%= iso639_native_name($i) %></option>\n                            % }\n                            </select>\n                        </div>\n                    </li>\n                    <li<%== ' class=\"active\"' if (current_route eq 'about') %>><a href=\"<%= url_for('/about') %>\"><%= l('About') %></a></li>\n                % if ((defined(config('ldap')) || defined(config('htpasswd')) || defined(config('auth_headers'))) && is_user_authenticated()) {\n                    <li>\n                        <form action=\"<%= url_for('/logout') %>\" method=\"POST\">\n                            %= csrf_field\n                            <button class=\"btn-flat\" type=\"submit\"><%= l('Logout') %></button>\n                        </form>\n                    </li>\n                % }\n                </ul>\n                <ul id=\"mobile\" class=\"side-nav\">\n                    <li><a href=\"<%= $self->config('report') %>\"><%= l('Report file') %></a></li>\n                % if ((!defined(config('ldap')) && !defined(config('htpasswd')) && !defined(config('auth_headers'))) || is_user_authenticated()) {\n                    <li<%== ' class=\"active\"' if (current_route eq 'index') %>><a href=\"<%= url_for('/') %>\"><%= l('Upload files') %></a></li>\n                    <li<%== ' class=\"active\"' if (current_route eq 'files') %>><a href=\"<%= url_for('/files') %>\"><%= l('My files') %></a></li>\n                    % if ((defined config('ldap') || defined config('auth_headers')) && defined config('invitations')) {\n                        <li<%== ' class=\"active\"' if (current_route eq 'invite') %>><a href=\"<%= url_for('/invite') %>\"><%= l('Invite a guest') %></a></li>\n                        <li<%== ' class=\"active\"' if (current_route eq 'invite/list') %>><a href=\"<%= url_for('/invite/list') %>\"><%= l('My invitations') %></a></li>\n                    % }\n                % } else {\n                    <li><a href=\"<%= url_for('/login') %>\"><%= l('Signin') %></a></li>\n                % }\n                    <li>\n                        <div class=\"input-field select-lang-mobile\">\n                            <label class=\"hiddendiv\"><%= l('Language') %></label>\n                            <select>\n                                <option value=\"\" disabled selected><%= l('Language') %></option>\n                            % for my $i (@{$self->available_langs}) {\n                                <option value=\"<%= $i %>\"><%= iso639_native_name($i) %></option>\n                            % }\n                            </select>\n                        </div>\n                    </li>\n                    <li<%== ' class=\"active\"' if (current_route eq 'about') %>><a href=\"<%= url_for('/about') %>\"><%= l('About') %></a></li>\n                % if ((defined(config('ldap')) || defined(config('htpasswd')) || defined(config('auth_headers'))) && is_user_authenticated()) {\n                    <li>\n                        <form action=\"<%= url_for('/logout') %>\" method=\"POST\">\n                            %= csrf_field\n                            <button class=\"btn-flat\" type=\"submit\"><%= l('Logout') %></button>\n                        </form>\n                    </li>\n                % }\n                </ul>\n            </div>\n        </nav>\n        <div class=\"container\">\n            %= javascript '/js/jquery-3.7.1.min.js'\n            %= javascript '/partial/layout.js'\n            %= javascript '/js/lufi-common.js'\n            <%= content %>\n        </div>\n% if (defined(config('piwik_img'))) {\n        <img src=\"<%== config('piwik_img') %>\" class=\"no_border\" alt=\"\" />\n% }\n            %= javascript '/js/materialize.js'\n            %= javascript '/js/sidenav.js'\n    </body>\n</html>\n"
  },
  {
    "path": "themes/default/templates/login.html.ep",
    "content": "% # vim:set sw=4 ts=4 sts=4 ft=html.epl expandtab:\n% if (defined stash('msg')) {\n<div class=\"col s12\">\n    <div class=\"card pink\">\n        <div class=\"card-content white-text\">\n            <strong><%= stash('msg') %></strong>\n        </div>\n    </div>\n</div>\n% }\n<form class=\"row\" method=\"post\" action=\"<%= url_for('login') %>\">\n    <div class=\"col s8 m8 offset-s2 offset-m2\">\n        <div class=\"input-field\">\n            <input id=\"login\" type=\"text\" class=\"validate\" name=\"login\" autofocus>\n            <label for=\"login\"><%= l('Login') %></label>\n        </div>\n    </div>\n    <div class=\"col s8 m8 offset-s2 offset-m2\">\n        <div class=\"input-field\">\n            <input id=\"password\" type=\"password\" class=\"validate\" name=\"password\">\n            <label for=\"password\"><%= l('Password') %></label>\n        </div>\n    </div>\n    %= csrf_field\n    <input name=\"redirect\" value=\"<%= stash('redirect') %>\" type=\"hidden\">\n    <div class=\"col s8 m8 offset-s2 offset-m2\">\n        <button class=\"btn waves-effect waves-light\" type=\"submit\" name=\"action\">\n            <%= l('Signin') %>\n        </button>\n    </div>\n</form>\n"
  },
  {
    "path": "themes/default/templates/logout.html.ep",
    "content": "% # vim:set sw=4 ts=4 sts=4 ft=html.epl expandtab:\n% if (defined stash('msg')) {\n<div class=\"col s12\">\n    <div class=\"card pink\">\n        <div class=\"card-content white-text\">\n            <strong><%= stash('msg') %></strong>\n        </div>\n    </div>\n</div>\n% } else {\n<div class=\"col s12\">\n    <div class=\"card blue-grey darken-1\">\n        <div class=\"card-content white-text\">\n            <strong><%= l('You have been successfully logged out.') %></strong>\n        </div>\n        <div class=\"card-action\">\n            <a href=\"<%= url_for('login') %>\"><%= l('Signin') %></a>\n        </div>\n    </div>\n</div>\n% }\n"
  },
  {
    "path": "themes/default/templates/mail.html.ep",
    "content": "% # vim:set sw=4 ts=4 sts=4 ft=html.epl expandtab:\n<div class=\"row\">\n% if (defined(stash('msg'))) {\n    <div class=\"col s12\">\n        <div class=\"card pink\">\n            <div class=\"card-content white-text\">\n                <strong><%== stash('msg')%></strong>\n            </div>\n        </div>\n    </div>\n% }\n    <div class=\"col s12\">\n        <div class=\"card cyan\">\n            <div class=\"card-content white-text\">\n                <p><%= l('If you send the mail from this server, the links will be sent to the server, which may lower your privacy protection.') %></p>\n                <p><%= l('Adding URLs not related to this Lufi instance to the mail body or subject is prohibited.') %></p>\n            </div>\n        </div>\n    </div>\n    <form action=\"<%= url_for('m') %>\" method=\"post\" class=\"col s12\">\n        %= csrf_field\n        <div class=\"input-field\">\n            <label for=\"emails\"><%= l('Comma-separated email addresses') %></label>\n% if (defined(stash('values'))) {\n            <input type=\"text\" class=\"validate\" id=\"emails\" name=\"emails\" placeholder=\"<%= l('Emails') %>\" value=\"<%= stash('values')->{emails} %>\">\n% } else {\n            <input type=\"text\" class=\"validate\" id=\"emails\" name=\"emails\" placeholder=\"<%= l('Emails') %>\">\n% }\n        </div>\n        <div class=\"input-field\">\n            <label for=\"subject\"><%= l('Email subject') %></label>\n% if (defined(stash('values'))) {\n            <input type=\"text\" class=\"validate\" id=\"subject\" name=\"subject\" value=\"<%= stash('values')->{subject} %>\">\n% } else {\n            <input type=\"text\" class=\"validate\" id=\"subject\" name=\"subject\" value=\"<%= l('Here\\'s some files') %>\">\n% }\n        </div>\n        <div class=\"input-field\">\n            <label for=\"body\"><%= l('Email body') %></label>\n            <textarea class=\"materialize-textarea\" id=\"body\" name=\"body\" rows=\"10\">\n% if (defined(stash('values'))) {\n<%= stash('values')->{body} %>\n% }\n            </textarea>\n        </div>\n        % if (!$self->config('disable_mail_sending')) {\n            <button type=\"submit\" class=\"btn btn-info\"><%= l('Send with this server') %></button>\n        % }\n        <a href=\"#\" class=\"btn btn-primary\" id=\"mailto\"><%= l('Send with your own mail software') %></a>\n    </form>\n<div>\n%= javascript url_for('/partial/mail.js')->query(populate => (!defined(stash('msg')) && !defined(stash('values'))), links => $links)\n"
  },
  {
    "path": "themes/default/templates/msg.html.ep",
    "content": "% # vim:set sw=4 ts=4 sts=4 ft=html.epl expandtab:\n\n<div class=\"row\">\n    <div class=\"col s12\">\n% if (!defined(stash('f')) && defined(stash('msg'))) {\n        <div class=\"card pink\">\n            <div class=\"card-content white-text\">\n                <p><%= stash('msg') %></p>\n% } elsif (defined(stash('msg_success'))) {\n        <div class=\"card cyan\">\n            <div class=\"card-content white-text\">\n            <p><%= stash('msg_success') %></p>\n% } else {\n        <div class=\"card cyan\">\n            <div class=\"card-content white-text\">\n                <span class=\"card-title\"><%= stash('f')->filename %></span>\n                <p><%= stash('msg') %></p>\n% }\n            </div>\n        </div>\n    </div>\n</div>\n% if (defined stash('del_short_from_localstorage')) {\n<script>\n    $(document).ready(function(){\n        delItem('<%= stash('del_short_from_localstorage') %>');\n    });\n</script>\n% }\n"
  },
  {
    "path": "themes/default/templates/partial/files.js.ep",
    "content": "% # vim:set sts=4 sw=4 ts=4 ft=javascript expandtab:\n% if (defined($self->config('fixed_domain')) && $self->config('fixed_domain')) {\n    var baseURL = '<%= url_for('/')->host($self->config('fixed_domain'))->to_abs() %>';\n% } else {\n    var baseURL = '<%= url_for('/')->to_abs() %>';\n% }\nvar actionURL = '<%= url_for('/')->to_abs() %>';\nvar counterURL = '<%== url_for('counter') %>';\nvar i18n       = {\n    noExpiration:             '<%= l('No expiration delay') %>',\n    importProcessed:          '<%= l('The data has been successfully imported.') %>',\n    importFilesWithoutPrefix: \"<%= l('Lufi recently changed its way to store files information.\\n\\nNo files have been found in the new localStorage location but we found files in the old one.\\nDo you want to import those informations?\\n\\nPlease note that this is the only time that we will ask you this.') %>\",\n};\n$(document).ready(function() {\n    populateFilesTable();\n    $('#invertSelection').on('click', invertSelection);\n    $('#exportStorage').on('click', exportStorage);\n    $('#purgeExpired').on('click', purgeExpired);\n    $('#clickImport').on('click', clickImport);\n    $('#mass-delete').on('click', massDelete);\n});\n\n"
  },
  {
    "path": "themes/default/templates/partial/index.js.ep",
    "content": "% # vim:set sts=4 sw=4 ts=4 ft=javascript expandtab:\n$(document).ready(function(){\n    $('.modal-trigger').leanModal();\n});\nvar ws_url  = '<%= url_for('upload')->to_abs() %>';\n% if (defined($self->config('fixed_domain')) && $self->config('fixed_domain')) {\nvar baseURL = '<%= url_for('/')->host($self->config('fixed_domain'))->to_abs() %>';\n% } else {\nvar baseURL = '<%= url_for('/')->to_abs() %>';\n% }\nvar actionURL = '<%= url_for('/')->to_abs() %>';\nvar i18n    = {\n    enqueued:     '<%= l('XXX file has been added to upload queue.') %>',\n    confirmExit:  '<%= l('You have attempted to leave this page. The upload will be canceled. Are you sure?') %>',\n    copyAll:      '<%= l('Copy all links to clipboard') %>',\n    copySuccess:  '<%= l('The link(s) has been copied to your clipboard') %>',\n    copyFail:     '<%= l('Unable to copy the link(s) to your clipboard') %>',\n    cpText:       '<%= l('Copy to clipboard') %>',\n    delText:      '<%= l('Deletion link') %>',\n    dlText:       '<%= l('Download link') %>',\n    download:     '<%= l('Download') %>',\n    encrypting:   '<%= l('Encrypting part XX1 of XX2') %>',\n    expiration:   '<%= l('Expiration:') %>',\n    fileUploaded: '<%= l('File uploaded') %>',\n    hit:          '<%= l('Hit Enter, then Ctrl+C to copy the download link') %>',\n    hits:         '<%= l('Hit Enter, then Ctrl+C to copy all the download links') %>',\n    mailTo:       '<%= l('Send all links by email') %>',\n    maxSize:      '<%= l('(max size: XXX)') %>',\n    noLimit:      '<%= l('No expiration delay') %>',\n    sending:      '<%= l('Sending part XX1 of XX2. Please, be patient, the progress bar can take a while to move.') %>',\n    wsProblem:    '<%= l('Websocket communication error') %>',\n};\nvar maxSize = <%= config('max_file_size') || 0 %>;\n\n% if (stash('token')) {\nvar isGuest          = true;\nvar sendFilesURLsURL = '<%= url_for('guest_send_mail', token => stash('token'))->to_abs() %>';\n% } else {\nvar isGuest = false;\n% }\n"
  },
  {
    "path": "themes/default/templates/partial/invitations.js.ep",
    "content": "% # vim:set sts=4 sw=4 ts=4 ft=javascript expandtab:\nvar i18n = {\n    confirmDeleteInvit: '<%= l('Are you sure you want to delete the selected invitations?') %>',\n    confirmResendMail:  '<%= l('Are you sure you want to resend the invitation mail for the selected invitations?') %>',\n    expiration:         '<%= l('expires on XXX') %>',\n    hiddenMark:         '<i class=\"mdi-navigation-cancel\" title=\"<%= l('This invitation is normally hidden') %>\"></i>',\n    hideText:           '<%= l('Hide hidden invitations') %>',\n    listFiles:          '<%= l('Files sent in invitation XX1 by XX2') %>',\n    showText:           '<%= l('Show hidden invitations') %>'\n};\n\nvar deleteURL = '<%= url_for('invite_list_delete') %>';\nvar resendURL = '<%= url_for('invite_list_resend') %>';\nvar toggleURL = '<%= url_for('invite_list_visibility') %>';\n"
  },
  {
    "path": "themes/default/templates/partial/layout.js.ep",
    "content": "% # vim:set sts=4 sw=4 ts=4 ft=javascript expandtab:\nvar langUrl = '<%= url_for('lang') %>';\nvar prefix  = '<%= substr(config('prefix'), 1) %>';\n"
  },
  {
    "path": "themes/default/templates/partial/mail.js.ep",
    "content": "% # vim:set sts=4 sw=4 ts=4 ft=javascript expandtab:\nfunction findItem(name) {\n    var files = localStorage.getItem(`${window.prefix}files`);\n    if (files === null) {\n        files = new Array();\n    } else {\n        files = JSON.parse(files);\n    }\n    var i;\n    for (i = 0; i < files.length; i++) {\n        if (files[i].short === name) {\n            return files[i];\n        }\n    }\n}\nfunction updateMailtoLink() {\n    var btn     = document.getElementById('mailto');\n    var emails  = document.getElementById('emails');\n    var subject = document.getElementById('subject');\n    var text    = document.getElementById('body');\n\n    btn.href = `mailto:${encodeURIComponent(emails.value)}?subject=${encodeURIComponent(subject.value)}&body=${encodeURIComponent(text.value)}`;\n}\nfunction populateBody() {\n    var links = [\n    % my $ref = ref(stash('links'));\n    % if ($ref eq 'ARRAY') {\n    %   for my $link (@{stash('links')}) {\n        '<%= $link %>',\n    %   }\n    % } else {\n        '<%= stash('links') %>',\n    % }\n    ];\n    var text = \"<%== l('Hello,\\n\\nHere\\'s some files I want to share with you:\\n') %>\";\n    links.forEach(function(name, index, array) {\n        var item = findItem(name);\n        if (item !== null && item !== undefined) {\n            var limit = (item.delay === 0) ? null : formatDate(item.delay * 86400 + item.created_at);\n            text += `- ${item.name}<%= l(':') %> ${item.url}`;\n            if (limit !== null) {\n                text += `\\n  (<%= l('deadline: ') %>${limit})`;\n            }\n            text += \"\\n\";\n        }\n    });\n\n% if (!defined(config('ldap')) && !defined(config('htpasswd'))) {\n    text += \"\\n-- \\n<%= l('Share your files in total privacy on %1', url_for('/')->to_abs) %>\";\n% }\n    tArea = document.getElementById('body').value = text;\n    updateMailtoLink();\n}\ndocument.addEventListener('DOMContentLoaded', function() {\n% if (stash('populate')) {\n    populateBody();\n% }\n\n    var emails  = document.getElementById('emails');\n    var subject = document.getElementById('subject');\n    var text    = document.getElementById('body');\n    emails.addEventListener('change', updateMailtoLink);\n    subject.addEventListener('change', updateMailtoLink);\n    text.addEventListener('change', updateMailtoLink);\n});\n"
  },
  {
    "path": "themes/default/templates/partial/render.js.ep",
    "content": "% # vim:set sts=4 sw=4 ts=4 ft=javascript expandtab:\nvar ws_url = '<%= url_for('download')->to_abs().stash('file') %>';\nvar i18n   = {\n    aborted1:        '<%= l('Download aborted.') %>',\n    aborted2:        '<%= l('Click here to refresh the page and restart the download.') %>',\n    badkey:          '<%= l('It seems that the key in your URL is incorrect. Please, verify your URL.') %>',\n    confirmExit:     '<%= l('You have attempted to leave this page. The download will be canceled. Are you sure?') %>',\n    download:        '<%= l('Get the file') %>',\n    fileDownloaded:  '<%= l('File downloaded') %>',\n    loading:         '<%= l('Asking for file part XX1 of %1', stash('nbslices')) %>',\n    nokey:           '<%= l('You don\\'t seem to have a key in your URL. You won\\'t be able to decrypt the file. Download canceled.') %>',\n    showZipContent:  '<%= l('Show zip content') %>',\n    tooMuchAttempts: '<%= l('Unable to download the file: too much unsuccessful attempts to open a websocket. Please, contact the administrator.') %>',\n    zipContent:      '<%= l('Zip content:') %>'\n}\n"
  },
  {
    "path": "themes/default/templates/render.html.ep",
    "content": "% # vim:set sw=4 ts=4 sts=4 ft=html.epl expandtab:\n<div class=\"row valign-wrapper\">\n    <div class=\"valign center col s12\">\n    % if (!defined(stash('f')) && defined(stash('msg'))) {\n        <div class=\"col s12\">\n            <div class=\"card pink\">\n                <div class=\"card-content white-text\">\n                    <strong><%= stash('msg')%></strong>\n                </div>\n            </div>\n        </div>\n    % } else {\n        <h2 class=\"col s12 center-align title-filename\"><%= stash('f')->filename %></h2>\n        % if (defined(stash('msg'))) {\n        <div class=\"col s12\">\n            <div class=\"card pink\">\n                <div class=\"card-content white-text\">\n                    <strong><%= stash('msg')%></strong>\n                </div>\n            </div>\n        </div>\n        % } else {\n        %   if (stash('file_pwd')) {\n        <div class=\"col s12\">\n            <div class=\"input-field\">\n                <input type=\"password\" id=\"file_pwd\" placeholder=\"<%= l('Password') %>\" class=\"validate\">\n            </div>\n            <a id=\"go\" class=\"waves-effect waves-light btn\"><%= l('Download') %></a>\n        </div>\n        %   }\n        <div class=\"file-progress col s12<%= (stash('file_pwd')) ? ' hide' : '' %>\">\n            <p id=\"filesize\" data-filesize=\"<%= stash('f')->filesize %>\" data-zipped=\"<%= (stash('f')->zipped) ? 'true' : 'false' %>\"></p>\n            <p id=\"please-wait\"><%= l('Please wait while we are getting your file. We first need to download and decrypt all parts before you can get it.') %></p>\n            <p id=\"loading\"></p>\n            <div class=\"progress\" id=\"pbd\">\n                <div id=\"pb\" class=\"determinate width-0\" role=\"progressbar\" aria-valuenow=\"0\" aria-valuemin=\"0\" aria-valuemax=\"100\">\n                    <span id=\"pbt\" class=\"sr-only\">0%</span>\n                </div>\n            </div>\n        </div>\n        <div class=\"file-abort col s12<%= (stash('file_pwd')) ? ' hide' : '' %>\">\n            <a id=\"abort\" class=\"waves-effect waves-light btn\"><%= l('Abort') %></a>\n        </div>\n%= javascript '/partial/render.js?nbslices='.stash('f')->nbslices.'&file='.stash('f')->short\n%= javascript '/js/filesize.min.js'\n%= javascript '/js/sjcl.js'\n%= javascript '/js/jszip.min.js'\n%= javascript '/js/lufi-notifications.js'\n%= javascript '/js/lufi-down.js'\n    % }\n% }\n    </div>\n</div>\n"
  },
  {
    "path": "utilities/lufi.default",
    "content": "# LDIR is the path where you installed Lufi\n# It has to end with a final /\nLDIR=/var/www/lufi/\n\n# USER is the user who will launch Lufi\nUSER=www-data\n"
  },
  {
    "path": "utilities/lufi.init",
    "content": "#!/bin/sh\n# vim: set ts=4 sw=4 sts=4 tw=0:\n# vim: set expandtab:\n\n### BEGIN INIT INFO\n# Provides:          lufi\n# Required-Start:    $local_fs $remote_fs $network $syslog\n# Required-Stop:     $local_fs $remote_fs $network $syslog\n# Default-Start:     2 3 4 5\n# Default-Stop:      0 1 6\n# Short-Description: starts lufi with hypnotoad\n# Description:       starts lufi with hypnotoad\n### END INIT INFO\n\n\nPATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin\nDAEMON=script/lufi\nNAME=lufi\nDESC=lufi\n\nif [ -f \"/etc/default/lufi\" ]\nthen\n    . /etc/default/lufi\n    if [ -z $LDIR ]\n    then\n        echo \"LDIR variable is empty, please fill it in /etc/default/lufi\"\n        exit 0\n    fi\n    if [ -z $USER ]\n    then\n        echo \"USER variable is empty, please fill it in /etc/default/lufi\"\n        exit 0\n    fi\nelse\n    echo \"Missing /etc/default/lufi file\"\n    exit 0\nfi\n\nif [ ! -f \"$LDIR$DAEMON\" ]\nthen\n    echo \"Missing $LDIR$DAEMON file\"\n    exit 0\nfi\n\nset -e\n\n. /lib/lsb/init-functions\n\ndo_start()\n{\n    # Return\n    # 0 if daemon has been started\n    # 1 if daemon was already running\n    # 2 if daemon could not be started\n\n    cd $LDIR\n    su $USER -c \"carton exec hypnotoad $DAEMON >/dev/null 2>&1\"\n    return \"$?\"\n}\n\ndo_stop()\n{\n    # Return\n    # 0 if daemon has been stopped\n    # 1 if daemon was already stopped\n    # 2 if daemon could not be stopped\n    # other if a failure occurred\n\n    cd $LDIR\n    su $USER -c \"carton exec hypnotoad -s $DAEMON >/dev/null 2>&1\"\n    return \"$?\"\n}\n\ndo_status()\n{\n    cd $LDIR\n    if [ -f \"script/hypnotoad.pid\" ]\n    then\n        pgrep -lf $DAEMON >/dev/null 2>&1\n        if [ \"$?\" = \"0\" ]; then\n            log_progress_msg \"$NAME is running\"\n        else\n            log_failure_msg \"$NAME is NOT running but PID file exists\"\n        fi\n    else\n        log_failure_msg \"$NAME is NOT running\"\n    fi\n}\n\ncase \"$1\" in\n    start)\n        log_daemon_msg \"Starting $NAME\"\n        cd $LDIR\n        if [ -f \"script/hypnotoad.pid\" ]\n        then\n             pgrep -lf $DAEMON >/dev/null 2>&1\n             if [ \"$?\" = \"0\" ]\n             then\n                 log_progress_msg \"$NAME is already running. Unable to start.\"\n                 log_end_msg 1;\n             else\n                 do_start\n                 case \"$?\" in\n                     0|1)\n                         log_progress_msg \"done\"\n                         log_end_msg 0\n                         ;;\n                     2)\n                         log_failure_msg \"failed\"\n                         log_end_msg 1\n                         ;;\n                 esac\n             fi\n        else\n            do_start\n            case \"$?\" in\n                0|1)\n                    log_progress_msg \"done\"\n                    log_end_msg 0\n                    ;;\n                2)\n                    log_failure_msg \"failed\"\n                    log_end_msg 1\n                    ;;\n            esac\n        fi\n        ;;\n    stop)\n        log_daemon_msg \"Stopping $NAME\"\n        cd $LDIR\n        if [ -f \"script/hypnotoad.pid\" ]\n        then\n            pgrep -lf $DAEMON >/dev/null 2>&1\n            if [ \"$?\" = \"0\" ]; then\n                do_stop\n                case \"$?\" in\n                    0|1)\n                        log_progress_msg \"done\"\n                        log_end_msg 0\n                        ;;\n                    *)\n                        log_failure_msg \"failed\"\n                        log_end_msg 1\n                        ;;\n                esac\n            else\n                log_failure_msg \"$NAME is NOT running. Unable to stop\"\n                log_end_msg 1\n            fi\n        else\n            log_failure_msg \"$NAME is NOT running. Unable to stop\"\n            log_end_msg 1\n        fi\n        ;;\n    status)\n        log_daemon_msg \"Checking $NAME status\"\n        do_status\n        log_end_msg 0\n        ;;\n    reload)\n        log_daemon_msg \"Reloading $NAME\"\n        do_start\n        sleep 1\n        case \"$?\" in\n            0|1)\n                log_progress_msg \"done\"\n                log_end_msg 0\n                ;;\n            2)\n                log_failure_msg \"failed\"\n                log_end_msg 1\n                ;;\n        esac\n        ;;\n    restart)\n        log_daemon_msg \"Restarting $NAME\"\n        do_stop\n        sleep 6\n        do_start\n        case \"$?\" in\n            0|1)\n                log_progress_msg \"done\"\n                log_end_msg 0\n                ;;\n            2)\n                log_failure_msg \"failed\";\n                log_end_msg 1\n                ;;\n        esac\n        ;;\n    *)\n        echo \"Usage: $0 {start|stop|status|reload|restart}\" >&2\n        exit 3\n        ;;\nesac\n\nexit 0\n"
  },
  {
    "path": "utilities/lufi.service",
    "content": "[Unit]\nDescription=File hosting service with encryption\nDocumentation=https://framagit.org/luc/lufi\nRequires=network.target\nAfter=network.target\n\n[Service]\nType=forking\nUser=www-data\nRemainAfterExit=yes\nWorkingDirectory=/var/www/lufi/\nPIDFile=/var/www/lufi/script/hypnotoad.pid\nExecStart=/usr/local/bin/carton exec hypnotoad script/lufi\nExecStop=/usr/local/bin/carton exec hypnotoad -s script/lufi\nExecReload=/usr/local/bin/carton exec hypnotoad script/lufi\n\n[Install]\nWantedBy=multi-user.target\n"
  },
  {
    "path": "utilities/migrations/mysql.sql",
    "content": "-- 1 up\nCREATE TABLE IF NOT EXISTS files (\n    short                varchar(255) PRIMARY KEY,\n    deleted              boolean default false,\n    mediatype            varchar(255),\n    filename             varchar(255),\n    filesize             integer,\n    counter              integer default 0,\n    delete_at_first_view boolean,\n    delete_at_day        integer,\n    created_at           integer,\n    created_by           varchar(255),\n    last_access_at       integer,\n    mod_token            varchar(255),\n    nbslices             integer,\n    complete             boolean default false,\n    passwd               varchar(255),\n    abuse                integer\n);\n\nCREATE TABLE IF NOT EXISTS slices (\n    short varchar(255)        NOT NULL REFERENCES files(short) ON DELETE CASCADE,\n    j     integer             NOT NULL,\n    path  varchar(255) unique NOT NULL,\n    constraint slice_short_j UNIQUE (short, j)\n);\n-- 1 down\nDROP TABLE slices;\nDROP TABLE files;\n-- 2 up\nALTER TABLE files ADD COLUMN zipped boolean default false;\n-- 2 down\nALTER TABLE files DROP COLUMN zipped;\n-- 3 up\nCREATE TABLE IF NOT EXISTS invitations (\n       token                 varchar(255) PRIMARY KEY,\n       ldap_user             varchar(255),\n       ldap_user_mail        varchar(255),\n       guest_mail            varchar(255),\n       created_at            integer,\n       expire_at             integer,\n       files_sent_at         integer,\n       expend_expire_at      integer,\n       files                 text,\n       show_in_list          boolean,\n       deleted               boolean\n);\n-- 3 down\nDROP TABLE invitations;\n-- 4 up\nALTER TABLE files MODIFY filesize bigint;\n-- 4 down\nALTER TABLE files MODIFY filesize integer;\n-- 5 up\nALTER TABLE slices MODIFY path varchar(255);\n-- 5 down\nALTER TABLE slices MODIFY path varchar(255) unique NOT NULL;\n"
  },
  {
    "path": "utilities/migrations/pg.sql",
    "content": "-- 1 up\nCREATE TABLE IF NOT EXISTS files (\n    short                text PRIMARY KEY,\n    deleted              boolean default false,\n    mediatype            text,\n    filename             text,\n    filesize             integer,\n    counter              integer default 0,\n    delete_at_first_view boolean,\n    delete_at_day        integer,\n    created_at           integer,\n    created_by           text,\n    last_access_at       integer,\n    mod_token            text,\n    nbslices             integer,\n    complete             boolean default false,\n    passwd               text\n);\n\nCREATE TABLE IF NOT EXISTS slices (\n    short text        NOT NULL REFERENCES files(short) ON DELETE CASCADE,\n    j     integer     NOT NULL,\n    path  text unique NOT NULL,\n    constraint slice_short_j UNIQUE (short, j)\n);\n-- 1 down\nDROP TABLE slices;\nDROP TABLE files;\n-- 2 up\nALTER TABLE files ADD COLUMN abuse integer;\n-- 2 down\nALTER TABLE files DROP COLUMN abuse;\n-- 3 up\nALTER TABLE files ADD COLUMN zipped boolean default false;\n-- 3 down\nALTER TABLE files DROP COLUMN zipped;\n-- 4 up\nCREATE TABLE IF NOT EXISTS invitations (\n       token                 text PRIMARY KEY,\n       ldap_user             text,\n       ldap_user_mail        text,\n       guest_mail            text,\n       created_at            integer,\n       expire_at             integer,\n       files_sent_at         integer,\n       expend_expire_at      integer,\n       files                 text,\n       show_in_list          boolean,\n       deleted               boolean\n);\n-- 4 down\nDROP TABLE invitations;\n-- 5 up\nALTER TABLE files ALTER COLUMN filesize TYPE bigint;\n-- 5 down\nALTER TABLE files ALTER COLUMN filesize TYPE integer;\n-- 6 up\nALTER TABLE slices ALTER COLUMN path DROP NOT NULL;\nALTER TABLE slices DROP CONSTRAINT slices_path_key;\n-- 6 down\nALTER TABLE slices ADD CONSTRAINT slices_path_key UNIQUE (path) ;\nALTER TABLE slices ALTER COLUMN path SET NOT NULL;\n"
  },
  {
    "path": "utilities/migrations/sqlite.sql",
    "content": "-- 1 up\nCREATE TABLE IF NOT EXISTS files (\n       short                 TEXT PRIMARY KEY,\n       deleted               INTEGER,\n       mediatype             TEXT,\n       filename              TEXT,\n       filesize              INTEGER,\n       counter               INTEGER,\n       delete_at_first_view  INTEGER,\n       delete_at_day         INTEGER,\n       created_at            INTEGER,\n       created_by            TEXT,\n       last_access_at        INTEGER,\n       mod_token             TEXT,\n       nbslices              INTEGER,\n       complete              INTEGER,\n       passwd                TEXT\n);\nCREATE TABLE IF NOT EXISTS slices (\n    short                 TEXT,\n    j                     INTEGER,\n    path                  TEXT,\n    FOREIGN KEY (short) REFERENCES files(short)\n);\nCREATE INDEX IF NOT EXISTS slices_idx ON slices(short);\n-- 1 down\nDROP INDEX slices_idx ON slices(short);\nDROP TABLE slices;\nDROP TABLE files;\n-- 2 up\nALTER TABLE files ADD COLUMN abuse INTEGER;\n-- 2 down\nBEGIN TRANSACTION;\n    CREATE TABLE files_backup (\n       short                 TEXT PRIMARY KEY,\n       deleted               INTEGER,\n       mediatype             TEXT,\n       filename              TEXT,\n       filesize              INTEGER,\n       counter               INTEGER,\n       delete_at_first_view  INTEGER,\n       delete_at_day         INTEGER,\n       created_at            INTEGER,\n       created_by            TEXT,\n       last_access_at        INTEGER,\n       mod_token             TEXT,\n       nbslices              INTEGER,\n       complete              INTEGER,\n       passwd                TEXT\n    );\n    INSERT INTO files_backup SELECT short, deleted, mediatype, filename, filesize, counter, delete_at_first_view, delete_at_day, created_at, created_by, last_access_at, mod_token, nbslices, complete, passwd FROM files;\n    DROP TABLE files;\n    ALTER TABLE files_backup RENAME TO files;\nCOMMIT;\n-- 3 up\nALTER TABLE files ADD COLUMN zipped INTEGER;\n-- 3 down\nBEGIN TRANSACTION;\n    CREATE TABLE files_backup (\n       short                 TEXT PRIMARY KEY,\n       deleted               INTEGER,\n       mediatype             TEXT,\n       filename              TEXT,\n       filesize              INTEGER,\n       counter               INTEGER,\n       delete_at_first_view  INTEGER,\n       delete_at_day         INTEGER,\n       created_at            INTEGER,\n       created_by            TEXT,\n       last_access_at        INTEGER,\n       mod_token             TEXT,\n       nbslices              INTEGER,\n       complete              INTEGER,\n       passwd                TEXT,\n       abuse                 INTEGER\n    );\n    INSERT INTO files_backup SELECT short, deleted, mediatype, filename, filesize, counter, delete_at_first_view, delete_at_day, created_at, created_by, last_access_at, mod_token, nbslices, complete, passwd, abuse FROM files;\n    DROP TABLE files;\n    ALTER TABLE files_backup RENAME TO files;\nCOMMIT;\n-- 4 up\nCREATE TABLE IF NOT EXISTS invitations (\n       token                 TEXT PRIMARY KEY,\n       ldap_user             TEXT,\n       ldap_user_mail        TEXT,\n       guest_mail            TEXT,\n       created_at            INTEGER,\n       expire_at             INTEGER,\n       files_sent_at         INTEGER,\n       expend_expire_at      INTEGER,\n       files                 TEXT,\n       show_in_list          INTEGER,\n       deleted               INTEGER\n);\n-- 4 down\nDROP TABLE invitations;\n"
  }
]