prewikka-5.1.1/0000775000175000017500000000000013555143705014747 5ustar tandrejatandreja00000000000000prewikka-5.1.1/conf/0000775000175000017500000000000013555143705015674 5ustar tandrejatandreja00000000000000prewikka-5.1.1/conf/menu.yml0000664000175000017500000000215013555143652017362 0ustar tandrejatandreja00000000000000# Specify the section order in the upper menu # All the icons available are here (v4.5): # http://fontawesome.io/icons/ - name: ALERT icon: exclamation-triangle categories: - sections: - name: Alerts tabs: - Alerts - Aggregated alerts - name: Threats default_tab: Threats tabs: - Threats - Aggregated threats - name: ADMIN icon: sliders categories: - sections: - name: Configuration expand: true tabs: - Scheduling - name: Preferences tabs: - My account - Filters - name: Monitoring expand: true tabs: - Agents - Heartbeats - Aggregated heartbeats - icon: question default: true categories: - sections: - name: Apps tabs: - Apps - name: Help tabs: - IDMEF prewikka-5.1.1/conf/prewikka.conf0000664000175000017500000001166513555143652020372 0ustar tandrejatandreja00000000000000########################## # Prewikka configuration ########################## [general] # Location of the help server #help_location: http://doc.prelude/rst/${lang}/${path} # Number of heartbeats to analyze in the heartbeat analysis view. #heartbeat_count: 30 # If the offset between two heartbeats is off by more than the specified # offset (in seconds), the analyzer will be represented as offline. #heartbeat_error_margin: 3 # Open external (references, IP lookup, and port lookup) links # in a new windows. external_link_new_window: yes # Enables details links (default: no) enable_details: no # Enable error traceback (default: yes) enable_error_traceback: yes # URL to get details about an host host_details_url: http://www.prelude-siem.com/host_details.php # URL to get details about a port port_details_url: http://www.prelude-siem.com/port_details.php # URL to get details about a classification reference reference_details_url: http://www.prelude-siem.com/reference_details.php # When the number of classifications, sources or targets exceeds # the defined value, an expansion link will be provided to look up # the remaining entries. # # max_aggregated_source: 3 # max_aggregated_target: 3 # max_aggregated_classification: 10 # Asynchronous DNS resolution (require twisted.names and twisted.internet) # # While rendering view containing address scheduled for asynchronous # DNS resolution, it is possible that the rendering terminate too fast # for all DNS requests to complete. # # The dns_max_delay setting determine Prewikka behavior: # - [-1] No DNS resolution is performed. # - [0] Do not wait, immediatly send results to the client. # - [x] Wait at most x seconds, then send results to the client. # # dns_max_delay: 0 # Default locale to use (default is English) # The supported locales are: de_DE, en_GB, es_ES, fr_FR, it_IT, pl_PL, pt_BR, ru_RU # # default_locale: en_GB # Default theme to use (default is cs) # The supported themes are: blue, bright, classic, cs, dark, green, yellow # # default_theme: cs # Default timezone to use (default is the local timezone) # The supported timezones follow the IANA naming convention, # for instance: UTC, Africa/Abidjan, Europe/Zurich... # # default_timezone: UTC # Default encoding to use (default is UTF8): # encoding: utf8 # Public path to Prewikka in case the application is being served # through a reverse proxy, including any necessary port information. # reverse_path: http://example.com/proxied/prewikka/ [interface] # Software name displayed in the top left corner (displays logo if not defined) # software: Prelude # Webpage title # browser_title: Prelude # Path to the file defining the menu entries order: # menu_order: menu.yml ############################ # Customizable search pages ############################ # Define additional fields to be displayed in search pages # [datasearch alert] # extra_fields: alert.source.user.user_id.name, alert.target.user.user_id.name # [datasearch heartbeat] # extra_fields: heartbeat.messageid ##################### # Customizable links ##################### # Define custom links and paths for which these links may be displayed # [url host] # paths: alert.source.node.address.address, alert.target.node.address.address # label: http://url?host=$value # [url classification] # paths: alert.classification.text # label: http://url?classification=$value # [url time] # paths: alert.create_time # label: http://url?time=$value ############ # Databases ############ # Events DB [idmef_database] # type: pgsql | mysql | sqlite3 # For sqlite, add # file: /path/to/your/sqlite_database # type: pgsql host: localhost user: prelude pass: prelude name: prelude # Prewikka DB [database] type: pgsql host: localhost user: prelude pass: prelude name: prewikka ########## # Logging ########## # - You can activate several log section. # - Log level might be set to all/debug, info, warning, error, critical. # If unspecified, the default level is "warning". # [log stderr] # level: info # [log file] # level: debug # file: /tmp/prewikka.log [log syslog] level: info # [log nteventlog] # level: info # [log smtp] # level: warning # host: mail.domain.com # from: user@address # to: recipient1@address, recipient2@address, recipientN@address # subject: Subject to use ############ # Cron jobs ############ # Define parameters for different cron jobs. # Cron jobs must be enabled from the GUI to be executed. # Periodic alert deletion # [cron alert] # # Minimal age in days for alerts to be deleted (default is not to delete alerts) # age: 30 # # It is also possible to define this value per severity (default is to use the age above): # high: 365 # medium: 90 # low: 30 # info: 7 # Periodic heartbeat deletion # [cron heartbeat] # # Minimal age in days for heartbeats to be deleted (default is not to delete heartbeats) # age: 7 # Periodic search history entries deletion # [cron search_history] # # Maximal number of entries per user to be kept (default is 10) # size: 10 [include] conf.d/*.conf prewikka-5.1.1/prewikka/0000775000175000017500000000000013555143705016564 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/auth/0000775000175000017500000000000013555143705017525 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/auth/__init__.py0000664000175000017500000000022313555143652021634 0ustar tandrejatandreja00000000000000from __future__ import absolute_import, division, print_function, unicode_literals from .auth import Auth, AuthError # noqa: imported but unused prewikka-5.1.1/prewikka/auth/auth.py0000664000175000017500000001107513555143652021045 0ustar tandrejatandreja00000000000000# Copyright (C) 2004-2019 CS-SI. All Rights Reserved. # Author: Yoann Vandoorselaere # Author: Antoine Luong # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from __future__ import absolute_import, division, print_function, unicode_literals import abc from prewikka import log, pluginmanager from prewikka.error import NotImplementedError, PrewikkaUserError class AuthError(PrewikkaUserError): def __init__(self, session, message=N_("Authentication failed"), log_priority=log.ERROR, log_user=None): PrewikkaUserError.__init__(self, None, message, log_priority=log_priority, log_user=log_user, template=session.template) class _AuthUser(object): def can_create_user(self): return self.__class__.create_user != _AuthUser.create_user def can_delete_user(self): return self.__class__.delete_user != _AuthUser.delete_user def can_set_password(self): return self.__class__.set_password != _AuthUser.set_password def can_manage_permissions(self): return self.__class__.set_user_permissions != _AuthUser.set_user_permissions @abc.abstractmethod def create_user(self, user): raise NotImplementedError @abc.abstractmethod def delete_user(self, user): raise NotImplementedError @abc.abstractmethod def get_user_list(self, search=None): return [] @abc.abstractmethod def get_user_by_id(self, id_): raise NotImplementedError @abc.abstractmethod def has_user(self, user): raise NotImplementedError @abc.abstractmethod def get_user_permissions(self, user, ignore_group=False): return [] @abc.abstractmethod def get_user_permissions_from_groups(self, user): return [] @abc.abstractmethod def set_user_permissions(self, user, permissions): raise NotImplementedError @abc.abstractmethod def set_password(self, user, password): raise NotImplementedError class _AuthGroup(object): def can_handle_groups(self): return self.__class__.get_group_by_id != _AuthGroup.get_group_by_id def can_create_group(self): return self.__class__.create_group != _AuthGroup.create_group def can_delete_group(self): return self.__class__.delete_group != _AuthGroup.delete_group def can_manage_group_members(self): return self.__class__.set_group_members != _AuthGroup.set_group_members def can_manage_group_permissions(self): return self.__class__.set_group_permissions != _AuthGroup.set_group_permissions def get_group_list(self, search=None): return [] def get_group_by_id(self, id_): raise NotImplementedError @abc.abstractmethod def create_group(self, group): raise NotImplementedError @abc.abstractmethod def delete_group(self, group): raise NotImplementedError def set_group_permissions(self, group, permissions): raise NotImplementedError def get_group_permissions(self, group): return [] def set_group_members(self, group, users): raise NotImplementedError def get_group_members(self, group): return [] def set_member_of(self, user, groups): raise NotImplementedError def get_member_of(self, user): return [] def is_member_of(self, group, user): raise NotImplementedError def has_group(self, group): raise NotImplementedError class Auth(pluginmanager.PluginBase, _AuthUser, _AuthGroup): __metaclass__ = abc.ABCMeta plugin_mandatory = True def __init__(self, config): pluginmanager.PluginBase.__init__(self) _AuthUser.__init__(self) _AuthGroup.__init__(self) def init(self, config): pass def authenticate(self, login, password="", no_password_check=False): raise NotImplementedError def get_default_session(self): raise NotImplementedError prewikka-5.1.1/prewikka/compat/0000775000175000017500000000000013555143705020047 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/compat/__init__.py0000664000175000017500000000241113555143652022157 0ustar tandrejatandreja00000000000000from __future__ import absolute_import, division, print_function import sys if sys.version_info[0] >= 3: STRING_TYPES = str, else: STRING_TYPES = basestring, def with_metaclass(meta, *bases): """ Function from jinja2/_compat.py. License: BSD. Use it like this:: class BaseForm(object): pass class FormType(type): pass class Form(with_metaclass(FormType, BaseForm)): pass This requires a bit of explanation: the basic idea is to make a dummy metaclass for one level of class instantiation that replaces itself with the actual metaclass. Because of internal type checks we also need to make sure that we downgrade the custom metaclass for one level to something closer to type (that's why __call__ and __init__ comes back from type etc.). This has the advantage over six.with_metaclass of not introducing dummy classes into the final MRO. """ class metaclass(meta): __call__ = type.__call__ __init__ = type.__init__ def __new__(cls, name, this_bases, d): if this_bases is None: return type.__new__(cls, name, (), d) return meta(name, bases, d) return metaclass('temporary_class', None, {}) prewikka-5.1.1/prewikka/compat/babelcompat.py0000664000175000017500000000234513555143652022677 0ustar tandrejatandreja00000000000000from __future__ import absolute_import, division, print_function, unicode_literals from datetime import timedelta TIMEDELTA_UNITS = ( ('year', 3600 * 24 * 365), ('month', 3600 * 24 * 30), ('week', 3600 * 24 * 7), ('day', 3600 * 24), ('hour', 3600), ('minute', 60), ('second', 1) ) def format_timedelta(delta, granularity='second', threshold=.85, add_direction=False, format='medium', locale=""): if format not in ('short', 'medium'): raise TypeError('Format can only be one of "short" or "medium"') if isinstance(delta, timedelta): seconds = int((delta.days * 86400) + delta.seconds) else: seconds = delta for unit, secs_per_unit in TIMEDELTA_UNITS: value = abs(seconds) / secs_per_unit if value >= threshold or unit == granularity: if unit == granularity and value > 0: value = max(1, value) value = int(round(value)) if not add_direction: return u"%d %s" % (value, unit) elif seconds >= 0: return u"in %d %s" % (value, unit) else: return u"%d %s ago" % (value, unit) return u'' prewikka-5.1.1/prewikka/compat/gevent.py0000664000175000017500000000157613555143652021723 0ustar tandrejatandreja00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- # Re-add sslwrap to Python 2.7.5 import inspect __ssl__ = __import__('ssl') try: _ssl = __ssl__._ssl except AttributeError: _ssl = __ssl__._ssl2 def new_sslwrap(sock, server_side=False, keyfile=None, certfile=None, cert_reqs=__ssl__.CERT_NONE, ssl_version=__ssl__.PROTOCOL_SSLv23, ca_certs=None, ciphers=None): context = __ssl__.SSLContext(ssl_version) context.verify_mode = cert_reqs or __ssl__.CERT_NONE if ca_certs: context.load_verify_locations(ca_certs) if certfile: context.load_cert_chain(certfile, keyfile) if ciphers: context.set_ciphers(ciphers) caller_self = inspect.currentframe().f_back.f_locals['self'] return context._wrap_socket(sock, server_side=server_side, ssl_sock=caller_self) def fix_ssl(): if not hasattr(_ssl, 'sslwrap'): _ssl.sslwrap = new_sslwrap prewikka-5.1.1/prewikka/compat/jquery_unparam.py0000664000175000017500000000465713555143652023500 0ustar tandrejatandreja00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- import functools import re import sys try: from urllib import unquote_plus except ImportError: from urllib.parse import unquote_plus if sys.version_info >= (3, 0): Py3 = True else: Py3 = False def _decode(string, unquote=False): if unquote: string = unquote_plus(string) if not Py3: string = string.decode("utf8") return string def parse_key_pair(keyval, unquote=False): keyval_splitted = keyval.split('=', 1) if len(keyval_splitted) == 1: key, val = keyval_splitted[0], '' else: key, val = keyval_splitted return _decode(key, unquote), _decode(val, unquote) def build_struct(key, val): if key == '' or val == '': return {} groups = re.findall(r"\[.*?\]", key) groups_joined = ''.join(groups) if key[-len(groups_joined):] == groups_joined: key = key[:-len(groups_joined)] for group in reversed(groups): if group == '[]': val = [val] else: val = {group[1:-1]: val} return {key: val} def merge_two_structs(s1, s2): if isinstance(s1, list) and isinstance(s2, list): return s1 + s2 if isinstance(s1, dict) and \ isinstance(s2, dict): retval = s1.copy() for key, val in s2.items(): if retval.get(key) is None: retval[key] = val else: retval[key] = merge_two_structs(retval[key], val) return retval return s2 def merge_structs(structs): if len(structs) == 0: return {} return functools.reduce(lambda x, y: merge_two_structs(y, x), reversed(structs)) def handle_indexes(s, toplevel=False): if isinstance(s, list): return [handle_indexes(item) for item in s] if isinstance(s, dict): if not toplevel and s and all(k.isdigit() for k in s.keys()): return [handle_indexes(v) for k, v in sorted(s.items(), key=lambda x: int(x[0]))] else: return {k: handle_indexes(v) for k, v in s.items()} return s def jquery_unparam(jquery_params, unquote=True, multipart=False): if multipart: params = [(_decode(k, unquote), v) for k, v in jquery_params] else: params = [parse_key_pair(x, unquote) for x in jquery_params.split('&')] structs = [build_struct(k, v) for k, v in params] return handle_indexes(merge_structs(structs), toplevel=True) prewikka-5.1.1/prewikka/dataprovider/0000775000175000017500000000000013555143705021250 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/dataprovider/parsers/0000775000175000017500000000000013555143705022727 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/dataprovider/parsers/criteria/0000775000175000017500000000000013555143705024531 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/dataprovider/parsers/criteria/__init__.py0000664000175000017500000000510013555143652026637 0ustar tandrejatandreja00000000000000# Copyright (C) 2018-2019 CS-SI. All Rights Reserved. # Author: Yoann Vandoorselaere # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from __future__ import absolute_import, division, print_function, unicode_literals from lark import Lark, Transformer, v_args from lark.exceptions import LarkError from prewikka.dataprovider import Criterion, ParserError from . import grammar _grammar = Lark(grammar.GRAMMAR, start="criteria", parser="lalr") class CommonTransformer(Transformer): @staticmethod def _unescape(input, escaped): return input.replace('\\%s' % escaped, escaped) @v_args(inline=True) def dqstring(self, s): s.value = self._unescape(s.value[1:-1], '"') return s.value @v_args(inline=True) def sqstring(self, s): s.value = self._unescape(s.value[1:-1], "'") return s.value uqstring = v_args(inline=True)(text_type) path = string = operator = v_args(inline=True)(text_type) class CriteriaTransformer(CommonTransformer): def __init__(self, compile=Criterion): self._compile = compile parenthesis = v_args(inline=True)(lambda self, criterion: criterion) or_ = v_args(inline=True)(lambda self, left, right: Criterion(left, "||", right)) and_ = v_args(inline=True)(lambda self, left, right: Criterion(left, "&&", right)) not_ = v_args(inline=True)(lambda self, right: Criterion(operator="!", right=right)) criterion = v_args(inline=True)(lambda self, left, op, right: self._compile(left, op, right)) not_null = v_args(inline=True)(lambda self, path: self._compile(path, "!=", None)) def parse(input, transformer=CriteriaTransformer()): """Convert a Criterion string to a Criterion object.""" try: tree = _grammar.parse(input) except LarkError as e: raise ParserError(details=e) if transformer: return transformer.transform(tree) return tree prewikka-5.1.1/prewikka/dataprovider/parsers/criteria/grammar.py0000664000175000017500000000410513555143652026532 0ustar tandrejatandreja00000000000000# Copyright (C) 2018-2019 CS-SI. All Rights Reserved. # Author: Yoann Vandoorselaere # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from __future__ import absolute_import, division, print_function, unicode_literals GRAMMAR = r""" ?criteria: and | criteria "||" and -> or_ ?and: not | and "&&" not -> and_ ?not: criterion | "!" not -> not_ criterion: path operator value | path -> not_null | "(" criteria ")" -> parenthesis !operator: "=" | "=*" | "==" | "!=" | "!=*" | "<>" | "<>*" | "!<>" | "!<>*" | "<" | "<=" | ">" | ">=" | "~" | "~*" | "!~" | "!~*" -> operator int_: DIGIT+ float_: NUMBER path: PATH ?value: string string: (dqstring | sqstring | uqstring) SQSTRING.1: "'" ("\\'" | /[^']/)* "'" DQSTRING.1: "\"" ("\\\""|/[^"]/)* "\"" !sqstring: SQSTRING !dqstring: DQSTRING !uqstring: UNQUOTED_STRING // Normally && and || SPECIAL_CHARACTERS: "&" | "|" | "(" | ")" ESCAPED_SPECIAL_CHARACTERS: "\\" SPECIAL_CHARACTERS UNQUOTED_STRING.0: (ESCAPED_SPECIAL_CHARACTERS | /[^\s&|()]/)+ PATH: (PATHELEM ".")* PATHELEM PATHELEM: WORD ("(" PATHINDEX ")")? PATHINDEX: ("-"? DIGIT+ | DQSTRING | SQSTRING | "*") WORD: LETTER (LETTER | DIGIT | "-" | "_")* DIGIT: /[0-9]/ LETTER: /[a-z]/ %import common.NUMBER %import common.WS %ignore WS """ prewikka-5.1.1/prewikka/dataprovider/parsers/lucene/0000775000175000017500000000000013555143705024202 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/dataprovider/parsers/lucene/__init__.py0000664000175000017500000002151213555143652026315 0ustar tandrejatandreja00000000000000# Copyright (C) 2018-2019 CS-SI. All Rights Reserved. # Author: Yoann Vandoorselaere # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from __future__ import absolute_import, division, print_function, unicode_literals import functools import re from lark import Lark, Transformer, v_args from lark.exceptions import LarkError from prewikka import error from prewikka.dataprovider import Criterion, ParserError from . import grammar _grammar = Lark(grammar.GRAMMAR, start="input", parser="lalr", keep_all_tokens=True) def _wildcard_to_regex(value): ret = "" lst = re.split("([*?])", value) for part in lst: if part == "*": ret += ".*" elif part == "?": ret += "." else: ret += re.escape(part) return len(lst), ret class LuceneEmulationError(error.PrewikkaUserError): name = N_("Lucene emulation error") message = N_("This Lucene expression cannot be emulated properly using the Criterion backend") class CommonTransformer(Transformer): @staticmethod def _unescape(input, escaped): return input.replace('\\%s' % escaped, escaped) @staticmethod def _hack(s, escaped): # We modify the internal value representation, directly accessed from value_string() s.value = CommonTransformer._unescape(s[1:-1], escaped) return s @v_args(inline=True) def uqstring(self, s): r = _wildcard_to_regex(s) if r[0] > 1: # We modify the internal value representation, directly accessed from value_string() s.value = r[1] op = "~" else: op = "<>*" return op, s string = v_args(inline=True)(lambda _, s: s) sqstring = v_args(inline=True)(lambda _, s: ("<>*", CommonTransformer._hack(s, "'"))) dqstring = v_args(inline=True)(lambda _, s: ("<>*", CommonTransformer._hack(s, '"'))) regstr = v_args(inline=True)(lambda _, s: ("~", CommonTransformer._hack(s, '/'))) class _CustomCriterion(object): def __init__(self, c): self.criterion = c class _Required(_CustomCriterion): pass class _Optional(_CustomCriterion): pass # From http://lucene.472066.n3.nabble.com/operator-precedence-and-confusing-result-td642263.html: # # Lucene's query model is based on REQUIRED, OPTIONAL, and EXCLUDED # clauses. A clause with no annotation is always OPTIONAL, and doesn't # affect matching unless there are only OPTIONAL clauses on that level. # brackets () create a subclause (note that this is OPTIONAL by # default!). AND terms are translated into REQUIRED clauses, AND NOT's # are translated into EXCLUDED clauses. Require clauses are annotated # with +'s # # A AND B OR C OR D OR E OR F # -> +A +B C D E F # -> find documents that match clause A and clause B (other clauses # don't affect matching) # # C OR D OR E OR F # -> C D E F # -> find documents matching at least one of these clauses # # A AND (B OR C OR D OR E OR F) # -> +A +(B C D E F) # -> find documents that match A, and match one of B, C, D, E, or F # # (A AND B) OR C OR D OR E OR F # -> (+A +B) C D E F # -> find documents that match at least one of C, D, E, F, or both of A # and B # # The key takeaway: once you have an AND in a grouped set of clauses, # the OR are completely irrelevant for matching. # class CriteriaTransformer(CommonTransformer): def __init__(self, compile=Criterion, default_paths=[]): self._compile = compile self._default_paths = default_paths def string_modifier(self, data): raise LuceneEmulationError def _get_fields(self, parent_field): return [parent_field] if parent_field else self._default_paths def _range(self, parent_field, from_, to, op_a, op_b): fields = self._get_fields(parent_field) return functools.reduce(lambda x, y: x | y, (self._compile(path, op_a, from_) & self._compile(path, op_b, to) for path in fields), Criterion()) def _get_criterion(self, data, field, parent_field): obj = self._tree_to_criteria(data, self._tree_to_criteria(field) or parent_field) if not isinstance(obj, Criterion): return obj.criterion return obj def _bool(self, a, op, b, parent_field=[]): a = self._tree_to_criteria(a, parent_field) b = self._tree_to_criteria(b, parent_field) if b is None or (isinstance(a, _Required) and isinstance(b, _Optional)): return a elif a is None or (isinstance(b, _Required) and isinstance(a, _Optional)): return b else: return a.__class__(Criterion(a.criterion, "&&" if isinstance(a, _Required) else op, b.criterion)) def _tree_to_criteria(self, t, parent_field=[], has_required=False): tag = getattr(t, "data", None) if not tag: return text_type(t.value) if t else None if tag == "or_": return self._bool(t.children[0], "||", t.children[2], parent_field) elif tag == "and_": return self._bool(t.children[0], "&&", t.children[2], parent_field) elif tag == "field" and t.children: return t.children[0].replace(" ", "")[:-1] elif tag == "parenthesis": _, data, _ = t.children return self._tree_to_criteria(data, parent_field).criterion elif tag == "value_string": op, value = t.children[0] ret = Criterion() for i in self._get_fields(parent_field): ret |= self._compile(i, op, value.value) return ret elif tag == "inclusive_range": from_, to = filter(lambda x: isinstance(x, tuple), t.children) return self._range(parent_field, from_[1], to[1], ">=", "<=") elif tag == "exclusive_range": from_, to = filter(lambda x: isinstance(x, tuple), t.children) return self._range(parent_field, from_[1], to[1], ">", "<") elif tag in "required": if len(t.children) > 1: _, field, data = t.children return _Required(self._get_criterion(data, field, parent_field)) elif tag == "excluded": if len(t.children) > 1: _, field, data = t.children return _Required(Criterion(operator="!", right=self._get_criterion(data, field, parent_field))) elif tag == "optional": field, data = t.children return _Optional(self._get_criterion(data, field, parent_field)) elif tag == "input": return self._tree_to_criteria(t.children[1], parent_field) elif t.children: return self._tree_to_criteria(t.children[0], parent_field) def transform(self, tree): return self._tree_to_criteria(Transformer.transform(self, tree)).criterion class ReconstructTransformer(CommonTransformer): def _value_string(self, vl, field=None): return vl[1] def _tree_tostring(self, t, parent_field=None): tag = getattr(t, "data", None) if tag == "value_string": return self._value_string(t.children[0], parent_field) elif tag in ("required", "excluded"): if len(t.children) == 1: return self._tree_tostring(t.children[0]) operator, field, value = t.children field = self._tree_tostring(field) return "".join([self._tree_tostring(operator), field, self._tree_tostring(value, field or parent_field)]) elif tag == "optional": field, value = t.children field = self._tree_tostring(field) return "".join([field, self._tree_tostring(value, field or parent_field)]) if not tag: if isinstance(t, tuple): return text_type(t[1]) return text_type(t) else: return "".join(self._tree_tostring(i, parent_field) for i in t.children) return "" def transform(self, tree): return self._tree_tostring(Transformer.transform(self, tree)) def parse(input, transformer=None): """Convert a Lucene string to a Criterion object.""" try: tree = _grammar.parse(input) except LarkError as e: raise ParserError(details=e) if transformer: return transformer.transform(tree) return tree prewikka-5.1.1/prewikka/dataprovider/parsers/lucene/grammar.py0000664000175000017500000000532113555143652026204 0ustar tandrejatandreja00000000000000# Copyright (C) 2018-2019 CS-SI. All Rights Reserved. # Author: Yoann Vandoorselaere # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from __future__ import absolute_import, division, print_function, unicode_literals GRAMMAR = r""" ?input: WS* criteria WS* ?criteria: operator_ | criteria WS+ operator_ -> or_ | criteria BOOL_OR operator_ -> or_ | criteria BOOL_AND operator_ -> and_ ?operator_: (optional | excluded | required) excluded: EXCLUDED _criterion? required: REQUIRED _criterion? optional: _criterion parenthesis: LPAR criteria RPAR _criterion: field (value | parenthesis) value: (inclusive_range | exclusive_range | value_string) inclusive_range: "[" WS* _string WS "TO" WS _string WS* "]" exclusive_range: "{" WS* _string WS "TO" WS _string WS* "}" value_string: _string (string_modifier)? _string: (dqstring | sqstring | regstr | uqstring) string_modifier: BOOST_MODIFIER | FUZZY_MODIFIER BOOST_MODIFIER: "^" /[0-9]+/ FUZZY_MODIFIER: "~" /[0-9]*/ SQSTRING.3: "'" ("\\'" | /[^']/)* "'" DQSTRING.3: "\"" ("\\\""|/[^"]/)* "\"" RESTRING.3: "/" ("\\/"|/[^\/]/)* "/" !sqstring: SQSTRING !dqstring: DQSTRING !regstr: RESTRING !uqstring: UNQUOTED_STRING SPECIAL_CHARACTERS: "+" | "-" | "!" | "(" | ")" | "{" | "}" | "[" | "]" | "^" | "\"" | "~" | "*" | "?" | ":" | "\\" | "&" | "|" ESCAPED_SPECIAL_CHARACTERS: "\\" SPECIAL_CHARACTERS UNQUOTED_STRING.2: (ESCAPED_SPECIAL_CHARACTERS | /[^+!(){}\[\]^\"\~:\s]/)+ field: (FIELD)? -> field FIELD.2: PATH WS* ":" WS* PATH.0: (PATHELEM ".")* PATHELEM PATHELEM.0: WORD ("(" PATHINDEX ")")? PATHINDEX.0: "-"? (DIGIT+ | UNQUOTED_STRING) WORD: LETTER (LETTER | DIGIT | "-" | "_")+ DIGIT: /[0-9]/ LETTER: /[a-z]/ BOOL_AND.1: WS+ ("&&" | "AND") WS+ BOOL_OR.1: WS+ ("||" | "OR") WS+ NOT_STR: "NOT" WS+ EXCLUDED.3: WS* ("-" | "!" | NOT_STR) REQUIRED.1: WS* "+" LPAR: "(" WS* RPAR: WS* ")" WS: /[ \t\f\r\n]/+ """ prewikka-5.1.1/prewikka/dataprovider/parsers/__init__.py0000664000175000017500000000000013555143652025027 0ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/dataprovider/plugins/0000775000175000017500000000000013555143705022731 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/dataprovider/plugins/idmef/0000775000175000017500000000000013555143705024015 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/dataprovider/plugins/idmef/__init__.py0000664000175000017500000000746713555143652026145 0ustar tandrejatandreja00000000000000# Copyright (C) 2016-2019 CS-SI. All Rights Reserved. # Author: Abdel ELMILI from __future__ import absolute_import, division, print_function, unicode_literals from datetime import datetime import prelude from prelude import IDMEFTime, IDMEFValue from prewikka import error, idmefdatabase, usergroup, utils, version from prewikka.dataprovider import DataProviderBackend, QueryResults, QueryResultsRow, ResultObject class IDMEFResultObject(ResultObject, utils.json.JSONObject): def preprocess_value(self, value): if isinstance(value, IDMEFTime): return datetime.fromtimestamp(value, utils.timeutil.tzoffset(None, value.getGmtOffset())) return ResultObject.preprocess_value(self, value) @classmethod def from_json(cls, data): return cls(prelude.IDMEF(data["idmef_json"])) def __json__(self): return {"idmef_json": self._obj.toJSON()} class IDMEFQueryResultsRow(QueryResultsRow): __slots__ = () def preprocess_value(self, value): if isinstance(value, IDMEFTime): return datetime.fromtimestamp(value, utils.timeutil.tzoffset(None, value.getGmtOffset())) return QueryResultsRow.preprocess_value(self, value) class IDMEFQueryResults(QueryResults): __slots__ = () def preprocess_value(self, value): return IDMEFQueryResultsRow(self, value) class _IDMEFPlugin(DataProviderBackend): plugin_version = version.__version__ plugin_author = version.__author__ plugin_license = version.__license__ plugin_copyright = version.__copyright__ def __init__(self): DataProviderBackend.__init__(self) try: self._db = idmefdatabase.IDMEFDatabase(env.config.idmef_database) except Exception as e: raise error.PrewikkaUserError(N_("Initialization error"), e) def get_properties(self): return utils.AttrObj(format=self._db.getFormatName()) def _iterate_object(self, results): for ident in results: res = IDMEFResultObject(self._get_object(ident)) res.ident = ident yield res def update(self, data, criteria): paths, values = zip(*data) self._db.update(list(paths), [IDMEFValue(v) for v in values], criteria) def get(self, criteria, order_by, limit, offset): results = self._get_idents(criteria, limit, offset, order_by) return utils.CachingIterator(self._iterate_object(results)) @usergroup.permissions_required(["IDMEF_VIEW"]) def get_values(self, paths, criteria, distinct, limit, offset): # FIXME: update libpreludedb to perform this automatically? # # This allow get_values() without explicit path or criteria, like # env.dataprovider.query(["count(1)"], type="alert"), to work: if not criteria and not env.dataprovider.guess_datatype(paths, default=None): criteria = "%s.messageid" % self.type return IDMEFQueryResults(self._db.getValues(paths, criteria, distinct, limit, offset)) @usergroup.permissions_required(["IDMEF_ALTER"]) def delete(self, criteria, paths): self._db.remove(criteria) class IDMEFAlertPlugin(_IDMEFPlugin): type = "alert" plugin_name = "IDMEF Alert Plugin" plugin_description = N_("Plugin for fetching IDMEF alerts from the Prelude database") @property def _get_object(self): return self._db.getAlert @property def _get_idents(self): return self._db.getAlertIdents class IDMEFHeartbeatPlugin(_IDMEFPlugin): type = "heartbeat" plugin_name = "IDMEF Heartbeat Plugin" plugin_description = N_("Plugin for fetching IDMEF heartbeats from the Prelude database") @property def _get_object(self): return self._db.getHeartbeat @property def _get_idents(self): return self._db.getHeartbeatIdents prewikka-5.1.1/prewikka/dataprovider/plugins/__init__.py0000664000175000017500000000000013555143652025031 0ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/dataprovider/__init__.py0000664000175000017500000006257513555143652023401 0ustar tandrejatandreja00000000000000# Copyright (C) 2016-2019 CS-SI. All Rights Reserved. # Author: Abdel Elmili # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from __future__ import absolute_import, division, print_function, unicode_literals import copy import itertools import time from datetime import datetime, timedelta from enum import Enum from prewikka import compat, error, hookmanager, pluginmanager from prewikka.utils import AttrObj, CachingIterator, json from prewikka.utils.timeutil import parser, tzutc OPERATORS = { "=": N_("Equal"), "=*": N_("Equal (case-insensitive)"), "!=": N_("Not equal"), "!=*": N_("Not equal (case-insensitive)"), "~": N_("Regular expression"), "~*": N_("Regular expression (case-insensitive)"), "!~": N_("Not regular expression"), "!~*": N_("Not regular expression (case-insensitive)"), "<": N_("Lesser than"), "<=": N_("Lesser or equal"), ">": N_("Greater than"), ">=": N_("Greater or equal"), "<>": N_("Substring"), "<>*": N_("Substring (case-insensitive)"), "!<>": N_("Not substring"), "!<>*": N_("Not substring (case-insensitive)") } COMPOSITE_TIME_FIELD = "_time_field" def PathInfo(path, value_type, operators=[], value_accept=[], type=None): assert(operators or type) if not operators: base = env.dataprovider._type_handlers[type] operators = base.get_operator_by_datatype(value_type, default=base.get_operator_by_datatype(None, default=[])) return AttrObj(path=path, field=".".join(path.split(".")[1:]), type=value_type, operators=operators, value_accept=value_accept) def PathValue(value, label=None, color=None): return AttrObj(value=value, label=label or value, color=color) def _str_to_datetime(date): if date.isdigit(): return datetime.utcfromtimestamp(int(date)) return parser.parse(date) _DATETIME_CONVERTERS = { int: datetime.utcfromtimestamp, float: datetime.utcfromtimestamp, text_type: _str_to_datetime, datetime: lambda x: x, type(None): lambda x: x } _sentinel = object() def to_datetime(date): try: dt = _DATETIME_CONVERTERS[type(date)](date) except KeyError: raise error.PrewikkaUserError(N_("Conversion error"), N_("Value %(value)r cannot be converted to %(type)s", {"value": date, "type": "datetime"})) if dt is not None and dt.tzinfo is None: # Make the datetime timezone-aware return dt.replace(tzinfo=tzutc()) return dt class DataProviderError(Exception): pass class NoBackendError(error.PrewikkaUserError): def __init__(self, type_): error.PrewikkaUserError.__init__( self, N_("Backend error"), N_("No backend available for '%s' datatype", type_) ) class InvalidPathError(error.PrewikkaUserError): def __init__(self, path, details=None): error.PrewikkaUserError.__init__( self, N_("Syntax error"), N_("Unknown path: %s", path), details=details ) class ParserError(error.PrewikkaUserError): def __init__(self, details=None): error.PrewikkaUserError.__init__( self, N_("Syntax error"), N_("Could not parse input"), details=details ) class ItemNotFoundError(error.PrewikkaUserError): pass class QueryResultsRow(CachingIterator): __slots__ = ("_parent") def __init__(self, parent, items): CachingIterator.__init__(self, items) self._parent = parent def _get_current_path_type(self): return self._parent._paths_types[len(self._cache)] def _get_current_path(self): return self._parent._paths[len(self._cache)] def _cast(self, value): type = self._get_current_path_type() try: if type is datetime: return to_datetime(value) elif type is timedelta: return timedelta(seconds=int(value)) elif type is object: return value return type(value) except (KeyError, ValueError): raise error.PrewikkaUserError(N_("Conversion error"), N_("Value %(value)r cannot be converted to %(type)s", {"value": value, "type": type})) def preprocess_value(self, value): if value is None: return None if self._parent._paths_types: value = self._cast(value) cont = [self._get_current_path(), value] list(hookmanager.trigger("HOOK_DATAPROVIDER_VALUE_READ", cont)) return cont[1] class QueryResults(CachingIterator): __slots__ = ("_paths", "_paths_types", "duration") def preprocess_value(self, value): return QueryResultsRow(self, value) class ResultObject(object): def __init__(self, obj, curpath=None): self._obj = obj self._curpath = curpath or [] def preprocess_value(self, value): return value @property def path(self): return ".".join(self._curpath) def _wrapobj(self, obj, curpath): if isinstance(obj, type(self._obj)): return self.__class__(obj, curpath) elif isinstance(obj, tuple): return CachingIterator((self._wrapobj(v, curpath[:-1] + ["%s(%d)" % (curpath[-1], i)]) for i, v in enumerate(obj))) return obj def get(self, key, default=None): value = self._obj.get(key) if value is None: return default curpath = self._curpath + [key] cont = [".".join(curpath), self.preprocess_value(value)] list(hookmanager.trigger("HOOK_DATAPROVIDER_VALUE_READ", cont)) return self._wrapobj(cont[1], curpath) def __getattr__(self, x): return self.__dict__.get(x, getattr(self._obj, x)) def __getitem__(self, key, default=None): return self.get(key, default) class DataProviderInstance(pluginmanager.PluginBase): type = None TYPE_OPERATOR_MAPPING = {} def get_values(self, paths, criteria, distinct, limit, offset): """ Retrieves data corresponding to the given paths. If criteria are given, only values matching these criteria will be retrieved. @param paths: Selected paths @type paths: list @param criteria: Search criteria @type criteria: list @param distinct: Control whether duplicate entries should be removed (True) or kept (False) @type distinct: bool @param limit: Maximum number of rows to retrieve. Note: the actual result may contain fewer entries @type limit: int @param offset: Number of entries to skip before retrieving matching rows @type offset: int @return: A result set containing the values matching the various criteria @rtype QueryResults """ raise error.NotImplementedError def get_by_id(self, id_): """Retrieve a root object by its ID.""" raise error.NotImplementedError def get(self, criteria, order_by, limit, offset): """Retrieve root objects matching the given criteria.""" raise error.NotImplementedError def delete(self, criteria, paths): """Delete objects (or, if a root path is given, subobjects) matching the given criteria.""" raise error.NotImplementedError def insert(self, data, criteria): """Insert a root object, or, if criteria are given, a subobject.""" raise error.NotImplementedError def update(self, data, criteria): """Update root objects matching the given criteria.""" raise error.NotImplementedError def get_properties(self): pass def _get_path_values(self, path): pass class DataProviderBackend(pluginmanager.PluginBase): _instances = {} _default_instance = None def __init__(self): pluginmanager.PluginBase.__init__(self) self._default_instance = DataProviderInstance() def post_load(self): pass def __getattr__(self, attr): return getattr(self._default_instance, attr) class DataProviderBase(pluginmanager.PluginBase): dataprovider_type = None dataprovider_label = None dataprovider_continuous = False TYPE_OPERATOR_MAPPING = {} def __init__(self, time_field): pluginmanager.PluginBase.__init__(self) if isinstance(time_field, tuple): self._time_field = COMPOSITE_TIME_FIELD self._start_time_field, self._end_time_field = time_field else: self._time_field = time_field self._start_time_field, self._end_time_field = time_field, time_field def post_load(self): pass def get_common_paths(self, index=False): return [] def format_path(self, path): return path.format( backend=self.dataprovider_type, time_field=self._time_field, start_time_field=self._start_time_field, end_time_field=self._end_time_field ) def format_paths(self, paths): return [self.format_path(path) for path in paths] def parse_paths(self, paths): """ Parse paths and turn them into a structure that can be used by the backend. @param paths: List of paths in natural syntax (eg. ["foo.bar", "count(foo.id)"]) @type paths: list @param type: type of backend @type type: string @return: The paths as a structure that can easily be used by the backend. """ return paths, [] def compile_criterion(self, criterion): return criterion def compile_criteria(self, criteria): return criteria def get_paths(self): raise error.NotImplementedError def get_path_type(self, path): raise error.NotImplementedError def register_path(self, path, type): raise error.NotImplementedError def get_path_info(self, path): return PathInfo(path, env.dataprovider.get_path_type(path), value_accept=self._get_path_values(path), type=self.dataprovider_type) # The following methods might be implemented by the backend or by the type itself. def _get_path_values(self, path): backend = env.dataprovider._backends.get(self.dataprovider_type) if backend: return backend._get_path_values(path) def get_properties(self): backend = env.dataprovider._backends.get(self.dataprovider_type) if backend: return backend.get_properties() def get_operator_by_datatype(self, datatype, default=None): mapping = None if self.dataprovider_type in env.dataprovider._backends: mapping = env.dataprovider._backends[self.dataprovider_type].TYPE_OPERATOR_MAPPING if not mapping: mapping = self.TYPE_OPERATOR_MAPPING return mapping.get(datatype, default) def get_indexation_path(self, path): raise error.NotImplementedError class _CriterionOperatorFamily(Enum): BOOLEAN = 0 STANDARD = 1 REGEX = 2 SUBSTRING = 3 # ["String1", StringN, "ENUM_VALUE"], Family, Negated, Case-Insensitive _CriterionOperatorList = [ (["&&", "AND"], _CriterionOperatorFamily.BOOLEAN, False, False), (["||", "OR"], _CriterionOperatorFamily.BOOLEAN, False, False), (["!", "NOT"], _CriterionOperatorFamily.BOOLEAN, True, False), # STANDARD (["=", "==", "EQUAL"], _CriterionOperatorFamily.STANDARD, False, False), (["=*", "EQUAL_NOCASE"], _CriterionOperatorFamily.STANDARD, False, True), (["!=", "NOT_EQUAL"], _CriterionOperatorFamily.STANDARD, True, False), (["!=*", "NOT_EQUAL_NOCASE"], _CriterionOperatorFamily.STANDARD, True, True), (["<", "LOWER"], _CriterionOperatorFamily.STANDARD, False, False), ([">", "GREATER"], _CriterionOperatorFamily.STANDARD, False, False), (["<=", "LOWER_OR_EQUAL"], _CriterionOperatorFamily.STANDARD, False, False), ([">=", "GREATER_OR_EQUAL"], _CriterionOperatorFamily.STANDARD, False, False), # REGEX (["~", "REGEX"], _CriterionOperatorFamily.REGEX, False, False), (["!~", "NOT_REGEX"], _CriterionOperatorFamily.REGEX, True, False), (["~*", "REGEX_NOCASE"], _CriterionOperatorFamily.REGEX, False, True), (["!~*", "NOT_REGEX_NOCASE"], _CriterionOperatorFamily.REGEX, True, True), # SUBSTRING (["<>", "SUBSTR"], _CriterionOperatorFamily.SUBSTRING, False, False), (["!<>", "NOT_SUBSTR"], _CriterionOperatorFamily.SUBSTRING, True, False), (["<>*", "SUBSTR_NOCASE"], _CriterionOperatorFamily.SUBSTRING, False, True), (["!<>*", "NOT_SUBSTR_NOCASE"], _CriterionOperatorFamily.SUBSTRING, True, True), ] class _CriterionEnum(Enum): @property def family(self): return _CriterionOperatorList[self.value][1] @property def negated(self): return _CriterionOperatorList[self.value][2] @property def case_insensitive(self): return _CriterionOperatorList[self.value][3] @property def is_regex(self): return self.family is _CriterionOperatorFamily.REGEX @property def is_boolean(self): return self.family is _CriterionOperatorFamily.BOOLEAN @property def is_substring(self): return self.family is _CriterionOperatorFamily.SUBSTRING def __json__(self): return self.name CriterionOperator = _CriterionEnum( value="CriterionOperator", names=itertools.chain.from_iterable( itertools.product(v[0], [k]) for k, v in enumerate(_CriterionOperatorList) ) ) class Criterion(json.JSONObject): def _init(self, left, operator, right): self.left, self.operator, self.right = left, operator, right def __init__(self, left=None, operator=None, right=None): json.JSONObject.__init__(self) if isinstance(operator, text_type): operator = CriterionOperator[operator] self._init(left, operator, right) def get_paths(self): res = set() if not self: return res if not self.operator.is_boolean: res.add(self.left) else: if self.left: res |= self.left.get_paths() res |= self.right.get_paths() return res def _compile(self, base, format_only=False): if not self: return copy.copy(self) if self.operator.is_boolean: left = self.left._compile(base, format_only) if self.left else None return Criterion(left, self.operator, self.right._compile(base, format_only)) left = base.format_path(self.left) if format_only: return Criterion(left, self.operator, self.right) tpl = [left, self.right] list(hookmanager.trigger("HOOK_DATAPROVIDER_VALUE_WRITE", tpl)) return base.compile_criterion(Criterion(tpl[0], self.operator, tpl[1])) @staticmethod def _value_escape(value): if isinstance(value, (int, float)): return value if isinstance(value, timedelta): return int(value.total_seconds()) if not isinstance(value, compat.STRING_TYPES): value = text_type(value) return "'%s'" % value.replace("\\", "\\\\").replace("'", "\\'") def _criterion_to_string(self, path, operator, value): if value is None: if operator == CriterionOperator.EQUAL: return "!%s" % (path) if operator == CriterionOperator.NOT_EQUAL: return path return "%s %s %s" % (path, operator.name, self._value_escape(value)) def to_string(self, noroot=False, _depth=0): if not self: return "" if self.operator.is_boolean: if self.operator == CriterionOperator.NOT: res = "!%s" % self.right.to_string(noroot, _depth + 1) else: res = " ".join((self.left.to_string(noroot, _depth + 1), self.operator.name, self.right.to_string(noroot, _depth + 1))) return res if _depth == 0 else "(%s)" % res lst = [self.left, self.operator, self.right] if noroot: lst[0] = lst[0].split(".", 1)[-1] return self._criterion_to_string(*lst) def to_list(self, type=None): if not self: return [] if self.operator.is_boolean: return (self.left.to_list(type) if self.left else []) + self.right.to_list(type) return [self] def flatten(self): if not self or not self.operator.is_boolean: return self ret = AttrObj(operator=self.operator, operands=[]) for operand in (self.left.flatten(), self.right.flatten()): if operand.operator == self.operator: ret.operands += operand.operands else: ret.operands.append(operand) return ret def compile(self, type): base = env.dataprovider._type_handlers[type] return base.compile_criteria(self._compile(base)) def format(self, type): return self._compile(env.dataprovider._type_handlers[type], format_only=True) def _apply_self(self, operator, other): if not other: return self if self: self._init(copy.copy(self), operator, other) else: self._init(other.left, other.operator, other.right) return self def _apply_new(self, operator, other): if not other: return self elif not self: return other return Criterion(self, operator, other) def __str__(self): return self.to_string() def __bool__(self): return self.operator is not None def __copy__(self): return Criterion(self.left, self.operator, self.right) def __json__(self): return {"left": self.left, "operator": self.operator, "right": self.right} def __iadd__(self, other): return self._apply_self(CriterionOperator.AND, other) def __ior__(self, other): return self._apply_self(CriterionOperator.OR, other) def __iand__(self, other): return self._apply_self(CriterionOperator.AND, other) def __add__(self, other): return self._apply_new(CriterionOperator.AND, other) def __or__(self, other): return self._apply_new(CriterionOperator.OR, other) __and__ = __add__ __nonzero__ = __bool__ class DataProviderManager(pluginmanager.PluginManager): def __init__(self, autoupdate=False): pluginmanager.PluginManager.__init__(self, "prewikka.dataprovider.type", autoupdate=autoupdate) self._type_handlers = {} self._backends = {} def load(self, autoupdate=False): for k in self.keys(): try: p = self.initialize_plugin(self[k]) except Exception: continue p.dataprovider_type = k self._type_handlers[k] = p for plugin in pluginmanager.PluginManager("prewikka.dataprovider.backend", autoupdate=autoupdate): if plugin.type not in self._type_handlers: plugin.error = N_("No handler configured for '%s' datatype", plugin.type) env.log.warning("%s: plugin loading failed: %s" % (plugin.__name__, plugin.error)) continue try: p = self.initialize_plugin(plugin) except Exception: continue if p.type in self._backends: raise error.PrewikkaUserError(N_("Configuration error"), N_("Only one manager should be configured for '%s' backend", p.type)) self._backends[p.type] = p for p in self._type_handlers.values(): p.post_load() for p in self._backends.values(): p.post_load() @staticmethod def _parse_path(path): tmp = path.partition('.') if not tmp[1]: return tmp = tmp[0].rpartition('(')[2] # Exclude generic paths, eg. "{backend}.{time_field}". if tmp != '{backend}': return tmp def guess_datatype(self, paths, criteria=Criterion(), default=_sentinel): res = set() for path in set(paths) | criteria.get_paths(): path = self._parse_path(path) if path: res.add(path) if len(res) != 1: if default is not _sentinel: return default raise DataProviderError("Unable to guess data type: incompatible paths") return list(res)[0] def check_datatype(self, type, *args, **kwargs): if not type: type = self.guess_datatype(*args) if type not in self._type_handlers or (kwargs.get("require_backend", True) and type not in self._backends): raise NoBackendError(type) return type def _normalize(self, type, paths=None, criteria=None): if paths is None: paths = [] if criteria is None: criteria = Criterion() else: criteria = copy.copy(criteria) type = self.check_datatype(type, paths, criteria) parsed_paths = paths paths_types = [] plugin = self._type_handlers[type] paths = plugin.format_paths(paths) parsed_paths, paths_types = plugin.parse_paths(paths) for c in filter(None, hookmanager.trigger("HOOK_DATAPROVIDER_CRITERIA_PREPARE", type)): criteria += c return AttrObj(type=type, paths=paths, parsed_paths=parsed_paths, paths_types=paths_types, criteria=criteria.compile(type)) def query(self, paths, criteria=None, distinct=False, limit=-1, offset=0, type=None, **kwargs): o = self._normalize(type, paths, criteria) start = time.time() results = self._backends[o.type].get_values(o.parsed_paths, o.criteria, distinct, limit, offset, **kwargs) results.duration = time.time() - start results._paths = o.paths results._paths_types = o.paths_types return results def get_by_id(self, type, id_): return self._backends[type].get_by_id(id_) def get(self, criteria=None, order_by=["{backend}.{time_field}/order_desc"], limit=-1, offset=0, type=None): o = self._normalize(type, order_by, criteria) return self._backends[o.type].get(o.criteria, o.paths, limit, offset) def delete(self, criteria=None, paths=None, type=None): o = self._normalize(type, paths, criteria) return self._backends[o.type].delete(o.criteria, o.parsed_paths) @staticmethod def _resolve_values(paths, values): for tpl in zip(paths, values): tpl = list(tpl) list(hookmanager.trigger("HOOK_DATAPROVIDER_VALUE_WRITE", tpl)) yield tpl def insert(self, data, criteria=None, type=None): paths = data.keys() o = self._normalize(type, paths, criteria) return self._backends[o.type].insert(self._resolve_values(o.parsed_paths, data.values()), o.criteria) def update(self, data, criteria=None, type=None): paths = data.keys() o = self._normalize(type, paths, criteria) return self._backends[o.type].update(self._resolve_values(o.parsed_paths, data.values()), o.criteria) def get_types(self, public=False, require_backend=True): for k, v in self._type_handlers.items(): if require_backend and k not in self._backends: continue if (not public) or v.dataprovider_label: yield k def has_type(self, wanted_type): return wanted_type in self._backends def get_properties(self, type): return self._type_handlers[type].get_properties() def get_label(self, type): return self._type_handlers[type].dataprovider_label def format_path(self, path, type=None): if not type: type = self.guess_datatype([path]) return self._type_handlers[type].format_path(path) def register_path(self, path, path_type, type=None): if not type: type = self.guess_datatype([path]) return self._type_handlers[type].register_path(path, path_type) def get_paths(self, type): return self._type_handlers[type].get_paths() def get_common_paths(self, type, index=False): return self._type_handlers[type].get_common_paths(index) def get_path_info(self, path, type=None): type = self.check_datatype(type, [path], require_backend=False) return self._type_handlers[type].get_path_info(path) def get_path_type(self, path, type=None): type = self.check_datatype(type, [path], require_backend=False) return self._type_handlers[type].get_path_type(path) def get_operator_by_datatype(self, type, datatype, default=None): return self._type_handlers[type].get_operator_by_datatype(datatype, default=None) def get_indexation_path(self, path): type = self.guess_datatype([path]) return self._type_handlers[type].get_indexation_path(path) def is_continuous(self, type): # Whether data can be interpolated (e.g. for metric-type dataproviders) return self._type_handlers[type].dataprovider_continuous prewikka-5.1.1/prewikka/dataprovider/idmef.py0000664000175000017500000001640513555143652022715 0ustar tandrejatandreja00000000000000# Copyright (C) 2016-2019 CS-SI. All Rights Reserved. # Author: Abdel ELMILI from __future__ import absolute_import, division, print_function, unicode_literals import datetime import prelude from prewikka import crontab, renderer, utils, version from prewikka.dataprovider import DataProviderBase, Criterion, CriterionOperator, ParserError, PathValue, InvalidPathError class _IDMEFPath(prelude.IDMEFPath): def __init__(self, path): try: prelude.IDMEFPath.__init__(self, path) except RuntimeError as e: raise InvalidPathError(path, details=e) class _IDMEFCriterion(prelude.IDMEFCriteria): def __init__(self, criteria): try: prelude.IDMEFCriteria.__init__(self, criteria) except RuntimeError as e: raise ParserError(details=e) class _IDMEFProvider(DataProviderBase): plugin_version = version.__version__ plugin_author = version.__author__ plugin_license = version.__license__ plugin_copyright = version.__copyright__ TYPE_OPERATOR_MAPPING = { text_type: ("=", "=*", "!=", "!=*", "~", "~*", "!~", "!~*", "<>", "<>*", "!<>", "!<>*"), bytes: ("=", "!=", "<>", "!<>", "<", ">", "<=", ">="), None: ("=", "!=", "<", ">", "<=", ">=") } def __init__(self): DataProviderBase.__init__(self, "create_time") def get_path_type(self, path): _typemap = { prelude.IDMEFValue.TYPE_DATA: bytes, prelude.IDMEFValue.TYPE_STRING: text_type, prelude.IDMEFValue.TYPE_TIME: datetime.datetime, prelude.IDMEFValue.TYPE_FLOAT: float, prelude.IDMEFValue.TYPE_DOUBLE: float, prelude.IDMEFValue.TYPE_ENUM: text_type, prelude.IDMEFValue.TYPE_INT8: int, prelude.IDMEFValue.TYPE_UINT8: int, prelude.IDMEFValue.TYPE_INT16: int, prelude.IDMEFValue.TYPE_UINT16: int, prelude.IDMEFValue.TYPE_INT32: int, prelude.IDMEFValue.TYPE_UINT32: int, prelude.IDMEFValue.TYPE_INT64: int, prelude.IDMEFValue.TYPE_UINT64: int, prelude.IDMEFValue.TYPE_CLASS: object, } return _typemap[prelude.IDMEFClass(path).getValueType()] def _get_paths(self, rootcl): for node in rootcl: if node.getValueType() == prelude.IDMEFValue.TYPE_CLASS: for subnode in self._get_paths(node): yield subnode else: yield node.getPath() @staticmethod def _value_adjust(operator, value): if not operator.is_substring: return value value = text_type(value) has_wildcard = utils.find_unescaped_characters(value, ["*"]) if has_wildcard: return value return "*%s*" % value @staticmethod def _path_adjust(path): """ Automatically add indexes to IDMEF listed fields FIXME: to be removed when libpreludedb supports != for listed fields """ fields = [] for elem in path.replace("(*)", "").split("."): p = ".".join(fields + [elem]) if elem == "analyzer": fields.append("%s(-1)" % elem) elif _IDMEFPath(p).isAmbiguous(): fields.append("%s(0)" % elem) else: fields.append(elem) return ".".join(fields) def compile_criterion(self, criterion): if criterion.right: criterion.right = self._value_adjust(criterion.operator, criterion.right) elif criterion.operator == CriterionOperator.EQUAL: criterion = Criterion(criterion.left, "==", None) if _IDMEFPath(criterion.left).getValueType() == prelude.IDMEFValue.TYPE_STRING: criterion |= Criterion(criterion.left, "==", "''") if criterion.operator.negated and _IDMEFPath(criterion.left).isAmbiguous(): criterion.left = self._path_adjust(criterion.left) return DataProviderBase.compile_criterion(self, criterion) def compile_criteria(self, criteria): if criteria: return _IDMEFCriterion(criteria.to_string()) def _get_path_values(self, path): klass = prelude.IDMEFClass(path) if path == "alert.assessment.impact.severity": return [ PathValue("high", label=N_("High"), color=renderer.RED_STD), PathValue("medium", label=N_("Medium"), color=renderer.ORANGE_STD), PathValue("low", label=N_("Low"), color=renderer.GREEN_STD), PathValue("info", label=N_("Informational"), color=renderer.BLUE_STD), ] elif klass.getValueType() == prelude.IDMEFValue.TYPE_ENUM: return [PathValue(v) for v in klass.getEnumValues()] else: return None class IDMEFAlertProvider(_IDMEFProvider): plugin_name = "IDMEF Alert provider" plugin_description = N_("Provides an API to fetch IDMEF alerts") dataprovider_label = N_("Alerts") def get_paths(self): return self._get_paths(prelude.IDMEFClass("alert")) def get_common_paths(self, index=False): return [ (N_("Classification"), "alert.classification.text"), (N_("Source IP"), "alert.source(0).node.address(0).address" if index else "alert.source.node.address.address"), (N_("Source port"), "alert.source(0).service.port" if index else "alert.source.service.port"), (N_("Target IP"), "alert.target(0).node.address(0).address" if index else "alert.target.node.address.address"), (N_("Target port"), "alert.target(0).service.port" if index else "alert.target.service.port"), (N_("Analyzer name"), "alert.analyzer(-1).name" if index else "alert.analyzer.name") ] @crontab.schedule("alert", N_("Alert deletion"), "0 0 * * *", enabled=False) def _alert_cron(self, job): config = env.config.cron.get_instance_by_name("alert") if config is None: return criteria = Criterion() age = int(config.get("age", 0)) now = utils.timeutil.utcnow() for severity in ("info", "low", "medium", "high"): days = int(config.get(severity, age)) if days < 1: continue criteria |= (Criterion("alert.assessment.impact.severity", "==", severity) & Criterion("alert.create_time", "<", now - datetime.timedelta(days=days))) if not criteria: return env.dataprovider.delete(criteria, type="alert") class IDMEFHeartbeatProvider(_IDMEFProvider): plugin_name = "IDMEF Heartbeat provider" plugin_description = N_("Provides an API to fetch IDMEF heartbeats") dataprovider_label = N_("Heartbeats") def get_paths(self): return self._get_paths(prelude.IDMEFClass("heartbeat")) @crontab.schedule("heartbeat", N_("Heartbeat deletion"), "0 0 * * *", enabled=False) def _heartbeat_cron(self, job): config = env.config.cron.get_instance_by_name("heartbeat") if config is None: return days = int(config.get("age", 0)) if days < 1: return criteria = Criterion("heartbeat.create_time", "<", utils.timeutil.utcnow() - datetime.timedelta(days=days)) env.dataprovider.delete(criteria, type="heartbeat") prewikka-5.1.1/prewikka/htdocs/0000775000175000017500000000000013555143705020050 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/htdocs/css/0000775000175000017500000000000013555143705020640 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/htdocs/css/images/0000775000175000017500000000000013555143705022105 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/htdocs/css/images/ui-bg_glass_55_fbf9ee_1x400.png0000664000175000017500000000051713555143652027400 0ustar tandrejatandreja00000000000000PNG  IHDRAbKGD X pHYsHHFk>IDATH! AblA1{VY0ixxvDK_O9 aՔ}^JaȌ0bvBA$,Q"_44=SqcyEIW IDAT(ch`ph4i%tEXtdate:create2017-03-16T23:57:46+00:00@ta%tEXtdate:modify2017-03-16T23:57:46+00:001)٥IENDB`prewikka-5.1.1/prewikka/htdocs/css/images/ui-bg_glass_75_dadada_1x400.png0000664000175000017500000000040613555143652027435 0ustar tandrejatandreja00000000000000PNG  IHDRDbKGD1 pHYsHHFk>HIDAT8cxa"[n{1qcpo"? 3}`xR1s?^^bxuu)뉣hW%R|%tEXtdate:create2017-03-16T23:57:47+00:00j%tEXtdate:modify2017-03-16T23:57:47+00:00^IENDB`prewikka-5.1.1/prewikka/htdocs/css/images/ui-bg_glass_75_e6e6e6_1x400.png0000664000175000017500000000040613555143652027237 0ustar tandrejatandreja00000000000000PNG  IHDRDbKGD1 pHYsHHFk>HIDAT8cx0Fѳg ύax1e&ë8! obަ2fx#3ǵ >QD @$.5o%tEXtdate:create2017-03-16T23:57:46+00:00@ta%tEXtdate:modify2017-03-16T23:57:46+00:001)٥IENDB`prewikka-5.1.1/prewikka/htdocs/css/images/ui-bg_glass_95_fef1ec_1x400.png0000664000175000017500000000051413555143652027372 0ustar tandrejatandreja00000000000000PNG  IHDRAbKGD X pHYsHHFk>IDATHϱ a\!VJ#XЋD} .f>>Pկxxqжuɚqf+6[\‡כWT4r6:]V:, (Ŵ8yG-(d H%tEXtdate:create2017-03-16T23:57:46+00:00@ta%tEXtdate:modify2017-03-16T23:57:46+00:001)٥IENDB`prewikka-5.1.1/prewikka/htdocs/css/images/ui-bg_highlight-soft_75_cccccc_1x100.png0000664000175000017500000000043013555143652031241 0ustar tandrejatandreja00000000000000PNG  IHDRd2bKGD1 pHYsHHFk>ZIDATcx|Nhã 2'IDATx{he}?g{1)]K&qqU4kbiKR(HBP(IvJ_ӮIV@nB5iNiGjq& ~A#QrX'9:ܫ{3E{=yo~3g~Mp& 1Xxh8<#dlЅMx1&$5 ~V c$ױ, ƹiN:Z ߊY>"BH!-Cu8t}8!B *OF.[aͲlB&1h>M]hN4MAb̐!(hE15jձcO<6e7,eS(fo16+3y JR|{^3^{88 ~' pxh8<4 g2n6e̘{QpӀPAiۺߖfS(D'L6=T:sfq羀l.cI ǧ=iM>ڠLN{U&&{uo..4~# pxh8<4 gÛp^i/0TWcQ @)yu}`LUc%Tȥ AR@?P-`BKl bZ}Ш͢uJ%U]K2e tsY@,ee豅rjcܭsMn0 AmPy DK(5,lN&bDmrwYDVte$謷 L[C0O P&0+; g3@ pxh8<4Y`OFZ!x#~ Gk @3K@:>PRMA|e]KgF.BtlOY d!(vVX%m#I[RR`2T HwYu=bYPEcU%&@Ĺ]}qo7*GL eQX5U-³8| _ݟ5\5pVH^\ Fآaa5l14[#boP1EiswMJ'5T06B|I,b`ՈPXkB$[-EOHt |3D(id9N6@x/ؠm(#wjPt/Zobq%[:3^~a55 |E닃^E$L-_s, ߫㕔Ņ& _,# F}&.<4 gOrdh9M7L(5꓂.?M(stզ-?:[ڧCr]'YB2lC| leXSpG0KcI~u L0/yLtrI?R%-wǷh$LJV ͿӢ ,g x_7l4* uM+@x<}ãq><#`i :=*ۿ{)_8hspCWғK`B]H"}_PNtQl1YQh+&?x5: ֘aYҭ=\En.YʸJE%uTj5F'b;[vט4u6]lkw3÷, : %& [|||Yiq`:qXc2+u|~/wrz[j-I># ,9Q:#,25@@%S@@6ÅJ{6{)hW~q]t<+|'0Oa 63UHWl;'Z9Z\oO嵁eeƢ[odarEm&ʧ3m6=g^Sx Hjmi(v ۈ{.h_%8nF7y{OFS5:/աWPH+bGx/9IYy.MtTeە,ѿ- Red ;Ә:9kT5mEG|\Wuǣ@^LE 4 gy ; J'U䐎N׷< p2mӫ.ZZ5< V ,p3w=~3jǿě#ʭ|Sfyk=Cn 1]C'I_O*,J՞D\\I}E\$M(E\߮?ƫw NJEb6tz:-?Bp ?XJ $xQJ}!#Ո2Ht!VɽV\'Y366YuJOAa[5e]p9=7t_y?OS_iT<͛32N묳}jHQ RTȢ nfݮ~+ciQ < Ma=|* $@'ԌǕqUO;5~@eI29w" O~ssk{‰$m>v z^2vow` a4cM Cb>q:o=-p`_2 ng:6KXV,2Ǿ6 g3@ śsaR WWB g-N;F[ՒaAVLF<-m VbMC 7K)XPy s~=<ܒ{x!=ÃqRl]/ 0l)'}#^tX孋t8FCY$)PUBE(~ҞV2^*SLHlS'IA[ Zx-V"ȥJ+ \|5uWnLJkܟ(00JyꞄafg6 g3@Ñg[}ZQk?ҳ=zI$ Т:9FWmx:\(W+eF9,*!GhDL8[vo)AaK5S/)^c(WHNW8Tr=opp]MCO?* D΢Ob/hs0ڜb91C9-oۿԗuQFc|W%@HB29/DxD`U:Ƈgi"`%ᄽ t E`t62k)PEѿO,?k_yh(/=@u g3@v@]<]~WD`.f~oʈNVA߈եM ^yMQ|ߛ^-{o~>wЃ (gXץi&X uDU͕l  ғޥߞkPHHCJ~S@O ׋ѓy7 k {25ofϫo{'!'Z%q*)gC\#\'0 P_WL7&AlJ\ Zp, Yxjc O(6zIV u:גTDO9ׄQ<*y =2~/?J,WJQW>Wu?#G/4"K{㧏',Iҟ综E;|Rݠ~W7i86 pxh8<4 r<}8 kGo;uCPv)A<$ց;{l #`FC!f Ӆ/`7(0R!99z@%!/m]AdhvG3@ pxh8<4{P/ 3@} B&^16{. ߠaQo 2lmt!\%@X?5ճa~ ʠM65wka)TF_ 2$x5_9!VxRd1!}'`$Uԇr? Q `7`.k_VzԄp]]GOLXCk3%tEXtdate:create2016-07-13T10:21:59+00:00%tEXtdate:modify2016-07-13T09:26:54+00:00͠tEXtSoftwareAdobe ImageReadyqe<IENDB`prewikka-5.1.1/prewikka/htdocs/css/images/ui-icons_2e83ff_256x240.png0000664000175000017500000001070513555143652026434 0ustar tandrejatandreja00000000000000PNG  IHDRIJPLTE..........................................................................................oYtRNS3P/"Uq@f`2 !<BHK Z#'1S,4j8E|)Q$ bJmߜGc?oh@^bKGDH pHYsHHFk>dIDATx] c۶H阒]Kd%٫뺮lmw]|pXm-}X:+iĆQV9\e'AtOS:72YsxMہB&z>nC@r@*aӝ%MFDDDDDDTߖH,ERUn ب\f͹:}4ᦋ{)n[ ̰E K Y Dۇ- +Kl=ӃL`љ|%n a N#5 (4?EDDDD\oWFfq;\E_,W!%zE!F¶. (USHQ0dw)T 8#p,xBK *xXEe K솎%mKX~sFE~tdcaI1Af4dHcGSB`0wev`"{ .GDDDD,dO6k"qkMefS_UKŌ&g~>n H}) LF%8()r![4统qQk0m[Le_70@>1 X0AZVcEV Ltk3EJ44ZﮊN`rt>`˥  AHBLH@cUq=jcM2sJCLiR NQ0=Yi-|4V ]]B^ޞ_H$<$ a=d@ (ZAp_}~s:N{DC>m^ƒS&, ;N&B} <_AB]HuN(B0{h1IKDs j' M8.ӫ1h3df}mq nU{Lo z \=?@ ((e|=ơ麄Ci1r<|OO; `HpQyzԈuZVƲ!)5mC2Lyg;֑RjWa@@VL&Wru=Z ̥=U5} 7;b(nP&sk48ͥ01U Wvk18dqTՌE]qH8 GF K'rOrŗ6"fpT^3c"nMم-/W=tJ,X){P Rm|K>mX8v5h<_{ꘀYF|&_G;&>^W⁃&K(81EB@F&;"L'wfwE-6o&/̫'Xe,>~ee|A=) dQ`}P[KN˂/~)O[dO=3El5'Y$?7mTzզ.\.` WE"""""v)V#]L;zqJr²[\-tҽ5 @ͷϟnT@+;cQhC*TڙAVr?f? Q1T`} Hk,{VZˋTϛ?I̯uQKLMe͆~qym09 S;j5 iQ]7k0UޭGkX3#lY_Цxj޶9`# M [z KuO_z˿Dܭ*kOJ(7n\e ITƨl/U߶uw.~;#r.8 o# 5Lh>1i pVM?/u70 X@L+M+{Fkt{ŧ890`. ĀCR+\/t R; TӲ]aL|efđ >ۣG|P`P8C1K՛A̍<2ۂKrl@L L 8@E>`nPNԍ,p EƆZF lÎ; F7Ȯ; swSz)g7{rsSgȋ(߄~AWytX$NVR_<6p.O8O[OdDk>_OO}JSdmV?W(_m j~=H IԁF>T/{*]IGJ@iqamNF|Q50+ ES8:v`p~vj:Bp96oys% |@H]+@t]Wk}}7FʮrAB\m-_2PY8xՎN.h~@+7z5t_//?0S>)zi0n/B`{DW#`Bo[,gFVЁpP߾C]Bz ,XXfԃA:H k7dZ9oc}o]0vd:R]0ve]刈jу| ? +(OǍ+ #ysߍnpFru<.HȺotM3h}߆P}˗vP}mǀ?WZ@}@@FDl%tEXtdate:create2016-07-13T10:21:59+00:00%tEXtdate:modify2016-07-13T09:26:54+00:00͠tEXtSoftwareAdobe ImageReadyqe<IENDB`prewikka-5.1.1/prewikka/htdocs/css/images/ui-icons_454545_256x240.png0000664000175000017500000001552013555143652026211 0ustar tandrejatandreja00000000000000PNG  IHDREr@bKGDE;- pHYsHHFk>mIDATx{leG}?gK$U!>T؈Ji6A"VR%;"*UP) /zRJFQP zBQHVU5sμ9^3ߕ{~7s7<.` cAb/@[VD03AX90N_B &>~> c;abDߎEQz'kMayԉ 6!:u::@RŤByDD'L-f]Sq!f SQ&S7MCr==3dJ{fZS0Ms:0K٦gʿ&HU=mc4i?UĔGU4hcQb]!hLW/  @pxh8~|AQf?ێ1f¸=uQGJHpPϠIw״m췥ԧ>2"WÓP&{nT:sfqH@.cI ~Ss+^|Bn29 dH]v-ˌ-meh>q&تg 9x#cn~!pxh84^/ o #Z@S^4 KZKPd9C@F[,a+]8vKqHlw9ק84KBץ|&#[\C`R!:F zC6)AT1wU.Iҗ!4ig3wE:q7n0uAmPy TK(5ͬlNæbTrwDV]te47 L[C0P&0++  @pxh84Y`OEZj,*-E)e{U, \uoV: `omKet_WOdW3Z Քrv|~^g`jycp*fb]M59.LNq+%ۯ0vccJEM5kk#I<x_ I#0Dw4xh84^/ ^c drDM{wQte{^`br./M:0գ*z`]|SB(e)h͎/Vܮ"aO!o ,u^Љ^=zt`WeCCM Qϱo0q%Uo?<@6HG/uAQ-_u||ִ*2lٍuG@ j !Br qL!*)h.V{3-!w$dP*/P[ t1l3hlyp0bgL} 3$%\/.)TwQ"uK7d+2! @pxh84'aY$mf6lB'.D Рx7SxtIe We}d0RW^ݢ0](U݋Tx|T|@v^Df׹Lb(2H0n8;_QO}D&3{YWw5*e˗?̖G :H iZӖ)/MP(:!/|B[i:Gf L`~:z$aa^ʭ|P- kbݞ<ەL&xJAABȼHvᑢ[ySəwNJuy %pw0_a"zx 3i1|= @%JWAm\ lXm9+()S orro*E`Z1&=ޗg!Rt<bfa?qh'y'ry#\& o+Ԫ|Y%_Hp"k1*ɫU[&x9xAsmfe<_7;y6mi :[)EB7̰8fCH`⾿h)}(%m'& ;(ݚ!{:^R@NKү"*<V敡=oh~q+`6IiI<#Z=^IE\`0]1%DA^a0f,c %[Gxh84^/rdh9M7L)-ӂ-?K(stբh-?:[ڧCr]G(YB3|C| leXW_xV8ƊbbQ7V4J]l!= D ?'a`^aq8:-OYPxۀ֝X5Q"GִW} I>ȓclpVZM_gڰCveG{<_d0՗eN%NyƍȄp~Ú/kn|(G#.s9Jۇl [6ɻ&.X{SDf†< y?O~ƅDP*~bgcos{;'Z9Z.O孁e U~?Ӆ1N3ڶD(1GxxkSHI~ی?Ok,i(ׁۈ{.h_5؋nF70QOS5:'/աJr .KNwuer>n-U$U`Iv%.AUed ;Ә:+a&XĎ y Gс "4pxh84^ @d6((Ԕ{C::[>H, ɴNVNhr.~NZ`3᝼KQ|$%t!Vn%=*7fg(m!f y"kI6Y/eZٳ+zg6W8ɦbQ%y{9Ï*ŕ#7b-tX͕8ynO{]!ټ*\ (p2.Hٙd.^Z(N &l2&k U&ף#~.7658A7}P:BlkU[8)jw0$W !s\ QFn(qRK:'X@=$ x|5:@]2Si.& $` 8tS =&[#߫U3Wҳq ^H{➇Z4"AH#U0+̱1Ɏ;O9"DE C+nU:|a ɔM|?HW1$~=kUџVVl{7 ^;<,t[T"3SU9l˾Hx^&a@)E&<I?U7xG4c *i 5)ñ>wHf5[qO.d&J_~W\`G{ |-e/Чkd E( Niv=C` ̲Z+%m )s!ī6FeiN%O*㪞v,s@%4tS/Ѓ (gX7i&X 5WJ"*V J6s{IwoO_5~YXw(R!m)^'Dɸ5=@+~jyQ`O`$D`H_BT#%].XxDѫOR2E\K"R\T|:mO x*y =2~/?J,+%q Wޛ3?ܕ? ^e +RoҎ5س~oBo l84^/  @!/ONGۮ2t]С8cݮ5z=7ˮg@/aE[y#3#z7L.| (cRcSmQ$6ץ{ Da{T_j84^/  @ñ`/_g "d`ɾ0 { Cj_9jDՋa~? dc[0*a,& 0&+ OB4!1~Ix>8c&G)jI=@5@v&J?QlÇ@Q?^%tEXtdate:create2016-07-13T10:21:59+00:00%tEXtdate:modify2016-07-13T09:26:54+00:00͠tEXtSoftwareAdobe ImageReadyqe<IENDB`prewikka-5.1.1/prewikka/htdocs/css/images/ui-icons_888888_256x240.png0000664000175000017500000001552713555143652026245 0ustar tandrejatandreja00000000000000PNG  IHDREr@bKGDI( pHYsHHFk>tIDATx{le}?g kuJ>DC^QMH*MU h(*$HR*j D])Ż(M6F6!6- xIi- HN8suιgf73ƣ7 x ^/2&v&v^DL l6I-o?cnD Iye#d0+03~0g'LV[RC:B~()$qvXuB@E@`HNG`TA%=]qAwJ)u)9:e9d`V0A{=BS*ڦ SgF A -(DR˷@"g'U,eSwʿj*)l[.HLyϰ9jaI6MR~~ nGٕ3  @pxh84~=@>(mE3a\`~=uQ[f3WAioK}3wէgV,jn2*ߕmM] y=xn"co.L"7]EC:dHzE@W.f+^eƦ6vռE4O`̴.)l :7){_Я~"pxh84^/ / #\@S^T0sZs1J1Pr hwVEgSTQ5[ \BO `+˾>}\6/0kg1[ KhlXʿ_Z^IA^N4vOW=%i^<9tf 2СBHg6!u\ҭZ&蒶 2s U]iT ]Uaq;]A :rG-3<Fn*ݴTݯ 4< ; @pxh84^ysh,ux$\j"Z-moSJ9{ e˹[ \fָұy2LT0K@9ԼŢ=?ХB=c"vT6 Tokza9Ts&6ոv }3':[5),xU!҃@}U kc ꈡY,]`&߬('u*^v Owu?}2&CȖr}ݾ^g[`yc*9s"f_b uuT?Mf  eۏ0evbcJEM%6PolM`n ~Esչdj|z)miO q/{کJqAGpxh84^a+ ʥ5݃F+Y&{˾I z\eXoJ}HȯiW)~nm߮ɞhl*7TP3kXJ7R""NXU}ٔއA/(qW\v6$2 -˶E zdj0u]PT{[:>>LDkZYֺ14ZCWUbd12zBY$i".~Ai=Œ ۪>EAIb\Ϋ c6OSB\ɅJ#" REȰ_'I.aluI YX^/  @=h$i37[d:Qu!ZtwUl~FŻbkK"$-c.3@,y;i-JӉR޽H!ɷjN;LdwEdp fO,jTq+ 򩸹h[@Vef6KVx\b|l}_$U+W!?o[yB(p3 r_5P2ݚla˱ *xGXG$`W~9?r+y -kd.@ <]#U\Z, W4Ig9L1s aRO^.P(>K\c6m^um Qlg"y[өD/[V*3谨Xm@[qX#r,a5 kLK"0񢐻(qAOVPU j(iJlWq li xS T!sXD@s 9ky8\aY"rv֗u- v!H 4<@(B$"PdVZ5Ɯ ߦs0kB5h$=dpϪ_@0+4@"hOtcky5vzK\1@ޒZ]B_.܋ؿ!IXdWpW0Z%y9s9jaK0hsN,lUX!hf!2.)0 6B|Iq/Ӽ0jDF[,5 !m`-$J~1wWQJD#"YO  6hVQ5Ct/7 8-*"_EUy 0x+Cxgh|+`6HiA|]Z=^JE\`20 ~]f 5X`?S0Q^?J1%[Gxh84^/{ S"rؘɛnRZԧ[v-POI'Z~ttONzqgآ4X ԃ,seq9 ,2)^Ķ/(rS?=# (9a:,وK x R. B%f6nϻ V/Σ %O+|!I 63eHWO vXIKOrZ8gg8=C29Ǫ[PB' rAmK"zʻ! m6뱾3y5ܓ"[< JsϏU9Z^8_fD!Zq_\- -`)Dg鲔iqIb.JXTbjk$M1^K6<˿9C_frEM~8]TxXu5_<t_0PA𶀆 @p4O"qGA餦vGbQprzE33U 6+$q?W 1XK<8 [sC!}E~5C~=Cn 1[xLO gUX=̪yhsl(&U'/qgv|^8Sx(o(Bxe\ӑľUs:҅ͅ2k W!BԜi VEOfX6gA5kOد2jS6ۼ[JSjQ:(Z0Ne Z]L2$4@8B,,Nj(t'8.JCLKUi5#Xx#|U:@m??d,^q5L!]MrI4pZ;>g@MFK)(}fU .{]~55>"$c +ן?Qc# mK-6)࿁_YnG+:|a "~ϯٯbq~=+,j?My 9"yDʍng6-z<,+tKxW"'l˾H[yJ&a@~/9"a%$iѣ6.S8ظ+y+*ojom p-k1 u%=-" 4wq-ՐEK |UfG -Ua]Xrx.\˅h:"LFdF5pf覊)nYͣnFh 1{'\<ϫlik)$H 䇙5%yknib /OEOjZ<,bP p+ @<[/ #/Zwp6$5DE |6w^>7{ԇNĭPwf>k7/c͗=cMﴯ߁AE`q:N*NQbUG`ʟƳCᨉ"5w5.&v;.ܱ7e$$yKYE<[y8M nm%U4@[&EC(./bC>Z1_PO^;Ф!Nwcl^]`C1L8GO{ >.|mO9QHN P{;=YJ7'[ɂ-b< Xӌ2@}޺PwaŨM lqG{R\pDxsT3Xؓ @pxh8ѱxe l TZBHaect*ZHFb52iiS[:DHS ))%_rpSeUӮ@ *I3*C 3 =&&5CB`Ê,o]~]3tحjXex0CTA3œy 5{t!k@QV+Vr 3e!̰BːۓOA԰‰ # U4VDчD*Oݕ<:XlBxh8L`pxh84y0؃Jk5#;ǮD"-鞺#tLn3ã|ÁysɩqvA2t>}XJx8c&G)jI}@5V&J? Y!\=jb<hj o%tEXtdate:create2016-07-13T10:21:59+00:00%tEXtdate:modify2016-07-13T09:26:54+00:00͠tEXtSoftwareAdobe ImageReadyqe<IENDB`prewikka-5.1.1/prewikka/htdocs/css/images/ui-icons_cd0a0a_256x240.png0000664000175000017500000001070513555143652026467 0ustar tandrejatandreja00000000000000PNG  IHDRIJPLTE 4vYtRNS3P/"Uq@f`2 !<BHK Z#'1S,4j8E|)Q$ bJmߜGc?oh@^bKGDH pHYsHHFk>dIDATx] c۶H阒]Kd%٫뺮lmw]|pXm-}X:+iĆQV9\e'AtOS:72YsxMہB&z>nC@r@*aӝ%MFDDDDDDTߖH,ERUn ب\f͹:}4ᦋ{)n[ ̰E K Y Dۇ- +Kl=ӃL`љ|%n a N#5 (4?EDDDD\oWFfq;\E_,W!%zE!F¶. (USHQ0dw)T 8#p,xBK *xXEe K솎%mKX~sFE~tdcaI1Af4dHcGSB`0wev`"{ .GDDDD,dO6k"qkMefS_UKŌ&g~>n H}) LF%8()r![4统qQk0m[Le_70@>1 X0AZVcEV Ltk3EJ44ZﮊN`rt>`˥  AHBLH@cUq=jcM2sJCLiR NQ0=Yi-|4V ]]B^ޞ_H$<$ a=d@ (ZAp_}~s:N{DC>m^ƒS&, ;N&B} <_AB]HuN(B0{h1IKDs j' M8.ӫ1h3df}mq nU{Lo z \=?@ ((e|=ơ麄Ci1r<|OO; `HpQyzԈuZVƲ!)5mC2Lyg;֑RjWa@@VL&Wru=Z ̥=U5} 7;b(nP&sk48ͥ01U Wvk18dqTՌE]qH8 GF K'rOrŗ6"fpT^3c"nMم-/W=tJ,X){P Rm|K>mX8v5h<_{ꘀYF|&_G;&>^W⁃&K(81EB@F&;"L'wfwE-6o&/̫'Xe,>~ee|A=) dQ`}P[KN˂/~)O[dO=3El5'Y$?7mTzզ.\.` WE"""""v)V#]L;zqJr²[\-tҽ5 @ͷϟnT@+;cQhC*TڙAVr?f? Q1T`} Hk,{VZˋTϛ?I̯uQKLMe͆~qym09 S;j5 iQ]7k0UޭGkX3#lY_Цxj޶9`# M [z KuO_z˿Dܭ*kOJ(7n\e ITƨl/U߶uw.~;#r.8 o# 5Lh>1i pVM?/u70 X@L+M+{Fkt{ŧ890`. ĀCR+\/t R; TӲ]aL|efđ >ۣG|P`P8C1K՛A̍<2ۂKrl@L L 8@E>`nPNԍ,p EƆZF lÎ; F7Ȯ; swSz)g7{rsSgȋ(߄~AWytX$NVR_<6p.O8O[OdDk>_OO}JSdmV?W(_m j~=H IԁF>T/{*]IGJ@iqamNF|Q50+ ES8:v`p~vj:Bp96oys% |@H]+@t]Wk}}7FʮrAB\m-_2PY8xՎN.h~@+7z5t_//?0S>)zi0n/B`{DW#`Bo[,gFVЁpP߾C]Bz ,XXfԃA:H k7dZ9oc}o]0vd:R]0ve]刈jу| ? +(OǍ+ #ysߍnpFru<.HȺotM3h}߆P}˗vP}mǀ?WZ@}@@FDl%tEXtdate:create2016-07-13T10:21:59+00:00%tEXtdate:modify2016-07-13T09:26:54+00:00͠tEXtSoftwareAdobe ImageReadyqe<IENDB`prewikka-5.1.1/prewikka/htdocs/css/32px.png0000664000175000017500000000606113555143652022146 0ustar tandrejatandreja00000000000000PNG  IHDR@`[[PLTEZU`999eG  k~~~[Ub[ߟe^ uw|qX. vw|/$--!!*,U=tMY+ 烃|aA fIaktYz^JopggIIYYccڝW8i&&&ޝcUW[$\cpȍƘU56ҷܻמɳ{ģFmC6ԥgtv{-2]*/}HZB9ˢ@5MO믯Jٲ"xBǠހph1^F'`,#ff*nK̽n{ZܙmwZqWŵww&&ֺ==Qe7ab`ߊxo8ϸͭ޶bC11̩Q:վl؇n?U^{oѵ;41),R||Ωö÷YuuuvPx{lbtRNS.ZA& [5"\G9ELn٬`شݜك"WjfTIDATxyXf z (sιM&[hQPYJ[Q"(8FA SйMqל^t9w;}L~IYB'4<ϛi>|oJյ r馻?I $$$$jπh$ *0v}^zc{vkaHIQ`ViV9cvc@1O`v/) ɳX,^ (h3gΜRRb˒_A)) \%GP߉ud$L߉ m3BLX_곚_>mH`%+^_y\$n/#CbHF )l!"P`Iהl/փ[PT_{U4OX`e0$+2mZSF i(pǼO'!6QطCsKߘH'KJ^},00CF=d%PFX2dh.f߬vќ^9 9f#q|3K=@/'~|_nGF,֖<]RR;rt >S9mڴM4,0 t"% Khzp^2&ӧO:uC=rfcn{|2"2׳cjB+ $%%=(H 3u&p{*'sgRhVW9!C|_=S_Gx{.ljĹsv8P@\!!}GH.pmq88q|wvnnzNJzveA1PO5@YYaS0 Ʈ7cf&h#s(6F4=m"H $I $@H $ $H; Iln0zpoHO9/5/Ϥ&lm0m}i6.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:"Glyphicons Halflings";src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format("embedded-opentype"),url(../fonts/glyphicons-halflings-regular.woff2) format("woff2"),url(../fonts/glyphicons-halflings-regular.woff) format("woff"),url(../fonts/glyphicons-halflings-regular.ttf) format("truetype"),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format("svg")}.glyphicon{position:relative;top:1px;display:inline-block;font-family:"Glyphicons Halflings";font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:"\2014 \00A0"}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:""}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:"\00A0 \2014"}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.row-no-gutters{margin-right:0;margin-left:0}.row-no-gutters [class*=col-]{padding-right:0;padding-left:0}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:none;-moz-appearance:none;appearance:none}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s,-webkit-box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],.input-group-sm input[type=time],input[type=date].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm,input[type=time].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],.input-group-lg input[type=time],input[type=date].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg,input[type=time].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);opacity:.65;-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;background-image:none;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;background-image:none;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;background-image:none;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;background-image:none;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;background-image:none;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;background-image:none;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-right:15px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-right:-15px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);margin-top:8px;margin-bottom:8px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0%;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out,-o-transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.42857143;line-break:auto;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;font-size:12px;filter:alpha(opacity=0);opacity:0}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.42857143;line-break:auto;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;font-size:14px;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover>.arrow{border-width:11px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out,-o-transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);left:0}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);left:0}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;outline:0;filter:alpha(opacity=90);opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:"\2039"}.carousel-control .icon-next:before{content:"\203a"}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} /*# sourceMappingURL=bootstrap.min.css.map */prewikka-5.1.1/prewikka/htdocs/css/font-awesome.min.css0000664000175000017500000007443013555143652024551 0ustar tandrejatandreja00000000000000/*! * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} prewikka-5.1.1/prewikka/htdocs/css/jquery-ui-timepicker-addon.min.css0000664000175000017500000000320113555143652027300 0ustar tandrejatandreja00000000000000/*! jQuery Timepicker Addon - v1.5.5 - 2015-05-24 * http://trentrichardson.com/examples/timepicker * Copyright (c) 2015 Trent Richardson; Licensed MIT */ .ui-timepicker-div .ui-widget-header{margin-bottom:8px}.ui-timepicker-div dl{text-align:left}.ui-timepicker-div dl dt{float:left;clear:left;padding:0 0 0 5px}.ui-timepicker-div dl dd{margin:0 10px 10px 40%}.ui-timepicker-div td{font-size:90%}.ui-tpicker-grid-label{background:0 0;border:0;margin:0;padding:0}.ui-timepicker-div .ui_tpicker_unit_hide{display:none}.ui-timepicker-rtl{direction:rtl}.ui-timepicker-rtl dl{text-align:right;padding:0 5px 0 0}.ui-timepicker-rtl dl dt{float:right;clear:right}.ui-timepicker-rtl dl dd{margin:0 40% 10px 10px}.ui-timepicker-div.ui-timepicker-oneLine{padding-right:2px}.ui-timepicker-div.ui-timepicker-oneLine .ui_tpicker_time,.ui-timepicker-div.ui-timepicker-oneLine dt{display:none}.ui-timepicker-div.ui-timepicker-oneLine .ui_tpicker_time_label{display:block;padding-top:2px}.ui-timepicker-div.ui-timepicker-oneLine dl{text-align:right}.ui-timepicker-div.ui-timepicker-oneLine dl dd,.ui-timepicker-div.ui-timepicker-oneLine dl dd>div{display:inline-block;margin:0}.ui-timepicker-div.ui-timepicker-oneLine dl dd.ui_tpicker_minute:before,.ui-timepicker-div.ui-timepicker-oneLine dl dd.ui_tpicker_second:before{content:':';display:inline-block}.ui-timepicker-div.ui-timepicker-oneLine dl dd.ui_tpicker_millisec:before,.ui-timepicker-div.ui-timepicker-oneLine dl dd.ui_tpicker_microsec:before{content:'.';display:inline-block}.ui-timepicker-div.ui-timepicker-oneLine .ui_tpicker_unit_hide,.ui-timepicker-div.ui-timepicker-oneLine .ui_tpicker_unit_hide:before{display:none}prewikka-5.1.1/prewikka/htdocs/css/jquery-ui.min.css0000664000175000017500000007512313555143652024077 0ustar tandrejatandreja00000000000000/*! jQuery UI - v1.12.1 - 2017-03-16 * http://jqueryui.com * Includes: draggable.css, core.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css, theme.css * To view and modify this theme, visit http://jqueryui.com/themeroller/?scope=&folderName=smoothness&cornerRadiusShadow=8px&offsetLeftShadow=-8px&offsetTopShadow=-8px&thicknessShadow=8px&opacityShadow=30&bgImgOpacityShadow=0&bgTextureShadow=flat&bgColorShadow=aaaaaa&opacityOverlay=30&bgImgOpacityOverlay=0&bgTextureOverlay=flat&bgColorOverlay=aaaaaa&iconColorError=cd0a0a&fcError=cd0a0a&borderColorError=cd0a0a&bgImgOpacityError=95&bgTextureError=glass&bgColorError=fef1ec&iconColorHighlight=2e83ff&fcHighlight=363636&borderColorHighlight=fcefa1&bgImgOpacityHighlight=55&bgTextureHighlight=glass&bgColorHighlight=fbf9ee&iconColorActive=454545&fcActive=212121&borderColorActive=aaaaaa&bgImgOpacityActive=65&bgTextureActive=glass&bgColorActive=ffffff&iconColorHover=454545&fcHover=212121&borderColorHover=999999&bgImgOpacityHover=75&bgTextureHover=glass&bgColorHover=dadada&iconColorDefault=888888&fcDefault=555555&borderColorDefault=d3d3d3&bgImgOpacityDefault=75&bgTextureDefault=glass&bgColorDefault=e6e6e6&iconColorContent=222222&fcContent=222222&borderColorContent=aaaaaa&bgImgOpacityContent=75&bgTextureContent=flat&bgColorContent=ffffff&iconColorHeader=222222&fcHeader=222222&borderColorHeader=aaaaaa&bgImgOpacityHeader=75&bgTextureHeader=highlight_soft&bgColorHeader=cccccc&cornerRadius=4px&fsDefault=1.1em&fwDefault=normal&ffDefault=Verdana%2CArial%2Csans-serif * Copyright jQuery Foundation and other contributors; Licensed MIT */ .ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup > .ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup > .ui-controlgroup-item:focus,.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical > .ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc( 100% - 2.4em )}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw,.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Verdana,Arial,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #d3d3d3}.ui-widget-content{border:1px solid #aaa;background:#fff;color:#222}.ui-widget-content a{color:#222}.ui-widget-header{border:1px solid #aaa;background:#ccc url("images/ui-bg_highlight-soft_75_cccccc_1x100.png") 50% 50% repeat-x;color:#222;font-weight:bold}.ui-widget-header a{color:#222}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #d3d3d3;background:#e6e6e6 url("images/ui-bg_glass_75_e6e6e6_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#555}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#555;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #999;background:#dadada url("images/ui-bg_glass_75_dadada_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#212121;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #aaa;background:#fff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-icon-background,.ui-state-active .ui-icon-background{border:#aaa;background-color:#212121}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#212121;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fcefa1;background:#fbf9ee url("images/ui-bg_glass_55_fbf9ee_1x400.png") 50% 50% repeat-x;color:#363636}.ui-state-checked{border:1px solid #fcefa1;background:#fbf9ee}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#fef1ec url("images/ui-bg_glass_95_fef1ec_1x400.png") 50% 50% repeat-x;color:#cd0a0a}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#cd0a0a}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#cd0a0a}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("images/ui-icons_454545_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_454545_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_2e83ff_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cd0a0a_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_888888_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:4px}.ui-widget-overlay{background:#aaa;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{-webkit-box-shadow:-8px -8px 8px #aaa;box-shadow:-8px -8px 8px #aaa}prewikka-5.1.1/prewikka/htdocs/css/select2-bootstrap.min.css0000664000175000017500000004063013555143652025514 0ustar tandrejatandreja00000000000000/*! * Select2 Bootstrap Theme v0.1.0-beta.10 (https://select2.github.io/select2-bootstrap-theme) * Copyright 2015-2017 Florian Kissling and contributors (https://github.com/select2/select2-bootstrap-theme/graphs/contributors) * Licensed under MIT (https://github.com/select2/select2-bootstrap-theme/blob/master/LICENSE) */ .select2-container--bootstrap{display:block}.select2-container--bootstrap .select2-selection{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);background-color:#fff;border:1px solid #ccc;border-radius:4px;color:#555;font-size:14px;outline:0}.select2-container--bootstrap .select2-selection.form-control{border-radius:4px}.select2-container--bootstrap .select2-search--dropdown .select2-search__field{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);background-color:#fff;border:1px solid #ccc;border-radius:4px;color:#555;font-size:14px}.select2-container--bootstrap .select2-search__field{outline:0}.select2-container--bootstrap .select2-search__field::-webkit-input-placeholder{color:#999}.select2-container--bootstrap .select2-search__field:-moz-placeholder{color:#999}.select2-container--bootstrap .select2-search__field::-moz-placeholder{color:#999;opacity:1}.select2-container--bootstrap .select2-search__field:-ms-input-placeholder{color:#999}.select2-container--bootstrap .select2-results__option{padding:6px 12px}.select2-container--bootstrap .select2-results__option[role=group]{padding:0}.select2-container--bootstrap .select2-results__option[aria-disabled=true]{color:#777;cursor:not-allowed}.select2-container--bootstrap .select2-results__option[aria-selected=true]{background-color:#f5f5f5;color:#262626}.select2-container--bootstrap .select2-results__option--highlighted[aria-selected]{background-color:#337ab7;color:#fff}.select2-container--bootstrap .select2-results__option .select2-results__option{padding:6px 12px}.select2-container--bootstrap .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--bootstrap .select2-results__option .select2-results__option .select2-results__option{margin-left:-12px;padding-left:24px}.select2-container--bootstrap .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-24px;padding-left:36px}.select2-container--bootstrap .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-36px;padding-left:48px}.select2-container--bootstrap .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-48px;padding-left:60px}.select2-container--bootstrap .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-60px;padding-left:72px}.select2-container--bootstrap .select2-results__group{color:#777;display:block;padding:6px 12px;font-size:12px;line-height:1.42857143;white-space:nowrap}.select2-container--bootstrap.select2-container--focus .select2-selection,.select2-container--bootstrap.select2-container--open .select2-selection{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;border-color:#66afe9}.select2-container--bootstrap.select2-container--open .select2-selection .select2-selection__arrow b{border-color:transparent transparent #999;border-width:0 4px 4px}.select2-container--bootstrap.select2-container--open.select2-container--below .select2-selection{border-bottom-right-radius:0;border-bottom-left-radius:0;border-bottom-color:transparent}.select2-container--bootstrap.select2-container--open.select2-container--above .select2-selection{border-top-right-radius:0;border-top-left-radius:0;border-top-color:transparent}.select2-container--bootstrap .select2-selection__clear{color:#999;cursor:pointer;float:right;font-weight:700;margin-right:10px}.select2-container--bootstrap .select2-selection__clear:hover{color:#333}.select2-container--bootstrap.select2-container--disabled .select2-selection{border-color:#ccc;-webkit-box-shadow:none;box-shadow:none}.select2-container--bootstrap.select2-container--disabled .select2-search__field,.select2-container--bootstrap.select2-container--disabled .select2-selection{cursor:not-allowed}.select2-container--bootstrap.select2-container--disabled .select2-selection,.select2-container--bootstrap.select2-container--disabled .select2-selection--multiple .select2-selection__choice{background-color:#eee}.select2-container--bootstrap.select2-container--disabled .select2-selection--multiple .select2-selection__choice__remove,.select2-container--bootstrap.select2-container--disabled .select2-selection__clear{display:none}.select2-container--bootstrap .select2-dropdown{-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175);border-color:#66afe9;overflow-x:hidden;margin-top:-1px}.select2-container--bootstrap .select2-dropdown--above{-webkit-box-shadow:0 -6px 12px rgba(0,0,0,.175);box-shadow:0 -6px 12px rgba(0,0,0,.175);margin-top:1px}.select2-container--bootstrap .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--bootstrap .select2-selection--single{height:34px;line-height:1.42857143;padding:6px 24px 6px 12px}.select2-container--bootstrap .select2-selection--single .select2-selection__arrow{position:absolute;bottom:0;right:12px;top:0;width:4px}.select2-container--bootstrap .select2-selection--single .select2-selection__arrow b{border-color:#999 transparent transparent;border-style:solid;border-width:4px 4px 0;height:0;left:0;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--bootstrap .select2-selection--single .select2-selection__rendered{color:#555;padding:0}.select2-container--bootstrap .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--bootstrap .select2-selection--multiple{min-height:34px;padding:0;height:auto}.select2-container--bootstrap .select2-selection--multiple .select2-selection__rendered{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;line-height:1.42857143;list-style:none;margin:0;overflow:hidden;padding:0;width:100%;text-overflow:ellipsis;white-space:nowrap}.select2-container--bootstrap .select2-selection--multiple .select2-selection__placeholder{color:#999;float:left;margin-top:5px}.select2-container--bootstrap .select2-selection--multiple .select2-selection__choice{color:#555;background:#fff;border:1px solid #ccc;border-radius:4px;cursor:default;float:left;margin:5px 0 0 6px;padding:0 6px}.select2-container--bootstrap .select2-selection--multiple .select2-search--inline .select2-search__field{background:0 0;padding:0 12px;height:32px;line-height:1.42857143;margin-top:0;min-width:5em}.select2-container--bootstrap .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:700;margin-right:3px}.select2-container--bootstrap .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--bootstrap .select2-selection--multiple .select2-selection__clear{margin-top:6px}.form-group-sm .select2-container--bootstrap .select2-selection--single,.input-group-sm .select2-container--bootstrap .select2-selection--single,.select2-container--bootstrap .select2-selection--single.input-sm{border-radius:3px;font-size:12px;height:30px;line-height:1.5;padding:5px 22px 5px 10px}.form-group-sm .select2-container--bootstrap .select2-selection--single .select2-selection__arrow b,.input-group-sm .select2-container--bootstrap .select2-selection--single .select2-selection__arrow b,.select2-container--bootstrap .select2-selection--single.input-sm .select2-selection__arrow b{margin-left:-5px}.form-group-sm .select2-container--bootstrap .select2-selection--multiple,.input-group-sm .select2-container--bootstrap .select2-selection--multiple,.select2-container--bootstrap .select2-selection--multiple.input-sm{min-height:30px;border-radius:3px}.form-group-sm .select2-container--bootstrap .select2-selection--multiple .select2-selection__choice,.input-group-sm .select2-container--bootstrap .select2-selection--multiple .select2-selection__choice,.select2-container--bootstrap .select2-selection--multiple.input-sm .select2-selection__choice{font-size:12px;line-height:1.5;margin:4px 0 0 5px;padding:0 5px}.form-group-sm .select2-container--bootstrap .select2-selection--multiple .select2-search--inline .select2-search__field,.input-group-sm .select2-container--bootstrap .select2-selection--multiple .select2-search--inline .select2-search__field,.select2-container--bootstrap .select2-selection--multiple.input-sm .select2-search--inline .select2-search__field{padding:0 10px;font-size:12px;height:28px;line-height:1.5}.form-group-sm .select2-container--bootstrap .select2-selection--multiple .select2-selection__clear,.input-group-sm .select2-container--bootstrap .select2-selection--multiple .select2-selection__clear,.select2-container--bootstrap .select2-selection--multiple.input-sm .select2-selection__clear{margin-top:5px}.form-group-lg .select2-container--bootstrap .select2-selection--single,.input-group-lg .select2-container--bootstrap .select2-selection--single,.select2-container--bootstrap .select2-selection--single.input-lg{border-radius:6px;font-size:18px;height:46px;line-height:1.3333333;padding:10px 31px 10px 16px}.form-group-lg .select2-container--bootstrap .select2-selection--single .select2-selection__arrow,.input-group-lg .select2-container--bootstrap .select2-selection--single .select2-selection__arrow,.select2-container--bootstrap .select2-selection--single.input-lg .select2-selection__arrow{width:5px}.form-group-lg .select2-container--bootstrap .select2-selection--single .select2-selection__arrow b,.input-group-lg .select2-container--bootstrap .select2-selection--single .select2-selection__arrow b,.select2-container--bootstrap .select2-selection--single.input-lg .select2-selection__arrow b{border-width:5px 5px 0;margin-left:-10px;margin-top:-2.5px}.form-group-lg .select2-container--bootstrap .select2-selection--multiple,.input-group-lg .select2-container--bootstrap .select2-selection--multiple,.select2-container--bootstrap .select2-selection--multiple.input-lg{min-height:46px;border-radius:6px}.form-group-lg .select2-container--bootstrap .select2-selection--multiple .select2-selection__choice,.input-group-lg .select2-container--bootstrap .select2-selection--multiple .select2-selection__choice,.select2-container--bootstrap .select2-selection--multiple.input-lg .select2-selection__choice{font-size:18px;line-height:1.3333333;border-radius:4px;margin:9px 0 0 8px;padding:0 10px}.form-group-lg .select2-container--bootstrap .select2-selection--multiple .select2-search--inline .select2-search__field,.input-group-lg .select2-container--bootstrap .select2-selection--multiple .select2-search--inline .select2-search__field,.select2-container--bootstrap .select2-selection--multiple.input-lg .select2-search--inline .select2-search__field{padding:0 16px;font-size:18px;height:44px;line-height:1.3333333}.form-group-lg .select2-container--bootstrap .select2-selection--multiple .select2-selection__clear,.input-group-lg .select2-container--bootstrap .select2-selection--multiple .select2-selection__clear,.select2-container--bootstrap .select2-selection--multiple.input-lg .select2-selection__clear{margin-top:10px}.input-group-lg .select2-container--bootstrap .select2-selection.select2-container--open .select2-selection--single .select2-selection__arrow b,.select2-container--bootstrap .select2-selection.input-lg.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #999;border-width:0 5px 5px}.select2-container--bootstrap[dir=rtl] .select2-selection--single{padding-left:24px;padding-right:12px}.select2-container--bootstrap[dir=rtl] .select2-selection--single .select2-selection__rendered{padding-right:0;padding-left:0;text-align:right}.select2-container--bootstrap[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--bootstrap[dir=rtl] .select2-selection--single .select2-selection__arrow{left:12px;right:auto}.select2-container--bootstrap[dir=rtl] .select2-selection--single .select2-selection__arrow b{margin-left:0}.select2-container--bootstrap[dir=rtl] .select2-selection--multiple .select2-search--inline,.select2-container--bootstrap[dir=rtl] .select2-selection--multiple .select2-selection__choice,.select2-container--bootstrap[dir=rtl] .select2-selection--multiple .select2-selection__placeholder{float:right}.select2-container--bootstrap[dir=rtl] .select2-selection--multiple .select2-selection__choice{margin-left:0;margin-right:6px}.select2-container--bootstrap[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.has-warning .select2-dropdown,.has-warning .select2-selection{border-color:#8a6d3b}.has-warning .select2-container--focus .select2-selection,.has-warning .select2-container--open .select2-selection{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;border-color:#66512c}.has-warning.select2-drop-active{border-color:#66512c}.has-warning.select2-drop-active.select2-drop.select2-drop-above{border-top-color:#66512c}.has-error .select2-dropdown,.has-error .select2-selection{border-color:#a94442}.has-error .select2-container--focus .select2-selection,.has-error .select2-container--open .select2-selection{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;border-color:#843534}.has-error.select2-drop-active{border-color:#843534}.has-error.select2-drop-active.select2-drop.select2-drop-above{border-top-color:#843534}.has-success .select2-dropdown,.has-success .select2-selection{border-color:#3c763d}.has-success .select2-container--focus .select2-selection,.has-success .select2-container--open .select2-selection{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;border-color:#2b542c}.has-success.select2-drop-active{border-color:#2b542c}.has-success.select2-drop-active.select2-drop.select2-drop-above{border-top-color:#2b542c}.input-group>.select2-hidden-accessible:first-child+.select2-container--bootstrap>.selection>.select2-selection,.input-group>.select2-hidden-accessible:first-child+.select2-container--bootstrap>.selection>.select2-selection.form-control{border-bottom-right-radius:0;border-top-right-radius:0}.input-group>.select2-hidden-accessible:not(:first-child)+.select2-container--bootstrap:not(:last-child)>.selection>.select2-selection,.input-group>.select2-hidden-accessible:not(:first-child)+.select2-container--bootstrap:not(:last-child)>.selection>.select2-selection.form-control{border-radius:0}.input-group>.select2-hidden-accessible:not(:first-child):not(:last-child)+.select2-container--bootstrap:last-child>.selection>.select2-selection,.input-group>.select2-hidden-accessible:not(:first-child):not(:last-child)+.select2-container--bootstrap:last-child>.selection>.select2-selection.form-control{border-bottom-left-radius:0;border-top-left-radius:0}.input-group>.select2-container--bootstrap{display:table;table-layout:fixed;position:relative;z-index:2;width:100%;margin-bottom:0}.input-group>.select2-container--bootstrap>.selection>.select2-selection.form-control{float:none}.input-group>.select2-container--bootstrap.select2-container--focus,.input-group>.select2-container--bootstrap.select2-container--open{z-index:3}.input-group>.select2-container--bootstrap,.input-group>.select2-container--bootstrap .input-group-btn,.input-group>.select2-container--bootstrap .input-group-btn .btn{vertical-align:top}.form-control.select2-hidden-accessible{position:absolute!important;width:1px!important}@media (min-width:768px){.form-inline .select2-container--bootstrap{display:inline-block}} prewikka-5.1.1/prewikka/htdocs/css/select2.min.css0000664000175000017500000003553413555143652023510 0ustar tandrejatandreja00000000000000.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:white;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-hidden-accessible{border:0 !important;clip:rect(0 0 0 0) !important;height:1px !important;margin:-1px !important;overflow:hidden !important;padding:0 !important;position:absolute !important;width:1px !important}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#999;margin-top:5px;float:left}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-top:5px;margin-right:10px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline{float:right}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid black 1px;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--single,.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--single,.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:transparent;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#5897fb;color:white}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top, #fff 50%, #eee 100%);background-image:-o-linear-gradient(top, #fff 50%, #eee 100%);background-image:linear-gradient(to bottom, #fff 50%, #eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top, #eee 50%, #ccc 100%);background-image:-o-linear-gradient(top, #eee 50%, #ccc 100%);background-image:linear-gradient(to bottom, #eee 50%, #ccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0)}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:transparent;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top, #fff 0%, #eee 50%);background-image:-o-linear-gradient(top, #fff 0%, #eee 50%);background-image:linear-gradient(to bottom, #fff 0%, #eee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top, #eee 50%, #fff 100%);background-image:-o-linear-gradient(top, #eee 50%, #fff 100%);background-image:linear-gradient(to bottom, #eee 50%, #fff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{float:right}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb} prewikka-5.1.1/prewikka/htdocs/css/style.less0000664000175000017500000004756613555143652022713 0ustar tandrejatandreja00000000000000/* * global */ html { margin: 0; padding: 0; } body { margin-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; color: @active-text; background-color: @active-background; } a { color: @link; cursor: pointer; text-decoration: none; } a:hover { text-decoration: underline; } img { border: 0; } h1, h2, h3, h4, h5, h6 { font-weight: 600; } table { border-spacing: 2px 2px; background-color: @table-background; border-radius: 5px; } textarea, input, select { font-size: 9pt; font-family: Verdana, Arial, Helvetica, sans-serif; color: #333; /* needed for plain inputs because Bootstrap uses color: inherit without changing background-color */ } textarea { overflow: auto; &.vresize { resize: vertical; } &.hresize { resize: horizontal; } &.noresize { resize: none; } } input[type="checkbox"] { border: none; vertical-align: sub; } input[type="file"] { height: 0; width: 0; opacity: 0; } form { display: inline; } thead { font-weight: bold; background-color: @table-header; } fieldset { background: @fieldset-background; padding: 1em 0.5em 1em 0.5em; border-radius: 5px; } legend { position: relative; _top: -1em; padding: 0.4em; color: @active-text; } p { margin: 0; padding: 0; } .fixed { font-family: Courier, monospace; font-size: 9pt; } /* * Padding in prewikka is globally defined in #main */ .container-fluid { padding-left: 0px; padding-right: 0px; [class*="col-"] { padding-left: 0px; padding-right: 0px; } .row { margin-left: 0px; margin-right: 0px; } } /* * top menu */ #topmenu { z-index: 3; position: fixed; top: 46px; background: @active-background; width: 100%; .topmenu_nav { .topmenu_nav_container { background-color: @primary-background-color; opacity: 0.15; position: absolute; top: 0; left: 0; height: 50px; width: 100%; } a { color: #686868; } float: left; padding-top: 9px; font-size: 10pt; font-weight: bold; .nav-tabs { border: none; .active a { background: @fieldset-background; } } } } #topmenu_right { float: right; margin-right: 4px; margin-top: 13px; } .main_menu_form_submit, .prewikka-config-button, .prewikka-help-button { position: relative; /* make sure buttons are clickable */ padding: 5px; } /* * menu */ #main_menu_ng { position: fixed; top: 57px; right: 73px; z-index: 4; max-width: 60%; .main_menu_navbar { margin-bottom: 0px; padding: 2px 4px 3px; color: @active-text; } .collapsed { .form-group { max-width: 100px; } } .form-group { max-width: 160px; input { width: 100%; } button { min-width: 70px; max-width: 100%; text-align: left; text-overflow: ellipsis; overflow: hidden; padding-right: 20px; .caret { position: absolute; right: 10px; top: e("calc(50% - 1px)"); } } } .form-group-date { max-width: 140px; input { cursor: pointer; text-align: center; &.disabled { background-color: #EEE; opacity: 1; } } } .btn-submit { &.disabled { cursor: initial; } } .form-control { width: 100%; } label { display: none; } } .dropdown-header-custom { font-weight: bold; padding: 3px 10px; } .label-xs { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; margin-bottom: -4px; margin-top: -6px; font-size: 62.5%; } label.required:after { content: "*"; color: red; } .popup_select_field, .popup_input_field { width: 150px; max-width: 150px; } /* menu message nav */ #message_list_nav { //height: 43px; //width: 198px; border: none; background-color: transparent; a:visited, a:link, a:hover { color: black; text-decoration: none; width: 100%; display: block; } td { text-align: center; font-size: 9pt; width: 25%; /*font-weight: bold;*/ } } .message_list_nav_infos { background: @table-background; border: @border; } .message_list_nav_button { height: 15px; background: #E2EBF5; border: 1px solid @border; } /* * main screen */ @media (max-width: 768px) { #top_view { #top_view_navbar { position: static; #nav_top_view_header.nav { position: static; } .navbar-toggle { padding-bottom: 3px; } .dropdown-menu { background-color: #fff; } } #topmenu { position: static; .topmenu_nav_container { display: none; } } #_main { position: static; .prewikka-view-config { position: static; } } #main_menu_ng { position: absolute; top: 55px; z-index: -1; max-width: 100%; .form-group { display: inline-block; margin-bottom: 0px; vertical-align: middle; } } #config-button { position: absolute; } } } #top_view { &.detach { #top_view_navbar { position: static; } #topmenu { position: static; } #main_menu_ng { position: absolute; top: -80px; } } &.fullscreen { #top_view_navbar { display: none; } #topmenu { display: none; } #main_menu_ng { display: none; } #_main { top: 0; } #_main_viewport { top: 0; } } #top_view_navbar { z-index: 30; margin-bottom: 0; .navbar-brand { padding: 7px; color: white; line-height: 36px; /* navbar height(50) - (7 * 2) = 36 */ img { max-height: 40px; } } #top_view_navbar_menu { position: relative; z-index: 1; } #nav_top_view_header { right: 20px; position: absolute; z-index: 0; .btn { padding: 6px 6px; } } .navbar-nav > li > a { font-size: 13pt; } } } #_main_viewport { position: fixed; z-index: -1; top: 100px; bottom: 0px; width: 100%; } #_main { top: 100px; bottom: 0px; width: 100%; position: absolute; } #main { padding: 5px; height: 100%; } /* * random class */ .table-striped > tbody > tr:nth-of-type(2n+1) { background-color: @table-row-even; } .table-striped > tbody > tr:nth-of-type(2n) { background-color: @table-row-odd; } table.table.table-borderless > tbody > tr > td { border: none; } table.table.table-borderless > tbody > tr > th { border: none; } .impact_severity_high, .impact_completion_succeeded { text-decoration: none; font-weight: bold; color: #d02a2a; } .impact_severity_medium { text-decoration: none; color: #ff8e33; } .impact_severity_low, .impact_completion_failed { text-decoration: none; color: #418c3d; } .impact_severity_info { text-decoration: none; color: blue; } div.footer-buttons { position: absolute; margin-top: 5px; bottom: 5px; right: 5px; } div.footer-left-buttons { position: absolute; margin-top: 5px; bottom: 5px; left: 5px; } /* * popup */ .popup_menu { a, span { position: relative; display: block; padding: 10px 15px; background-color: #FFF; border: 1px solid #DDD; color: #555; } span { opacity: 0.65; } a:hover { background-color: #f5f5f5; text-decoration: none; } font-size: 14px; font-style: normal; font-weight: 400; line-height: 1.42857; border: 2px solid #787878; border-radius: 4px; background: @active-background; z-index: 1; display: none; position: absolute; margin: 0px; _width: 150px; text-align: left; } .table tbody tr td { line-height: 2; } /* * misc */ .fieldset_heading { legend { font-size: 12pt; font-weight: bold; margin-bottom: 0; } } .shadow { box-shadow: 3px 3px 6px 0 #A9A9A9; } div.prewikka-view-config { border: 1px solid #ccc; padding: 10px; background-color: @fieldset-background; position: fixed; right: 0; z-index: 3; } .ajax-spinner { position: relative; text-align: center; top: 50%; left: 50%; transform: translate(-50%, -50%); i.fa-spin { color: gray; } &.main-spinner { position: fixed; z-index: 1234; } } .text-center-vh { position: relative; text-align: center; top: 50%; transform: translate(0, -50%); } .widget-only { display: none; } .label-checkbox { cursor: pointer; } .checkbox-label { display: none; &:checked + .label-checkbox > span { background-color: #5CB85C; &:after { content: "\2714"; } } + .label-checkbox > span { margin-left: 5px; margin-bottom: 2px; background-color: #D9534F; &:empty { display:inherit; } &:after { content: "\2717"; } } } /* * Prewikka renderer */ .renderer-elem { background-color: @chart-background; display: inline-block; width: 100%; height: 100%; } svg text { fill: @active-text; } /* * Customize Bootstrap */ .list-group-item { background: @fieldset-background; } .navbar-primary { background-color: @primary-background-color; border-color: darken(@primary-background-color, 5%); .navbar-nav { > li > a { color: @primary-color; &:hover, &:focus { color: darken(@primary-color, 10%); background-color: @primary-background-color; } } > .active > a { &, &:hover, &:focus { color: @primary-color; background-color: darken(@primary-background-color, 5%); } } } .nav > .open > a, .nav > .open > a:focus, .nav > .open > a:hover { background-color: darken(@primary-background-color, 5%) } } @media (min-width: 992px) and (max-width: 1300px) { .modal-xl { width: 900px; /* same as modal-lg here */ } } @media (min-width: 1300px) { .modal-xl { width: 1200px; } } .modal-dialog .modal-content { background: @active-background; } .modal-dialog .modal-body { max-height: e("calc(100vh - 200px)"); overflow: auto; } /* Submenu */ .dropdown-submenu { position: relative; &>.dropdown-menu { top: 0; left: 100%; margin-top: -6px; margin-left: -1px; -webkit-border-radius: 0 6px 6px 6px; -moz-border-radius: 0 6px 6px 6px; border-radius: 0 6px 6px 6px; } &:hover>.dropdown-menu { display:block; &>a:after { border-left-color: #ffffff; } } &>a:after { display: block; content: " "; float: right; width: 0; height: 0; border-color: transparent; border-style: solid; border-width: 5px 0 5px 5px; border-left-color: #cccccc; margin-top: 5px; margin-right: -10px; } &.pull-left { float: none; &>.dropdown-menu { left: -100%; margin-left: 10px; -webkit-border-radius: 6px 0 6px 6px; -moz-border-radius: 6px 0 6px 6px; border-radius: 6px 0 6px 6px; } } } .dropdown-menu-theme { background-color: @active-background; > li > a { color: @active-text; } } /* Panels */ .panel { background-color: @fieldset-background; } .panel-default { border-color: #B0B0B0; } .panel-theme { border-color: @primary-background-color; } .panel-theme>.panel-heading{ background-color: @primary-background-color; border-color: @primary-background-color; color: #fff; } .panel-theme>.panel-heading+.panel-collapse>.panel-body{ border-top-color: @primary-background-color; } .panel-theme>.panel-heading .badge{ color: @primary-background-color; background-color: #fff; } /* Buttons */ .button-variant (@color-variant, @background-variant, @border-variant) { color: @color-variant; background-color: @background-variant; border-color: @border-variant; &:focus, &.focus { color: @color-variant; background-color: darken(@background-variant, 10%); border-color: darken(@border-variant, 25%); } &:hover { color: @color-variant; background-color: darken(@background-variant, 10%); border-color: darken(@border-variant, 12%); } &:active, &.active, .open > .dropdown-toggle& { color: @color-variant; background-color: darken(@background-variant, 10%); border-color: darken(@border-variant, 12%); &:hover, &:focus, &.focus { color: @color-variant; background-color: darken(@background-variant, 17%); border-color: darken(@border-variant, 25%); } } &:active, &.active, .open > .dropdown-toggle& { background-image: none; } &.disabled, &[disabled], fieldset[disabled] & { &, &:hover, &:focus, &.focus, &:active, &.active { background-color: @background-variant; border-color: @border-variant; } } .badge { color: @background-variant; background-color: @color-variant; } } .btn-custom { .button-variant(@primary-color, @primary-background-color, darken(@primary-background-color, 5%)); } /* * It looks like a button * It tastes like a button * But it is not a button */ .btn-static { background-color: white; border: 1px solid lightgrey; cursor: default; } .btn-static:active { -moz-box-shadow: inset 0 0 0px white; -webkit-box-shadow: inset 0 0 0px white; box-shadow: inset 0 0 0px white; } .tooltip-inner { color: @tooltip-text; background-color: @tooltip-background; } .tooltip.top .tooltip-arrow { border-top-color: @tooltip-background; } .tooltip.bottom .tooltip-arrow { border-bottom-color: @tooltip-background; } .tooltip.right .tooltip-arrow { border-right-color: @tooltip-background; } .tooltip.left .tooltip-arrow { border-left-color: @tooltip-background; } .popover { background-color: @active-background; .popover-title { color: #333; } &.top .arrow::after { border-top-color: @active-background; } &.bottom .arrow::after { border-bottom-color: @active-background; } &.right .arrow::after { border-right-color: @active-background; } &.left .arrow::after { border-left-color: @active-background; } } div.ui-jqgrid-titlebar { color: #222; } .ui-jqgrid tr.jqgrow > td { white-space: normal; } #prewikka-notification { display: none; } #prewikka-notifications-container { position: fixed; left: 0; right: 0; margin: auto; z-index: 50; width: 620px; .alert { margin-top: 30px; margin-right: 20px; } } .modal-dialog .traceback > div { max-height: 300px; } .widget .modal-header { display: none; } .widget .modal-dialog .modal-header { display: block; } .top-right-buttons { position: fixed; right: 80px; top: 59px; z-index: 5; } .modal-dialog .top-right-buttons { top: 10px; } @media (max-width: 768px) { .top-right-buttons { position: static; } .modal-dialog .top-right-buttons { position: fixed; } } .widget .modal-dialog .widget-only { display: initial; } .panel-background { background-color: @fieldset-background; } .default-background { background-color: @active-background; } /* * Bootstrap labels and inputs */ label.disabled a { pointer-events: none; cursor: not-allowed; } .list-bootstrap-label { cursor: pointer; font-weight: inherit; } .list-bootstrap-label:hover { cursor: pointer; font-weight: inherit; color: @active-text; background-color: @active-background; } .list-bootstrap-label-all { float: right; width: 20em; } .checkbox-inputgroup { display: none; } .checkbox-inputgroup:checked + .list-bootstrap-label > span > a:after { content: "\2714"; } .checkbox-inputgroup:checked + .list-bootstrap-label > span { background-color: #5CB85C; } .checkbox-inputgroup + .list-bootstrap-label > span > a:after { content: "\2717"; } .checkbox-inputgroup + .list-bootstrap-label > span { background-color: #D9534F; } .list-bootstrap-label > span > a:after { color: @primary-color; } .btn-default2 { background-color: #777; } .btn-default2:hover { background-color: darken(#777, 10%); } @label_critical_bg: #b03030; @table_critical_bg: #f2c0c0; .label-critical, .btn-critical { background-color: @label_critical_bg; } .label-critical[href]:focus, .label-critical[href]:hover, .btn-critical:hover { background-color: darken(@label_critical_bg, 5%); } .table > thead > tr, .table > tbody > tr, .table > tfoot > tr { > td.critical, > th.critical, &.critical > td, &.critical > th { background-color: @table_critical_bg; } } .table-hover > tbody > tr { > td.critical:hover, > th.critical:hover, &.critical:hover > td, &:hover > .critical, &.critical:hover > th { background-color: darken(@table_critical_bg, 5%); } } @label_panic_bg: #800000; @table_panic_bg: #f2a0a0; .label-panic, .btn-panic { background-color: @label_panic_bg; } .label-panic[href]:focus, .label-panic[href]:hover, .btn-panic:hover { background-color: darken(@label_panic_bg, 5%); } .table > thead > tr, .table > tbody > tr, .table > tfoot > tr { > td.panic, > th.panic, &.panic > td, &.panic > th { background-color: @table_panic_bg; } } .table-hover > tbody > tr { > td.panic:hover, > th.panic:hover, &.panic:hover > td, &:hover > .panic, &.panic:hover > th { background-color: darken(@table_panic_bg, 5%); } } .table > thead > tr, .table > tbody > tr, .table > tfoot > tr { > td.active, > th.active, &.active > td, &.active > th, > td.info, > th.info, &.info > td, &.info > th, > td.success, > th.success, &.success > td, &.success > th, > td.warning, > th.warning, &.warning > td, &.warning > th, > td.danger, > th.danger, &.danger > td, &.danger > th, > td.critical, > th.critical, &.critical > td, &.critical > th, > td.panic, > th.panic, &.panic > td, &.panic > th { color: #444; } } .btn-default2, .btn-critical, .btn-panic { color: white; } .commonlisting .nocheck input { pointer-events: none; opacity: 0.35; } #main_menu_ng_block .form-group-date { padding: 0; } #main_menu_ng_block .form-group-date + .form-group-date { padding-left: 10px; } .panel .instance { border-radius: 3px; border-style: solid; border-width: 1px 1px 1px 5px; border-color: #eee; border-left-color: #1b809e; margin: 20px 0 5px 0; padding: 5px 20px; } .panel .instance:first-child { margin: 5px 0; } /* * Customize Select2 dropdown appearance */ .select2-results { font-size: 13px; color: #333; .select2-results__option { overflow-x: hidden; .select2-results__option { padding: 3px 20px; overflow-wrap: break-word; } } } #main_menu_ng .main_menu_navbar { .select2-selection__rendered { color: @active-text; } .select2-selection__arrow b { border-color: @active-text transparent transparent; } .select2-container--open .select2-selection__arrow b { border-color: transparent transparent @active-text; } } prewikka-5.1.1/prewikka/htdocs/css/throbber.gif0000664000175000017500000000327013555143652023141 0ustar tandrejatandreja00000000000000GIF89aFFFzzzXXX$$$666hhh! NETSCAPE2.0!Created with ajaxload.info! ,qH;uj01P4HЈ `+I1q|@Pp@\ 84QQZ^- g8) fl9C` O Tp%# c% U! ,pHhy91 KI*,Al `h |&@sHBvD~UM^)H6? xMl< L&klj('K'! ,rH(9NICsa(0F& pP$@0 8 (ZF ( ( iDN1:Hd%M 2 x2GOyo 0Oyrn;bq'1b'! ,pH(c9J& QN,J5P3…`0 J';)l_@H$vb ]M+ g@ ͧ)v1[oz ;|zM1n&&&! ,fHh)9N&  }@APu, \+I 4E| q ؜ɱ] MkI7JيH!8esyVny&! ,xHRRB&' Rr T(2c d&08 g0`lAa~6ܦK!~M }BAbp$SIJǙCp AH4zY *f! ,oHht{6 aWba(5U@ NA;4Br$P(EHTC!@80YQcL z YSY>Z g t! ,sHhtj(6 a$_! _^5FBX 8ZXU(I@ѫ (.AQX%(Q,!DM S a[ 0;prewikka-5.1.1/prewikka/htdocs/css/ui.jqgrid.min.css0000664000175000017500000007315113555143652024040 0ustar tandrejatandreja00000000000000/*! * jqGrid 4.15.4 - free jqGrid: https://github.com/free-jqgrid/jqGrid * Date: 2018-04-02 */.ui-jqgrid{position:relative;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box;-ms-touch-action:none;touch-action:manipulation}.ui-jqgrid div{line-height:normal}.ui-jqgrid table{border-collapse:separate;border-spacing:0;border-width:0;border-style:none}.ui-jqgrid table td{padding:0}.ui-jqgrid>.ui-jqgrid-view{position:relative;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;left:0;top:0;padding:0;font-size:11px}.ui-jqgrid>.ui-jqgrid-view *,.ui-jqgrid>.ui-jqgrid-view :after,.ui-jqgrid>.ui-jqgrid-view :before{-webkit-box-sizing:inherit;-moz-box-sizing:inherit;box-sizing:inherit}.ui-jqdialog .ui-jqdialog-titlebar,.ui-jqgrid .ui-jqgrid-errorbar,.ui-jqgrid .ui-jqgrid-titlebar{padding:.3em .3em .3em .3em;position:relative;font-size:12px;border-left:0 none;border-right:0 none;border-top:0 none}.ui-jqgrid-errorbar{max-height:100px;margin-bottom:0;overflow:auto}.ui-jqgrid .ui-jqgrid-caption,.ui-jqgrid .ui-jqgrid-errorbar-ltr{text-align:left}.ui-jqgrid .ui-jqgrid-caption-rtl,.ui-jqgrid .ui-jqgrid-errorbar-rtl{text-align:right}.ui-jqdialog-titlebar>.ui-jqdialog-titlebar-close,.ui-jqgrid-titlebar>.ui-jqgrid-titlebar-close{vertical-align:middle;text-align:center;text-decoration:none;position:absolute;top:50%;width:1.4em;line-height:1.5em;font-size:12px;margin:-.7em 0 0 0;padding:.2em;border:1px solid transparent;height:1.4em;cursor:pointer;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-ms-touch-action:manipulation;touch-action:manipulation;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ui-jqgrid-jquery-ui .ui-jqdialog-titlebar>.ui-jqdialog-titlebar-close{margin:-8px 0 0 0}.ui-jqgrid .ui-jqgrid-caption .ui-jqgrid-titlebar-close{right:.1em}.ui-jqgrid .ui-jqgrid-caption-rtl .ui-jqgrid-titlebar-close{left:.1em}.ui-jqdialog .ui-jqdialog-titlebar-ltr .ui-jqdialog-titlebar-close{right:.3em}.ui-jqdialog .ui-jqdialog-titlebar-rtl .ui-jqdialog-titlebar-close{left:.3em}.ui-jqdialog-titlebar>.ui-jqdialog-titlebar-close,.ui-jqgrid-titlebar>.ui-jqgrid-titlebar-close{-ms-border-radius:.5em;border-radius:.5em}.ui-jqdialog .ui-jqdialog-titlebar-ltr .ui-jqdialog-title,.ui-jqgrid .ui-jqgrid-caption .ui-jqgrid-title,.ui-jqgrid .ui-jqgrid-errorbar-ltr .ui-jqgrid-error{position:relative;left:.1em}.ui-jqdialog .ui-jqdialog-titlebar-rtl .ui-jqdialog-title,.ui-jqgrid .ui-jqgrid-caption-rtl .ui-jqgrid-title,.ui-jqgrid .ui-jqgrid-errorbar-rtl .ui-jqgrid-error{position:relative;right:.1em}.ui-jqgrid-titlebar>.ui-jqgrid-titlebar-close span{margin-top:0;margin-left:0}.ui-jqdialog-titlebar>.ui-jqdialog-titlebar-close span,.ui-jqgrid-titlebar>.ui-jqgrid-titlebar-close span{display:block}.ui-jqdialog-titlebar>.ui-jqdialog-titlebar-close span.ui-icon,.ui-jqgrid-titlebar>.ui-jqgrid-titlebar-close span.ui-icon{position:relative;top:-2px}.ui-jqdialog-titlebar-ltr .ui-jqdialog-titlebar-close span.ui-icon,.ui-jqgrid .ui-jqgrid-caption .ui-jqgrid-titlebar-close span.ui-icon{right:3px}.ui-jqgrid .ui-jqgrid-titlebar>.ui-jqgrid-titlebar-close>span.ui-icon{margin-top:-1px}.ui-jqgrid .ui-jqgrid-titlebar>.ui-jqgrid-titlebar-close>span.fa,.ui-jqgrid .ui-jqgrid-titlebar>.ui-jqgrid-titlebar-close>span.glyphicon{font-size:14px;margin-top:-2px}.ui-jqgrid .ui-jqgrid-titlebar>.ui-jqgrid-titlebar-close>span.fa{margin-left:-1px}.ui-jqgrid .ui-jqgrid-titlebar>.ui-jqgrid-titlebar-close>span.glyphicon{margin-left:-2px}.ui-jqdialog-titlebar .ui-jqdialog-titlebar-close>span{margin-top:-1px}.ui-jqdialog-titlebar .ui-jqdialog-titlebar-close>span.glyphicon{margin-top:-.05em;margin-left:-.05em}.ui-jqdialog .ui-resizable-handle{right:-3px;bottom:-3px}.ui-jqdialog .ui-resizable-handle.fa{bottom:1px;right:-2px}.ui-jqdialog .ui-resizable-handle.glyphicon{right:-2px;bottom:-3.8px}.ui-jqgrid>.ui-jqgrid-view>.ui-jqgrid-hdiv{position:relative;margin:0;padding:0;overflow:hidden;border-left:0 none;border-top:0 none;border-right:0 none;height:auto}.ui-jqgrid .ui-jqgrid-hbox{float:left;padding-right:20px}.ui-jqgrid .ui-jqgrid-htable{table-layout:fixed;margin:0}.ui-jqgrid .ui-jqgrid-htable th{height:auto;padding:0 2px 0 2px}.ui-jqgrid-htable>thead>.jqg-first-row-header>th{border-bottom:0 none;border-top:0 none}.ui-jqgrid .ui-jqgrid-htable th.jqgh_cbox{padding:0}.ui-jqgrid .ui-jqgrid-htable .ui-jqgrid-labels th div{overflow:hidden;position:relative;height:auto;margin:2px 2px}.ui-jqgrid .ui-jqgrid-htable .ui-jqgrid-labels>th.jqgh_cbox{vertical-align:middle}.ui-jqgrid .ui-jqgrid-htable .ui-jqgrid-labels .jqgh_cbox>div{text-align:center;vertical-align:baseline;margin:0}.ui-jqgrid .ui-jqgrid-labels th.ui-th-column,.ui-jqgrid .ui-jqgrid-legacy-subgrid .ui-th-subgrid,.ui-jqgrid-labels .ui-th-column-header{overflow:hidden;white-space:nowrap;text-align:center}.ui-jqgrid-labels .ui-th-column-header{vertical-align:middle;height:auto;vertical-align:middle;border-top:0 none}.ui-jqgrid .ui-jqgrid-labels th.ui-th-column{position:relative;vertical-align:middle;border-top:0 none;border-bottom:0 none}.ui-jqgrid .ui-jqgrid-htable th.ui-th-ltr,.ui-th-ltr{border-left:0 none}.ui-jqgrid .ui-jqgrid-htable th.ui-th-rtl,.ui-th-rtl{border-right:0 none}.ui-first-th-ltr{border-right:1px solid}.ui-first-th-rtl{border-left:1px solid}.ui-jqgrid .ui-th-div-ie{white-space:nowrap;zoom:1;height:17px}.ui-jqgrid .ui-th-column>.jqgh_cbox{margin:3px 0}.ui-jqgrid .ui-th-column .cbox{margin:.1em;cursor:pointer;text-align:center;vertical-align:middle}.ui-jqgrid.ui-jqgrid-bootstrap .ui-th-column .cbox{height:18px;width:18px}.ui-jqgrid .ui-th-column .ui-th-div-ie>.cbox{margin-left:-1px;margin-right:-1px}.ui-jqgrid .ui-jqgrid-labels>.ui-th-column>.ui-jqgrid-resize{top:0;height:100%;width:.3em;position:absolute;cursor:col-resize;-webkit-touch-callout:none;-ms-user-select:none;-moz-user-select:-moz-none;-webkit-user-select:none;user-select:none;display:inline;overflow:hidden}.ui-jqgrid .ui-jqgrid-htable .ui-jqgrid-labels th div.ui-jqgrid-rotate{-webkit-transform:translateX(-50%) translateY(0) rotate(-90deg);-moz-transform:translateX(-50%) translateY(0) (-90deg);-o-transform:translateX(-50%) translateY(0) rotate(-90deg);-ms-transform:translateX(-50%) translateY(0) rotate(-90deg);transform:translateX(-50%) translateY(0) rotate(-90deg);transform-origin:center center;margin:0;left:50%}.ui-jqgrid .ui-grid-ico-sort{overflow:hidden;position:absolute;display:inline}.ui-grid-ico-sort{cursor:pointer}.ui-state-disabled.ui-grid-ico-sort{cursor:pointer!important}.ui-jqgrid .s-ico{position:relative;width:.87em;height:1.125em;display:inline-block;vertical-align:middle;margin:0 .1em}.ui-jqgrid .s-ico>.ui-grid-ico-sort{display:block;position:relative}.ui-jqgrid .s-ico>.ui-grid-ico-sort.ui-icon{width:12px;margin-top:0}.ui-jqgrid .s-ico>.ui-icon-asc.ui-icon{top:-6px}.ui-jqgrid .s-ico>.ui-icon-desc.ui-icon{top:-16px}.ui-jqgrid .s-ico>.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-jqgrid .s-ico>.ui-icon.ui-sort-ltr{margin-left:-3px}.ui-jqgrid .s-ico>.ui-icon.ui-sort-rtl{margin-right:0}.ui-jqgrid-sortable>.ui-jqgrid-sort-order{position:relative;left:-.1em;top:0;font-size:75%;vertical-align:super}.ui-jqgrid .ui-th-column>div{cursor:default}.ui-jqgrid .ui-th-column>div.ui-jqgrid-sortable{cursor:pointer}.ui-jqgrid .ui-jqgrid-hdiv .ui-search-toolbar{border-top-width:1px;border-top-style:solid}.ui-jqgrid .ui-jqgrid-hdiv .ui-search-toolbar .ui-th-column{border-top-width:1px;border-top-style:solid}.ui-jqgrid .ui-jqgrid-hdiv .ui-search-toolbar input{margin:1px 0 0 0}.ui-jqgrid .ui-jqgrid-hdiv .ui-search-toolbar select{margin:1px 0 0 0}.ui-jqgrid .ui-jqgrid-bdiv{min-height:1px;position:relative;margin:0;padding:0;overflow:auto;text-align:left}.ui-jqgrid .ui-jqgrid-btable{table-layout:fixed;margin:0;outline-style:none;height:1px}.ui-jqgrid tr.jqgroup,.ui-jqgrid tr.jqgrow{outline-style:none}.ui-jqgrid tr.jqfoot>td,.ui-jqgrid tr.jqgroup>td,.ui-jqgrid tr.jqgrow>td,.ui-jqgrid tr.ui-subgrid>td,.ui-jqgrid tr.ui-subtblcell>td{overflow:hidden;white-space:pre;vertical-align:middle;text-align:center;height:22px;border-top:0 none;border-bottom-width:1px;border-bottom-style:solid}.ui-jqgrid-jquery-ui.ui-jqgrid tr.jqfoot>td,.ui-jqgrid-jquery-ui.ui-jqgrid tr.jqgroup>td,.ui-jqgrid-jquery-ui.ui-jqgrid tr.jqgrow>td,.ui-jqgrid-jquery-ui.ui-jqgrid tr.ui-subgrid>td{border-bottom-color:inherit}.ui-jqgrid tr.jqfoot>td,.ui-jqgrid tr.jqgroup>td,.ui-jqgrid tr.jqgrow>td{padding:0 2px 0 2px}.ui-jqgrid tr.ui-subgrid>td{padding:0}.ui-jqgrid tr.jqgfirstrow>td{padding:0 2px 0 2px;border-top:0 none;border-left:0 none;height:0;border-right-width:1px;border-right-style:solid;border-bottom:0 none}.ui-jqgrid-jquery-ui.ui-jqgrid tr.jqgfirstrow>td{border-right-color:inherit}.ui-jqgrid tr.jqgfirstrow>td.td_cbox{padding:0}.ui-jqgrid tr.jqfoot>td,.ui-jqgrid tr.jqgroup>td,.ui-jqgrid tr.jqgrow>td{font-weight:400}.ui-jqgrid tr.jqfoot>td{font-weight:700}.ui-jqgrid .ui-jqgrid-bdiv tr.ui-row-ltr>td{text-align:left;border-left-width:0;border-left-style:none;border-right-width:1px;border-right-style:solid}.ui-jqgrid-jquery-ui.ui-jqgrid .ui-jqgrid-bdiv tr.ui-row-ltr>td{border-color:inherit}.ui-jqgrid .ui-jqgrid-bdiv tr.ui-row-rtl>td{text-align:right;border-right-width:0;border-right-style:none;border-left-width:1px;border-left-style:solid}.ui-jqgrid-jquery-ui.ui-jqgrid .ui-jqgrid-bdiv tr.ui-row-rtl>td{border-color:inherit}.ui-jqgrid .ui-jqgrid-btable td.jqgrid-rownum{padding:0 2px 0 2px;margin:0;border-width:0;border-style:none}.ui-jqgrid .ui-jqgrid-btable td.jqgrid-rownum{border-bottom-width:1px;border-bottom-style:solid}.ui-jqgrid-jquery-ui.ui-jqgrid .ui-jqgrid-btable td.jqgrid-rownum{border-bottom-color:inherit}.ui-jqgrid .jqgrow>td.td_cbox{padding:0;text-align:center;vertical-align:middle}.ui-jqgrid .jqgrow>td.ui-sgcollapsed{text-align:center;vertical-align:middle}.ui-jqgrid tr.jqgrow>td.td_cbox{padding:0}.ui-jqgrid .jqgrow>td>.cbox{height:14px;width:14px;cursor:pointer;text-align:center;vertical-align:middle}.ui-jqgrid>.ui-jqgrid-resize-mark,body>.ui-jqgrid-resize-mark{width:0;left:0;cursor:col-resize;-webkit-touch-callout:none;-ms-user-select:none;-moz-user-select:-moz-none;-webkit-user-select:none;user-select:none;position:absolute;top:0;overflow:hidden;display:none;border-left-width:1px;border-right-width:1px;z-index:99999}span.ui-jqgrid-cell-wrapper{margin:0!important;padding:0!important}.ui-jqgrid>.ui-jqgrid-view>.ui-jqgrid-sdiv{position:relative;margin:0;padding:0;overflow:hidden;border-left:0 none;border-top:0 none;border-right:0 none}.ui-jqgrid .ui-jqgrid-ftable{table-layout:fixed;margin-bottom:0}.ui-jqgrid tr.footrow td{font-weight:700;overflow:hidden;white-space:nowrap;height:21px;padding:0 2px 0 2px;border-top-width:1px;border-top-style:solid;border-bottom-width:1px;border-bottom-style:solid}.ui-jqgrid-jquery-ui.ui-jqgrid tr.footrow td{border-top-color:inherit;border-bottom-color:inherit}.ui-jqgrid tr.footrow-ltr td{text-align:left;border-left-width:0;border-left-style:none;border-right-width:1px;border-right-style:solid}.ui-jqgrid-jquery-ui.ui-jqgrid tr.footrow-ltr td{border-color:inherit}.ui-jqgrid tr.footrow-rtl td{text-align:right;border-left-width:1px;border-left-style:solid;border-right-width:0;border-right-style:none}.ui-jqgrid-jquery-ui.ui-jqgrid tr.footrow-rtl td{border-color:inherit}.ui-jqgrid>.ui-jqgrid-pager{border:0 none;margin:0;padding:0;position:relative;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;height:auto;min-height:22px;overflow:hidden;font-size:11px}.ui-jqgrid>.ui-jqgrid-pager *,.ui-jqgrid>.ui-jqgrid-pager :after,.ui-jqgrid>.ui-jqgrid-pager :before{-webkit-box-sizing:inherit;-moz-box-sizing:inherit;box-sizing:inherit}.ui-jqgrid .ui-jqgrid-pager .ui-pager-control,.ui-jqgrid .ui-jqgrid-toppager .ui-pager-control{position:relative;border-left:0;border-bottom:0;border-top:0}.ui-pager-control .ui-jqgrid-pg-left{text-align:left}.ui-pager-control .ui-jqgrid-pg-center{text-align:center;white-space:pre}.ui-pager-control .ui-jqgrid-pg-right{text-align:right}.ui-jqgrid .ui-pg-table{position:relative;padding:0;width:auto;margin:0}.jqgrow .ui-jqgrid-actions{background:inherit;border-style:none}.ui-jqgrid .ui-pg-button:not(.ui-state-hover),.ui-jqgrid-jquery-ui .jqgrow .ui-jqgrid-actions .ui-pg-div:not(.ui-state-hover){border:1px solid transparent}.ui-pager-control .ui-pg-table{border-color:inherit}.jqgrow .ui-jqgrid-actions .ui-pg-div.ui-state-hover,.jqgrow .ui-jqgrid-actions .ui-pg-div:focus,.jqgrow .ui-jqgrid-actions .ui-pg-div:hover,.ui-jqgrid .ui-pg-button.ui-state-hover,.ui-jqgrid .ui-pg-button:focus,.ui-jqgrid .ui-pg-button:hover{border-style:solid;border-color:inherit}.ui-jqgrid .ui-pg-table td{font-weight:400;vertical-align:middle;padding:1px}.ui-jqgrid .ui-pager-control .ui-pg-button{display:inline-block;height:auto}.ui-jqgrid .ui-pg-button span{display:block;margin:1px;float:left}.ui-jqgrid .ui-pg-table .ui-pg-input,.ui-jqgrid .ui-pg-table .ui-pg-selbox{height:auto;width:auto;margin:0;line-height:inherit}select.form-control.ui-pg-selbox:not([size]):not([multiple]){height:auto}.ui-jqgrid .ui-pg-table .ui-pg-selbox{display:block;padding:1px}.ui-jqgrid .ui-separator{height:12px;border-left:1px solid #ccc;border-right:1px solid #ccc;margin:-1px;float:right}.ui-jqgrid .ui-paging-info{font-weight:400;height:auto;margin:0 .2em 0 .2em;display:inline}.ui-jqgrid .ui-jqgrid-pager .ui-pg-div{padding:1px 0;float:left;position:relative}.ui-jqgrid .ui-jqgrid-pager .ui-pg-button{cursor:pointer}.ui-jqgrid .ui-jqgrid-pager .ui-pg-div span.ui-icon{float:left;margin:0 2px}.ui-jqgrid td input,.ui-jqgrid td select,.ui-jqgrid td textarea{margin:0}.ui-jqgrid td textarea{width:auto;height:auto}.ui-jqgrid>.ui-jqgrid-view>.ui-jqgrid-toppager{border-left:0 none;border-right:0 none;border-top:0 none;margin:0;padding:0;position:relative;height:auto;min-height:22px;overflow:hidden}.ui-jqgrid .ui-jqgrid-toppager .ui-pg-div{padding:1px 0;float:left;position:relative}.ui-jqgrid .ui-jqgrid-toppager .ui-pg-button{cursor:pointer}.ui-jqgrid .ui-jqgrid-toppager .ui-pg-div span.ui-icon{float:left;margin:0 2px}.ui-jqgrid .ui-pg-table .ui-pg-button{margin:2px;vertical-align:middle}.ui-jqgrid .navtable .ui-pg-div span.ui-pg-button-text{padding-left:.2em;padding-right:.2em}.ui-pg-button.ui-state-hover>.ui-pg-div>.ui-pg-button-text,.ui-pg-button:hover>.ui-pg-div>.ui-pg-button-text{font-weight:400}.ui-jqgrid .ui-pg-div{text-align:center;vertical-align:middle;display:inline-block}.ui-jqgrid .navtable .ui-pg-div>span.ui-pg-button-icon-over-text{margin-left:auto;margin-right:auto;float:none}.subgrid-data>.tablediv>.ui-jqgrid{-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}.subgrid-data>.tablediv>.ui-jqgrid>.ui-jqgrid-view{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.ui-jqgrid .ui-jqgrid-btable .jqgrow>.ui-sgcollapsed{text-align:center;vertical-align:middle}.ui-jqgrid .ui-jqgrid-btable .ui-sgcollapsed span{display:inline-block}.ui-jqgrid .ui-subgrid{margin:0;padding:0;width:100%}.sgbutton{cursor:pointer}.ui-jqgrid .ui-subgrid table{table-layout:fixed}.ui-jqgrid .ui-subgrid tr.ui-subtblcell td{height:18px;border-top:0 none;border-bottom-width:1px;border-bottom-style:solid}.ui-jqgrid-jquery-ui.ui-jqgrid .ui-subgrid tr.ui-subtblcell td{border-bottom-color:inherit}.ui-jqgrid .ui-th-subgrid{height:20px}.ui-jqgrid .ui-row-ltr.ui-subgrid>.subgrid-cell>span{float:right}.ui-jqgrid .ui-row-rtl.ui-subgrid>.subgrid-cell>span{float:left}.ui-jqgrid>.loading{position:absolute;top:45%;left:45%;width:auto;z-index:101;padding:6px;margin:5px;text-align:center;font-weight:700;display:none;border-width:2px;font-size:11px}.ui-jqgrid .jqgrid-overlay{display:none;z-index:100}* .jqgrid-overlay iframe{position:absolute;top:0;left:0;z-index:-1}.ui-jqgrid>.ui-jqgrid-view>.ui-userdata{border-left:0 none;border-right:0 none;height:21px;overflow:hidden}.ui-jqgrid .ui-jqdialog{font-size:11px}.ui-jqdialog{display:none;width:300px;position:absolute;font-size:11px;overflow:visible}.ui-jqdialog.ui-jqgrid-jquery-ui{padding:.2em}.ui-jqgrid-bootstrap.modal{right:auto;left:auto}.ui-jqdialog .ui-jqdialog-content,.ui-jqdialog-content{border:0;padding:.3em .2em;background:0 0;height:auto}.ui-jqdialog .ui-jqconfirm{padding:.4em 1em;border-width:3px;position:absolute;bottom:10px;right:10px;overflow:visible;display:none;height:80px;width:220px;text-align:center}.ui-jqdialog>.ui-resizable-se,.ui-jqgrid>.ui-resizable-se{bottom:-3px;right:-3px}.ui-jqdialog-content .FormGrid{margin:0}.ui-jqdialog-content .EditTable{width:100%;margin-bottom:0}.ui-jqdialog-content .DelTable{width:100%;margin-bottom:0}.EditTable td input,.EditTable td select,.EditTable td textarea{margin:0}.EditTable td textarea{width:auto;height:auto}.ui-jqdialog-content td.EditButton{border-top:0 none;border-left:0 none;border-right:0 none;padding:5px 0}.ui-jqdialog-content td.EditButton-ltr{text-align:right}.ui-jqdialog-content td.EditButton-rtl{text-align:left}.ui-jqdialog-content td.navButton{text-align:left;border-left:0 none;border-top:0 none;border-right:0 none;padding:5px 0}.ui-jqdialog-content td.navButton-ltr{text-align:left}.ui-jqdialog-content td.navButton-ltr>.fm-button{float:left}.ui-jqdialog-content td.navButton-rtl{text-align:right}.ui-jqdialog-content td.navButton-rtl>.fm-button{float:right}.ui-jqdialog-content .FormElement{width:100%;box-sizing:border-box}.ui-jqdialog-content input.FormElement,.ui-jqdialog-content select.FormElement{padding:.3em}.ui-jqdialog-content .data-line{padding-top:.1em;border:0 none}.ui-jqdialog-content .CaptionTD{vertical-align:middle;border:0 none;padding:2px;white-space:nowrap}.ui-jqdialog-content .DataTD{padding:2px;border-width:0;border-style:none;vertical-align:top}.ui-jqgrid-jquery-ui.ui-jqdialog .form-view-data>span{border-width:1px;border-style:solid;border-color:inherit;border-radius:3px;display:block;padding:.2em}.ui-jqgrid-jquery-ui.ui-jqdialog .form-view-label>label{font-weight:700}.ui-jqgrid-bootstrap.ui-jqdialog .ui-jqdialog-content .form-view-data>span{height:100%;width:auto}.ui-jqdialog .fm-button{display:inline-block;padding:.4em .5em;text-decoration:none;cursor:pointer;position:relative;text-align:center;zoom:1}.ui-jqdialog.ui-jqgrid-bootstrap .navButton .fm-button{padding:.375em .75em;margin-left:.125em}.ui-jqdialog .fm-button>span{display:inline-block;vertical-align:middle}.ui-jqdialog .fm-button .fm-button-text{padding:0 .2em}.ui-jqdialog .EditButton-ltr .fm-button-icon-left .fm-button-icon{margin-right:.2em}.ui-jqdialog .EditButton-ltr .fm-button-icon-right .fm-button-icon{margin-left:.2em}.ui-jqdialog .EditButton-rtl .fm-button-icon-right .fm-button-icon{margin-right:.2em}.ui-jqdialog .EditButton-rtl .fm-button-icon-left .fm-button-icon{margin-left:.2em}.delmsg{padding:.5em}.ui-jqgrid .selected-row,.ui-jqgrid .selected-row td{font-style:normal;border-left:0 none}.ui-jqgrid .jqgrow .ui-jqgrid-actions{display:inline-block;vertical-align:middle;margin:0}.jqgrow .ui-jqgrid-actions .ui-pg-div{cursor:pointer;float:left;margin:0 1px}.ui-jqgrid .tree-wrap{display:inline-block;vertical-align:middle;white-space:nowrap;overflow:hidden}.ui-jqgrid .treeclick{cursor:pointer;display:inline-block;vertical-align:middle;width:18px;overflow:hidden}.ui-jqgrid .ui-jqgrid-bdiv .jqgroup .tree-wrap{text-align:center;padding-left:.1em}.ui-jqgrid .ui-jqgrid-bdiv .jqgroup .tree-wrap.glyphicon{margin-top:-.18em}* iframe.jqm{position:absolute;top:0;left:0;z-index:-1}.ui-jqgrid-dnd tr td{border-right-width:1px;border-right-color:inherit;border-right-style:solid;height:20px}.ui-jqgrid .ui-jqgrid-caption-rtl{text-align:right}.ui-jqgrid .ui-jqgrid-hbox-rtl{float:right;padding-left:20px}.ui-jqgrid .ui-jqgrid-resize-ltr{right:0;margin:0}.ui-jqgrid .ui-jqgrid-resize-rtl{left:0;margin:0}.ui-jqgrid .ui-sort-rtl{left:0}.ui-jqgrid .cell-wrapper,.ui-jqgrid .cell-wrapperleaf{display:inline-block;vertical-align:middle}.ui-jqgrid .ui-ellipsis{-moz-text-overflow:ellipsis;text-overflow:ellipsis}.ui-search-menu{position:absolute;padding:.2em}.ui-search-menu.ui-menu .ui-jqgrid-menu-item{list-style-image:none;padding-right:0;padding-left:0}.ui-search-menu.ui-menu .ui-jqgrid-menu-item a{text-decoration:none;display:block}.ui-search-toolbar>.ui-th-column>div{position:relative;height:auto;overflow:hidden}.ui-search-toolbar .ui-search-table{padding:0;border:0 none;height:20px;width:100%}.table-hover .ui-search-table tbody tr:hover{background-color:inherit}.ui-jqgrid .ui-jqgrid-htable .ui-search-toolbar th{padding:0 .1em}.ui-search-toolbar .ui-search-table .ui-search-oper{width:20px;text-align:center}.ui-search-toolbar .ui-th-column .ui-search-table .ui-search-input{padding:0 .1em}.ui-search-input input[type=text]{width:100%}a.clearsearchclass,a.g-menu-item,a.soptclass{text-decoration:none;cursor:pointer}.ui-search-menu .ui-jqgrid-menu-item .g-menu-item{padding:.2em}.ui-menu-jqueryui .ui-jqgrid-menu-item .g-menu-item:not(.ui-state-hover){border:1px solid transparent}.ui-menu-jqueryui .ui-jqgrid-menu-item .g-menu-item:hover{font-weight:400}.ui-search-oper{padding:0}.ui-search-clear{text-align:center;padding:0}.ui-search-clear .clearsearchclass,.ui-search-oper .soptclass{padding:.1em;line-height:1em}.ui-jqgrid-jquery-ui .ui-search-clear .clearsearchclass:not(.ui-state-hover),.ui-jqgrid-jquery-ui .ui-search-oper .soptclass:not(.ui-state-hover){border:1px solid transparent}.ui-search-clear .clearsearchclass span{position:relative}.ui-search-input{text-align:center}.ui-jqgrid .ui-search-table .ui-search-input>input[type=text],.ui-jqgrid .ui-search-table .ui-search-input>select{display:block;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.ui-jqgrid>.ui-jqgrid-view button,.ui-jqgrid>.ui-jqgrid-view input,.ui-jqgrid>.ui-jqgrid-view select,.ui-jqgrid>.ui-jqgrid-view textarea{font-size:inherit;text-align:inherit}.ui-jqgrid .s-ico>.ui-grid-ico-sort.glyphicon{font-size:10px}.ui-jqgrid .s-ico>.ui-icon-asc.glyphicon{margin-top:-.23em}.ui-jqgrid .s-ico>.ui-icon-desc.glyphicon{margin-top:-.34em}.ui-jqgrid .s-ico>.ui-grid-ico-sort.fa{width:.63em}.ui-jqgrid .s-ico>.ui-icon-asc.fa{line-height:.81em;top:.07em}.ui-jqgrid .s-ico>.ui-icon-desc.fa{line-height:.81em;top:-.81em}.ui-jqgrid .s-ico>.ui-icon-asc.fa.ui-sort-ltr,.ui-jqgrid .s-ico>.ui-icon-desc.fa.ui-sort-ltr{left:0}.ui-jqgrid .s-ico>.ui-icon-asc.fa.ui-sort-rtl,.ui-jqgrid .s-ico>.ui-icon-desc.fa.ui-sort-rtl{right:0}.ui-jqgrid .s-ico>.ui-state-disabled.fa{padding:0}.jqgrow .ui-pg-div>span.fa{font-weight:400;font-size:12px;vertical-align:baseline;background:0 0;border:0 none}.ui-subgrid>.subgrid-cell span.fa{font-weight:400;font-size:12px;text-indent:0;background:0 0;border:0 none;margin-bottom:4px}.jqgrow>.ui-sgcollapsed span.fa{font-weight:400;font-size:12px;text-indent:0;background:0 0;border:0 none;margin:0}.ui-jqgrid .ui-resizable-se.fa{-webkit-filter:alpha(opacity=40);-moz-filter:alpha(opacity=40);-o-filter:alpha(opacity=40);-ms-opacity:.4;opacity:.4;background:0 0;border-style:none;right:-3px;font-weight:400}.ui-jqgrid-ltr .ui-resizable-se.fa{right:-3px;bottom:0}.ui-jqgrid-rtl .ui-resizable-se.fa{left:0;bottom:1px}.jqContextMenu .ui-menu .ui-jqgrid-menu-item a.ui-state-hover{font-weight:400;margin:-1px}.jqContextMenu .ui-menu .ui-jqgrid-menu-item.ui-state-hover{font-weight:400;margin:-1px}.jqContextMenu .ui-menu-icons>.ui-jqgrid-menu-item{font-size:11px}.ui-jqgrid-showHideColumnMenu .ui-jqgrid-menu-item:hover{font-weight:400}.ui-jqgrid-disablePointerEvents{pointer-events:none}.ui-jqgrid.ui-jqgrid-bootstrap{border:1px solid #ddd;-ms-border-radius:6px;border-radius:6px}.ui-jqgrid.ui-jqgrid-bootstrap>.ui-jqgrid-view>.ui-jqgrid-toppager{border-bottom-left-radius:0;border-bottom-right-radius:0}.ui-jqgrid.ui-jqgrid-bootstrap>.ui-jqgrid-view>.ui-userdata{background-color:#f0f0f0}.ui-jqgrid.ui-jqgrid-bootstrap .ui-jqgrid-hdiv,.ui-jqgrid.ui-jqgrid-bootstrap .ui-jqgrid-legacy-subgrid>thead{background-color:#e5e5e5}.ui-jqgrid.ui-jqgrid-bootstrap>.ui-jqgrid-view>.ui-jqgrid-sdiv td{background-color:#f9f9f9}.ui-jqdialog.ui-jqgrid-bootstrap>.modal-dialog{margin-top:0}.ui-jqdialog.ui-jqgrid-bootstrap .ui-jqdialog-titlebar .ui-jqdialog-title,.ui-jqgrid.ui-jqgrid-bootstrap .ui-jqgrid-errorbar .ui-jqgrid-error,.ui-jqgrid.ui-jqgrid-bootstrap .ui-jqgrid-titlebar .ui-jqgrid-title{font-size:16px}.ui-jqgrid.ui-jqgrid-bootstrap>.ui-jqgrid-view{font-size:12px}.ui-jqgrid.ui-jqgrid-bootstrap>.ui-jqgrid-pager .fa,.ui-jqgrid.ui-jqgrid-bootstrap>.ui-jqgrid-view .fa{font-size:14px}.ui-jqdialog.ui-jqgrid-bootstrap{font-size:14px}.ui-jqdialog.ui-jqgrid-bootstrap .ui-jqdialog-content .CaptionTD{padding:.5em}.ui-jqgrid.ui-jqgrid-bootstrap .frozen-bdiv.ui-jqgrid-bdiv .ui-jqgrid-btable{background-color:#fff}.ui-jqgrid.ui-jqgrid-bootstrap tr.jqfoot>td,.ui-jqgrid.ui-jqgrid-bootstrap tr.jqgfirstrow>td,.ui-jqgrid.ui-jqgrid-bootstrap tr.jqgroup>td,.ui-jqgrid.ui-jqgrid-bootstrap tr.jqgrow>td{padding:.2em .3em}.ui-jqgrid.ui-jqgrid-bootstrap tr.jqgfirstrow>td{padding:0 .3em}.ui-jqgrid.ui-jqgrid-bootstrap tr.jqgfirstrow>td.td_cbox,.ui-jqgrid.ui-jqgrid-bootstrap tr.jqgrow>td.td_cbox{padding:0}.ui-jqgrid.ui-jqgrid-bootstrap .jqgrow>td>.cbox{height:18px;width:18px;display:inline-block;vertical-align:middle;text-align:center}.ui-jqgrid.ui-jqgrid-bootstrap .ui-jqgrid-btable td.jqgrid-rownum{padding:.2em .3em}.ui-jqdialog.ui-jqgrid-bootstrap .ui-jqdialog-titlebar,.ui-jqgrid.ui-jqgrid-bootstrap .ui-jqgrid-caption{background-color:#cacaca;-ms-border-top-left-radius:6px;border-top-left-radius:6px;-ms-border-top-right-radius:6px;border-top-right-radius:6px}.modal-backdrop.jqgrid-overlay{-ms-opacity:.35;opacity:.35;-webkit-filter:Alpha(Opacity=35);-moz-filter:Alpha(Opacity=35);-o-filter:Alpha(Opacity=35);filter:Alpha(Opacity=35)}.ui-jqdialog.ui-jqgrid-bootstrap .ui-jqdialog-content{border:0;padding:.3em .2em;background:#fff;height:auto}.ui-jqdialog.ui-jqgrid-bootstrap .modal-dialog{width:auto}.ui-jqdialog.ui-widget{overflow:hidden}.ui-jqdialog .ui-resizable-handle{cursor:se-resize;position:absolute;-ms-touch-action:none;touch-action:none}.ui-jqdialog.ui-jqgrid-bootstrap .modal-content{overflow:hidden}.ui-jqdialog.ui-jqgrid-bootstrap .modal-content>.ui-resizable-handle.fa{bottom:1px;right:1px;height:12px;width:12px}.ui-jqdialog.ui-jqgrid-bootstrap .modal-content>.ui-resizable-handle.glyphicon{right:-.4em}.ui-jqgrid.ui-jqgrid-bootstrap .disabled{opacity:.35;filter:Alpha(Opacity=35)}.ui-jqgrid-bootstrap.ui-jqgrid-resize-mark{border:1px solid #aaa;background-color:#ccc;color:#222;font-weight:700}.ui-jqgrid .jqgfirstrow{border-bottom:0 none;border-top:0 none;height:0}.ui-jqgrid.ui-jqgrid-bootstrap .jqgfirstrow td{border-bottom:0 none;border-top:0 none}.ui-jqgrid.ui-jqgrid-bootstrap .ui-pg-table .ui-pg-button.ui-state-disabled:hover{margin:0}.ui-jqgrid.ui-jqgrid-bootstrap .navtable .ui-pg-button.ui-state-disabled:hover{margin:0}.ui-jqgrid.ui-jqgrid-bootstrap .ui-pg-table .ui-pg-button{margin:.2em 0;padding:.2em 0;border-radius:.4em}.ui-search-input .form-control:not([size]):not([multiple]){height:auto;min-height:18px}.ui-search-input input[type=text]{padding:0}.ui-search-input input[type=text].form-control{padding:0 .3em}.ui-search-input select.form-control{padding:0}.ui-search-input input[type=checkbox].form-control{width:auto;margin-left:auto;margin-right:auto;border-radius:0;background:0 transparent}.ui-jqgrid.ui-jqgrid-bootstrap .ui-jqgrid-actions .ui-pg-div.btn{padding:0;margin:0;box-shadow:none}.ui-jqgrid.ui-jqgrid-bootstrap .ui-jqgrid-actions .ui-pg-div.btn:not(:first-child){margin-left:.125em}.ui-jqgrid.ui-jqgrid-bootstrap .ui-jqgrid-actions .ui-pg-div.btn.ui-inline-save{margin-left:0}.ui-jqgrid.ui-jqgrid-bootstrap tr.jqgrow .sgbutton-div .sgbutton.btn{padding:0;cursor:pointer;border:1px solid transparent;margin:-.3em -.3em}.ui-jqgrid.ui-jqgrid-bootstrap .sgbutton-div .sgbutton.btn:focus,.ui-jqgrid.ui-jqgrid-bootstrap .sgbutton-div .sgbutton.btn:hover{border:1px solid #333}.ui-jqdialog.ui-jqgrid-bootstrap .ui-jqdialog-content{border-top-left-radius:0;border-top-right-radius:0}.ui-jqgrid.ui-jqgrid-bootstrap .ui-pager-control .ui-pg-input{display:inline-block;font-size:12px;padding:.3em}.ui-jqgrid.ui-jqgrid-bootstrap>.ui-jqgrid-pager{font-size:12px}.ui-jqgrid.ui-jqgrid-bootstrap .ui-jqgrid-bootstrap-corner-top{border-top-left-radius:6px;border-top-right-radius:6px}.ui-jqgrid.ui-jqgrid-bootstrap .ui-jqgrid-bootstrap-corner-bottom{border-bottom-left-radius:6px;border-bottom-right-radius:6px}.ui-jqgrid.ui-jqgrid-bootstrap .ui-pager-control .ui-pg-selbox{font-size:12px;padding:0}.ui-jqdialog.ui-jqgrid-bootstrap .FormData .CaptionTD{font-size:14px}.FormData .DataTD{vertical-align:middle}.FormData .DataTD input[type=checkbox]{width:auto;vertical-align:middle}.ui-jqdialog.ui-jqgrid-bootstrap .FormData .DataTD input.form-control[type=checkbox]{width:2.193em;height:2.193em}.DelTable .delmsg{padding:.2em}.queryresult{margin-bottom:.5em;padding:.25em}.group.modal-content tr td{padding:.2em .1em}.searchFilter .form-control{padding:.1em}.searchFilter .form-control:not([size]):not([multiple]){height:2em}.searchFilter .btn{margin-left:.125em;padding:.2em .375em}.ui-jqgrid .searchFilter table.group td{padding:1px}.ui-jqgrid .searchFilter table{border-spacing:2px}.ui-jqdialog.ui-jqgrid-bootstrap .modal-header .close{margin-top:-.7em}.ui-jqdialog .glyphicon,.ui-jqgrid .glyphicon{font-size:12px;top:auto}.ui-jqdialog.ui-jqgrid-bootstrap .glyphicon,.ui-jqgrid.ui-jqgrid-bootstrap .glyphicon{font-size:14px;top:auto;height:1em;width:1.28em}.ui-jqgrid .ui-pg-button span.glyphicon{display:inline-block;text-align:center;vertical-align:middle}.ui-jqgrid-actions .glyphicon{padding:.1em}.ui-jqgrid.ui-jqgrid-bootstrap .ui-jqgrid-titlebar>.ui-jqgrid-titlebar-close>span.glyphicon{margin-top:-.125em;margin-left:-.275em}.ui-jqdialog.ui-jqgrid-bootstrap .ui-jqdialog-titlebar>.ui-jqdialog-titlebar-close>span.glyphicon{margin-top:-.1em;margin-left:-.28em}.tree-wrap>.treeclick{line-height:1}.tree-wrap>.treeclick.glyphicon{margin-top:-.2em;font-size:12px}.subgrid-data .ui-jqgrid-bootstrap .ui-jqgrid-bdiv .ui-jqgrid-btable,.subgrid-data .ui-jqgrid-bootstrap .ui-jqgrid-hdiv .ui-jqgrid-htable{background-color:transparent}.subgrid-data .ui-jqgrid-legacy-subgrid{margin:0} /*# sourceMappingURL=ui.jqgrid.min.css.map */prewikka-5.1.1/prewikka/htdocs/css/ui.jqgrid.min.css.map0000664000175000017500000002634213555143652024614 0ustar tandrejatandreja00000000000000{"version":3,"sources":["ui.jqgrid.css"],"names":[],"mappings":"AAAA;;;AAMA,WACC,SAAU,SACV,gBAAiB,YACjB,mBAAoB,YACpB,WAAY,YACZ,iBAAkB,KAClB,aAAc,aAEf,eACC,YAAa,OAEd,iBACC,gBAAiB,SACjB,eAAgB,EAChB,aAAc,EACd,aAAc,KAEf,oBACC,QAAS,EAEV,2BACC,SAAU,SACV,gBAAiB,WACjB,mBAAoB,WACpB,WAAY,WACZ,KAAM,EACN,IAAK,EACL,QAAS,EACT,UAAW,KAEZ,6BAEA,kCADA,mCAEC,mBAAoB,QACpB,gBAAiB,QACjB,WAAY,QAMb,mCADA,+BADA,+BAGC,QAAS,KAAK,KAAK,KAAK,KACxB,SAAU,SACV,UAAW,KACX,YAAa,EAAE,KACf,aAAc,EAAE,KAChB,WAAY,EAAE,KAEf,oBACC,WAAY,MACZ,cAAe,EACf,SAAU,KAEX,8BACA,mCACC,WAAY,KAEb,kCACA,mCACC,WAAY,MAIb,kDADA,8CAEC,eAAgB,OAChB,WAAY,OACZ,gBAAiB,KACjB,SAAU,SACV,IAAK,IACL,MAAO,MACP,YAAa,MACb,UAAW,KACX,OAAQ,MAAO,EAAE,EAAE,EACnB,QAAS,KACT,OAAQ,IAAI,MAAM,YAClB,OAAQ,MACR,OAAQ,QACR,mBAAoB,WACpB,gBAAiB,WACjB,WAAY,WACZ,iBAAkB,aAClB,aAAc,aACd,oBAAqB,KACrB,iBAAkB,KAClB,gBAAiB,KACjB,YAAa,KAGd,uEACC,OAAQ,KAAK,EAAE,EAAE,EAElB,wDACC,MAAO,KAER,4DACC,KAAM,KAEP,mEACC,MAAO,KAER,mEACC,KAAM,KAGP,kDADA,8CAEC,kBAAmB,KACnB,cAAe,KAKhB,0DAFA,+CACA,oDAEC,SAAU,SACV,KAAM,KAIP,0DAFA,mDACA,oDAEC,SAAU,SACV,MAAO,KAER,mDACC,WAAY,EACZ,YAAa,EAGd,uDADA,mDAEC,QAAS,MAGV,+DADA,2DAEC,SAAU,SACV,IAAK,KAGN,mEADA,qEAEC,MAAO,IAGR,sEACC,WAAY,KAGb,iEACA,wEAGC,UAAW,KACX,WAAY,KAEb,iEACC,YAAa,KAEd,wEACC,YAAa,KAEd,uDACC,WAAY,KAEb,iEACC,WAAY,OACZ,YAAa,OAId,kCACC,MAAO,KACP,OAAQ,KAET,qCACC,OAAQ,IACR,MAAO,KAER,4CACC,MAAO,KACP,OAAQ,OAIT,2CACC,SAAU,SACV,OAAQ,EACR,QAAS,EACT,SAAU,OACV,YAAa,EAAE,KACf,WAAY,EAAE,KACd,aAAc,EAAE,KAChB,OAAQ,KAET,2BACC,MAAO,KACP,cAAe,KAEhB,6BACC,aAAc,MACd,OAAQ,EAET,gCACC,OAAQ,KACR,QAAS,EAAE,IAAI,EAAE,IAElB,iDACC,cAAe,EAAE,KACjB,WAAY,EAAE,KAEf,0CACC,QAAS,EAEV,sDACC,SAAU,OACV,SAAU,SACV,OAAQ,KACR,OAAQ,IAAI,IAEb,4DACC,eAAgB,OAEjB,8DACC,WAAY,OACZ,eAAgB,SAChB,OAAQ,EAGT,6CACA,oDAFA,uCAGC,SAAU,OACV,YAAa,OACb,WAAY,OAEb,uCACC,eAAgB,OAChB,OAAQ,KACR,eAAgB,OAChB,WAAY,EAAE,KAEf,6CACC,SAAU,SACV,eAAgB,OAChB,WAAY,EAAE,KACd,cAAe,EAAE,KAGlB,0CADA,WAEC,YAAa,EAAE,KAGhB,0CADA,WAEC,aAAc,EAAE,KAEjB,iBACC,aAAc,IAAI,MAEnB,iBACC,YAAa,IAAI,MAElB,yBACC,YAAa,OACb,KAAM,EACN,OAAQ,KAET,oCACC,OAAQ,IAAI,EAEb,+BACC,OAAQ,KACR,OAAQ,QACR,WAAY,OACZ,eAAgB,OAEjB,mDACC,OAAQ,KACR,MAAO,KAER,6CACC,YAAa,KACb,aAAc,KAEf,6DACC,IAAK,EACL,OAAQ,KACR,MAAO,KACP,SAAU,SACV,OAAQ,WACR,sBAAuB,KACvB,gBAAiB,KACjB,iBAAkB,UAClB,oBAAqB,KACrB,YAAa,KACb,QAAS,OACT,SAAU,OAEX,uEACC,kBAAmB,iBAAiB,cAAc,eAClD,eAAgB,iBAAiB,cAAc,SAC/C,aAAc,iBAAiB,cAAc,eAC7C,cAAe,iBAAiB,cAAc,eAC9C,UAAW,iBAAiB,cAAc,eAC1C,iBAAkB,OAAO,OACzB,OAAQ,EACR,KAAM,IAGP,6BACC,SAAU,OACV,SAAU,SACV,QAAS,OAEV,kBAQC,OAAQ,QAET,oCACC,OAAQ,kBAET,kBACC,SAAU,SACV,MAAO,MACP,OAAQ,QACR,QAAS,aACT,eAAgB,OAChB,OAAQ,EAAE,KAEX,oCACC,QAAS,MACT,SAAU,SAEX,4CACC,MAAO,KACP,WAAY,EAEb,uCACC,IAAK,KAEN,wCACC,IAAK,MAEN,wCACI,oBAAqB,MAAM,MAE/B,uCACC,YAAa,KAEd,uCACC,aAAc,EAEf,0CACC,SAAU,SACV,KAAM,MACN,IAAK,EACL,UAAW,IACX,eAAgB,MAGjB,6BACC,OAAQ,QAET,gDACC,OAAQ,QAET,8CACC,iBAAkB,IAClB,iBAAkB,MAEnB,4DACC,iBAAkB,IAClB,iBAAkB,MAEnB,oDACC,OAAQ,IAAI,EAAE,EAAE,EAEjB,qDACC,OAAQ,IAAI,EAAE,EAAE,EAIjB,2BACC,WAAY,IACZ,SAAU,SACV,OAAQ,EACR,QAAS,EACT,SAAU,KACV,WAAY,KAEb,6BACC,aAAc,MACd,OAAQ,EACR,cAAe,KACf,OAAQ,IAGT,sBADA,qBAEC,cAAe,KAIhB,wBADA,yBADA,wBAGA,4BACA,+BACC,SAAU,OACV,YAAa,IACb,eAAgB,OAChB,WAAY,OACZ,OAAQ,KACR,WAAY,EAAE,KACd,oBAAqB,IACrB,oBAAqB,MAItB,4CADA,6CADA,4CAGA,gDACC,oBAAqB,QAItB,wBADA,yBADA,wBAGC,QAAS,EAAE,IAAI,EAAE,IAElB,4BACC,QAAS,EAEV,6BACC,QAAS,EAAE,IAAI,EAAE,IACjB,WAAY,EAAE,KACd,YAAa,EAAE,KACf,OAAQ,EACR,mBAAoB,IACpB,mBAAoB,MACpB,cAAe,EAAE,KAElB,iDACC,mBAAoB,QAErB,qCACC,QAAS,EAIV,wBADA,yBADA,wBAGC,YAAa,IAEd,wBACC,YAAa,IAEd,4CACC,WAAY,KACZ,kBAAmB,EACnB,kBAAmB,KACnB,mBAAoB,IACpB,mBAAoB,MAErB,gEACC,aAAc,QAEf,4CACC,WAAY,MACZ,mBAAoB,EACpB,mBAAoB,KACpB,kBAAmB,IACnB,kBAAmB,MAEpB,gEACC,aAAc,QAEf,8CACC,QAAS,EAAE,IAAI,EAAE,IACjB,OAAQ,EACR,aAAc,EACd,aAAc,KAEf,8CACC,oBAAqB,IACrB,oBAAqB,MAEtB,kEACC,oBAAqB,QAEtB,8BACC,QAAS,EACT,WAAY,OACZ,eAAgB,OAEjB,qCACC,WAAY,OACZ,eAAgB,OAEjB,gCACC,QAAS,EAEV,4BACC,OAAQ,KACR,MAAO,KACP,OAAQ,QACR,WAAY,OACZ,eAAgB,OAEjB,kCACA,4BACC,MAAO,EACP,KAAM,EACN,OAAQ,WACR,sBAAuB,KACvB,gBAAiB,KACjB,iBAAkB,UAClB,oBAAqB,KACrB,YAAa,KACb,SAAU,SACV,IAAK,EACL,SAAU,OACV,QAAS,KACT,kBAAmB,IACnB,mBAAoB,IACpB,QAAS,MAGV,4BACC,OAAQ,YACR,QAAS,YAIV,2CACC,SAAU,SACV,OAAQ,EACR,QAAS,EACT,SAAU,OACV,YAAa,EAAE,KACf,WAAY,EAAE,KACd,aAAc,EAAE,KAEjB,6BACC,aAAc,MACd,cAAe,EAEhB,yBACC,YAAa,IACb,SAAU,OACV,YAAa,OACb,OAAQ,KACR,QAAS,EAAE,IAAI,EAAE,IACjB,iBAAkB,IAClB,iBAAkB,MAClB,oBAAqB,IACrB,oBAAqB,MAEtB,6CACC,iBAAkB,QAClB,oBAAqB,QAEtB,6BACC,WAAY,KACZ,kBAAmB,EACnB,kBAAmB,KACnB,mBAAoB,IACpB,mBAAoB,MAErB,iDACC,aAAc,QAEf,6BACC,WAAY,MACZ,kBAAmB,IACnB,kBAAmB,MACnB,mBAAoB,EACpB,mBAAoB,KAErB,iDACC,aAAc,QAIf,4BACC,OAAQ,EAAE,KACV,OAAQ,EACR,QAAS,EACT,SAAU,SACV,gBAAiB,WACjB,mBAAoB,WACpB,WAAY,WACZ,OAAQ,KACR,WAAY,KACZ,SAAU,OACV,UAAW,KAEZ,8BAEA,mCADA,oCAEC,mBAAoB,QACpB,gBAAiB,QACjB,WAAY,QAGb,8CADA,iDAEC,SAAU,SACV,YAAa,EACb,cAAe,EACf,WAAY,EAEb,qCACC,WAAY,KAEb,uCACC,WAAY,OACZ,YAAa,IAEd,sCACC,WAAY,MAEb,wBACC,SAAU,SACV,QAAS,EACT,MAAO,KACP,OAAQ,EAET,2BACC,WAAY,QACZ,aAAc,KAEf,8CACA,gFACC,OAAQ,IAAI,MAAM,YAEnB,+BACC,aAAc,QAMf,qDACA,4CAFA,4CAFA,wCACA,+BAFA,+BAMC,aAAc,MACd,aAAc,QAEf,2BACC,YAAa,IACb,eAAgB,OAChB,QAAS,IAEV,2CACC,QAAS,aACT,OAAQ,KAET,8BACC,QAAS,MACT,OAAQ,IACR,MAAO,KAER,qCACA,sCACC,OAAQ,KACR,MAAO,KACP,OAAQ,EACR,YAAa,QAEd,6DACC,OAAQ,KAET,sCACC,QAAS,MACT,QAAS,IAEV,yBACC,OAAQ,KACR,YAAa,IAAI,MAAM,KACvB,aAAc,IAAI,MAAM,KACxB,OAAQ,KACR,MAAO,MAER,2BACC,YAAa,IACb,OAAQ,KACR,OAAQ,EAAE,KAAK,EAAE,KACjB,QAAS,OAEV,uCACC,QAAS,IAAI,EACb,MAAO,KACP,SAAU,SAEX,0CACC,OAAQ,QAET,oDACC,MAAO,KACP,OAAQ,EAAE,IAEX,oBACA,qBACA,uBACC,OAAQ,EAET,uBACC,MAAO,KACP,OAAQ,KAET,+CACC,YAAa,EAAE,KACf,aAAc,EAAE,KAChB,WAAY,EAAE,KACd,OAAQ,EACR,QAAS,EACT,SAAU,SACV,OAAQ,KACR,WAAY,KACZ,SAAU,OAEX,0CACC,QAAS,IAAI,EACb,MAAO,KACP,SAAU,SAEX,6CACC,OAAQ,QAET,uDACC,MAAO,KACP,OAAQ,EAAE,IAIX,sCACC,OAAQ,IACR,eAAgB,OAEjB,uDACC,aAAc,KACd,cAAe,KAGhB,2DADA,kDAEC,YAAa,IAEd,sBACC,WAAY,OACZ,eAAgB,OAChB,QAAS,aAEV,iEACC,YAAa,KACb,aAAc,KACd,MAAO,KAIR,mCACC,gBAAiB,YACjB,mBAAoB,YACpB,WAAY,YAEb,mDACI,gBAAiB,WACpB,mBAAoB,WACpB,WAAY,WAEb,qDACC,WAAY,OACZ,eAAgB,OAEjB,kDACC,QAAS,aAEV,uBACC,OAAQ,EACR,QAAS,EACT,MAAO,KAER,UACC,OAAQ,QAET,6BACC,aAAc,MAEf,2CACC,OAAQ,KACR,WAAY,EAAE,KACd,oBAAqB,IACrB,oBAAqB,MAEtB,+DACC,oBAAqB,QAEtB,0BACC,OAAQ,KAET,qDACC,MAAO,MAER,qDACC,MAAO,KAIR,oBACC,SAAU,SACV,IAAK,IACL,KAAM,IACN,MAAO,KACP,QAAS,IACT,QAAS,IACT,OAAQ,IACR,WAAY,OACZ,YAAa,IACb,QAAS,KACT,aAAc,IACd,UAAW,KAEZ,2BACC,QAAS,KACT,QAAS,IAEV,yBACC,SAAU,SACV,IAAK,EACL,KAAM,EACN,QAAS,GAIV,wCACC,YAAa,EAAE,KACf,aAAc,EAAE,KAChB,OAAQ,KACR,SAAU,OAIX,wBACC,UAAW,KAEZ,aACC,QAAS,KACT,MAAO,MACP,SAAU,SACV,UAAW,KACX,SAAU,QAEX,iCACC,QAAS,KAEV,2BACC,MAAO,KACP,KAAM,KAGP,kCADA,qBAEC,OAAQ,EACR,QAAS,KAAK,KACd,WAAY,IACZ,OAAQ,KAET,2BACC,QAAS,KAAK,IACd,aAAc,IACd,SAAU,SACV,OAAQ,KACR,MAAO,KACP,SAAU,QACV,QAAS,KACT,OAAQ,KACR,MAAO,MACP,WAAY,OAGb,8BADA,4BAEC,OAAQ,KACR,MAAO,KAIR,+BACC,OAAQ,EAET,gCACC,MAAO,KACP,cAAe,EAEhB,+BACC,MAAO,KACP,cAAe,EAEhB,oBACA,qBACA,uBACC,OAAQ,EAET,uBACC,MAAO,KACP,OAAQ,KAET,mCACC,WAAY,EAAE,KACd,YAAa,EAAE,KACf,aAAc,EAAE,KAChB,QAAS,IAAI,EAEd,uCACC,WAAY,MAEb,uCACC,WAAY,KAEb,kCACC,WAAY,KACZ,YAAa,EAAE,KACf,WAAY,EAAE,KACd,aAAc,EAAE,KAChB,QAAS,IAAI,EAEd,sCACC,WAAY,KAEb,iDACC,MAAO,KAER,sCACC,WAAY,MAEb,iDACC,MAAO,MAER,kCACC,MAAO,KACP,WAAY,WAEb,uCACA,wCACC,QAAS,KAEV,gCACC,YAAa,KACb,OAAQ,EAAE,KAEX,gCACC,eAAgB,OAChB,OAAQ,EAAE,KACV,QAAS,IACT,YAAa,OAEd,6BACC,QAAS,IACT,aAAc,EACd,aAAc,KACd,eAAgB,IAKjB,sDACC,aAAc,IACd,aAAc,MACd,aAAc,QACd,cAAe,IACf,QAAS,MACT,QAAS,KAEV,wDACC,YAAa,IAEd,2EACC,OAAQ,KACR,MAAO,KAER,wBACC,QAAS,aACT,QAAS,KAAK,KACd,gBAAiB,KACjB,OAAQ,QACR,SAAU,SACV,WAAY,OACZ,KAAM,EAEP,uDACC,QAAS,OAAO,MAChB,YAAa,OAEd,6BACC,QAAS,aACT,eAAgB,OAEjB,wCACC,QAAS,EAAE,KAEZ,kEACC,aAAc,KAEf,mEACC,YAAa,KAEd,mEACC,aAAc,KAEf,kEACC,YAAa,KAEd,QACC,QAAS,KAGV,yBACA,4BACC,WAAY,OACZ,YAAa,EAAE,KAIhB,sCACC,QAAS,aACT,eAAgB,OAChB,OAAQ,EAET,sCACC,OAAQ,QACR,MAAO,KACP,OAAQ,EAAE,IAGX,sBACC,QAAS,aACT,eAAgB,OAChB,YAAa,OACb,SAAU,OAEX,sBACC,OAAQ,QACR,QAAS,aACT,eAAgB,OAChB,MAAO,KACP,SAAU,OAEX,+CACC,WAAY,OACZ,aAAc,KAEf,yDACC,WAAY,OAIb,aACC,SAAU,SACV,IAAK,EACL,KAAM,EACN,QAAS,GAEV,qBACC,mBAAoB,IACpB,mBAAoB,QACpB,mBAAoB,MACpB,OAAQ,KAIT,kCACC,WAAY,MAEb,+BACC,MAAO,MACP,aAAc,KAEf,iCACC,MAAO,EACP,OAAQ,EAET,iCACC,KAAM,EACN,OAAQ,EAET,wBACC,KAAM,EAGP,yBADA,6BAEC,QAAS,aACT,eAAgB,OAEjB,wBACC,mBAAoB,SACpB,cAAe,SAIhB,gBACC,SAAU,SACV,QAAS,KAEV,6CACC,iBAAkB,KAClB,cAAe,EACf,aAAc,EAEf,+CACC,gBAAiB,KACjB,QAAS,MAEV,qCACC,SAAU,SACV,OAAQ,KACR,SAAU,OAEX,oCACC,QAAS,EACT,OAAQ,EAAE,KACV,OAAQ,KACR,MAAO,KAER,6CACI,iBAAkB,QAEtB,mDACC,QAAS,EAAE,KAEZ,oDACC,MAAO,KACP,WAAY,OAEb,mEACC,QAAS,EAAE,KAEZ,kCACC,MAAO,KAIR,mBAFA,cACA,YAEC,gBAAiB,KACjB,OAAQ,QAET,kDACC,QAAS,KAEV,yEACC,OAAQ,IAAI,MAAM,YAEnB,0DACC,YAAa,IAGd,gBACC,QAAS,EAEV,iBACC,WAAY,OACZ,QAAS,EAGV,mCADA,2BAEC,QAAS,KACT,YAAa,IAGd,6EADA,qEAEC,OAAQ,IAAI,MAAM,YAEnB,wCACC,SAAU,SAEX,iBAAmB,WAAY,OAC/B,8DACA,oDACC,QAAS,MACT,gBAAiB,WACjB,mBAAoB,WACpB,WAAY,WAKb,kCAHA,iCACA,kCACA,oCAEC,UAAW,QACX,WAAY,QAGb,8CACC,UAAW,KAEZ,yCACC,WAAY,OAEb,0CACC,WAAY,OAGb,uCACC,MAAO,MAER,kCACC,YAAa,MACb,IAAK,MAEN,mCACC,YAAa,MACb,IAAK,OAEN,8CACA,+CACC,KAAM,EAEP,8CACA,+CACC,MAAO,EAER,wCACC,QAAS,EAEV,2BACC,YAAa,IACb,UAAW,KACX,eAAgB,SAChB,WAAY,IACZ,OAAQ,EAAE,KAEX,kCACC,YAAa,IACb,UAAW,KACX,YAAa,EACb,WAAY,IACZ,OAAQ,EAAE,KACV,cAAe,IAEhB,gCACC,YAAa,IACb,UAAW,KACX,YAAa,EACb,WAAY,IACZ,OAAQ,EAAE,KACV,OAAQ,EAET,+BACC,eAAgB,kBAChB,YAAa,kBACb,UAAW,kBAEX,YAAa,GACb,QAAS,GACT,WAAY,IACZ,aAAc,KACd,MAAO,KACP,YAAa,IAGd,mCACC,MAAO,KACP,OAAQ,EAET,mCACC,KAAM,EACN,OAAQ,IAIT,8DACC,YAAa,IACb,OAAQ,KAET,4DACC,YAAa,IACb,OAAQ,KAET,mDACC,UAAW,KAGZ,yDACC,YAAa,IAEd,gCACC,eAAgB,KAIjB,+BACC,OAAQ,IAAI,MAAM,KAClB,kBAAmB,IACnB,cAAe,IAEhB,mEACC,0BAA2B,EAC3B,2BAA4B,EAE7B,4DACC,iBAAkB,QAEnB,+CACA,+DACC,iBAAkB,QAEnB,kEACC,iBAAkB,QAEnB,+CACC,WAAY,EAIb,0EADA,oEADA,oEAGC,UAAW,KAEZ,+CACC,UAAW,KAGZ,oDADA,mDAEC,UAAW,KAEZ,iCACC,UAAW,KAEZ,iEACC,QAAS,KAEV,6EACC,iBAAkB,KAKnB,4CAHA,iDAEA,6CADA,4CAGC,QAAS,KAAK,KAEf,iDACC,QAAS,EAAE,KAEZ,yDACA,oDACC,QAAS,EAEV,gDACC,OAAQ,KACR,MAAO,KACP,QAAS,aACT,eAAgB,OAChB,WAAY,OAEb,kEACC,QAAS,KAAK,KAGf,uDADA,kDAEC,iBAAkB,QAClB,2BAA4B,IAC5B,uBAAwB,IACxB,4BAA6B,IAC7B,wBAAyB,IAG1B,+BACC,YAAa,IACb,QAAS,IACT,eAAgB,kBAChB,YAAa,kBACb,UAAW,kBACX,OAAQ,kBAGT,sDACC,OAAQ,EACR,QAAS,KAAK,KACd,WAAY,KACZ,OAAQ,KAET,+CACC,MAAO,KAER,uBACC,SAAU,OAEX,kCACC,OAAQ,UACR,SAAU,SACV,iBAAkB,KAClB,aAAc,KAEf,gDACC,SAAU,OAEX,wEACC,OAAQ,IACR,MAAO,IACP,OAAQ,KACR,MAAO,KAER,+EACC,MAAO,MAGR,yCACC,QAAS,IACT,OAAQ,kBAET,2CACC,OAAQ,IAAI,MAAM,KAClB,iBAAkB,KAClB,MAAO,KACP,YAAa,IAEd,wBACC,cAAe,EAAE,KACjB,WAAY,EAAE,KACd,OAAQ,EAET,+CACC,cAAe,EAAE,KACjB,WAAY,EAAE,KAEf,kFACC,OAAQ,EAET,+EACC,OAAQ,EAET,0DACC,OAAQ,KAAK,EACb,QAAS,KAAK,EACd,cAAe,KAEhB,2DACC,OAAQ,KACR,WAAY,KAEb,kCACC,QAAS,EAEV,+CACC,QAAS,EAAE,KAEZ,qCACC,QAAS,EAEV,mDACC,MAAO,KACP,YAAa,KACb,aAAc,KACd,cAAe,EACf,WAAY,EAAE,YAEf,iEACC,QAAS,EACT,OAAQ,EACR,WAAY,KAEb,mFACC,YAAa,OAEd,gFACC,YAAa,EAEd,qEACC,QAAS,EACT,OAAQ,QACR,OAAQ,IAAI,MAAM,YAClB,OAAQ,MAAM,MAEf,iEACA,iEACC,OAAQ,IAAI,MAAM,KAEnB,sDACC,uBAAwB,EACxB,wBAAyB,EAE1B,8DACC,QAAS,aACT,UAAW,KACX,QAAS,KAEV,gDACC,UAAW,KAEZ,+DACC,uBAAwB,IACxB,wBAAyB,IAE1B,kEACC,0BAA2B,IAC3B,2BAA4B,IAE7B,+DACC,UAAW,KACX,QAAS,EAEV,sDACC,UAAW,KAEZ,kBACC,eAAgB,OAEjB,uCACC,MAAO,KACP,eAAgB,OAEjB,qFACC,MAAO,QACP,OAAQ,QAET,kBACC,QAAS,KAEV,aACC,cAAe,KACf,QAAS,MAEV,2BACC,QAAS,KAAK,KAEf,4BACC,QAAS,KAEV,wDACC,OAAQ,IAET,mBACI,YAAa,OACb,QAAS,KAAK,OAElB,wCACC,QAAS,IAEV,+BACC,eAAgB,IAEjB,sDACC,WAAY,MAEb,wBACA,sBACC,UAAW,KACX,IAAK,KAEN,4CACA,0CACC,UAAW,KACX,IAAK,KACL,OAAQ,IACR,MAAO,OAER,wCACC,QAAS,aACT,WAAY,OAIZ,eAAgB,OAEjB,8BACC,QAAS,KAEV,4FACC,WAAY,QACZ,YAAa,QAEd,kGACC,WAAY,MACZ,YAAa,OAEd,sBACC,YAAa,EAEd,gCACC,WAAY,MACZ,UAAW,KAGZ,qEADA,qEAEI,iBAAkB,YAEtB,wCACC,OAAQ"}prewikka-5.1.1/prewikka/htdocs/css/ui.multiselect.min.css0000664000175000017500000000312513555143652025104 0ustar tandrejatandreja00000000000000.ui-multiselect{border:solid 1px;font-size:.8em}.ui-multiselect ul{-moz-user-select:none}.ui-multiselect li{margin:0;padding:0;cursor:default;line-height:20px;height:20px;font-size:11px;list-style:none}.ui-multiselect li a{color:#999;text-decoration:none;padding:0;display:block;float:left;cursor:pointer}.ui-multiselect li.ui-draggable-dragging{padding-left:10px}.ui-multiselect div.selected{position:relative;padding:0;margin:0;border:0;float:left}.ui-multiselect ul.selected{position:relative;padding:0;overflow:auto;overflow-x:hidden;background:#fff;margin:0;list-style:none;border:0;position:relative;width:100%}.ui-multiselect div.available{position:relative;padding:0;margin:0;border:0;float:left;border-left:1px solid}.ui-multiselect ul.available{position:relative;padding:0;overflow:auto;overflow-x:hidden;background:#fff;margin:0;list-style:none;border:0;width:100%}.ui-multiselect ul.available li{padding-left:10px}.ui-multiselect .ui-state-default{border:none;margin-bottom:1px;position:relative;padding-left:20px}.ui-multiselect .ui-state-hover{border:none}.ui-multiselect .ui-widget-header{border:none;font-size:11px;margin-bottom:1px}.ui-multiselect .add-all{float:right;padding:7px}.ui-multiselect .remove-all{float:right;padding:7px}.ui-multiselect .search{float:left;padding:4px}.ui-multiselect .count{float:left;padding:7px}.ui-multiselect li span.ui-icon-arrowthick-2-n-s{position:absolute;left:2px}.ui-multiselect li a.action{position:absolute;right:2px;top:2px}.ui-multiselect input.search{height:14px;padding:1px;opacity:.5;margin:4px;width:100px} /*# sourceMappingURL=ui.multiselect.min.css.map */prewikka-5.1.1/prewikka/htdocs/css/ui.multiselect.min.css.map0000664000175000017500000000172713555143652025666 0ustar tandrejatandreja00000000000000{"version":3,"sources":["ui.multiselect.css"],"names":[],"mappings":"AAGA,gBAAkB,OAAQ,MAAM,IAAK,UAAW,KAChD,mBAAqB,iBAAkB,KACvC,mBAAqB,OAAQ,EAAG,QAAS,EAAG,OAAQ,QAAS,YAAa,KAAM,OAAQ,KAAM,UAAW,KAAM,WAAY,KAC3H,qBAAuB,MAAO,KAAM,gBAAiB,KAAM,QAAS,EAAG,QAAS,MAAO,MAAO,KAAM,OAAQ,QAC5G,yCAA2C,aAAc,KAEzD,6BAA+B,SAAU,SAAU,QAAS,EAAG,OAAQ,EAAG,OAAQ,EAAG,MAAM,KAC3F,4BAA8B,SAAU,SAAU,QAAS,EAAG,SAAU,KAAM,WAAY,OAAQ,WAAY,KAAM,OAAQ,EAAG,WAAY,KAAM,OAAQ,EAAG,SAAU,SAAU,MAAO,KAGvL,8BAAgC,SAAU,SAAU,QAAS,EAAG,OAAQ,EAAG,OAAQ,EAAG,MAAM,KAAM,YAAa,IAAI,MACnH,6BAA+B,SAAU,SAAU,QAAS,EAAG,SAAU,KAAM,WAAY,OAAQ,WAAY,KAAM,OAAQ,EAAG,WAAY,KAAM,OAAQ,EAAG,MAAO,KACpK,gCAAkC,aAAc,KAEhD,kCAAoC,OAAQ,KAAM,cAAe,IAAK,SAAU,SAAU,aAAc,KACxG,gCAAkC,OAAQ,KAC1C,kCAAmC,OAAQ,KAAM,UAAW,KAAM,cAAe,IAEjF,yBAA2B,MAAO,MAAO,QAAS,IAClD,4BAA8B,MAAO,MAAO,QAAS,IACrD,wBAA0B,MAAO,KAAM,QAAS,IAChD,uBAAyB,MAAO,KAAM,QAAS,IAE/C,iDAAmD,SAAU,SAAU,KAAM,IAC7E,4BAA8B,SAAU,SAAU,MAAO,IAAK,IAAK,IAEnE,6BAA+B,OAAQ,KAAM,QAAS,IAAK,QAAS,GAAK,OAAQ,IAAK,MAAO"}prewikka-5.1.1/prewikka/htdocs/fonts/0000775000175000017500000000000013555143705021201 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/htdocs/fonts/FontAwesome.otf0000664000175000017500000040723013555143652024151 0ustar tandrejatandreja00000000000000OTTO  CFF 9s7EPAR(l0OS/22z^`cmapǢThead6hhea P$hmtxJ+t maxpP `name>$# h postx  FontAwesomeC   U6U6 22  ",04<>EGMT\_ehmqy}#)4>HT_lp{ '4=GRYfoy &,39COVcoz"/5;FPUZes}&+16<EOW_hmqv| )04=DPX\aju(,26GYhy %16;>EMUckox    $ 5 G V g l p v    & * - 0 3 6 9 < ? B F O _ c u     & 5 B Q a f m t y    ! % ) - 1 5 9 = A H L P T X \ ` d h l p t x |       % , 3 7 ; ? C G K O V Z ^ b f j n r v z ~   !%)-159=AEJNRVZ^bfjnrvz~ "&*.26:>BFJNRVZ^bfjnrvz~ "&*.29@GNU\cjqx  '.5<CJQX_fmt{ '.5<kvglassmusicsearchenvelopeheartstarstar_emptyuserfilmth_largethth_listokremovezoom_inzoom_outoffsignalcogtrashhomefile_alttimeroaddownload_altdownloaduploadinboxplay_circlerepeatrefreshlist_altlockflagheadphonesvolume_offvolume_downvolume_upqrcodebarcodetagtagsbookbookmarkprintcamerafontbolditalictext_heighttext_widthalign_leftalign_centeralign_rightalign_justifylistindent_leftindent_rightfacetime_videopicturepencilmap_markeradjusttinteditsharecheckmovestep_backwardfast_backwardbackwardplaypausestopforwardfast_forwardstep_forwardejectchevron_leftchevron_rightplus_signminus_signremove_signok_signquestion_signinfo_signscreenshotremove_circleok_circleban_circlearrow_leftarrow_rightarrow_uparrow_downshare_altresize_fullresize_smallexclamation_signgiftleaffireeye_openeye_closewarning_signplanecalendarrandomcommentmagnetchevron_upchevron_downretweetshopping_cartfolder_closefolder_openresize_verticalresize_horizontalbar_charttwitter_signfacebook_signcamera_retrokeycogscommentsthumbs_up_altthumbs_down_altstar_halfheart_emptysignoutlinkedin_signpushpinexternal_linksignintrophygithub_signupload_altlemonphonecheck_emptybookmark_emptyphone_signtwitterfacebookgithubunlockcredit_cardrsshddbullhornbellcertificatehand_righthand_lefthand_uphand_downcircle_arrow_leftcircle_arrow_rightcircle_arrow_upcircle_arrow_downglobewrenchtasksfilterbriefcasefullscreennotequalinfinitylessequalgrouplinkcloudbeakercutcopypaper_clipsavesign_blankreorderulolstrikethroughunderlinetablemagictruckpinterestpinterest_signgoogle_plus_signgoogle_plusmoneycaret_downcaret_upcaret_leftcaret_rightcolumnssortsort_downsort_upenvelope_altlinkedinundolegaldashboardcomment_altcomments_altboltsitemapumbrellapastelight_bulbexchangecloud_downloadcloud_uploaduser_mdstethoscopesuitcasebell_altcoffeefoodfile_text_altbuildinghospitalambulancemedkitfighter_jetbeerh_signf0fedouble_angle_leftdouble_angle_rightdouble_angle_updouble_angle_downangle_leftangle_rightangle_upangle_downdesktoplaptoptabletmobile_phonecircle_blankquote_leftquote_rightspinnercirclereplygithub_altfolder_close_altfolder_open_altexpand_altcollapse_altsmilefrownmehgamepadkeyboardflag_altflag_checkeredterminalcodereply_allstar_half_emptylocation_arrowcropcode_forkunlink_279exclamationsuperscriptsubscript_283puzzle_piecemicrophonemicrophone_offshieldcalendar_emptyfire_extinguisherrocketmaxcdnchevron_sign_leftchevron_sign_rightchevron_sign_upchevron_sign_downhtml5css3anchorunlock_altbullseyeellipsis_horizontalellipsis_vertical_303play_signticketminus_sign_altcheck_minuslevel_uplevel_downcheck_signedit_sign_312share_signcompasscollapsecollapse_top_317eurgbpusdinrjpyrubkrwbtcfilefile_textsort_by_alphabet_329sort_by_attributessort_by_attributes_altsort_by_ordersort_by_order_alt_334_335youtube_signyoutubexingxing_signyoutube_playdropboxstackexchangeinstagramflickradnf171bitbucket_signtumblrtumblr_signlong_arrow_downlong_arrow_uplong_arrow_leftlong_arrow_rightapplewindowsandroidlinuxdribbleskypefoursquaretrellofemalemalegittipsun_366archivebugvkweiborenren_372stack_exchange_374arrow_circle_alt_left_376dot_circle_alt_378vimeo_square_380plus_square_o_382_383_384_385_386_387_388_389uniF1A0f1a1_392_393f1a4_395_396_397_398_399_400f1ab_402_403_404uniF1B1_406_407_408_409_410_411_412_413_414_415_416_417_418_419uniF1C0uniF1C1_422_423_424_425_426_427_428_429_430_431_432_433_434uniF1D0uniF1D1uniF1D2_438_439uniF1D5uniF1D6uniF1D7_443_444_445_446_447_448_449uniF1E0_451_452_453_454_455_456_457_458_459_460_461_462_463_464uniF1F0_466_467f1f3_469_470_471_472_473_474_475_476f1fc_478_479_480_481_482_483_484_485_486_487_488_489_490_491_492_493_494f210_496f212_498_499_500_501_502_503_504_505_506_507_508_509venus_511_512_513_514_515_516_517_518_519_520_521_522_523_524_525_526_527_528_529_530_531_532_533_534_535_536_537_538_539_540_541_542_543_544_545_546_547_548_549_550_551_552_553_554_555_556_557_558_559_560_561_562_563_564_565_566_567_568_569f260f261_572f263_574_575_576_577_578_579_580_581_582_583_584_585_586_587_588_589_590_591_592_593_594_595_596_597_598f27euniF280uniF281_602_603_604uniF285uniF286_607_608_609_610_611_612_613_614_615_616_617_618_619_620_621_622_623_624_625_626_627_628_629uniF2A0uniF2A1uniF2A2uniF2A3uniF2A4uniF2A5uniF2A6uniF2A7uniF2A8uniF2A9uniF2AAuniF2ABuniF2ACuniF2ADuniF2AEuniF2B0uniF2B1uniF2B2uniF2B3uniF2B4uniF2B5uniF2B6uniF2B7uniF2B8uniF2B9uniF2BAuniF2BBuniF2BCuniF2BDuniF2BEuniF2C0uniF2C1uniF2C2uniF2C3uniF2C4uniF2C5uniF2C6uniF2C7uniF2C8uniF2C9uniF2CAuniF2CBuniF2CCuniF2CDuniF2CEuniF2D0uniF2D1uniF2D2uniF2D3uniF2D4uniF2D5uniF2D6uniF2D7uniF2D8uniF2D9uniF2DAuniF2DBuniF2DCuniF2DDuniF2DEuniF2E0uniF2E1uniF2E2uniF2E3uniF2E4uniF2E5uniF2E6uniF2E7_698uniF2E9uniF2EAuniF2EBuniF2ECuniF2EDuniF2EECopyright Dave Gandy 2016. All rights reserved.FontAwesome [_"+/37;TX_dhn#'Prz.26:@DHM %*.48@ENUZ^}/3PW^cgl8<FJCUajov{ @ J Z  & * . : A T m r }   ; B F L T X _ c i n s z   . 3 8 @ F K P p |  & E d m z  %1=BGNU[e #)-7=CJO]kr):PUblqv|",5:BJOTgz$6HZ]hs{  &,6@JTX`hnt| )8@OSX\bhp~"/4;?FLSW\hmt ',2=HS^elw* A T&fAV TlfPzz  P 4 ! t  q q bt& y}}y 33 % 33 `zT~~ 4] Tg@Z 4  R ,T[@ << 4 ,  ^ 2 %%%%%% 3 T< nh @ ;T N TITN C KFKk 6 ? J  : K, : y}Tj 5 / W  K$ 'T$ V L  v   L  6 f y}}yy}}yl z||z % 1  KTTY= |zKz||zKz|N !5 ! ff( G Q 3 |T|T| T T T|zs R 3& ' ' < @A G   ^ [= T / 3 c - `V } hn " Bv g OG `E}n\>lg ,hh@@h EQ P  |z@z||zTz||zz||zTz|7 F x  3C DRRD D u y  ; ;  5!J b h  5 / TT  + - tzuxu[Brlmyz~5qsU hnnhhnnh ttt  T  y}}yKy}? j 3CC  5 ;(=ZXWG/9;/_Mknmn9:YIƑP`q~d_i rcrr iii  y @H -R '   T  1<t0  lnl||}_zob^^bzM ~w~~w~ K = +tX @] @gZ t V``V; ;`L< xra YW  @3 &  ~~w~ @    5! }yvKyx}zy n   T7 rrcr ~ g hnnh YYG P ~ ******** = 4 4  )  .@ (  [  h  P v T~z$ j +[   <<5! I 4 * A C 7 r C 7 @r b ! 6g  T E ˋh 3/{V= n\n ]9 vx {zz{ X  CZ7)D T}yT8T C T7 Tr ]][ 1    7U f @ m   < ZZ ZZ { B r r z{ + T  |z nh yyrrrry pttp&pt 15 tv ' K(   ;;  g  $4 y  ~ MQ s QDnty y  t Ft e 11e BB  T  2     r   I F  y'& K w__c 4444 p] R  GTTX x ]]  83  wrr h  h@ ;fveK \xcikvss]tRat 7+447 && 7  V ( - hn  D$$D  , }t P  `=db97 Bx  t3 ?L g__gg__g a `V     C3 ~w] } y6%6- _$cX ~ TR V22VV22V   P@zyz z  s/ A v  zz{   b   z -    f t    & 3    ]] EGxZny tP P   ++P,  ʲ ,   _hmx 2       ˋ  d4  4 T[ `M`M y}}yT, V ;; 0 && T 3   t' . %  @ p ) qt{tsoy s%$   333vK  44 \ ~v  }jii C @@ x~ C Kw 5 !4 wkz|| ,$P++   -     g s} }y     f   #E T @  )Wbit  S 4X wmxyjh  ofZedZd W f r rsyy'&    h@ v   }592I88!~   I M ? y * BP|88;l]5m+\<b-G_y'>U>c R !0!","^"#0#$ $q$$%%~&5&'A'))*J++,,m,,-..1.../P/00192245q556<6717x78h9:S;x<ghhi-iij jkwl%lm7mmmn$n;nOncnnnno"oopp&p>pXqq q}rIrs8s:s<ssstuv<wIwhwxGxy yz&{6{u{|||}~~~~CM9C|28VP cSOI#|L`m Po1*x4f.HU\1'Cw[W(b;J{.ŝQƭfǮ*ʛ˗̉͌|`ϫZҝ(Jտ׻p9D9gtg,q?o]1aJC0g $   N   F.yq4+M< !>!";"h"##$b%g&D&''''''(()*"*++,?,p,-F-U4>45~566636>67 8"99:-;F;<9<='=\==>?Y@RABDEAFGH(HIImKGLLM^NZOPxQ@RS%SlSVWX:XRXXYY]YZZ[+[n[\d\]g^Y^_2_`5`aacBdd;dWdvde!ffgoghNhikj@jklmnopqhrtukvYwfxzV{r|}/~~Uu[ tJ~3J#c$;Tt TT4P 4 c z..ȮhKhh3c # ^uiƭR@2A 4 FMffMZnnw   v x P  `Vc~ofa[! Y!    T@ b@ suw#$L>$#69JX"!!`V+/EE+V1RF _r Zo p]t ksu[ztvUZ tq9 [[9:QQ:Mqksu[ztvUZ ZJ J&  & a )| s Kw t w4X ] g@ v   YT3 Y`VV``VTV`Գ  T3 YT3 TV``VT; YTV``VT; T\TV``VT;  ^y $% IVhhvjyy  IIVV V V ttC KFttFKktt r tt> @   V  FKkr @   pP tW&S:aR`S:a))6z 6)õ`a;R`W&tPQEEQQEEQY 8 &8 &T8 T&8 @ e { zK}zaEV" nmloL{yry}{{OJNll~n|i&js^^[{m~mkNo|y|rz{Kpijki\f_i]QM[!|Lz~rǑ̒Ȫ'fgiMm([popHH4 wOVVOcZwE;L1Hu v tnnt/ s~oJ,zW`aGahc~v~AHH  w !4t4tt4tt to T 4# )vTV{||||Ng|5ppTy~}y:y~Tppur5|gccn_Tz}y}}zT T dgf[wXX[fe6 tqTKTTT TTx44t8 zT~~f9x44t8(& T T9vT ,T,ThXhYm}}chhcqj}}iVgv wxrwwvtL# P  !SY ylD&)'C3$ Y4K Ti t}yT|}zcesd,.9/F- 1T5 T "Q>W "SX5z|[,9FZ3 Ti 9 "! ! T@ G vTi TT T+3 kT^^^^Tkcv ]btkr Kg _=1lno1"-SKq~n}s{x}zsz.;3n L vTTVT/WW/!(ZMj: kD L k+8V=_GxɁHKxMG_8+ MrrN-hnog? ?go Gw_ rN-hnog? ?go_QPox}yCQ(Csyrp}t{xo^PQ_K n{}|zx8 S``*S8 qxozo||{}s}|{n. K    x       0m 8 vvʪʪꪫʪ骫kihvvvijiʌ 1 w ʓ ʓ 1Y1Q kllʙ F?ijivvviijz )z _^X*DtcX_^sjii}jttjjhsW  m g|vtywxog`vf/TFw.qra\zzzaM{tswxyzzVc,sj|wut{tv\h2p]yx}xzuxWi:mY{pvzs~{sww}e_^#:/r8"   4< 4K4"Kme,,eBV4 K"44"4kt4:4t> )T33333333T4tXr=EE=UIrXt tK T/ ,Q iep%/,xxx(((#Ɏ wR'VbgfVpoqqq{\/j}}Yh^?DFG@EatV@ha%-n<5scsŔO5*VJM(0x[[_}~􊢋 %;AHW{'Qbgfg FIGf=R!Gv^]^z8'n\PuH#hPMqJK{-!ߜv`ЊxġMMN[ĐơϦԖУ!!!x$ǁΓm`r;ni~GhftnOlFKwz6- ;p6p_ph6hpo;_}oh6h6}_ Ǐ\|}Cy ^^^LuZ qmeptcCDCm  ǐ]|zb||}3mrS 667W, "m~yv}u] y]h vp|zwwzv {y{  |p hm R<0 R<P 0 R< i m R<0 R<i m 1<0 1<P 0 1< i m H H H t##@w t\ > tTdw TiFy tdv0{tz{~'&9* TT33T&:''~ )TTTn4444Tt|z@ 4kX S @g@ m  D~~UT44~sjiij}st:944::W  {   NLT_p’xJ  vPPϠHGwwsrP mXXj:bkkcv`~:jX;`Y;l-&PyyQ 4 S+,,||~KKXfccQ+4444400f,,fMff//  gt}{|y~wjX|zh "Q2{zt{tqT4 7\3ulz* p4Tqt   Jw tKK3CC  G fccQ{kkYkkkYkkkkYkBBk C     - 4= 1  gsvZvZ SZvZZZZrZhlvlr|hh|e P @g @g i e P @  ZwZZ2ZZrwhZ P Zw Z  @w}rrwrZZ   %L.2::zzzzr::2%L'2zz:::: zz ph H Z hn  e }2zz11zIIII{zzz1IIII IIII1zzz{IIII{zv P zz{zM vv,+M 1zz6 T 4y}}yTy}T T4,#Q?`\pnZtҫȧPKgjzx}wy\O~#7@TKT ttt4 4: T +y}4j 4y}}yTy}4 44 `$$`$`$ $$$`$<Tg #Zk==k##kZ==Zk#<#k==kZ##k==k#i ]&&  &&&&&&kK# g2%''%% ::!8# t  %56&{SjjQh[=<<=> >KwP ^CT}s@skiij}sstv jt }sTӸKw~ssjiik}ss@@stjtTC^OGGOTsv js@tE @wKsjiij~stsv ks@sTC^ǸTs @KT@sjiij}ttT  Ttjiij}tsA@sv jt t W @j{t,Qa! KtkvqCt e t ԛ 4 * <<< <+!y}|z |RT|y.}|yMx|zp 4HhnzhThnhTThS\V`fy~5V``VV5`V RL'HMoZd99dMH''e L( $4A 4u v߈ /J7I[^_[Z_~}yhn{x(HZf7p\XTHaG-whhiwVQZ:#vz]l`L{l{,+\^˒1 t4C FKk@r CN.ETiCkhT$T$?LL?'0cGv=< vc0;'dquuq--] LaaLvtrrtvLa`Lv$T$]D'#5'0cGv=<#7quuq-.] Sv-yU*PNO_Z~wrsrswH7*V3ziU{Qg eg SA:NT~=L=&0ErAuX5y}|y }R|yR ~|yMx|z]pkou`\\`qbuud[ddsP uz``K4K++44-3V +*QQ듔VV땓4L554K 4 ˫44˫  44Tt Tt Tt44K Gt4 tK Gq q bt."&Ft8t+ +K Qc-b.T5MKTz|sRrQnSSL0t8tĤŨTy}v0%%_Ib \;COLD|yz|rs{A0%e P T%Ki``iK%,QQ,g /g / arzyzyrrbr:9r :9k lr:9:9rrbrzy zy) 4TT@yxxy}||g T44rdTr 4g T44fTF4TTB ||} pQEEQQEEQQEEQQEEQg OH `E{l^@lg ,h v 4 4 &Q)WWXg3 UGQ {y|ss^    / T   14= 1i    m} t2o`gfbnh ./>p+>|Ri/8Crb{Zja_qV Om|  PC44T%V``V L teP  T  hP  TTTT noqqon Tft//tq:v++n+*mm*+n33Väyppv-)mvv  >{ ERQDEQc ERQDEQQE9},~ q 2srqt-}}N}}~ZTYprr~n pwefc~rrq/s~|~M}~,soppndmfnen s -}N1kmo/ ` >a B`  aNty6$7mF dI.3WW- hn fo1\s\ko{yxx<^  U/SkW ?Ÿj-@  +6 OGo Dɝ·lZ'#ik}ts')2OKebh`i_mdG1dqhWm]a"WY VF e G.3O׈- 7hn GNOH 6  t@K̬-*osr^ ?<kO篞 OY OxxytR]׈ssvkc\k}\vsO1fOzkO~rvdOJ.eY$n:moOhq1d_`cJl2)t}ǏymD׈ 83vb@KM>M>KR4)<5Mnɿ<5)4RP p]o udr T~ϧ\ ԕT33~ϧ4 J{{{J{J IYU:=YϿڼWG j8Ke`bz|vw{ ̋{&,(i"z  4t4 T, L T480QEEQQEEQ08.(y{wAi  t XTiTQg B 4DD G U DD t * ^GofTp ^Go &  8^!Y1/)Yb1+3 X ] +V``VRzf|Xm}[YKKkK+++K+>7+++k˙̚zfR[ /`obt@v'T_Gqzy Ywjo`)Ib`__`b)`~oDW~jgw^SX _~|~~tjn~@t^oYYk|P/"`c}{q_'TvQ yyt    ?ApDU88Dp?6 \xTTz{{z~TTK TT 1 !8 2 ZZ.n82Y\uZQ m{r^-Ʒ֫Ϧ [ @{wx^^]Up[c\ˀt bdee  @$fb% aa>"ipuleǞëѯ X4* (3&  &;*226;*qXsIm[FHNMo;otpлͩ&oxtt_Jdwry0Ayu{&Ay  v(TQrLyJγʣMfEpB}P7.G$%Frrs3Xo[{TO(QVY`1(mpnnvww ."4X+prq/#>VK?ʹķ Sp.v/nQ11'A<* <<xp%j]^hYE֊ׅB ?Gߩϼqٵ˟'(͔͂z'w!q=wUG7HJ?xs]C$8rwsp+qi^arʆŕ vTTTT$T4\+T /i )* l @Z @Gtt   V Tnzi.],++,]i{{}zyjpnjry''{{~{y#joicciq#4 444@ G2t1v~z1vF4YtHAAHZEtYrtpg  2  4Ttt] TgEuFF6!1=۴ n_F( RD\\D VT$4[ .G^SSG^J(@twT3fV``V}~d3fTw@t(EQT! Te `wrPNxyprNV[Pwrqqyxyprrwwr[PNrpyxxyprNP[rwwrrpyxyprrwP[VNrpyxNPrw}PNVVNPx,4.oU wtFPPFs\k{oyxx >\V?Ckwk++JLOG  =3`?.Qm\ibgbjnG5[hofuelY=  ,.Gc4n8`XC>[B natĹo8ixFPv8+֫ঽtttuV]]B1 o8[GngimQ`?34=_`b    =acfn}|}KKYXS#Ln8  4.B `KPV?Ck1B]]Vvuut+`PF`xiPta ?MQYKK}|}Pfca=    b`_=43?`Qmig`nG[  ʰ .Gc4B tZB xxyatRt]ssvikcx\j_qFPPFGOLJ++kϰkpC>[Hkfuf h[5Gjnbgbi\m.Q?`3<    p=ϰˠSLH QQ{zH 00 0, {zz{QQ   X00{zXz{0QQQQN0{z 00{QQpQQ , {z P00 M QQqQQ, {z %Q4.&E݂v'* <<< <+'~'|iyzr|x|~t}uz~}tyzrjhv~|'{|~oz|'r}spwhjhy~|}}|x}owuxzp}o~vqyv}}{oy~tcuyuu~xr}|~gwɛ|cx||v'݀t| $|~d+|~vrys~݇uw}{~|G|}}xzutl݇|~|rk|'|}y~z{|}{x|sv~vzyzzy'7}r~ww/*Gs kin 8"W==sv jt >>Gww|&xjUt=N,B[ Q?F  t{tqz4~ zv x  44B  44t tX S {e w$$ Tx Tqt{stoy$$$$tqT5 Tp $$ yots{tqT/T $$K T0 T $$) Wn|`_]#v:[vVi\\iVv6*446eTa u܎v#6]_`uuu0n1W@^;e UU`4U5TTTT`4S2SBzyrrrrybcyjdM djyddysqSUmtvwjoXV``VXojvwtnrryBddkybcyrrUnTddUA??BnUU'&UVlA?>CTddUmի3STk@<?BUbcTm,Ԩ'&)J,> KQtd_O>Kj }|},D!/G  # # @*! ! @i##flA\4v4443T3o@TMK"~xF͇F6)-1?pWSRWn?=%(EUmþBB_XS-(mU6EF(%=?VXpO򎬇F˞y\&sqb]NENewdG&NS6}dNDwO]bqNñџsSe&GF\}w~vt:4+q4CKtېE,  aV4dYztdP\4VAlff,,fflAV4< :\i?fflAV4M 4440M 4|+fLdUS55TTd..Ġ ..||eWT6LL6UVe[o!"m\à B)%h;=h&)CMe0 0 4\ 44< A 4{}~bx4T TGkmeeBV4V``VTe P  & P T wVn5!Jt4C 7 F nt4C 7 F T 7 F ') h $J7_H,  `djXg]SˈScfzhebpR3 ^v" Om(;.?GdFjPyi7voMyyy4 (!?::: @(t T @ Tz|> $@1 i{pkgGR[".__ušȟmNgG&߅ȂAP_ATeAa6226^%OLJnpsosxZWS]{`lcmcbnXzyY\a\^cbhnnpszf%_whY+W~ cv͉ΒИ15hv9U!݉}t{D$ WW2 g 5 T4g[wrrZZTTp_Civ9U:j\iCeM#&nYA ,Ómxwr .ffFfH4 ze`c`c#NW[S 9Z))));7eefeefeefee)4  {r|sv>(T+J~ff~JJ~ff~JK  g 5 /{i WԂ W~  TT{z4TT TT TT  m F84  X l @ @wWT ~ KWT @wW~ t0mjingr;<7 M7#?#77 <:fim B4@ V7)0[/1/^//106;$p#sEAA*,?m6"mpF=(G`$.ƣ 0п D&l&yPsjiel{ppmoy,,yrrUg[giyxtq]um~~~~mu]qtyxgi[gUrry,,Vompp{leijttW m b GTTG@u^9v:p%"M$%MڑhiGGTTGT&&@;$yz%:@b %% v TDddDWXYV_lw}v~v*AdDyo6$7 ^~ )?cwrvy~x]͈}|*YvvT p{3 +T TA \ < T T+ \+TT+ \+TT+  m 4 XvvuuvvHNNHHN)   1j j/ eU> k) $1   4< 4T TGK4ime,,~\-4:4 #x:4tT.F pF F 4KqHaZxuuvwtD6O'xODwuxaq\_ II_ \DD$2?? nzykjstz{ztsjmy}z{JlQeűťž̛{yn׭ 0|zT|T`> t7 `Tz|)ttF TGtt )4z}|ytT ty} b tT4TN[cG=B^60AQEEQQEAKuI7#e  #7upjj_pB: ܾئ_Wc[|a m w7Ep{ m;4U3ua[ RҢ&{ & RD[apdu- U;4mph]@@h֦ t tK} KQ$4[ (@twT3fV``V}~d3fTw@t(EQT! T)TTT K5! Khh5 t TQ  _ 4nhhnnh4nhhnnh:Bp צg U ktEQ9 w !44>TiT( ttT1 TiT1 Ti99 t"! N T|zKz||zKz|IT|zKz||zKz||zKz||zKz|6F ^P @g 5 /i  Ut"! 6D> ^ k< TA K +K G+  TGEg p\T /i )> GWW2G4 ttT15 4hZwrrZZrrwZh4 !""  " Ti  4 44 ttTtk}44 kQ)TkktK +4Kk44Tt+kkTkTsTskkTkTt44Kk4 Ftˋ v |g>DRTT˫kTTktkKh@@hTTTppqq4  ph  zZ4  k   k zZ  !ZtLLAZ4K K ztk  z YY Y LK )d { |zX ] g4KGfg 0 K )+TKx  ^4Z T] TgkF GTԀ `t4+V`@Ӷ+r S > n 4Ԁ T q] g 4d_gg_ d4 T GTT[ r  EQ9 v ԫ  TTYwNTt"RDEQRDEQbBTTBQEhEQXxC3p 3CBc BT  b&'&e pe P  @*j{4a,t {z4 tC8qbbb{y{x{K  t4 4t__4\<-7ʗ7-tD&c+zi0&H. 0,-##s& &2iGz@@RQT+c& &t  x P tV``V V`T^ T TT 4 &Q)F|~aiEjVulѬo70 XDQ^ 47mGGT4} & Tnaxjigxi j(C(jgjixhi5'=='5G8 mTi n5Y'=='5YihC ix8  Tg  0 T8 )TK4TTT: TTx TT4 [TTTTKGxP  x  yy p< ZQ ) I t+t I 4!+ I r@I 0I I p%I 0 0 +t $ h q^jM Pdioo '.X Qv \buD J  zxvuzLJ?  s ]RT1 T*)\&Y ffffzM{yz zyz  % @tJjZ!!3!" $yf+/Y kzX,Hn|}1dtZ\IێĬ TPv4TTTTT{K=but5mUzxwyysqggKgywxz{TmӨ'&h ~zUB>>CnUU'&TUmC>>CTz~{ky 75u+= TTg K%.Khnnh<KT/i vPKt/ ohhonhhn ;mg<&S3r< ;|#&%6Nkjk hW x}p;F&<U3r< Y;|$&%6Nlik hW y|p) 9Iv]Yfh{osjeV]]nw vvKuKpJQT*FhltnݖݘƎqDA5%!*QTFhulstnl_a99:Pp~݀*Pk9okթm p [ SD D DU D$$Dm8?CI9 ..9~`n [ AEN^ U TT% 7;L9\XpqTTg 5 9 $9  # 4@n T+}~|C3p knr]J'V{ke{ohc-#</&|~T+ t`` t{yS;RQPIODwt{K6KtqvMn;<-=vvkhF8 !!f ZZ3ZZg%E E !  a!f %33gZZE  Z!f f %3ZZgZZE ! Zf ZZ3gg%E X FIC?6IY(uC XVYx\b66S* PeSGQGz5:5'DN5TT(TKKT(Tn 4R~~'1 A3ZpT4 T7׷ b ,9_7T5 2 TZA1 ~'~Q1  Q1. ꗐv@Ti Tt2 @$k\9 e   yyQ a U) _ T_ T_ _ T_ T_ ss G- |a99az~z |33z}z99S e * <<< <+wvttvw_+3sE Z@@@@֋Y9ZYhYY9Z@@@@Z݋ Z  t   tR1 ~* Q 9{sYsn{xput}T4T~T7T }4TTru|utpxnurT}yZnnAf 3gggggg%E  (@WWS+}}F簰ɋf,,fMff zzq{ttz{ f %3 xt t 444G{zs{4O!mFNB9x*}}~5W]4xE G xtTc ## yussu~uvqxTzTQOy7}TxvvxzT}xqvu~OzTxqvu~ussuTTt: T,T[T}ysxEFvdyDs4>$0K_|h)!LNMMNwK=KQx<rGCTU{x%%%%TD即#}f ؋›%%%x%{TG>h  ˳&~'+'}~~}}33 +t4b4tD809mi%if+qU3@  nDDnnDDnnDDnnDDn.bXXbbXXbpc}zppqh&c&}hzqppppqzh}c&&hqppz}c o11!"!!"! $o1111o!"!!"! %11o $Z< <ps 7 7 e &]&8t#4#4-_G_G C3uXr 9*Hb=gh`̀, ް5-"MM/8(x,(90KDzіɕOTOm̀ցQ\Y5Yy{))+)jxYhmG{IUsV7=o{vu! z'f@o&d1caaPEb4"f|aunO鿦ɯ˱nnoI7J!I5.OB\WQĦdRۛ~-aOpbKI2C@lU[s^Yoc`̄ƃ~ƒΑ~vD,@aD1"@3byЀѐl"k"rbsIr3p1o1]_qewG1('$:er)n'y*ԧӥؘؒ6;2]zt[uns PDcl|P~_q<}Nx0k<N/ pti"d-"`#69VѺDMV"TAK$ Th~tT  t~~h hh ~t t{tR t~򕃘t6 ~~t ?t~ qqPV]]tסжihhMD;ZQuItI[nt]FEQZ-[+@@*e-8;@@4uvǹߤ p7ZYCYCq5( v >>>-r>->j7)1 ;auabtavzyvvzyu:uzyvvzyvLR]]SBR]ĸB]Sx*.NZwR]ĹwwR]ĹwǼ|CNGCCG|pNC!C,313, q|]RS]^RBR]Ĺ_wη}|w$䔻kiᦿůI7J+kt}n~x?z}}}b;u{{~(0YP KS{TSm{qiTAsFGKiwzw0o_ewkj "˒lshztu|Цy(0u"5@B'\ϊ؊sqٱ0@.&7e}|_g͗|qD|unlaK]~d iqqquzw|wʎó^=~Şv}M,7QupzTS(pzKYNGJ b/ѓcctup4K6gp1zy@yr7Y}{w\wxFis}txyoGqt sp^)X)iz=JFdf|oL{1$+#~[G0`SQRne*wXjsIx[Ͽ^d7,vX9 ZY 2deҦt0 tE EE#)vo}}4u{zu\ O#nWvZh,lt:$4Zsj{rglb1XldvG'bQ^{yqa|x|{jjs}.Ӣѡ?IY–Kk.#4)sV 1|5Gc%1A XRf 7n]Mw]^}ǟxwVo] ytyywyB A'!3EMM!#]([B4WtIm@nxWxWtIWȇ$rzӎlQ3J>Rq_(%vv==)G/H{uAR6=z@kwlkkwllaelj{RI7 A5ifsgffsh./gge0lF  miE#=[Z\Z#=EOiNQ@QyQ@QpzE&}9ً܉{H[1N[GCJۋz"q*g2EKa"81&*a/rwxrrwT(v]*I0 330H5 7 Tz|4# 5 T|6 T> 4# T3~~TzwwvxT44Oe9 1 dpSF47zw8,lr7RZ(x[ts[{+;fC3DK^Fxukrlqv}TK ?(&PX+)#JU ^mmm jgenyiYW»ëP7iSպԤÎ˒rSppoG.B%r u`vtTtp TR4%Zdz{ IS4( k. pkTt t  tRMo  6 ~* Q)ۛS%4՘ΖT˫KT]HAF-"K g_yz}>Q~{{~؉؇}zy_gK飳ܩn_ZZp_bn:vkbA*t%ndʋ̫44m4tbm++44kkLJJl.d |{|8S"1ÞH=|}}6TV5wSLTT=g}}RIcZYccYZccYZccYZc \pcdwywxRj.j.Rcoͭ}t qZbZZcbYZc\L gSVIm 0ܰ .G.k.L.k?+llH\\HlZ釧鏼0  kcthjz{{z7LvvK7isùĨwлQahaahhaai?Ul[Ĺ]SZ Z+)**MOvrqvvq 25 3 + qv6!Mr342oqv*  ).```NW{WM}|XLyR]^SS]TTVQ~ùù]SS]^SS]WQURTTtt4''tTTttTTtT 788a`aa`a^Mkl` 8aMakaW`a9M97Ba 8M97Ba Hgg[o\@\CG%:`dhbgbۏ֯Ȱ:%G?G%;adhbgbN;%GH v/}7 Q Yr3FZXaXxwx_blkxB) K%Lo3BJwu~kuxu*k?Oz!xyxvzAY Ϲ[Djmhl|{{̡ԡԈ֊ j8ч5T&9E Z$jb<r(B{]<6TYuZ|iJC^E,g_zsyubՖӪu^q-1ݛzJ1jI1jgTiԻEY}MF{M`@]~tvtz,J ~Y=U/0Aqtתԛdz}PPxvtnos~}mzVz-cObPru[N S=)id<&liXsŒՍ0ZZ6:3W4U_U266WBN h[aj6GUv@cLj^HI,+Tjk(jjc+,54+,mmZZ;ZZ۽+,33m0vH9*/o⩩+,44>4 q{7$//)9wh 0m+,54+,44,,nZܼۋZ,,>'l4n,,44,,44,,mZ;ZZZZ;Z+,/o-D/#5>'}n00nm,,54,,44,,ۋZZ;ZZ+,j+ JѲ"^ z}i{ѧ錐zss^myzSvnnU{uuwz~˜ڦLvewe :rnwt]R{ϝȹ̯\jtazm|}l~~nh~uN?MamJ}fg^%llI%uXBlznxj|Z6{&1~\NULܿI4'6kZ6nNwatTTTt  T] gZ `77lf,,fAV4 gKW?tqEEE44   @ 5 /0 x AAK TV 1CK TAK TA_K y}}yKy}}yT9 ;9 >0y}}yKy}}yT9 PttpfeOefxxxxeOeffeOeDD8|  Z *`7Q `6w% Y4W%*% X4j%1g6` Q7*` D4 Y%*&4 X%W T#EE#\[^hnT^\z.}TNNNiYT}||||}TYyi[U\`uTTv + @ 8TjMQMQMQWm[FN$l\TT{zzzz{TT\vl]X$FN\vl]X4[^vTt Tt P8jJ2RQkVo8>A , '>&&2uQeGWn!eq=s)b?ɽVWX/c@o E`(yk2@ /@OlmCLAAls  e1U**j*.Nz+8a{z{aY%#y=<==<=<<*```^+LPzlX1Az/-6D&@I`_4| 4B   44!3}|~jk/k;j:/d;jkjL`* `h uY54Y\55\Z56\~  q@-33T&kvvXwpD>m2W._Z8nE 5<hLhLQRSu'/>0Agz8(ҒӑP0KC'ZL{o_uOn ɋ#xW{D ߥpBdȋeE)p3 +57wp ntTy @ y 4'   u n  t' T  K K V ' tXt@ Xtv&'y&'Y   Y&' y&' bKHJjp̃Έbi aouwr~'89{={mx<*e>okjqpi{AR*7}xE|}jp]VY0-|xpaime{}ld""p*}|blv\&A}xfa) Wpo"_m3m"3sٝϞ¿8~~}~hs׌ $zctc^_Pvv~w~yf{h{  Z~}}}}}||{|Z} z}{10df}itj\KMuTuzy~00&    <!! !< jvt Ǒml!4CPWhЌnj|vw||ryIs7h3^1c:gJlXJU>]wD&_nr6Hgdalor@/K&``m}", y@}z~|{@Ë)ҧ̞ȭBO`)y)o3hm^Zx  :w !4i 1J{z~v$${z~J1 E8)3y{||y38)E 1V!4gVQG ?33A HWT! 5|x$5! ~; ~V!4t/|h7S.1l~gd`;!wgvph  i ?v x V!4mTTT  x - VP P P PfAV TlfPzz !  P 44rn<B@(vMzzy:((! u6B@!eDRĨnhhRnD  x K!4Bf~:;8:; 5E}}oۮhJto%]8%{~yxg(|{~rxjrqO>99l>SO~~zz x K!4 EQy  1  %v w !44v{v}JJ}X}w}vw}Xe}w}JJ}wevaʁӎyLzzyӈzz|cyuYaaff6&̶Q HyA~`Dޟ(#PgQ+<3%!!!S|BDMhߺ ђO .-.-.plHs-U7sH<JJJ?H&Urs&l~v~||||~v}~rrrr}|"d ^)[OK0-npq D:)rJ?t~rIFo9$"%9/iüIIR^rdclmkԧ2*:8)0\pFN[BA\ŸghgGDDl)3=  0 jRVVVTPQSyVVV:RjVVyVTPQSVxVVyÁ•VVRjhh @xmŁyVVjRttttF4xPp[px4MFqqqqIwwv|yx*|8 G}AIrw-u\? 5'px$ PY84I5K G3#T1!I%>HGUB& v\wͷ- -%bbd&-JRprvQiu,t~՗Ӣ9RMgĬx{}ާEvhrjplJ- ?&n 5dbbI,ueui`M6fXPljiijlPXlf`M6`ZiRuL};pommop|;LRZM6`m[ [ƗM6Ġ|}+vjS&zzgMRjhed9oICAA~CtIo}d{fxgj ;v+Iz5&o? mjhĬ7;jjjjjjjj 0KBH \O+:xOa_UTS˄BgftXRweWWk!:{z{zzy"J<%wly}jhw|m'!+\! ոϡnMbx7tttpopyjef{m~ Ǻ iii yzyWuf^ V]g`[[f_\ A^N?I`Ujf#b'^jTm4=yBF$3P:kS43g߫ޯG@pFAw@UMMM%O&iWtLXU_ogBF bWR?d/y(#-:=;ra``^_^rrukedA~R?‰“wnmm"?+RU`B=jȕwS<;QE>?F`  RXX4! 55 pqsa_^U^HKʲJpwm7ųu~//:q~iykkkkkkgfhopypoo n0 +(\fmjő¡CB{gtzldg{S)ik-z/Rɮ٫ސq,Þ2=5qnYVL9+3zZ$;;#}MwzVqzvy^oyzzv!UggTUT¯¯gT{fggTgg¯ggUggUTUgTffgUgggg!Mm#[8ICnyy|죢Ԟ[TI&%7O ~~Tvtsrv61psYM O wpv~Tv~tsrvlUXqsk %]rKwx ܿ D&l&yP >T / Ua  3^bXk>C_}g555333g}cm6ﳽmv%f~~O~~~^a}g767/./h~bn1lp.[Rh5kuZi/4oe ^Wf7h7jvWi'2nfz#zCpisL2r@;pEVP<Q;Odlw #> ƭ tt4tt ttTtte 7>jVRH %HVjE##EE EE#HR>7E#E##EجHE##EE##EE E?>?  ++ +  heXuS + þuh  + ++ SXe  %  +  o9˫49/ː/4Gj{fj}^11^rt|qj|$$J|jBGrbrrKK& j SˤreGe~1~w~~w~1G zz0v~0BKR+%+ ~ T+u+~w~10G 4 v2 dd0 mcFr@:}77:@ڳm-T0>2tM2V33V2Y&Lt>T0-V- KKKKKKKKTtY TY TY "6 gn~Y TY TY "@6  H~HfT Tgnp(pT<}~}<4TT~}<2 <p4tp Y:YY%$~~$%YY:YZ$%**44ool8II8oo44**%$Zu* + uHd8lhTwwvym\_u5^/7hVfJC22C=+JVhX[<*N?Y3: ]#"S:Y3N%%I%%%%F%"F%F%"mmm%@5z"mmmmFF VmyjjgwrPE]}~Su8ӗ)xm6 |uw}un]~')kp{u~ y nkuptogo>4y}Ϧ)Q4  gyr=7TRyytvz3*WJttx~8tA&ysjmm}՗ : Vx  dTT- 5P x`  eepZp %$ B((BP! (''$$ GG(GGs$$zhl?9%$ _{_{ V| m % GGGGGGEQQEEQQEG-   %  EQt lT^_|_j-Z7BG:?)_s:y8CXccs{~syyyyzyoto֎~@,="H(`dine|Anq˗NJܨ,+Pמ M q{mv=m RJCww7cl!w/|)q% QXeYGDW[r0Id?qov|wvNX^UZl-ƒs|eW"}fڋ\GQ+L~bGDCd5.26J:#:t|mcUJmopmvn]TB4B@Dd$rvJL88˿}~=.|Նs=xzo<Bd l8l \ʨʩܧxxӪѩ̉Шܧ̩ۨ~+Un/nT8)m'xxxx+UmTs_^^_xxxx((8m0nyfzz~|~wL@ %"sx@{s@q|xs@mw~x ~x _sx{rr|xs@sx@zs (r{xs 2C % $ %w x}s@nww~s@m ({|vk6~}xenHG)qtyduw{z~l{s{y{si|hobp[N@~ r@na&s u}{xw cn3ow~u?m{D@}s~szzqqzs}}w_oG~}xemHGox~u?n{ ~}wfmG( % $ %d ;zu1t&A"Ω̵i&L̔+@~tvqazp@ubw&8@SJZu\ek pkfY8@,F):J\^GZgmn|~~rNvƯri_z{wow{vy}psV1}nso(>}>ptlN[XKH[ͨ>- "?4'::''::',Ah"ttLR AS1 Sc1JֶgLXpjZ@  =PBBPOA AOgŬ\]W»[Z3)Sff@_±RD=̹|ͻMV˹$QG̟^ͫw_BG.O`IΤwϓRϺTEDjX 3""7<"ߊmQ1@@ryt8spvu:@rfqvu:d@r_F/D@>L6L! @+Ohhhh[N@c@92;@1  y,((,mm<}nik<ytgn(Bnlmva2gWTP Q~awez!uP!Eu :PBBPNBG=_!!@1@Z*y@u@_@M_HEQJiQwrSrNG2JtA(@w\EQx]nrTrN:BNcTX.E!]^ggTW-|cQ f P+((+ll>vII<5 YaqT;Qvy{Qŷ`bZ Y`qT;Rwz{Q9RIPP(*/inW|ϊL/b\04]O__@P( e,l,|} v)eiyz ) v??4 For^{g=Zi *>薚=v*09H3 Fos^{f=ZPi E(J-I4i^xz xd 623~**)(!= xetpqRtJ͉yiiylHXzdipsl_~UGJhsxyW9Yӿwyk]]s}zw~{mh7k>Yi{ ztdYgrn|oM򹓝gptx*kSk*kl1wGb_]aTfvst+*r\zheN;h_hg_@_hh_ilu~~$rfP|KEUfav,ɼuaaP@d XvvT@A!!KTy  ~@7뀙v~6 D  T4[ *<씒>? DB(DD(BzD)ANZȼxȼXN=v :jTRR;;PPQ2<;5 ,$()MU]()++\TMqqz΂34ypm1 .oQke^ 'uv& ^ek7|epex#B9o=9B]:#/ݠp"\&"iRexp hB RXD@ _* pX@RpchE:dM+A * [ $0bwqf]]]U9pttp.ptqtoqJN JAN AJN lL6HpAOYKI++srs I0"/rIHqqIHrv;(hqjuqiF ﷰg(7]F$ g)XP p'7)28]8j*%jjjAo]" -]" -]" .\#<]i|i|i|j|666Fٯ6UaZg<xgw;A A@ !A@!!@A! @9ŵwvmQuLflD^A94wHMZXaǂݏ,!|) *) )* )* ** )* *) *) )[OCPZ[P55ZPCO[[PP[(ǻ .S"0@:M`edeSO[/:~~|yw{ >g7.iczdfptð+&4R l^vQBR{xxgd~y</Rc4jc'^d K4T+TDqT1 aa 1qӌ $ӊ4FlGuj/>cvYXwrlO[MOO[Olr}twXPYv@c>kPS/k_`bjpN1kI|  FkuU)4S'-{:d@G &zzEwvlmulchr]t bFs^[XV[ vN;mЋD1 g%/O,kjF?j}yykD D'wsxx tD D7U 1 t_>hjthhjbgSgT.  T譁bjh>n_KD;D h/4+| ZsuS&yprxoh nrR/Eoqwn썍c@ ";;dxpXBB}tq۽w Tdmlsur|jto tt ttDtE [ S)\<D 4x / m  8{uNvQ*33Q~Fu{uv+NR-XvD ^ vXRX/ m *6xllsvr}jXm 9 )[=)R~[~w~5-!i5 D "~v_V=)[D Xwauqu f!D! }qquur|jto tt ttD ttDtì|r6Z<:S vg$gJAv<ֽYi}=af44 )x5Mk4444+   T T T  {{{tT aT TF7  Tr J tTsR@6{@),\,)@əEQZT aIIs~xxx{?+)])+@8s~v T@P Tx { T Ti P TTTTT//TTTlvT T T!5  s^vt 4~44 }}{ptrmg}e}Mpvwyۏ P Xtj\b'djгg[L״( ¯#wmݿbtG(r|kj>Slst =Sls_tiqnv„Ņ3I`QnN^DyagTQ3I`nȜn;((5;!!6ryqhn}.d9=k%)}|||{zvvuyyvvx}̖ҹ֐acrppxswzn}{wvvӍ⟳͂pTlZxeyR{0o|WbeVHquO z|n*)j4_SnNe]_\]“†gwkrmnnny{ʼnZlvTdp@JI4X^xԉ@jwvw@~ny yorpmue{`nYnpr@^rss~~xvvyv}y@uwzD8{{|z|{}{x}~yz~~} ; $ˉˬ7y88Siˎ; D8hLp` d|jK='t<  jmP P Z-mm  me f44-4LLmxzzMMzzV``V43 -ժLL\UI (fc}sm- -yisnK8 A*, gtx^L p&{'%%{pVJ9$5EE$ݑͥ}r:CW*[_?P`X=}[Abo/ kk(22I2(UJU2kd +Ԁ GX ] gZ X ] g44 G4 t TTTipE77EV@p1 U_xo H 6 f  I{ _gg_n 7bn 7b$ Xrzspps^?``^ $ _`bZ[z[;Z$ &jWWj&[@"UzUU$ XrzsppskG+P Tv@T K xILLIILLIx^ mK+ tttt΄PHt ZVt ˻WLqqrHrqqr- hnnu~t t˻WL@mA ˻WL.t JMs^\tlji!) tIK^0tH!wwxt^B<``uft`WU4 x tttt* ɽYM$ ɽYM ɽYMwwx?)^cj]Dces ҳxk.a ɽYM$ 18X:b}}} FhXa"! D( }}}b81mo9ttʓ 0 %nllb !+fzx!p|/7chhk+^[THP}.}{{MYɷ7o_qccy4{H]ȣǦɽYM|%npzdcZ}!DR߼ \Zjћ|0!߼XEdkdNYTMNX 0PcXR}6~YVWt   S kIJX%Ba8k#E b>[=:-  Yvk2 OT\0OUƀԫafob~hSwk9&&FD[ _Jͽ "QQO;2x) +?q$@8q+*;u~-%xxxquutgfh%'E̹VL*v˺VM`wzTE`ubiqzuppJ_e'%|ŕ}rɾɿdZ,ɻ˾gY%8>4 x [;kttTtTl* MCΫ MC1 ˻WLN͜f´[VmJJ{K/oqwnbces՜ ѵvj+^ d^]  blՔm)xyx^HCii}l\NJp" #kk՜͜k眫 tt: oVtt c7/{{{b zf+!b lln% 0 ǓEt^+jffllɽYM{{}.}PHT/7qͻ]H{4cycq_MYɛǦsjZ\ !}Zcdznp% 0DRɹXNMTYNdkdEXÿ!0WV~Y6R}XcP^vHZt|z( z] }z!~q{yzp~"{}~{=UP? Q={~G 4IHtZ]41YW36ЧubQEd]"( T$7/V,'t 044 '%YT8l 9|2'8  (%XU7l 9|3'940 k@tt++UUttttC<<4444 TTUUttttC++<<44 aJZZZZ44cTSc++TS33ZZ 0gQvOy#DORKPKaXWaaXWaaWWabWWa 45! 54! 54!-..-......-..-..Xcc@cccccc0ɂь8`a@aNdC9sbccc@ccbcX9XE-JF,bH5@Y&nË49HbF8s̷pzSzN{R{< `_`_`_`_9''''pqD-A&aa-D`qX_1`AMtCC%&*)GGbbIc~c͋%)Gc͋cBս_m 3PD33DD33DjKgl:VF_-zMWSRn\nnnn\nZECSSnn\nnӾN+F:g˝VC&&ӋlgZG%%GG%%GG%%GG%%GP8 XP * 6DD6srpsG4Tmmv)t~̩vVJk}ltu(vumm4[ `$O?$d``zw~y8Mva\tiN߶܎`4s~nkA["gwdLaG$lΥэ`v~{ҊꅮK-5%L .U |肙i54_:vxH|Q̋yPBCĻ*O8Qz }y2!v w 2!dx%%uouyf"2E"ciP8+ H>VV> 8PicE0}D8F?:/5mV?_@)*_AUm֡F8~4pw:{hI K6AOR||| 7::-R=6jsnVK {Qr2w..4$<1Unk;HKTC$[EEq;rI/(6F+G-7+`=(c2F]U=PO>Ulx x { T@q] Tgt1 it c* KWWKKW#1bnZyOL/õB+ h'X=-k7yS[rWmK|CO]ew,i@RF˿WKJvf|)}xyk~JJ?X7gf3.x,+.46?JGXjkځLJvl~doJLN*4A@Pbaul~xyJJJww}IIJÐN~LkR{mmaUULEC><;;{mDRs*MSPwms}wy<u|ƌ  Y10 Y 1122X48C1£dzʧr]^NJqZoe~|Z~W43XV32X+1fIHJLh67:gfs˂uncor~EMUUaml|ؚѩʵɩӛlG@/' "vg9~{~iyenaMxx,wMw^Fyl}l 66xtm|cw&LL+dtjiJ4qqߠ˚|O)xOpYpZ,,pWwT,JyIE7wt4vQ^6_4 TT4 P q q bty % %  @tTtL tto tt ttD4 TT 4 t#4 +PPPP]w~PPPP# QPQPPQPQk#4 ]w~PPpp# iP# T /0   x `tT_`b##b`_ yyQ t33 V22VL ' !!yrr11K- /H !!e+TTTrryy!!!!V@;vyuw{{{s{sqvwtzz zm m{`mm  F> v m m m %%WBS qg@\LP{|@)҅%V` BBB %%  @w\h<;v-;ݯ].Sg9GFXVi_d:ftl\mM>U:\!-B o-Bvˌ{bє~8w0R8#0F2SXtegJ]lA9HH8QXi[syxy\HN-fXR22Tt4t9lF9y4d;1?;UҒ/tt<%%< "SKj<5eZ>:$ $$=:Z>ejS m$54444q(f?f?(q***M**wI9(9II9(9I*' wdA467MR*M8=IF[-2 ~ 0XPdow4 4b^hvii!r(u)-vjzfj~qsoqz az qHoCwqs|qjz)(!ivi#o#vi%GT;;;;;;P 0VviWPVgumlwa||q{cYili`dH__·I5)4y)Y>BݮU11V1h8SM$wh#hAQWƇ¹ÐvZ];();;)(<&U11UԡϱB.` eSGtCm$t]$ttR4'4$BL8,L9}x9`Q^fxOoDk3dGԴ"TUa  vsXQF55EE65E<xiUNgs{f<ϖҖ~hr84W{mXx|cqJ_s'*0󍂎iZӵԵYn5U+"C~?ihyvxnnn6 >#A0W9 |xuzlMx|lT(x||xx|T*0(=`hZ6, L86- I86, _ -i1Yn|||jjk8dJ!E+z$99$+!8YisV>crbxy~vz\\\}v{~^ws8~64468w^~ybrc>s3%p[rrcrrkii~kssqrbrIIV*B+$$c+CB~II%%Uaa;U%% 5??H5 ~)ԫ   Tt t ` 5!J Jn J wNk+mTTT11W E VNMDH>>35b d- E. :V22VV22Vd'cU/ ocuovocv?% q|~fFF 0.*ocvnvocv&0q|KTi KTTdhjw{i^u_oYlnus o^iwhY_u{jhwuji>qw[GA?ijkŒ[V(1g=VijNbi6%Qtb(e nzfl4u~d p "v[~}dtVldvtşW4tt }}} "CVt[Rt}~[tvR[Cljh\^a\Qwt\s[Rsjz\oUwQVf[VT[gdk\c`^ebiObt6Qb(Te |TT&&'dq:=2G<LCYRhn@K5 $c{{q{<<{{qz{cc00E3'ҥ}}{PRHLbyz{*Tb#E.ᕖz<_d_:@sgD_^_*dJA Bɴ׵to'W4pwοšvWXM uY1A3g,{ հ yL Z=xsav^|ZZ[k.k/k.hemf$6k+ː]V$Iqo~QNڈ7.;ghhVND<{B3^w/ۍֵ5b LQ*GJW}ϗѝڏy kTUnn~ryj_MlNy|bmmT]bj[X]~-u[_k[TZKNW]dWT]TkYacYUaö1r&>kfbr(ywvE^nw"'hRcl`jObenfQaWT`]Tti\~{&XU3tOZq]s~Q[8qQ]sZq{N\[kP`m]lM_|r(nhd&>lecovDd$H6}z~t1YbSu\qP y,:|`B/ O~TaKJ~Lyy1Vwy:pI>/2ndgaWrsw  =!Y 2R?2"?=. O?U<AD$(-}}}[ׯMgYST**lSmMrWJB`enū)c1&E,u|ѰڡšXMN9* T(T33T&V ]!zltahqrp!s,o"prrgl!| N#l[heeezpK^7Lw} cb* [)F3RtZ>UKLLdllh]rd.^7|}}\".% _qqoy~yGAokzAïwPW ~|ԪAyoqq0[]yZigmpgːt@6)HW\!zktaiqqq s,o!qrqhk!{ N#k[iedezpK^7Kx}p    #` RN{M{ xiwi9#GsE}Tl+{X|V}2h8pihE[&Yr!hgRoq-εߝA UǾԾ*}t~xqi#E3lgc2Fj`\Y=urrqrqs $>tY~\w`rk2FclgglbE3jr`w\~Yu<rqqqrr %tmZR{QsstN]wiggXnϤOTͮmwmwmwŷ v|iI#&bSS!mvvu  D4P 3i-kbUST345IIIyq߬ ) )) 19j4 :P* C3+K}T -M ujmatvhj_|[t>4a@kk[|^4z8qFl;7MtH $v"?-=xGnS-ub7È A wc-Ef7-^DNfrx~58~O  K(JD;;JEYFkT«FYEA# ## #$ ## $R+7TS+V T}y ` $ ## $# ## #[pdIH[<+N  >t:OO  %%%&$'b %%$'#( Gg4(K K4(Gg.S1>P;;>S1. F ڨzz'.<!bV[b-;PP-;b[V!E$@hh ? +YZ< [ ZY+  d 0dA1]ZInBBIZ1dA05K.$$%&T `X +S @gT T B[PP>P[,cs£,P t K: y}j Ky}}yTy} K K[R +X @l  9tk,ccTsNNTck,BP>ƻPn4RT1 T7}y1 T 8 K ' T1 T @ {X @l  o0v@0<;u^'\ =*S<,cXP*"c`[h3\5jj5< UgF19PREij+#hd$єZۯӄhw*K (Y&ZvV^e1.j4E9""оqrQ)`j#KE[|z0Y`7~?g drlf.kg*{WrrZ^mwvl[s njbgnzhylqfSB[< .ShtviKkTpxvnmn`j|kfZ_FnʬҞgn|rRMHh,Irqprg^sAM/)8[PD0nf ivqXѵ+DD yZnbt9#tx 3 us{q[Ƣ᳚s~N\ 0H" H" H" H" 1  VKTT6 64" E#E EP/"@Z<[@E EE#[<:Z TTT@TTx T) 9 __&X.$ Kp_A;__9~2M@nh M* TKMT @nh M(@nh M P M@  @ i @ TT&DNuye }  Vҽ T} ljllR  ~ufH7NuuaauuTAMr\JC+1 7}yy}}yy}K}yy}}y+ , @j vjIIJ# %BzϜԝ̒<LRosxzce%k$ld!|{{tuv\| k~}lr>++6YF$&E{YIv['?Eljo~ (9 0tX @] T +X T] S TgTZ c k~~w~}}}}~~w~&&~}}}}~&&~}}}}~&&~w~~}}}}~w~~k =====&& ==== &&====&&====&&} ""4 0_}2/bw_1*S@ H2spoȫg zz9A{ezp{{hh{zqz@ez@zz'L`FF=1<1#WX ]vvL;3lK@+@LV +< qU]%FO^ePVn`r'sysfX\Rq8dsضsF%KٮJ}3хbslt[`Tvuai4.:e?2%ٰۂ~%~GbRSlg}^`st`an좾]4jމQ@.&%&%&%&% YJ I8/-pR %szw8&%Bpq2zr% !!2.l?A  R჋Ίt,ә$j"u/}s-|ZH8 H.w_puj}$xll`?^ l2BAAq3l۴l8okmYQSBjtvml .ڎ\KHqX @l  )uAp6wYl4~yUѯW?QYm}ptjhFEPx3|(/ŏ45&ϻąfamJ?jԋ<#>n,iIΙJ\DHհ4.4g"]vzuyia=sA|M5#Mo`Ba,l#:PhCt"]уHą3B̖ڒ/qu=hUUv@i/ ::hUyrw>ggjk>pDLUxzxzxzxz[a7MzR?ݙob4~{z+4+4+4+4+ T@   (     ` @{3 @< A P    P P  x 7ޜr8{M11Mז@;NyydmyN!4p<%0d*TKjjT*6Ld0%pb;4NmdylymczN ;j|@118rz;jN mzcmmNT4o;b0dSL6jcjKSd0<oT4N!ymN ]]zϞҞԝxxy5___Yt ~rl3/r5l3/  HrvZjG ?C-T%%\:RR:R_DDDDDDDD?)|8oCA /-$",B5|6-GcKdԛӘ py||u~w'~rb F o    & , @ e s {      - : K U c g l u |   / O V Z ` j o u {  &Dbs~-18>EKOTm  ).7<DQYns%:@Ui{ "',1CUZl~$(-2BHP`gku{ $,2APWZ_drw} +8EOU[binty~ $).38CNY_doz <<C KFKkr =oYB; E#E EP/" @Z<[ E EE#[<:Z@ TTT TTxTBt) P t* i@EXXE+y}}yK . +EXXE P  +  .  '  33 y] hnnh }y ]]]]s4  . \2A y} B  ,  FTk BBa U) y}}yKy}}yTN %  = hnnhhnq F  A [ ]]E }t ""  M - \      1<0 0 +   ff }y f _" - .  hnnh C p  }yT(  - V` C3 }yTy}}yT c  |z S +o + D+ \T2TA  ʆiimdod $@~ Kz&w{yyw}| |}xz{wa&zK $|' [[ !!  oZ S 1  0 [R YWffG ffU ] @g w TH U  3CC3 X K] + > TY  [ RDh  1  TTTG_^X*D4 4D*Y_`tW ! '''e   TT  TT i hh    O  g B 4TT=TT y}7 !x! hD  : ,  JJ 4   F/B NPuc]T! >9U G @V``V}~d3fTw@t(suwN5~w}+}PV  {zg  : T TR ] Ky}  H g TB 4$$G U$$ V``VV` `V  ! _Ib \;COLD|yz|ru{A0%{[k @h hn z|  r  4~~4`_`R`e9C/R&ažҦ4A'")~4 Uff ,u !55! = = T- /T {z GCC8=<<8CGC   VV  z| YY .:t: } &&T O  ' LfeNzyz# u"=1?u՗ ff YY Yff  & /]]1a }. M MY;/a3 :  t@y t gZ !5  \|\?ZEԅc*y^H(ym|[ n U t3 ZZr EQQEEQc '> 0 4 Z V``V  ~   zz3') {z4  +<<<< { .= =  C 9"TM5Ř{~~D;i ffW 4x !x! QE 8 8 8 x  i     tkRE; V``V< A 5 /  RT &    + ,  3    O >  zr^``^?*<씒   @(  S t }    X @] -   }y yrrrryy  ( yy ~w~~     [  tt |z@( Tz| }D}} RD ,l"7o''$ { 1 D     !K z{ 8T(A(A(A mt Kxxtw~ ̍t|~}: @w{tsoyx ~  R1 7 OIIgX!!gXg! fz\J$9:lA ~w]]w~ z  mm))mm)  { G YU 3- t a h N0  K m + )v P  \ t44  < A ,, , ,  T  b  < TA  F  }t.+ݭ { `T33 V @  tk rcrr   @  >  xyots{ SK(   tp  yy :  7 D$$D   nh &T* 5 @$$@! quuqqu;;uq f K< p   QE t ' rrcr 2 T STdJ,]շ49 arwwvyr/ (DB%$AΌ %  `uttu~w ccl qt= hF B 44    V s V   Ez*6z*E! !$DD$    7T  -  R  5 yy C .  @h  <<<<  o7 TT_Ld haahi`ah  /ti V H  ԫԫ  ] Tt . ;; <:Z:  3}|A  P  3C ɽ Nba] 0 $7 o"7l      @      << y}|z  i  z{ RD 3 $$ DR  ip w   EQy 1 0 fM@ jmq  ,4[  @ XtxmihbW_)  RK( t :z{ z} R%  7 tC ( t  z x x !5  x  & %y}  _gg_    *10 ˒ h   `V  m    [  ˋˋˋˋˋ 7ߋ7   K [ L z   - -      Ty  !5  z + &m/ %t~ -   \$"WT * nh ttt v    ##   h33spyrs@  "" x@8 !"""`>N^fin~'(.>N^n~>N^n~ !"""`!@P`gjp ()0@P`p!@P`p\QA0ޕR     v^  %|_<O<01h  pv_]yn2@zZ@55 ZZ@,_@f@ @(@@@- MM- MM@@@ -b   5-8@ D@,*@  m)@@   ' D9>dU*#    R     @ e  %RE    $ k(D'  % %  0$.$P/ /: /K /Q]    ^ U k "y U $ U  a y * <Copyright Dave Gandy 2016. All rights reserved.FontAwesomeFONTLAB:OTFEXPORTVersion 4.7.0 2016Please refer to the Copyright section for the font trademark attribution notices.Fort AwesomeDave Gandyhttp://fontawesome.iohttp://fontawesome.io/license/Copyright Dave Gandy 2016. All rights reserved.FontAwesomeRegularFONTLAB:OTFEXPORTVersion 4.7.0 2016Please refer to the Copyright section for the font trademark attribution notices.Fort AwesomeDave Gandyhttp://fontawesome.iohttp://fontawesome.io/license/prewikka-5.1.1/prewikka/htdocs/fonts/fontawesome-webfont.eot0000664000175000017500000050355613555143652025722 0ustar tandrejatandreja00000000000000nLPYxϐFontAwesomeRegular$Version 4.7.0 2016FontAwesome PFFTMkGGDEFp OS/22z@X`cmap : gasphglyfMLhead-6hhea $hmtxEy loca\ maxp,8 name㗋ghpostkuːxY_< 3232  '@i33spyrs@  pU]yn2@ zZ@55 zZZ@,_@s@ @(@@@- MM- MM@@@ -`b $ 648""""""@ D@ ,,@  m)@@   ' D9>dY* '    T     @ f %RE    $!k(D'  % %  0%/&p@0 !"""`>N^n~.>N^n~>N^n~ !"""`!@P`p 0@P`p!@P`p\XSB1ݬ        ,,,,,,,,,,,,,tLT$l x T ( dl,4dpH$d,t( !"0# $,$&D'()T**,,-.@./`/00123d4445 556 6\67H78 8`89L9:h:;<>?h?@H@A0ABXBCdCDLDEFG0GHIJ8KLMdN,NNOP`PQ4QR RlS,ST`U0WXZ[@[\<\]^(^_`pb,bddePefg`giLijDk klm@n,oLpqrsxttuD{`||}}~Hl@lH T H`@$\XDTXDP,8d\Hx tXpdxt@ Œ\ ļŸƔ0dʨˀ͔xϰЌ,ш҈ ӌ8,՜`lHش`Tڸ۔@lބ߬lp 4X$l( ` d      ,,8(Xx|T@| !"x##l$$'h(*L,T.L1t1230345t6T7$8 9H::;<<?X@ABCDEHFHGpHHIxJ JKLMN@P@QRSDT ULV`VWXX4XZZ[d[\|]^`aHabcXdetfhghi\jxnp@svwxyz{h|}}\lt4t88LT|| 4xLX(  @lt$xLL HĠT(  ʈˠϔldPՄxpڬTT ވL <H$l4 Pl ,xp,xt d 44,hP 4   4<,,408$8T |!h"$L%0&H'()*0*+,.$.012@234t5$69 ::; ;<(<=4?@ACDFH`HILLLLLLLLLLLLLLLLp7!!!@pp p]!2#!"&463!&54>3!2+@&&&&@+$(($F#+&4&&4&x+#+".4>32".4>32467632DhgZghDDhg-iWDhgZghDDhg-iW&@ (8 2N++NdN+';2N++NdN+'3 8!  #"'#"$&6$ rL46$܏ooo|W%r4L&V|oooܳ%=M%+".'&%&'3!26<.#!";2>767>7#!"&5463!2 %3@m00m@3%    @ :"7..7":6]^B@B^^BB^ $΄+0110+$ (   t1%%1+`B^^B@B^^"'.54632>324 #LoP$$Po>Z$_dC+I@$$@I+"#"'%#"&547&547%62V??V8<8y   b% I))9I  + % %#"'%#"&547&547%62q2ZZ2IzyV)??V8<8)>~>[   2 b% I))9I %#!"&54>3 72 &6 }XX}.GuLlLuG.>mmUmEEm> /?O_o54&+";2654&+";2654&+";264&#!"3!2654&+";2654&+";264&#!"3!2654&+";2654&+";2654&+";267#!"&5463!2&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&^BB^^B@B^@&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&B^^B@B^^/?#!"&5463!2#!"&5463!2#!"&5463!2#!"&5463!2L44LL44LL44LL44LL44LL44LL44LL44L4LL44LL4LL44LL4LL44LL4LL44LL /?O_o#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!28((88(@(88((88(@(88((88(@(88((88(@(88((88(@(88((88(@(88((88(@(88((88(@(88((88(@(8 (88((88(88((88(88((88(88((88(88((88(88((88(88((88(88((88(88((88/?O_#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!28((88(@(88((88(@(88(@(88((88((88(@(88(@(88((88(@(88((8 (88((88(88((88(88((88(88((88(88((88(88((88y"/&4?62 62,PP&PP,jPn#$"' "/&47 &4?62 62 PP&P&&P&P&P&&P&P#+D++"&=#"&=46;546;232  #"'#"$&6$   @    @  rK56$܏ooo|W@    @   rjK&V|oooܳ0#!"&=463!2  #"'#"$&6$   @ rK56$܏ooo|W@  @ rjK&V|oooܳ)5 $&54762>54&'.7>"&5462zz+i *bkQнQkb* j*LhLLhLzzBm +*i JyhQQhyJ i*+ mJ4LL44LL/?O%+"&=46;2%+"&546;2%+"&546;2+"&546;2+"&546;2`r@@r@@n4&"2#"/+"&/&'#"'&'&547>7&/.=46?67&'&547>3267676;27632Ԗ #H  ,/ 1)  ~'H  (C  ,/ 1)  $H ԖԖm 6%2X  % l2 k r6 [21 ..9Q $ k2 k w3 [20/;Cg+"&546;2+"&546;2+"&546;2!3!2>!'&'!+#!"&5#"&=463!7>3!2!2@@@@@@@`0 o`^BB^`5FN(@(NF5 @@@L%%Ju  @LSyuS@%44%f5#!!!"&5465 7#"' '&/&6762546;2&&??>  LL >  X   &&&AJ A J Wh##!"&5463!2!&'&!"&5!(8((88((`x c`(8`((88(@(8(D 9 8( ,#!"&=46;46;2.  6 $$ @(r^aa@@`(_^aa2NC5.+";26#!26'.#!"3!"547>3!";26/.#!2W  .@   @.$S   S$@   9I   I6>  >%=$4&"2$4&"2#!"&5463!2?!2"'&763!463!2!2&4&&4&&4&&48(@(88(ч::(8@6@*&&*4&&4&&4&&4& (88(@(8888)@)'&&@$0"'&76;46;232  >& $$ `  (r^aa` @`2(^aa$0++"&5#"&54762  >& $$ ^ ?  @(r^aa` ? (^aa #!.'!!!%#!"&547>3!2<<<_@`&& 5@5 @  &&>=(""='#"'&5476.  6 $$   ! (r^aaJ %%(_^aa3#!"'&?&#"3267672#"$&6$3276&@*hQQhwI mʬzzk)'@&('QнQh_   z8zoe$G!"$'"&5463!23267676;2#!"&4?&#"+"&=!2762@hk4&&&GaF * &@&ɆF * Ak4&nf&&&4BHrd@&&4rd  Moe&/?O_o+"&=46;25+"&=46;25+"&=46;2#!"&=463!25#!"&=463!25#!"&=463!24&#!"3!26#!"&5463!2 @  @  @  @  @  @  @    @    @    @   ^B@B^^BB^`@  @ @  @ @  @ @  @ @  @ @  @ 3@  MB^^B@B^^!54&"#!"&546;54 32@Ԗ@8(@(88( p (8jj(88(@(88@7+"&5&5462#".#"#"&5476763232>32@@ @ @KjKך=}\I&:k~&26]S &H&  &H5KKut,4, & x:;*4*&K#+"&546;227654$ >3546;2+"&="&/&546$ <X@@Gv"DװD"vG@@X<4L41!Sk @ G< _bb_ 4.54632&4&&M4&UF &""""& F&M&&M&%/B/%G-Ik"'!"&5463!62#"&54>4.54632#"&54767>4&'&'&54632#"&547>7676'&'.'&54632&4&&M4&UF &""""& FU &'8JSSJ8'&  &'.${{$.'& &M&&M&%/B/%7;&'66'&;4[&$ [2[ $&[  #/37#5#5!#5!!!!!!!#5!#5!5##!35!!! #'+/37;?3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3???? ^>>~??????~??~??^??^^? ^??4&"2#"'.5463!2KjKKjv%'45%5&5L45&% jKKjK@5%%%%54L5&6'k54&"2#"'.5463!2#"&'654'.#32KjKKjv%'45%5&5L45&%%'4$.%%5&55&% jKKjK@5%%%%54L5&6'45%%%54'&55&6' yTdt#!"&'&74676&7>7>76&7>7>76&7>7>76&7>7>63!2#!"3!2676'3!26?6&#!"3!26?6&#!"g(sAeM ,*$/ !'& JP$G] x6,& `   h `   "9Hv@WkNC<.  &k& ( "$p" . #u&#  %!' pJvwEF#  @   @  2#"' #"'.546763!''!0#GG$/!''! 8""8  X! 8" "8  <)!!#"&=!4&"27+#!"&=#"&546;463!232(8&4&&4 8(@(8 qO@8((`(@Oq8(&4&&4&@` (88( Oq (8(`(q!)2"&42#!"&546;7>3!2  Ijjjj3e55e3gr`Ijjjj1GG1rP2327&7>7;"&#"4?2>54.'%3"&#"#ժ!9&WB03& K5!)V?@L' >R>e;&L::%P>vO 'h N_":- &+# : ' +a%3 4'.#"32>54.#"7>7><5'./6$3232#"&#"+JBx)EB_I:I*CRzb3:dtB2P$ $5.3bZF|\8!-T>5Fu\,,jn OrB,7676'5.'732>7"#"&#&#"OA zj=N!}:0e%  y + tD3~U#B4 # g  '2 %/!: T bRU,7}%2"/&6;#"&?62+326323!2>?23&'.'.#"&"$#"#&=>764=464.'&#"&'!~:~!PP!~:~!P6 ,,$$% *'  c2N  ($"LA23Yl !x!*%%%% pP,T NE Q7^oH!+( 3  *Ueeu  wga32632$?23&'.5&'&#"&"5$#"#&=>7>4&54&54>.'&#"&'2#".465!#".'&47>32!4&4>Q6 ,,Faw!*' =~Pl*  ($"LA23Yl  )!* <7@@7<  <7@@7<  pP,T MF Q747ƢHoH!+( 3  tJHQ6  wh',686,'$##$',686,'$##$/?%#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2&&&&&&&&&&&&&&&&&&&&f&&&&f&&&&f&&&&/?%#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2&&&&&&&&&&&&&&&&&&&&f&&&&f&&&&f&&&&/?%#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2&&&&&&&&&&&&&&&&&&&&f&&&&f&&&&f&&&&/?%#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2&&&&&&&&&&&&&&&&&&&&f&&&&f&&&&f&&&&/?O_o%+"&=46;2+"&=46;2+"&=46;2#!"&=463!2+"&=46;2#!"&=463!2#!"&=463!2#!"&=463!2        @     @   @   @   s  s    s    s  s  /?O#"'&47632#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2     @     @   @  @          s  s  s  /?O#"&54632 #!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2`      @     @   @  @     @   s  s  s  #"'#!"&5463!2632' mw@www '*wwww."&462!5 !"3!2654&#!"&5463!2pppp@  @ ^BB^^B@B^ppp@@  @    @B^^BB^^k%!7'34#"3276' !7632k[[v  6`%`$65&%[[k `5%&&'4&"2"&'&54 Ԗ!?H?!,,ԖԖmF!&&!Fm,%" $$ ^aa`@^aa-4'.'&"26% 547>7>2"KjKXQqYn 243nYqQ$!+!77!+!$5KK,ԑ ]""]ً 9>H7'3&7#!"&5463!2'&#!"3!26=4?6 !762xtt`  ^Qwww@?6 1B^^B@B^ @(` `\\\P`tt8`  ^Ͼww@w 1^BB^^B~ @` \ \P+Z#!"&5463!12+"3!26=47676#"'&=# #"'.54>;547632www M8 pB^^B@B^ 'sw- 9*##;Noj' #ww@w "^BB^^B  *  "g`81T`PSA:'*4/D#!"&5463!2#"'&#!"3!26=4?632"'&4?62 62www@?6 1 B^^B@B^ @ BRnBBn^ww@w 1 ^BB^^B @ BnnBC"&=!32"'&46;!"'&4762!#"&4762+!54624&&4&&44&&4&&44&&44&&4&&44&&6'&'+"&546;267: &&&& s @  Z&&&&Z +6'&''&'+"&546;267667: : &&&&  s @  :  Z&&&&Z  : z6'&''&47667S: : s @  : 4 : | &546h!!0a   $#!"&5463!2#!"&5463!2&&&&&&&&@&&&&&&&&#!"&5463!2&&&&@&&&&&54646&5- : s  :  :4:  +&5464646;2+"&5&5-  &&&& : s  :  : &&&& :  &54646;2+"&5- &&&& s  : &&&&  62#!"&!"&5463!24 @ &&&&-:&&&& "'&476244444Zf "/&47 &4?62S44444#/54&#!4&+"!"3!;265!26 $$ &&&&&&&&@^aa@&&&&&&&&+^aa54&#!"3!26 $$ &&&&@^aa@&&&&+^aa+74/7654/&#"'&#"32?32?6 $$ }ZZZZ^aaZZZZ^aa#4/&"'&"327> $$ [4h4[j^aa"ZiZJ^aa:F%54&+";264.#"32767632;265467>$ $$ oW  5!"40K(0?i+! ":^aaXRd D4!&.uC$=1/J=^aa.:%54&+4&#!";#"3!2654&+";26 $$ ```^aa^aa/_#"&=46;.'+"&=32+546;2>++"&=.'#"&=46;>7546;232m&&m l&&l m&&m l&&ls&%&&%&&%&&%&&&l m&&m l&&l m&&m ,&%&&%&&%&&%&#/;"/"/&4?'&4?627626.  6 $$ I     ͒(r^aaɒ    (_^aa , "'&4?6262.  6 $$ Z4f44fz(r^aaZ&4ff4(_^aa "4'32>&#" $&6$  WoɒV󇥔 zzz8YW˼[?zz:zz@5K #!#"'&547632!2A4@%&&K%54'u%%&54&K&&4A5K$l$L%%%54'&&J&j&K5K #"/&47!"&=463!&4?632%u'43'K&&%@4AA4&&K&45&%@6%u%%K&j&%K55K&$l$K&&u#5K@!#"'+"&5"/&547632K%K&56$K55K$l$K&&#76%%53'K&&%@4AA4&&K&45&%%u'5K"#"'&54?63246;2632K%u'45%u&&J'45%&L44L&%54'K%5%t%%$65&K%%4LL4@&%%K',"&5#"#"'.'547!34624&bqb>#  5&44& 6Uue7D#  "dž&/#!"&546262"/"/&47'&463!2 &@&&4L  r&4  r L&& 4&&&L rI@& r  L4&& s/"/"/&47'&463!2#!"&546262&4  r L&& &@&&4L  r@@& r  L4&& 4&&&L r##!+"&5!"&=463!46;2!28(`8((8`(88(8((8(8 (8`(88(8((8(88(`8#!"&=463!28(@(88((8 (88((88z5'%+"&5&/&67-.?>46;2%6.@g.L44L.g@. .@g. L44L .g@.g.n.4LL43.n.gg.n.34LL4͙.n.g -  $54&+";264'&+";26/a^    ^aa fm  @ J%55!;263'&#"$4&#"32+#!"&5#"&5463!"&46327632#!2$$8~+(888(+}(`8((8`]]k==k]]8,8e8P88P8`(88(@MMN4&#"327>76$32#"'.#"#"&'.54>54&'&54>7>7>32&z&^&./+>+)>J> Wm7' '"''? &4&c&^|h_bml/J@L@#* #M6:D 35sҟw$ '% ' \t3#!"&=463!2'.54>54''  @ 1O``O1CZZ71O``O1BZZ7@  @ N]SHH[3`)TtbN]SHH[3^)Tt!1&' 547 $4&#"2654632 '&476 ==嘅}(zVl''ٌ@uhyyhu9(}VzD##D# =CU%7.5474&#"2654632%#"'&547.'&476!27632#76$7&'7+NWb=嘧}(zVj\i1  z,X Y[6 $!%'FuJiys?_9ɍ?kyhun(}Vz YF  KA؉La  02-F"@Qsp@_!3%54&+";264'&+";26#!"&'&7>2    #%;"";%#`,@L 5 `   `  L`4LH` `   a 5 L@ #37;?Os!!!!%!!!!%!!!!!!!!%!!4&+";26!!%!!!!74&+";26%#!"&546;546;2!546;232 `@ `@ @@ @ @  @  @  @  @ L44LL4^B@B^^B@B^4L  @@@@    @@   @@    M4LL44L`B^^B``B^^B`L7q.+"&=46;2#"&=".'673!54632#"&=!"+"&=46;2>767>3!546327>7&54>$32dFK1A  0) L.٫C58.H(Ye#3C $=463!22>=463!2#!"&5463!2#!"&5463!2H&&/7#"&463!2!2LhLLhLhLLh! &&&&& &4hLLhLLhLLhL%z< 0&4&& )17&4& &&#!"&5463!2!2\@\\@\\@\\\\ W*#!"&547>3!2!"4&5463!2!2W+B"5P+B@"5^=\@\ \H#t3G#3G:_Ht\\ @+32"'&46;#"&4762&&4&&44&&44&&4@"&=!"'&4762!54624&&44&&44&&4&& !!!3!!0@67&#".'&'#"'#"'32>54'6#!"&5463!28ADAE=\W{O[/5dI kDtpČe1?*w@www (M& B{Wta28r=Ku?RZ^GwT -@www$2+37#546375&#"#3!"&5463ww/Dz?swww@wS88 ww#'.>4&#"26546326"&462!5!&  !5!!=!!%#!"&5463!2B^8(Ԗ>@|K55KK55K^B(8ԖԖ€>v5KK55KKHG4&"&#"2654'32#".'#"'#"&54$327.54632@pp)*Pppp)*Pb '"+`N*(a;2̓c`." b PTY9ppP*)pppP*)b ".`(*Nͣ2ͣ`+"' b MRZB4&"24&"264&"26#"/+"&/&'#"'&547>7&/.=46?67&'&547>3267676;27632#"&'"'#"'&547&'&=4767&547>32626?2#"&'"'#"'&547&'&=4767&547>32626?2ԖLhLKjKLhLKjK "8w s%(  ")v  >  "8x s"+  ")v  <  3zLLz3 3>8L3)x3 3zLLz3 3>8L3)x3 ԖԖ4LL45KK54LL45KK #)0C wZ l/ Y N,& #)0C vZl. Y L0"qG^^Gqq$ ]G)FqqG^^Gqq$ ]G)Fq%O#"'#"&'&4>7>7.546$ '&'&'# '32$7>54'VZ|$2 $ |E~E<| $ 2$|ZV:(t}X(  &%(Hw쉉xH(%& (XZT\MKG<m$4&"24&#!4654&#+32;254'>4'654&'>7+"&'&#!"&5463!6767>763232&4&&4N2`@`%)7&,$)' %/0Ӄy#5 +1 &<$]`{t5KK5$e:1&+'3TF0h4&&4&3M:;b^v+D2 5#$IIJ 2E=\$YJ!$MCeM-+(K55KK5y*%Au]c>q4&"24&'>54'654&'654&+"+322654&5!267+#"'.'&'&'!"&5463!27>;2&4&&4+ 5#bW0/% ')$,&7)%`@``2Nh0##T3'"( 0;e$5KK5 tip<& 1&4&&4&#\=E2&%IURI$#5 2D+v^b;:M2gc]vDEA%!bSV2MK55K(,,MeCM$!I@#"&547&547%6@?V8 b% I)94.""'." 67"'.54632>32+C`\hxeH>Hexh\`C+ED4 #LoP$$Po>Q|I.3MCCM3.I|Q/Z$_dC+I@$$@I+ (@%#!"&5463!2#!"3!:"&5!"&5463!462 ww@  B^^B  4&@&&&4 `  ww   ^B@B^ 24& && &%573#7.";2634&#"35#347>32#!"&5463!2FtIG9;HIxI<,tԩw@wwwz4DD43EEueB&#1s@www .4&"26#!+"'!"&5463"&463!2#2&S3 Ll&c4LL44LL4c@& &{LhLLhL'?#!"&5463!2#!"3!26546;2"/"/&47'&463!2www@B^^B@B^@&4t  r &&`ww@w@^BB^^B@R&t r  4&&@"&5!"&5463!462 #!"&54&>3!2654&#!*.54&>3!24&@&&&4 sw  @B^^B  @w4& && &3@w   ^BB^    I&5!%5!>732#!"&=4632654&'&'.=463!5463!2!2JJSq*5&=CKuuKC=&5*q͍S8( ^B@B^ (8`N`Ѣ΀GtO6)"M36J[E@@E[J63M")6OtG(8`B^^B`8 ',26'&'&76'6'&6&'&6'&4#"7&64 654'.'&'.63226767.547&7662>76#!"&5463!2  /[  . =XĚ4,+"  * +, 1JH'5G:: #L5+@=&#w@wwwP.1GE,ԧ4 4+ ; /5cFO:>JJ>:O9W5$@(b 4 @www'?$4&"2$4&"2#!"&5463!3!267!2#!#!"&5!"'&762&4&&4&&4&&48(@(88(c==c(8*&&*6&4&&4&&4&&4& (88(@(88HH88`(@&&('@1c4&'.54654'&#"#"&#"32632327>7#"&#"#"&54654&54>76763232632   N<;+gC8A`1a99gw|98aIe$IVNz<:LQJ  ,-[% 061I()W,$-7,oIX()oζA;=N0 eTZ  (O#".'&'&'&'.54767>3232>32 e^\4?P bMO0# 382W# & 9C9 Lĉ" 82<*9FF(W283 #0OMb P?4\^e FF9*<28 "L 9C9 & #!"3!2654&#!"&5463!2`B^^B@B^^ީwww@w^BB^^B@B^ww@w#!72#"' #"'.546763YY !''!0#GG$/!''!&UUjZ 8""8  X! 8" "8 GW4.'.#"#".'.'.54>54.'.#"32676#!"&5463!2 1.- +$)  c8 )1)  05.D <90)$9w@wwwW  )1) 7c  )$+ -.1 9$)0< D.59@www,T1# '327.'327.=.547&54632676TC_LҬ#+i!+*pDNBN,y[`m`%i]hbEm}a u&,SXK &$f9s? _#"!#!#!54632V<%'ЭHH (ںT\dksz &54654'>54'6'&&"."&'./"?'&546'&6'&6'&6'&6'&74"727&6/a49[aA)O%-j'&]]5r-%O)@a[9' 0BA; + >HCU  #  $  2  AC: oM=a-6OUwW[q ( - q[WwUP6$C +) (  8&/ &eMa  & $      %+"&54&"32#!"&5463!54 &@&Ԗ`(88(@(88(r&&jj8((88(@(8#'+2#!"&5463"!54&#265!375!35!B^^BB^^B   `^B@B^^BB^  ` !="&462+"&'&'.=476;+"&'&$'.=476; pppp$!$qr % }#ߺppp!E$ rqܢ# % ֻ!)?"&462"&4624&#!"3!26!.#!"#!"&547>3!2/B//B//B//B @   2^B@B^\77\aB//B//B//B/@    ~B^^B@2^5BB52.42##%&'.67#"&=463! 25KK5L4_u:B&1/&.- zB^^B4LvyKjK4L[!^k'!A3;):2*547&5462;U gIv0ZZ0L4@Ԗ@4L2RX='8P8'=XR U;Ig0,3lb??bl34LjjL4*\(88(\}I/#"/'&/'&?'&'&?'&76?'&7676767676` (5 )0 ) *) 0) 5(  (5 )0 )))) 0) 5( *) 0) 5(  )5 )0 )**) 0) 5)  )5 )0 )*5h$4&"24&#!4>54&#"+323254'>4'654&'!267+#"'&#!"&5463!2>767>32!2&4&&4N2$YGB (HGEG HQ#5K4Li!<;5KK5 A# ("/?&}vh4&&4&3M95S+C=,@QQ9@@IJ 2E=L5i>9eME;K55K J7R>@#zD<5=q%3#".'&'&'&'.#"!"3!32>$4&"2#!"#"&?&547&'#"&5463!&546323!2` #A<(H(GY$2NL4K5#aWTƾh&4&&4K5;=!ihv}&?/"( #A  5K2*! Q@.'!&=C+S59M34L=E2 JI UR@@&4&&4&5K;ELf9>igR7J K5h4&"24#"."&#"4&#"".#"!54>7#!"&54.'&'.5463246326326&4&&4IJ 2E=L43M95S+C=,@QQ9@@E;K55K J7R>@#zD9eMZ4&&4&<#5K4LN2$YGB (HGEG HV;5KK5 A# ("/?&}vhi!<4<p4.=!32>332653272673264&"2/#"'#"&5#"&54>767>5463!2@@2*! Q@.'!&=C+S59M34L.9E2 JI UR&4&&4&Lf6Aig6Jy#@>R7J K55K;E@TƾH #A<(H(GY$2NL4K#5#a=4&&4&D=ihv}&?/"( #A  5KK5;+54&#!764/&"2?64/!26 $$ & [6[[j6[&^aa@&4[[6[[6&+^aa+4/&"!"3!277$ $$ [6[ &&[6j[ ^aae6[j[6&&4[j[^aa+4''&"2?;2652?$ $$ [6[[6&&4[^aaf6j[[6[ &&[^aa+4/&"4&+"'&"2? $$ [6&&4[j[6[j^aad6[&& [6[[j^aa   $2>767676&67>?&'4&'.'.'."#&6'&6&'3.'.&'&'&&'&6'&>567>#7>7636''&'&&'.'"6&'6'..'/"&'&76.'7>767&.'"76.7"7"#76'&'.'2#22676767765'4.6326&'.'&'"'>7>&&'.54>'>7>67&'&#674&7767>&/45'.67>76'27".#6'>776'>7647>?6#76'6&'676'&67.'&'6.'.#&'.&6'&.5/a^D&"      4   $!   #          .0"Y +  !       $     "  +       Α      ^aa                        P   ' -( # * $  "  !     * !   (         $      2 ~/$4&"2 #"/&547#"32>32&4&&4V%54'j&&'/덹:,{ &4&&4&V%%l$65&b'Cr! " k[G +;%!5!!5!!5!#!"&5463!2#!"&5463!2#!"&5463!2&&&&&&&&&&&&@&&&&&&&&&&&&{#"'&5&763!2{' **)*)'/!5!#!"&5!3!26=#!5!463!5463!2!2^B@B^&@&`^B`8(@(8`B^ B^^B&&B^(88(^G 76#!"'&? #!"&5476 #"'&5463!2 '&763!2#"'c)'&@**@&('c (&*cc*&' *@&('c'(&*cc*&('c'(&@*19AS[#"&532327#!"&54>322>32"&462 &6 +&'654'32>32"&462QgRp|Kx;CByy 6Fe= BPPB =eF6 ԖV>!pRgQBC;xK|Ԗ{QNa*+%xx5eud_C(+5++5+(C_due2ԖԖ>NQ{u%+*jԖԖp!Ci4/&#"#".'32?64/&#"327.546326#"/&547'#"/&4?632632(* 8( !)(A(')* 8( !USxySSXXVzxTTUSxySSXXVzxT@(  (8 *(('( (8 SSUSx{VXXTTSSUSx{VXXT#!"5467&5432632t,Ԟ;F`j)6,>jK?s !%#!"&7#"&463!2+!'5#8EjjE8@&&&&@XYY&4&&4&qDS%q%N\jx2"&4#"'#"'&7>76326?'&'#"'.'&676326326&'&#"32>'&#"3254?''74&&4&l NnbSVZ bRSD zz DSRb)+USbn \.2Q\dJ'.2Q\dJ.Q2.'Jd\Q2.'Jd`!O` ` &4&&4r$#@B10M5TNT{L5T II T5L;l'OT4M01B@#$*3;$*3;;3*$;3*$: $/ @@Qq`@"%3<2#!"&5!"&5467>3!263! !!#!!46!#!(88(@(8(8(`((8D<++<8(`(8(`8(@(88( 8((`(8((<`(8(``(8||?%#"'&54632#"'&#"32654'&#"#"'&54632|udqܟs] = OfjL?R@T?"& > f?rRX=Edudsq = _MjiL?T@R?E& f > =XRr?b!1E)!34&'.##!"&5#3463!24&+";26#!"&5463!2 08((88(@(8  8((88((`(1  `(88((88(@  `(88(@(8(`#!"&5463!2w@www`@www/%#!"&=463!2#!"&=463!2#!"&=463!2&&&&&&&&&&&&&&&&&&&&&&&&@'7G$"&462"&462#!"&=463!2"&462#!"&=463!2#!"&=463!2ppppppp @   ppp @    @   Рpppppp  ppp    <L\l|#"'732654'>75"##5!!&54>54&#"'>3235#!"&=463!2!5346=#'73#!"&=463!2#!"&=463!2}mQjB919+i1$AjM_3</BB/.#U_:IdDRE @  k*Gj @   @   TP\BX-@8 C)5Xs J@$3T4+,:;39SG2S.7<  vcc)) %Ll}    5e2#!"&=463%&'&5476!2/&'&#"!#"/&'&=4'&?5732767654'&@02uBo  T25XzrDCBBEh:%)0%HPIP{rQ9f#-+>;I@KM-/Q"@@@#-bZ $&P{<8[;:XICC>.'5oe80#.0(  l0&%,"J&9%$<=DTIcs&/6323276727#"327676767654./&'&'737#"'&'&'&54'&54&#!"3!260% <4"VRt8<@< -#=XYhW8+0$"+dTLx-'I&JKkmuw<=V@!X@ v '|N;!/!$8:IObV;C#V  &   ( mL.A:9 !./KLwPM$@@ /?O_o%54&#!"3!2654&#!"3!2654&#!"3!2654&#!"3!2654&#!"3!2654&#!"3!2654&#!"3!2654&#!"3!2654&#!"3!26#!"&5463!2@@@@@@@@@^BB^^B@B^NB^^B@B^^#+3 '$"/&4762%/?/?/?/?%k*66bbbb|<<<bbbbbbbb%k66Ƒbbb<<<<^bbbbbb@M$4&"2!#"4&"2&#"&5!"&5#".54634&>?>;5463!2LhLLh LhLLhL! 'ԖԖ@' !&  ?&&LhLLhL hLLhL jjjj &@6/" &&J#"'676732>54.#"7>76'&54632#"&7>54&#"&54$ ok; -j=yhwi[+PM 3ѩk=J%62>VcaaQ^ ]G"'9r~:`}Ch 0=Z٤W=#uY2BrUI1^Fk[|aL2#!67673254.#"67676'&54632#"&7>54&#"#"&5463ww+U ,iXբW<"uW1AqSH1bdww'74'!3#"&46327&#"326%35#5##33#!"&5463!20U6cc\=hlࠥYmmnnnnw@wwww&46#Ȏ;edwnnnnn@www ]#/#"$&6$3 &#"32>7!5!%##5#5353Еttu{zz{SZC` cot*tq||.EXN#?? ,<!5##673#$".4>2"&5!#2!46#!"&5463!2rM* *M~~M**M~~M*jjj&&&&`P%挐|NN||NN|*jjjj@&&&&@ "'&463!2@4@&Z4@4&@ #!"&4762&&4Z4&&4@@ "'&4762&4@4&@&4&@ "&5462@@4&&44@&&@ 3!!%!!26#!"&5463!2`m` ^BB^^B@B^  `@B^^BB^^@ "'&463!2#!"&4762@4@&&&&44@4&Z4&&4@ "'&463!2@4@&4@4&@ #!"&4762&&4Z4&&4@:#!"&5;2>76%6+".'&$'.5463!2^B@B^,9j9Gv33vG9H9+bI\ A+=66=+A [">nSMA_:B^^B1&c*/11/*{'VO3@/$$/@*?Nh^l+!+"&5462!4&#"!/!#>32]_gTRdgdQV?U I*Gg?!2IbbIJaaiwE3300 084#"$'&6?6332>4.#"#!"&54766$32z䜬m IwhQQhbF*@&('kz   _hQнQGB'(&*eoz(q!#"'&547"'#"'&54>7632&4762.547>32#".'632%k'45%&+~(  (h  &  \(  (  &  ~+54'k%5%l%%l$65+~  &  (  (\  &  h(  (~+%'!)19K4&"24&"26.676&$4&"24&"24&"2#!"'&46$ KjKKj KjKKje2.e<^P,bKjKKjKjKKj KjKKj##LlLKjKKjK jKKjK~-M7>7&54$ LhяW.{+9E=cQdFK1A  0) pJ2`[Q?l&٫C58.H(Y':d 6?32$64&$ #"'#"&'&4>7>7.546'&'&'# '32$7>54'Yj`a#",5NK ~EVZ|$2 $ |: $ 2$|ZV:(t}hfR88T h̲X(  &%(Hw(%& (XZT\MKG{x|!#"'.7#"'&7>3!2%632u  j H{(e 9 1bU#!"&546;5!32#!"&546;5!32#!"&546;5463!5#"&5463!2+!2328((88(``(88((88(``(88((88(`L4`(88(@(88(`4L`(8 (88(@(88((88(@(88((88(@(84L8(@(88((8L48OY"&546226562#"'.#"#"'.'."#"'.'.#"#"&5476$32&"5462И&4&NdN!>! 1X:Dx+  +ww+  +xD:X1 -U !*,*&4&hh&&2NN2D &  ..J< $$ 767#"&'"&547&547&547.'&54>2l4  2cKEooED ) ) Dg-;</- ?.P^P.? -/<;-gYY  .2 L4H|O--O|HeO , , Oeq1Ls26%%4.2,44,2.4%%62sL1qcqAAq4#!#"'&547632!2#"&=!"&=463!54632  @  `     ` ?`   @  @  !    54&+4&+"#"276#!"5467&5432632   `  _ v,Ԝ;G_j)``    _ ԟ7 ,>jL>54'&";;265326#!"5467&5432632    v,Ԝ;G_j) `   `7 ,>jL>X`$"&462#!"&54>72654&'547 7"2654'54622654'54&'46.' &6 &4&&4&yy %:hD:FppG9Fj 8P8 LhL 8P8 E; Dh:% >4&&4&}yyD~s[4Dd=PppP=d>hh>@jY*(88(*Y4LL4Y*(88(*YDw" A4*[s~>M4&"27 $=.54632>32#"' 65#"&4632632 65.5462&4&&4G9& <#5KK5!!5KK5#< &ܤ9Gpp&4&&4&@>buោؐ&$KjKnjjKjK$&jjb>Ppp %!5!#"&5463!!35463!2+32@\\8(@(8\@@\\@\(88(\@ 34#"&54"3#!"&5!"&5>547&5462;U gI@L4@Ԗ@4L2RX='8P8'=XR U;Ig04LjjL4*\(88(\@"4&+32!#!"&+#!"&5463!2pP@@Pjj@@\@\&0pj \\&-B+"&5.5462265462265462+"&5#"&5463!2G9L44L9G&4&&4&&4&&4&&4&L44L &=d4LL4 d=&&`&&&&`&&&&4LL4  &#3CS#!"&5463!2!&'&!"&5!463!2#!"&52#!"&=4632#!"&=463(8((88((`x c`(8@@@`((88(@(8(D 9 8(`@@@@@/?O_o-=%+"&=46;25+"&=46;2+"&=46;2%+"&=46;2+"&=46;2%+"&=46;2%+"&=46;2%+"&=46;2+"&=46;2%+"&=46;2%+"&=46;2%+"&=46;2+"&=46;2%+"&=46;2%+"&=46;2+"&=46;2%+"&=46;2+"&=46;2!!!5463!2#!"&5463!2 @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @ &&&&@  @ @  @  @  @ @  @ @  @ @  @ @  @ @  @ @  @ @  @ @  @ @  @ @  @ @  @ @  @ @  @ @  @  @  @   `&&&& /?O_o%+"&=46;25+"&=46;2+"&=46;2%+"&=46;2+"&=46;2%+"&=46;2%+"&=46;2+"&=46;2%+"&=46;2+"&=46;2!!#!"&=!!5463!24&+"#54&+";26=3;26%#!"&5463!463!2!2 @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @ 8(@(8 @  @  @  @  @ &&&@8((8@&@  @ @  @  @  @ @  @ @  @ @  @ @  @ @  @ @  @  @  @  (88(  @  ``   `` -&&& (88(&@<c$4&"2!#4&"254&+54&+"#";;26=326+"&5!"&5#"&46346?>;463!2KjKKjKjKKj&ԖԖ&&@&&KjKKjK jKKjK .&jjjj&4&@@&&#'1?I54&+54&+"#";;26=326!5!#"&5463!!35463!2+32 \\8(@(8\ \\@\(88(\: #32+53##'53535'575#5#5733#5;2+3@E&&`@@` `@@`&&E%@`@ @ @      @ 0 @!3!57#"&5'7!7!K5@   @5K@@@ #3%4&+"!4&+";265!;26#!"&5463!2&&&&&&&&w@www&&@&&&&@&&@www#354&#!4&+"!"3!;265!26#!"&5463!2&&&&&@&&@&w@www@&@&&&&&&@&:@www-M3)$"'&4762 "'&4762 s 2  .   2 w 2  .   2 w 2    2  ww  2    2  ww M3)"/&47 &4?62"/&47 &4?62S .  2 w 2   .  2 w 2  M . 2    2 .  . 2    2 .M3S)$"' "/&4762"' "/&47623 2  ww  2    2  ww  2    2 w 2   .v 2 w 2   .M3s)"'&4?62 62"'&4?62 623 .  . 2    2 .  . 2    2 .   2 w 2v .   2 w 2-Ms3 "'&4762s w 2  .   2 ww  2    2 MS3"/&47 &4?62S .  2 w 2  M . 2    2 .M 3S"' "/&47623 2  ww  2   m 2 w 2   .M-3s"'&4?62 623 .  . 2    2- .   2 w 2/4&#!"3!26#!#!"&54>5!"&5463!2  @ ^B && B^^B@B^ @  MB^%Q= &&& $$ (r^aa(^aa!C#!"&54>;2+";2#!"&54>;2+";2pPPpQh@&&@j8(PppPPpQh@&&@j8(Pp@PppPhQ&&j (8pPPppPhQ&&j (8p!C+"&=46;26=4&+"&5463!2+"&=46;26=4&+"&5463!2Qh@&&@j8(PppPPpQh@&&@j8(PppPPp@hQ&&j (8pPPppP@hQ&&j (8pPPpp@@ #+3;G$#"&5462"&462"&462#"&462"&462"&462"&462#"&54632K54LKj=KjKKjKjKKjL45KKjK<^^^KjKKjppp\]]\jKL45KjKKjKujKKjK4LKjKK^^^jKKjKpppr]]\  $$ ^aaQ^aa,#"&5465654.+"'&47623   #>bqb&44&ɢ5"  #D7euU6 &4&m 1X".4>2".4>24&#""'&#";2>#".'&547&5472632>3=T==T==T==T=v)GG+v@bRRb@=&\Nj!>3lkik3hPTDDTPTDDTPTDDTPTDD|x xXK--K|Mp<# )>dA{RXtfOT# RNftWQ,%4&#!"&=4&#!"3!26#!"&5463!2!28(@(88((88((8\@\\@\\(88(@(88(@(88@\\\\ u'E4#!"3!2676%!54&#!"&=4&#!">#!"&5463!2!2325([5@(\&8((88((8,9.+C\\@\ \6Z]#+#,k(88(@(88(;5E>:5E\\\ \1. $4@"&'&676267>"&462"&462.  > $$ n%%/02 KjKKjKKjKKjKfff^aayy/PccP/jKKjKKjKKjKffff@^aa$4@&'."'.7>2"&462"&462.  > $$ n20/%7KjKKjKKjKKjKfff^aa3/PccP/y jKKjKKjKKjKffff@^aa +7#!"&463!2"&462"&462.  > $$ &&&&KjKKjKKjKKjKfff^aa4&&4&jKKjKKjKKjKffff@^aa#+3C54&+54&+"#";;26=3264&"24&"2$#"'##"3!2@@KjKKjKKjKKjKܒ,gjKKjKKjKKjKXԀ,, #/;GS_kw+"=4;27+"=4;2'+"=4;2#!"=43!2%+"=4;2'+"=4;2+"=4;2'+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;54;2!#!"&5463!2`````````````````````p`K55KK55Kp`````````````````````````5KK55KK@*V#"'.#"63232+"&5.5462#"/.#"#"'&547>32327676R?d^7ac77,9xm#@#KjK# ڗXF@Fp:f_ #WIpp&3z h[ 17q%q#::#5KKu't#!X: %#+=&>7p @ *2Fr56565'5&'. #"32325#"'+"&5.5462#"/.#"#"'&547>32327676@ͳ8 2.,#,fk*1x-!#@#KjK# ڗXF@Fp:f_ #WIpp&3z e`vo8t-  :5 [*#::#5KKu't#!X: %#+=&>7p  3$ "/&47 &4?62#!"&=463!2I.  2 w 2   -@). 2    2 . -@@-S$9%"'&4762  /.7> "/&47 &4?62i2  .   2 w E > u > .  2 w 2   2    2  ww !   h. 2    2 . ;#"'&476#"'&7'.'#"'&476' )'s "+5+@ա' )'F*4*Er4M:}}8 GO *4*~ (-/' #"'%#"&7&67%632B;>< V??V --C4 <B=cB5 !% %!b 7I))9I7 #"'.5!".67632y( #  ##@,( )8! !++"&=!"&5#"&=46;546;2!76232-SSS  SS``  K$4&"24&"24&"27"&5467.546267>5.5462 8P88P88P88P8P88P4,CS,4pp4,,4pp4,6d7AL*',4ppP88P8P88P8HP88P8`4Y&+(>EY4PppP4Y4Y4PppP4Y%*54&#"#"/.7!2<'G,')7N;2]=A+#H  0PRH6^;<T%-S#:/*@Z}   >h.%#!"&=46;#"&=463!232#!"&=463!2&&&@@&&&@&&&&&&&&&&&&f&&&&b#!"&=463!2#!"&'&63!2&&&&''%@% &&&&&&&&k%J%#/&'#!53#5!36?!#!'&54>54&#"'6763235 Ź}4NZN4;)3.i%Sin1KXL7觧*  #& *@jC?.>!&1' \%Awc8^;:+54&#"'6763235 Ź}4NZN4;)3.i%PlnEcdJ觧*  #& *-@jC?.>!&1' \%AwcBiC:D'P%! #!"&'&6763!2P &:&? &:&?5"K,)""K,)h#".#""#"&54>54&#"#"'./"'"5327654.54632326732>32YO)I-D%n  "h.=T#)#lQTv%.%P_ % %_P%.%vUPl#)#T=@/#,-91P+R[Ql#)#|'' 59%D-I)OY[R+P19-,##,-91P+R[YO)I-D%95%_P%.%v'3!2#!"&463!5&=462 =462 &546 &&&&&4&r&4&@&4&&4&G݀&&&&f s CK&=462 #"'32=462!2#!"&463!5&'"/&4762%4632e*&4&i76`al&4&&&&&}n  R   R zfOego&&5`3&&&4&&4& D R   R zv"!676"'.5463!2@@w^Cct~5  5~tcC&&@?JV|RIIR|V&&#G!!%4&+";26%4&+";26%#!"&546;546;2!546;232@@@@L44LL4^B@B^^B@B^4L  N4LL44L`B^^B``B^^B`LL4&"2%#"'%.5!#!"&54675#"#"'.7>7&5462!467%632&4&&4  @ o&&}c ;pG=(  8Ai8^^.   &4&&4&` ` fs&& jo/;J!# 2 KAE*,B^^B! ` $ -4&"2#"/&7#"/&767%676$!28P88PQr @ U @ {`PTP88P8P`  @U @rQ!6'&+!!!!2Ѥ 8̙e;<*@8 !GGGQII %764' 64/&"2 $$ f3f4:4^aaf4334f:4:^aa %64'&" 2 $$ :4f3f4F^aa4f44f^aa 764'&"27 2 $$ f:4:f4334^aaf4:4f3^aa %64/&" &"2 $$ -f44f4^aa4f3f4:w^aa@7!!/#35%!'!%j/d jg2|855dc b @! !%!!7!FG)DH:&H dS)U4&"2#"/ $'#"'&5463!2#"&=46;5.546232+>7'&763!2&4&&4f ]wq4qw] `dC&&:FԖF:&&Cd`4&&4& ]] `d[}&&"uFjjFu"&&y}[d#2#!"&546;4 +"&54&" (88(@(88( r&@&Ԗ8((88(@(8@&&jj'3"&462&    .  > $$ Ԗ>aX,fff^aaԖԖa>TX,,~ffff@^aa/+"&=46;2+"&=46;2+"&=46;28((88((88((88((88((88((8 (88((88((88((88((88((88/+"&=46;2+"&=46;2+"&=46;28((88((88((88((88((88((8 (88((88(88((88(88((885E$4&"2%&'&;26%&.$'&;276#!"&5463!2KjKKj   f  \ w@wwwjKKjK"G   ܚ  f   @www   $64'&327/a^ ! ^aaJ@%% 65/ 64'&"2 "/64&"'&476227<ij6j6u%k%~8p8}%%%k%}8p8~%<@% %% !232"'&76;!"/&76  ($>( J &% $%64/&"'&"2#!"&5463!2ff4-4ff4fw@wwwf4f-f4@www/#5#5'&76 764/&"%#!"&5463!248` # \P\w@www4`8  #@  `\P\`@www)4&#!"273276#!"&5463!2& *f4 'w@www`&')4f*@www%5 64'&"3276'7>332#!"&5463!2`'(wƒa8! ,j.( &w@www`4`*'?_`ze<  bw4/*@www-.  6 $$  (r^aaO(_^aa -"'&763!24&#!"3!26#!"&5463!2yB(( @   w@www]#@##   @ @www -#!"'&7624&#!"3!26#!"&5463!2y((@B@u @   w@www###@  @ @www -'&54764&#!"3!26#!"&5463!2@@####@w@wwwB((@@www`%#"'#"&=46;&7#"&=46;632/.#"!2#!!2#!32>?6#  !"'?_  BCbCaf\ + ~2   }0$  q 90r p r%D p u?#!"&=46;#"&=46;54632'.#"!2#!!546;2D a__ g *`-Uh1    ߫}   $^L  4b+"&=.'&?676032654.'.5467546;2'.#"ǟ B{PDg q%%Q{%P46'-N/B).ĝ 9kC< Q 7>W*_x*%K./58`7E%_ ,-3  cVO2")#,)9;J) "!* #VD,'#/&>AX>++"''&=46;267!"&=463!&+"&=463!2+32Ԫ$   pU9ӑ @/*f o  VRfq f=SE!#"&5!"&=463!5!"&=46;&76;2>76;232#!!2#![       % )   "  Jg Uh BW&WX hU g 84&#!!2#!!2#!+"&=#"&=46;5#"&=46;463!2j@jo g|@~vv u n#467!!3'##467!++"'#+"&'#"&=46;'#"&=46;&76;2!6;2!6;232+32QKt# #FNQo!"դѧ !mY Zga~bm] [o"U+, @h h@@X hh @83H\#5"'#"&+73273&#&+5275363534."#22>4.#2>ut 3NtRP*Ho2 Lo@!R(Ozh=,GID2F 8PuE>.'%&TeQ,jm{+>R{?jJrL6V @`7>wmR1q uWei/rr :Vr" $7V4&#"326#"'&76;46;232!5346=#'73#"'&'73267##"&54632BX;4>ID2F +>R{8PuE>.'%&TeQ,jm{?jJrL6 @`rr :Vr3>wmR1q uWei@ \%4&#"326#!"&5463!2+".'&'.5467>767>7>7632!2&%%&&&& &7.' :@$LBWM{#&$h1D!  .I/! Nr&&%%&&&&V?, L=8=9%pEL+%%r@W!<%*',<2(<&L,"r@ \#"&546324&#!"3!26%#!#"'.'.'&'.'.546767>;&%%&&&& &i7qN !/I.  !D1h$&#{MWBL$@: '.&&%%&&&&=XNr%(M&<(2<,'*%<!W@r%%+LEp%9=8=L  +=\d%54#"327354"%###5#5#"'&53327#"'#3632#"'&=4762#3274645"=424'.'&!  7>76#'#3%54'&#"32763##"'&5#327#!"&5463!2BBPJNC'%! B? )#!CC $)  54f"@@ B+,A  A+&+A  ZK35N # J!1331CCC $)w@www2"33FYF~(-%"o4*)$(* (&;;&&9LA3  8334S,;;,WT+<<+T;(\g7x:&&::&&<r%-@www  +=[c}#"'632#542%35!33!3##"'&5#327%54'&#"5#353276%5##"=354'&#"32767654"2 '.'&547>76 3#&'&'3#"'&=47632%#5#"'&53327''RZZ:kid YYY .06 62+YY-06 R[!.'CD''EH$VVX::Y X;:Y fyd/%jG&DC&&CD&O[52. [$C-D..D^^* ly1%=^I86i077S 3 $EWgO%33%OO%35 EEFWt;PP;pt;PP;pqJgTFQ%33&PP%33%R 7>%3!+}{'+"&72'&76;2+"'66;2U &  ( P *'eJ."-dZ-n -'74'&+";27&+";276'56#!"&5463!2~} 7e  ۩w@www"  $Q #'!# @www I-22#!&$/.'.'.'=&7>?>369II ! ' $ !01$$%A' $ ! g  \7@)(7Y   \7@)(7Y @ '5557 ,VWQV.RW=?l%l`~0  !#!#%777 5! R!!XCCfff݀# `,{{{`Og4&"2 &6 $"&462$"&62>7>7>&46.'.'. '.'&7>76 Ԗ HR6L66LGHyU2L  L2UyHHyU2L  L2UyHn X6X  XX ԖԖH6L66L6 L2UyHHyU2L  L2UyHHyU2L n6X  XX  2#!"&54634&"2$4&"2ww@ww||||||w@www||||||| !3 37! $$ n6^55^h ^aaM1^aaP *Cg'.676.7>.'$7>&'.'&'? 7%&'.'.'>767$/u5'&$I7ob?K\[zH,1+.@\7':Yi4&67&'&676'.'>7646&' '7>6'&'&7>7#!"&5463!2PR$++'TJXj7-FC',,&C ."!$28 h /" +p^&+3$ i0(w@www+.i6=Bn \C1XR:#"'jj 8Q.cAj57!? "0D$4" P[ & 2@wwwD"%.5#5>7>;!!76PYhpN!HrD0M C0N#>8\xx: W]oW-X45/%'#.5!5!#"37>#!"&5463!2p>,;$4 5eD+WcEw@wwwK()F ,VhV^9tjA0/@www@#"'&76;46;23   &  ++"&5#"&7632  ^  c  & @#!'&5476!2 &  ^  b '&=!"&=463!546  &    q&8#"'&#"#"5476323276326767q'T1[VA=QQ3qqHih"-bfGw^44O#A?66%CKJA}} !"䒐""A$@C3^q|z=KK?6 lk)  %!%!VVuuu^-m5w}n~7M[264&"264&"2"&546+"&=##"&5'#"&5!467'&766276#"&54632    *<;V<<O@-K<&4'>&4.'.'.'.'.'&6&'.'.6767645.'#.'6&'&7676"&'&627>76'&7>'&'&'&'&766'.7>7676>76&6763>6&'&232.'.6'4."7674.'&#>7626'.'&#"'.'.'&676.67>7>5'&7>.'&'&'&7>7>767&'&67636'.'&67>7>.'.67 \  U7  J#!W! '  " ';%  k )"    '   /7*   I ,6 *&"!   O6* O $.( *.'  .x,  $CN      * 6   7%&&_f& ",VL,G$3@@$+ "  V5 3"  ""#dA++ y0D- %&n 4P'A5j$9E#"c7Y 6" & 8Z(;=I50 ' !!e  R   "+0n?t(-z.'< >R$A"24B@( ~ 9B9, *$        < > ?0D9f?Ae  .(;1.D 4H&.Ct iY% *  7      J  <    W 0%$  ""I! *  D  ,4A'4J" .0f6D4pZ{+*D_wqi;W1G("% %T7F}AG!1#%  JG 3  '.2>Vb%&#'32&'!>?>'&' &>"6&#">&'>26 $$ *b6~#= XP2{&%gx| .W)oOLOsEzG< CK}E $MFD<5+ z^aa$MWM 1>]|YY^D եA<KmE6<" @9I5*^aa>^4./.543232654.#"#".#"32>#"'#"$&547&54632632':XM1h*+D($,/9p`DoC&JV;267676&#!"&=463!267 #!"'&5463!26%8#! &&Z"M>2! ^I 7LRx_@>MN""`=&&*%I},  L7_jj9/%4&#!"3!264&#!"3!26#!"&5463!2  &&&&&&&&19#"'#++"&5#"&5475##"&54763!2"&4628(3- &B..B& -3(8IggI`(8+Ue&.BB.&+8(kk`%-"&5#"&5#"&5#"&5463!2"&4628P8@B\B@B\B@8P8pPPp@`(88(`p.BB.0.BB.(88(Pppͺ!%>&'&#"'.$ $$ ^/(V=$<;$=V).X^aaJ`"(("`J^aa,I4."2>%'%"/'&5%&'&?'&767%476762%6[՛[[՛o ܴ   $ $ " $ $  ՛[[՛[[5` ^ ^ 2` `2 ^ ^ ` 1%#"$54732$%#"$&546$76327668ʴhf킐&^zs,!V[vn) 6<ׂf{z}))Ns3(@ +4&#!"3!2#!"&5463!2#!"&5463!2@&&&f&&&&@&&&&4&&4&@&&&&&&&& `BH+"/##"./#"'.?&5#"&46;'&462!76232!46 `&C6@Bb03eI;:&&&4L4&F Z4&w4) '' 5r&4&&4&&4}G#&/.#./.'&4?63%27>'./&'&7676>767>?>%6})(."2*&@P9A #sGq] #lh<* 46+(  < 5R5"*>%"/ +[>hy  K !/Ui%6&'&676&'&6'.7>%.$76$% $.5476$6?62'.76&&'&676%.76&'..676#"NDQt -okQ//jo_  %&JՂYJA-.-- 9\DtT+X?*<UW3' 26$>>W0 {"F!"E    ^f`$"_]\<`F`FDh>CwlsJ@ ;=?s  :i_^{8+?` ) O`s2RDE58/Kr #"'>7&4$&5mī"#̵$5$"^^W=acE*czk./"&4636$7.'>67.'>65.67>&/>z X^hc^O<q+f$H^XbVS!rȇr?5GD_RV@-FbV=3! G84&3Im<$/6X_D'=NUTL;2KPwtPt=  &ռ ,J~S/#NL,8JsF);??1zIEJpqDIPZXSF6\?5:NR=;.&1 +!"&=!!%!5463!2sQ9Qs***sQNQsBUw wUBFHCCTww%1#"&=!"&=463!54632.  6 $$     ` ?(r^aa    (_^aa%1#!#"'&47632!2.  6 $$   @  ` (r^aa  ?  @  (_^aa/#"'&476324&#!"3!26#!"&5463!2&@& @   w@www& @B@ &  @ @www"&462  >& $$ Ԗ*(r^aaԖԖ (^aa]6#"$54732>%#"'!"&'&7>32'!!!2f:лѪz~u: ((%`V6B^hD%i(]̳ޛ *>6߅r#! 3?^BEa߀#9#36'&632#"'&'&63232#!"&5463!2 Q,&U #+' ;il4L 92<D`w@www`9ܩ6ɽ ]`C477&@wwwD+"&5#"'&=4?5#"'&=4?546;2%6%66546;2  wwwwcB G]B Gty]ty #3C#!+"&5!"&=463!46;2!24&#!"3!26#!"&5463!2@`@`^BB^^B@B^www@w@`@`2@B^^BB^^ww@w'/?P+5#"&547.467&546;532!764'!"+32#323!&ln@ :MM: @nY*Yz--zY*55QDDU9pY-`]]`.X /2I$ t@@/!!/@@3,$,3$p$00&*0&& !P@RV2#"&/#"&/#"&546?#"&546?'&54632%'&54632763276%>S]8T;/M77T7%>ww@ww!"5bBBb// * 8(@(87)(8=%/' #?w@www#~$EE y &L(88e):8(%O r    O?GQaq47&67>&&'&67>&"$32#"#"'654  $&6 $6&$ CoL.*K  Px.* iSƓ i 7J ?~pi{_Я;lLUZ=刈刈_t'<Z :!   @! j`Q7  $ky, Rfk*4LlL=Z=刈&$&546$7%7&'5>]5%w&P?zrSF!| &0 ##!"&5#5!3!3!3!32!546;2!5463) );));;))&&&@@&&&  6 $&727"'%+"'&7&54767%&4762֬>4P t+8?::  ::A W` `EvEEvE<."e$IE&O &EI&{h.`m"&#"&'327>73271[ >+)@ (]:2,C?*%Zx/658:@#N C= E(oE=W'c:#!#"$&6$3 &#"32>7! ڝyy,{ۀہW^F!LC=y:yw߂0H\R%"N^ '&76232762$"&5462"&46274&"&'264&#"'&&#"32$54'>$ $&6$ G>>0yx14J55J5J44J5Fd$?4J55%6E#42F%$fLlLq>>11J44%&4Z%44J54R1F$Z-%45J521Z%F1#:ʎ 9LlL#Qa"'&7622762%"&5462"&546274&#"&'73264&#"'&&#"32654'>#!"&5463!2 55 **.>.-@-R.>.-@-<+*q6- -- 0OpoOxzRrqP6z~{{Prr^aa]054&"#"&5!2654632!#"&57265&'&#".'&'#"&5467%&4>7>3263232654.547'654'63277.'.*#">7?67>?>32#"'7'>3'>3235?KcgA+![,7*  2(-#=  /~[(D?G  |,)"# +)O8,+'6 y{=@0mI#938OAE` -  )y_/FwaH8j7=7?%a % %!?)L J 9=5]~pj  %(1$",I  $@((  +!.S -L__$'-9L 5V+ 6 T+6.8- $ 0 + t |S 16]&#"'&#"67>76'&'&#"67>32764.#"#.32>67>7 $&54>7>7>7rJ@ "kb2)W+ ,5/1   #   Z -!$IOXp7sLCF9vz NAG#/ 5|Հ';RKR/J#=$,9,+$UCS7'2"1  ! / ,   /--ST(::(ep4AM@=I>".)xΤlsY|qK@ %(YQ&N EHv~<Zx'#"&5467&6?2?'&"/.7.546326#"&'&/7264/7'764&"'?>>32.AUpIUxYE.A %%%h% %hJ%D,FZxULs TgxUJrVD %hJ%@/LefL.C %Jh%CV sNUxϠ@.FZyUHpVA %h&%% %Ji%CWpIUybJ/Uy^G,D %Jh%@U sMt UC %hJ%C-KfyEX[_gj&/&'.''67>7>7&'&'&'>76763>7>#&'&'767672'%'7'+"&'&546323267>7%#"'4'6767672,32,+DCCQLDf' % :/d B 4@ }  &!0$?Jfdf-.=6(:!TO? !IG_U% . k*.=; 5gN_X "  ##  292Q41   *6nA;| BS N.  %1$ 6 $nk^ '7GWgw2+"&5463#!"&5463!254&+";2654&+";2654&+";2654&+";2654&+";2654&+";2654&+";2654&+";2654&+";26#"&=! B^^BB^^B:FjB^8((`( `(8^BB^^B@B^"vEj^B(8(`(8(/?O_o/?2#!"&5463;26=4&+";26=4&+";26=4&+";26=4&+"54&+";2654&+";2654&+";2654&+";2654&+";2654&#!"3!2654&+";2654&+";2654&+";2654&+";2654&+";2654&+";2654&+";2654&+";2654&+";26@&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@`' "&5#"&5&4762!762$"&462B\B@B\BOpP.BB..BB.8$PO広3CQ#".54>32#".546322#"&#"#"54>%".54>32%2#"&54> &X=L|<&X=M{2r_-$$-_rUU%&&5%ő'- "'.546762@FF$@B@$.&,&.]]|q#<<#(BB B%'-%'-'%'-"'%&'"'%.5467%467%62@ll@ll,@GG&!@@@@@@!&+#+#6#+$*`:p:px p=`$>>$&@&@ @&p@ &.A!!"!&2673!"5432!%!254#!5!2654#!%!2#!8Zp?vdΊens6(N[RWu?rt1SrF|iZ@7މoy2IMC~[R yK{T:%,AGK2#!"&5463!!2654'654.#532#532"&5!654&#"327#2#>!!ww@ww~uk'JTMwa| DH> I1q Fj?w@wwwsq*4p9O*¸Z^qh LE "(nz8B M'?"&4624&#"'.'324&#"3267##"&/632632.ʏhhMALR vGhг~~K „yO^   ʏʏВ*LM@!שwwȍde)qrOPqȦs:03=7'.?67'67%'>&%'7%7./6D\$>  "N,?a0#O 1G9'/P(1#00  ($=!F "9|]"RE<6 'o9%8J$\ :\HiTe<?}V#oj? d,6%N#" HlSVY]C =@C4&"2!.#!"4&"2+"&=!"&=#"&546;>3!232^^^Y ^^^`pppp`]ibbi]~^^^e^^^PppPPppP]^^]3;EM2+"&=!"&=#"&546;>;5463!232264&"!.#!"264&" ]`pppp`]ibbi^^^dY !^^^]@PppP@@PppP@]^^] ^^^e^^^ 3$#!#!"&5467!"&47#"&47#"&4762++&2 $$ 2&&&4&&Z4&&##&&4&4&44&m4&m+DP4'&#"32763232674'&!"32763 3264'&$#"32763232> $$ g* o`#ə0#z#l(~̠) -g+^aaF s" +g (* 3#!| #/IK/%*%D= )[^aa !!!'!!77!,/,-a/G t%/;<HTbcq%7.#"32%74'&"32765"/7627#"5'7432#"/7632#"5'7432#"&5'74632 #"/6327#"/6327#"/46329"&/462"&/>21"&/567632#!.547632632  *     X    ^  `    ^  b  c   fu U`59u  4J   l~ ~ F 2    m | O,           ru| u  " )9 $7 $&= $7 $&= $7 $&=  $&=46w`ww`ww`wb`VTEvEEvETVTEvEEvET*VTEvEEvET*EvEEvEEvEEv#^ct#!"&5463!2!&'&!"&5!632#"&'#"/&'&7>766767.76;267674767&5&5&'67.'&'&#3274(8((88((`x c`(8!3;:A0?ݫY   ^U 47D$    74U3I  |L38wtL0`((88(@(8(D 9 8(Q1&(!;  (g- Up~R2(/{E(Xz*Z%(i6CmVo8 #T#!"&5463!2!&'&!"&5!3367653335!3#4.5.'##'&'35(8((88((`x c`(8iFFZcrcZ`((88(@(8(D 9 8(kk" kkJ  ! k#S#!"&5463!2!&'&!"&5!%!5#7>;#!5#35!3#&'&/35!3(8((88((`x c`(8-Kg kL#DCJg  jLD`((88(@(8(D 9 8(jj jjkk kk#8C#!"&5463!2!&'&!"&5!%!5#5327>54&'&#!3#32(8((88((`x c`(8 G]L*COJ?0R\wx48>`((88(@(8(D 9 8(jjRQxk !RY#*2#!"&5463!2!&'&!"&5!!57"&462(8((88((`x c`(8Pppp`((88(@(8(D 9 8(ppp  #*7JR5#5#5#5##!"&5463!2!&'&!"&5##5!"&54765332264&"<(8((88((`x c`(8kޑcO"jKKjK`((88(@(8(D 9 8(SmmS?M&4&&4#9L^#!"&5463!2!&'&!"&5!#"/#"&=46;76276'.'2764'.(8((88((`x c`(8 6ddWW6&44`((88(@(8(D 9 8(. G5{{5]]$5995#3C#!"&5463!2!&'&!"&5!2#!"&5463#"'5632(8((88((`x c`(84LL44LL4l  `((88(@(8(D 9 8(L44LL44L  Z #7K[#!"&5463!2!&'&!"&5!>&'&7!/.?'&6?6.7>'(8((88((`x c`(8` 3  3  3  3 v  ?  `((88(@(8(D 9 8( & & - & &  ?   '6#'. '!67&54632".'654&#"32eaAɢ/PRAids`WXyzOvд:C;A:25@Ң>-05rn`H( ' gQWZc[ -%7' %'-'% %"'&54762[3[MN 3",""3,3"ong$߆]gn$+) ")")" x#W#"&#!+.5467&546326$32327.'#"&5463232654&#"632#".#"oGn\ u_MK'̨|g? CM7MM5,QAAIQqAy{b]BL4PJ9+OABIRo?z.z n6'+s:zcIAC65D*DRRD*wyal@B39E*DRRD*'/7  $&6$ 6277&47' 7'"' 6& 6'lLRRZB|RR>dZZLlLZRR«Z&>«|R ! $&54$7 >54'5PffP牉@s-ff`-c6721>?>././76&/7>?>?>./&31#"$&(@8!IH2hM>'  )-* h'N'!'Og,R"/!YQG54'63&547#5#"=3235#47##6323#324&"26%#!"&5463!2F]kbf$JMM$&N92Z2&`9UW=N9:PO;:dhe\=R +)&')-S99kJ<)UmQ/-Ya^"![Y'(<`X;_L6#)|tWW:;X  #'#3#!"&5463!2) p*xeשw@www0,\8@www9I#"'#"&'&>767&5462#"'.7>32>4."&'&54>32JrO<3>5-&FD(=Gq@C$39aLL²L4 &) @]v q#CO!~󿵂72765'./"#"&'&5 }1R<2" 7MW'$  ;IS7@5sQ@@)R#DvTA ; 0x I)!:> +)C 6.> !-I[4&#"324&#"3264&#"324&#"326&#"#".'7$4$32'#"$&6$32D2)+BB+)3(--(31)+BB+)4'--'4'#!0>R HMŰ9ou7ǖD䣣 R23('3_,--,R23('3_,--,NJ ?uWm%#"'%#"'.5 %&'&7632! ; `u%"(!]#c)(  #"'%#"'.5%&'&76 !  (%##fP_"(!)'+ʼn4I#"$'&6?6332>4.#"#!"&54766$32#!"&=46;46;2z䜬m IwhQQhbF*@&('k@z   _hQнQGB'(&*eozΘ@@`  >. $$ ffff^aafff^aa>"&#"#"&54>7654'&#!"#"&#"#"&54>765'46.'."&54632326323!27654'.5463232632,-,,",:! %]& %@2(/.+*)6! <.$..**"+8#  #Q3,,++#-:#"$$ /:yuxv)%$ /?CG%!5%2#!"&5463!5#5!52#!"&54632#!"&5463#5!5`&&&& &&&&&&&&@&&&&&&&&&&&&%2 &547%#"&632%&546 #"'6\~~\h ~\h\ V V VV%5$4&#"'64'73264&"&#"3272#!"&5463!2}XT==TX}}~>SX}}XS>~}w@www~:xx:~}}Xx9}}9xX}@www/>LXds.327>76 $&6$32762#"/&4762"/&47626+"&46;2'"&=462#"'&4?62E0l,  *"T.D@Yooo@5D [  Z  Z  [ ``[ Z  2 ,l0 (T" .D5@oooY@D, Z  [  [  Z ``EZ  [ 5%!  $&66='&'%77'727'%amlLmf?55>fFtuutFLlLHYC L||L Y˄(E''E*( /?IYiy%+"&=46;2+"&=46;2+"&=46;2+"&=46;2%"&=!#+"&=46;2+"&=46;2+"&=46;2+"&=46;2!54!54>$ +"&=46;2#!"&=@&&@3P > P3&&rrr&&rrr he 4LKM:%%:MKL4WT&&%/9##!"&563!!#!"&5"&5!2!5463!2!5463!2&&&&&&  &&&i@&&@&7'#5&?6262%%o;j|/&jJ%p&j;&i&p/|jţ%Jk%o%  :g"&5462#"&546324&#!"263662>7'&75.''&'&&'&6463!276i~ZYYZ~@OS;+[G[3YUD#o?D&G3I=JyTkBuhNV!WOhuAiSy*'^CC^'*SwwSTvvTSwwSTvvWID\_"[ gq# /3qFr2/ $rg%4 HffHJ4d#!#7!!7!#5!VFNrmNNN N!Y+?Ne%&'&'&7>727>'#&'&'&>2'&'&676'&76$7&'&767>76 '6# <;11x# *# G,T93%/#0vNZ;:8)M:( &C.J}2 %0  ^*  JF &7'X"2LDM" +6 M2+'BQfXV#+] #' L/(eB9  #,8!!!5!!5!5!5!5#26%!!26#!"&5!5&4& &pPPp@@&&@!&@PppP@*  9Q$"&54627"."#"&547>2"'.#"#"&5476$ "'&$ #"&5476$ (}R}hLK NN Ud: xx 8    ,, |2222 MXXM ic,>>,   ̺  '/7?KSck{4&"2$4&"24&"24&"24&"24&"24&"24&"24&"264&"24&#!"3!264&"2#!"&5463!2KjKKjKjKKjKjKKjKKjKKjKjKKjKjKKjKKjKKjKjKKjKLhLLhLKjKKj&&&&KjKKjL44LL44L5jKKjKKjKKjKjKKjKjKKjKjKKjKjKKjKjKKjKjKKjK4LL44LLjKKjK&&&&jKKjK4LL44LL 'E!#"+"&7>76;7676767>'#'"#!"&7>3!2W",&7' #$ &gpf5 O.PqZZdS -V"0kqzTxD!!8p8%'i_F?;kR(` !&)' (2!&6367! &63!2! `B 1LO(+#=)heCQg#s`f4#6q'X|0 -g >IY#6?>7&#!%'.'33#&#"#"/3674'.54636%#"3733#!"&5463!24  : @7vH%hEP{0&<'VFJo1,1.F6A#L44LL44L"% 7x'6 O\JYFw~v^fH$ ! "xdjD"!6`J4LL44LL +3@GXcgqz -<JX{&#"327&76'32>54.#"35#3;5#'#3537+5;3'23764/"+353$4632#"$2#462#"6462""'"&5&5474761256321##%354&'"&#"5#35432354323=#&#"32?4/&54327&#"#"'326'#"=35#5##3327"327'#"'354&3"5#354327&327''"&46327&#"3=#&#"32?"5#354327&3=#&"32?"#3274?67654'&'4/"&#!"&5463!2_gQQh^_~\[[\]_^hQQge<F$$$ !!&&/ !/  !! 00/e&'!"e$   '!!''   8''NgL44LL44LUQghQUk=("  ! =))=2( '! 'L#(>( & DC(>(zL#DzG)<)4LL44LL  BWbjq}+532%+5324&+32763#4&'.546327&#"#"'3265#"&546325&#"32 !264&"2%#'#735#535#535#3'654&+353#!"&5463!29$<=$@?SdO__J-<AA@)7")9,<$.%0*,G3@%)1??.+&((JgfJ*A!&jjjGZYGиwsswPiL>8aA !M77MM77M3! 4erJ]&3YM(, ,%7(#)  ,(@=)M%A20C&Mee(X0&ĖjjjV 8Z8J9N/4$ 8NN88NN  #&:O[ $?b3'7'#3#%54+32%4+324+323'%#5#'#'##337"&##'!!732%#3#3##!"&53733537!572!56373353#'#'#"5#&#!'#'#463!2#"5#"5!&+&+'!!7353273532!2732%#54&+#32#46.+#2#3#3##+53254&".546;#"67+53254&.546;#"#'#'##"54;"&;7335wY-AJF=c(TS)!*RQ+*RQ+Y,B^9^Ft`njUM ') ~PSPRm٘M77Mo7q @)U 8"E(1++NM77Mx378D62W74;9<-A"EA0:A F@1:ؗBf~~""12"4(w$#11#@}}!%+%5(v$:O\zK?* $\amcrVlOO176Nn23266&+"&#"3267;24&+"'&+";27%4&+";2?>23266&+"&#"3267;254+";27#76;2#!"&5463!23%#2%%,,  _3$$2%%M>AL Vb5)LDHeE:< EM j,K'-R M ~M>AR  Vb5)LEHeE:< E J ABI*'! ($rL44LL44Lv%1 %3!x*k $2 %3!;5h n a !(lI;F   rp p8;5h t a !(lI;F ` #k 4LL44LL  2HW[lt#"'5632#6324&'.54327&#"#"&'32767#533275#"=5&#"'#36323#4'&#"'#7532764&"24'&#"327'#"'&'36#!"&5463!2=!9n23BD$ &:BCRM.0AC'0RH`Q03'`.>,&I / * / 8/n-(G@5$ S3=,.B..B02^`o?7je;9G+L44LL44LyE%# Vb;A !p &'F:Aq)%)#orgT$ v2 8)2z948/{ 8AB..B/q?@r<7(g/4LL44LL ?#!"&'24#"&54"&/&6?&5>547&54626=L4@ԕ;U g3 T 2RX='8P8|5 4Ljj U;Ig@   `  "*\(88(]k  &N4#"&54"3 .#"#!"&'7!&7&/&6?&5>547&54626;U gIm*]Z0L4@ԕ=o=CT T 2RX='8P8|5  U;IgXu?bl3@4Ljja`   `  "*\(88(]k/7[%4&+";26%4&+";26%4&+";26!'&'!+#!"&5#"&=463!7>3!2!2@@@@@@0 o`^BB^`5FN(@(NF5@@@u  @LSyuS@%44%,<H#"5432+"=4&#"326=46;2  >. $$ ~Isy9"SgR8vHD w ffff^aam2N+ )H-mF+10*F +fff^aab4&#"32>"#"'&'#"&54632?>;23>5!"3276#"$&6$3 k^?zb=ka`U4J{K_/4^W&  vx :XB0܂ff ) fzzXlz=lapzob35!2BX G@8  ' '=vN$\ff  1 SZz8zX#("/+'547'&4?6276 'D^h  i%5@%[i  h]@]h  i%@5%[i  h^@@)2#"&5476#".5327>OFi-ay~\~;'S{s:D8>)AJfh]F?X{[TC6LlG]v2'"%B];$-o%!2>7>3232>7>322>7>32".'.#"#"&'.#"#"&'.#"#546;!!!!!32#"&54>52#"&54>52#"&54>52-P&+#($P.-P$'#+&PZP&+#"+&P-($P-.P$(#+$P.-P$'#+&P-.P$+#pP@@PpH85K"&ZH85K"&ZH85K"&Z@Pp@@@pMSK5, :&LMSK5, :&LMSK5, :& !!3 ! @@@  #"$$3!!2"jaѻxlalxaaj!!3/"/'62'&63!2'y  `I  yMy `I y'W`#".'.#"32767!"&54>3232654.'&546#&'5&#" 4$%Eӕ;iNL291 ;XxR`f՝Q8TWiWgW:;*:`Qs&?RWXJ8 oNU0 J1F@#) [%6_POQiX(o`_?5"$iʗ\&>bds6aP*< -;iFn* -c1BWg4'.'4.54632#7&'.#"#"'.#"32767'#"&54632326#!"&5463!2#$( 1$6]' !E3P|ad(2S;aF9'EOSej]m] <*rYshpt.#)$78L*khw@wwwB % $/$G6 sP`X):F/fwH1pdlqnmPHuikw_:[9D'@www34."2>$4.#!!2>#!".>3!2QнQQнQQh~wwhfffнQQнQQнQZZQffff#>3!2#!".2>4."fffнQQнQQffffQнQQн ,\!"&?&#"326'3&'!&#"#"'  5467'+#"327#"&463!!'#"&463!2632(#AHs9q ci<= #]$ KjKKjKKjKKjH#j#H&&&KjKKjKg V i jKKjKKjKKjK ..n(([5KK55KK5[poNv<+#"'#"&546;&546$32322$B$22$$*$22$Xڭӯ$22$tX'hs2$ϧkc$22$1c$2F33F3VVT2#$2ԱVT2#$2g#2UU݃ 2$#2UU1݃2 ,u54#"67.632&#"32654'.#"32764.'&$#"7232&'##"&54732654&#"467&5463254632>32#"'&ru&9%" *#͟ O%GR=O&^opC8pP*bY _#$N Pb@6)?+0L15 "4$.Es  5IQ"!@ h "Y7e|J>ziPeneHbIlF>^]@n*9 6[_3#"&54632#.#"32%3#"&54632#.#"326%4&'.'&! ! 7>7>! =39? 6'_ >29? 5'17m-VU--,bW.뮠@Fyu0HC$뮠@Fyu0HC$L= ?? <=! A <`;+"&54&#!+"&5463!2#!"&546;2!26546;2pЇ0pp@Ipp>Sc+"&=46;254&+"&+";2=46;2;2=46;2;2%54&#!";2=;26#!"&5463!2A5DD5A7^6a7MB55B7?5B~```0`rr5A44A5v5AA5f*A``0` !!!! #!"&5463!2ړ7H7jv@vvv':@vvvMUahmrx#"'!"'!#"&547.547.54674&547&54632!62!632!#!627'!%!"67'#77!63!!7357/7'%# %'3/&=&' 5#?&547 6!p4q"""6" 'h*[ |*,@?wAUMpV@˝)Ϳw7({*U%K6=0(M "! O dX$k !! ! b [TDOi @6bxBAݽ5  ɝ:J +3,p x1Fi (R 463!#!"&5%'4&#!"3`а@..@A-XfB$.BB..C} )&54$32&'%&&'67"w`Rd]G{o]>p6sc(@wgmJPAjyYWa͊AZq{HZ:<dv\gx>2ATKn+;"'&#"&#"+6!263 2&#"&#">3267&#">326e~└Ȁ|隚Ν|ū|iyZʬ7Ӕްr|uѥx9[[9jj9ANN+,#ll"BS32fk[/?\%4&+";26%4&+";26%4&+";26%4&+";26%#!"&5467&546326$32]]eeeeee$~i qfN-*#Sjt2"'qCB8!'> !%)-159=AEIMQUY]agkosw{! %! 5!#5#5#5#5#57777????#5!#5!#5!#5!#5!#5!#5!#5#537#5!#5!#5!#5!#5!#55#535353535353%"&546326#"'#32>54.&54>3237.#"Q%%%%%%%%%?iiihOiixiiyiixiiArssrrssr%sssrrssNs%%%%%%%%%%'32#".543232654&#"#"&54654&#"#"&547>326ڞUzrhgrxSПdU 7#"&463!2!2&&4&&&&4&KjKKjKjKKj &&&%&& &&4&&&&4&&&5jKKjKKjKKjK%z 0&4&&3D7&4& %&'S4&"4&"'&"27"&462"&462!2#!"&54>7#"&463!2!2&4&4&4&4KjKKjKjKKj &&&%&& &&4&%&&ے&4"jKKjKKjKKjK%z 0&4&&3D7&4& %& & !'! !%!!!!%"'.763!2o]FooZY@:@!!gf//I62'"/"/"/"/"/"/"/7762762762762762762%"/77627&6?35!5!!3762762'"/"/"/"/"/"/%5#5!4ZSS6SS4SS4SS4SS4SS4SS4ZSS4SS4SS4SS4SS4SS4S-4ZSS4S@4SS4ZSS6SS4SS4SS4SS4SS4S@ZSSSSSSSSSSSSSSZSSSSSSSSSSSSSyZRRR@%:= :+: =RRZSSSSSSSSSSSSSCv!/&'&#""'&#" 32>;232>7>76#!"&54>7'3&547&547>763226323@``` VFaaFV      $. .$     yy .Q5ZE$ ,l*%>>%*>*98(QO!L\p'.'&67'#!##"327&+"&46;2!3'#"&7>;276;2+6267!"'&7&#"(6&#"#"' Dg OOG`n%ELL{@&&Nc,sU&&!Fre&&ss#/,<= #]gL oGkP'r-n&4&2-ir&&?o  4 _5OW! .54>762>7.'.7>+#!"&5#"&5463!2"&462{{BtxG,:`9(0bԿb0(9`:,GxtB&@&&@&K55K`?e==e?1O6# ,  #$  , #6OO&&&&5KK?!"'&'!2673267!'. ."!&54632>321 4q#F""8'go#- #,"tYg>oP$$Po> Zep#)R0+I@$$@I++332++"&=#"&=46;.7>76$  @ ᅪ*r@@r'/2+"&5".4>32!"&=463  &@~[՛[[u˜~gr&`u՛[[՛[~~@r=E32++"&=#"&=46;5&547&'&6;22676;2  >``@``ٱ?E,,=?rH@``@GݧH`jjrBJ463!2+"&=32++"&=#"&=46;5.7676%#"&5   &@~``@``  vXr&@``@+BF`rks463!2+"&=32++"&=#"&=46;5&547'/.?'+"&5463!2+7>6 %#"&5   &@~``@``~4e  0  io@& jV  0  Z9r&@``@Gɞ5o , sp &@k^ , c8~~`r8>KR_32++"&=!+"&=#"&=46;.767666'27&547&#"&'2#" @@ 'Ϋ'sggsww@sgg@@-ssʃl99OOr99FP^l463!2+"&=$'.7>76%#"&=463!2+"&=%#"&54'>%&547.#"254&' &@L?CuГP vY &@;"ޥ5݇ޥ5`&_ڿgwBF@&J_ s&&?%x%xJP\h463!2+"&='32++"&=#"&=46;5.7676632%#"&56'327&7&#"2#" &@L? ߺu``@``} ຒɞueeu9uee&_"|N@``@""|a~lo99r9@9;C2+"&5"/".4>327'&4?627!"&=463  &@Ռ .  N~[՛[[u˜N .  gr&`֌  . Ou՛[[՛[~N  . @r9A'.'&675#"&=46;5"/&4?62"/32+  '֪ \  . 4 .  \r|ݧ憛@\ .    . \@r~9A"/&4?!+"&=##"$7>763546;2!'&4?62  m  - @ݧ憛@& -  @rm4 -  ٮ*   - r+"&5&54>2  @[՛[rdGu՛[[r  ".4>2r[՛[[՛r5՛[[՛[[$2#!37#546375&#"#3!"&5463#22#y/Dz?s!#22#2##2S88 2#V#2L4>32#"&''&5467&5463232>54&#"#"'.Kg&RvgD $ *2% +Z hP=DXZ@7^?1 ۰3O+lh4`M@8'+c+RI2 \ZAhSQ>B>?S2Vhui/,R0+ ZRkmz+>Q2#"'.'&756763232322>4."7 #"'&546n/9bLHG2E"D8_ pdddxO"2xxê_lx2X  !+'5>-pkW[C I I@50Oddd˥Mhfxx^ә #'+/7!5!!5!4&"2!5!4&"24&"2!!! 8P88P 8P88P88P88PP88P8 P88P88P88P8 +N &6 !2#!+"&5!"&=463!46;23!#!"&54>32267632#"_>@`     `  L4Dgy 6Fe=OOU4L>   ` `  4L2y5eud_C(====`L43V &6 #"/#"/&54?'&54?6327632#!"&54>32 7632_>     %%Sy 6Fe=J%>     %65%Sy5eud_C(zz.!6%$!2!!!46;24&"2!54&#!"&&&@ԖV@&&@&&ԖԖ@&3!!! !5!'!53!! #7IeeI7CzCl@@@#2#!"&?.54$3264&"!@մppp((ppp#+/2#!"&?.54$3264&"!264&"!@մ^^^@^^^@((^^^^^^v(#"'%.54632 "'% 632U/@k0G,zD# [k# /tg F Gz  #'#3!) p*xe0,\8T #/DM%2<GQ^lw &'&676676&'&7654&'&&546763"#"'3264&7.>&'%'.767&7667&766747665"'.'&767>3>7&'&'47.'.7676767&76767.'$73>?>67673>#6766666&'&6767.'"'276&67&54&&671&'6757>7&"2654&57>&>&'5#%67>76$7&74>=.''&'&'#'#''&'&'&'65.'&6767.'#%&''&'#2%676765&'&'&7&5&'6.7>&5R4&5S9 W"-J0(/r V"-J0(.)#"6&4pOPppc|o}vQ[60XQW1V  # 5X N"& . ) D>q J:102(z/=f*4!> S5b!%  (!$p8~5..:5I  ~T 4~9p# ! ) & ?()5F 1   d%{v*: @e s|D1d {:*dAA|oYk'&<tuut&v HCXXTR;w 71™ Z*&' 1  9? . $Gv 5k65P.$.`aasa``Z9k'9؋ӗa-*Gl|Me_]`F& OܽsDD!/+``aa``a154&'"&#!!26#!"&5463!2    iLCly5)*Hcelzzlec0hb,,beIVB9@RB9J_L44LL44L44%2"4:I;p!q4bb3p (P`t`P(6EC.7BI64LL44LL  .>$4&'6#".54$ 4.#!"3!2>#!"&5463!2Zjbjj[wٝ]>oӰٯ*-oXL44LL44L')꽽)J)]wL`ֺ۪e4LL44LL;4&#!"3!26#!"&5463!2#54&#!";#"&5463!2  @ ^BB^^B@B^  B^^B@B^`@  MB^^B@B^^>  ^B@B^^5=Um ! !!2#!"&=463!.'!"&=463!>2!2#264&"".54>762".54>762?(``(?b|b?B//B/]]FrdhLhdrF]]FrdhLhdrF@@@(?@@ ?(@9GG9@/B//BaItB!!BtI Ѷ!!ь ItB!!BtI Ѷ!!ь-M32#!"&=46;7&#"&=463!2#>5!!4.'.46ՠ`@`ՠ`MsFFsMMsFFsMojjo@@jj@@<!(!!(!-3?32#!"&=46;7&#"&=463!2+!!64.'#ՠ`@`ՠ`  DqLLqDojjo@@jj@@B>=C-3;32#!"&=46;7&#"&=463!2+!!6.'#ՠ`@`ՠ`UVU96gg6ojjo@@jj@@β**ɍ-G32#!"&=46;7&#"&=463!2#>5!!&'.46ՠ`@`ՠ`MsFFsMkkojjo@@jj@@<!(!33!(!9I2#!"&=4637>7.'!2#!"&=463@b":1P4Y,++,Y4P1:"":1P4Y,++,Y4P1:"b@@@7hVX@K-AA-K@XVh77hVX@K-AA-K@XVh7Aj"#54&#"'54&#"3!26=476=4&#"#54&'&#"#54&'&'2632632#!"&5&=4632>3265K @0.B @0.B#6'&& l @0.B 2' .B A2TA9B;h" d mpPTlLc _4.HK5]0CB.S0CB./#'?&&)$$)0CB. }(AB.z3M2"61d39L/PpuT(Ifc_E`1X"#4&"'&#"3!267654&"#4&"#4&26326#!"&'&5463246326\B B\B&@5K&@"6LB\B B\B sciL}QP%&#"!"3!754?27%>54&#!26=31?>Ijjq,J[j.-tjlV\$B.R1?@B.+?2`$v5K-%5KK5.olRIS+6K5̈$B\B 94E.&ʀ15uE& ԖPjjdXUGJ7!.B P2.B %2@ 7K5(B@KjKj?+fU E,5K~!1.>F.F,Q5*H$b2#!"&=%!"&=463!7!"&'&=4634'&#!">3!!"3!32#!"3!23!26=n$32>32>32#"#.#"#.#"3!27654&#"547654&#"#654&Mye t|]WSSgSY\x{ 70"1i92DU1&=  =&0@c >&/Btd4!*"8K4+"@H@/'= t?_K93-] UlgQQgsW ]#+ i>p&30&VZ&0B/ %3B. "to ){+C4I (  /D0&p0D3[_cg"'&#"3!2676=4&"#54&#"#54&#"#4&'2632632632#!"&'&5463246#!#!#5K)B4J&@#\8P8 @0.B J65K J6k cJ/4qG^\hB2.1!~K5y?^\Vljt-.j[J,qjjI7$?1R.B+.B$`2?gvEo.5KK5%-K6+SIR[&.E49 B\B$5KG#!+"&5!"&=463!2+"&' +"' +"'&5>;2>76;2Y    M .x - N     u  , u ?  LW   #  *:J4'&+326+"'#+"&5463!2  $6& $&6$ UbUI-uu,uuڎLlLAX!Jmf\$ 6uuu,KLlL-[k{276/&'&#"&5463276?6'.#"!276/&'&#"&5463276?6'.#"  $6&  $&6]h - %Lb`J%E 5 ,5R- h - %Lb`J%E 5 ,5R-'uu,uulL/hR    dMLc  NhR   dMLc  N1uuu,LlL@  ' 7 '7 ``H ``H !``H ```H` '%  7' 7'7 ' $&6$ X`(W:,:X`(WLLlLX`(W:BX`(XLlL $ %/9ES[#"&54632$"&4624&"26$4&#"2%#"&462$#"&4632#"32&! 24>  !#"&'.'#"$547.'!6$327&'77'&77N77N'qqqqqPOrqEsttsst}||}uԙ[WQ~,> nP/R U P酛n >,m'77'&77N77N6^Orqqqqqqt棣棣(~|| on[usј^~33pc8{y%cq33dqpf L 54 "2654"'&'"/&477&'.67>326?>< x ,  (-'sI  VCV  Hr'-(  $0@!BHp9[%&!@0$u  ]\\]-$)!IHV D V HI!)$-#36>N"&462."&/.2?2?64/67>&  #!"&5463!2]]]3 $; &|v;$ (CS31 =rM= 4TC(G zw@www]]]($-;,540= sL =45,; @www(2#"$&546327654&#" &#"AZ\@/#%E1/##.1E$![A懇@@\!#21E!6!E13"|! gL&5&'.#4&5!67&'&'5676&'6452>3.'5A5RV[t,G'Q4}-&r! G;>!g12sV&2:#;d=*'5E2/..FD֕71$1>2F!&12,@K r#"&5462>%.#"'&#"#"'>54#".'7654&&5473254&/>7326/632327?&$  $6 $&6$ !&"2&^ u_x^h ;J݃HJǭ qE Dm! M G?̯' %o8 9U(F(ߎLlL&!&!SEm|[n{[<ɪ "p C Di% (K HCέ  pC B m8 @Kނ  HF(LlL "*6%&6$ 7&$5%%6'$2"&4}x3nQH:dΏX e8z' li=! 7So?vM '&7>>7'7>''>76.'6'El:Fg r *t6K3U Z83P)3^I%=9 )<}Jk+C-Wd &U-TE+]Qr-< Q#0 C+M8 3':$ _Q =+If5[ˮ&&SGZoMkܬc#7&#"327#"'&$&546$;#"'654'632ե›fKYYKf¥yͩ䆎L1hvvƚwwkn]*]nlxDLw~?T8bb9SA}+5?F!3267!#"'#"4767%!2$324&#"6327.'!.#"۔c28Ψ-\?@hU0KeFjTlyE3aVsz.b؏W80]TSts<hO_u7bBtSbF/o|V]SHކJ34&#!"3!26#!!2#!"&=463!5!"&5463!2  @ ^B `` B^^B@B^   @ @B^@@^BB^^>3!"&546)2+6'.'.67>76%&F8$.39_0DD40DD0+*M7{L *="# U<-M93#D@U8vk_Y [hD00DD00Dce-JF1 BDN&)@ /1 dy%F#"'&'&'&'&763276?6#"/#"/&54?'&763276"&'&'&5#&763567632#"'&7632654'&#"32>54'&#"'.5463!2#!3>7632#"'&'&#"'&767632yqoq>* 432fba  $B? >B BB AA.-QPPR+ 42 %<ciђ:6& hHGhkG@n`IȌ5 !m(|.mzyPQ-.  je  q>@@?ppgVZE|fb6887a %RB? =B ABBAJvniQP\\PRh!cDS`gΒ 23geFGPHXcCI_ƍ5" n*T.\PQip [*81 / 9@:>t%6#".'.>%6%&7>'.#*.'&676./&'.54>754'&#"%4>327676= >vwd" l "3 /!,+ j2.|%& (N &wh>8X}xc2"W<4<,Z~fdaA`FBIT;hmA<7QC1>[u])  u1V(k1S) - 0 B2* %M ;W(0S[T]I) A 5%R7&&T,Xq&&1X,LΒw%%;#!"&5463!546;2!2!+"&52#!"/&4?63!5! (&&@&&(&&@&&( (  &&@&&@&&&&  #''%#"'&54676%6%% hh @` !   !    #52#"&5476!2#"&5476!2#"'&546        @  @  @    84&"2$4&"2$4&"2#"'&'&7>7.54$ KjKKjKjKKjKjKKjdne4" %!KjKKjKKjKKjKKjKKjK.٫8  !%00C'Z'.W"&462"&462"&462 6?32$6&#"'#"&'5&6&>7>7&54>$ KjKKjKjKKjKjKKjhяW.{+9E=cQdFK1A  0) LlLjKKjKKjKKjKKjKKjKpJ2`[Q?l&٫C58.H(Yee    Y'w(O'R@$#"&#"'>7676327676#" b,XHUmM.U_t,7A3ge z9@xSaQBLb( VU  !!!==w)AU!!77'7'#'#274.#"#32!5'.>537#"76=4>5'.465! KkkK _5 5 #BH1`L I& v6S F!Sr99rS!`` /7K%s}H XV P V  e  Vd/9Q[ $547.546326%>>32"&5%632264&#"64'&""&'&"2>&2654&#";2 P 3>tSU<)tqH+>XX|Wh,:UStW|XX>=X*  ))  +^X^|WX=>X:_.2//a:Ru?  Q%-W|XW>J( =u>XX|WX`  *((*  +2 2X>=XW|E03>$32!>7 '&'&7!6./EUnohiI\0<{ >ORDƚ~˕VƻoR C37J6I`Tb<^M~M8O  5!#!"&!5!!52!5463 ^B@B^`B^^B `B^^"^BB^0;%'#".54>327&$#"32$ !"$&6$3 ##320JUnLnʡ~~&q@tKL}'` - -oxnǑUyl}~~FڎLlLt`(88(   7!' !\W\ d;tZ`_O; }54+";2%54+";2!4&"!4;234;2354;2354>3&546263232632#"&#"26354;2354;2354;2````pp```  !,! -&M<FI(2 ```@PppPpppppp# #   ppppp j#"'&=!;5463!2#!"&=#".'.#!#"&463232>7>;>32#"&'#"!546 %. `@` :,.',-XjjXh-,'.,: kb>PppP>bk .%Z & :k%$> $``6&L')59I"TlԖlT"I95)'L&69GppG9$ >$%k: !+32&#!332 $&6$ ~O88OLlL>pN  iLlL '':Ma4&'#"'.7654.#""'&#"3!267#!"&54676$32#"'.76'&>$#"'.7654'&676mD5)  z{6lP,@KijjOoɎȕ>>[ta) GG 4?a) ll >;_-/ 9GH{zyN@,KԕoN繁y! ?hh>$ D" >â? $ n"&5462'#".54>22654.'&'.54>32#"#*.5./"~~s!m{b6# -SjR,l'(s-6^]Itg))[zxȁZ&+6,4$.X%%Dc* &D~WL}]I0"  YYZvJ@N*CVTR3/A3$#/;'"/fR-,&2-" 7Zr^Na94Rji3.I+ &6W6>N%&60;96@7F6I3+4&#!"3!26%4&#!"3!26 $$ ^aa`@@^aa '7  $ >. %"&546;2#!"&546;2#/a^(^aa(N@@4&#!"3!26 $$ @@^aa`@^aa '  $ >. 7"&5463!2#/a^(n@^aa(N@ %=%#!"'&7!>3!26=!26=!2%"&54&""&546 ##]VTV$KjKKjK$&4&Ԗ&4&>9G!5KK55KK5!&&jj&&#/;Im2+#!"&'#"&463>'.3%4&"26%4&"26%6.326#>;463!232#.+#!"&5#"5KK5sH..Hs5KK5e# )4# %&4&&4&&4&&4&` #4) #%~]eZ&&Ze] E-&&-EKjKj.<<.KjK)#)`"@&&`&&&&`&&)#`)"dXo&&oXG,8&&8!O##!!2#!+"'&7#+"'&7!"'&?63!!"'&?63!6;236;2!2@@8@7 8Q NQ N 8G@ 8GQ NQ N7   8 8  H H  k%  ".>2I20]@]@oo@@oo㔕a22]]p^|11|99|11|(%7'7' ' 7T dltl)qnluul)1$4&"24&"2 &6 +"&5476;2 &6 LhLLhLLhLLhL>  &   &`>hLLhLLhLLhL>&&>G  .7)1!62 1!62he220e22> v +4 [d+ d 135#5&'72!5!#"&'"'#"$547&54$ Eh`X(cYz:L:zYc\$_K`Pa}fiXXiޝfa  (+.>#5#5!5!5!54&+'#"3!267!7!#!"&5463!2U``'    jjV>(>VV>>Vq  ( ^(>VV>>VV=&'&'&'&76'&'&.' #.h8"$Y ''>eX5, ,PtsK25MRLqS;:.K'5R ChhRt(+e^TTu B"$:2~<2HpwTT V/7GWg. %&32?673327>/.'676$4&"2 $&6$   $6& $&6$ d -- m  ,6*6,  mKjKKjoooKzz8zzȎLlLU4>>4-. YG0 )xx) 0GYޞ .jKKjKqoooolzzz80LlLD/7H#"'.7'654&#"'67'.6?>%"&46227#".547|D,=),9#7[͑fx!X: D$ +s)hhijZt<F/*8C,q؜e\r,WBX/C2hhh=tXm>NZ+"&=46;2+"&=4>7>54&#"#"/.7632  >. $$ p=+& 35,W48'3  l zffff^aaP2P: D#;$# $*;? R Cfff^aa'Y >O`"&5462&'.'.76.5632.'#&'.'&6?65\\[( | r [A@[[@A#2#  7* <Y$  +}"(  q87] F  _1 )    #1Ke34&+326+"&=!#!"&763!2#!"&5463!2#>?4.'3#>?4.'3#>?4.'3Xe`64[l7  , L; =+3&98&+)>>+3&98&+)>=+3&88&+)> Wj|r >Q$~d $kaw+-wi[[\;/xgY $kaw+-wi[[\;/xgY $kaw+-wi[[\;/xgYJ\m4.'.'&#"#"'.'&47>7632327>7>54&'&#"327>"&47654'&462"'&476'&462"'&47>&'&462i$ $^"  %%  "^$ $W "@9O?1&&18?t@" W&%%&4KK6pp&46ZaaZ&4mttm ^x -  - x^ = /U7C kkz'[$ =&5%54'4&KK4r7>54 "&54>2"&462%"&54&#""&546 %#"&'&'.7>#"'&'.7>&4&&4&4&&4SZ&4&&44$#&&&j3$"('$&4&[՛[&4&&4F&4&]\&4&$  !D4%  ,\44&&4&4&&4&-Z4&&4&;cX/)#&>B)&4&j9aU0'.4a7&&u՛[[4&&4&@&&]]&&Ώ0 u40 )4#g&'.#"32676%4/&#"326'&#"2632#2+&'%#"'&6?676676632%#"'&6767#"&'&6767#"'.7>327"#"&'&6763"'.7>;7632;>%5K$ "0%>s$ "0%>;;>%5KVL#>H30 \($$(\( єyO2F/{(?0(TK.5sg$ єy#-F/{$70(TK.5sg$L#>H30 \($$(\#(@5"'K58!'"58!'"55"'K#dS$K K$Sdx#@1 w d>N;ET0((? - 2K|1 wd#N;ET0$(? - 2K$#dS$K K$SdxDN\2654& 265462"2654 #"32654>7>54."/&47&'?62 &4&&4&h՛[&4&r$'("$3j&&&#$4[ " @ GB[ "&&Β&&][u&&7a4.'0Ua9j&4&)B>&#)/Xc;u՛ "  " Gi[ Xh#"&54676324&'&#"'>54#"32#"54>54'.#"32>7>767632326#!"&5463!2b )   :4FDN  [1,^JK-*E#9gWRY vm0O w@wwwC22 c@X&!9{MA_"S4b// DR"XljPY < @www%e4.#"32>7676#'.#"#"&54>3232>754&*#"&54>763 >32 ''il$E/  @P@ ^`'W6&!.. ! -P5+ E{n46vLeVz:,SN/ M5M[  ]$[^5iC'2H&!(?]v`* l b$9> =R2 #"&5467%!"&7>3-.7>;%.7>322326/.76/.'&6766/&/&#"&676 &676&6766/&672? =1( H/ '96&@)9<')29% &06##$ J 0 7j)5@"*3%"!M %#K"%Ne 8)'8_(9./=*%8!Q #P"\Q#N&a)<9bR]mp%"'.'&54>76%&54763263 #"/7#"'#"&/%$%322654&#"%'OV9  nt  |\d ϓ[nt  |@D:) ;98'+| j," 41CH^nVz(~R 9\'  r  @L@  @w46HI(+C ,55, f[op@\j;(zV~i/5O#"'&54>32&#" 654'67'"'>54''&'"'6767&546767>7蒓`V BMR B9)̟!SH-77IXmSMH*k#".o;^J qןד>@YM $bKd ү[E";Kx%^6;%T,U:im=Mk).DT4'"&5463267&#" 6;64'.'4'>732676%#!"&5463!2),蛜s5-54&#"#"'654'.#"#"&#"3263232>3232>76 $$ Cf'/'% ( $UL ( #'/'@ 3#@,G)+H+@#3 ^aaX@ _O#NW#O_ .* ##(^aaq[632632#"&#"#".'&#"#".'&54767>7654.54632327&547>P9 B6?K? %O4T% >6>Z64Y=6>%S4N$ ?L?4B @{:y/$ ,'R! F! 8% #)(()#%: !F Q'+%0z:zO_4'.'&54>54&#"#"'654'.#"#"&#"3263232>3232>76#!"&5463!2Cf'.'% ( $VM  ) #'.'@ 3 #A,G)+H+A# 4 w@wwwXA  ?4N$NW&M&L  /* ## + @www O$>?>762'&#"./454327327>7> EpB5 3FAP/h\/NGSL  RP* m95F84f&3Ga4B|wB.\FI*/.?&,5~K % & Y."7n< "-I.M`{ARwJ!FX^dj''''"'7&'7&'7&'7&547'67'67'67'63277774$#"32$   *'ֱ,?g=OO&L&NJBg;1''ֱ.=gCIM $'&&NJBg=.%w؝\\w Ioo<<-NIDg=/%(ײ+AhEHO*"#*OICh=/'(ֲ/=h>ON.]xwڝ]7e[@)6!!"3#"&546%3567654'3!67!4&'7Sgny]K-#75LSl>9V%cPe}&Hn_HȌ=UoLQ1!45647UC" !-9[nx"&46254&"326754&"326754&"26754&"26#".547632632626326'4#"#"54732764&"264.#"327632>#"'"'#"'#"&5#"'67&'327&'&54>3267>7>7>32632632T"8""8)<())(<))))<))<))<))<) Tد{ՐRhx=8 78 n 81 pH_6Soc F@b@?d?uKbM70[f5Y$35KUC<:[;+8 n 87 8/8Zlv]64qE 'YK0-AlB; W#;WS9 &(#-7Z://:/Tr++r,,r++r,,r++r,,r++r,,ʠgxXVעe9222222^KVvF02OO23OO`lF;mhj84DroB@r+@222222C0DP`.r8h9~T4.&o@9 1P%14'!3#"&46327&#"326%35#5##33 $$  }Pcc]321IUΠ?LL?cc4MX &04;0XpD[[DpD,)&&Q 9V\26&".'&'&6?.#"#26327677>'32>&3#'&+"?626&"#!'.'!"&5463!>;26;2!2P P  92#.}SP9::%L \B )spN/9oJ5  !+D`]BgY9+,9% Pk 4P P &NnF!_7*}B<{o0&&B;*<@$ucRRc#@16#37c&@@@ J"@*4^`ED B o/8927 *@OLC!T!323X$BJ@@@&AS 0C 59" 'D/&&D4 88 $5A&%O#!"&547>7>2$7>/.".'&'&2>^B@B^ >FFzn_0P:P2\nzFF> R & p^1P:P1^ & R P2NMJMQ0Rr.B^^B 7:5]yPH!%%"FPy]5:7 = 4 QH!%%!Ht 4 =<"-/ ?1Pp+".'.'.?>;2>7$76&'&%.+"3!26#!"&54767>;2' +~'*OJ%%JN,&x' % ^M,EE,M7 ZE[P*FF*P:5  ^B@B^){$.MK%%KM.$+X)o3 "a 22!] 4  I>"">,&S8JB##B12 ` `B^^B8&ra#11#$R&  "&.2v%/%''%/%7%7'%7'/#&5'&&?&'&?&'&7%27674?6J" 0<=_gNU?DfuYGb7=^H^` =v~yT3GDPO 4Fѭqi_w\ހ!1uS%V_-d 1=U{J8n~r'U4.#".'"3!264&"26+#!"&5463!232+32+32 0P373/./373P0 T=@=T֙֙|`^B@B^^BB^`````*9deG-! !-Ged9IaallkOB^^BB^^B +Yi"&54622#!"&54>;2>+32+32+#!"&5463!2324&#!"3!26֙֙0.I/ OBBO -Q52-)&)-2 ``  ``  `^B@B^^BB^`  @   |kkl"=IYL)CggC0[jM4      B^^BB^^B @  @ !1AQu4.#".'"3!24&"254&#!"3!2654&#!"3!2654&#!"3!26#!54&+"!54&+"!"&5463!2)P90,***,09P)J66S"@8@^B@@B^^BB^Ukc9 9ckU?@@88 @@N@B^````^BB^^!1AQu#!"&4>32>72"&462#!"&=463!25#!"&=463!25#!"&=463!24&#!"3!546;2!546;2!26#!"&5463!2J66J)P90,***,09P)"@8@ @  `@@` ^B@B^^BB^ՀUUkc9 9c`@@88@@2  @ ````@B^^BB^^(%.'"&' $&  #"$&6$ wCιCwjJ~J>LlLśJSSJ͛>6LlL$,  $&6654&$ 3 72&&  lLmzzBl>KlLGzzG>'7#!"&54>7&54>2  62654' '3/U]B,ȍ,B]U/OQнQ>+X}}X0bӃۚӅb0}hQQh>ff#=#!"&4>3272"&462!3!26#!"&5463!;26=!2J66J)Q8PP8Q)  ^B@B^^B``B^VVVld9KK9d` @B^^BB^``^+;K[eu4.#"'"3!264&"254&#!"3!2654&#!"3!26%54&+";2654&#!"3!26!54&#!"!#!"&5463!2"D/@@/D"?,,?pppp@@@@^B@B^^BB^D6]W2@@2W]67MMppp@@@@@@@@n`@B^^BB^^+;K[eu#!"&54>3272"&462#!"&=463!2%#!"&=463!2+"&=46;25#!"&=463!2!3!26#!"&5463!2?,V,?"D/@@/D"pppp@@@  ^B@B^^BB^D7MM76]W2@@2W]֠ppp@@@@@@@@` @B^^BB^^A#"327.#"'63263#".'#"$&546$32326J9"65I).!1iCCu +I\Gw\B!al݇yǙV/]:=B>9+32%#!"&5463!2#"&54>54'&#"#"54654'.#"#"'.54>54'&'&543232654&432#"&54>764&'&'.54632  ?c'p& ?b1w{2V ?#&#9&CY' &.&#+B : &65&*2w1GF1)2<)<'  ( BH=ӊ:NT :O )4:i   F~b` e!}U3i?fRUX|'&'&Ic&Q  *2U.L6* / L:90%>..>%b>+ +z7ymlw45)0 33J@0!! TFL P]=GS -kwm  !*(%6&692? $&6$  '   al@lLlL,& EC h$LlL /37;%"&546734&'4&" 67 54746 #5#5#5ppF::FDFNV^fnv~"/&4?.7&#"!4>3267622"&4"&46262"&42"&4462"$2"&42"&4"&46262"&4"&46262"&42"&4$2"&42"&42"&4  R ,H8JfjQhjG^R,  !4&&4&Z4&&4&4&&4&4&&4&&4&&44&&4&4&&4&Z4&&4&4&&4&4&&4&4&&4&4&&4&&4&&4&Z4&&4&Z4&&4&  R  ,[cGjhQRJ'A, &4&&4Z&4&&4Z&4&&4Z&4&&444&&4&&4&&4Z&4&&4Z&4&&4Z&4&&4&4&&4Z&4&&4Z&4&&4&&4&&4Z&4&&4Z&4&&4%-5=EM}+"&=#!"'+"&=&="&4626"&462&"&462"&462&"&462&"&462#!"&=46;4632676/&?.7&#"!2"&462&"&462&"&462"&462&"&462&"&462"&462&"&462"&462@?AA? @ @R...R@`jlL.h) * * $ %35K.....uvnu....@@jN  * * .t2#K5..R..R. @Hq '&'&54 &7676767654$'.766$76"&462&'&'&7>54.'.7>76ȵ|_ğyv/ۃ⃺k] :Buq CA _kނXVobZZbnW|V 0  Q2- l}O  / :1z q%zG 4( 6Roa ą\< )4 J}%!!#!"&5463!2^B@B^^BB^`@B^^BB^^%#!"&=463!2^B@B^^BB^B^^BB^^ &))!32#!#!"&5463!463!2`B^^B^B@B^^B`^BB^^B@B^B^^BB^`B^^#3%764/764/&"'&"2?2#!"&5463!2    s^B@B^^BB^ג     @B^^BB^^#'7"/"/&4?'&4?62762!!%#!"&5463!2     ^B@B^^BB^    `@B^^BB^^ ! $&6$ .2r`LlLf4LlL#.C&>"'&4762"/&4?62'"'&4762%'.>6.'.>6'>/>76&'&.'&7&'">?4'.677>7.>37654'&'67>776 $&6$  ( 4Z# # & # # & y"6&.JM@& "(XE* $+8 jT?3#'.'&!3!2>?3.'#!57>7'./5!27#'.#!"g%%D-!gg<6WWZe#1=/2*]Y3-,C1 /Dx] VFIq-HD2NK '>*%R= f 07=. f D]\|yu,0>Seu#2#"'&5<>323#3#&'#334'."#"+236'&54.#"5#37326#!"&5463!2 <  zzj k-L+ )[$8=".un/2 ^B@B^^BB^5cy    (ݔI(8?C (3> #"($=@B^^BB^^0K S&'.'&'./674&$#">&>?>'76'# "&#./.'7676767>76$w .~kuBR] T%z+",|ޟj<)(!( ~ˣzF8"{%%#5)}''xJF0"H[$%EJ#% .Gk29(B13"?@ S)5" #9dmW";L65RA0@T.$}i`:f3A%% BM<$q:)BD aa%`]A &c| Ms!  Z 2}i[ F&** < ʣsc"J<&NsF% 0@Wm6&'.6$.7>7 $76".4>2., &>6'"'&7>=GV:e #:$?+% q4g &3hT`ZtQмQQмpAP1LK!:< }҈`dlb,9'  %%($! a3)W)x  оQQоQQcQǡ-җe)Us2XD\ϼYd /?O_o#"=#"=4;543#"=#"=4;543#"=#"=4;543#"=#"=4;543#"=#"=4;543%#!"&5463!2++532325++532325++532325++532325++53232p00pp00pp00pp00pp008((88(@(80pp00pp00pp00pp00pp0     @(88((88     /Q/&'%&/"&=.6?&?&'&6?'.>-#".6?'.>'&6'.>54627>%>76#"'% %6 27 2G f!)p&4&p)!f G2 72  *6 " 47 2G f!)p&4&p)!f G2 72 " 6* !k 3 j&3 %,*&&ր*9% 3&j 3 k!./!>>$,*!k 3.j&3 %Ԝ9*&&ր*ǜ,% 3&j 3 k!*,$>>!/.&6.'&$ &76$76$PutۥiPuGxy Զ[xy -_v١eNuv١e =uʦ[t78X &6# #'7-'%'&$  $6 $&6$ 31NE0gR=|||">"LlL^v!1f2iЂwgfZQQ^>"||||wLlL &ZXblw.'&>'&'&".'.'&&'&'&7>767>67>7626&'&>&'&>'.7>.676'&'&'&'.67.>7>6&'&676&'&676.676&'&>&'&676'.>6/4-LJg-   $  6)j2%+QF)b3FSP 21DK2AW ") ")$? ? 8A& AE5lZm= gG2Sw*&>$5jD GHyX/4F r 1  1""!l=6> 6 ,5./'e    .*|Ed! u & &%& &5d ))66 @ C& 8B @qL?P^7 G-hI[q:"T6 ,6 &/`  L wQ'   A ^   "  $& _  y  * <Copyright Dave Gandy 2016. All rights reserved.Copyright Dave Gandy 2016. All rights reserved.FontAwesomeFontAwesomeRegularRegularFONTLAB:OTFEXPORTFONTLAB:OTFEXPORTFontAwesomeFontAwesomeVersion 4.7.0 2016Version 4.7.0 2016FontAwesomeFontAwesomePlease refer to the Copyright section for the font trademark attribution notices.Please refer to the Copyright section for the font trademark attribution notices.Fort AwesomeFort AwesomeDave GandyDave Gandyhttp://fontawesome.iohttp://fontawesome.iohttp://fontawesome.io/license/http://fontawesome.io/license/      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ab cdefghijklmnopqrstuvwxyz{|}~"      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~glassmusicsearchenvelopeheartstar star_emptyuserfilmth_largethth_listokremovezoom_inzoom_outoffsignalcogtrashhomefile_alttimeroad download_altdownloaduploadinbox play_circlerepeatrefreshlist_altlockflag headphones volume_off volume_down volume_upqrcodebarcodetagtagsbookbookmarkprintcamerafontbolditalic text_height text_width align_left align_center align_right align_justifylist indent_left indent_rightfacetime_videopicturepencil map_markeradjusttinteditsharecheckmove step_backward fast_backwardbackwardplaypausestopforward fast_forward step_forwardeject chevron_left chevron_right plus_sign minus_sign remove_signok_sign question_sign info_sign screenshot remove_circle ok_circle ban_circle arrow_left arrow_rightarrow_up arrow_down share_alt resize_full resize_smallexclamation_signgiftleaffireeye_open eye_close warning_signplanecalendarrandomcommentmagnet chevron_up chevron_downretweet shopping_cart folder_close folder_openresize_verticalresize_horizontal bar_chart twitter_sign facebook_sign camera_retrokeycogscomments thumbs_up_altthumbs_down_alt star_half heart_emptysignout linkedin_signpushpin external_linksignintrophy github_sign upload_altlemonphone check_emptybookmark_empty phone_signtwitterfacebookgithubunlock credit_cardrsshddbullhornbell certificate hand_right hand_lefthand_up hand_downcircle_arrow_leftcircle_arrow_rightcircle_arrow_upcircle_arrow_downglobewrenchtasksfilter briefcase fullscreengrouplinkcloudbeakercutcopy paper_clipsave sign_blankreorderulol strikethrough underlinetablemagictruck pinterestpinterest_signgoogle_plus_sign google_plusmoney caret_downcaret_up caret_left caret_rightcolumnssort sort_downsort_up envelope_altlinkedinundolegal dashboard comment_alt comments_altboltsitemapumbrellapaste light_bulbexchangecloud_download cloud_uploaduser_md stethoscopesuitcasebell_altcoffeefood file_text_altbuildinghospital ambulancemedkit fighter_jetbeerh_signf0fedouble_angle_leftdouble_angle_rightdouble_angle_updouble_angle_down angle_left angle_rightangle_up angle_downdesktoplaptoptablet mobile_phone circle_blank quote_left quote_rightspinnercirclereply github_altfolder_close_altfolder_open_alt expand_alt collapse_altsmilefrownmehgamepadkeyboardflag_altflag_checkeredterminalcode reply_allstar_half_emptylocation_arrowcrop code_forkunlink_279 exclamation superscript subscript_283 puzzle_piece microphonemicrophone_offshieldcalendar_emptyfire_extinguisherrocketmaxcdnchevron_sign_leftchevron_sign_rightchevron_sign_upchevron_sign_downhtml5css3anchor unlock_altbullseyeellipsis_horizontalellipsis_vertical_303 play_signticketminus_sign_alt check_minuslevel_up level_down check_sign edit_sign_312 share_signcompasscollapse collapse_top_317eurgbpusdinrjpyrubkrwbtcfile file_textsort_by_alphabet_329sort_by_attributessort_by_attributes_alt sort_by_ordersort_by_order_alt_334_335 youtube_signyoutubexing xing_sign youtube_playdropbox stackexchange instagramflickradnf171bitbucket_signtumblr tumblr_signlong_arrow_down long_arrow_uplong_arrow_leftlong_arrow_rightwindowsandroidlinuxdribbleskype foursquaretrellofemalemalegittipsun_366archivebugvkweiborenren_372stack_exchange_374arrow_circle_alt_left_376dot_circle_alt_378 vimeo_square_380 plus_square_o_382_383_384_385_386_387_388_389uniF1A0f1a1_392_393f1a4_395_396_397_398_399_400f1ab_402_403_404uniF1B1_406_407_408_409_410_411_412_413_414_415_416_417_418_419uniF1C0uniF1C1_422_423_424_425_426_427_428_429_430_431_432_433_434uniF1D0uniF1D1uniF1D2_438_439uniF1D5uniF1D6uniF1D7_443_444_445_446_447_448_449uniF1E0_451_452_453_454_455_456_457_458_459_460_461_462_463_464uniF1F0_466_467f1f3_469_470_471_472_473_474_475_476f1fc_478_479_480_481_482_483_484_485_486_487_488_489_490_491_492_493_494f210_496f212_498_499_500_501_502_503_504_505_506_507_508_509venus_511_512_513_514_515_516_517_518_519_520_521_522_523_524_525_526_527_528_529_530_531_532_533_534_535_536_537_538_539_540_541_542_543_544_545_546_547_548_549_550_551_552_553_554_555_556_557_558_559_560_561_562_563_564_565_566_567_568_569f260f261_572f263_574_575_576_577_578_579_580_581_582_583_584_585_586_587_588_589_590_591_592_593_594_595_596_597_598f27euniF280uniF281_602_603_604uniF285uniF286_607_608_609_610_611_612_613_614_615_616_617_618_619_620_621_622_623_624_625_626_627_628_629uniF2A0uniF2A1uniF2A2uniF2A3uniF2A4uniF2A5uniF2A6uniF2A7uniF2A8uniF2A9uniF2AAuniF2ABuniF2ACuniF2ADuniF2AEuniF2B0uniF2B1uniF2B2uniF2B3uniF2B4uniF2B5uniF2B6uniF2B7uniF2B8uniF2B9uniF2BAuniF2BBuniF2BCuniF2BDuniF2BEuniF2C0uniF2C1uniF2C2uniF2C3uniF2C4uniF2C5uniF2C6uniF2C7uniF2C8uniF2C9uniF2CAuniF2CBuniF2CCuniF2CDuniF2CEuniF2D0uniF2D1uniF2D2uniF2D3uniF2D4uniF2D5uniF2D6uniF2D7uniF2D8uniF2D9uniF2DAuniF2DBuniF2DCuniF2DDuniF2DEuniF2E0uniF2E1uniF2E2uniF2E3uniF2E4uniF2E5uniF2E6uniF2E7_698uniF2E9uniF2EAuniF2EBuniF2ECuniF2EDuniF2EE=O<01hprewikka-5.1.1/prewikka/htdocs/fonts/fontawesome-webfont.svg0000664000175000017500000154373313555143652025734 0ustar tandrejatandreja00000000000000 Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 By ,,, Copyright Dave Gandy 2016. All rights reserved. prewikka-5.1.1/prewikka/htdocs/fonts/fontawesome-webfont.ttf0000664000175000017500000050325413555143652025723 0ustar tandrejatandreja00000000000000 PFFTMkGGDEFp OS/22z@X`cmap : gasphglyfMLhead-6hhea $hmtxEy loca\ maxp,8 name㗋ghpostkuːxY_< 3232  '@i33spyrs@  pU]yn2@ zZ@55 zZZ@,_@s@ @(@@@- MM- MM@@@ -`b $ 648""""""@ D@ ,,@  m)@@   ' D9>dY* '    T     @ f %RE    $!k(D'  % %  0%/&p@0 !"""`>N^n~.>N^n~>N^n~ !"""`!@P`p 0@P`p!@P`p\XSB1ݬ        ,,,,,,,,,,,,,tLT$l x T ( dl,4dpH$d,t( !"0# $,$&D'()T**,,-.@./`/00123d4445 556 6\67H78 8`89L9:h:;<>?h?@H@A0ABXBCdCDLDEFG0GHIJ8KLMdN,NNOP`PQ4QR RlS,ST`U0WXZ[@[\<\]^(^_`pb,bddePefg`giLijDk klm@n,oLpqrsxttuD{`||}}~Hl@lH T H`@$\XDTXDP,8d\Hx tXpdxt@ Œ\ ļŸƔ0dʨˀ͔xϰЌ,ш҈ ӌ8,՜`lHش`Tڸ۔@lބ߬lp 4X$l( ` d      ,,8(Xx|T@| !"x##l$$'h(*L,T.L1t1230345t6T7$8 9H::;<<?X@ABCDEHFHGpHHIxJ JKLMN@P@QRSDT ULV`VWXX4XZZ[d[\|]^`aHabcXdetfhghi\jxnp@svwxyz{h|}}\lt4t88LT|| 4xLX(  @lt$xLL HĠT(  ʈˠϔldPՄxpڬTT ވL <H$l4 Pl ,xp,xt d 44,hP 4   4<,,408$8T |!h"$L%0&H'()*0*+,.$.012@234t5$69 ::; ;<(<=4?@ACDFH`HILLLLLLLLLLLLLLLLp7!!!@pp p]!2#!"&463!&54>3!2+@&&&&@+$(($F#+&4&&4&x+#+".4>32".4>32467632DhgZghDDhg-iWDhgZghDDhg-iW&@ (8 2N++NdN+';2N++NdN+'3 8!  #"'#"$&6$ rL46$܏ooo|W%r4L&V|oooܳ%=M%+".'&%&'3!26<.#!";2>767>7#!"&5463!2 %3@m00m@3%    @ :"7..7":6]^B@B^^BB^ $΄+0110+$ (   t1%%1+`B^^B@B^^"'.54632>324 #LoP$$Po>Z$_dC+I@$$@I+"#"'%#"&547&547%62V??V8<8y   b% I))9I  + % %#"'%#"&547&547%62q2ZZ2IzyV)??V8<8)>~>[   2 b% I))9I %#!"&54>3 72 &6 }XX}.GuLlLuG.>mmUmEEm> /?O_o54&+";2654&+";2654&+";264&#!"3!2654&+";2654&+";264&#!"3!2654&+";2654&+";2654&+";267#!"&5463!2&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&^BB^^B@B^@&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&B^^B@B^^/?#!"&5463!2#!"&5463!2#!"&5463!2#!"&5463!2L44LL44LL44LL44LL44LL44LL44LL44L4LL44LL4LL44LL4LL44LL4LL44LL /?O_o#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!28((88(@(88((88(@(88((88(@(88((88(@(88((88(@(88((88(@(88((88(@(88((88(@(88((88(@(8 (88((88(88((88(88((88(88((88(88((88(88((88(88((88(88((88(88((88/?O_#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!28((88(@(88((88(@(88(@(88((88((88(@(88(@(88((88(@(88((8 (88((88(88((88(88((88(88((88(88((88(88((88y"/&4?62 62,PP&PP,jPn#$"' "/&47 &4?62 62 PP&P&&P&P&P&&P&P#+D++"&=#"&=46;546;232  #"'#"$&6$   @    @  rK56$܏ooo|W@    @   rjK&V|oooܳ0#!"&=463!2  #"'#"$&6$   @ rK56$܏ooo|W@  @ rjK&V|oooܳ)5 $&54762>54&'.7>"&5462zz+i *bkQнQkb* j*LhLLhLzzBm +*i JyhQQhyJ i*+ mJ4LL44LL/?O%+"&=46;2%+"&546;2%+"&546;2+"&546;2+"&546;2`r@@r@@n4&"2#"/+"&/&'#"'&'&547>7&/.=46?67&'&547>3267676;27632Ԗ #H  ,/ 1)  ~'H  (C  ,/ 1)  $H ԖԖm 6%2X  % l2 k r6 [21 ..9Q $ k2 k w3 [20/;Cg+"&546;2+"&546;2+"&546;2!3!2>!'&'!+#!"&5#"&=463!7>3!2!2@@@@@@@`0 o`^BB^`5FN(@(NF5 @@@L%%Ju  @LSyuS@%44%f5#!!!"&5465 7#"' '&/&6762546;2&&??>  LL >  X   &&&AJ A J Wh##!"&5463!2!&'&!"&5!(8((88((`x c`(8`((88(@(8(D 9 8( ,#!"&=46;46;2.  6 $$ @(r^aa@@`(_^aa2NC5.+";26#!26'.#!"3!"547>3!";26/.#!2W  .@   @.$S   S$@   9I   I6>  >%=$4&"2$4&"2#!"&5463!2?!2"'&763!463!2!2&4&&4&&4&&48(@(88(ч::(8@6@*&&*4&&4&&4&&4& (88(@(8888)@)'&&@$0"'&76;46;232  >& $$ `  (r^aa` @`2(^aa$0++"&5#"&54762  >& $$ ^ ?  @(r^aa` ? (^aa #!.'!!!%#!"&547>3!2<<<_@`&& 5@5 @  &&>=(""='#"'&5476.  6 $$   ! (r^aaJ %%(_^aa3#!"'&?&#"3267672#"$&6$3276&@*hQQhwI mʬzzk)'@&('QнQh_   z8zoe$G!"$'"&5463!23267676;2#!"&4?&#"+"&=!2762@hk4&&&GaF * &@&ɆF * Ak4&nf&&&4BHrd@&&4rd  Moe&/?O_o+"&=46;25+"&=46;25+"&=46;2#!"&=463!25#!"&=463!25#!"&=463!24&#!"3!26#!"&5463!2 @  @  @  @  @  @  @    @    @    @   ^B@B^^BB^`@  @ @  @ @  @ @  @ @  @ @  @ 3@  MB^^B@B^^!54&"#!"&546;54 32@Ԗ@8(@(88( p (8jj(88(@(88@7+"&5&5462#".#"#"&5476763232>32@@ @ @KjKך=}\I&:k~&26]S &H&  &H5KKut,4, & x:;*4*&K#+"&546;227654$ >3546;2+"&="&/&546$ <X@@Gv"DװD"vG@@X<4L41!Sk @ G< _bb_ 4.54632&4&&M4&UF &""""& F&M&&M&%/B/%G-Ik"'!"&5463!62#"&54>4.54632#"&54767>4&'&'&54632#"&547>7676'&'.'&54632&4&&M4&UF &""""& FU &'8JSSJ8'&  &'.${{$.'& &M&&M&%/B/%7;&'66'&;4[&$ [2[ $&[  #/37#5#5!#5!!!!!!!#5!#5!5##!35!!! #'+/37;?3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3???? ^>>~??????~??~??^??^^? ^??4&"2#"'.5463!2KjKKjv%'45%5&5L45&% jKKjK@5%%%%54L5&6'k54&"2#"'.5463!2#"&'654'.#32KjKKjv%'45%5&5L45&%%'4$.%%5&55&% jKKjK@5%%%%54L5&6'45%%%54'&55&6' yTdt#!"&'&74676&7>7>76&7>7>76&7>7>76&7>7>63!2#!"3!2676'3!26?6&#!"3!26?6&#!"g(sAeM ,*$/ !'& JP$G] x6,& `   h `   "9Hv@WkNC<.  &k& ( "$p" . #u&#  %!' pJvwEF#  @   @  2#"' #"'.546763!''!0#GG$/!''! 8""8  X! 8" "8  <)!!#"&=!4&"27+#!"&=#"&546;463!232(8&4&&4 8(@(8 qO@8((`(@Oq8(&4&&4&@` (88( Oq (8(`(q!)2"&42#!"&546;7>3!2  Ijjjj3e55e3gr`Ijjjj1GG1rP2327&7>7;"&#"4?2>54.'%3"&#"#ժ!9&WB03& K5!)V?@L' >R>e;&L::%P>vO 'h N_":- &+# : ' +a%3 4'.#"32>54.#"7>7><5'./6$3232#"&#"+JBx)EB_I:I*CRzb3:dtB2P$ $5.3bZF|\8!-T>5Fu\,,jn OrB,7676'5.'732>7"#"&#&#"OA zj=N!}:0e%  y + tD3~U#B4 # g  '2 %/!: T bRU,7}%2"/&6;#"&?62+326323!2>?23&'.'.#"&"$#"#&=>764=464.'&#"&'!~:~!PP!~:~!P6 ,,$$% *'  c2N  ($"LA23Yl !x!*%%%% pP,T NE Q7^oH!+( 3  *Ueeu  wga32632$?23&'.5&'&#"&"5$#"#&=>7>4&54&54>.'&#"&'2#".465!#".'&47>32!4&4>Q6 ,,Faw!*' =~Pl*  ($"LA23Yl  )!* <7@@7<  <7@@7<  pP,T MF Q747ƢHoH!+( 3  tJHQ6  wh',686,'$##$',686,'$##$/?%#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2&&&&&&&&&&&&&&&&&&&&f&&&&f&&&&f&&&&/?%#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2&&&&&&&&&&&&&&&&&&&&f&&&&f&&&&f&&&&/?%#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2&&&&&&&&&&&&&&&&&&&&f&&&&f&&&&f&&&&/?%#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2&&&&&&&&&&&&&&&&&&&&f&&&&f&&&&f&&&&/?O_o%+"&=46;2+"&=46;2+"&=46;2#!"&=463!2+"&=46;2#!"&=463!2#!"&=463!2#!"&=463!2        @     @   @   @   s  s    s    s  s  /?O#"'&47632#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2     @     @   @  @          s  s  s  /?O#"&54632 #!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2`      @     @   @  @     @   s  s  s  #"'#!"&5463!2632' mw@www '*wwww."&462!5 !"3!2654&#!"&5463!2pppp@  @ ^BB^^B@B^ppp@@  @    @B^^BB^^k%!7'34#"3276' !7632k[[v  6`%`$65&%[[k `5%&&'4&"2"&'&54 Ԗ!?H?!,,ԖԖmF!&&!Fm,%" $$ ^aa`@^aa-4'.'&"26% 547>7>2"KjKXQqYn 243nYqQ$!+!77!+!$5KK,ԑ ]""]ً 9>H7'3&7#!"&5463!2'&#!"3!26=4?6 !762xtt`  ^Qwww@?6 1B^^B@B^ @(` `\\\P`tt8`  ^Ͼww@w 1^BB^^B~ @` \ \P+Z#!"&5463!12+"3!26=47676#"'&=# #"'.54>;547632www M8 pB^^B@B^ 'sw- 9*##;Noj' #ww@w "^BB^^B  *  "g`81T`PSA:'*4/D#!"&5463!2#"'&#!"3!26=4?632"'&4?62 62www@?6 1 B^^B@B^ @ BRnBBn^ww@w 1 ^BB^^B @ BnnBC"&=!32"'&46;!"'&4762!#"&4762+!54624&&4&&44&&4&&44&&44&&4&&44&&6'&'+"&546;267: &&&& s @  Z&&&&Z +6'&''&'+"&546;267667: : &&&&  s @  :  Z&&&&Z  : z6'&''&47667S: : s @  : 4 : | &546h!!0a   $#!"&5463!2#!"&5463!2&&&&&&&&@&&&&&&&&#!"&5463!2&&&&@&&&&&54646&5- : s  :  :4:  +&5464646;2+"&5&5-  &&&& : s  :  : &&&& :  &54646;2+"&5- &&&& s  : &&&&  62#!"&!"&5463!24 @ &&&&-:&&&& "'&476244444Zf "/&47 &4?62S44444#/54&#!4&+"!"3!;265!26 $$ &&&&&&&&@^aa@&&&&&&&&+^aa54&#!"3!26 $$ &&&&@^aa@&&&&+^aa+74/7654/&#"'&#"32?32?6 $$ }ZZZZ^aaZZZZ^aa#4/&"'&"327> $$ [4h4[j^aa"ZiZJ^aa:F%54&+";264.#"32767632;265467>$ $$ oW  5!"40K(0?i+! ":^aaXRd D4!&.uC$=1/J=^aa.:%54&+4&#!";#"3!2654&+";26 $$ ```^aa^aa/_#"&=46;.'+"&=32+546;2>++"&=.'#"&=46;>7546;232m&&m l&&l m&&m l&&ls&%&&%&&%&&%&&&l m&&m l&&l m&&m ,&%&&%&&%&&%&#/;"/"/&4?'&4?627626.  6 $$ I     ͒(r^aaɒ    (_^aa , "'&4?6262.  6 $$ Z4f44fz(r^aaZ&4ff4(_^aa "4'32>&#" $&6$  WoɒV󇥔 zzz8YW˼[?zz:zz@5K #!#"'&547632!2A4@%&&K%54'u%%&54&K&&4A5K$l$L%%%54'&&J&j&K5K #"/&47!"&=463!&4?632%u'43'K&&%@4AA4&&K&45&%@6%u%%K&j&%K55K&$l$K&&u#5K@!#"'+"&5"/&547632K%K&56$K55K$l$K&&#76%%53'K&&%@4AA4&&K&45&%%u'5K"#"'&54?63246;2632K%u'45%u&&J'45%&L44L&%54'K%5%t%%$65&K%%4LL4@&%%K',"&5#"#"'.'547!34624&bqb>#  5&44& 6Uue7D#  "dž&/#!"&546262"/"/&47'&463!2 &@&&4L  r&4  r L&& 4&&&L rI@& r  L4&& s/"/"/&47'&463!2#!"&546262&4  r L&& &@&&4L  r@@& r  L4&& 4&&&L r##!+"&5!"&=463!46;2!28(`8((8`(88(8((8(8 (8`(88(8((8(88(`8#!"&=463!28(@(88((8 (88((88z5'%+"&5&/&67-.?>46;2%6.@g.L44L.g@. .@g. L44L .g@.g.n.4LL43.n.gg.n.34LL4͙.n.g -  $54&+";264'&+";26/a^    ^aa fm  @ J%55!;263'&#"$4&#"32+#!"&5#"&5463!"&46327632#!2$$8~+(888(+}(`8((8`]]k==k]]8,8e8P88P8`(88(@MMN4&#"327>76$32#"'.#"#"&'.54>54&'&54>7>7>32&z&^&./+>+)>J> Wm7' '"''? &4&c&^|h_bml/J@L@#* #M6:D 35sҟw$ '% ' \t3#!"&=463!2'.54>54''  @ 1O``O1CZZ71O``O1BZZ7@  @ N]SHH[3`)TtbN]SHH[3^)Tt!1&' 547 $4&#"2654632 '&476 ==嘅}(zVl''ٌ@uhyyhu9(}VzD##D# =CU%7.5474&#"2654632%#"'&547.'&476!27632#76$7&'7+NWb=嘧}(zVj\i1  z,X Y[6 $!%'FuJiys?_9ɍ?kyhun(}Vz YF  KA؉La  02-F"@Qsp@_!3%54&+";264'&+";26#!"&'&7>2    #%;"";%#`,@L 5 `   `  L`4LH` `   a 5 L@ #37;?Os!!!!%!!!!%!!!!!!!!%!!4&+";26!!%!!!!74&+";26%#!"&546;546;2!546;232 `@ `@ @@ @ @  @  @  @  @ L44LL4^B@B^^B@B^4L  @@@@    @@   @@    M4LL44L`B^^B``B^^B`L7q.+"&=46;2#"&=".'673!54632#"&=!"+"&=46;2>767>3!546327>7&54>$32dFK1A  0) L.٫C58.H(Ye#3C $=463!22>=463!2#!"&5463!2#!"&5463!2H&&/7#"&463!2!2LhLLhLhLLh! &&&&& &4hLLhLLhLLhL%z< 0&4&& )17&4& &&#!"&5463!2!2\@\\@\\@\\\\ W*#!"&547>3!2!"4&5463!2!2W+B"5P+B@"5^=\@\ \H#t3G#3G:_Ht\\ @+32"'&46;#"&4762&&4&&44&&44&&4@"&=!"'&4762!54624&&44&&44&&4&& !!!3!!0@67&#".'&'#"'#"'32>54'6#!"&5463!28ADAE=\W{O[/5dI kDtpČe1?*w@www (M& B{Wta28r=Ku?RZ^GwT -@www$2+37#546375&#"#3!"&5463ww/Dz?swww@wS88 ww#'.>4&#"26546326"&462!5!&  !5!!=!!%#!"&5463!2B^8(Ԗ>@|K55KK55K^B(8ԖԖ€>v5KK55KKHG4&"&#"2654'32#".'#"'#"&54$327.54632@pp)*Pppp)*Pb '"+`N*(a;2̓c`." b PTY9ppP*)pppP*)b ".`(*Nͣ2ͣ`+"' b MRZB4&"24&"264&"26#"/+"&/&'#"'&547>7&/.=46?67&'&547>3267676;27632#"&'"'#"'&547&'&=4767&547>32626?2#"&'"'#"'&547&'&=4767&547>32626?2ԖLhLKjKLhLKjK "8w s%(  ")v  >  "8x s"+  ")v  <  3zLLz3 3>8L3)x3 3zLLz3 3>8L3)x3 ԖԖ4LL45KK54LL45KK #)0C wZ l/ Y N,& #)0C vZl. Y L0"qG^^Gqq$ ]G)FqqG^^Gqq$ ]G)Fq%O#"'#"&'&4>7>7.546$ '&'&'# '32$7>54'VZ|$2 $ |E~E<| $ 2$|ZV:(t}X(  &%(Hw쉉xH(%& (XZT\MKG<m$4&"24&#!4654&#+32;254'>4'654&'>7+"&'&#!"&5463!6767>763232&4&&4N2`@`%)7&,$)' %/0Ӄy#5 +1 &<$]`{t5KK5$e:1&+'3TF0h4&&4&3M:;b^v+D2 5#$IIJ 2E=\$YJ!$MCeM-+(K55KK5y*%Au]c>q4&"24&'>54'654&'654&+"+322654&5!267+#"'.'&'&'!"&5463!27>;2&4&&4+ 5#bW0/% ')$,&7)%`@``2Nh0##T3'"( 0;e$5KK5 tip<& 1&4&&4&#\=E2&%IURI$#5 2D+v^b;:M2gc]vDEA%!bSV2MK55K(,,MeCM$!I@#"&547&547%6@?V8 b% I)94.""'." 67"'.54632>32+C`\hxeH>Hexh\`C+ED4 #LoP$$Po>Q|I.3MCCM3.I|Q/Z$_dC+I@$$@I+ (@%#!"&5463!2#!"3!:"&5!"&5463!462 ww@  B^^B  4&@&&&4 `  ww   ^B@B^ 24& && &%573#7.";2634&#"35#347>32#!"&5463!2FtIG9;HIxI<,tԩw@wwwz4DD43EEueB&#1s@www .4&"26#!+"'!"&5463"&463!2#2&S3 Ll&c4LL44LL4c@& &{LhLLhL'?#!"&5463!2#!"3!26546;2"/"/&47'&463!2www@B^^B@B^@&4t  r &&`ww@w@^BB^^B@R&t r  4&&@"&5!"&5463!462 #!"&54&>3!2654&#!*.54&>3!24&@&&&4 sw  @B^^B  @w4& && &3@w   ^BB^    I&5!%5!>732#!"&=4632654&'&'.=463!5463!2!2JJSq*5&=CKuuKC=&5*q͍S8( ^B@B^ (8`N`Ѣ΀GtO6)"M36J[E@@E[J63M")6OtG(8`B^^B`8 ',26'&'&76'6'&6&'&6'&4#"7&64 654'.'&'.63226767.547&7662>76#!"&5463!2  /[  . =XĚ4,+"  * +, 1JH'5G:: #L5+@=&#w@wwwP.1GE,ԧ4 4+ ; /5cFO:>JJ>:O9W5$@(b 4 @www'?$4&"2$4&"2#!"&5463!3!267!2#!#!"&5!"'&762&4&&4&&4&&48(@(88(c==c(8*&&*6&4&&4&&4&&4& (88(@(88HH88`(@&&('@1c4&'.54654'&#"#"&#"32632327>7#"&#"#"&54654&54>76763232632   N<;+gC8A`1a99gw|98aIe$IVNz<:LQJ  ,-[% 061I()W,$-7,oIX()oζA;=N0 eTZ  (O#".'&'&'&'.54767>3232>32 e^\4?P bMO0# 382W# & 9C9 Lĉ" 82<*9FF(W283 #0OMb P?4\^e FF9*<28 "L 9C9 & #!"3!2654&#!"&5463!2`B^^B@B^^ީwww@w^BB^^B@B^ww@w#!72#"' #"'.546763YY !''!0#GG$/!''!&UUjZ 8""8  X! 8" "8 GW4.'.#"#".'.'.54>54.'.#"32676#!"&5463!2 1.- +$)  c8 )1)  05.D <90)$9w@wwwW  )1) 7c  )$+ -.1 9$)0< D.59@www,T1# '327.'327.=.547&54632676TC_LҬ#+i!+*pDNBN,y[`m`%i]hbEm}a u&,SXK &$f9s? _#"!#!#!54632V<%'ЭHH (ںT\dksz &54654'>54'6'&&"."&'./"?'&546'&6'&6'&6'&6'&74"727&6/a49[aA)O%-j'&]]5r-%O)@a[9' 0BA; + >HCU  #  $  2  AC: oM=a-6OUwW[q ( - q[WwUP6$C +) (  8&/ &eMa  & $      %+"&54&"32#!"&5463!54 &@&Ԗ`(88(@(88(r&&jj8((88(@(8#'+2#!"&5463"!54&#265!375!35!B^^BB^^B   `^B@B^^BB^  ` !="&462+"&'&'.=476;+"&'&$'.=476; pppp$!$qr % }#ߺppp!E$ rqܢ# % ֻ!)?"&462"&4624&#!"3!26!.#!"#!"&547>3!2/B//B//B//B @   2^B@B^\77\aB//B//B//B/@    ~B^^B@2^5BB52.42##%&'.67#"&=463! 25KK5L4_u:B&1/&.- zB^^B4LvyKjK4L[!^k'!A3;):2*547&5462;U gIv0ZZ0L4@Ԗ@4L2RX='8P8'=XR U;Ig0,3lb??bl34LjjL4*\(88(\}I/#"/'&/'&?'&'&?'&76?'&7676767676` (5 )0 ) *) 0) 5(  (5 )0 )))) 0) 5( *) 0) 5(  )5 )0 )**) 0) 5)  )5 )0 )*5h$4&"24&#!4>54&#"+323254'>4'654&'!267+#"'&#!"&5463!2>767>32!2&4&&4N2$YGB (HGEG HQ#5K4Li!<;5KK5 A# ("/?&}vh4&&4&3M95S+C=,@QQ9@@IJ 2E=L5i>9eME;K55K J7R>@#zD<5=q%3#".'&'&'&'.#"!"3!32>$4&"2#!"#"&?&547&'#"&5463!&546323!2` #A<(H(GY$2NL4K5#aWTƾh&4&&4K5;=!ihv}&?/"( #A  5K2*! Q@.'!&=C+S59M34L=E2 JI UR@@&4&&4&5K;ELf9>igR7J K5h4&"24#"."&#"4&#"".#"!54>7#!"&54.'&'.5463246326326&4&&4IJ 2E=L43M95S+C=,@QQ9@@E;K55K J7R>@#zD9eMZ4&&4&<#5K4LN2$YGB (HGEG HV;5KK5 A# ("/?&}vhi!<4<p4.=!32>332653272673264&"2/#"'#"&5#"&54>767>5463!2@@2*! Q@.'!&=C+S59M34L.9E2 JI UR&4&&4&Lf6Aig6Jy#@>R7J K55K;E@TƾH #A<(H(GY$2NL4K#5#a=4&&4&D=ihv}&?/"( #A  5KK5;+54&#!764/&"2?64/!26 $$ & [6[[j6[&^aa@&4[[6[[6&+^aa+4/&"!"3!277$ $$ [6[ &&[6j[ ^aae6[j[6&&4[j[^aa+4''&"2?;2652?$ $$ [6[[6&&4[^aaf6j[[6[ &&[^aa+4/&"4&+"'&"2? $$ [6&&4[j[6[j^aad6[&& [6[[j^aa   $2>767676&67>?&'4&'.'.'."#&6'&6&'3.'.&'&'&&'&6'&>567>#7>7636''&'&&'.'"6&'6'..'/"&'&76.'7>767&.'"76.7"7"#76'&'.'2#22676767765'4.6326&'.'&'"'>7>&&'.54>'>7>67&'&#674&7767>&/45'.67>76'27".#6'>776'>7647>?6#76'6&'676'&67.'&'6.'.#&'.&6'&.5/a^D&"      4   $!   #          .0"Y +  !       $     "  +       Α      ^aa                        P   ' -( # * $  "  !     * !   (         $      2 ~/$4&"2 #"/&547#"32>32&4&&4V%54'j&&'/덹:,{ &4&&4&V%%l$65&b'Cr! " k[G +;%!5!!5!!5!#!"&5463!2#!"&5463!2#!"&5463!2&&&&&&&&&&&&@&&&&&&&&&&&&{#"'&5&763!2{' **)*)'/!5!#!"&5!3!26=#!5!463!5463!2!2^B@B^&@&`^B`8(@(8`B^ B^^B&&B^(88(^G 76#!"'&? #!"&5476 #"'&5463!2 '&763!2#"'c)'&@**@&('c (&*cc*&' *@&('c'(&*cc*&('c'(&@*19AS[#"&532327#!"&54>322>32"&462 &6 +&'654'32>32"&462QgRp|Kx;CByy 6Fe= BPPB =eF6 ԖV>!pRgQBC;xK|Ԗ{QNa*+%xx5eud_C(+5++5+(C_due2ԖԖ>NQ{u%+*jԖԖp!Ci4/&#"#".'32?64/&#"327.546326#"/&547'#"/&4?632632(* 8( !)(A(')* 8( !USxySSXXVzxTTUSxySSXXVzxT@(  (8 *(('( (8 SSUSx{VXXTTSSUSx{VXXT#!"5467&5432632t,Ԟ;F`j)6,>jK?s !%#!"&7#"&463!2+!'5#8EjjE8@&&&&@XYY&4&&4&qDS%q%N\jx2"&4#"'#"'&7>76326?'&'#"'.'&676326326&'&#"32>'&#"3254?''74&&4&l NnbSVZ bRSD zz DSRb)+USbn \.2Q\dJ'.2Q\dJ.Q2.'Jd\Q2.'Jd`!O` ` &4&&4r$#@B10M5TNT{L5T II T5L;l'OT4M01B@#$*3;$*3;;3*$;3*$: $/ @@Qq`@"%3<2#!"&5!"&5467>3!263! !!#!!46!#!(88(@(8(8(`((8D<++<8(`(8(`8(@(88( 8((`(8((<`(8(``(8||?%#"'&54632#"'&#"32654'&#"#"'&54632|udqܟs] = OfjL?R@T?"& > f?rRX=Edudsq = _MjiL?T@R?E& f > =XRr?b!1E)!34&'.##!"&5#3463!24&+";26#!"&5463!2 08((88(@(8  8((88((`(1  `(88((88(@  `(88(@(8(`#!"&5463!2w@www`@www/%#!"&=463!2#!"&=463!2#!"&=463!2&&&&&&&&&&&&&&&&&&&&&&&&@'7G$"&462"&462#!"&=463!2"&462#!"&=463!2#!"&=463!2ppppppp @   ppp @    @   Рpppppp  ppp    <L\l|#"'732654'>75"##5!!&54>54&#"'>3235#!"&=463!2!5346=#'73#!"&=463!2#!"&=463!2}mQjB919+i1$AjM_3</BB/.#U_:IdDRE @  k*Gj @   @   TP\BX-@8 C)5Xs J@$3T4+,:;39SG2S.7<  vcc)) %Ll}    5e2#!"&=463%&'&5476!2/&'&#"!#"/&'&=4'&?5732767654'&@02uBo  T25XzrDCBBEh:%)0%HPIP{rQ9f#-+>;I@KM-/Q"@@@#-bZ $&P{<8[;:XICC>.'5oe80#.0(  l0&%,"J&9%$<=DTIcs&/6323276727#"327676767654./&'&'737#"'&'&'&54'&54&#!"3!260% <4"VRt8<@< -#=XYhW8+0$"+dTLx-'I&JKkmuw<=V@!X@ v '|N;!/!$8:IObV;C#V  &   ( mL.A:9 !./KLwPM$@@ /?O_o%54&#!"3!2654&#!"3!2654&#!"3!2654&#!"3!2654&#!"3!2654&#!"3!2654&#!"3!2654&#!"3!2654&#!"3!26#!"&5463!2@@@@@@@@@^BB^^B@B^NB^^B@B^^#+3 '$"/&4762%/?/?/?/?%k*66bbbb|<<<bbbbbbbb%k66Ƒbbb<<<<^bbbbbb@M$4&"2!#"4&"2&#"&5!"&5#".54634&>?>;5463!2LhLLh LhLLhL! 'ԖԖ@' !&  ?&&LhLLhL hLLhL jjjj &@6/" &&J#"'676732>54.#"7>76'&54632#"&7>54&#"&54$ ok; -j=yhwi[+PM 3ѩk=J%62>VcaaQ^ ]G"'9r~:`}Ch 0=Z٤W=#uY2BrUI1^Fk[|aL2#!67673254.#"67676'&54632#"&7>54&#"#"&5463ww+U ,iXբW<"uW1AqSH1bdww'74'!3#"&46327&#"326%35#5##33#!"&5463!20U6cc\=hlࠥYmmnnnnw@wwww&46#Ȏ;edwnnnnn@www ]#/#"$&6$3 &#"32>7!5!%##5#5353Еttu{zz{SZC` cot*tq||.EXN#?? ,<!5##673#$".4>2"&5!#2!46#!"&5463!2rM* *M~~M**M~~M*jjj&&&&`P%挐|NN||NN|*jjjj@&&&&@ "'&463!2@4@&Z4@4&@ #!"&4762&&4Z4&&4@@ "'&4762&4@4&@&4&@ "&5462@@4&&44@&&@ 3!!%!!26#!"&5463!2`m` ^BB^^B@B^  `@B^^BB^^@ "'&463!2#!"&4762@4@&&&&44@4&Z4&&4@ "'&463!2@4@&4@4&@ #!"&4762&&4Z4&&4@:#!"&5;2>76%6+".'&$'.5463!2^B@B^,9j9Gv33vG9H9+bI\ A+=66=+A [">nSMA_:B^^B1&c*/11/*{'VO3@/$$/@*?Nh^l+!+"&5462!4&#"!/!#>32]_gTRdgdQV?U I*Gg?!2IbbIJaaiwE3300 084#"$'&6?6332>4.#"#!"&54766$32z䜬m IwhQQhbF*@&('kz   _hQнQGB'(&*eoz(q!#"'&547"'#"'&54>7632&4762.547>32#".'632%k'45%&+~(  (h  &  \(  (  &  ~+54'k%5%l%%l$65+~  &  (  (\  &  h(  (~+%'!)19K4&"24&"26.676&$4&"24&"24&"2#!"'&46$ KjKKj KjKKje2.e<^P,bKjKKjKjKKj KjKKj##LlLKjKKjK jKKjK~-M7>7&54$ LhяW.{+9E=cQdFK1A  0) pJ2`[Q?l&٫C58.H(Y':d 6?32$64&$ #"'#"&'&4>7>7.546'&'&'# '32$7>54'Yj`a#",5NK ~EVZ|$2 $ |: $ 2$|ZV:(t}hfR88T h̲X(  &%(Hw(%& (XZT\MKG{x|!#"'.7#"'&7>3!2%632u  j H{(e 9 1bU#!"&546;5!32#!"&546;5!32#!"&546;5463!5#"&5463!2+!2328((88(``(88((88(``(88((88(`L4`(88(@(88(`4L`(8 (88(@(88((88(@(88((88(@(84L8(@(88((8L48OY"&546226562#"'.#"#"'.'."#"'.'.#"#"&5476$32&"5462И&4&NdN!>! 1X:Dx+  +ww+  +xD:X1 -U !*,*&4&hh&&2NN2D &  ..J< $$ 767#"&'"&547&547&547.'&54>2l4  2cKEooED ) ) Dg-;</- ?.P^P.? -/<;-gYY  .2 L4H|O--O|HeO , , Oeq1Ls26%%4.2,44,2.4%%62sL1qcqAAq4#!#"'&547632!2#"&=!"&=463!54632  @  `     ` ?`   @  @  !    54&+4&+"#"276#!"5467&5432632   `  _ v,Ԝ;G_j)``    _ ԟ7 ,>jL>54'&";;265326#!"5467&5432632    v,Ԝ;G_j) `   `7 ,>jL>X`$"&462#!"&54>72654&'547 7"2654'54622654'54&'46.' &6 &4&&4&yy %:hD:FppG9Fj 8P8 LhL 8P8 E; Dh:% >4&&4&}yyD~s[4Dd=PppP=d>hh>@jY*(88(*Y4LL4Y*(88(*YDw" A4*[s~>M4&"27 $=.54632>32#"' 65#"&4632632 65.5462&4&&4G9& <#5KK5!!5KK5#< &ܤ9Gpp&4&&4&@>buោؐ&$KjKnjjKjK$&jjb>Ppp %!5!#"&5463!!35463!2+32@\\8(@(8\@@\\@\(88(\@ 34#"&54"3#!"&5!"&5>547&5462;U gI@L4@Ԗ@4L2RX='8P8'=XR U;Ig04LjjL4*\(88(\@"4&+32!#!"&+#!"&5463!2pP@@Pjj@@\@\&0pj \\&-B+"&5.5462265462265462+"&5#"&5463!2G9L44L9G&4&&4&&4&&4&&4&L44L &=d4LL4 d=&&`&&&&`&&&&4LL4  &#3CS#!"&5463!2!&'&!"&5!463!2#!"&52#!"&=4632#!"&=463(8((88((`x c`(8@@@`((88(@(8(D 9 8(`@@@@@/?O_o-=%+"&=46;25+"&=46;2+"&=46;2%+"&=46;2+"&=46;2%+"&=46;2%+"&=46;2%+"&=46;2+"&=46;2%+"&=46;2%+"&=46;2%+"&=46;2+"&=46;2%+"&=46;2%+"&=46;2+"&=46;2%+"&=46;2+"&=46;2!!!5463!2#!"&5463!2 @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @ &&&&@  @ @  @  @  @ @  @ @  @ @  @ @  @ @  @ @  @ @  @ @  @ @  @ @  @ @  @ @  @ @  @ @  @  @  @   `&&&& /?O_o%+"&=46;25+"&=46;2+"&=46;2%+"&=46;2+"&=46;2%+"&=46;2%+"&=46;2+"&=46;2%+"&=46;2+"&=46;2!!#!"&=!!5463!24&+"#54&+";26=3;26%#!"&5463!463!2!2 @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @ 8(@(8 @  @  @  @  @ &&&@8((8@&@  @ @  @  @  @ @  @ @  @ @  @ @  @ @  @ @  @  @  @  (88(  @  ``   `` -&&& (88(&@<c$4&"2!#4&"254&+54&+"#";;26=326+"&5!"&5#"&46346?>;463!2KjKKjKjKKj&ԖԖ&&@&&KjKKjK jKKjK .&jjjj&4&@@&&#'1?I54&+54&+"#";;26=326!5!#"&5463!!35463!2+32 \\8(@(8\ \\@\(88(\: #32+53##'53535'575#5#5733#5;2+3@E&&`@@` `@@`&&E%@`@ @ @      @ 0 @!3!57#"&5'7!7!K5@   @5K@@@ #3%4&+"!4&+";265!;26#!"&5463!2&&&&&&&&w@www&&@&&&&@&&@www#354&#!4&+"!"3!;265!26#!"&5463!2&&&&&@&&@&w@www@&@&&&&&&@&:@www-M3)$"'&4762 "'&4762 s 2  .   2 w 2  .   2 w 2    2  ww  2    2  ww M3)"/&47 &4?62"/&47 &4?62S .  2 w 2   .  2 w 2  M . 2    2 .  . 2    2 .M3S)$"' "/&4762"' "/&47623 2  ww  2    2  ww  2    2 w 2   .v 2 w 2   .M3s)"'&4?62 62"'&4?62 623 .  . 2    2 .  . 2    2 .   2 w 2v .   2 w 2-Ms3 "'&4762s w 2  .   2 ww  2    2 MS3"/&47 &4?62S .  2 w 2  M . 2    2 .M 3S"' "/&47623 2  ww  2   m 2 w 2   .M-3s"'&4?62 623 .  . 2    2- .   2 w 2/4&#!"3!26#!#!"&54>5!"&5463!2  @ ^B && B^^B@B^ @  MB^%Q= &&& $$ (r^aa(^aa!C#!"&54>;2+";2#!"&54>;2+";2pPPpQh@&&@j8(PppPPpQh@&&@j8(Pp@PppPhQ&&j (8pPPppPhQ&&j (8p!C+"&=46;26=4&+"&5463!2+"&=46;26=4&+"&5463!2Qh@&&@j8(PppPPpQh@&&@j8(PppPPp@hQ&&j (8pPPppP@hQ&&j (8pPPpp@@ #+3;G$#"&5462"&462"&462#"&462"&462"&462"&462#"&54632K54LKj=KjKKjKjKKjL45KKjK<^^^KjKKjppp\]]\jKL45KjKKjKujKKjK4LKjKK^^^jKKjKpppr]]\  $$ ^aaQ^aa,#"&5465654.+"'&47623   #>bqb&44&ɢ5"  #D7euU6 &4&m 1X".4>2".4>24&#""'&#";2>#".'&547&5472632>3=T==T==T==T=v)GG+v@bRRb@=&\Nj!>3lkik3hPTDDTPTDDTPTDDTPTDD|x xXK--K|Mp<# )>dA{RXtfOT# RNftWQ,%4&#!"&=4&#!"3!26#!"&5463!2!28(@(88((88((8\@\\@\\(88(@(88(@(88@\\\\ u'E4#!"3!2676%!54&#!"&=4&#!">#!"&5463!2!2325([5@(\&8((88((8,9.+C\\@\ \6Z]#+#,k(88(@(88(;5E>:5E\\\ \1. $4@"&'&676267>"&462"&462.  > $$ n%%/02 KjKKjKKjKKjKfff^aayy/PccP/jKKjKKjKKjKffff@^aa$4@&'."'.7>2"&462"&462.  > $$ n20/%7KjKKjKKjKKjKfff^aa3/PccP/y jKKjKKjKKjKffff@^aa +7#!"&463!2"&462"&462.  > $$ &&&&KjKKjKKjKKjKfff^aa4&&4&jKKjKKjKKjKffff@^aa#+3C54&+54&+"#";;26=3264&"24&"2$#"'##"3!2@@KjKKjKKjKKjKܒ,gjKKjKKjKKjKXԀ,, #/;GS_kw+"=4;27+"=4;2'+"=4;2#!"=43!2%+"=4;2'+"=4;2+"=4;2'+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;54;2!#!"&5463!2`````````````````````p`K55KK55Kp`````````````````````````5KK55KK@*V#"'.#"63232+"&5.5462#"/.#"#"'&547>32327676R?d^7ac77,9xm#@#KjK# ڗXF@Fp:f_ #WIpp&3z h[ 17q%q#::#5KKu't#!X: %#+=&>7p @ *2Fr56565'5&'. #"32325#"'+"&5.5462#"/.#"#"'&547>32327676@ͳ8 2.,#,fk*1x-!#@#KjK# ڗXF@Fp:f_ #WIpp&3z e`vo8t-  :5 [*#::#5KKu't#!X: %#+=&>7p  3$ "/&47 &4?62#!"&=463!2I.  2 w 2   -@). 2    2 . -@@-S$9%"'&4762  /.7> "/&47 &4?62i2  .   2 w E > u > .  2 w 2   2    2  ww !   h. 2    2 . ;#"'&476#"'&7'.'#"'&476' )'s "+5+@ա' )'F*4*Er4M:}}8 GO *4*~ (-/' #"'%#"&7&67%632B;>< V??V --C4 <B=cB5 !% %!b 7I))9I7 #"'.5!".67632y( #  ##@,( )8! !++"&=!"&5#"&=46;546;2!76232-SSS  SS``  K$4&"24&"24&"27"&5467.546267>5.5462 8P88P88P88P8P88P4,CS,4pp4,,4pp4,6d7AL*',4ppP88P8P88P8HP88P8`4Y&+(>EY4PppP4Y4Y4PppP4Y%*54&#"#"/.7!2<'G,')7N;2]=A+#H  0PRH6^;<T%-S#:/*@Z}   >h.%#!"&=46;#"&=463!232#!"&=463!2&&&@@&&&@&&&&&&&&&&&&f&&&&b#!"&=463!2#!"&'&63!2&&&&''%@% &&&&&&&&k%J%#/&'#!53#5!36?!#!'&54>54&#"'6763235 Ź}4NZN4;)3.i%Sin1KXL7觧*  #& *@jC?.>!&1' \%Awc8^;:+54&#"'6763235 Ź}4NZN4;)3.i%PlnEcdJ觧*  #& *-@jC?.>!&1' \%AwcBiC:D'P%! #!"&'&6763!2P &:&? &:&?5"K,)""K,)h#".#""#"&54>54&#"#"'./"'"5327654.54632326732>32YO)I-D%n  "h.=T#)#lQTv%.%P_ % %_P%.%vUPl#)#T=@/#,-91P+R[Ql#)#|'' 59%D-I)OY[R+P19-,##,-91P+R[YO)I-D%95%_P%.%v'3!2#!"&463!5&=462 =462 &546 &&&&&4&r&4&@&4&&4&G݀&&&&f s CK&=462 #"'32=462!2#!"&463!5&'"/&4762%4632e*&4&i76`al&4&&&&&}n  R   R zfOego&&5`3&&&4&&4& D R   R zv"!676"'.5463!2@@w^Cct~5  5~tcC&&@?JV|RIIR|V&&#G!!%4&+";26%4&+";26%#!"&546;546;2!546;232@@@@L44LL4^B@B^^B@B^4L  N4LL44L`B^^B``B^^B`LL4&"2%#"'%.5!#!"&54675#"#"'.7>7&5462!467%632&4&&4  @ o&&}c ;pG=(  8Ai8^^.   &4&&4&` ` fs&& jo/;J!# 2 KAE*,B^^B! ` $ -4&"2#"/&7#"/&767%676$!28P88PQr @ U @ {`PTP88P8P`  @U @rQ!6'&+!!!!2Ѥ 8̙e;<*@8 !GGGQII %764' 64/&"2 $$ f3f4:4^aaf4334f:4:^aa %64'&" 2 $$ :4f3f4F^aa4f44f^aa 764'&"27 2 $$ f:4:f4334^aaf4:4f3^aa %64/&" &"2 $$ -f44f4^aa4f3f4:w^aa@7!!/#35%!'!%j/d jg2|855dc b @! !%!!7!FG)DH:&H dS)U4&"2#"/ $'#"'&5463!2#"&=46;5.546232+>7'&763!2&4&&4f ]wq4qw] `dC&&:FԖF:&&Cd`4&&4& ]] `d[}&&"uFjjFu"&&y}[d#2#!"&546;4 +"&54&" (88(@(88( r&@&Ԗ8((88(@(8@&&jj'3"&462&    .  > $$ Ԗ>aX,fff^aaԖԖa>TX,,~ffff@^aa/+"&=46;2+"&=46;2+"&=46;28((88((88((88((88((88((8 (88((88((88((88((88((88/+"&=46;2+"&=46;2+"&=46;28((88((88((88((88((88((8 (88((88(88((88(88((885E$4&"2%&'&;26%&.$'&;276#!"&5463!2KjKKj   f  \ w@wwwjKKjK"G   ܚ  f   @www   $64'&327/a^ ! ^aaJ@%% 65/ 64'&"2 "/64&"'&476227<ij6j6u%k%~8p8}%%%k%}8p8~%<@% %% !232"'&76;!"/&76  ($>( J &% $%64/&"'&"2#!"&5463!2ff4-4ff4fw@wwwf4f-f4@www/#5#5'&76 764/&"%#!"&5463!248` # \P\w@www4`8  #@  `\P\`@www)4&#!"273276#!"&5463!2& *f4 'w@www`&')4f*@www%5 64'&"3276'7>332#!"&5463!2`'(wƒa8! ,j.( &w@www`4`*'?_`ze<  bw4/*@www-.  6 $$  (r^aaO(_^aa -"'&763!24&#!"3!26#!"&5463!2yB(( @   w@www]#@##   @ @www -#!"'&7624&#!"3!26#!"&5463!2y((@B@u @   w@www###@  @ @www -'&54764&#!"3!26#!"&5463!2@@####@w@wwwB((@@www`%#"'#"&=46;&7#"&=46;632/.#"!2#!!2#!32>?6#  !"'?_  BCbCaf\ + ~2   }0$  q 90r p r%D p u?#!"&=46;#"&=46;54632'.#"!2#!!546;2D a__ g *`-Uh1    ߫}   $^L  4b+"&=.'&?676032654.'.5467546;2'.#"ǟ B{PDg q%%Q{%P46'-N/B).ĝ 9kC< Q 7>W*_x*%K./58`7E%_ ,-3  cVO2")#,)9;J) "!* #VD,'#/&>AX>++"''&=46;267!"&=463!&+"&=463!2+32Ԫ$   pU9ӑ @/*f o  VRfq f=SE!#"&5!"&=463!5!"&=46;&76;2>76;232#!!2#![       % )   "  Jg Uh BW&WX hU g 84&#!!2#!!2#!+"&=#"&=46;5#"&=46;463!2j@jo g|@~vv u n#467!!3'##467!++"'#+"&'#"&=46;'#"&=46;&76;2!6;2!6;232+32QKt# #FNQo!"դѧ !mY Zga~bm] [o"U+, @h h@@X hh @83H\#5"'#"&+73273&#&+5275363534."#22>4.#2>ut 3NtRP*Ho2 Lo@!R(Ozh=,GID2F 8PuE>.'%&TeQ,jm{+>R{?jJrL6V @`7>wmR1q uWei/rr :Vr" $7V4&#"326#"'&76;46;232!5346=#'73#"'&'73267##"&54632BX;4>ID2F +>R{8PuE>.'%&TeQ,jm{?jJrL6 @`rr :Vr3>wmR1q uWei@ \%4&#"326#!"&5463!2+".'&'.5467>767>7>7632!2&%%&&&& &7.' :@$LBWM{#&$h1D!  .I/! Nr&&%%&&&&V?, L=8=9%pEL+%%r@W!<%*',<2(<&L,"r@ \#"&546324&#!"3!26%#!#"'.'.'&'.'.546767>;&%%&&&& &i7qN !/I.  !D1h$&#{MWBL$@: '.&&%%&&&&=XNr%(M&<(2<,'*%<!W@r%%+LEp%9=8=L  +=\d%54#"327354"%###5#5#"'&53327#"'#3632#"'&=4762#3274645"=424'.'&!  7>76#'#3%54'&#"32763##"'&5#327#!"&5463!2BBPJNC'%! B? )#!CC $)  54f"@@ B+,A  A+&+A  ZK35N # J!1331CCC $)w@www2"33FYF~(-%"o4*)$(* (&;;&&9LA3  8334S,;;,WT+<<+T;(\g7x:&&::&&<r%-@www  +=[c}#"'632#542%35!33!3##"'&5#327%54'&#"5#353276%5##"=354'&#"32767654"2 '.'&547>76 3#&'&'3#"'&=47632%#5#"'&53327''RZZ:kid YYY .06 62+YY-06 R[!.'CD''EH$VVX::Y X;:Y fyd/%jG&DC&&CD&O[52. [$C-D..D^^* ly1%=^I86i077S 3 $EWgO%33%OO%35 EEFWt;PP;pt;PP;pqJgTFQ%33&PP%33%R 7>%3!+}{'+"&72'&76;2+"'66;2U &  ( P *'eJ."-dZ-n -'74'&+";27&+";276'56#!"&5463!2~} 7e  ۩w@www"  $Q #'!# @www I-22#!&$/.'.'.'=&7>?>369II ! ' $ !01$$%A' $ ! g  \7@)(7Y   \7@)(7Y @ '5557 ,VWQV.RW=?l%l`~0  !#!#%777 5! R!!XCCfff݀# `,{{{`Og4&"2 &6 $"&462$"&62>7>7>&46.'.'. '.'&7>76 Ԗ HR6L66LGHyU2L  L2UyHHyU2L  L2UyHn X6X  XX ԖԖH6L66L6 L2UyHHyU2L  L2UyHHyU2L n6X  XX  2#!"&54634&"2$4&"2ww@ww||||||w@www||||||| !3 37! $$ n6^55^h ^aaM1^aaP *Cg'.676.7>.'$7>&'.'&'? 7%&'.'.'>767$/u5'&$I7ob?K\[zH,1+.@\7':Yi4&67&'&676'.'>7646&' '7>6'&'&7>7#!"&5463!2PR$++'TJXj7-FC',,&C ."!$28 h /" +p^&+3$ i0(w@www+.i6=Bn \C1XR:#"'jj 8Q.cAj57!? "0D$4" P[ & 2@wwwD"%.5#5>7>;!!76PYhpN!HrD0M C0N#>8\xx: W]oW-X45/%'#.5!5!#"37>#!"&5463!2p>,;$4 5eD+WcEw@wwwK()F ,VhV^9tjA0/@www@#"'&76;46;23   &  ++"&5#"&7632  ^  c  & @#!'&5476!2 &  ^  b '&=!"&=463!546  &    q&8#"'&#"#"5476323276326767q'T1[VA=QQ3qqHih"-bfGw^44O#A?66%CKJA}} !"䒐""A$@C3^q|z=KK?6 lk)  %!%!VVuuu^-m5w}n~7M[264&"264&"2"&546+"&=##"&5'#"&5!467'&766276#"&54632    *<;V<<O@-K<&4'>&4.'.'.'.'.'&6&'.'.6767645.'#.'6&'&7676"&'&627>76'&7>'&'&'&'&766'.7>7676>76&6763>6&'&232.'.6'4."7674.'&#>7626'.'&#"'.'.'&676.67>7>5'&7>.'&'&'&7>7>767&'&67636'.'&67>7>.'.67 \  U7  J#!W! '  " ';%  k )"    '   /7*   I ,6 *&"!   O6* O $.( *.'  .x,  $CN      * 6   7%&&_f& ",VL,G$3@@$+ "  V5 3"  ""#dA++ y0D- %&n 4P'A5j$9E#"c7Y 6" & 8Z(;=I50 ' !!e  R   "+0n?t(-z.'< >R$A"24B@( ~ 9B9, *$        < > ?0D9f?Ae  .(;1.D 4H&.Ct iY% *  7      J  <    W 0%$  ""I! *  D  ,4A'4J" .0f6D4pZ{+*D_wqi;W1G("% %T7F}AG!1#%  JG 3  '.2>Vb%&#'32&'!>?>'&' &>"6&#">&'>26 $$ *b6~#= XP2{&%gx| .W)oOLOsEzG< CK}E $MFD<5+ z^aa$MWM 1>]|YY^D եA<KmE6<" @9I5*^aa>^4./.543232654.#"#".#"32>#"'#"$&547&54632632':XM1h*+D($,/9p`DoC&JV;267676&#!"&=463!267 #!"'&5463!26%8#! &&Z"M>2! ^I 7LRx_@>MN""`=&&*%I},  L7_jj9/%4&#!"3!264&#!"3!26#!"&5463!2  &&&&&&&&19#"'#++"&5#"&5475##"&54763!2"&4628(3- &B..B& -3(8IggI`(8+Ue&.BB.&+8(kk`%-"&5#"&5#"&5#"&5463!2"&4628P8@B\B@B\B@8P8pPPp@`(88(`p.BB.0.BB.(88(Pppͺ!%>&'&#"'.$ $$ ^/(V=$<;$=V).X^aaJ`"(("`J^aa,I4."2>%'%"/'&5%&'&?'&767%476762%6[՛[[՛o ܴ   $ $ " $ $  ՛[[՛[[5` ^ ^ 2` `2 ^ ^ ` 1%#"$54732$%#"$&546$76327668ʴhf킐&^zs,!V[vn) 6<ׂf{z}))Ns3(@ +4&#!"3!2#!"&5463!2#!"&5463!2@&&&f&&&&@&&&&4&&4&@&&&&&&&& `BH+"/##"./#"'.?&5#"&46;'&462!76232!46 `&C6@Bb03eI;:&&&4L4&F Z4&w4) '' 5r&4&&4&&4}G#&/.#./.'&4?63%27>'./&'&7676>767>?>%6})(."2*&@P9A #sGq] #lh<* 46+(  < 5R5"*>%"/ +[>hy  K !/Ui%6&'&676&'&6'.7>%.$76$% $.5476$6?62'.76&&'&676%.76&'..676#"NDQt -okQ//jo_  %&JՂYJA-.-- 9\DtT+X?*<UW3' 26$>>W0 {"F!"E    ^f`$"_]\<`F`FDh>CwlsJ@ ;=?s  :i_^{8+?` ) O`s2RDE58/Kr #"'>7&4$&5mī"#̵$5$"^^W=acE*czk./"&4636$7.'>67.'>65.67>&/>z X^hc^O<q+f$H^XbVS!rȇr?5GD_RV@-FbV=3! G84&3Im<$/6X_D'=NUTL;2KPwtPt=  &ռ ,J~S/#NL,8JsF);??1zIEJpqDIPZXSF6\?5:NR=;.&1 +!"&=!!%!5463!2sQ9Qs***sQNQsBUw wUBFHCCTww%1#"&=!"&=463!54632.  6 $$     ` ?(r^aa    (_^aa%1#!#"'&47632!2.  6 $$   @  ` (r^aa  ?  @  (_^aa/#"'&476324&#!"3!26#!"&5463!2&@& @   w@www& @B@ &  @ @www"&462  >& $$ Ԗ*(r^aaԖԖ (^aa]6#"$54732>%#"'!"&'&7>32'!!!2f:лѪz~u: ((%`V6B^hD%i(]̳ޛ *>6߅r#! 3?^BEa߀#9#36'&632#"'&'&63232#!"&5463!2 Q,&U #+' ;il4L 92<D`w@www`9ܩ6ɽ ]`C477&@wwwD+"&5#"'&=4?5#"'&=4?546;2%6%66546;2  wwwwcB G]B Gty]ty #3C#!+"&5!"&=463!46;2!24&#!"3!26#!"&5463!2@`@`^BB^^B@B^www@w@`@`2@B^^BB^^ww@w'/?P+5#"&547.467&546;532!764'!"+32#323!&ln@ :MM: @nY*Yz--zY*55QDDU9pY-`]]`.X /2I$ t@@/!!/@@3,$,3$p$00&*0&& !P@RV2#"&/#"&/#"&546?#"&546?'&54632%'&54632763276%>S]8T;/M77T7%>ww@ww!"5bBBb// * 8(@(87)(8=%/' #?w@www#~$EE y &L(88e):8(%O r    O?GQaq47&67>&&'&67>&"$32#"#"'654  $&6 $6&$ CoL.*K  Px.* iSƓ i 7J ?~pi{_Я;lLUZ=刈刈_t'<Z :!   @! j`Q7  $ky, Rfk*4LlL=Z=刈&$&546$7%7&'5>]5%w&P?zrSF!| &0 ##!"&5#5!3!3!3!32!546;2!5463) );));;))&&&@@&&&  6 $&727"'%+"'&7&54767%&4762֬>4P t+8?::  ::A W` `EvEEvE<."e$IE&O &EI&{h.`m"&#"&'327>73271[ >+)@ (]:2,C?*%Zx/658:@#N C= E(oE=W'c:#!#"$&6$3 &#"32>7! ڝyy,{ۀہW^F!LC=y:yw߂0H\R%"N^ '&76232762$"&5462"&46274&"&'264&#"'&&#"32$54'>$ $&6$ G>>0yx14J55J5J44J5Fd$?4J55%6E#42F%$fLlLq>>11J44%&4Z%44J54R1F$Z-%45J521Z%F1#:ʎ 9LlL#Qa"'&7622762%"&5462"&546274&#"&'73264&#"'&&#"32654'>#!"&5463!2 55 **.>.-@-R.>.-@-<+*q6- -- 0OpoOxzRrqP6z~{{Prr^aa]054&"#"&5!2654632!#"&57265&'&#".'&'#"&5467%&4>7>3263232654.547'654'63277.'.*#">7?67>?>32#"'7'>3'>3235?KcgA+![,7*  2(-#=  /~[(D?G  |,)"# +)O8,+'6 y{=@0mI#938OAE` -  )y_/FwaH8j7=7?%a % %!?)L J 9=5]~pj  %(1$",I  $@((  +!.S -L__$'-9L 5V+ 6 T+6.8- $ 0 + t |S 16]&#"'&#"67>76'&'&#"67>32764.#"#.32>67>7 $&54>7>7>7rJ@ "kb2)W+ ,5/1   #   Z -!$IOXp7sLCF9vz NAG#/ 5|Հ';RKR/J#=$,9,+$UCS7'2"1  ! / ,   /--ST(::(ep4AM@=I>".)xΤlsY|qK@ %(YQ&N EHv~<Zx'#"&5467&6?2?'&"/.7.546326#"&'&/7264/7'764&"'?>>32.AUpIUxYE.A %%%h% %hJ%D,FZxULs TgxUJrVD %hJ%@/LefL.C %Jh%CV sNUxϠ@.FZyUHpVA %h&%% %Ji%CWpIUybJ/Uy^G,D %Jh%@U sMt UC %hJ%C-KfyEX[_gj&/&'.''67>7>7&'&'&'>76763>7>#&'&'767672'%'7'+"&'&546323267>7%#"'4'6767672,32,+DCCQLDf' % :/d B 4@ }  &!0$?Jfdf-.=6(:!TO? !IG_U% . k*.=; 5gN_X "  ##  292Q41   *6nA;| BS N.  %1$ 6 $nk^ '7GWgw2+"&5463#!"&5463!254&+";2654&+";2654&+";2654&+";2654&+";2654&+";2654&+";2654&+";2654&+";26#"&=! B^^BB^^B:FjB^8((`( `(8^BB^^B@B^"vEj^B(8(`(8(/?O_o/?2#!"&5463;26=4&+";26=4&+";26=4&+";26=4&+"54&+";2654&+";2654&+";2654&+";2654&+";2654&#!"3!2654&+";2654&+";2654&+";2654&+";2654&+";2654&+";2654&+";2654&+";2654&+";26@&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@`' "&5#"&5&4762!762$"&462B\B@B\BOpP.BB..BB.8$PO広3CQ#".54>32#".546322#"&#"#"54>%".54>32%2#"&54> &X=L|<&X=M{2r_-$$-_rUU%&&5%ő'- "'.546762@FF$@B@$.&,&.]]|q#<<#(BB B%'-%'-'%'-"'%&'"'%.5467%467%62@ll@ll,@GG&!@@@@@@!&+#+#6#+$*`:p:px p=`$>>$&@&@ @&p@ &.A!!"!&2673!"5432!%!254#!5!2654#!%!2#!8Zp?vdΊens6(N[RWu?rt1SrF|iZ@7މoy2IMC~[R yK{T:%,AGK2#!"&5463!!2654'654.#532#532"&5!654&#"327#2#>!!ww@ww~uk'JTMwa| DH> I1q Fj?w@wwwsq*4p9O*¸Z^qh LE "(nz8B M'?"&4624&#"'.'324&#"3267##"&/632632.ʏhhMALR vGhг~~K „yO^   ʏʏВ*LM@!שwwȍde)qrOPqȦs:03=7'.?67'67%'>&%'7%7./6D\$>  "N,?a0#O 1G9'/P(1#00  ($=!F "9|]"RE<6 'o9%8J$\ :\HiTe<?}V#oj? d,6%N#" HlSVY]C =@C4&"2!.#!"4&"2+"&=!"&=#"&546;>3!232^^^Y ^^^`pppp`]ibbi]~^^^e^^^PppPPppP]^^]3;EM2+"&=!"&=#"&546;>;5463!232264&"!.#!"264&" ]`pppp`]ibbi^^^dY !^^^]@PppP@@PppP@]^^] ^^^e^^^ 3$#!#!"&5467!"&47#"&47#"&4762++&2 $$ 2&&&4&&Z4&&##&&4&4&44&m4&m+DP4'&#"32763232674'&!"32763 3264'&$#"32763232> $$ g* o`#ə0#z#l(~̠) -g+^aaF s" +g (* 3#!| #/IK/%*%D= )[^aa !!!'!!77!,/,-a/G t%/;<HTbcq%7.#"32%74'&"32765"/7627#"5'7432#"/7632#"5'7432#"&5'74632 #"/6327#"/6327#"/46329"&/462"&/>21"&/567632#!.547632632  *     X    ^  `    ^  b  c   fu U`59u  4J   l~ ~ F 2    m | O,           ru| u  " )9 $7 $&= $7 $&= $7 $&=  $&=46w`ww`ww`wb`VTEvEEvETVTEvEEvET*VTEvEEvET*EvEEvEEvEEv#^ct#!"&5463!2!&'&!"&5!632#"&'#"/&'&7>766767.76;267674767&5&5&'67.'&'&#3274(8((88((`x c`(8!3;:A0?ݫY   ^U 47D$    74U3I  |L38wtL0`((88(@(8(D 9 8(Q1&(!;  (g- Up~R2(/{E(Xz*Z%(i6CmVo8 #T#!"&5463!2!&'&!"&5!3367653335!3#4.5.'##'&'35(8((88((`x c`(8iFFZcrcZ`((88(@(8(D 9 8(kk" kkJ  ! k#S#!"&5463!2!&'&!"&5!%!5#7>;#!5#35!3#&'&/35!3(8((88((`x c`(8-Kg kL#DCJg  jLD`((88(@(8(D 9 8(jj jjkk kk#8C#!"&5463!2!&'&!"&5!%!5#5327>54&'&#!3#32(8((88((`x c`(8 G]L*COJ?0R\wx48>`((88(@(8(D 9 8(jjRQxk !RY#*2#!"&5463!2!&'&!"&5!!57"&462(8((88((`x c`(8Pppp`((88(@(8(D 9 8(ppp  #*7JR5#5#5#5##!"&5463!2!&'&!"&5##5!"&54765332264&"<(8((88((`x c`(8kޑcO"jKKjK`((88(@(8(D 9 8(SmmS?M&4&&4#9L^#!"&5463!2!&'&!"&5!#"/#"&=46;76276'.'2764'.(8((88((`x c`(8 6ddWW6&44`((88(@(8(D 9 8(. G5{{5]]$5995#3C#!"&5463!2!&'&!"&5!2#!"&5463#"'5632(8((88((`x c`(84LL44LL4l  `((88(@(8(D 9 8(L44LL44L  Z #7K[#!"&5463!2!&'&!"&5!>&'&7!/.?'&6?6.7>'(8((88((`x c`(8` 3  3  3  3 v  ?  `((88(@(8(D 9 8( & & - & &  ?   '6#'. '!67&54632".'654&#"32eaAɢ/PRAids`WXyzOvд:C;A:25@Ң>-05rn`H( ' gQWZc[ -%7' %'-'% %"'&54762[3[MN 3",""3,3"ong$߆]gn$+) ")")" x#W#"&#!+.5467&546326$32327.'#"&5463232654&#"632#".#"oGn\ u_MK'̨|g? CM7MM5,QAAIQqAy{b]BL4PJ9+OABIRo?z.z n6'+s:zcIAC65D*DRRD*wyal@B39E*DRRD*'/7  $&6$ 6277&47' 7'"' 6& 6'lLRRZB|RR>dZZLlLZRR«Z&>«|R ! $&54$7 >54'5PffP牉@s-ff`-c6721>?>././76&/7>?>?>./&31#"$&(@8!IH2hM>'  )-* h'N'!'Og,R"/!YQG54'63&547#5#"=3235#47##6323#324&"26%#!"&5463!2F]kbf$JMM$&N92Z2&`9UW=N9:PO;:dhe\=R +)&')-S99kJ<)UmQ/-Ya^"![Y'(<`X;_L6#)|tWW:;X  #'#3#!"&5463!2) p*xeשw@www0,\8@www9I#"'#"&'&>767&5462#"'.7>32>4."&'&54>32JrO<3>5-&FD(=Gq@C$39aLL²L4 &) @]v q#CO!~󿵂72765'./"#"&'&5 }1R<2" 7MW'$  ;IS7@5sQ@@)R#DvTA ; 0x I)!:> +)C 6.> !-I[4&#"324&#"3264&#"324&#"326&#"#".'7$4$32'#"$&6$32D2)+BB+)3(--(31)+BB+)4'--'4'#!0>R HMŰ9ou7ǖD䣣 R23('3_,--,R23('3_,--,NJ ?uWm%#"'%#"'.5 %&'&7632! ; `u%"(!]#c)(  #"'%#"'.5%&'&76 !  (%##fP_"(!)'+ʼn4I#"$'&6?6332>4.#"#!"&54766$32#!"&=46;46;2z䜬m IwhQQhbF*@&('k@z   _hQнQGB'(&*eozΘ@@`  >. $$ ffff^aafff^aa>"&#"#"&54>7654'&#!"#"&#"#"&54>765'46.'."&54632326323!27654'.5463232632,-,,",:! %]& %@2(/.+*)6! <.$..**"+8#  #Q3,,++#-:#"$$ /:yuxv)%$ /?CG%!5%2#!"&5463!5#5!52#!"&54632#!"&5463#5!5`&&&& &&&&&&&&@&&&&&&&&&&&&%2 &547%#"&632%&546 #"'6\~~\h ~\h\ V V VV%5$4&#"'64'73264&"&#"3272#!"&5463!2}XT==TX}}~>SX}}XS>~}w@www~:xx:~}}Xx9}}9xX}@www/>LXds.327>76 $&6$32762#"/&4762"/&47626+"&46;2'"&=462#"'&4?62E0l,  *"T.D@Yooo@5D [  Z  Z  [ ``[ Z  2 ,l0 (T" .D5@oooY@D, Z  [  [  Z ``EZ  [ 5%!  $&66='&'%77'727'%amlLmf?55>fFtuutFLlLHYC L||L Y˄(E''E*( /?IYiy%+"&=46;2+"&=46;2+"&=46;2+"&=46;2%"&=!#+"&=46;2+"&=46;2+"&=46;2+"&=46;2!54!54>$ +"&=46;2#!"&=@&&@3P > P3&&rrr&&rrr he 4LKM:%%:MKL4WT&&%/9##!"&563!!#!"&5"&5!2!5463!2!5463!2&&&&&&  &&&i@&&@&7'#5&?6262%%o;j|/&jJ%p&j;&i&p/|jţ%Jk%o%  :g"&5462#"&546324&#!"263662>7'&75.''&'&&'&6463!276i~ZYYZ~@OS;+[G[3YUD#o?D&G3I=JyTkBuhNV!WOhuAiSy*'^CC^'*SwwSTvvTSwwSTvvWID\_"[ gq# /3qFr2/ $rg%4 HffHJ4d#!#7!!7!#5!VFNrmNNN N!Y+?Ne%&'&'&7>727>'#&'&'&>2'&'&676'&76$7&'&767>76 '6# <;11x# *# G,T93%/#0vNZ;:8)M:( &C.J}2 %0  ^*  JF &7'X"2LDM" +6 M2+'BQfXV#+] #' L/(eB9  #,8!!!5!!5!5!5!5#26%!!26#!"&5!5&4& &pPPp@@&&@!&@PppP@*  9Q$"&54627"."#"&547>2"'.#"#"&5476$ "'&$ #"&5476$ (}R}hLK NN Ud: xx 8    ,, |2222 MXXM ic,>>,   ̺  '/7?KSck{4&"2$4&"24&"24&"24&"24&"24&"24&"24&"264&"24&#!"3!264&"2#!"&5463!2KjKKjKjKKjKjKKjKKjKKjKjKKjKjKKjKKjKKjKjKKjKLhLLhLKjKKj&&&&KjKKjL44LL44L5jKKjKKjKKjKjKKjKjKKjKjKKjKjKKjKjKKjKjKKjK4LL44LLjKKjK&&&&jKKjK4LL44LL 'E!#"+"&7>76;7676767>'#'"#!"&7>3!2W",&7' #$ &gpf5 O.PqZZdS -V"0kqzTxD!!8p8%'i_F?;kR(` !&)' (2!&6367! &63!2! `B 1LO(+#=)heCQg#s`f4#6q'X|0 -g >IY#6?>7&#!%'.'33#&#"#"/3674'.54636%#"3733#!"&5463!24  : @7vH%hEP{0&<'VFJo1,1.F6A#L44LL44L"% 7x'6 O\JYFw~v^fH$ ! "xdjD"!6`J4LL44LL +3@GXcgqz -<JX{&#"327&76'32>54.#"35#3;5#'#3537+5;3'23764/"+353$4632#"$2#462#"6462""'"&5&5474761256321##%354&'"&#"5#35432354323=#&#"32?4/&54327&#"#"'326'#"=35#5##3327"327'#"'354&3"5#354327&327''"&46327&#"3=#&#"32?"5#354327&3=#&"32?"#3274?67654'&'4/"&#!"&5463!2_gQQh^_~\[[\]_^hQQge<F$$$ !!&&/ !/  !! 00/e&'!"e$   '!!''   8''NgL44LL44LUQghQUk=("  ! =))=2( '! 'L#(>( & DC(>(zL#DzG)<)4LL44LL  BWbjq}+532%+5324&+32763#4&'.546327&#"#"'3265#"&546325&#"32 !264&"2%#'#735#535#535#3'654&+353#!"&5463!29$<=$@?SdO__J-<AA@)7")9,<$.%0*,G3@%)1??.+&((JgfJ*A!&jjjGZYGиwsswPiL>8aA !M77MM77M3! 4erJ]&3YM(, ,%7(#)  ,(@=)M%A20C&Mee(X0&ĖjjjV 8Z8J9N/4$ 8NN88NN  #&:O[ $?b3'7'#3#%54+32%4+324+323'%#5#'#'##337"&##'!!732%#3#3##!"&53733537!572!56373353#'#'#"5#&#!'#'#463!2#"5#"5!&+&+'!!7353273532!2732%#54&+#32#46.+#2#3#3##+53254&".546;#"67+53254&.546;#"#'#'##"54;"&;7335wY-AJF=c(TS)!*RQ+*RQ+Y,B^9^Ft`njUM ') ~PSPRm٘M77Mo7q @)U 8"E(1++NM77Mx378D62W74;9<-A"EA0:A F@1:ؗBf~~""12"4(w$#11#@}}!%+%5(v$:O\zK?* $\amcrVlOO176Nn23266&+"&#"3267;24&+"'&+";27%4&+";2?>23266&+"&#"3267;254+";27#76;2#!"&5463!23%#2%%,,  _3$$2%%M>AL Vb5)LDHeE:< EM j,K'-R M ~M>AR  Vb5)LEHeE:< E J ABI*'! ($rL44LL44Lv%1 %3!x*k $2 %3!;5h n a !(lI;F   rp p8;5h t a !(lI;F ` #k 4LL44LL  2HW[lt#"'5632#6324&'.54327&#"#"&'32767#533275#"=5&#"'#36323#4'&#"'#7532764&"24'&#"327'#"'&'36#!"&5463!2=!9n23BD$ &:BCRM.0AC'0RH`Q03'`.>,&I / * / 8/n-(G@5$ S3=,.B..B02^`o?7je;9G+L44LL44LyE%# Vb;A !p &'F:Aq)%)#orgT$ v2 8)2z948/{ 8AB..B/q?@r<7(g/4LL44LL ?#!"&'24#"&54"&/&6?&5>547&54626=L4@ԕ;U g3 T 2RX='8P8|5 4Ljj U;Ig@   `  "*\(88(]k  &N4#"&54"3 .#"#!"&'7!&7&/&6?&5>547&54626;U gIm*]Z0L4@ԕ=o=CT T 2RX='8P8|5  U;IgXu?bl3@4Ljja`   `  "*\(88(]k/7[%4&+";26%4&+";26%4&+";26!'&'!+#!"&5#"&=463!7>3!2!2@@@@@@0 o`^BB^`5FN(@(NF5@@@u  @LSyuS@%44%,<H#"5432+"=4&#"326=46;2  >. $$ ~Isy9"SgR8vHD w ffff^aam2N+ )H-mF+10*F +fff^aab4&#"32>"#"'&'#"&54632?>;23>5!"3276#"$&6$3 k^?zb=ka`U4J{K_/4^W&  vx :XB0܂ff ) fzzXlz=lapzob35!2BX G@8  ' '=vN$\ff  1 SZz8zX#("/+'547'&4?6276 'D^h  i%5@%[i  h]@]h  i%@5%[i  h^@@)2#"&5476#".5327>OFi-ay~\~;'S{s:D8>)AJfh]F?X{[TC6LlG]v2'"%B];$-o%!2>7>3232>7>322>7>32".'.#"#"&'.#"#"&'.#"#546;!!!!!32#"&54>52#"&54>52#"&54>52-P&+#($P.-P$'#+&PZP&+#"+&P-($P-.P$(#+$P.-P$'#+&P-.P$+#pP@@PpH85K"&ZH85K"&ZH85K"&Z@Pp@@@pMSK5, :&LMSK5, :&LMSK5, :& !!3 ! @@@  #"$$3!!2"jaѻxlalxaaj!!3/"/'62'&63!2'y  `I  yMy `I y'W`#".'.#"32767!"&54>3232654.'&546#&'5&#" 4$%Eӕ;iNL291 ;XxR`f՝Q8TWiWgW:;*:`Qs&?RWXJ8 oNU0 J1F@#) [%6_POQiX(o`_?5"$iʗ\&>bds6aP*< -;iFn* -c1BWg4'.'4.54632#7&'.#"#"'.#"32767'#"&54632326#!"&5463!2#$( 1$6]' !E3P|ad(2S;aF9'EOSej]m] <*rYshpt.#)$78L*khw@wwwB % $/$G6 sP`X):F/fwH1pdlqnmPHuikw_:[9D'@www34."2>$4.#!!2>#!".>3!2QнQQнQQh~wwhfffнQQнQQнQZZQffff#>3!2#!".2>4."fffнQQнQQffffQнQQн ,\!"&?&#"326'3&'!&#"#"'  5467'+#"327#"&463!!'#"&463!2632(#AHs9q ci<= #]$ KjKKjKKjKKjH#j#H&&&KjKKjKg V i jKKjKKjKKjK ..n(([5KK55KK5[poNv<+#"'#"&546;&546$32322$B$22$$*$22$Xڭӯ$22$tX'hs2$ϧkc$22$1c$2F33F3VVT2#$2ԱVT2#$2g#2UU݃ 2$#2UU1݃2 ,u54#"67.632&#"32654'.#"32764.'&$#"7232&'##"&54732654&#"467&5463254632>32#"'&ru&9%" *#͟ O%GR=O&^opC8pP*bY _#$N Pb@6)?+0L15 "4$.Es  5IQ"!@ h "Y7e|J>ziPeneHbIlF>^]@n*9 6[_3#"&54632#.#"32%3#"&54632#.#"326%4&'.'&! ! 7>7>! =39? 6'_ >29? 5'17m-VU--,bW.뮠@Fyu0HC$뮠@Fyu0HC$L= ?? <=! A <`;+"&54&#!+"&5463!2#!"&546;2!26546;2pЇ0pp@Ipp>Sc+"&=46;254&+"&+";2=46;2;2=46;2;2%54&#!";2=;26#!"&5463!2A5DD5A7^6a7MB55B7?5B~```0`rr5A44A5v5AA5f*A``0` !!!! #!"&5463!2ړ7H7jv@vvv':@vvvMUahmrx#"'!"'!#"&547.547.54674&547&54632!62!632!#!627'!%!"67'#77!63!!7357/7'%# %'3/&=&' 5#?&547 6!p4q"""6" 'h*[ |*,@?wAUMpV@˝)Ϳw7({*U%K6=0(M "! O dX$k !! ! b [TDOi @6bxBAݽ5  ɝ:J +3,p x1Fi (R 463!#!"&5%'4&#!"3`а@..@A-XfB$.BB..C} )&54$32&'%&&'67"w`Rd]G{o]>p6sc(@wgmJPAjyYWa͊AZq{HZ:<dv\gx>2ATKn+;"'&#"&#"+6!263 2&#"&#">3267&#">326e~└Ȁ|隚Ν|ū|iyZʬ7Ӕްr|uѥx9[[9jj9ANN+,#ll"BS32fk[/?\%4&+";26%4&+";26%4&+";26%4&+";26%#!"&5467&546326$32]]eeeeee$~i qfN-*#Sjt2"'qCB8!'> !%)-159=AEIMQUY]agkosw{! %! 5!#5#5#5#5#57777????#5!#5!#5!#5!#5!#5!#5!#5#537#5!#5!#5!#5!#5!#55#535353535353%"&546326#"'#32>54.&54>3237.#"Q%%%%%%%%%?iiihOiixiiyiixiiArssrrssr%sssrrssNs%%%%%%%%%%'32#".543232654&#"#"&54654&#"#"&547>326ڞUzrhgrxSПdU 7#"&463!2!2&&4&&&&4&KjKKjKjKKj &&&%&& &&4&&&&4&&&5jKKjKKjKKjK%z 0&4&&3D7&4& %&'S4&"4&"'&"27"&462"&462!2#!"&54>7#"&463!2!2&4&4&4&4KjKKjKjKKj &&&%&& &&4&%&&ے&4"jKKjKKjKKjK%z 0&4&&3D7&4& %& & !'! !%!!!!%"'.763!2o]FooZY@:@!!gf//I62'"/"/"/"/"/"/"/7762762762762762762%"/77627&6?35!5!!3762762'"/"/"/"/"/"/%5#5!4ZSS6SS4SS4SS4SS4SS4SS4ZSS4SS4SS4SS4SS4SS4S-4ZSS4S@4SS4ZSS6SS4SS4SS4SS4SS4S@ZSSSSSSSSSSSSSSZSSSSSSSSSSSSSyZRRR@%:= :+: =RRZSSSSSSSSSSSSSCv!/&'&#""'&#" 32>;232>7>76#!"&54>7'3&547&547>763226323@``` VFaaFV      $. .$     yy .Q5ZE$ ,l*%>>%*>*98(QO!L\p'.'&67'#!##"327&+"&46;2!3'#"&7>;276;2+6267!"'&7&#"(6&#"#"' Dg OOG`n%ELL{@&&Nc,sU&&!Fre&&ss#/,<= #]gL oGkP'r-n&4&2-ir&&?o  4 _5OW! .54>762>7.'.7>+#!"&5#"&5463!2"&462{{BtxG,:`9(0bԿb0(9`:,GxtB&@&&@&K55K`?e==e?1O6# ,  #$  , #6OO&&&&5KK?!"'&'!2673267!'. ."!&54632>321 4q#F""8'go#- #,"tYg>oP$$Po> Zep#)R0+I@$$@I++332++"&=#"&=46;.7>76$  @ ᅪ*r@@r'/2+"&5".4>32!"&=463  &@~[՛[[u˜~gr&`u՛[[՛[~~@r=E32++"&=#"&=46;5&547&'&6;22676;2  >``@``ٱ?E,,=?rH@``@GݧH`jjrBJ463!2+"&=32++"&=#"&=46;5.7676%#"&5   &@~``@``  vXr&@``@+BF`rks463!2+"&=32++"&=#"&=46;5&547'/.?'+"&5463!2+7>6 %#"&5   &@~``@``~4e  0  io@& jV  0  Z9r&@``@Gɞ5o , sp &@k^ , c8~~`r8>KR_32++"&=!+"&=#"&=46;.767666'27&547&#"&'2#" @@ 'Ϋ'sggsww@sgg@@-ssʃl99OOr99FP^l463!2+"&=$'.7>76%#"&=463!2+"&=%#"&54'>%&547.#"254&' &@L?CuГP vY &@;"ޥ5݇ޥ5`&_ڿgwBF@&J_ s&&?%x%xJP\h463!2+"&='32++"&=#"&=46;5.7676632%#"&56'327&7&#"2#" &@L? ߺu``@``} ຒɞueeu9uee&_"|N@``@""|a~lo99r9@9;C2+"&5"/".4>327'&4?627!"&=463  &@Ռ .  N~[՛[[u˜N .  gr&`֌  . Ou՛[[՛[~N  . @r9A'.'&675#"&=46;5"/&4?62"/32+  '֪ \  . 4 .  \r|ݧ憛@\ .    . \@r~9A"/&4?!+"&=##"$7>763546;2!'&4?62  m  - @ݧ憛@& -  @rm4 -  ٮ*   - r+"&5&54>2  @[՛[rdGu՛[[r  ".4>2r[՛[[՛r5՛[[՛[[$2#!37#546375&#"#3!"&5463#22#y/Dz?s!#22#2##2S88 2#V#2L4>32#"&''&5467&5463232>54&#"#"'.Kg&RvgD $ *2% +Z hP=DXZ@7^?1 ۰3O+lh4`M@8'+c+RI2 \ZAhSQ>B>?S2Vhui/,R0+ ZRkmz+>Q2#"'.'&756763232322>4."7 #"'&546n/9bLHG2E"D8_ pdddxO"2xxê_lx2X  !+'5>-pkW[C I I@50Oddd˥Mhfxx^ә #'+/7!5!!5!4&"2!5!4&"24&"2!!! 8P88P 8P88P88P88PP88P8 P88P88P88P8 +N &6 !2#!+"&5!"&=463!46;23!#!"&54>32267632#"_>@`     `  L4Dgy 6Fe=OOU4L>   ` `  4L2y5eud_C(====`L43V &6 #"/#"/&54?'&54?6327632#!"&54>32 7632_>     %%Sy 6Fe=J%>     %65%Sy5eud_C(zz.!6%$!2!!!46;24&"2!54&#!"&&&@ԖV@&&@&&ԖԖ@&3!!! !5!'!53!! #7IeeI7CzCl@@@#2#!"&?.54$3264&"!@մppp((ppp#+/2#!"&?.54$3264&"!264&"!@մ^^^@^^^@((^^^^^^v(#"'%.54632 "'% 632U/@k0G,zD# [k# /tg F Gz  #'#3!) p*xe0,\8T #/DM%2<GQ^lw &'&676676&'&7654&'&&546763"#"'3264&7.>&'%'.767&7667&766747665"'.'&767>3>7&'&'47.'.7676767&76767.'$73>?>67673>#6766666&'&6767.'"'276&67&54&&671&'6757>7&"2654&57>&>&'5#%67>76$7&74>=.''&'&'#'#''&'&'&'65.'&6767.'#%&''&'#2%676765&'&'&7&5&'6.7>&5R4&5S9 W"-J0(/r V"-J0(.)#"6&4pOPppc|o}vQ[60XQW1V  # 5X N"& . ) D>q J:102(z/=f*4!> S5b!%  (!$p8~5..:5I  ~T 4~9p# ! ) & ?()5F 1   d%{v*: @e s|D1d {:*dAA|oYk'&<tuut&v HCXXTR;w 71™ Z*&' 1  9? . $Gv 5k65P.$.`aasa``Z9k'9؋ӗa-*Gl|Me_]`F& OܽsDD!/+``aa``a154&'"&#!!26#!"&5463!2    iLCly5)*Hcelzzlec0hb,,beIVB9@RB9J_L44LL44L44%2"4:I;p!q4bb3p (P`t`P(6EC.7BI64LL44LL  .>$4&'6#".54$ 4.#!"3!2>#!"&5463!2Zjbjj[wٝ]>oӰٯ*-oXL44LL44L')꽽)J)]wL`ֺ۪e4LL44LL;4&#!"3!26#!"&5463!2#54&#!";#"&5463!2  @ ^BB^^B@B^  B^^B@B^`@  MB^^B@B^^>  ^B@B^^5=Um ! !!2#!"&=463!.'!"&=463!>2!2#264&"".54>762".54>762?(``(?b|b?B//B/]]FrdhLhdrF]]FrdhLhdrF@@@(?@@ ?(@9GG9@/B//BaItB!!BtI Ѷ!!ь ItB!!BtI Ѷ!!ь-M32#!"&=46;7&#"&=463!2#>5!!4.'.46ՠ`@`ՠ`MsFFsMMsFFsMojjo@@jj@@<!(!!(!-3?32#!"&=46;7&#"&=463!2+!!64.'#ՠ`@`ՠ`  DqLLqDojjo@@jj@@B>=C-3;32#!"&=46;7&#"&=463!2+!!6.'#ՠ`@`ՠ`UVU96gg6ojjo@@jj@@β**ɍ-G32#!"&=46;7&#"&=463!2#>5!!&'.46ՠ`@`ՠ`MsFFsMkkojjo@@jj@@<!(!33!(!9I2#!"&=4637>7.'!2#!"&=463@b":1P4Y,++,Y4P1:"":1P4Y,++,Y4P1:"b@@@7hVX@K-AA-K@XVh77hVX@K-AA-K@XVh7Aj"#54&#"'54&#"3!26=476=4&#"#54&'&#"#54&'&'2632632#!"&5&=4632>3265K @0.B @0.B#6'&& l @0.B 2' .B A2TA9B;h" d mpPTlLc _4.HK5]0CB.S0CB./#'?&&)$$)0CB. }(AB.z3M2"61d39L/PpuT(Ifc_E`1X"#4&"'&#"3!267654&"#4&"#4&26326#!"&'&5463246326\B B\B&@5K&@"6LB\B B\B sciL}QP%&#"!"3!754?27%>54&#!26=31?>Ijjq,J[j.-tjlV\$B.R1?@B.+?2`$v5K-%5KK5.olRIS+6K5̈$B\B 94E.&ʀ15uE& ԖPjjdXUGJ7!.B P2.B %2@ 7K5(B@KjKj?+fU E,5K~!1.>F.F,Q5*H$b2#!"&=%!"&=463!7!"&'&=4634'&#!">3!!"3!32#!"3!23!26=n$32>32>32#"#.#"#.#"3!27654&#"547654&#"#654&Mye t|]WSSgSY\x{ 70"1i92DU1&=  =&0@c >&/Btd4!*"8K4+"@H@/'= t?_K93-] UlgQQgsW ]#+ i>p&30&VZ&0B/ %3B. "to ){+C4I (  /D0&p0D3[_cg"'&#"3!2676=4&"#54&#"#54&#"#4&'2632632632#!"&'&5463246#!#!#5K)B4J&@#\8P8 @0.B J65K J6k cJ/4qG^\hB2.1!~K5y?^\Vljt-.j[J,qjjI7$?1R.B+.B$`2?gvEo.5KK5%-K6+SIR[&.E49 B\B$5KG#!+"&5!"&=463!2+"&' +"' +"'&5>;2>76;2Y    M .x - N     u  , u ?  LW   #  *:J4'&+326+"'#+"&5463!2  $6& $&6$ UbUI-uu,uuڎLlLAX!Jmf\$ 6uuu,KLlL-[k{276/&'&#"&5463276?6'.#"!276/&'&#"&5463276?6'.#"  $6&  $&6]h - %Lb`J%E 5 ,5R- h - %Lb`J%E 5 ,5R-'uu,uulL/hR    dMLc  NhR   dMLc  N1uuu,LlL@  ' 7 '7 ``H ``H !``H ```H` '%  7' 7'7 ' $&6$ X`(W:,:X`(WLLlLX`(W:BX`(XLlL $ %/9ES[#"&54632$"&4624&"26$4&#"2%#"&462$#"&4632#"32&! 24>  !#"&'.'#"$547.'!6$327&'77'&77N77N'qqqqqPOrqEsttsst}||}uԙ[WQ~,> nP/R U P酛n >,m'77'&77N77N6^Orqqqqqqt棣棣(~|| on[usј^~33pc8{y%cq33dqpf L 54 "2654"'&'"/&477&'.67>326?>< x ,  (-'sI  VCV  Hr'-(  $0@!BHp9[%&!@0$u  ]\\]-$)!IHV D V HI!)$-#36>N"&462."&/.2?2?64/67>&  #!"&5463!2]]]3 $; &|v;$ (CS31 =rM= 4TC(G zw@www]]]($-;,540= sL =45,; @www(2#"$&546327654&#" &#"AZ\@/#%E1/##.1E$![A懇@@\!#21E!6!E13"|! gL&5&'.#4&5!67&'&'5676&'6452>3.'5A5RV[t,G'Q4}-&r! G;>!g12sV&2:#;d=*'5E2/..FD֕71$1>2F!&12,@K r#"&5462>%.#"'&#"#"'>54#".'7654&&5473254&/>7326/632327?&$  $6 $&6$ !&"2&^ u_x^h ;J݃HJǭ qE Dm! M G?̯' %o8 9U(F(ߎLlL&!&!SEm|[n{[<ɪ "p C Di% (K HCέ  pC B m8 @Kނ  HF(LlL "*6%&6$ 7&$5%%6'$2"&4}x3nQH:dΏX e8z' li=! 7So?vM '&7>>7'7>''>76.'6'El:Fg r *t6K3U Z83P)3^I%=9 )<}Jk+C-Wd &U-TE+]Qr-< Q#0 C+M8 3':$ _Q =+If5[ˮ&&SGZoMkܬc#7&#"327#"'&$&546$;#"'654'632ե›fKYYKf¥yͩ䆎L1hvvƚwwkn]*]nlxDLw~?T8bb9SA}+5?F!3267!#"'#"4767%!2$324&#"6327.'!.#"۔c28Ψ-\?@hU0KeFjTlyE3aVsz.b؏W80]TSts<hO_u7bBtSbF/o|V]SHކJ34&#!"3!26#!!2#!"&=463!5!"&5463!2  @ ^B `` B^^B@B^   @ @B^@@^BB^^>3!"&546)2+6'.'.67>76%&F8$.39_0DD40DD0+*M7{L *="# U<-M93#D@U8vk_Y [hD00DD00Dce-JF1 BDN&)@ /1 dy%F#"'&'&'&'&763276?6#"/#"/&54?'&763276"&'&'&5#&763567632#"'&7632654'&#"32>54'&#"'.5463!2#!3>7632#"'&'&#"'&767632yqoq>* 432fba  $B? >B BB AA.-QPPR+ 42 %<ciђ:6& hHGhkG@n`IȌ5 !m(|.mzyPQ-.  je  q>@@?ppgVZE|fb6887a %RB? =B ABBAJvniQP\\PRh!cDS`gΒ 23geFGPHXcCI_ƍ5" n*T.\PQip [*81 / 9@:>t%6#".'.>%6%&7>'.#*.'&676./&'.54>754'&#"%4>327676= >vwd" l "3 /!,+ j2.|%& (N &wh>8X}xc2"W<4<,Z~fdaA`FBIT;hmA<7QC1>[u])  u1V(k1S) - 0 B2* %M ;W(0S[T]I) A 5%R7&&T,Xq&&1X,LΒw%%;#!"&5463!546;2!2!+"&52#!"/&4?63!5! (&&@&&(&&@&&( (  &&@&&@&&&&  #''%#"'&54676%6%% hh @` !   !    #52#"&5476!2#"&5476!2#"'&546        @  @  @    84&"2$4&"2$4&"2#"'&'&7>7.54$ KjKKjKjKKjKjKKjdne4" %!KjKKjKKjKKjKKjKKjK.٫8  !%00C'Z'.W"&462"&462"&462 6?32$6&#"'#"&'5&6&>7>7&54>$ KjKKjKjKKjKjKKjhяW.{+9E=cQdFK1A  0) LlLjKKjKKjKKjKKjKKjKpJ2`[Q?l&٫C58.H(Yee    Y'w(O'R@$#"&#"'>7676327676#" b,XHUmM.U_t,7A3ge z9@xSaQBLb( VU  !!!==w)AU!!77'7'#'#274.#"#32!5'.>537#"76=4>5'.465! KkkK _5 5 #BH1`L I& v6S F!Sr99rS!`` /7K%s}H XV P V  e  Vd/9Q[ $547.546326%>>32"&5%632264&#"64'&""&'&"2>&2654&#";2 P 3>tSU<)tqH+>XX|Wh,:UStW|XX>=X*  ))  +^X^|WX=>X:_.2//a:Ru?  Q%-W|XW>J( =u>XX|WX`  *((*  +2 2X>=XW|E03>$32!>7 '&'&7!6./EUnohiI\0<{ >ORDƚ~˕VƻoR C37J6I`Tb<^M~M8O  5!#!"&!5!!52!5463 ^B@B^`B^^B `B^^"^BB^0;%'#".54>327&$#"32$ !"$&6$3 ##320JUnLnʡ~~&q@tKL}'` - -oxnǑUyl}~~FڎLlLt`(88(   7!' !\W\ d;tZ`_O; }54+";2%54+";2!4&"!4;234;2354;2354>3&546263232632#"&#"26354;2354;2354;2````pp```  !,! -&M<FI(2 ```@PppPpppppp# #   ppppp j#"'&=!;5463!2#!"&=#".'.#!#"&463232>7>;>32#"&'#"!546 %. `@` :,.',-XjjXh-,'.,: kb>PppP>bk .%Z & :k%$> $``6&L')59I"TlԖlT"I95)'L&69GppG9$ >$%k: !+32&#!332 $&6$ ~O88OLlL>pN  iLlL '':Ma4&'#"'.7654.#""'&#"3!267#!"&54676$32#"'.76'&>$#"'.7654'&676mD5)  z{6lP,@KijjOoɎȕ>>[ta) GG 4?a) ll >;_-/ 9GH{zyN@,KԕoN繁y! ?hh>$ D" >â? $ n"&5462'#".54>22654.'&'.54>32#"#*.5./"~~s!m{b6# -SjR,l'(s-6^]Itg))[zxȁZ&+6,4$.X%%Dc* &D~WL}]I0"  YYZvJ@N*CVTR3/A3$#/;'"/fR-,&2-" 7Zr^Na94Rji3.I+ &6W6>N%&60;96@7F6I3+4&#!"3!26%4&#!"3!26 $$ ^aa`@@^aa '7  $ >. %"&546;2#!"&546;2#/a^(^aa(N@@4&#!"3!26 $$ @@^aa`@^aa '  $ >. 7"&5463!2#/a^(n@^aa(N@ %=%#!"'&7!>3!26=!26=!2%"&54&""&546 ##]VTV$KjKKjK$&4&Ԗ&4&>9G!5KK55KK5!&&jj&&#/;Im2+#!"&'#"&463>'.3%4&"26%4&"26%6.326#>;463!232#.+#!"&5#"5KK5sH..Hs5KK5e# )4# %&4&&4&&4&&4&` #4) #%~]eZ&&Ze] E-&&-EKjKj.<<.KjK)#)`"@&&`&&&&`&&)#`)"dXo&&oXG,8&&8!O##!!2#!+"'&7#+"'&7!"'&?63!!"'&?63!6;236;2!2@@8@7 8Q NQ N 8G@ 8GQ NQ N7   8 8  H H  k%  ".>2I20]@]@oo@@oo㔕a22]]p^|11|99|11|(%7'7' ' 7T dltl)qnluul)1$4&"24&"2 &6 +"&5476;2 &6 LhLLhLLhLLhL>  &   &`>hLLhLLhLLhL>&&>G  .7)1!62 1!62he220e22> v +4 [d+ d 135#5&'72!5!#"&'"'#"$547&54$ Eh`X(cYz:L:zYc\$_K`Pa}fiXXiޝfa  (+.>#5#5!5!5!54&+'#"3!267!7!#!"&5463!2U``'    jjV>(>VV>>Vq  ( ^(>VV>>VV=&'&'&'&76'&'&.' #.h8"$Y ''>eX5, ,PtsK25MRLqS;:.K'5R ChhRt(+e^TTu B"$:2~<2HpwTT V/7GWg. %&32?673327>/.'676$4&"2 $&6$   $6& $&6$ d -- m  ,6*6,  mKjKKjoooKzz8zzȎLlLU4>>4-. YG0 )xx) 0GYޞ .jKKjKqoooolzzz80LlLD/7H#"'.7'654&#"'67'.6?>%"&46227#".547|D,=),9#7[͑fx!X: D$ +s)hhijZt<F/*8C,q؜e\r,WBX/C2hhh=tXm>NZ+"&=46;2+"&=4>7>54&#"#"/.7632  >. $$ p=+& 35,W48'3  l zffff^aaP2P: D#;$# $*;? R Cfff^aa'Y >O`"&5462&'.'.76.5632.'#&'.'&6?65\\[( | r [A@[[@A#2#  7* <Y$  +}"(  q87] F  _1 )    #1Ke34&+326+"&=!#!"&763!2#!"&5463!2#>?4.'3#>?4.'3#>?4.'3Xe`64[l7  , L; =+3&98&+)>>+3&98&+)>=+3&88&+)> Wj|r >Q$~d $kaw+-wi[[\;/xgY $kaw+-wi[[\;/xgY $kaw+-wi[[\;/xgYJ\m4.'.'&#"#"'.'&47>7632327>7>54&'&#"327>"&47654'&462"'&476'&462"'&47>&'&462i$ $^"  %%  "^$ $W "@9O?1&&18?t@" W&%%&4KK6pp&46ZaaZ&4mttm ^x -  - x^ = /U7C kkz'[$ =&5%54'4&KK4r7>54 "&54>2"&462%"&54&#""&546 %#"&'&'.7>#"'&'.7>&4&&4&4&&4SZ&4&&44$#&&&j3$"('$&4&[՛[&4&&4F&4&]\&4&$  !D4%  ,\44&&4&4&&4&-Z4&&4&;cX/)#&>B)&4&j9aU0'.4a7&&u՛[[4&&4&@&&]]&&Ώ0 u40 )4#g&'.#"32676%4/&#"326'&#"2632#2+&'%#"'&6?676676632%#"'&6767#"&'&6767#"'.7>327"#"&'&6763"'.7>;7632;>%5K$ "0%>s$ "0%>;;>%5KVL#>H30 \($$(\( єyO2F/{(?0(TK.5sg$ єy#-F/{$70(TK.5sg$L#>H30 \($$(\#(@5"'K58!'"58!'"55"'K#dS$K K$Sdx#@1 w d>N;ET0((? - 2K|1 wd#N;ET0$(? - 2K$#dS$K K$SdxDN\2654& 265462"2654 #"32654>7>54."/&47&'?62 &4&&4&h՛[&4&r$'("$3j&&&#$4[ " @ GB[ "&&Β&&][u&&7a4.'0Ua9j&4&)B>&#)/Xc;u՛ "  " Gi[ Xh#"&54676324&'&#"'>54#"32#"54>54'.#"32>7>767632326#!"&5463!2b )   :4FDN  [1,^JK-*E#9gWRY vm0O w@wwwC22 c@X&!9{MA_"S4b// DR"XljPY < @www%e4.#"32>7676#'.#"#"&54>3232>754&*#"&54>763 >32 ''il$E/  @P@ ^`'W6&!.. ! -P5+ E{n46vLeVz:,SN/ M5M[  ]$[^5iC'2H&!(?]v`* l b$9> =R2 #"&5467%!"&7>3-.7>;%.7>322326/.76/.'&6766/&/&#"&676 &676&6766/&672? =1( H/ '96&@)9<')29% &06##$ J 0 7j)5@"*3%"!M %#K"%Ne 8)'8_(9./=*%8!Q #P"\Q#N&a)<9bR]mp%"'.'&54>76%&54763263 #"/7#"'#"&/%$%322654&#"%'OV9  nt  |\d ϓ[nt  |@D:) ;98'+| j," 41CH^nVz(~R 9\'  r  @L@  @w46HI(+C ,55, f[op@\j;(zV~i/5O#"'&54>32&#" 654'67'"'>54''&'"'6767&546767>7蒓`V BMR B9)̟!SH-77IXmSMH*k#".o;^J qןד>@YM $bKd ү[E";Kx%^6;%T,U:im=Mk).DT4'"&5463267&#" 6;64'.'4'>732676%#!"&5463!2),蛜s5-54&#"#"'654'.#"#"&#"3263232>3232>76 $$ Cf'/'% ( $UL ( #'/'@ 3#@,G)+H+@#3 ^aaX@ _O#NW#O_ .* ##(^aaq[632632#"&#"#".'&#"#".'&54767>7654.54632327&547>P9 B6?K? %O4T% >6>Z64Y=6>%S4N$ ?L?4B @{:y/$ ,'R! F! 8% #)(()#%: !F Q'+%0z:zO_4'.'&54>54&#"#"'654'.#"#"&#"3263232>3232>76#!"&5463!2Cf'.'% ( $VM  ) #'.'@ 3 #A,G)+H+A# 4 w@wwwXA  ?4N$NW&M&L  /* ## + @www O$>?>762'&#"./454327327>7> EpB5 3FAP/h\/NGSL  RP* m95F84f&3Ga4B|wB.\FI*/.?&,5~K % & Y."7n< "-I.M`{ARwJ!FX^dj''''"'7&'7&'7&'7&547'67'67'67'63277774$#"32$   *'ֱ,?g=OO&L&NJBg;1''ֱ.=gCIM $'&&NJBg=.%w؝\\w Ioo<<-NIDg=/%(ײ+AhEHO*"#*OICh=/'(ֲ/=h>ON.]xwڝ]7e[@)6!!"3#"&546%3567654'3!67!4&'7Sgny]K-#75LSl>9V%cPe}&Hn_HȌ=UoLQ1!45647UC" !-9[nx"&46254&"326754&"326754&"26754&"26#".547632632626326'4#"#"54732764&"264.#"327632>#"'"'#"'#"&5#"'67&'327&'&54>3267>7>7>32632632T"8""8)<())(<))))<))<))<))<) Tد{ՐRhx=8 78 n 81 pH_6Soc F@b@?d?uKbM70[f5Y$35KUC<:[;+8 n 87 8/8Zlv]64qE 'YK0-AlB; W#;WS9 &(#-7Z://:/Tr++r,,r++r,,r++r,,r++r,,ʠgxXVעe9222222^KVvF02OO23OO`lF;mhj84DroB@r+@222222C0DP`.r8h9~T4.&o@9 1P%14'!3#"&46327&#"326%35#5##33 $$  }Pcc]321IUΠ?LL?cc4MX &04;0XpD[[DpD,)&&Q 9V\26&".'&'&6?.#"#26327677>'32>&3#'&+"?626&"#!'.'!"&5463!>;26;2!2P P  92#.}SP9::%L \B )spN/9oJ5  !+D`]BgY9+,9% Pk 4P P &NnF!_7*}B<{o0&&B;*<@$ucRRc#@16#37c&@@@ J"@*4^`ED B o/8927 *@OLC!T!323X$BJ@@@&AS 0C 59" 'D/&&D4 88 $5A&%O#!"&547>7>2$7>/.".'&'&2>^B@B^ >FFzn_0P:P2\nzFF> R & p^1P:P1^ & R P2NMJMQ0Rr.B^^B 7:5]yPH!%%"FPy]5:7 = 4 QH!%%!Ht 4 =<"-/ ?1Pp+".'.'.?>;2>7$76&'&%.+"3!26#!"&54767>;2' +~'*OJ%%JN,&x' % ^M,EE,M7 ZE[P*FF*P:5  ^B@B^){$.MK%%KM.$+X)o3 "a 22!] 4  I>"">,&S8JB##B12 ` `B^^B8&ra#11#$R&  "&.2v%/%''%/%7%7'%7'/#&5'&&?&'&?&'&7%27674?6J" 0<=_gNU?DfuYGb7=^H^` =v~yT3GDPO 4Fѭqi_w\ހ!1uS%V_-d 1=U{J8n~r'U4.#".'"3!264&"26+#!"&5463!232+32+32 0P373/./373P0 T=@=T֙֙|`^B@B^^BB^`````*9deG-! !-Ged9IaallkOB^^BB^^B +Yi"&54622#!"&54>;2>+32+32+#!"&5463!2324&#!"3!26֙֙0.I/ OBBO -Q52-)&)-2 ``  ``  `^B@B^^BB^`  @   |kkl"=IYL)CggC0[jM4      B^^BB^^B @  @ !1AQu4.#".'"3!24&"254&#!"3!2654&#!"3!2654&#!"3!26#!54&+"!54&+"!"&5463!2)P90,***,09P)J66S"@8@^B@@B^^BB^Ukc9 9ckU?@@88 @@N@B^````^BB^^!1AQu#!"&4>32>72"&462#!"&=463!25#!"&=463!25#!"&=463!24&#!"3!546;2!546;2!26#!"&5463!2J66J)P90,***,09P)"@8@ @  `@@` ^B@B^^BB^ՀUUkc9 9c`@@88@@2  @ ````@B^^BB^^(%.'"&' $&  #"$&6$ wCιCwjJ~J>LlLśJSSJ͛>6LlL$,  $&6654&$ 3 72&&  lLmzzBl>KlLGzzG>'7#!"&54>7&54>2  62654' '3/U]B,ȍ,B]U/OQнQ>+X}}X0bӃۚӅb0}hQQh>ff#=#!"&4>3272"&462!3!26#!"&5463!;26=!2J66J)Q8PP8Q)  ^B@B^^B``B^VVVld9KK9d` @B^^BB^``^+;K[eu4.#"'"3!264&"254&#!"3!2654&#!"3!26%54&+";2654&#!"3!26!54&#!"!#!"&5463!2"D/@@/D"?,,?pppp@@@@^B@B^^BB^D6]W2@@2W]67MMppp@@@@@@@@n`@B^^BB^^+;K[eu#!"&54>3272"&462#!"&=463!2%#!"&=463!2+"&=46;25#!"&=463!2!3!26#!"&5463!2?,V,?"D/@@/D"pppp@@@  ^B@B^^BB^D7MM76]W2@@2W]֠ppp@@@@@@@@` @B^^BB^^A#"327.#"'63263#".'#"$&546$32326J9"65I).!1iCCu +I\Gw\B!al݇yǙV/]:=B>9+32%#!"&5463!2#"&54>54'&#"#"54654'.#"#"'.54>54'&'&543232654&432#"&54>764&'&'.54632  ?c'p& ?b1w{2V ?#&#9&CY' &.&#+B : &65&*2w1GF1)2<)<'  ( BH=ӊ:NT :O )4:i   F~b` e!}U3i?fRUX|'&'&Ic&Q  *2U.L6* / L:90%>..>%b>+ +z7ymlw45)0 33J@0!! TFL P]=GS -kwm  !*(%6&692? $&6$  '   al@lLlL,& EC h$LlL /37;%"&546734&'4&" 67 54746 #5#5#5ppF::FDFNV^fnv~"/&4?.7&#"!4>3267622"&4"&46262"&42"&4462"$2"&42"&4"&46262"&4"&46262"&42"&4$2"&42"&42"&4  R ,H8JfjQhjG^R,  !4&&4&Z4&&4&4&&4&4&&4&&4&&44&&4&4&&4&Z4&&4&4&&4&4&&4&4&&4&4&&4&&4&&4&Z4&&4&Z4&&4&  R  ,[cGjhQRJ'A, &4&&4Z&4&&4Z&4&&4Z&4&&444&&4&&4&&4Z&4&&4Z&4&&4Z&4&&4&4&&4Z&4&&4Z&4&&4&&4&&4Z&4&&4Z&4&&4%-5=EM}+"&=#!"'+"&=&="&4626"&462&"&462"&462&"&462&"&462#!"&=46;4632676/&?.7&#"!2"&462&"&462&"&462"&462&"&462&"&462"&462&"&462"&462@?AA? @ @R...R@`jlL.h) * * $ %35K.....uvnu....@@jN  * * .t2#K5..R..R. @Hq '&'&54 &7676767654$'.766$76"&462&'&'&7>54.'.7>76ȵ|_ğyv/ۃ⃺k] :Buq CA _kނXVobZZbnW|V 0  Q2- l}O  / :1z q%zG 4( 6Roa ą\< )4 J}%!!#!"&5463!2^B@B^^BB^`@B^^BB^^%#!"&=463!2^B@B^^BB^B^^BB^^ &))!32#!#!"&5463!463!2`B^^B^B@B^^B`^BB^^B@B^B^^BB^`B^^#3%764/764/&"'&"2?2#!"&5463!2    s^B@B^^BB^ג     @B^^BB^^#'7"/"/&4?'&4?62762!!%#!"&5463!2     ^B@B^^BB^    `@B^^BB^^ ! $&6$ .2r`LlLf4LlL#.C&>"'&4762"/&4?62'"'&4762%'.>6.'.>6'>/>76&'&.'&7&'">?4'.677>7.>37654'&'67>776 $&6$  ( 4Z# # & # # & y"6&.JM@& "(XE* $+8 jT?3#'.'&!3!2>?3.'#!57>7'./5!27#'.#!"g%%D-!gg<6WWZe#1=/2*]Y3-,C1 /Dx] VFIq-HD2NK '>*%R= f 07=. f D]\|yu,0>Seu#2#"'&5<>323#3#&'#334'."#"+236'&54.#"5#37326#!"&5463!2 <  zzj k-L+ )[$8=".un/2 ^B@B^^BB^5cy    (ݔI(8?C (3> #"($=@B^^BB^^0K S&'.'&'./674&$#">&>?>'76'# "&#./.'7676767>76$w .~kuBR] T%z+",|ޟj<)(!( ~ˣzF8"{%%#5)}''xJF0"H[$%EJ#% .Gk29(B13"?@ S)5" #9dmW";L65RA0@T.$}i`:f3A%% BM<$q:)BD aa%`]A &c| Ms!  Z 2}i[ F&** < ʣsc"J<&NsF% 0@Wm6&'.6$.7>7 $76".4>2., &>6'"'&7>=GV:e #:$?+% q4g &3hT`ZtQмQQмpAP1LK!:< }҈`dlb,9'  %%($! a3)W)x  оQQоQQcQǡ-җe)Us2XD\ϼYd /?O_o#"=#"=4;543#"=#"=4;543#"=#"=4;543#"=#"=4;543#"=#"=4;543%#!"&5463!2++532325++532325++532325++532325++53232p00pp00pp00pp00pp008((88(@(80pp00pp00pp00pp00pp0     @(88((88     /Q/&'%&/"&=.6?&?&'&6?'.>-#".6?'.>'&6'.>54627>%>76#"'% %6 27 2G f!)p&4&p)!f G2 72  *6 " 47 2G f!)p&4&p)!f G2 72 " 6* !k 3 j&3 %,*&&ր*9% 3&j 3 k!./!>>$,*!k 3.j&3 %Ԝ9*&&ր*ǜ,% 3&j 3 k!*,$>>!/.&6.'&$ &76$76$PutۥiPuGxy Զ[xy -_v١eNuv١e =uʦ[t78X &6# #'7-'%'&$  $6 $&6$ 31NE0gR=|||">"LlL^v!1f2iЂwgfZQQ^>"||||wLlL &ZXblw.'&>'&'&".'.'&&'&'&7>767>67>7626&'&>&'&>'.7>.676'&'&'&'.67.>7>6&'&676&'&676.676&'&>&'&676'.>6/4-LJg-   $  6)j2%+QF)b3FSP 21DK2AW ") ")$? ? 8A& AE5lZm= gG2Sw*&>$5jD GHyX/4F r 1  1""!l=6> 6 ,5./'e    .*|Ed! u & &%& &5d ))66 @ C& 8B @qL?P^7 G-hI[q:"T6 ,6 &/`  L wQ'   A ^   "  $& _  y  * <Copyright Dave Gandy 2016. All rights reserved.Copyright Dave Gandy 2016. All rights reserved.FontAwesomeFontAwesomeRegularRegularFONTLAB:OTFEXPORTFONTLAB:OTFEXPORTFontAwesomeFontAwesomeVersion 4.7.0 2016Version 4.7.0 2016FontAwesomeFontAwesomePlease refer to the Copyright section for the font trademark attribution notices.Please refer to the Copyright section for the font trademark attribution notices.Fort AwesomeFort AwesomeDave GandyDave Gandyhttp://fontawesome.iohttp://fontawesome.iohttp://fontawesome.io/license/http://fontawesome.io/license/      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ab cdefghijklmnopqrstuvwxyz{|}~"      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~glassmusicsearchenvelopeheartstar star_emptyuserfilmth_largethth_listokremovezoom_inzoom_outoffsignalcogtrashhomefile_alttimeroad download_altdownloaduploadinbox play_circlerepeatrefreshlist_altlockflag headphones volume_off volume_down volume_upqrcodebarcodetagtagsbookbookmarkprintcamerafontbolditalic text_height text_width align_left align_center align_right align_justifylist indent_left indent_rightfacetime_videopicturepencil map_markeradjusttinteditsharecheckmove step_backward fast_backwardbackwardplaypausestopforward fast_forward step_forwardeject chevron_left chevron_right plus_sign minus_sign remove_signok_sign question_sign info_sign screenshot remove_circle ok_circle ban_circle arrow_left arrow_rightarrow_up arrow_down share_alt resize_full resize_smallexclamation_signgiftleaffireeye_open eye_close warning_signplanecalendarrandomcommentmagnet chevron_up chevron_downretweet shopping_cart folder_close folder_openresize_verticalresize_horizontal bar_chart twitter_sign facebook_sign camera_retrokeycogscomments thumbs_up_altthumbs_down_alt star_half heart_emptysignout linkedin_signpushpin external_linksignintrophy github_sign upload_altlemonphone check_emptybookmark_empty phone_signtwitterfacebookgithubunlock credit_cardrsshddbullhornbell certificate hand_right hand_lefthand_up hand_downcircle_arrow_leftcircle_arrow_rightcircle_arrow_upcircle_arrow_downglobewrenchtasksfilter briefcase fullscreengrouplinkcloudbeakercutcopy paper_clipsave sign_blankreorderulol strikethrough underlinetablemagictruck pinterestpinterest_signgoogle_plus_sign google_plusmoney caret_downcaret_up caret_left caret_rightcolumnssort sort_downsort_up envelope_altlinkedinundolegal dashboard comment_alt comments_altboltsitemapumbrellapaste light_bulbexchangecloud_download cloud_uploaduser_md stethoscopesuitcasebell_altcoffeefood file_text_altbuildinghospital ambulancemedkit fighter_jetbeerh_signf0fedouble_angle_leftdouble_angle_rightdouble_angle_updouble_angle_down angle_left angle_rightangle_up angle_downdesktoplaptoptablet mobile_phone circle_blank quote_left quote_rightspinnercirclereply github_altfolder_close_altfolder_open_alt expand_alt collapse_altsmilefrownmehgamepadkeyboardflag_altflag_checkeredterminalcode reply_allstar_half_emptylocation_arrowcrop code_forkunlink_279 exclamation superscript subscript_283 puzzle_piece microphonemicrophone_offshieldcalendar_emptyfire_extinguisherrocketmaxcdnchevron_sign_leftchevron_sign_rightchevron_sign_upchevron_sign_downhtml5css3anchor unlock_altbullseyeellipsis_horizontalellipsis_vertical_303 play_signticketminus_sign_alt check_minuslevel_up level_down check_sign edit_sign_312 share_signcompasscollapse collapse_top_317eurgbpusdinrjpyrubkrwbtcfile file_textsort_by_alphabet_329sort_by_attributessort_by_attributes_alt sort_by_ordersort_by_order_alt_334_335 youtube_signyoutubexing xing_sign youtube_playdropbox stackexchange instagramflickradnf171bitbucket_signtumblr tumblr_signlong_arrow_down long_arrow_uplong_arrow_leftlong_arrow_rightwindowsandroidlinuxdribbleskype foursquaretrellofemalemalegittipsun_366archivebugvkweiborenren_372stack_exchange_374arrow_circle_alt_left_376dot_circle_alt_378 vimeo_square_380 plus_square_o_382_383_384_385_386_387_388_389uniF1A0f1a1_392_393f1a4_395_396_397_398_399_400f1ab_402_403_404uniF1B1_406_407_408_409_410_411_412_413_414_415_416_417_418_419uniF1C0uniF1C1_422_423_424_425_426_427_428_429_430_431_432_433_434uniF1D0uniF1D1uniF1D2_438_439uniF1D5uniF1D6uniF1D7_443_444_445_446_447_448_449uniF1E0_451_452_453_454_455_456_457_458_459_460_461_462_463_464uniF1F0_466_467f1f3_469_470_471_472_473_474_475_476f1fc_478_479_480_481_482_483_484_485_486_487_488_489_490_491_492_493_494f210_496f212_498_499_500_501_502_503_504_505_506_507_508_509venus_511_512_513_514_515_516_517_518_519_520_521_522_523_524_525_526_527_528_529_530_531_532_533_534_535_536_537_538_539_540_541_542_543_544_545_546_547_548_549_550_551_552_553_554_555_556_557_558_559_560_561_562_563_564_565_566_567_568_569f260f261_572f263_574_575_576_577_578_579_580_581_582_583_584_585_586_587_588_589_590_591_592_593_594_595_596_597_598f27euniF280uniF281_602_603_604uniF285uniF286_607_608_609_610_611_612_613_614_615_616_617_618_619_620_621_622_623_624_625_626_627_628_629uniF2A0uniF2A1uniF2A2uniF2A3uniF2A4uniF2A5uniF2A6uniF2A7uniF2A8uniF2A9uniF2AAuniF2ABuniF2ACuniF2ADuniF2AEuniF2B0uniF2B1uniF2B2uniF2B3uniF2B4uniF2B5uniF2B6uniF2B7uniF2B8uniF2B9uniF2BAuniF2BBuniF2BCuniF2BDuniF2BEuniF2C0uniF2C1uniF2C2uniF2C3uniF2C4uniF2C5uniF2C6uniF2C7uniF2C8uniF2C9uniF2CAuniF2CBuniF2CCuniF2CDuniF2CEuniF2D0uniF2D1uniF2D2uniF2D3uniF2D4uniF2D5uniF2D6uniF2D7uniF2D8uniF2D9uniF2DAuniF2DBuniF2DCuniF2DDuniF2DEuniF2E0uniF2E1uniF2E2uniF2E3uniF2E4uniF2E5uniF2E6uniF2E7_698uniF2E9uniF2EAuniF2EBuniF2ECuniF2EDuniF2EE=O<01hprewikka-5.1.1/prewikka/htdocs/fonts/fontawesome-webfont.woff0000664000175000017500000027735013555143652026074 0ustar tandrejatandreja00000000000000wOFF~ FFTM0kGGDEFL OS/2l>`2z@cmapi :gaspglyf _yLMheadb36-hheab$ hmtxb Eylocae \maxpl ,namemD㗋posto`u=O<01hxc`d``b `b`d`d:$Y< xc`fdbʢb l |6F0#Fnx͒Jqgje>"D>{EO >,"u^[[[jos_M%:0g80B.Lszðפ 1YlKWvest)Mk^Zֵ֪m׉Θbk̳26>'YҖjukZۺgm2 (4-iEkЖv}XB Y``c9ZJV5eY߆6G ΂`3| 6[uIpn-[pL0Lp;׸%8o>F8 G8`Wί"E^_=(K,FK+ybx TՕ0o}{uuuwUWիnnjmz-nvEEAAJ!*(hD2c%FʦEbb6$&7߹UUW7 tw{98m8bI ڃ݌7 SEG!3j㔐=w;P^IA;RRnkLS.)o8G([)9O,,AtS h yujZupPGxN on{ho2AD-r]u5e^dMX8=r5ͻ^Q\~2V0 o0kC qA跍 G< 9v`|NXWI:"'aW޺O=}k#"7e %Vs~-y$ŵXw&'q.n.EK#JDڝn봽7=|wL:Ӎ2vmrRv:=0P@DۓVZ7eOd7HMSY|[of'BL}ƷҗV^+{W=uҤ֦='j,| ;vAo=0q8"I³8yZ6Ǵo9q< i3k1%& uk {H}@΁W—^qԷ4;gg7Ny/ qPOЌL4q,ԇ"Sv=jL /UjC-woȍnj̮{j\ vEk z>pn=^=ajID(෠quF;э5֮s7 ;QC7U[׈yZIۘػ*!$ dⵄŖ-ˇ?{mf6po~mԽwoG6Moza--m#]?]?Vkzܥܵ.>)9NH%&T/ _IAxOB]8(.v)G=HPSUP>fFE-GGs|'?~zI*R|[` -V'ݙGP3b'\RI̞#n;W ٟDTѹb80^s6,rȥ ism15kk,}qWȝ;tseYqqC/0q|> 3W/ըsF"sIoAHI 8C„ w~@ _(]h=r9p! ;H-[Ifw;%=d꯵bmH)k=o\hEi 7i:-!mn:`[G]GE,;syH62ƈs՗:I@^\wOVõ<g?]Y{?qKgH[X&tdn[,Z!H6#=nݳ;OWUG4]]6ٰp7[aM5PB]?4P呂7o\!׺ߜؤ 2>8/p2h@k~ھB~a[r=Pr8SescF ӗ S#P|0z'zS)8aFBFE VrJ(EfDpU\'h4P jd3}CvfM}Zlf,.pj1tYj2lƗ,U<:zt[%Y!1vMfrc:_n"7zwvm zuidtO.3Ku =.#Cjn(,THu_Z 6qhhP4#JH%jt3M)#zzdt1Dn~9/ȋB@NV?p'r f: ;bBQHb$h3CG|#v2ydm)esvw~٬fp~DG r 0^XzˣՇcl& \`\8HHa IC?6:5H;lވ4C&\FjԬ,|MCݔ/f8ܮ2 .ҍl _/AkTVΝg ~T΂<`2Q&;XAW@@gj{j, suuE ֟:A 8,&ռ }|b0lFQ$px=4ddm7nru"N:O u^x@񝂍CG*%F>Tm?2.opˮ1r\T١K+L؜cn:8qyN\Dvj[ܦDy/*=H [0l8=`Dd&76tOd٧,崅v2+׷ TU[NHN8W|fG{ܘlT_Z1 8j `Ar㼌` h *b #ռBj0s$n^7w $Gɡ;N .A>3;My?zpͥΙ4aqp҃GFw|]֯!ؾbvq8e+)h.,U~4]h.P4s)+kqD2uϸuE3 V⭯ҟfS8/D]5ޖ*xWGj}l&klnçiPv'6#(%)>qEo6U+6ŋ8ۢlޏ> `Mn''zB-t/ꬱ3ik3 55Z 1ao|+ őm 0$YəOa1ag9up9Gת+b=H߀Q1hT]ҒQ^?s9ػ lB|4TNYBL, g#5A㉐=!7~=/X]WuwZW避[ꞞWd==Bm®ҏ΋v?$ E# L!7ط!TRRI4)H#l*:#H.)pӇ źRMB=ƅ(ǂ͵˥>A,_2%5pyn6/Mbt,L֮l+9QGb]*D; {PZ!*U1|s{"3\gGχyG:-nQg7`ԏ3xAx%ÏUXMZ&HX9>osGa '!lü|EW-ebbxsY06E>)VH ߰}V=G~Ykh/;ۇ0{4.c\h`5 FA5Tg[4#So3yuy=<'j{ hNk6 @1c/5 -T:`YX]g~ilp!e>1x06?eoAsb̪fyb3@B߂Yq?;m)h4skP UfW62c>8F(t*GC ym srp? ICY:ϻ&͜99TY-k%)@|FFh9*(RtKǻTXM-IP.%C"?,+ˆ= >tUgQWw#Υ7 ݋[P ޮ'j7 7̗9ZI SO4YkDE͂B~`Ig;mu֢zSg)rE܉=mK9ZD]4~7߉R6Hۂ(ji!BldpӜ^zz拾gF:qꢝkWl/СuX2rTsBנͫڂt}}ƶ_5 k4 A;oHLϹ)z.quAzyxjk5F-@lҙcڗҗ\6= O]9/5ڔ볝\tOCT3f(i ]w PiQwγ=JߌvGޮy[[,Et&QocÂyb66kMK|֋$Yz%P(^87DrK`%5.: Ďx=mnًm]Ю&2G(-@Q7xu3%@p~нt S]=)AG AVg; *=$mz -|_EZˢk<5U5fFIj`=H})0~F,"N6k"}ṒkT"$mZPc',ϛtzՅ];+j +NG>K#h-zp6\;yb~9.m \=qrqü=fS 6u(؍3#0  :Nz{SM]"`R .Cr`-U{낍znq tx ic+Ԛ:3Y㳙N*aVP `1Qb@fc^X9̼ܶjtҜY ӂhھ3 ijs+\8Tvi|Q< v߹c81-t\16GInJ:̇hX Gr+4Hjv4l!,cC54{ٱ4dR~p*;9nC%d}dA 4Q8iOi TgdulUSAq$.j6U;MǶۏێۏj9JDvAFbmLOI=`jf:>IǁJ! 6Txưqn̓S9ĀM|!ґ8X)hͅͳ(,ӌ2+lD3Qɕp$`Pt[ DV2opo%xZ)n:p4N)F ՆtT7Mu`8P*r >(O^tXi(M4! t(>hcU<@ܦç$M'(J׳Q܃<8Vjj7P?Ͼ;_!Q.h|:B)Ӓxܘs_d9aN=.WO.\|_O&tk.".Dp53͓ 6`8IuKjk/wiUSusUlr ̥;ѠMe`TB&n¦\ g2pd[0Ovz I'm%41}@€:įZ/r @1m8_.WRlv(F5Aս~]*@Qؿ VgM܊:MʞQZ㖵. HfJwKIA\f7zl}5VzG Ɛ u̻vߋaɰZ(S6W z7ek[j #6[6iSڣn@d`[}i]<{bN&kG[Q`Ek$|'GOR4: yX1dhz3TʷL-3DG%Z b锥3I陌R^cy,3P!@ieNq좀FS'}@4шÏ~*T(PY+=!?}>Ю+w*3Usƽ i[9a\uWeY5 +,iK\ʚe<zKC&Hdbktݩ7!;BTR@J vKU8bUH^Q;Okb%[QHO 9谉0r0}U>ʔV5^ܵ}ecFmۈrqLEl "I5ڦfU2cW+O, MJ񝁧6y?*0&Nݚxq?)>e( @qTVx>sjAi2W@WU{LГK^ A'96&E[ h8J*X>wyW+Vc*YP!3 ^ %"`ɒRcD@2ܵG5gL6}*Xl틵\"*p9B4MzA65L.2k,0^>G@@Hty Z4iepWtAh,8<{9ȽǷƶwZOYE< Z)t#/崐\F7ʔB>(&6ldit/=n>?&s]@Ν0Z.3Ĥ9MG6XIJHXa:C}3 6~>D3UO>[vZ_}סqN!ʃ -W S Ha)Y'lg8=`z(bwvi:2E!`;x,Y ߩ =Іj^ǻQ^_Yy`Q[&aYQ us0{&m胑*j)TC$ YQ>*P}H˥_7!n?Vا(sOGRBXbG/*󨴉bE("lrʔ$ΫdJwGp6 P/#j mtCR0}Bj̣RXvI>(j=:ECtV:O[h[5"uE3W. f[eܫ8P)e 0Rԁd.ُ:~}t<)/Q cOBGGp<"-G-b΢y3b#5RPCk{d˚ ح6d]LdLu鋶 LCzӮIYs;A@*nyڢKˏɩEWeMâx[*u -zҗrizH> 2$ =_j7{!h7Ύ|pfs%9LAQ,2WH(EEug&/ $̃cm$0^(K_ C]Di+/TRhOJ?Nޛ j; 쁳#ISm0Q4WՏ5_fd "0ԏ ~D}R'k GK1(_/TFȤ8>Q8m.mstÁ-`wZaxx";ͯ2o2:h*4X-hW3snP,ɞ "ޗ`7Nw8ɐD\ (,f鄝 IM|؟նkÿl5nv xL/LM}ݻ/Еum.umd>Nh&kԵ-h# +qs}v.L8c|P=/2,T,\fxP!:*}uLvyj{C [ ^܋lV͛CZk9~_+2_ʗ7%\~NVw|:$^fH-œl6[DniD>=}4b=U{xCu:6ݨ18=Z%ܓ&?i*V߻"z,K=,5keb PÒ}aM)dŐ".Aǝ2AnK% %7; QΤx9: J's9:(w̿sltWN~+lAڏm[w77n\W<9-N߹ti?";iw[;LvP2zrgkcl;#E*b8*<~h!:Q@qӼek/#@wꪫ' r*2_2mppm"Oގ:wFgRۜ{zh?U_3m3ؾ)[_./d jG̨.+{7g|6w6؟>d5;{O"-<+jaW22pWagy6&BhI2%1S*[ϤF۷%nwT QĶ!=00!dP$Oj!%l6bd[6,6`^Hfɖ3V ߶[8|\MQ lƜYxj?KO3ٲ%))JrGƼQ̼)2c"^–;@Y5u!'hVGTi M9#(ן<4s{@efQ`Gy 8L"KB3+fOx_c`= C@d-TOj+Jw]f1򉠦J -L[,Əvu&}z)AԫyzX߶"MWwP-蒺Mrk 44LZvɎiZcKU/Nja,a !"Y<]K-{S &,- l5V(DSJZU+6UԤ)jȀMXju5xkOxkCf>v;oĂu)O[H%rJrZNCQn?|x_B*kgYn3:B4WͤuQ.RMF2>8G3J<ZŠrVŗY~P9w;< +iչ+5DDhp,;ʹjfƼ=䵫9 3Ƒ,@('h:Ƌ&mTkPq8󨴱!ä.#Q{== 4V#mx _)IfC#yFN uQRPQyQ u:]g*OU֧c'PfՅԭںo>x,uP^"yXdci+Y_'z6~(+q$U;{S<^xGn}ouvXt%&3`.:gA'%O0j@Ew:мjdqge4c&ūY3]*tI* r6% &AR^3$p,a2GÇ}O>W476Ոn7[YNqOecu/=cm:&4Co<}iAO6ăNYm:̲f3J"MK:Ek:e-O7 6;kh}x?1/\g^y}7|4q'7o^ o.Uξ&d5v 3_P MpĹVjlU  a^vqǹ܈\?虽쪰:Oob2AL29zXvQ VUq^k%@$Ǡ#o}TscFW}$yF$y^2:l4/maԽ&oL3ѤNIq!#ĺ~N>0=ٞbDAw Oh CTѡ ֩FI.M#Œ3ze{EvceR] ecsERn`{ahZ]'3W0vIxV[mQ8f64Sc%WrF.aR6aLv0n=,L ZBU\]aJXL7e銛 ljQƀcHj\}MGޛ [X@"WdNS<+#(;<"w~omyL'DpEbY?~{{,o,RD(JbC>ܶ_dՇwffsܦk3ގ&~L =$&Cyd"le؄ tQRʉ@*΋7JՄpC#5-Vgo !Gi 4&NpOo޴խ9k'y=JS4/;٬vY3MiB< (Yuv<9_m@|zU _<';^;#b})Kywno%6,i7-+v(k6ic"Ym=t#WRTmR[nafʭklW޼(IdrUU5=^Dfj}-:$rp( %\x+>wW؄ Ou gq/,W:˺/Ɏ+ y+&Lo) @[@exbiu;:Ykw[50x:rsS&_Xxf[bT:7ak}Yx<5r'(>q-proɴ2HU&I-Kmhɠ\YFY`|fM0]63Bw5%#'iH(8[*k.Etc&aNmVJQKTMbX4?#4c왓Q,<v5?J [Js'ڛiӒӇC>䶵hMz__m27b2HC' j ,JN؋ LuqMZW7'./^L^DL%S n4:OW^of߷Rпlq{\PȖ叙y4*xBav kx@͗qY’.3HQF|:rƔ9`P_SRL 6b|jAn~<DN"u0Q\ Wuާfn6oH玤N N'S;)̓vGvejOXJUPsps<׷4}am}SjTYCheubm20~t'r3:_H7M笜YrN:1!-z\MaP}l&pq6*_UYIG~O_KU8FT{t( av"CBf_F;QnqӳB$MU*rg,^GD,IH:7FD Jlk6c']u;& FbFiB"&͙MykUP\M]J~qZ JP$5K?1/,# K:I)DoY:Mg!'S$M }ÊN~$Ū3wm6]r׊sO^ ll 6H{RvBoLg(iZhVd˂]w!r<3H/7CyYN9Y@LceY֖Y $rz2dk`8v1gI1"0k~,c$ tyh2 ^/sv骩m{ TUM~{WÏɿmkUٹ?΅s4a:ZDg;@Vם4`gلw]x/goLvw'vڟڔyK<+Ǟ~NF=ΐ7.'hٖ}t)vSK4Yԉs]kWN-ЯK`~kR-^"9BF%`%5S'$^\o;NKM#_5yr֖ jKgMdn7Y n NlݮmGYN̂09E&WKbK|ĸJﱵWr{ݷkQcZ\2R؛Oۡ_h]Ըy&܈V;~M/׭n߮>_[./m2A qJ{ >L M8Af]'vHTUOμŃ̚u\eAb~u:ynwݥIٸ$j[QV*b 聇nEC*ZɭEo?҃&k=t#=KTrfWQjJN^yٔQW/Oo^rrj;NM4I`0wϚ _ߜ !Iouz#3tzi kjmfL'k ^9uDћVnǼ^߲rn_CSC "6Gi1#W0=p']@8z}Q/ F"̒ &=lFwdF3v1FuDFYV'F`.bNu䡁 Vl|I׀ɷ*~)Z*!+uQvCM/vԂ.qcYs, wDiN6 YrLU߲[crcq5)V!c031;B0ތeG͝UaVNUe (;;|d;_TA"?/}Mi ;]wt7WY㰛nNgh7EB7_RE=SxV5P sm`ržYazRat k_F= dVٿgCj߇%T}[n.Z$Uq:ۛ*<ggnGh (U?.b=Ђ z3ek 4 v^QVJRT+N1Ey D;YC+dNA݇n$9MAyhpJ=^蹭%[ҫ{\r8L^Rڠg8ޥ~ad8U=gP'1.#l =ΑѬzR6np~[EfnG+y|:fE˻~E׶Mʟ]f}jE3qMOϚ{d?]uU?#/;s~򹃫ؚǀK-6B'闘̵Lgcg&=G' }S唩VCIsyRCM)rd7&UC͝w4Nsca7fl]tTwݵFè4ou֍2B>#o7(J~jE(EM-P3/rQQ@Wヌ(QUm)!sG7ꜜZ4 …U lڟpd:Cce's2E;u*'$]" c4} vzyDzɨn4bTF.b4R#P*~6tjtŋdۥy1 W!ןD}glْW_A4R/u|]P Ǯ~:t[94{-.ǀyA0 x6-NMvM$c50ghQ61BnW_us;BEg}\"\aQ=#ͧվv1ŊSY(R.i[9 JdQӜ< 0@BNya)j0Vh2쬄sOeP5>I~1!-A8agjNq^76e/쾇ݳRuԢZ&UEJlpYo<2"_:979f阎.! hI4 RkCjGBu +btQPu/ А1TZ5V:+zp8jy\ST!zru8Y۸$ՅFuFY Tj +[kj`GŦ+yl֦Y닍4R,+h")=U>yV˕!V]Z8G_ jW pH ֬Q6P8=wQ9]W809{z$5p+҃D%ꔒ-R`5CbJihEI@xQ@-Jhnא!7#םY ѣX2MnƔi&#ix2nB~#}2n)Ͱ.woB( Yk"5nG PTF;NQ@(奣$%l7Q?lRPfB!wҤJƝaîGٍJ vKgWOӬL_$ta[!i&M>JLBfR% ۣ6!o "$,J{l2"Qo#BQ'!"# H:. o <9*a$ <1ʔ/- ᪠(J&$ f^o ћ}6,+7 g2.;H\Ұf,-JǒEw\Bwjǎ>fM..klDj.Xv}mW\:5֔jKضV3BS$l&ijDYdIO~q!rW)\3 H.iT2R ˔D'i>-(*Qoc$`g#Aꆘ0ߨn7.>x;w,yc?Ơ36I61q ($,Njwܴtr(yh2l{s\p@ 5H?]JHʽgIhhh{ ef zUs|+DWxst -}"<;p> #?X;$}upȖow/&ν'dޒM-3g֛떤$yIEuR ;5ItБfb{g-:6ާ>k0ڹQs.A,1xBU\tBBA= )~3.{ҍPa~OBP:sQS=:Ufs1KɗM @PsygQ')_@\l`|N16fpp3,Y,wZ1~טOnoy'ǗlfCW?Ot=Kz (UQCdPn.<=y]Sd2KZu{d^&P^ qhEAakFQ7><~̈^=QbyAsX Gr9Aժ` ΕMʆ돱, ,)4KݑYZ?0Jd\;|h~ki?ev宰Kv2)i9Jcj~Uivo V޴ʍX~eCkˆƆKڰZn߹ZXkon퀭:h7ΤG+Ș}I]Sfn"u!`*ئ(E3 M N4jnRXMGs/MtbRS{i+-v aJu3Z/WS9ZK]>Ɵյ68N^~i>v$$&x;ό/nTu _pdR7#ƌ]Kqk^:J1)Ǥ5$2 ;ʗ$X[Z(ޜhJ7*%2E叙#zg{hLK,M#ǤOkdւ nnVZĦپ[ȷkV%ʂ:@S>Զ}S~.vm[kl&żVLsHuvM[2/z9ն.S<#y\6 nGfmȬ@xʃEӻeiwXDv [#:bL_hkm[-NٌEZ~emM%Y뛮%Zbth%:9}6xn.^%,uXF>.1^xoUQO7}\1B,53V̒ׄ'Ōzw67Oi6o_rUqp,1qOi#*n;6F(Ny'+ܣcTq333~xh4[ A=,Oc⋢rx{+=.zfGA=SMϒk߉kѥ1|ug\==j=$rR3, xٰU`B!"LQ Jc@({˯F/43ibM6A >A 0Z( zcdI Q&Z+8LTW& aQ<a"*FS)1^T}uМ5`-q'6nh־ ڻO׬%3<h%rܿe :b VY zlN]6p/oyiOc5xrM{>_ؾv5>9Xruʓ3r0rdet|¶Ld_*5hct,g}Wi\<csp=iv6l۽N8E߹ٿ}aq̈́s+Wߚ DٶD^؉>[DPjq\j3th d[)7rhUW]jiK97 X|/>g],pK4YW_ځ/&-.S0+0:AH4bc7o|~۶FyWub^yV{1 o8S8#(緥~w޹jҢ6ĉ"h0PT u) $`]+E:Eq؎W7jD-7(3uŲ{Ql`Y$OCoɊ= ;h>E3g^tPeNB*ʘ!x % ֙Y}IK %epH ZR ́H+!)ʵ * 1B1ˬB`> &)ç & ),~)|H}ؚ"odA[aO:)禓GwLr(yļCgQ#[UN84~c!yzݰҔZ3;zss.FMؾ1 FSI`A 4QByE軼a"OiPSbnByḰXKG`SVЍC/|WM߫ʪkjv! :|uQ(UϜe׷]N#h<;vU{}fjH%X&? Vu~V~j6A'MYvM!GP۹re紳 Dk/s)kq8vI8#x G,c?;_?!syٯ3ηw>w`||tuP~IhhnE/&jy+ٸuTS6ooOoh-Np8ޗU2$u]v$0$ c ߂ST6hBڭw.ci[ҙ-: g*Khq{FA lW?}'MR~<3.([v 'Tgx4JA]ԧ?21:yAc4Qd8`b4Dlu*l.]&' NY ?_EJOG#yn ^TA/UB {dȎU}xX1r_i}~8b*=^]W*s->KdfgQU(s,ZeM\]2)1 $l!?OnG'o~P]h꙾V'E6Fo/q+Zj z*S`OƁ| MUa{o03g}(骪5J8+5OOWU$# +Z J,2Yin>ŖXp 'E!4l񺻜i S(߁TR_ʠ̈́$^ŊMOwޯ,cӊф惞\I`T)&IX3W Sv$Fݸ{e1fHțaw(Q \9u\Ox7NЍ%hۑ\WTT۪˻UmʂjrS-kU-nE*+g]4u,}뮻mfmsMX9UuuUNGQ>+UUG7O(YA!9ې#I%y\gf6)+{?DC<Ukmb~c|T`ᾮ& >E7"B1;/ ʤA$vBfYtجG_))P@ p7:z3hfa2 :v(^&m胍ɛ7Mi(&+;vv&1S {\ر%W[7mnYm}5qoqQˊc^nBq]dZCG6\i9I/`b}ޥ75!parHٰ) |\n@s؇Ӂfs޿jZV+m#~xd Iq|Y;$`kG^i[يFTX *QlN+xDՑ -ML[J ϧ},i.F,2"BGщ0~IeOÖ[咛o}Ta>ľ/oz>E}ʋ `vz%5QlҥH++l6gSÔ|Bh8ڱt}C_Ꮐ֣*=d[™M{WJfw.a44D o*VVA8sP-Ҟ}A" @"Ȥt0+||E4N Łݓ1 9)*YѶQoP@ J2::b?2Hϴ3Y_nx[b¼Y1-Mҧi.#?\!Бck3Fʷ׌8'חed($lٷYS hC:Sli,ɯ䝂Fi$柌tn_=PpT ;(3V{ID{iEZLI sҢc"3[*8#^NG#c`4cCf4q&E:r@B$=DMRI'04 'yP^?RxS^3Ԡj"!psmhg8G41$G>LxNy8.'RԇG@"LC8S1I.uߣBG?> sj6خ0FƆ{17qDXSJRʳR%FL!sM(~l^0av$.XV]Υt:Jt1"GЏeC7aR.#*fE|[rX\pM[\c3`Z*؇qfPW3f!u61SJrmoXQN[1c_.ʁ 6a<K#QGRs7gc7P߀sޝtos02zr {V{n͕{6>]yTЊX(|'׵h%" ׫{i`./Md!]Ђ[x C9w<XcpKCabP#lmПur8/^W`Mfs (=TA{r \X݃f?8:4gdYc O*EuDmO[, fs 6W X6 b%֢Bۇߕ"l?YkZ&|l !\I8 |`&11P/ IK)){@'ZYhv&g @6` wE&yIIJ9DI=Ab̚|/HuD@& 찇NQz^~y @^,, Q `qq__X(.l{^//T8 c#*bi&OaS l"y$&̲Ds7Pu =j\.Qܑ?҆|rz4ʻ}ǃ ufůsfBQBEv^M94$?8<"<.L3jL(L5FVw߽wpf.p©Mnc^8(Uν>n.Key@{SF׆{`| 737KݒpȕHdQ"p(@dY T cTYK KJ+VOwdC$ZѧtHοn w? &iG, 蛙|шD>yA-@K#Lҗ|sĩi@3@gM/<X6t\_ey̺q*+j/2+&Z=9s{] FlƎp7@Ŭ7G/Ð"^9M4%?}e %Ci*fFii&8{L?pG[mXګ`dl'k&cb5ncd`A0g -X RY< zŽU-̞w' v8 jBXV>גk5`Y TTj,OƧ. fء6;*;ZdNywM" 0ԈKՒ4D=#eLpEH6_-8(uwʫ%S$#0zޓd%NQoc[:@~ƹOqS>P 䬕}Ǐ{"f+wm3;a8Zx 9a>n  f|}XϓѸ?Gc"[yggYQ@z䛒K="aU5v:t op I+' /NAO٠#HzK/ ]^z 1Q80)]h" +_TaU8icm<ǥe}d@ųAc`h9NQS&ݫMXKX~ JЃ͠X)=PԯuM7:u&eVb{u+9denWjdSX 6>A8ozt+$5Fv_iN&,>V2 7>#_f 0ZҬ`>&$+H кeH!oڇևhN+?]¿0Ck~\,?0evgφ cuH`s$%C_V@DbQRUͫYA$|E{Z|uaޡU_CSnn "k ǥESʇ8A 2}桫j >M_dd2/?(Jt5XOwNn r>-|<+> z?=y W~><W䯀\0gj[yc~޷CՀCC<9OE2VnK+gj2*j~y\'oޱL+0+1{iuW7*voܨUjFc=|LƦ~߮e˴P9i̫ˉ~d 9yr }uf**?8?'a"U[/͑zyU@ʙpy=K.۳H+9ې3۽RNgQ l]}g+Dd3E d٠C|="猖D$1K/%cio&5OpFrrre+9Sn*YLID##@ fq 패a#'b}=I\̮' Zh|,=:=(T")F`EEVj,Q|FQ_/a| 2rKbIxX^bI&$Jt2(i]NEWؗ,ޥxVcmpF&+a) z؇d=>>1F_9=!~S`;{L|cpn|U^;-.߄m";aX(Ȑ1|YYz_-^U{3u!C+Hn9d>)Ȯ˵UIͧ@E$*}*~ V9_XAW6Я5DT@BlEM+Քd0X v mRfFu%Tc^*-q)tS9岠G)AojYJ}A8I}JJer(Z`Y~IrXimf)~U(0$(@z)p_\zvOw^9;]WU 5c(? z?ܶg'hNrG]ua!z"!`4yp A72E{\ G9 T2 ftBIQ WsxnRP> #G\(:4QSR 7~F9r@ :bQ&eP3RNZD%&J ~2{@1HrX/SV18cYϷw5m4y /T4"9 |O"u(M(֍nb.e1"r% ӆڠgt }*ݶ7DHBlg]rt9m72Z.T 6kuuN^=ŒBaF_lcY@2n6J Ea (z6id0[\IoھfЅ<jW}qG9aM\WWr!(^k=sF-멜 jH NQkpè],/?nMb=Zdy׻pQ/{B5T)~ +0cы[pkM[J%~uD.7Jwuw:l{ٻp=[amEeĉuB=\,UX簙ŀb\CӴq 倢#ҤZa͍ta[;OgxlLl {]WlwGO܏z a5xsbV3wgug=N~%8wo%q1c>(G3J&iJtX2E4} {ѯDVV"oN`4~[b1BM%CvL|"0-m}Fq$Y";(:jш-P=4]W im+wԀvZ9Zی|d涋]v8Uzxc]NnSz묝-'<ShC5j<Ҕ {=.t(F~>WZYfu3 i7QKT h2 SF}R&U*0, 61*ap2Հ::A/J\``AI _/qZΤoޒWz]aГ2KV@o/,hZ[8FCwЗ<O~pz7Q3;{aN jiZC1jvWqӰ^@ub w+#!δƮ2_Y~t$ّI)s";gZA IeߔZ=FaV;vkuvfe[ϳ}{XOV `^B5 5յvvNNyJ>)M`h3ͮsw׈sR7mKWlXu8wNYok׬?޲<;Y(6.x&U8ǹՓ9G̯/!?C#Fl ndB]]yu? y;x m/1HB D_A//Q!;tB!Ll 1q]ee%]/+ 8{k:|KVUY3i$ambAl]Vjoinݮr.xIA->9XhJf3UVa1s8ٗ7RmDC1/Th&Dc5[O`LoFE &_ugKy%:jz%!W`׌Ot\hԆMKMgZ" H{<ܲh䂥3BNOsimM6W˂͢oab x+@] &m 6bZؑʩ;G_^W"Z-FE/.[XGe#^eY3,1h@$NE `u:i4jAy : ~% |8@0mLtJ<,a ZZQ x7YfK'_6=iV;h vo8?i;ZWdu.;9 _H@X~w+*&V݄0ƳG3y&|fsGjlO8vN_Z?dy1BK:87+UZf{R[$Ґ&w(T5!=.MdnEk2M =2Mt,uEFq7-_ h᢯!ZESQ=w"6xoגyyQ;aZ@dԋc?ڭ% <%]C^%=Dhtw 2}Og+a9g5ԸA~ij]iXcǴXmŕc- kU¢HQ .aQiӍ.nz ~LC}SPaa#Tf-V5K-=?QUqxl#_X ,U{/~|ijQ?iځuo'?<]~dlp@`KysMI8pj 22 A8_;ͪKpAu|Q__nNg)!(NiU~[^T VmCg-V祯̌$eEz h΁v@bap([Ӣ~^՘)8oy#km>-<n~"5 > `,g0}`O1k(O1FN/2+lESs_*3 - D[H |$>h^zN R % xN!+ސ_SRCAp4Xetf+XO\7뮋/FähZ, :oEJRb[ hX`l @6)?llGz0=,El#;BcY[7?6s>9=1, ?䟃"zs`<h\Ȥ?,/gyLIhkh6ҋ;^ ׮}|GioH'anCҧvѻKNuu9/ mBrhSڱtb9y97e4O1 ĺb.yp vY&k[j_8ӟ籺\$%i2NC;q*O<$~J>oIzwm"8#e"L :R4pE\t#)_/9^\-}\_r9*GBpH~}>jƊOf/aAl}ع03wWrKDoSB﹄E;N#iQ"H܅ :33#^bZ=.* t7 /lN3/]#ԊYod/2'a-ra|ƙpg+}C2ٌ,KKK<]`mfkẔ&ˆ-NZhn;]-_TDךNjڢnNO]eOȽP4]}iCS]I_%VuY[ 4doD:9a*XP} 3FU. !nS`9^ik3XWG sJAyx4͢}}4WNIk{+B6c[z=kKLw|c\k)[#^ '?'xP:̚wkyݺ^tZ&gX^Z<4\kr|UrH`4͇ >pklw*iBU ~u㪗K:_m-\bl@jGC1`Y*IbQԟ X=G,=i[:[Y3 fȏgY\.۸EC铞|; FS[Z|QЁ> Y`-tSkESI]Sq ` k:/mդ7);psk~&*.(O^ްoPTQ1j}l~e6w댂NèZU@NfIbb0SB4TVq5H `9;Xed$i8p3!3@7f%St3w(7f*ojB(%&4H x*LTB<qJ7;xĒB1u9hԏ0P7@š!Ov)c?pY"h#^ކV!ю@JI+h Xjȏ3n AVpZC/LU:4qaEaa. `M18@ a)p#`DIqhފո>IP!`6N$Or[FY-aMz-JRƤsjh642@ =?4 yioO.6&@ƪ8 g/"*,vh_.@ku-X+v& N8,s{YkUCӂv#tᬘVf(:fi 46/9-ehtGS&T#h*zDlB J@]BZGzղ2Q\g9Fc6i, 2FV;䝎+ ( S@VL)ݛ%NV :aE(B?M'8iѪp|GA5A{z```]wxBaU&$nunw/E!ltg6tF^`r ΀vMs²=j_/ʷNS\ֶBrgUX49m_C{3 SjҚ=&@ h(6UCZEJ`pj&=`ZJBsŌ aL fɤee2[4_6{A\qڊ % k ^qTUJjZlpUHݖymĠWOY\jY`B xqz0 `4 ?1FQKnEF6Ȏz2zKg,zBy|Dk`t鳲T9 vCh hnBӺi~l/tkck6x֮r(rXc7L)D ElP{W(@*M1G3Q_\UܶeIsP( p[Ym\zipG>6o|vݫȃxHwxIJQ$*c|ZBSʳr_ tB[Q́F&FDǦ ݵ>FF^n4ĻHdZg03LE-6tmYQy[n[uZ]k]O-\JXwP4Qg8vi"3bN ~S QK.B.S(Wb d'~LYR4@lm$/kmȕX_51 isQ u Pf`>yIt/&NK4GK at=K2A≫ l6QK'? ݛR:!+ t³BGw$Iz508;6 ob-b!B6 uٳϢ) )egKY@\͍4VB}f$9zx+C#…{ i<AǜJ=żTgյ4kB(gjt7Lp:d<ÈSo^,齺S v5ku&sQ9QcsFlǜ- EЈ`s5DrYuo{wigamj `Ihf܄vSWzM?6YNB&Cm @SY:hk]һ 0b_c␾_]|Ik:dMZ#kv:##^55ZO]ƬNgcD#5XJxb[ZBPCcHTT 9FXe*:~gbmQ(-D6n]]}o #˧QA?W&Md8qWаcۼIS@.js1 /1 Ņ9l\>$6eb/_SfŲ'{n,8>;lO00-q`@6m5 zԡwգ2ӝX㬞VKuycRT9|b $OmkǤ%̣bgDܣ/</_ʷ_}~PDx5(߿|omC٫gߤ俾 F~VYCN$mk/4U9'(h, 6qpiĢU,i8hxk#9dwz-]|VٲY>rI@ڒ\0׷˷D]}JNJ9 W.h,cи H%,g5Px j̭fvU\hH[m\h5՘;;9i6_Q}֢c&;ڢ19-}>WAb .c)In%UD>,/h021:AJ1{+[{q`)~jocGj1iL b*idS!2}5ca2Zldiˊ9KqsTɴ; ;afTU>%+kbGYjQ,VCj)[eP G<\x՞[]jt=~'} 6*#A8ϭT 2 XbKpDZ(׷e!?x2K-_ȥ 5‚Ap ~Uj,{??Z/go~ڒ[ "m'N:La: hx>,jQ 8;Ѡ;_+BU۴}KPkj6uO{{iI= ?s~^X@,h**#Q԰Q3aXHp)Brk$,1J=$_ߥ9$t0us0(LL>(U3')˲X|bk{.$#{b*M 3R*V.+r?Q~{3FO]j\x _b}*JpPh=->"WT>#БZ: a^a"/9$3yɘHy❕;/)aPp-YVtEzk;KKCm?9 iN_u"iS"bPɦ˿ w:W(x 7(cغDdb Q"!24: nH%Ux;R<4~:wCr\32;^q]9;ʉ4q6{;-g*{tGwGUe{{7f'3Nzhw ahb(Qv,(YZPς sLt??0}s9eqr>rtA/;wS@ʇ*]Nr J=RҵԞguH(-]RR$l^ }{n"<̩'T] Gh=:6'cğ0J1HC1TOk0q)}F?H}wÊہ 4i؟qOm'ێj%#=k3:)%ї¾袺sql&{dܑxMJfW8O  %ET O'%_IhN$tϚ"58>sdO2~$3џ~烌VJLLLdRJjˡ\䰼N1=f21]8GЋARyã[f jSGZ3GZ ] &D g`6Ko$XL ZU}xRy$fsw,J6ؐR( K |FKdUX:4ri8Je~YhO!y΢R>zVtUGVw<0v&7TG8VlƢ!;^8OW/&H#LD90((ѓ? a)Am!L<| ئ%\ÌL4⏕`n?`VWkhb+iŚb%8ti5@/th$pK套sGXh%bɻb/u5K:`Ěcbֈ^:Mžrݹ׶gY5e\pA:K#xs"Nt;f dBC 3vDk/U1ղ9GsX-BC<27ǽ M.EguL͋\yY6{ZbuyE5%.wAP3}Snc ez52QYͫx`բ*'/ΗCi~E'`ciE*&9ҞKA# \:+/c)q!r^={pn7\ݱdq;zkڗ,\Ր9N.N[EZ4w^/<4z29愘+GU=0R= 9#}^)trgrt:".^Q~;3ʪrmNEE@~}Pf\tzMբI`/81iSNMPVv<_aO6)hNv9dyXOJA1`SNF 0d 7`z$ 8g0: aї Z\f0< \oqg~1?8`|l"[nb1 MysB'F~ZbvGN u_f͉kE/˚>6D٘HN T1P>GO6g\=WNeqot#uz:JO')%A]4QWCMR& $%j¢ 7Hl%GmPPF @9sBM\+,u`4cNZ#,U̥.aLQ<4I&ũ1@aWN]P9h^^=T0}\$y'ѾY!aED*nĈ\nE*eS4OpD1Kr2B}qj1Ʀ/T 78KYY&駵lWSJ9=4OG:ٝf+\*Z8Nʢ g^@$|%-ϦWHM VLR:/QJh{8s*dXJ5`j[pk&UYbd`l&LSTr@ tڞ){iEڲZw:0Th &!̀\V`);^L1C|]ߢr.-8eu J|W>RNr 8xA#b+<SfLM6e- !d#_ԚQ&qqPBkA(#ZqƗ!Jpl"1ײkIZVp@?-=6Ss,e:3eZ5R9+7N9InۇםXgCSٮ嫳lmu ,3m9zOPEǰB^rF&B^mc r4sͅj\g1H9T1rFBCZ0JPhwan]bյP5ނGnWgkuʥC?■ͮ |@-^%;x>@5eyAU954mƄWbp\!,GhD" 3! 鄛HT\6H8`9LE5tV\){`{ ꔻ@`N{9瞞ݷv5ٛ:WnYu?={%14*v e\{z?gme&b+hP9B{ OQ,mճU[`l\5zHṽu=`zrX ~UӚ gv^5y#Q(2'}CWKs륊O67Րo6kCD&PS㯳XNoQ5\8<On}թNh f ft+x2mS48vו2 )ѻ$:(Z1FbpB2kYcÐQ+Ꮏn#4wݩ/+kOT=#ʶN= ;33Q @&.֯ɗ/oD{ L=aMM=I;eχ,'d(E5^BK1gՀbAtp7oC/Ҳj8QQޢ>”YnPj.$Qlw[Dž@>|rFR=v?$ksH Lk꿿 N \|D gC ]ݭ~wS$cwT<б|"QDRMcjId*Y N5~wQHպAk3`$0 t1B(_%ZUh*\TzR׋PyRя9h`AsdӬb ဟRX| NjhZ; 'h0{*AZ+ehȦ`<r^PHm˄V}TWkO' #gmkOW.QZQ {p=4A6 Ҙ‹B3?#9Db%>OCxu'@<>W8-{j>9أW9.Yz&omC}s1e5\Z|犩] C-`.* 45K}_.]|[NIwzd 6?rp%K끼5kqAgZ 3g!BE RǕ>Cl)I]{km;sZ=-Cs[֯{l|~󪧭[OVƀ#@Ik<I{wKk[V?ZE?oxtϥA E?PR> Tk lR"7(/CmUe@$8} , a[ҳxq^Q:ZRPjVu t%n2f9ر]7~,Un6c6:gѫ +-.?M&fv߱s#zVwq:꙱m۫۷c$_g)O&&\@bd34n'BX̡1R;q"LN,`/mO䔰m8F0V\6&yhM&t3J0`g@5zzX—#Ն1oԠRڮT}V*yp-"D$ן2pԓ1 8G07Oy#xh(> MswLiw:&mH)yi*F)I$qKwN^~2I6JU`>u0P5mh9vyռ%M|Vεz0cQ[} Уcvg-3 盲^Y)Vؿ娢VԳVBa\Α.ї-&<_60¡0z̈B@} 0gI=FS]+(]` \x\J KRqbN38ʔʗ5 f jA3]֚@ZOjM$%RN Y[wzterZlJYV9q* N&[5L[2<2?Kl*}*g?je܏Id?r `^1}/U߃wyE|k4~ NT~WrZ@ څ _(Z VT%ZZ#X>u㲻^Eo2˽T'v <Ր*`cN-FK+P WAv4?JScF'c73 SRӀ\Q>j2;ⱳIܯ3s:,([.edW=s ~=; !FKl*`DǯP 1I𿐁I Ș,a8pc3X)WW`:5KQy7j$uE|pM5* `lh $J6R/#4*8BݺؖWX.m)R3fa-v4+JP%Fvځ'C78-6F @6aY9_,GoЧͳ%{#QkA6>ohͻ㥌d͟_G蓌/tk `RӍ) |:2r ⯿s<ʖ5E躉]]Zm/xƜO XR\roytX Q]$^Ӎiܠ*nR gf5/C7A5 (1Gu@|,J$4 DIIDmx8=9="zcq2wНvȅ GZ55!_u*ZmߴN3^#7$QLZu%!^A I1)91C|GDM߰A7Y݌:֨n;VBNRSq%yo|&5زgt1cL0o1Cٍe^w>½!6jf4K Gzi dߴL]/y rEF~ӛUQ@߉`1qUwb\L(bY%) ZRlҿ˪0-WiUФIS+_!y]+r=`'tv7{}1{\ǃ$ cϜZ; ;usg,kv۸U߻|ozrPQwGb "]lɵ\{h7{‡{8ֻo=`#vN_2}N$sSz̙Z 6t6@fn:6i!T$" W8=(}mZx}}5hKż{8P޾7yƾ7^:8,B7l{8O<Ĥlt jC`)7a9Jl6C/?4gZ+q+IaɅq&g w.yEZEW~q7 K&*/: ;,woܳeCk57nug͵&շ7ڱf}?uP;o>r;N}ztPu]C<֘јsUۧ. o bo?7gW ,I$Z* !N|˲f<s&|헪m:?^KgzQtc+kx>7n鸧H1L"bN65|#.hd `/0뉚]R>[K R;tHdNkVrh*<;?Gj3 d4 ьi1;^Cg&cP SV9y8xqcn蒳ѡϷ]j^ 閪8w<:ml튵ݳGVt*魏7Ϛq0Jg!=B_Sb>7LS*J&o#'q&]+F.O s!qLCDktK||4cLzbU[)3K!wY޶oXq¾é [?b(\5La乖/{s atq/RˀƓ/=V!疕 rR|BDPxt|߳eg)VA"#^A qF$ڻ"db&B%+ձa6U{nm0YoM}4Ғ|y|*I{6b =} 6d1yݰ=s/}qU|gFOS1 j~;q/^u 5eZXnKDkc`LSUxM֔v)#(&:!P UԤ:ˮ>eKqGe6(ABO3cC~QgTh&*F&ak[:V#UJ5.Ugp+* ¢*f=c(ךW1^4٠.QK wƐetC<(a,zB0V<[M>CwUc:y'܃i9}^< C08C\OPE^1sZR5Hvn}}n6mpb1, P ؊ A1eWv5wǽ# h#/_]ps3:u8ifٟ>0[v۶DY4ag "DR 9KvHR]SPŷzJƛ3в ?X§)VF 1Io0O%eœhyw xA;2ބI>gvz _ap^i5ҕp}ϛwJ9ˉlԔV4W5qH >.{C[|_B>N=^[r9^5bUΙvJڂk|߰8NgNJhJ,JA9*rDx0s{P6_WFjpm8Ϛl#)ku?!ḰГ V{=ӓi3a3 `F`vin`n7< 2n7unhC"$T/^BdG#yYl޼rU 5) 嘭C/YZ,[, rͱZhXqE~Djŗ=kqW[Y$9.v1rqj3܈m7%q\br2:.G!D8<%rըרi^`:X+r:]<cr6 yi䜂?DE;x6@KIhu϶aںqV-6 uU;V3 VZG>E ;B41zb_h {b#g¼ p9t(J8!RY'%saX{D_!"8dr50.&ʷӾ6ې9p:X qw3Ϡhu8eD07D{ s&Byfth sȤ'7VT lL./!”.75^FV= .H*^WR֮,_0.iW]ee+ܸ&wo]MP{(aW80=p\qZkք΁w3V]"Kf EJne*kT7*>q{-ȕ*LnwWXr. ҫ.z=b69bX`-Q @w?qmEp_|#KWW%eB3µ{ҷe(K@ږ ˃K{[@ Ǹys0df Q9)8{!p笯k.U }>}kk׳v@՗.q٥W&oE3C^?C?G[۷={b<}aA uip(uiW2JM_+X  ^]"~ǡ@)<MN=BóM-L!mL!]}c@ж\%:%Ko`**|3*]I˰@uXK {(|I|~_ hq% A_&A%D̠ڍޠ-hCxB>Y3=8:Y7bzS8?%,S/ҋ^$(3HݝH $#BL*f@pO UFٳ \@ݟ e EHquAo=SgDQ.b&.{f׋w Z%0.7s??~u?sȊ 'D;FFEl188:UgFͯ_6m 0cYV7wU֜'706L6rh+FZ|T~8155ipMVOKZ۲s6žbD K읁;!f I5k%fpoZNK$p܉7&x8"~}3c@qL4GK2m L5 TNy#4I <1BD,5X ay$yRcTPYLєP ZWfjzA3*SUs(go.KZ!Jڊ&A 0%Έ-B:)NゝKg u\6߸~-o_wSg+ggC.f$]Hx Ghc n@dV`2]zuܸVJ hsUW+w,WD}nOӤ тf}́Rj5NͧyO8<lH.6N;@{ È^x]8!Dh"=eN 23x,> I$,>扵pB]41+RKH)'!G,~%!z}< A &d!t2B &Jd41Q4yAI@6d=c2/c~{V̢4 WwvÑ@|']_41zJqKOtT)j$4+ӎ0KQ1sm|~2k5oZDnHg 1,:/X9c^k4yUzKqjNo6yu4vg(tN')&]tjJC!SF4!H!C3Ą'$O={bj6iA9CN@qz|jP8uMn˦{n2z$aF/K17~;D1cA2=|ɪx\T>m:Vb̗o}Yn[7}_Yj/c 7N\vu؆-5\ƭI~ĩ /,H]>|xq"vJϠ | .(D߼*+੧R\N?hp;$OUUӁzY&7uj^c`+)4U3ұsX&:tq{,8qd>IML]Z EM1V C9eV H꙾rJ XEE ֣o_rUxv|0'5#GTO|x\.PިDK8ćGKgd,Xo3.A 5 $@k37_ c%ByN;IpMhZUTM6 ;$==<RIR5cX6IQ!3;*j n^JCCYzAHElEz@.Y!ᩡlI%Y@Գ2+^D*ԿV" h2-0e򽻴2.tKUr]Uт@@]bҿk5ԥ-:TB nz҈܄ n"(E.VX䫋\I^X+PM2q2$ E)2(O\"DO}Q :Z B"g[?kDQ3[]Ь,eR*7j w킗ƤwFFP^A}AA=pQdrעļڲ33)wgys&p߷W7z0 D{satD ]3jA%S VW-80{WtNBD[|D`- BU0?1DɠXTFvKR8|dO2iMA9 6ز4OIwI~y~4=:"`h0* 64` F)br#!f"G#jS1s2_F8tr}]Fsu9bW&Se!n%~g!a?FD[&NתM8! !P+:lbmVֶ̯sYD󂼊%tH@`u* za-N2T_⾗+ZR>Y-{=MA<ɭ;S;xށ>\23 ['4'͝y6dF[Ha,rTH*OQW/JUZ<֋puBL!LHQXPu%!]Dkաm[")\0$R.w`бsZ"ebEVŸ]ӭ(8&t{+s^7{lyENK5c5*.J`sZϙmW'|/w;.Ѯx`mi3._#,9bnVw~6(b#0֟dD0Tپ0)H -^L*KlD?t0̹Ep|e ,uO =kv g8b#+6B'G|bLzpӓ ʜ%?ϔO31d~rQ|ϻ~!*LGZ<C-%< 2ɴxXnW<{;dmKQU&!h9W!sDߣ7#w_@ '|Ļ_oPF>K *5D"ђb2x8@ Yx ">!~S&JZ4O>ˑ!ټ;֗ eMkd#+MO#@ *)T=/9NW 1ńA)_$7">sZ̔JSrmXē`;o]5'\G] O3`TD.ķҕ'130#nCXoa.& aH% & )!i-{`D6 P fӌxI;RRw%cÆŒN^^n[^Y օ+p [0-XE=J0#,!1@Q8T #~!?؄~<!vCq_&`f} 󆂭t~5d&{ZpNMWd]iV\WBQFID$#N$5L ]qPXTMjVDIh>d]2tx9>>]rհ"0|fڜ ; ۬n-{w*EXP*sǎpj9V8jhJG;H[K·%';VW9hJ wTOoϢ1Ҿvire/g}}?\cS[ڲڧѭ5^sZ18x3N]3L5i'O݅$ #럍 8\|Տ,t' z"`Հ4,{K};?}͍^ge5r[<4LLuB Н/8ԭkGV$ʗ͒<pX֢c \?SP{zmZhH Zx*RkjJZ;oR%UYOVV*__?M̺vvqRc =80jY3}B-Ӎa{- VTD8h{} e9$![N;#gV[eɲ$WȒle٘blf馛N$@BO@R)0KB A84\KliJl}̛7oDNOŦt^'`HT.MҀF -' =I$ݨPWشY0V3V"ར4h=sF1\U l?|U'EX^*ՓbhV |(S16mZy|^v'`K€ ,,,/_>_G_?)egΌ1(; xϯMϯ}Bh* !(0zOެGvJJ<{cy K1qA| ^t@K9 #72e|:?\}c` G0%S вO?\0=C}%76 OuL:{gp1`]LKXcr,w'cAL /?d${mX3x9OC&~ϜbϞ/N W {C{m߾7[5ƼsO?ӧ,\x]!.gRښY:*doarrs3[{VEy>v[ˡoXM@Z! +VxV4Fxanwud<,>8d7[1j:pBZ~f3B5S~VrnV n# ~0,/x聞?^ԙ3e /]wuow$3gbj4ר7!*FyjgQ;9 ?2~~hўtO:)t='݃==CuY4$[:, tBoEԘLoHMe@-5 ,Bo;{q^̍,f4&vphȻv)"< '*|0Nز0[JnEE.W :LD.D8ߵ?ODPI1Wes烏8bavzigk6~[~΍qD >MfU^OM8Ru6.x~jTAkMgzև:j崉aU3iPRtLUxY`(@|R* EDzgcg@ 'uA`2+,vЋć/ DtUwmKbI"et'&d{bDrRINf$U`>[2ThӌNՅk-z*FO<(:sXv7b2uTt\k.7ǻt(?GC߱7N95Ct%igC̉gS`/@χU0>`;lc(|0v0:Җi#!5a *:0,O <R|MYJ)llj*SnE뇀`ODokͨCb +z%089fx1ÆiaPp_?=/!Uz2,lOZt9@`~mnCNNPf.l/IMlLX\ܗKj)Eu%u*bN c 7kg1(  ;p{1-g1@\2t 7D P4-oo')%z29L5)2<:B&):O¤T]EݶK~M [uN9\[F_)6TVpHtKu4ӬV6_WʧU;(+4%ɤfei^oH$S;C!; 竭>N5)D{ʎ! K} rљyVЌw1Hde;N \DFChWvπw;ty9rӹp \;>#~`)ahZbizYjq;~\lЛS +rjBkoPl )^NA]'ޮh}f"c.!ok岭o<PB{?L'Eԗ D =]*.gJŶ}Bot&& e\E^׭{/NK޽DX9#^4xC_ jK"wCjM{.(,ր+MsQD QcTP^/4y5@^+/'w4} Zsũ"`W% yGIpC0:E?kݺYɎ+ U"5U@SxW.0pKaX}:]zInN6C̦߾uQ'|䘔UVєN=?v7 9l&mONb{#pG^]/ SJVN\*T-@vfVO!h4RhtLaH\d,Ӏ"F'aKDPo(z p=cwd7b]Z8p`"2X:"ŋ׃'H-2s֯{/Ǿh{ThrĐ!CT0b/b  Ԝ[9>(^0atvav؀ńQ1So4Vx E Nln=˜zxϒŒ;ؼѤ$. )_$1(}5$ӊEP۔&~F̩8ޫ`(1E(ѻ&G"T¹|b,i((18W0w#BSGXK{_gS.ф6g?{i֛뷛⥶v=vlTRa dځӖȔ \v힁UU7V͋ *5}$2uC0w҇AåήCvELSY>{4&~MjF %ۇt_O\',}%l)h z%ۺZyIF]݂Շ_'7~U) <2N(;h-Pq]aV%?yyNM َy[{[h1r#}B+:>̮ׅ N " ܖ7Aq0t#I$O*}~TwDE 7^ ٝ#D(%M*6X>$@p^ ") zAG% b>>T^}; OǘQ;c-/ ^#7wVt s&G'*-#צQ%^M'pc"-W+*m9zLԎp힒{ɑ]}}(b0};ax]t[)Q@]gД vÉ7g㮆'fToJfȬ"Rۚ˫DŽ* S?u=95jU!9F9j.4p|P{wΔ"Nz(mW`yخ`ŰKf?~Fm(ȑX0sr6D#P2 ='HBL"-0j0dNG̏rF=/tu?"Ju*/^]2Q.Uԩ\|OYw/^p9ߡ%Ԟv%( -FʋkBeNk=vuP37g, }QįK L Z>:MN⏆/"[I}II}{R…wu R_KnxRFmX`HS]}Gŝ-g(KqAM"qpn 8o|5Rg1:?M N 1a%O0<;,A[w* X '!(=i}&?#^$ ^2)m4sDE|gPb2Dq>n.*?W̸x(Ļ8sDSD<\"53PsA907@R Fq 1xodYХ&]bnʁdbzya(rj~}@8  >>4J.]RRŨ 2*F A6r]eH}KK۔JҡObƆL G hN'%+Sx̒jU,V/}2D5NwY8G,JeAh*c幔‚wޡ.0{DxSfѢ2w$F-:WY\D,oIyךnNI ,i)m#YǪjU-3Y$v%%3ZpV򒲗.#cNf.5 d$C},KSצIX$fX͊DM^uVJ0Rs0=t@kToRZ$bX*eVEWϕ5T0Tnkޑ 7&$2iyThF7ubqey#lR*[)IMk\a#u[N^3VqאnL(v\fTGQI7p=3?קw(snYISMg''gaFmL*1JJ2U,O}}]&k9-Di-%}jS*0XXWb%cRLR)$MNK,NcإUdfI$DĢ*$R fLMMuLձK7)lJehZ%V1՛ ڒS.u4elJ=RSj>rlڮb4%ǎ-Y ]#,EJ ؈]?Sgz-K=:b+ 4A|hFCR("F'ch)= EjjR7﫧W*JoJL2lXBa ar:ZcůM?'-V xn ]mPQY 5eS0 Ư_?^:w.rMP ToܞL"ʛ_b^GS7eZUd lX>ͧAGM1 0Bǖc(B0lEguK Ppl G»vh[!A9v qo9b\#}v@04> B4ZQ)?ݘ:>uX vn(zHE~Jńs(7Pz Xx@?n;E)҃4EJACuJyc>,FuUiZ: ^{P?cYոOBk3Xt5PTErׁn*~)pD M0;bMA폨p[인ւ 4]Lvky4a.YB\UE/5lbK2#M%PJvWθnpk'`@ɴ`iʌPW8Ġl%t %ʌSQ~Vpj*$w^#G1i6}"vw"bzrMZښ]].?+;z##Jz~:vvۻ$31~eݹ+tJG;I mWyؤqk*dƜ^VX_<:7''wtq}aYa#TH 3:#CyVZWjU֕?;AY|.d7R]&ODh<*z@ i݉AwNA%L @vI0c*T.39R[VJЩ,՜bM1WR ߫>EƉN, `õ>U8z/{23Yh확b^āpQ{/RX_߲d8Ȭ6e;зk }B rfq HˠfŬD ζ%,Ĭm ?sx\j\WWUqCS~mlY3M>qs3`ػoSL4.\剶jlu[I77쵥S4m323ȧꑳlg@ ͢؏1W%`T;ω ExCt#8*g30Gx{!w>滢xi$plɣ` ;f7kAfyh3>>GU4VO-HM֌oK<')m? %{[2p;>κK>e}}ڸ0D2`TIHnP(A!6Ƣ2hk}U3Yެșt#d}s|'s|\P_ξGփ$į8;BhQ",Ƙ{ 5k'ZUָߚ8~)A^R--.fGWԋZGE*.FzӘP.$-J}&\VTTnv?a/'n-{4yʐ`ʡ5e9<4eU斕dT U6?AX&튨Řf5?MA6eb$d`t%Qp3`sb3NnMSpU5G [6CnqҀ 0y"U(tK\SR*1S$AW~gSvtQR[ %ZԛgXo3c(|:c(sVl` nHz*_~uzP5X"ݫ~P]#jDy%Kj $-v!F~32ܪQ5`.|ap>nw/y#?X##Jw5( Nx4슩qV^=~R'Ҫe,ҧXM}jJ-)T:אw3rT'x}scFy7k V0\SM(2@u:-YzǮS8W[4;0qƷr6SBIXqLt&t&#M G#&t ڠ470݆IpX2M LuwDo2` %\7߳g ^mlmW)sX7ao`BfbnQ1J)?FT7ѣ;C6XV}EBq:ٗzhW*S/'W I~F,앀 Ud A:ɫ+z:b4'Ŵ؉szkܮ.08q/8kYHE>QvŋgO~aժ bx.쨽'TY&7(w^;[Ս$\0w/6p'">@'w.XHZɋ(jXyc\X{'Dy>z-zxy>xm˔ۜS^O]Ђ{E&``w)+ySL>cua=$+h)V,7RH֯a=U<35@fF9Ni@6݅LDQs-cr졂 z W^׏~чS25$Z}݊#q~d{VF^ުԚYl&'Jk~O V{W|šG&$d]8/vDj&7xҤU떦ʐ3 {W(1O-T}2k@NH:e i|},Nj$}^\X,_+Vr{-sv7d/zkuxC499/%Vϕ4] j3=/#TQcϱͫHBw _Ee^f[џ3 76N3w\"R1v/}}"O{?1 E>9|.mV 40 lK҇k|2A?g`f.}WF\[XQ:J1D~NN*(|C^&@Gj1:;kN\ 0ƅfӨp?$0oGG߽0Cは/zF4X~dIE[.9љwI` 샧'ab$~+/m`.- Qb'͛"+6XJ̓n+fA0H+l_sʴ!-TdؿOdɜiLjNqJɘeO;;%G'o;"),=K ][ g|Mo<< 4/c遷xj~ܱja>txkla^3qniiЗ1MɎH͌و KQj1$ag2g#K|!yeDQLxX{i4{{VNl Ѩr|_IG$iu,N?TW߂bt*xAutAՏ7Ѐ \84dه&I~Xsul0eZ~rsUJkG )2S~mVyn#~chVA+c%YY Z!W1tA1y51+AE8ICo.V3[ '1;Sv2Q:pؽ{/fb/vܽ1l^:fy%6?a2Gy8rmngô0.ׂ~XnjcpD1N70%p{ UWܥ҄oS(آ  v-6=C=s"n"^D͐8'ݿ ڊEBTPAEU!DwUIOep$FZo|놪'܈s!}q"TPd(le+ VW^DlYs:ahI`XkUq&HIR& 5 R r#F-M>/?}DLeJ{L':y!=lgwKsC83jwV˩}. 'v cU Q)I{W-Ly}0W_훰S%  YIV١gD7;;ZX4vhH;n}5>J13U!P3xd}?1mډwER`*A 36?M~hIxY= 28Lq,6h=΅Pt{k0f7?rFR8`vG<ؔk TzgL+VaLwp # &ɼS,Y~>o~3b!wcE. k,)O>e 1z<gT%5" V*1'_nFBQX !I'P!q`3QltStb‚ /<;ɖ?&%yD,eOp8jb> @Tᄊcη歿Zyw~?zEgZsq snݴŖ'2;͹Gz,>#QQ?_bNɆӍivnjj~w`GS^`=O3cM#!ȧtxۄ~.k:D!,茮?:At$6p9*> bi([nϠA#鰺Ih*~[Dqt珓j`my. 7e5/6u_T BXa ?-t :Ufr4RJJoE--j#髳,*v>&$Q?㰗.;Q ]'׬=f͚S' 3rxW˯f8{)VLo0床|`;& ޱ~Riqì^OMNTuG:I.AR(_Mo=pNtMj7#~s&#K( =q0:]pN8DG^>HY4׻]F# ÷,FhLuO'zܴ%*cvvd Elg:1hr35kgFatu~ˆm>џz9qLI)U<gx _ifmљ `.l8 sdg鶍yXWx6ݴ e}ư_("/[0:ӻއ6: l6%P,4 P8u,:N/6Ƿ7.Aߎgd 6{r0x؋LF"\b6(%D"`Fvpg!b` _ J*eK83|q(ԦJ>WR!&)A|r*2H8%ݠJe[|MojP?C[8ra93{cbqo5&0 4%eٳw<<` [S7߇?CӞ̶{"yPn)hAcWzZ*yb.urܚ[%XqᏣ605n'Ny'ND~ ^%s%藂]ML cBuJDO_D~_8;U\W#'soMgC=P9NWǐu0-ת׶Nnk9tz9MF̍("QIS?E@!&O">H@!}Z%? ? qx6rD.L0"*r 8"GO5E7 9?Е)Aֆu)~Q}@l Lrz\'I,\zӷyMڞ0`V+έxFGO_C?ҭm 2h0~|lClq槇L?dnOuD`mptGDVf롷G3H >F`h㖋mpM6\.f/ђE8 :|12ؑ92^ ԍ5k F?pA Иwd< w=6J@l^}SCGmr f%[ϧgi\ [x,ރ u *Ժ0: |WlrJi6}w ,i2ִi& ׈y|[I0C^ymr򑯎i&"Hm$ۖOvyxt)^F( buroQ i7c#RsMav))fDjL(sb&[sdTb1s_7牀:U_UX /ϭXqX@ Й[FAQJq#?)ߺ|V}+-H6aGtSxYq~ㅰVjhW#r#1!w48Q{n/i=( U-zFnU5˖gRqw`c4gej+6C9 ein33Ѭ1[wc⭽ҿˏ^.L\xK1ms\rGU5^4Z!Oѷzh3Φwyeƹ;R=}&z(6It} |ZieݲNˇdKۊ8'slj 9I!R jp%p%HZ޶(hʎҾ~ߗX;;<<4kA`6KTV2^4"?K/AnyܵE!JbG*/JZX?3ҹO;OCBp`D8or[Lf5~V;>QqJD>C\K7]A-aoy@] " ;vsHH'&!zXX5gԞNpCMN14^4xF~Fe21)^p?#fJZRԙ1]顕j3R%i5!̐?B{WJ-sva{> Zi9O?W'+ӼQ J0]zLBVQ= > J}FS*)ƉFZ5˨Vj p4]!n sDs43Q:pӞ# 'N%;g_= .2I_Y-,VH>{LBg6ep;kJW"u.#| ]H(PڰFtoQ,VXSTfAápuN\[;olBMEhZة>g 6 %ؑY$h0ggyX$^TDVÅ b$RrIh;,J>`i9 P*NJ}׌.GBei:㳙CB01Z[-OL|9uG̘1G\~;]kLCSYbz ɪ:QRnNH_X>҇BB),l}U1ƙ[ jV]Ҥ]/?ϝ8i ~%I7モl4Ub5˨5Q7Sߣ;{ȅ0N|v4-]$eq2\Ni%bd.3]@8m@n|7\9+إ29e9?G-n@@RHTlI[RV w=bCA9MVꐗ#bPƝ &bf.A@c5Iؚ =>,/eM|ဌb7dI~ЌӦ^@5p|n`LZAŦ*C}d.y<5PU=kR,5D«2 +g/ G32 S}r .qnƬ(^*pٍ9=\<,Q?"|p)+Fkrxo>.|4߅Ad )S:ƦI|*Έ qGs6;^O~+r.uD 뻐%WCAQTیuրW3egչ+HD))0:&p L Nt~NmyFyOs[ `\ky;h_e0@.ӿx9? f`/Z^}WBHRo7z`@Q4ΆбLwl_7^=t=SUZ7HGqgEGJ}9RcjB=)Ĝl #=v~xqvwoDk(k. @@ºk!}!HZ;wg_8}Vܯpt>׵>x4G;r>p<8"d4\:~FB/PGbfUޓJi8ۆݹuM5|35.axnoX0f1K4?szRG|{GgjCB*:m6H}Wu{ˁ6֒B-yC=Jۼ;&[8ի4|rq^9pH/U`mP<=cxOAX^kC]MIh'P?LqAC`S6ħR_h fA tL2jXBZ`͘piDlJALxfˮѺԘUА1 3CO9Ka|{۾Tz%E"˫T*7Cxvi2Vd9'a=zˣVIxF:x- i !p;m/Yp|x(~B%W~FA)1S~?E4=KR0j*^FR0*9GHg PR ArX㲁xk ҽ쯎[q-E%C!P L4"zڲ\̛_L#e"քDWTSҁP)ǥ `Uo~گ9,O`g ^O&WK50<0Ħ]oGp + *HEL b5pdL_RӥJ`wDcCl  n%-u'w8_iJqXl0kD>%K>gg^Қ(a 󬬔H΂l#*~)e,3L],.p`v:W62|]ţ^J+qXrJŰ/ab `ݰZ|tyֵB׭Tupm_%mzcNE(OD}˹ 8%ٛ /VaMr8NJ ,3R,w_V^Xk a'VZ,CL{TpU"2vh{^scS*1b#OQCmxf.{@(*Fz孷A6/Vfp'wG`)gI %[ ?hN}Do.ۇ̡cܴm}J'cy *2u=/6uX8hk lleTŏP7h:xXhxQƯKh :a׈~RF% 6.x0Fsu.VltOa.`Epv:VvqdE&;HpYs`Pk3$7LXʎ&x9ݾJR35\zMphg>0[Ġ[JNMyFYԏO fNȼ믨Zwb!;;kԜ9_]Բ?RpD,V]Zn 6yA;SkWi` @]!teKm&N̈ tpT ڄ?D!~mR+u& Z9"O "FBM&A J&PDzP_N"ce`:PK'  `. c YDDg:1JjrQU yH"6_zH7c aO2is+szDm^uK~ I\J lذSG8ӧQW}{Jޠ9Q-ry!pF}FKA P}%#2mW2cMK~??X͈gf63F{/CxU~hx_D0 D/(g[~=jGօFtZ.;NX8)˞93DkkpHα6A #}w{{Nޚ@gDvYv,[a%ģ5 ;nPs;sZ(xpѐ+ uG4߇s>=%s8Vo~Q:Ot?5'f=tgt%_4-9 \GpOϒE7s0HuLcW@BT]nyKfm-1V|u+fÏ'76g#wv7 /F)ˇ/Nw'gH\Ǩ^_9]>3OPh4\JnxIA4]:2p97i4TzYSFMa,qXKAJ9%+dDFرDBFt(LF_2du"ၝE9*D\5A5ЌoaZwmۛF^wLꛆScX6K+5gffgUߛvKsn1Qδƚ*L'S]+ ~)WOK%W '-3 YP- VhU<įV-"aO_*}3nȽ]\g=tr ?|[s*Z9 7ݶwͥp|xbhd}-P*vsӋ+I4dʢ|ciS;<|ʊ}帤F9}4d^v dy֨A2 -d8ߒS80DeDo[Ā=9io4gpìi5߾L^d)LX&s7tsX5KIՃ<7seajEo9'F^1# L9>kGYܝf^LMR_gSduvmySgOOgr[SFL8JFQx u6ʆez>z7Ʊ1ɰ]5CքяҡLؤMf)7&\ Cʓ'kyD=X!.MXuutpsر^oS*qT8l{%zT TOmػj:D.[>*VRnBU~Q{ڞy&W(Z ɮvk: (R,P( 5\T:%E5 k2U::fgR޳!Гd8m/St=Z `I;BVUafte 0)/p!cUJƧ7ŀ=d!]3iu+*4ƀ3s$\(Rg EmpX7yLCZQgin^Rvzi{U{|*͖::+wiEHaWq9UuOQQ=>mLi\@WicUu`̶V^eL?UITch|58rTVRmSTQ+Ř~cՎ%p"覫!VS`D/\d߄[ Vy!UEd…[[Fص¨ACV<4m,i)C;wf\Nr+K\ ֊lmN}W͠޸0Ӯra#2uSǼT!z؊?n+ks~WV_Ww>ҁɅRSI?;|Tɢqj5"#k U++A14rFty+INy0MYcXpdW>q++Zbmbilˊ]m`A Z^Lޒ|Xb"ku~pt8Bfx>[&cf0{ ]3 ̟y~&H3P|m][`7TGYrfn,kfx/oK_ *{t@2#g=/{Lg5S?(lK?òc!_03 γ%  ɰRO׎- Sm r;< ɪ)1Xɫl ̊%"a  ΘG՞v'bXZȝ܉l fm"&}GPX9{ΰ&ߐRasfW1^|q4t؍Dӻ'w'wTREdji}GU7c..}!.zsEmj1ݐ=0Z,SqK+J,q&ʹV )A{07Ы.B,=1ydq޼΅mIƣ*? 2|*0VB'G!$hBVa{(HeRzq#.Ob{o2E+RGqaaalZRJ-[~[ٗV-Tl"C",zw0gѬJƩ7+fg<Džo*pRGoҟ&%c^~[$[⑩.wػ<Gwąu  aDZ.n&EuFC~L_3ϐv5䙾/\! ̫zBkhy8! GJR^ό*_4>Sk6 A \6nLz#UCر-Wwa HII? 2Pj&%v sh1[M ћr%݈$wHd~A7ś? WaºG~*|M^nYRo^zzj=#[ۀC^WbHRo0 sdy46~ZC7{Ɨsݳǟn 8d]IU֝{6NJgnys]7,m9F7 |s湟3i/峹7fe 6ʏz&1>+aK;i c*kپm۞Ρѕs0HzBτ =gWVOR>#9~Vs#y nIUMR<}H$ո6K.^P}M̓XO__ ,!0rI]^H@Ld\LӤ)5mbIV-ZP+B35p%oNਟqoD 6q+uVhYᔅёBVӊ*b Kh.8̲6_^ddyԠԘ]B"ђ),i37ܿM:_i~X@,-Ѭ,}pa<2 8<|{ޝʰ~Ő;,j^-@d.=4cj u V%]8})Ϸ$'*K X1l8HH̛J41E!gy,U=U=M5账zGV!=G?l^3B_nevMIYdkۖg5:ñlfpl\C l;>mJ_$\?7wj=zŊq }Lx {oFQ.j.ZM]ImnvQ{eW`el|cΑJJbLsIR0)- ;UM*C*.T]< z]ʗu@VޗSޕ53J'Grd ),ꁪaWwiְ] "Fs-aאbJ:Dr1I'.J ]-[|:j6"yFvju/cYx|P/Aޡ\(.]VH!O6qrqGvX?$K q3̘&丣߹|d:dnI&.BZzb@ &[1㹞~_OG>բh^Q|w4]`]w`増s^toǿLψu)VBlNux$V 6}yqc<$^GVM)$Ue_y[ń$`xK)J_Sn@6zD霘1-=F]` P{7>0!Mzm)?7?yi XyUUêVl9U5Qy,4(/5\}?o&,{w)3]:~@}.m@k&^I'%ŏqi%O(5LA١zjq ~q U@JX g[_REJrbrֿ|v e4LECލf ?_^r9-R7~'rfna@S4S`@4z9 Me`(x$ [vrQ p AW_v.L1@!Cd/;)̡X?x{;T?Vvavՠ8mrqFߦt>_A?P5(~N{'\:o_\zʬc<% }[J5<< _yR6$kj~FLtɦqNDrÄ{ x!E:0r D8ҡhWaY[pq.pQrFv: :&!=QΊPXǠ&e":آ}0hԺA oU{6:+D޷32-my,ͿH[>`PPtQZ8f :gA QV*)Bȃ&1^o)* kVy,Z/XV˸EJ?mN+gjGlч| }kC_s&`4l-B!W;ZmH5ƿ+qJ(l9@ gQY9O2]:jXڠUPRbTyq[T|,1%g2WZBbhuaI,{bA1٪DP놜z|$X>tBwʞNjaNn6~, KڠuXh}y=HЂh$ATgwLa엪͏1axr Jt<&5Q)`6/4M%gooj, Z cMZpLh֩gGdWa75Ł"֨VFm :jYhڴi6͛q4eMݰn1Bt\T1Ux;$1HkhbĄЏH 1S[.s Kګd:IJ, ~~=8pӬٻddx &%b(Ns ZFsE=Xx-9FTx ʡ6usJnԬ xO*(^Ffа4JH۷}wI@-mR硢',(1&^D +1/J_i^F"5P0c#ۜzw/]=s@+ܳ<4-#Hw4fEEixk!+T- m5_Vq&[A)fӆ5,(>,_mW` Ђv9t͛ Eos84*O{lӧo LjF/x^ý^&SP8>A&::ف V7C3!D6d!X|y:E_%7gk]&TmcVO#P_3k*"_/o>| 1r'X>ҧ/%Hyӳ>Zj4һT@hnu/~LyCaaU4Wi@~dyGZqi$ݥ9pC@&sr<>K1ѿK;JD,~t&@84 -9Z.n}:Εz#dh! ǥkO[:!]Y) tdOrrvP2+2*TEڄUjPBwKΘ =|Ǥ<3n魠*ڿfMhsX>WgON'$u7tAұAqh͌̇D0'*&40< BXFFV}oq|߻Gg^äkשGNrJws`ϏUL:J^ ck@ }ߓM$?t^"YSN[yļ+]p}LFY>HCAqpyM?x MzA >Dm7r)y蒾V͍l1ύ"wm_\s ɬ?=OMfR5UC ԫ{GeHa[y =sD RUW%Rd1'=uR(/_ 9ַܺI "%;0ݎb+MG`p\ {?sX΁RKV7M3y> sh)wdc yt\̌m7x5~ngl4mp‰Ѩ!k ԣIdBG4CBs5COYbjo۰8=vMa./lnMqfJ,ias2`0:{Y),fs~vAt T12?+E1VhcO=B@U Xy$c9h hׂU ׇL_CAkHq> yJ--?I'<TJ#2v$d1h0 Y!}=nbJ0dN݊Tl_9V9Jkm{\n.ӡ>AB0fsfX |,c:k;u>CvFގsZLWT xc`d```a<=|EdՓg_(ETu=O'{?Law]+tw^nD.}kzՇ 쯍U}ɩo9:΋;FШO;XSB[xe#2UoاC??✼ 9Xz{w> O3E*De[=픖wE:seI5oÞR݇G=SBPs|W+Ⱥ }[0l]1V~ٴFoMr;'O^gLyhol7/ӌrq3}=vCCHF=ǡv @ilr.r4CүVldV¬L[eN0WԿoϓiosWwz:zQYY3RyK >?+#B|Jzj6]@UD-Pv>n໌u;WOMeFYг\l@*!u?'m '18 >wCÚ\fMc}~5lmo,.}Yr[Kf\yBGyoC[ |EE@ \}d<z/ |x{TgN.iBdb!3iMe$׹4M='4ri!e}Nҿ1H6dHAT8T* HGJ%K^ 2 RYHYRyr*УBTq"(*ѯTDSTuT-Iz jpE/N:R]ɕW gKnl7wSGG{oxDJ=é =Ż7,5w0@N386C&9^5;J-H~i >j^+zOPu//wR+=q v@GSLLgr _:KຈLzK[w˘Yu:sGXK˟Qt8;*3 s3=6(T~G77L4YCٜ9񜋮z]%q  ϖ1TeWe}(=drwsoWse \迎$H} nEc2pϘoKS }woZ{/o?9w*z % އaa/G|wywᘋɀu}є<m󐼇O~p)>kyg{ü,Ǜuβ(MxjAƿݤMk`RADݴ7?MhbW6;I&avk_@+@Uo'cBMH7g<dE ,p?-QvZ^SJr /gp}oyw/xGY:wLƜle>[.1[.bq- uyזK輵mwfyx~bbЇ1BL IvQ K^Ik&LŽD0fb`0(JfRMdDI/DK1Z`*tMƬ d.do<UڨUڴMr;gzpXmk'F}FUF]=j;௲Ki"bD.xB$dy&_jQ>º\ՒO-9"ZmWj\DI滎SidIΩ+Щ})dG»2']ZJZrl$;2VznM"L4R+_ ek=~^^8D9yWy1E& ϋx}WtȲuUb'X̔ؖ,O`ݶ5- 0̏1}̰Ls~N$ݾ}oW))L?nJ].ucԭRn4d 90 X ư l l [ְ `{v`gv`w`o1P `8`8VL ¡pGp p'p pgp Pzj4Fj-hClX ]p}p5C!D0· B.KR .+J kZF n[V n;N {^AxGQx 'Ix gYxEx ^WUx3 o;.x7 !0 $| > "_/W5:| ߂ow=>~?O39~ _o~?Ÿ+ ¿/0bp XaQ\qčpc7psĭpk߄v=;N3n;{^7c XAMN~?Ax0p qgP< #H< cX<D<):xgxX:6 [ڸ`袇kCpqq-x^x^Wx^x^7xތxގwxލxޏ>>O>>/f| ߆ow;]n|߇Ca| ?ŏI~? E|_ƯWku~w{}?ƟOgso ?/W?_JQ2i TaQZFihcڄ6hsڂhkچDv=@;N3Bn;A{^7CST!LM~?@At0BhifP:#H:cX:D:NST:N3L:Φs\ydQ$E-jSlZM]rG}rɣ5S@!E4G@Χ B.KR.+JkZFn[Vn;N{^AzGQz'IzgYzEz^WcAv#(ot?StZ~Ayb: nN/vj DUϝS۫|\QHn vr3ot<ϦjCҾk5| lIuw9ba G10竖N^O踍nXouܾ sTSM!ˮnSV\ShKѳn~mX=[ڡ؍bZGNXv3Y_sT+N _L:>WGAhӲo{ NwG[VCɩrs#_e=oNgy5YVS&ufLD T^n5iY|^~Hˡgs;'MI#I3>+7A:p}=[|y-N*y.orJqQYX;(Ck8>koqDWpd5E=qunk 6t$z"cÎ|١(S cJ)0.Geɔq:-# $ Y=f f-YVtyXKhQ]ԗH e_`~(5TAFֱQijhr&|`DC {nA9YH61G&Ύm/% iźAJcO wtCŗ^l4b&ψ8WV/g|%%Y]%Ԯ{M>ɏ63Y 8Tcx7V.M\7r8G 6CpWlЋcS\Ha /r6z#^`ޑ5,Q!^ߴ]&h#*ZL>K,GҧK\w>5]-2䖠qRs#?Xb9Vq-ˎJK! <= "4sύ=qWv/TKkXedI$9GM7\@&SJ5H⁚+C%)RVU)&E}Uc|8L h,]M hR@dVui(KQIf)EU )4>&<и+RRb\kӵJ+ $J+ $0, ʂ( gu!в1tmZ&akEX+V4tV !6dZC@ 2dȐ0a zhL@fϻ?PUTTPUT*4US^nHKhĄ EE|Q_TEE|QĤ &!L bnb܊BLa)$EYU)&)K2!0XKb C,a IIHJ3bC` 1!f0 3bC` _FYeA!0ʂ" DzC7DzC7DzC7*0!!!!!!! LA)S,z.sK"!UAT!"!"!"!"!"!"!"!"1)DC"JU۴41kƙ")қ:& ]2XbB 3Kooooooooof)Uzu]uYzRWzB׃VzJӺlROi);y4ҼSwJNi);y4ҼSWҴּӚwZNki;y5ּӚwZNkiͫckIҌѼ3WGؒ;yg4Ѽ3wFhY;yg5ռwVΊS&5&դtVj prewikka-5.1.1/prewikka/htdocs/fonts/fontawesome-webfont.woff20000664000175000017500000022655013555143652026152 0ustar tandrejatandreja00000000000000wOF2-h -?FFTM `r (X6$p  u[R rGa* '=:&=r* ]tEn1F@|fm`$ؑ@d[BQ$([U<+(@P5`>P;(1lhԨ)YyJi|%ہ^G3nڕ ͐Dp\Yr LPt)6R^"S L~YRCXR 4Fy\[7n|s໌qM%K.ۺ, Lt'M,c+bׇOs^$z.mŠ h&gbv'6:smb1بm0"ǂ*Vc$,0ATPT1< ;`'H?sΩ:NDI$T[b4,μ」bl6 ILi}ی&4m,'#ץRwbu,K vm_-\HHH?m 9P)9J$ƽ8~;rn=$Nddn!';8'N!-Jʶ.X= ,"`: {K!'-FH #$~Z_N5VU8Fȯ%Pݫ Cp$Qrʽkk3ٷ:R%2{ީh%)8 ILK6v#,;Ц6N2hv OOt#xTBfq^#?{5bI%-WZbA ^1n5צNQY'S!t" `b3%35fv;lά9:jgf?grpx | $ eZ($w(ZrSv+ZqMݙm?&s[tSSj9?| >G,bDշ^^:l3NA`5 26LpS Aߧ/U ֘'9\Նt!l PMR9n `(@ Hy)MdM 5ԤH'ґmSuo9 1 tØuc@]KRbNv("y뽻{ cscz&p5,jn kN!.n^Uu@|?v>rUaHR ՑI DˋQ~p ܍;;nL$t : hFCYTOFNN~}1"`a(?H \u0LԵ'͔PbnmOJl?s0,8xBBF_RiZ~e#jwhOc*&F6 Yq{}?>u.4h%g`& )R5H}ˤkܩ'JOI_qOb'HǟBYEM6v5NJ ONF Nx(1:\߫Ckcb8Q d[L(el+2u-a֘d5;N$"HSFo2i"\h7IfN8qx#v 6um `NM-J\FrDZ0#'ꥈnGjLچXʌAgYs*Y^ٵ;"$hb=ϛ0vH-.D܎Yd +^{Cm,@N<.VMS+\D+R|6 'q\T9DX<$p"酦$ҷ ,psTbNkI_` FWV%w~DԐ*xiy[rZ[S%Gs`F<ㅣ V+!+؍9ykfb82s}l;[)e$Tk)v9{uut޳@E>|C<\4%Rv @׺C8\~)#k|.ao00Gq0%hp L"+>% ^MˊNsq=䦆K4r-*%h#%;pP馔hC= &)baKL@t!~2S]rYlZ63ўJoOV;h&gO5RT/}{AZ&St ͯPC0D,pbpзz) ]I>Q\Bl"^3R>r*C>xPUz}Y=̕}ж 6-`/"H o&DI0E2Xa-{5< ,}``6jiim'w5RF,ч%SYWh6L_i샣=i13YI7NCpIĔ(r0{jrKТo)l3naT1\IE(m߃Dle$ÅwXU(@Ma"n,*vG̨x>G Sg̉"Qvb0*zPEyɉ?7$ %GpdY&f!a6|);u7#34mJij oOpȁv8jx(K/ZdxŃm7V_\fL7 pXzH7-,(1KHbe,r-pL3=T2t2ټXk:Z5spSsT:.]D"@-Ȇ!A2ɶ-F}˒2BǃQ)tç|#4|\㨀`fc,#g1:-ty ]2Z~.)nj%RK(y`8C֍zK-N `^+n3ϴT3tQأ4<>:J0È%ݑZab`vͬaT/ZaޝГIi W1_>)H"p |7mF^Z~f0J^I3V!{<+OeB#BcjL\-Zh[I<qv~k]GTD?S/-%ݒ7 wi|CIqwcWx /7xHO/o]G]y߃#7b$tR$ ]a7FѮ,n!rI|28x6gSh R^^D.xMMS?漞'G#~+v4d!FyT9-fVa7hB4,2Ɖ&vTHMqp4?R\Xa<4@MiHD_ EgRyMlTؠJݮ yc"HJ, 6u/ڴyVnJn۟H\PRBd|4_$k.w™IpS$|}j9m|1ߘn9395qS|xW9BVZ!mK/Ln;iu$*t3Ͷ@}B{Yԑz2Ju@a\MR7odze7/$4]^2kh$=%1IB؃ H|N.[M\ Lb1Mg:NV._0,+,ht7l8s~IV^ N˼Mؑjك- oܮůQo[mj=rm>~z4$M}z sh""u7V{RûݦO-D9V٥gIʎKLg۶BTP'K̦ qW֒3ep&ےLhpNaS w &;e(,-7vx-w$WnXUt8Y?KMctY؃p*Շ-БfL|[nL }4{5頠3᧌ n$$,+DNԄ-HV>HOs\-;W6NM8Fi;7k26%֒a],:!ʲڽE,{U nawNg.I9r:jFbKΨf)*cG5-kb6UЩpZMO`$WDyA߻[4aJ?fD?=d(KD䴱:D/[#$A #KH.:x?%Vr@[B$}coS6`LPfM&ɔA<:vÚ Q~Pw[+`+j V+R*ul!|+'KY66_ud}_[yuۘjo$Y=yjRi)bԋLaD(XUwIڻZ$7ڻ9&4Z'DF[N]~dD?VQWͲ}vS>Nm+SqHaU!ΒWb_+UO]^l59 @1'A^mo:9ףs-N:tD-zkSja4rczFۻ ޿xv7[äC8#7p5+ ~*bJJYzֳw+-p/LL[cgnlcaPHF$}9`\ 83Ym1b>~ƽJ؂ϏyBs="f(zKM"H`wcEd:b86(9<clݘ/kg G^ESE)5G_^k߇ v̚}T3;6 WvTCP_k._eєNJL{T!6j>h0 #[㗚Kz,!32:6d>himE\=H Z+{6@Wʯ&lC',rX !8(\̭2-P8h@C4 <~Z7j%) eeFpZ'15 ^6B3nco#~²qR@!ա z^Ks]T@TNT ,S*@7CīɅLiQN, #:RѪj91-YPN¿\&yL8ӹ&0cvƉ\JA;Q;]IM8 sMf?԰Irr!K9я8p}Q콍g-*sm~XP0dM^?DdIm8eCN}cà٭$s7ۼ#յR{b4vMql)vOճjְr1f4cs_%v%lKZNi+V3'~NMG@HBb+vVFq@ݱuKZhp@E0uaSXdUK}ԯ8GXKiI% uR)EI-ږ8|1GΞf6Ȁ=!KF6Qf[X~_j\^͋^k`DsG]~㤛yo};+i%N}Q0ԥUu)M[Z`"7 ?/[C{l)$Mr|^ a:"֊a l>hya{2>CPL j?ntg]S{UӇ('b'fg0ӃLPAMtd)2úY!v&`o2P[ aޔ5 S|#+7J #ȸ_dU6#VDB"K|)otkl,lU)ݹe5OyUAt2_ n53e*1v(K_HvVʉ3},ACUƍ؂Cuti-]`7]R !zsNt&̉̄k)SL̹y7$ϥDJNd"9 31 IZ(^( lw6 /@YB^}OT~9cc]{)}D8${yc,ʤ{tAW3zHImD4ܤUT3dID) I۬.d~[ -K^2Zc 8u,Y^\_ԁ_+cJ$\2:ZW bBw=[1'NYVz4;(fzNUf(p֙!x#L=#ŋThnba˳",T\o!@@sN%| tXj j Qo5oeF)o 9˷:h*'cJ孏[{ȄNfnz]8F/|1v g@J:YնNu:dhHo tM`R̍Ri:|N_P"B@ m`a:M  c2Ũ<ؓUOS\%a\Ap ꄯe\A.̰{wǿ~6 ;s2ŋ`W`TyPgee0 00}/ǔ;h[tGD5^E#hȍ:f? u3z0ڎ$T^TAhz x I{5'rK zo l֢,b89-:G|W)bA5G<*ٕ:ğ!]gj~O&UN뢹8 g ]-WW(WNI3Ngr3|m m'=[n힬M,?$HDD-O?5uX]˓37>*wg?*!JyT@ UgzI_7&\tH.YZ(4Y'd T Fs-qya7 [67K&J/$c/x[ᶏ;Īz1Fv]G'ڏQBSOІ$y(TS-;hűzT%Dts"=gwUuD?b$Zr9G<&Ña^2_Be;b~փ)Ό2j r8]'7 bChTd )+ mD).51-|Yy*oڤL 4A她= T@|X$in.KI|R@P@P*ak@ ۟=I =l[ג"hX0QҜf˒펖c<#9`|cO}$o>eX<`,o_K3 p{YAn[9M T(!"?Z]iEm Ğ>'{Gt *~y`'A?٘#)o($ȉەLvYO1o_& .mv!*)$zmrt(:GGbeVwi$CO1 cZZ0G 7z@Jy~p)g,gYL.$, -<k{yc*02/q1gKM&R<7xCy[Mʛ #ͺDya3\wfwrFĸM] \NsWݍd<ӡW064tȴvȻ0>ԯ ; )f#* 2<h ~'Bw mH/wqMog C)̵67#BS>_-[L|RRlQ}\TH) 9Fa"^bA:ݳQ4' =sO '@.Y&8z ,i73y;U}p/I  xVxilFZfhXc.b B*|&|ge/kuv\_Hb dpG/A}㬬'xȜՋ;E !Wj{ZI$z{Op;x=׺q{5l23O =@jj# GYTn>&ެ#CBϩzLuylSaa0LTv3,2 sdTrU}El1z`Xa*h{qiuU\"Lд@TXRUFg]sE5V0X/ukzB'كJx Iz7YΕ1tyΚ_}|xm[xJ}zlDVrcsdsqv[&`oUl?<jC! OeqB=J\`Lr孈d1MhowѹKiģd*;^ҋ$xHUU`]GkCꆂOQSCwo g~yG8P{{H.$6!}d4,q>`llUMBRPe2A1RHqlBQ$W%bhBÚV@(?FAQ}dl+bNIMdT"+ƌo0`89\|5 ޣئ(y jqm(<\G 2dTP0$n@ Ē!X 㺕Nkճxikiݝͨћ"0?^2XF,{sr_e@Vyg N_iwq;XED\b1G(RsT<\ډQ2tT ; `[,AkKbDl#b8,]i\|kCxLq~r Ά>|žBab?aag30( j"FA*{ߣd]ř+XHzs ZSLu:˅)ҲnJEBnS>Ħ mh,RT~}9, /.H~!`ExOۖ mwIl꧴ёUzzk**|m* .?~ chp?eY]*H|̛1e?V; ا 2PQVlW6m5O3'^x,ҹa)TeUs10ft9T{!L@OLtǽ!^L!ti ^:CR K ?2TYx۩Fq#0 <hѭ)kesaTl x9d%+b8XZ ;gv8 n7ϻa&^ob{w OO7jϯزΞ,~WYػqÎzVoλg'5("ե AӃ[:P|Ӓ+>#2?$MndueSJ%e؞~Uq ޳҈zRnп,7˱>` /uFgOg)PJ\)Xk VF"\tr#wE]s:Y#n8 Lm"6D VġH`Q ௢үQkG ]<2N?U &|a_G܏}di!:`Ⱦ[\,Y]JϹߐì~OA%> ]2Pl5pOѐ[ʀ4O@¡,Ҭ-,4X7-#?3{M·C18aY)M"ka_=4JqM?nh6kɜP  2;3 g4ՍZЦөGZk(m pv riZF}i:/czPuVQ9E&'/ v<2ۊYQ)j.HN11sʗ؋{ '|klT%1ꪋCgQUJ['Uֶ̝ؔ{81 rnҹ} :,й6X7fe' NM2p|4p6Vn듁p&S=[- ߞ~NjIY/c`YAq6-Y30#V~hsEPT;ub6WD#N1o>)ΘCx4$/jl1 y./,Rr[YE*GЕKm/|7 SISƗqF㍹6:cVs @w+k1caíw0 :Y5Q" +g"%*2t`Gݴ f:hN33^~yө)o)l*H-;+|+[-ZGXf~Meb75[ Ho}pi8;`$7~Yw4RypJs}!*Yf~W]TKV0Fyl$"\AE?W ,[b0q.|xZ/ˁ]P*4$*(R7L&`goTܑ.$V̇hULHnei_"o߁e*mbD2u{ݹш ߶\ؿZDܚ vz1UlRl-wk2VxՑ;؀400=ԑx~޽ګ o2RmԔ=_rZ&ן/߸([C{%b[f.\l$}VچU*B3lRPf d'GLc[dN %C9X5h _ cҠW?+`ރχ#CBW'B~cb 5~}`AE((r{2me5 t>`vd, p*=ϕƼ' o$ݥ;f`̢tɟJ$HZKԊk+LmR21,qF p̹-J%b=gV^y~׼0~-Pת{ƛB2XZ?oG!xn.}%}Oo _?bJNv$bl;z`&Kx^]"d+g eI2 B#(ijNN>SwF W |b WoW^\q?1>BL/=iR,cykWZ)BUkjy4XK, 3 F9pKuշ q@OAvyG4.,m#D"^ѣ8lQZ1C\4oJܨ힊dD6h[|L]V~.:0z*HX,Ͽ7zUQNe.7$:.0֣Mj9g {2ڬCO墸N٘@.W1Dz[[M%V5r!4&Ur s7%yNJ(?nYm"TCMmr.ݴ{bSNT]*}v`1^HvNoUۆAS6WOىe [(B͝to1bϫZH{~N}Vˋٹo<>#oTFD"%73.(?f]`!1%UqL:蜧ϸ|@8'+VWu۠0 } +T/Qnl~c{pa=V:#vm~1t 0SPH]/jg/!{/c jh[=U@ʍqIg6Mmq%Y8dc`"Xt>"{riPO?0=/9FnV}OY[՜"I {GEz `)ӇrOoKY꺧S4;L'>cN@8 ʋ{삕zb8_xV(X"]ΔěM6w,fgf+͜)TJUt> -]z}o*mGŶ1S<۵&:QzHjljL F,aY"'LˬɴbJp{6իh]m E= ~fFvE`EWinux8!GVY??7K^+[2%_mwsZMZ?vl9fO {,'9/} T}6VzôvU[dT,_uVE+B:xaY.L4rP1"nj[)Xs54 4sS6 {(,kW :Dm3/ T*z'1o'3ow|Ћ=Y< aDm?F_Y3f^Lff'@&M7F0{GTB/fzqc].L.In^Wk(hc!Ȝ|%?%\6Qn*0''Whĩ=ŝLCgR񛙌9V玫؛AӚTQyč&i٣hQJ,#|d驺z|yYH{FI%ORD&k' (kͷ_uXT4JotǠ`X l/-ԩ TBIjԛ/ Jn0,ħXBUHhFe% 6% /:&zLldKT ^Gv͊SA4:DIʯ< !.1?nTzhԓ尵 ZBCnI~+sm8T=f!c(KHSH7!LS.D4$~]ٴaGsiK7"dϸ}|{ܰQ7r-ŷzRaV]v4t2-讨YDیS@%_B(FHke%&5='jF,GoW9;(ڤX3z`fM<~1bR6t0luFIj˯JoIqĴ(cǘU@Ѣ#e&Vy( {̧KuWKeZ ^>(wDI߹}x ƺ5gYG22& sσ!q\ CP%U fbS'HLbi,sF67߼D g̣oGa)jS-&>7yCCΖi]MR A0 KfF=z ggtf7Kx [ L^.[ԭ>Zc736c͗qw*CCV<])E9)ϛ0lSM.$bASHib%zqݓV޷ʀ7+8{ \HAZ#[80* r[-swnxP+HElY./k6wKb?88GI. ur޼l9Eiޜ`"ƃȇ˺&vIբu*J\[^enQ%j ?{nW+1 ZC $3!6/SG @4ΌE!Rd8hg?J~u? ZiD4K{j%)'xMaYvkEt,lc:wXk||2$.Ey=x*-LM_xC{t4.<Pr͙s1/N8uu.ӿS_rj]\av^sQ ZŜ-DuSg6{${r25>, hcbJ֊?${ouo>ͨvCl(N9ߖQ]}3( z^)(Үe}E1\pB(yf̷HY/HI;,q«=d&T<)3SfV1ړ'vhD n$4n'r}b0DxoV UJgIN}4/|ߥ\$My"j}jib!NӽSBvC9wp7}5q2ѪҴUÍ,鼁I};Y͜ȝDJm[Osޥ$FlX~=/_SLJ&^( qwv# ꒎.P:bBfV2qgnٙ l8VӅb0aG-OTlO=AfWO׭OJ{̑Ͳg k:I3*zA$̊kP `nFGx)GRPE%5\}3۵RuuW-2G%voMk xBuFN7ׂkV)12dB!4 . N8O,f2TiV udLzyug’;Ks'^y+7UUOBж+$%O9elե*c@Fc6ggMU_~1fvV5 -V 0 )_D{Գb1#Q|k9=?Pocs$&}BoWT"M =Dy$,IN,چ wIxE6xnCC-,ϕ̲Y :y~ʝ،=Yc,TxeqUk*OTq\E*/ؒ/NSUf:b?īHt$ٶUfudH"$2kQ /WiXNx r6_y{?2ڽC~{u8|܁Sf+{30`wbcCQ+zƪ\T-{]ξ6Ѯc?8Z~|&eD9qW2R,Y+y<`OwAbz6|]:qZOVgM̥ickJ0=,4,am"RC#,c fZ6RcGŢ:)e eIr6.Z;P+O)$\wIV(h`z{%fpxl }onr 7%ӧ{ xm1oВiq JO'V!"=$ ї4KS+&Zۙ'憥Y^e~},x'"so߮d߽}{.kTJY;ffjKVB+jqMWL"e/׶߻YfxwI:kIq.DzdLWim]ɗ] f)B{lֻ`j~ކ;ā;~7-zAX'tbWO.$GS0Ra#QPO|P[ %`C)c"ͽdD1xp_s*5ac]܎*t]8Ju׷uO աH>hLkq7gR2,ʪZ]|$CZm qX LrSKb홞%H/w>G9(|vvNnNvX N Ѐ`p+{(u\ sQp ݨ3q\͟$ﵧ;QSřz[jl 6n 8DT}㔨PE %BWحYw.!/^mdSZ~j=*Qgd⨎0t]q-.PJBp1 ثatl/ypq{~TOH6 uNwY| AVrwDh4Kk+ /@ @OJZB1[?l{JՊq9PvoY6CJ$H`7Ei)*eK؂Y8{V)b pNv/A%;uh(w̃l}*4y|uV:&*P;LQg*}OW;xT!F[ o l*KKUvܼƌ٫NY4$Gd+3$KVZF&FuRj.GNۖ5ƴrevvvȬ2MC[)|eGyb{)ڻ.I{l1CesZthɻRæGp7?(dW^=  &fV͞iϟ\G6$$uP=ou87[%>`<.$MtӗB)GjSQUd`S"3ɽ}MױT th?7]iEHzş|-tdۑ,:Dj7lD6٧-+}ZU4^xOݼfQH U;"I{)1Z.@2󄖩b+qzV s^>V[ŵ-5v]蚮c""f\߬<ۋcy#Qj6dr#ȑJ4lO(yN}$m [-|Ԉ*S\ќ臉@ @ ie'm'q$s'B੻Ad).* _y#z_Ы_{_a_=+䊒ӌϞ'Pܺw GJl.rqZvD(DCG&Cر!=ǣz4v($;{2 @iǘupcE  hh s> L^fڻw TWޟR /_IĦM'B.,P-Hj)%PDp2^^w`K֫KPa>ξ﫥jϨg)KSټdGFYG$X` 7%ҀcKQO"BաB'^.`";GleԒO^l:Q>45e=[7$z iF\*B'ǝA koMFc3|Ӭ%v>!]€'! }:xi/xcR^WICz_`~cVFvf]5OnC?ҷ79']/g}փiUIȃOt̒?k:[>TSiE<7E-N ؐw;mDu[z+9g_PO$UYN[#jI&3\e4n)Rvcx/VC?Kg{GX"b(6 ʛ| RrI&-Nձ*?2BpEYP [.r?gOh/%lROE f N=d&u_qb? X°f:J/ }?(u6P"L~iV-g1YBg  }HK24鵖r)ۡ#|ti@@JR[k xcE^I2߸dVoqPkZa2H/=(c[lW%icXchPq6cM? }iShRm]6;?'B}gMmǞCj,vԱ>G+zYl?Gܦ*{.m7AT^1D";RUr"bhlqw$/gyRmZp%0Bϝ#4b\q0n N]M J},QrQ*ͯA\')yz'KdخDWdi@gzu'1\}^qI<>e^h)Q*lzBl? gGZ0`~9/ie+UrWWs6 g*D}zyn+ህwUӋ։fG%!L[#"h2fmh|Fqb}*H#znV˴]xA 1mk ׂV|=@=OBzPd5Vrl$ZՄ88^Ϗqp(:A6J5PY2 èV'Gpe᝭\hjp1awʓSA$|HE#7ч|p* `D]ZB-\6iWẍGGG׮~YJT7Mq^#0õqb0KVot[ Ֆm^k k-dpݟ^ Jd3ݕFFTϺۗ9o\S8qk"σxL_:PLh0!iˌ{8:zE  Oy/Иl ,)GqQR`\ J>[ip&Հ@ $:Q8Bt:@`{>'aޝu99'LcиđHhd͞YGf/ N=Sf0T;WJ& I 231kÉr`}A̶d@ \q-9(B,vѣALXqH[!f-t|nPΤR^bGOf=+hWD;Kfx1^ U]3@jK8{V. "k5hG¾pC鹒*6iS+пu4495dj+ KkNqBM++?{2MNJVu90$#dV/,) Ak0Ƃ^Fߛn<%Jvq$d @ww?Rs D1F-_E1}zcƝZh[$&DWx&fe% ~) ~XLt˛҅JK//(F[ KY=;ؕb~$Vd]8|bJ):v 3RRQ}˺O kUP}SV xsQro3z2F'֯nN?{"]1B+յ ;* eO]-N~2̜u%l(Zb9Mh]Z3')9#>*%)V`leY.5*D~- d5JZ!QӦ^fP/fj TXX&(f!Ý^g/j< /륃S'J֓5V^ ߟ^m{2; 0i7$&⩵ӵXEOSx5DZيt"hv_CS~A$<@ f\;Sa)6C_Ί g0(4i-k< #5t\CCh> ;!` 3-6htD]SeN }}"#Qn`F:>79$lVe~̈Ja%q~ܣ˴^lC f+/ eBa<' \*FC;|c ڀNf!L2i~<[ p&ѕAknnr틧n&fvnjn-25(!rC~D"`\T'j P`0iO͚Fkrfuəکj\'3!BIElQ?m12pQe>RwتD.ۋ XN#'Njjо4!tK_fR!@棼CJ-jaH* Np@wV[; ➄sqHlڜA?y "j!<U?hk1oa޻e8S1Н䋄!9hI B 9Ko_([f0o! 31C;XIh$ɀ禹@@0Wl ]&)s64wY3c.Mg ^1Oqs#Ms3ZNLMi} 9U~x~{$6FɬQEi2WvYF AVl VDXer(ZeͰ3)\t5\^"rШs wP5f7NK$f^q{"L]z`@DQh6f~hG5uU7G~ .#3P TV!nژPf6Չ>l6 9@Җ5Ϛ62t@7 L2  t'ԯbHԼwWfɊ7=.=bx %d? a 9epHҩ K\ۏ$C%0 ntv:M`᳑Basp& )"-qc @Ibk3ePF8ZmUL((qP05n'CVijɿX?qg^:ӛ[[PV8 6=Iɉ(cG@Lb!ll8߬MvvVbq~/%Ii҂ϡ֣T=!BPS:muvPsϥ;Z|s,G:pHgVuZR>f@e⋮@F<6Ͳ.L /)X 3"LN>^m w'>\C]9b Jn)snt__xEKD B $gYAV>g$%L0L#{&ΝFtd\P=a4 8"<ܝsL^^NEcvH-_>֋;|+c! 8O/.规Jn8&,%st]6( kH6 Fq#(ۉ[y{0(^ ֿbףŬ &fzCqI<Μ$((h\EDCc_x/E.:i^+Ο1צ҂Ji4@`lxNL$搘6T.?4] X1h|}g8<1Ȥ< @K// 5pלotpa jtbE Ey&Ц4`د$L"Jvi ljZ%=')8e`8T*M8.w~\(Htv r"jDoGG ilHe%ia&9dd>-i lMܰTA$VHG| $ :1R s\Z $Pjۇ]ًg8`簆 zߒVXݕxrtX/Ap2^[1~R{뚬ɇ:kCU'5n%'CXP06Gۮl[<NscOFeQ-gi$RNo7Wz _t"?z6y/H}ё{qL$ -a[st nSn2ğ@ѷxHNp2& 3 fx) WP'h7f> s!;p&QcN>OgdHE1u {^گV}2@JHS>!~L^d r5/GyNW-`ɚLJ=(RV2ȏM;:-A0<Ȥ L1L~.ܤkgLinNdu'f]BsLA5ShKvvn-_e9eV"mB:GΫxcZX oyHKgT~cN¸OZK:bA%9C ]oʗw1)(t^?uƦ-A99NلL#A2Yu5/_=fqljއˡ?uArZ]AX _vM1V&P\6X2m7䥱[lҏ'AQ6R S Q}딭SeS\D-wLrTC]ӎorly݂XJ^fo - ˰(X3R>\# 9VP饘QՐۑ,aeX#*gVTnqGL(Z)oMi!#ZH.$ɀW\p*ȶ /.gy 9L2p(#Z-)ijjԭ=0b`n0a]k2I)XE8fnDη%8CS.oěNg'dp-J=aYɹبNkY Ե=fNH^f<(|E(SL\>u4vdN~HN[nDeh/ڈ(21he_ʔQnV=CHEgi~%B15czŕ v >aY%e&c!pIB 8г]~A-l641/[\\Z I T4Waa8'lxRYNej3:-:G6vad$$`M,ܔCz3!q1]Ӌn#xBl]K^t_@YugSk]OƤ&v:NaLewɋ-hY}:xi O x|+^ñCq%]{[[q" x@LupՔj -[=ئ\ ejq[%^W'Hjyc%J8Imx=C/].&w4D,Ƙ3"z`U |M:3Qc!_ǣW(WjqS#f(G4GޗI>nڄE٩^˗nHG[M'C&Ǹ'orUmNݾwJ?6\AbGNzŽ2qXDIa'HVT으Et|G3( oOtrJls<;3)YQ`gw8"o&7>cѭ^@& tT}g$}0hh)GTsy4r o MH; Φw~| !( ad" -sQg#,1M|/uhR-.k$GK,݅1a=aYPA,q%! ONzvN6^>ƬAvJFӽ) /ުl̒B3GM'[,n\\kѣ m1hmo>!jM0C <埵ߎ\`K|_xN`ǀpWJ jHLM<_=CM@Wޅ%ꉷdžf%Mnp Z3@>'Md Y,BTuJ:o>b^չȑދGx_W`H "=ϟz&=@%ӌHqixDHXxjꄯK |@QTP+:uc}ОT B5ڨ81hȩaFuXLc[nNרxtNDX*N8s7|2 R{>}78.GyՂOg#Qq'g fKY`9h2„6$} (T?}A`78LHFRG EFJXw!SKr@EKa2'ʌ%v[؟[7SFjj[5hMt,^i#Coq§ZeteWip_t^*>VlhZQjXB㨪9q7@'[=eH+^їa/G6z<6)yжDHwFv2nF)%d.)ەP6^÷r {hj)ϰy"T㝼jMUd΂Mݱ[Dg4{+ݝ:<9qAw L}A=£6۠evAu+U_Q3f?R\0R R^ ,VwW2`A vG<9 4nX;? ?*uV0{[4"΂,qӼ? p}_gKB_ %_g=Ih|.ݥąV^1䓺0 "{7ms9ꛦBNIpi{ ]J :My%uGVց kkpyjp:G]Z$0 _N+M7Y2l @x6q 459OТ}Trf52k t߲}pU\ursVlתa޲ }Vm~3gm,\7m}-*,EHq$Yx=E_V'CRiND9/ Cbx@8`2I̪,!f݄nE8b+Q2쪘CZ^?GVf砱(BIe+9: A  v4RBH zѳy|x֣W?EtFOܔc=1E$V(T} rY!HhQ!.F/ dիG0;j86t 8y QG/Za3= O_ؤJPגIRsZ=|ڼA##su曻;..tש:KIT'6m7":sbqyL@Z,Y bg,n{O;]ɪ!_"=cӺdij2GBX$|i!*nT%;*^3/cEs4CwLj})<(YpHwW^HL- vpđ@wПp̹UK>1뷀L˾f0pΎ=_! 9q[ƭt-c\ @q]CAJpPao|ylN{F*3FxLTv0ԛV,jHA(\xxtP R^Sh"HJn#_p.$s2iB{TuZK t\LI%* P={b"UQ"VR} >Z ŊNVݮ-Jh σ ^ ;FQ,*+""00):;:VP8*e(7Jl0oHe^Ɗy%`4Y[eX}6KJ˩^#<ɝI_/23-@l4`P=K&=.)՜XvLfo BG]ޮ+؂PyInV`k-~SddcU.gƗ' 1N0P!ίH]Hf[Zx\. +\_4bOv#v!l,x<DxIN-Fe,/\mdPyIrǐ&$GKKև1qzG!A38̍97U;ȴVeg ݌LΐotpR# AD䶅)m"ǛX!-ΜaR_});;6П(o:֔qC^Ǖ۵A=zOb d~hzn/J~ǪŤzS,JJ#2ŭi Z~_{c]obR:v:?e? tZ]ָՠgժMk&zzq%UCW\Yڻes7ivZdTVQC$mČki wƿ#;̋ %yG8@5:yq)|⌬N=Bց^\S8]]?{rW[-+Wq)^2-KK0g4LҼ&OSPdŞ-m>nxQyY崎byCQA)BD`<`7%f"Y>ШG]T}_T,a^&xԠ,v4EpW¶SANⅭgj)&d 5 4($sDBݦxOhXQLw`qnPsTs'@Tz,2J*njވ4_}3יjҫ-%i POF?kjS#G'p1Jmba[2?kKq!@-^Y97*o0iMl=ߺ(7g_ǙWأ.. pk #c]@qos]vKi]C+K6 -/'S{VF#pƦuO&gzutxeL.vsMfџ@/)uA)0!۽)/Y_$mU?S^ GqVċj.vUH0mǕ*3bt3($F#PhzZo\d沠pmL~L jbmmK qsN"Q_Qh9 -㳟CUџO=ކy5 YkN.eui#uڒࠠp *!C_߻3Qpazmg- -k 8Z莧YPdM`TGhѤ]:dVNvcW:w|kҁ.:ӫOڑsw pT %z΁ه*0) A&3PPQ_i.-Z!%Ttf3k״+f6 6mPяH4ׇ2 umMCͥpm*Y˭9_J[.9&,rHi߃8Ʌa[Nnx J#u:nY}lzӮ^Y;zӉ1`7zv/_眓{='T `Jټ]ȇU)K{v[՝y`-0-?^[mSƐ=O#_DqqmR0) ibJ}I克WTm Aj/bYFNGuc\:i%fU,pIp ^yBcx2 Vb6Nd ٍәTlW{tĈT{S/QYK7#pQcGogQG?e<tJ83YިF^:̊|ʚ8`r}QhF4뢺j":k2;k.,&zTIFTy=K;pr$Ѳ8f_TIV[[ź`.N0U8IY D57o- !mv9\/KR!6 b\+'Ie/aFzͷ{P|w4ej-t۠^\SK+'JRSf4Ԗ+e"Ӄj\ʌE.>p!\B}vچN!"fR0rG߻* /J6Mn~}}<olϸpf%n~WXUlA!ˍ!ӫ8iD*z3@EYoJNC8f,R ƏmwE(iwLe7xЬ2Lz B,'\n@Oޤl os4PcXY }tp- yC&z Z`7)T)0jJׯ$7 ۷oUckwY;8>+g6w&$>ނu> VZJg˿=>Oi]@QYOƽ AIN%F(Y99JC4Q@J9u3p=0A1 ,^>(HRBxLԇj-ap37ubNV4|u砋ale zJ@5yCQ@RRqO¼p1Bj*O|O ,0߰ʹн,u Hs5IJR(+FL?Fh#~J1 p)O"-Jq Ƀ7u6(ۄ!P@>Á1 &'s3هX,9Y|sACEvp|̺%37_*xC8 <"'"G!£V볩s&<6D-mttzq5"mJ}_(^m'Vs۴F>}*sVӇ"m9oq{o! <]w@a#aYY}i|#r\I _ߙW+"푎Nܞ0|98ֽ .yfnsˡb~p*5E#s vN9>cQG!Ú8Њy6& -2~Q[aṖо)5_[z_itb(߭O=C/ P4? 9T,1լ9"fP]SԜ(0v4sJsbnQ{} #@ɏU^R+/6' Kh-Fs5XޖXyXQ3 WKb"&â{[mpZֶ/ʲZ[Z-l$NeWHWM_ Vӧxs䀱X )oC&6lktIp].@?wShs-$9nP[pYӲG:Etb&< E_p0JtzX B.R .EĎu-0OSBþm Ǣ]vd`ÝXP[ VC4O0&zu4&Eʙ'tAB%+DˎG~AxCPKZnRgx+i|oʜ8oqJ`G~ ɕo P 8yuq뢵𐠵Ռ=ƶT·n2paA/F[ ]+p^F(?ɬ3ggQ)ĊDLm4G;?81[ѫT> =Q8)ʒ5ck+gdRA|vakBcz[C8^'դOS0* )5r|Ȥ^?z}[SWUT}?LU^}L 6h8 bǎEڰn/MA66Mkr0.'})X "9O ~.7@3_~I*`֣q^ Q(Tߠ1``w2uՓأ0F(zcgsSolP8C4>@e1bς zF]5Qƃ/Y vAfGWJ;=yw@Rq\kK0{2tv0="w 0Nr DnJ`37%/-*R.U+[lQ7H0x/{džq8>6F'0*G\Qa$;hfEBC-`0)y[hʑV H2pCxQP¥9>&zgိ*+kɼ'W_~IPg_CO{b̖aշN ~A'/I팟o" ܬ*0wKOLxi1M*ˀzܗ{ meJ!,O'Z2Nm:ܢ*G`x]sҶ#fD\FIHw]I ?7#ȂU.5w5ɮR?70:3np&9&VupAFsUc;I}!\Uv}bz:9y! Rξ N@)0ߗDd;(AXr[BNa+{?X/Jڽ՜vݶ6lҤgO%P (/V j>MTc74bɤ^~^()yIЄe7a'xU$u8/NΨ'nh贑51;^n48ߖSqF; Jx]]Y MG-WM_ KVgGg>W&i& əۣκ5XnF>gla⧲0x){8}>;|9 i 7?kNW APEjpYrҊJp7~V8o? 3#JF ;Sl6QAiCfT0YwI+~[kB41L[*;/jLAM0X}>.tغutjiZ6)udn? |n4oZ8H/h!}I>d _Y3rDwc6ZKجA;T GXKb4p:I9m{#?{X%CKM;E({vT6 LaY}jOѭTв`u Jۃ2f1D/MR1Cb @#^$yH"c%߀.MtBl7 ^]]]*eg^1: v"t2=M@f]M̟D_w`tјmuJw"BhO;ֽ.w3,eJVKmC2LCyӝOLU{/\"K h bxZLRiO(=|V})׾[[P[n26YK UL}W0$ڃR: O3Ij(ΒRօJ )HInS(gKp 2\oNya軚8'p%KEEgO[:*׸pⳇWFt!Woڧ"˲"CրooBJd;'K͒__hv+ dލ 'VmI.^˅ 8BsfG08ռ*ʮ ꩐Tҕc6s~JimxY~V)Iƛ+hΜ;]EBAАQl"U,C)'fC{KD]p#(^ys==UjonlVeuiJ+$dU#;O ?92 <;q>o Trx& ['-xp0j[;3Iw6N?;K9YR2vrD3' KgՂ?h?r_K& `t͡񟞉y7&.>tu4ߛG :^MpvwڴYz~ڇձM٪!RWd;# ^zʈQ t\Wy\OJ14:5\ SXT ݓgvV9UkX,miM\(n>EI aIi_,( ;.s)=5AI(wXg}4YDp4{jq(Q ̷ZJUZfK*xC~p"2r#$!JzZY.^|h}zXaIEXgt^4R{fLypᚚ1ި|O 25" tUAޗ@uRPNX1ZN/ܨxIQ×_y6EK / cuDo7դ |2VC f+H :`wiy~wkt@4OE],<ͦ?sb1- JAA2-=t칙Cõ̍: Ba;WCEΞr{`&,'t[8qu -(J]4 ʹ5ay hhY.4j&4a q'( 5sXGjWB~cm۶/.6a_A5+=d >Ĺ_.h8tBs0HJll[UH4v. >]( k9. UA:,A-wyʰ҉VjVU ^}|wTHӘ,Aq0;,ZD*#{lH7bRX0CduBѢ5d=V\T=Q37o qA̐AOlܿ!{_uD G_rkߘT^}Wo).8|gWPCeJx6N(~v_;ΞS?W#M˿^SmG θJQ50 i<&+;V=KrU e#,tFjëΓU|N'uLx&) 6wrroG4 LR gnZa#t+2>if!ϥ)Ǿ>0$&qqJY\IS(ˤ7^+'wٚze !e-ݙ{awτ K"Jd Ly"FջPn)ж w-YU6L8"!ѡ|Fj=cȠERz!z|%%N{9c׉S'I#ܳ&QFn๕ !JƄeeo},XM0cs9]e08ux޾B䦂@h~T$% ?-&=EsnϨf'$Є`9wvȒߖ$sNy7zԯ3.ɉA>c,vA?p-?#Gv˧hm,QvG=KԾ nk@p*;rQwZ*ړǤ 3νեwR-`Qz\ӧvch:pZ7ןg~#;xDtO|tҺ}&Y9ƮpbuU[]Tι#UFo~yեj`a~.;&\UBD<j5yуo)],+]*D89żmSTI9⺹"_KKgh&\^a= X(u`mgO,Ӊh}y$ے$ E[b \ڊxl~[l:鈼,g\jgY '&f)GL|ƭ*Qpr~;ZI] !q٘ >0S|_Aeg<28@+5 3gKp:ELBvKj:*&z0V >GXCJIOErWb$W+^jɒϖ6HX#18 ˌ5ԋ`֩wGU,03 ̵1 Q&g;!]vX~0a \MF4C&h VӾӗ|怙w9}9/HY1˚W(u2igo}9~!V7;:H xǗ~㲿vWزj w$kʪe1Z^W$S+ļњ,-3!cmh9% Q*;%_8FV(s߷f8dشgm5@@7V։!)^`#m܊Gk!yu訦(+q:­D݉5/bwb+bᎁ6}HЛm$te1-ě G]iܘ$Q:npysǩBq8Hr-;-cN*rJ]cGYucyUku DQ):4^K<|XEޚ.Hxr亞jΚơ-]eU6xbk_loⰯuvoLzA+$^ҕ\w%>[PG<2FnD!$Sx8;;(~ Wou\Ht*GĞv:[Lr-yGm k-6K=9D>GkaDl9*K2J8OsP"偙bN% pxcN&ay{Mlƪ3#LmN̕&>4wՙި|3}+e}_,,ALu[ϲQJ5'z@NԝZ̉ED@(PVdl\8N&,)I]dNY8+ʞ_wu⥊8#+1d8s6Ǭ}壯 Uyfc+!)Ȧ1[N}3ǮIGu]x~^ʔ4 qd[>,{1#^3ID=q$%ɥ:A*Cg R@ BH@!Tnwl˭a]ɬz5 {z1R&l\WџgEIّt)8RTp*YMڋFfR8VYbJir5Fč N4egH%<ټ njc*v<᧼ /Ujao.lGvAvPؠZj9IdAvƉ< jO3j5KhiMt|en*=-ABQ׍.|"?Ïs\Z%gt2^L#;K0>;!SSI!!H>S|BϵŵQN,$,J,ya>A"TSMK"I쫈+;;Ӽ[5*^1!;m--?wb^eCiO{*NC/.Ms'  f+vS'̘  TkOHLTpRs#2Y@2N6^T)u[>4(n#*w²Jb$ȤFTxM3,"& ܴyWm k!o , ˒e6GG\r]U2%8WH CQo娣)*[zb2nʹ.CL?gl2\#.WY`WG>r8e1jB Uq8`{l_d9)\$n +L[o"N>eYfC-\Qz%seg@% I^؄*ӬD/j1'$YF\(AЃ]xiZk$5U܈?ZN:5ZC'Zܤ}w~HEVN'O:R|J%ءC.^ڎ`g͐(3!a [0ɘ»#c]j)`rsJ!*jcf`o+ ;mxx 2= }JKo a XN-K;xL@@a,u]ϺU,Y;Ia˯%y\ #2"daE޵>P~?nŠv]wZY׬a)33t2T۷MN6=?Cݹސd}1y"9gV˚!Z1qz&Ww-fRC|K>'cwA?`6$,|Ckٝ0->\#˽5KLiTom\[کNJXu}ꕵۡx[@4u g@+"R.AST+8S3r P,qݕV^fbڝ]d|k xtQ ä=:qC/ѾK69@̦8ۃ)6mkϋz{vC Gv̠d lCȇ`hr.SFmإ>2푈n\y 3k43b?sNjT%a)2}7 I }A6m"o'iLII5y?|Ue-Ңhb=Ϫ۱_*'{h3ry":U@>q|J!׎72ZΝ ]p%},r Tāeu1't̖Xm٩X$:Dl>OKX[;4Eh!BAjZ<|:f^Oh5a Ku/bztw~8i$oot^3Q?rLˊfoInHiqUgg)Ӈi-aui4,a{ nY$HkJcJ8@t1Ay8RQ)( qr<'T2QUET ԫ *DWV-J(YWZ~]^oP6{ [=ʤƔڗ>!C/9kyyrL+>;ʒ[/ fn>O< 1#ryw70"aYM0Ib8H^-ri a ޴B7N9!gI 2iOB *{Ȫ!&FsSmt*Vch|ʢ&E=E+BJ&Q"/qd"8Yn$:W|8a% F~\\ =w帙"i4}BW3߬[o4Yf"31Doڔr]CpϼAylk7S Lj @>s%0)uA 9-^{#x/ަL[`0/(?¨Y)؛a wI{ddC1ڐGdj<R0*eYCNsI(~.D*; ڻ{VqS[BOl]yWMRZ$.%qj"̙.9*H*:HfcEpRoQ#"htL\V Of}=Q]LH|_~kϣ񏈔vrți&!*)rIb@쪖%M5Нs!N=3h%`U3yV| pk,6խ]+{EΗ\^yn۔.*QzMOտD'TS\0WU'5:#h΅A%EZʜ5bҜ6M.^qӶX(1]l(4AҢۋVXkv)^ۚn6eQ~q`a4ElZ{!eٹ Rfmwš|Nwda{%Q cygRA9zXBN|5ّO49_w9.fo(D\EPl~PˢA'Ǐm |)]ˍ1<|`){y?J;|Ɠ=J7MMA~weHb^;+4T1纲ѳ'ZNWRfZx R}Eڢu^} =ּ3CAlC\'EΩ).b.-GB؄HA|ZEy˭yH: $'Xv3&yVQJ/I^ '4ZY[}>ēnѭţvTow(kxǂ Կ^gWzۼr1k }Pc.fŝL@^-7pjorͤDⶴ ppKtrU}$gmJtAPv h*ٲ͛-Zv&dHj|4P9?]]zw wLz zЩ!.+',zb8*߮$jΆ,7bCo/]Eh+#PN: q͸E@G4+5|"E@8xy>XqI3%4&Ueѣxޜ+V[ W?$U7H2ܘm &{}3}`RU=}ii*"Q:, !86ܤP'TsrvwMDKOxinM'\W mFfPOV \`%~JJvCm8kv9EgfvG١w20$-\IMD7OۺrU :Qڃ1<; -:z^%qBZKQD{җxoe%*p 7|-t<^xأbT*n }ۙo˞(ﴲ\^(Zn3fZ,2:"n@{8,-^wQRE~ '>@^U>W5 %3#X5"߶縵mw #,,C8閅WO=ĻH7=ζ:+ ᓞ(NQxTa7$m};aÿmk.47Kt݋B{Z=+IwoN.R"kO5haCK0OP$/{qu[_f_".wy$8)"oX;34Z'G&o5gȬ [푂px$~VlYy?A:O0O.?Iv{~ lz]%xդ1G2 ͯ4` 1w^"B~<׎kh:&9Dɗ@ I4|ߖ^y~r׮ۙ|,y-nQߖBN"n%;TsB֭f =3EXX7W s i*(*+"AC.ڥ+:WR^mSQMz+ . sS!F]bZxL}NN $pgvE mA~DPh#.0k㲧on?֭l/Ox$] L`.\(P+:rj{x}cO#V ̥): f(ýQ ǀ*[յ~-`h1):ҙn@-݁'>c(>,U0.Q/sU*kޑR1&&;{=< QdÅR%R F@"zEG1M}<*:Q5 zW ՟DKj~_  [#Z/9XMFۇ{7șک+hsDf!!/y {ܸ=g0<)84TMʦzj^K"$L+܏!^\*d%\%Ns$Z:˼&,t 'U}~# \ɝ/!-mYVB-Ei8ɷ92jW][тQT~79E3SѧB0n+\q\Xh;edIx6> XCVrpNFK|99QPba-~ $GnX?:a.pf. !®Cf߄Z$ ݞ\؉jrvb1F4 %B B k"r,$$\7K5sn_ +v P$ϩ3/x>Jaw/TiXFN)@ԅAK$r>Gnc QR] ]e\C w^ʺ𑞯W6ު}LB|ұ61R pn=  b>@kDRƌB MQnh50qb9j C_~Poaʀ1>bשiv63u_;fj/1'y9D8a n+.Zfq>ZTΟάs6 wV @)w1`h |ZwUia{]"5 X MDXfl|6b3Z=cddž/bWOgL  Á^ ~Їo;Lx0e_Z,Cõݷ%"({>96?C`/}G(? Zi 6m v{L3Z[ax'96!12'pͥ[˔))L@ƙV~+r2ʑkk9Z 0NG25raQJ #+Z,OhO :X=`O0 ߋWݴcZBb4l’ٟsԳܻYj(J՜:qZo%9" ]c,:ZrPA<@p/" g][uoW(AǸ3aIL/)^j_s;_"KY mĄ"oj=1HfΤ;F U\V>{9Yc6J?x̀W0M-7ؙHrV2 I<( 5uywjBtA֏o\e3YL\ʺkl#ss˯Gb/kBZ0rDhDq9WzC8 @C4.7U{_\_}#!|z(12Od@C?x7 N.?yjvGCҌ"ʚYlC`2'%b[iܫ6hLF HO] M"U1P [9X |UB S~z|.4TP{.b9py-~^z \@JX`nbDWpk9_c,:2YaFμҦ׭b1DLcau"ҝTT 7+ovzӀƣ iO~}$f}e]Է99y26WLuS Mvq9t)iG׉06G -0I#u1}ŭ[cz6WŁ!-pi?K8'`PCrrp\B;ki~8߯I{'DʪJ"am@!BS҂ ?{łk}MqWW,/R+OC[Yw3|ck=} Qc;Y4ed6nگlc`,ɩߤ@7iM=Gs4g%rGpHC5p#S/ڝ* ϓ]6}NxErP?SrbO{Qph*LbY Sn /BZ; }m~9a4-h[ ͎ϭJ$1N&|'c䬥/ʺ&᧥,/94 g)^D/P"܈Edӽ &S#pKDD Ț M9B4Ge@f~޻;a~WOk CL T|;v)␳aH z=lyNS^xG0fx!eƸ.9\( (noAiO@ut:)SPU6&*Bvp F~[@]Ja0dTx͊ZС q0.W2v1hd-CZVA@Gñ|g;=E4'K<@|4^q |\V1p%[#S#F#-CI̥+\),Wyy:#sQP^,JzF "穼ƹ0-hq(B?Z{)6{oݔ2WCtˋg5T8,+Oe0HUܺvRrAD 6ř!D)n:nc a=2ݫws9OYV@^XI{+ #bWy+@% 0.{'~{dzr/ێlL*bd_Ecfa"sص- v$95]&,̋PLY$8>=[w<* C~$\YY7W$Y^qF%EAWQ7{EH2C)Cu͔.w9AYȓKcd Ị< wTPNwbԡ"~H66_0wnDKAANe9iFVg?#|ּ^2|Ś{A&X|[QhY^oG|#W*fe`-ޣ\6i˺.tu/^ykA/˙5nnמz]1Z[ϝomV95˅_6 e^^!MMHчVx]m$ՏKJM4F-oQC23q/T])<6.jxo/|CA^[cB2|A {o1K{2A`O F8;' 9ƀ@bR]ʷq,Vo<*l^ܫQcT_5?$U0_9׊ f)Cץ) יP["q,6 #acd$\ـݻgyZgvbԷaz8{ț}BhA{mD.'*KOik;D #/h;@± !+ګ-ckn.v$?:ܗb{azKޣdGkyVֶZͥ:'Zsg.O\/+i.5j>( =>v w=7\4߈y~)qNKss~9< k {doÞ;Z荄AR4vríḾѲʀ&_>p9UF(#eI|K!Вl036nLGe*6Ne /ˌԎŪjj՚we7r|т֔讞 AZSCr ֔BInt~-#ZVvLBr"9ŗ598Vxh_d^:|xmW(~ My+)#%ʂu~ޯщ*KX8[4XL{J.. 5|E^]sҝcC~L@!=Iuzmʐ^IU:d݌a?a2h/iy;nQo (& =X;-?vkC) fm9ҟEf^-MזJ=4o,q˒i^X\lX޳ۓ{-:V{??&*_i]Ţ@T~9{UpMXאjS雩W::@VVپ=-}_ey{Ď^gifhjrԮ 0(w90{T,OT<~ >ϷXVX8^tΪ/y F&$ZLȏ!DHn˃8mL:dJ'!c\?<ƶ}@}݁ "'||2_}W 3:}6)X.邈Iemś[:ޝrmL#hd c^o;6a!mLS >nN-j'9BPB"7%"J<Z) }B [Sgԓd%7 O MmfZdQ?8k 8VjW{z 5zՄff2!]J73Cƅ2P,Mwǹ*)5H% s9ҏtIT H'~icK"~X=~KH^!Oq& "^S9c*l`t122Qd @Z1N[ :H\t܆CeSSR|DXECydhp9@<(+$̙4;.9댋)5des׷z$Uf{<&v$b)K WTR8Yj'?K^GW{o%8dwJgMz 3.7S[^n?ԣlC9XdC?5{/{/{ 2D{D uwo̧ CjcT#Ț y+L@w1c@]?|K 9dXe,r755뼼ِ\\5A 7 [B~bs^wE)`sOrя)eަlCZ@Kgߝz/miM)|DRѿ=/|pzWPC !Uqu.fc^tX\ZZJ9V]бو+|fq,ҏA_/儘(# :ΓkQn~C <ϳMfɥ$<;eڤ1%iEUgq*;R1=XhW`VUr7.Y"qyW(M&qψb)cAnjIW4ytҝ1Q܃j 6W!hd77"N˴:CM\ti1r[?Ѓo{TEzr 6k?ZQ[7/V{.=ծ"+9= KLe,`S w9oW͡ɓl _G׆aR0e_ǁu5X2k>[:kї/7:YÒ+W.1Ade;f4Y.H:^θ`"7%1$E5:DkP2r@5ݕ+Zf}G 7R=4GObT˷ ώ#_w Taҳjt[H -ysGdhAu.Z54N^RӲG2Qё\I>]zP=>';r?8Dx[k5j4ITU W0*hڬFgLRgX,cA!*}% sY|{F+u]$_oIr+sźv8sR?,%_'N,8+ kħFgd/$[5'Zǡ)A{P {2dfܥC(QUg1r\;Hbb τe+lI""Ӝ .?>ikV2Yr.6ы<OF}Klc+$#˧{ɘ 6S9Ґud`*ٕX5=eou7~4-xf&|ۼc;¼,Z_ݥ&k㯩 \&cwFc렮7ؔWK]}QY:H A=r/KuWT7Voi;Ս+ݖO?em+9W*3Mu=-ZR)Qv!EQa(9P+Bv{@E5*q]?vS!W㐸7g!N£IrWOԇdmbWBM!*I>t39 3D˓ʬy*{+ IfD$5w[EGeLeurH1T~ΧtWyw$vsjf2(dFg]kSz!~']:4`lyi1Yʸ7yT)IJu ^ճķ'^DvIwN{+$>| ؿzFda ObDL{̬o<5|ʐ-DIߚkyBoW+o^'^N? =8\|7rp0~Iq X3 Xdyzl0E p)KdBĔ,DK Ξkm?^$ fRd9M"Q%ƨѣfHç]9_RUAq}<=^F-ڋV욽Vq*ĝ/sru!`D[Iw=) EkvkȿgouS,`*糣: g mb|{{qOuyeڬ(+7oʈz0'#2VQǗME} LK4~I:ֲnj5'Je9wse>{hPg,f!k土^Ɔl|wu|Ñ߬DQx3Ckp)eC>Ԟ$2f=:Hh5ڢhFL,@:E~7BV?Q#3QA.јڬxWujTa7`N"*kKbYJD: ,T3sq%̓!Lo oPMZ~8_BUh2|H@mEj]<m wFɇ|![$Q#zT֞N6 讎HNb!b'rV!Rn&>ww)rR`><\|a +Q۹o=b$Jhܒ"A丄uu?\hG!7˽&K>p50E*~#>ĤR>p8%q{}# pqͿfOG[pVarNv @`HrrUHkέ|zg,tQͭNb)Y0G}ws=?1]Ο.:X ӻ$Vލځsw/@@{W,}v✥"ԸzEIIKUŏIeP`fq4ꒀy]%] -"Փ9szRi ٪Ӎ럤1!Sj3 ^-S`Y9%̥ʒ>2.-}pѷ7^-R2U[KV^j]N牅a"}-| k2a^!b)-D*57hoѠJ?\ζn<oQ0^06%g>)fU*7U'M$+6_7 ԤY|jipUzǵA[ .`{ f"[ꨃH170u eeɲHk.a03eTuu+(l:*owQʑGwE8wU՛nK- ͎KMr9]ay+2p+ҹx?_Q{(Ƕ; -!1FR9nf !К?n cD$=Kn,PYgxqͩ'C }G%3CgQӜc$n%lcfUˌN^ޤM-'KVϚ9yezbQȵƏxTRQ5~ ^u9g3f {&#TuH8%2t):N#s??%?05љT*Rg)Sאy"҇SAܻ錪)qRK=WH=.(<>L},7汫ƎP s+fIX\h;sb).VĦ,|pUYY }0ӐTzqMeRp -NS\ .] HdvidK9}dqzK5nX e5bF6ʍmC@;?{R,l=pe(FM-c<: GНn喊&RaRVz*/ҴT#H6v#I(V!QҠG߄+xm2k3zU35հ2o~Gqrv * [ՒC[~:m&$4ijB84|؍pHr+ƺQ)؂I gHSba-ui-l/о0\M}K?FdD{={<ԍ^Ѡ;|x݋ ]94jFaf|l\Q!r53Lc6?aa5cG|-ls^8%6uO9Qǟ nXIx4paܽfζK~?+2yIb);(JΕFH+*1&"ɰɍPa%'of?cOOK 8VzMécg֧6Y_} om+zgT|VQ?'"xR;gO^L8;qaߘlLbL\Ww>k~[gwk:>2}ZB{W ,w&S ka@Ը?6>3n=)?{2H2, )qH` ޕ3jkTĞB?Qm$%)}bUq_cqY -_1Ӂ)j?E=7>-96l. sx"hc[y7?N - TK79|ѰxzjgmhInHog)v~ C;LJqu pmW<˗=l+(lCPm-[IHHK(|LQkgª?CEBx}QN";FNUcE\k5EG н^Jv<+Dk rKCN w¹*{Ϛ>jhÉW~{|kÿ$a=g1izf҆Mm  z`0X*+Gn ?J >[Std>)`zdM+9,Z', į>cu}nmĐN=z8$Rգ3c 1MEKY$ 5 ]Y^=xܠKHUNyxUqYd*ggmnL%r䰼!@Z"["(͘pfk"v$ρ9&LIQV:WIZk7TT!X52QIe(ZP b}LLϰ:.'T/ kS->lT5}Tr#e(SG:'WmP 8oVV7S*6⋫-7kI5P|-wSX-g `(TzI(jaZc^w.8g-fV]hl3.yOu2&8EAD|L|Z3ɡ2]ۑ5KqO[شܵ,Մ>k*jsέ *Ѯ|\A[ T O=5@'z=]Z(CGEfM8GWP+qNEmF068Z:b7-Ь%{Ch1^tm,R\H TZ#x㮽`Y'}?}iou8KP1㥙夆CZ"8@x µ-``Pj}6LlRU\6[ CZN"*Y=3CȾ3ڣx~,ceG ;,5R>Uw6ԼSAR7|aqu^ځ;V`ۼ:{~۔x9:7N+m1f75dGrzZFݬ(:%P 9GaxLIrl2}>Mn?KwE/:T@Y_a^OME^3 O\s _ ^9$-Q5y'msс cvV I߇!?I$7ܡ\ód[#mH܁F&8$*pw,意hiḩt-,6i0I^,`Ś7{~5QR ]5j^FiT\?8E|ӕ_eoH{UĠT&L-3QWnԤuM* ۥD+%j;bͮ' Y> (؟4 w]|/JW#ȤZca7B'8:{} N$8oQ|W mOnL)Q^!WCM8}:Nhۑc&4ٝqo_@xމɐ5 Q+t*\]w C!W^"ywne/R=`*5bJzMwZN h PQ7޴-␜EgC29*XYKUk&D\4]aw-5&_kD@;I1fͫ{C[ŏY}ExdS9ɇ@~$`KPK}=wvZR ?Ph{%Zdϙ'biys-KhOü. [4/%0y]|(珫DBˀ(D뺹"cfw8NgPmzdo *Ģj6hni[}iY LٱEf9eF8dǣOk@p#B\'Mo=) uĐEB>:6Qlo6]Z* ) ˸kֿ /d?6 Q7Dx'ey:KCaM۽T&ufTx_WD){5PJ7A 2wWqo-Cg*te j ^"~4{;fo-W?*wW1{|k.QZ" X-J/~ ۵dp;} WAD|Qķ~XC}6cT;k#7.{7c8T_4X;B*bm#"""*RJ)EDDDD̛?97t3Zkgсhzt&ޯw.YNˋվgH@E!6~brݴz]DDDDDDDfffffffVUUUUUUUi{z6Ndprewikka-5.1.1/prewikka/htdocs/images/0000775000175000017500000000000013555143705021315 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/htdocs/images/add.png0000664000175000017500000000246313555143652022561 0ustar tandrejatandreja00000000000000PNG  IHDR sRGBbKGD pHYs B(xtIME  RIDAT8eKlUUu>{o{KÚREAH1Hg:"58ј`DcAH@I 1B[, }?noy[h/k&,-]"z?_kj0'^xY:qi8ߏ~N_h wu񧻪>XXURU(G0Sd0}s_Ʈ+޸|<1Ѷ4LS<RURiBõ 1~xY _Q$($}ַdՙ?9o.4`KQÍRl[nw_g5mr])S?>ʮo#p8H,"#l4[umjl(lc۟R̨T?eiRܡƺB: RB aqH7 X%L C]4U.M+|qOS1M5`1a$iZQ_ qQyEbd\81IENDB`prewikka-5.1.1/prewikka/htdocs/images/del.png0000664000175000017500000000261613555143652022575 0ustar tandrejatandreja00000000000000PNG  IHDR sRGBbKGD pHYs B(xtIME C0(IDAT8]T[lTU]ܹ3蔖2R# VAJǀ`|D `cԨ?Fc0_j"Ơ&" * eB_0t~6Jk/>b3PN-٨5,"`L1lyOs5[,?]aM;veɪO@H?DP.!L]8ydi|*آ_~БEi@P)#RCN3T+$OaL)Ç b-m|PImDX0/Nù^\Cί{gWy'[,9ٓ!?`VL 0`g8ZDrS! ;?>=~ttSTl)RJL5χQ;u;سh"fpH%+@Hl}EO(IU}a^6Mc25l&,JIENDB`prewikka-5.1.1/prewikka/htdocs/images/favicon.png0000664000175000017500000000664713555143652023466 0ustar tandrejatandreja00000000000000PNG  IHDR szzgAMA asRGB cHRMz&u0`:pQ<bKGD pHYs   IDATXõkxյwL&\IHD(X@EnV)V@AJXmK)Vꉅ(XDS ADI@.Lns{xNx,pZZ{?YHp=g׆c}.voGRm/nY< ڕ2]w߳)Þ='HGF$A,MՆh^3{ySYkFDrϻY?CJBr9lΌnÙ=8]_:D?u˭?d+'ϞSUH?1YiءM'[~j2[S=<[ィFzs 7|[kW# xN}϶-4иm 8WT3sYkߙ=ZXr)@޼\,[#@dqxi~/ndB| !synWRyW-xkdR|vPoUnēBt͡7%6VYT:/;|lП7\8#J2;3&~qc++'7<9{\ߋ")>*ݟر-\WgťB:sZU#n4f>R TB%,d n껠]ÀdEJZu@1UeҲR_Rwm;-vCUP 01*4 d u.{KWd !ߙl}y\ tlp:Hpyt(.F 4m2,ƹtLpf ⢎ ;56zg{zz!~m?ŦXAN 4M\X"x͂7{ Aww72 +(J 8ExB5?7mmp8l%Hﲈ)Qa%91$蔢t̄ auu@Vl0S xd@!'N*gJfBzU5!K0i_ M_1>| ɔ$# BeDD=)N{px,6  CL'TUN2 Bx xPF[`cq1# 8@VTtuu(FT5nO) BF}ra;?w72c,8jC!,DdMÒ`Pb4H\|”'ajC f1}$Un͞&k1Q 0/@Je'FNr 3xnACw{W tŖ,4o_8 7noy9}l"͠ޑ_ƾ1}_$g?xUhݽo޺,:m:4M..JVZ0|~>x۹O)iRB3뮋7>+U5]V0bduv4S֬+&sIj \7xo˳m/f1yX 7i;$څΜ¥O'|˿ A3` muOE`W\e^6 -G֛jeXJ Qp[m B)!_LbZd3:=e;&j&|_Ȉ3/^lXgTxSQ,Xyƺu a ,D`rXq'&]]מI⑹Ss6glج`GӸs#_`KWǙZl@-V&+2h`HF!M/t@nm\RLIߙ!= Y  i€:m }A~@tϦb5@t!^|=huB,A#A*@@#\L]-f910wLd<'%tEXtdate:create2017-02-07T14:02:52+00:00ۛ%tEXtdate:modify2017-02-07T14:02:52+00:00ac'FtEXtsoftwareImageMagick 6.7.8-9 2014-05-12 Q16 http://www.imagemagick.org܆tEXtThumb::Document::Pages1/tEXtThumb::Image::height192rtEXtThumb::Image::Width192Ӭ!tEXtThumb::Mimetypeimage/png?VNtEXtThumb::MTime14864761720%ltEXtThumb::Size0BB>VtEXtThumb::URIfile:///mntlog/favicons/2017-02-07/0b5007ebdcb34b6733e0bdf2aebfbb9c.ico.png IENDB`prewikka-5.1.1/prewikka/htdocs/images/prelude-logo.png0000664000175000017500000001114413555143652024423 0ustar tandrejatandreja00000000000000PNG  IHDR@>i pHYs B(x cHRMy4x)96BVIDATx{T}?3;.AE`4`4Uy\H-UR5yT*ihF1K"䶰ܖL}ϳgfΙywgV{̹|f<)x xxx)~,n>4OnFq|"|3L {y@fIn%}'xTۿ| +D?@xھ$ :pnGk`80x@Fl|hQnI18SX~ ̻]a·B/<{~1ۧ0gߙOxG&eq u!9,DQ'C8GM~:l |cJ{ڿ ӧ 2z=<lO7,f,O~=JnÁ֤rs?=:OChY9{ap#pIVcw=o1-&OH=X˘q,"Ze<0㱲ؙT ]i~d̛5N H^S *$Jq,,wMLXh7!U`2 c _ZDK4ϕ@T#?ptlg_4['9  g=R=(נWW2w,"QI}WjK3c J1$*s̺RL 6yZw;*TR+/b~,g~ ъ~*@iLwIUCԬ r!;fayոO kQk8No~.ЙRElN]yGqd!Ɯ'3MѩkN.>cr.hKGV3(lzgqK羈= ٸS׫}>V ʑ$I]NTc{=l> tU O{sX܊9bR"Ӱ^spdRǘsrrW`I,b/滟`:'u/u_qY ic9nbu X@G;<窊0^"4m`e.2o3 ?z`ZGf{iN:Sty4 T.`yZG1g%5 ;,4$vaxQd7Ql:`a{Sީ)ýsbTu/}, Hd.,!39$Ka "-9q! $ϱ҄!|-%^]G"n pEX:I)XQt.B1{(?4Jp2[Tim M^uH#d7Y"7/a,N b# K\ϛA+F8"w! G <,4Aj%zB$lxρs$Y' Uꑫ*^HB$ XEXǰJ!5t=Hmo<G p[5'2s݀eKw9@LuR:wn}age`W{KNZPҕP,*t$ɝw̑FL׿oa[{"T߃u9^Zت:GG_5X6ks3T"`!AjdY' FзfNZ-E_E.p stѧX+ךn`:6|Нuf_]|[:ayotݱŜ$i˿IX"xSA5K$?_:j,-xxכdcx&BJym!yV> Þ\&_i)Rnl"~,3K2ѻջ03n_ud,zt {xr" *s-2|p>F8U^s: %AjE8t/u[{U2zI߂C|}~}hiY;tc4I3x@f5dYHo$IWã?0F6\I"]G$̉LliXxu6X1.)!gz8i 5\Ita-:FTe& w0t =X~ L~"-Hޣq ϕʾ0BXfRyigIBthFM$ |/og z샄>\& }h4DCpp)ǰVbD>"ҏbiiRhT kв^6IRaX5r=UDvaYk{_05qD zW*:S3XvNl k0ytJC)]gV kL_9˿ Q@DxHw$"cխ_Hz]~Tψˁ %*DIENDB`prewikka-5.1.1/prewikka/htdocs/js/0000775000175000017500000000000013555143705020464 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/htdocs/js/locales/0000775000175000017500000000000013555143705022106 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/htdocs/js/locales/jqgrid/0000775000175000017500000000000013555143705023366 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/htdocs/js/locales/jqgrid/grid.locale-de.js0000664000175000017500000001153113555143652026477 0ustar tandrejatandreja00000000000000/** * @license jqGrid German Translation * Version 1.0.0 (developed for jQuery Grid 3.3.1) * Olaf Klöppel opensource@blue-hit.de * http://blue-hit.de/ * * Updated for jqGrid 3.8 * Andreas Flack * http://www.contentcontrol-berlin.de * * Updated for jQuery 4.4 and for 4.8 by * Oleg Kiriljuk oleg.kiriljuk@ok-soft-gmbh.com * the format corresponds now the format from * https://github.com/jquery/globalize/blob/master/lib/cultures/globalize.culture.de.js * * Dual licensed under the MIT and GPL licenses: * http://www.opensource.org/licenses/mit-license.php * http://www.gnu.org/licenses/gpl.html **/ !function(n){"use strict";"function"==typeof define&&define.amd?define(["jquery"],n):"object"==typeof module&&module.exports?module.exports=function(e,t){return void 0===t&&(t="undefined"!=typeof window?require("jquery"):require("jquery")(e||window)),n(t),t}:n(jQuery)}(function(e){"use strict";var t={isRTL:!1,defaults:{recordtext:"Zeige {0} - {1} von {2}",emptyrecords:"Keine Datensätze vorhanden",loadtext:"Ladevorgang...",pgtext:"Seite {0} von {1}",pgfirst:"Erste Seite",pglast:"Letzte Seite",pgnext:"Nächste Seite",pgprev:"Vorherige Seite",pgrecs:"Datensätze pro Seite",showhide:"Tabelle auf- oder zuklappen",savetext:"Wird gespeichert..."},search:{caption:"Suche...",Find:"Suchen",Reset:"Zurücksetzen",odata:[{oper:"eq",text:"gleich"},{oper:"ne",text:"ungleich"},{oper:"lt",text:"kleiner"},{oper:"le",text:"kleiner gleich"},{oper:"gt",text:"größer"},{oper:"ge",text:"größer gleich"},{oper:"bw",text:"beginnt mit"},{oper:"bn",text:"beginnt nicht mit"},{oper:"in",text:"ist in"},{oper:"ni",text:"ist nicht in"},{oper:"ew",text:"endet mit"},{oper:"en",text:"endet nicht mit"},{oper:"cn",text:"enthält"},{oper:"nc",text:"enthält nicht"},{oper:"nu",text:"ist Null"},{oper:"nn",text:"ist nicht Null"}],groupOps:[{op:"AND",text:"alle"},{op:"OR",text:"mindestens eine"}],addGroupTitle:"Gruppe hinzufügen",deleteGroupTitle:"Gruppe löschen",addRuleTitle:"Regel hinzufügen",deleteRuleTitle:"Regel löschen",operandTitle:"Klicken Sie, um die Suchoperation zu wählen.",resetTitle:"Suchwert zurücksetzen"},edit:{addCaption:"Datensatz hinzufügen",editCaption:"Datensatz bearbeiten",bSubmit:"Speichern",bCancel:"Abbrechen",bClose:"Schließen",saveData:"Daten wurden geändert! Änderungen speichern?",bYes:"ja",bNo:"nein",bExit:"abbrechen",msg:{required:"Feld ist erforderlich",number:"Bitte geben Sie eine Zahl ein",minValue:"Wert muss größer oder gleich sein, als ",maxValue:"Wert muss kleiner oder gleich sein, als ",email:"ist keine gültige E-Mail-Adresse",integer:"Bitte geben Sie eine Ganzzahl ein",date:"Bitte geben Sie ein gültiges Datum ein",url:"ist keine gültige URL. Präfix muss eingegeben werden ('http://' oder 'https://')",nodefined:" ist nicht definiert!",novalue:" Rückgabewert ist erforderlich!",customarray:"Benutzerdefinierte Funktion sollte ein Array zurückgeben!",customfcheck:"Benutzerdefinierte Funktion sollte im Falle der benutzerdefinierten Überprüfung vorhanden sein!"}},view:{caption:"Datensatz anzeigen",bClose:"Schließen"},del:{caption:"Löschen",msg:"Ausgewählte Datensätze löschen?",bSubmit:"Löschen",bCancel:"Abbrechen"},nav:{edittext:"",edittitle:"Ausgewählte Zeile bearbeiten",addtext:"",addtitle:"Neue Zeile einfügen",deltext:"",deltitle:"Ausgewählte Zeile löschen",searchtext:"",searchtitle:"Datensatz suchen",refreshtext:"",refreshtitle:"Tabelle neu laden",alertcap:"Warnung",alerttext:"Bitte Zeile auswählen",viewtext:"",viewtitle:"Ausgewählte Zeile anzeigen",savetext:"",savetitle:"Änderungen speichern",canceltext:"",canceltitle:"Bearbeitung der Zeile abbrechen"},col:{caption:"Spalten auswählen",bSubmit:"Speichern",bCancel:"Abbrechen"},errors:{errcap:"Fehler",nourl:"Keine URL angegeben",norecords:"Keine Datensätze zu bearbeiten",model:"colNames und colModel sind unterschiedlich lang!"},formatter:{integer:{thousandsSeparator:".",defaultValue:"0"},number:{decimalSeparator:",",thousandsSeparator:".",decimalPlaces:2,defaultValue:"0,00"},currency:{decimalSeparator:",",thousandsSeparator:".",decimalPlaces:2,prefix:"",suffix:" €",defaultValue:"0,00"},date:{dayNames:["So","Mo","Di","Mi","Do","Fr","Sa","Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],monthNames:["Jan","Feb","Mar","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez","Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],AmPm:["","","",""],S:function(){return"."},srcformat:"Y-m-d",newformat:"d.m.Y",masks:{ShortDate:"d.m.Y",LongDate:"l, j. F Y",FullDateTime:"l, j. F Y H:i:s",MonthDay:"d F",ShortTime:"H:i",LongTime:"H:i:s",YearMonth:"F Y"}}}};e.jgrid=e.jgrid||{},e.extend(!0,e.jgrid,{defaults:{locale:"de-DE"},locales:{de:e.extend({},t,{name:"Deutsch",nameEnglish:"German"}),"de-DE":e.extend({},t,{name:"Deutsch (Deutschland)",nameEnglish:"German (Germany)"})}})}); //# sourceMappingURL=grid.locale-de.js.mapprewikka-5.1.1/prewikka/htdocs/js/locales/jqgrid/grid.locale-de.js.map0000664000175000017500000000755213555143652027263 0ustar tandrejatandreja00000000000000{"version":3,"sources":["../grid.locale-de.js"],"names":["factory","define","amd","module","exports","root","$","undefined","window","require","jQuery","locInfo","isRTL","defaults","recordtext","emptyrecords","loadtext","pgtext","pgfirst","pglast","pgnext","pgprev","pgrecs","showhide","savetext","search","caption","Find","Reset","odata","oper","text","groupOps","op","addGroupTitle","deleteGroupTitle","addRuleTitle","deleteRuleTitle","operandTitle","resetTitle","edit","addCaption","editCaption","bSubmit","bCancel","bClose","saveData","bYes","bNo","bExit","msg","required","number","minValue","maxValue","email","integer","date","url","nodefined","novalue","customarray","customfcheck","view","del","nav","edittext","edittitle","addtext","addtitle","deltext","deltitle","searchtext","searchtitle","refreshtext","refreshtitle","alertcap","alerttext","viewtext","viewtitle","savetitle","canceltext","canceltitle","col","errors","errcap","nourl","norecords","model","formatter","thousandsSeparator","defaultValue","decimalSeparator","decimalPlaces","currency","prefix","suffix","dayNames","monthNames","AmPm","S","srcformat","newformat","masks","ShortDate","LongDate","FullDateTime","MonthDay","ShortTime","LongTime","YearMonth","jgrid","extend","locale","locales","de","name","nameEnglish","de-DE"],"mappings":";;;;;;;;;;;;;;;;;;;CAsBC,SAAUA,GACV,aACsB,mBAAXC,QAAyBA,OAAOC,IAE1CD,OAAO,CAAC,UAAWD,GACS,iBAAXG,QAAuBA,OAAOC,QAE/CD,OAAOC,QAAU,SAAUC,EAAMC,GAWhC,YAVUC,IAAND,IAKHA,EAAsB,oBAAXE,OACTC,QAAQ,UACRA,QAAQ,SAARA,CAAkBJ,GAAQG,SAE7BR,EAAQM,GACDA,GAIRN,EAAQU,QAtBV,CAwBE,SAAUJ,GACZ,aACA,IAAIK,EAAU,CACbC,OAAO,EACPC,SAAU,CACTC,WAAY,0BACZC,aAAc,6BACdC,SAAU,iBACVC,OAAQ,oBACRC,QAAS,cACTC,OAAQ,eACRC,OAAQ,gBACRC,OAAQ,kBACRC,OAAQ,uBACRC,SAAU,8BACVC,SAAU,uBAEXC,OAAQ,CACPC,QAAS,WACTC,KAAM,SACNC,MAAO,eACPC,MAAO,CACN,CAAEC,KAAM,KAAMC,KAAM,UACpB,CAAED,KAAM,KAAMC,KAAM,YACpB,CAAED,KAAM,KAAMC,KAAM,WACpB,CAAED,KAAM,KAAMC,KAAM,kBACpB,CAAED,KAAM,KAAMC,KAAM,UACpB,CAAED,KAAM,KAAMC,KAAM,iBACpB,CAAED,KAAM,KAAMC,KAAM,eACpB,CAAED,KAAM,KAAMC,KAAM,qBACpB,CAAED,KAAM,KAAMC,KAAM,UACpB,CAAED,KAAM,KAAMC,KAAM,gBACpB,CAAED,KAAM,KAAMC,KAAM,aACpB,CAAED,KAAM,KAAMC,KAAM,mBACpB,CAAED,KAAM,KAAMC,KAAM,WACpB,CAAED,KAAM,KAAMC,KAAM,iBACpB,CAAED,KAAM,KAAMC,KAAM,YACpB,CAAED,KAAM,KAAMC,KAAM,mBAErBC,SAAU,CACT,CAAEC,GAAI,MAAOF,KAAM,QACnB,CAAEE,GAAI,KAAMF,KAAM,oBAEnBG,cAAe,oBACfC,iBAAkB,iBAClBC,aAAc,mBACdC,gBAAiB,gBACjBC,aAAc,+CACdC,WAAY,yBAEbC,KAAM,CACLC,WAAY,uBACZC,YAAa,uBACbC,QAAS,YACTC,QAAS,YACTC,OAAQ,YACRC,SAAU,+CACVC,KAAM,KACNC,IAAK,OACLC,MAAO,YACPC,IAAK,CACJC,SAAU,wBACVC,OAAQ,gCACRC,SAAU,0CACVC,SAAU,2CACVC,MAAO,mCACPC,QAAS,oCACTC,KAAM,yCACNC,IAAK,mFACLC,UAAW,wBACXC,QAAS,kCACTC,YAAa,4DACbC,aAAc,oGAGhBC,KAAM,CACLrC,QAAS,qBACTmB,OAAQ,aAETmB,IAAK,CACJtC,QAAS,UACTwB,IAAK,kCACLP,QAAS,UACTC,QAAS,aAEVqB,IAAK,CACJC,SAAU,GACVC,UAAW,+BACXC,QAAS,GACTC,SAAU,sBACVC,QAAS,GACTC,SAAU,4BACVC,WAAY,GACZC,YAAa,mBACbC,YAAa,GACbC,aAAc,oBACdC,SAAU,UACVC,UAAW,wBACXC,SAAU,GACVC,UAAW,6BACXvD,SAAU,GACVwD,UAAW,uBACXC,WAAY,GACZC,YAAa,mCAEdC,IAAK,CACJzD,QAAS,oBACTiB,QAAS,YACTC,QAAS,aAEVwC,OAAQ,CACPC,OAAQ,SACRC,MAAO,sBACPC,UAAW,iCACXC,MAAO,oDAERC,UAAW,CACVjC,QAAS,CAAEkC,mBAAoB,IAAKC,aAAc,KAClDvC,OAAQ,CAAEwC,iBAAkB,IAAKF,mBAAoB,IAAKG,cAAe,EAAGF,aAAc,QAC1FG,SAAU,CAAEF,iBAAkB,IAAKF,mBAAoB,IAAKG,cAAe,EAAGE,OAAQ,GAAIC,OAAQ,KAAML,aAAc,QACtHlC,KAAM,CACLwC,SAAY,CACX,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACpC,UAAW,SAAU,WAAY,WAAY,aAAc,UAAW,WAEvEC,WAAY,CACX,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAC7E,SAAU,UAAW,OAAQ,QAAS,MAAO,OAAQ,OAAQ,SAAU,YAAa,UAAW,WAAY,YAE5GC,KAAM,CAAC,GAAI,GAAI,GAAI,IACnBC,EAAG,WAAa,MAAO,KACvBC,UAAW,QACXC,UAAW,QACXC,MAAO,CAQNC,UAAW,QAMXC,SAAU,YASVC,aAAc,kBAIdC,SAAU,MAIVC,UAAW,MAKXC,SAAU,QAIVC,UAAW,UAKfxG,EAAEyG,MAAQzG,EAAEyG,OAAS,GACrBzG,EAAE0G,QAAO,EAAM1G,EAAEyG,MAAO,CACvBlG,SAAU,CACToG,OAAQ,SAETC,QAAS,CAMRC,GAAI7G,EAAE0G,OAAO,GAAIrG,EAAS,CAAEyG,KAAM,UAAWC,YAAa,WAC1DC,QAAShH,EAAE0G,OAAO,GAAIrG,EAAS,CAAEyG,KAAM,wBAAyBC,YAAa","file":"grid.locale-de.js"}prewikka-5.1.1/prewikka/htdocs/js/locales/jqgrid/grid.locale-en.js0000664000175000017500000001020213555143652026503 0ustar tandrejatandreja00000000000000/** * @license jqGrid English Translation * Tony Tomov tony@trirand.com * modified by Oleg Kiriljuk oleg.kiriljuk@ok-soft-gmbh.com * http://trirand.com/blog/ * Dual licensed under the MIT and GPL licenses: * http://www.opensource.org/licenses/mit-license.php * http://www.gnu.org/licenses/gpl.html **/ !function(r){"use strict";"function"==typeof define&&define.amd?define(["jquery"],r):"object"==typeof module&&module.exports?module.exports=function(e,t){return void 0===t&&(t="undefined"!=typeof window?require("jquery"):require("jquery")(e||window)),r(t),t}:r(jQuery)}(function(e){"use strict";var t={name:"English (United States)",nameEnglish:"English (United States)",isRTL:!1,defaults:{recordtext:"View {0} - {1} of {2}",emptyrecords:"No records to view",loadtext:"Loading...",pgtext:"Page {0} of {1}",pgfirst:"First Page",pglast:"Last Page",pgnext:"Next Page",pgprev:"Previous Page",pgrecs:"Records per Page",showhide:"Toggle Expand Collapse Grid",savetext:"Saving..."},search:{caption:"Search...",Find:"Find",Reset:"Reset",odata:[{oper:"eq",text:"equal"},{oper:"ne",text:"not equal"},{oper:"lt",text:"less"},{oper:"le",text:"less or equal"},{oper:"gt",text:"greater"},{oper:"ge",text:"greater or equal"},{oper:"bw",text:"begins with"},{oper:"bn",text:"does not begin with"},{oper:"in",text:"is in"},{oper:"ni",text:"is not in"},{oper:"ew",text:"ends with"},{oper:"en",text:"does not end with"},{oper:"cn",text:"contains"},{oper:"nc",text:"does not contain"},{oper:"nu",text:"is null"},{oper:"nn",text:"is not null"}],groupOps:[{op:"AND",text:"all"},{op:"OR",text:"any"}],addGroupTitle:"Add subgroup",deleteGroupTitle:"Delete group",addRuleTitle:"Add rule",deleteRuleTitle:"Delete rule",operandTitle:"Click to select search operation.",resetTitle:"Reset Search Value"},edit:{addCaption:"Add Record",editCaption:"Edit Record",bSubmit:"Submit",bCancel:"Cancel",bClose:"Close",saveData:"Data has been changed! Save changes?",bYes:"Yes",bNo:"No",bExit:"Cancel",msg:{required:"Field is required",number:"Please, enter valid number",minValue:"value must be greater than or equal to ",maxValue:"value must be less than or equal to",email:"is not a valid e-mail",integer:"Please, enter valid integer value",date:"Please, enter valid date value",url:"is not a valid URL. Prefix required ('http://' or 'https://')",nodefined:" is not defined!",novalue:" return value is required!",customarray:"Custom function should return array!",customfcheck:"Custom function should be present in case of custom checking!"}},view:{caption:"View Record",bClose:"Close"},del:{caption:"Delete",msg:"Delete selected record(s)?",bSubmit:"Delete",bCancel:"Cancel"},nav:{edittext:"",edittitle:"Edit selected row",addtext:"",addtitle:"Add new row",deltext:"",deltitle:"Delete selected row",searchtext:"",searchtitle:"Find records",refreshtext:"",refreshtitle:"Reload Grid",alertcap:"Warning",alerttext:"Please, select row",viewtext:"",viewtitle:"View selected row",savetext:"",savetitle:"Save row",canceltext:"",canceltitle:"Cancel row editing"},col:{caption:"Select columns",bSubmit:"Ok",bCancel:"Cancel"},errors:{errcap:"Error",nourl:"No url is set",norecords:"No records to process",model:"Length of colNames <> colModel!"},formatter:{integer:{thousandsSeparator:",",defaultValue:"0"},number:{decimalSeparator:".",thousandsSeparator:",",decimalPlaces:2,defaultValue:"0.00"},currency:{decimalSeparator:".",thousandsSeparator:",",decimalPlaces:2,prefix:"",suffix:"",defaultValue:"0.00"},date:{dayNames:["Sun","Mon","Tue","Wed","Thr","Fri","Sat","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],monthNames:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec","January","February","March","April","May","June","July","August","September","October","November","December"],AmPm:["am","pm","AM","PM"],S:function(e){return e<11||13 Nombre de données (colModel)!"},formatter:{integer:{thousandsSeparator:" ",defaultValue:"0"},number:{decimalSeparator:",",thousandsSeparator:" ",decimalPlaces:2,defaultValue:"0,00"},currency:{decimalSeparator:",",thousandsSeparator:" ",decimalPlaces:2,prefix:"",suffix:"",defaultValue:"0,00"},date:{dayNames:["Dim","Lun","Mar","Mer","Jeu","Ven","Sam","Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"],monthNames:["Jan","Fév","Mar","Avr","Mai","Jui","Jul","Aou","Sep","Oct","Nov","Déc","Janvier","Février","Mars","Avril","Mai","Juin","Juillet","Aout","Septembre","Octobre","Novembre","Décembre"],AmPm:["am","pm","AM","PM"],S:function(e){return 1===e?"er":"e"},srcformat:"Y-m-d",newformat:"d/m/Y",masks:{ShortDate:"j/n/Y",LongDate:"l j n F Y",FullDateTime:"l j n F Y H:i:s",MonthDay:"j F",ShortTime:"H:i",LongTime:"H:i:s",YearMonth:"F Y"}}}};e.jgrid=e.jgrid||{},e.extend(!0,e.jgrid,{defaults:{locale:"fr-FR"},locales:{fr:e.extend({},r,{name:"français",nameEnglish:"French"}),"fr-FR":e.extend({},r,{name:"français (France)",nameEnglish:"French (France)"})}})}); //# sourceMappingURL=grid.locale-fr.js.mapprewikka-5.1.1/prewikka/htdocs/js/locales/jqgrid/grid.locale-fr.js.map0000664000175000017500000000755013555143652027300 0ustar tandrejatandreja00000000000000{"version":3,"sources":["../grid.locale-fr.js"],"names":["factory","define","amd","module","exports","root","$","undefined","window","require","jQuery","locInfo","isRTL","defaults","recordtext","emptyrecords","loadtext","pgtext","pgfirst","pglast","pgnext","pgprev","pgrecs","showhide","savetext","search","caption","Find","Reset","odata","oper","text","groupOps","op","addGroupTitle","deleteGroupTitle","addRuleTitle","deleteRuleTitle","operandTitle","resetTitle","edit","addCaption","editCaption","bSubmit","bCancel","bClose","saveData","bYes","bNo","bExit","msg","required","number","minValue","maxValue","email","integer","url","nodefined","novalue","customarray","customfcheck","view","del","nav","edittext","edittitle","addtext","addtitle","deltext","deltitle","searchtext","searchtitle","refreshtext","refreshtitle","alertcap","alerttext","viewtext","viewtitle","savetitle","canceltext","canceltitle","col","errors","errcap","nourl","norecords","model","formatter","thousandsSeparator","defaultValue","decimalSeparator","decimalPlaces","currency","prefix","suffix","date","dayNames","monthNames","AmPm","S","j","srcformat","newformat","masks","ShortDate","LongDate","FullDateTime","MonthDay","ShortTime","LongTime","YearMonth","jgrid","extend","locale","locales","fr","name","nameEnglish","fr-FR"],"mappings":";;;;;;;;CAWC,SAAUA,GACV,aACsB,mBAAXC,QAAyBA,OAAOC,IAE1CD,OAAO,CAAC,UAAWD,GACS,iBAAXG,QAAuBA,OAAOC,QAE/CD,OAAOC,QAAU,SAAUC,EAAMC,GAWhC,YAVUC,IAAND,IAKHA,EAAsB,oBAAXE,OACTC,QAAQ,UACRA,QAAQ,SAARA,CAAkBJ,GAAQG,SAE7BR,EAAQM,GACDA,GAIRN,EAAQU,QAtBV,CAwBE,SAAUJ,GACZ,aACA,IAAIK,EAAU,CACbC,OAAO,EACPC,SAAU,CACTC,WAAY,oCACZC,aAAc,kCACdC,SAAU,gBACVC,OAAQ,mBACRC,QAAS,gBACTC,OAAQ,gBACRC,OAAQ,gBACRC,OAAQ,kBACRC,OAAQ,2BACRC,SAAU,8BACVC,SAAU,qBAEXC,OAAQ,CACPC,QAAS,eACTC,KAAM,WACNC,MAAO,gBACPC,MAAO,CACN,CAAEC,KAAM,KAAMC,KAAM,QACpB,CAAED,KAAM,KAAMC,KAAM,aACpB,CAAED,KAAM,KAAMC,KAAM,aACpB,CAAED,KAAM,KAAMC,KAAM,qBACpB,CAAED,KAAM,KAAMC,KAAM,aACpB,CAAED,KAAM,KAAMC,KAAM,qBACpB,CAAED,KAAM,KAAMC,KAAM,gBACpB,CAAED,KAAM,KAAMC,KAAM,uBACpB,CAAED,KAAM,KAAMC,KAAM,YACpB,CAAED,KAAM,KAAMC,KAAM,kBACpB,CAAED,KAAM,KAAMC,KAAM,aACpB,CAAED,KAAM,KAAMC,KAAM,oBACpB,CAAED,KAAM,KAAMC,KAAM,YACpB,CAAED,KAAM,KAAMC,KAAM,mBACpB,CAAED,KAAM,KAAMC,KAAM,YACpB,CAAED,KAAM,KAAMC,KAAM,mBAErBC,SAAU,CACT,CAAEC,GAAI,MAAOF,KAAM,QACnB,CAAEE,GAAI,KAAOF,KAAM,gBAEpBG,cAAe,eACfC,iBAAkB,eAClBC,aAAc,WACdC,gBAAiB,cACjBC,aAAc,sDACdC,WAAY,gCAEbC,KAAM,CACLC,WAAY,UACZC,YAAa,SACbC,QAAS,UACTC,QAAS,UACTC,OAAQ,SACRC,SAAU,2DACVC,KAAM,MACNC,IAAK,MACLC,MAAO,UACPC,IAAK,CACJC,SAAU,oBACVC,OAAQ,8BACRC,SAAU,4CACVC,SAAU,4CACVC,MAAO,6BACPC,QAAS,8BACTC,IAAK,2EACLC,UAAW,qBACXC,QAAS,oCACTC,YAAa,mEACbC,aAAc,mGAGhBC,KAAM,CACLpC,QAAS,0BACTmB,OAAQ,UAETkB,IAAK,CACJrC,QAAS,YACTwB,IAAK,+CACLP,QAAS,YACTC,QAAS,WAEVoB,IAAK,CACJC,SAAU,GACVC,UAAW,+BACXC,QAAS,GACTC,SAAU,oBACVC,QAAS,GACTC,SAAU,kCACVC,WAAY,GACZC,YAAa,6BACbC,YAAa,GACbC,aAAc,uBACdC,SAAU,gBACVC,UAAW,kCACXC,SAAU,GACVC,UAAW,iCACXtD,SAAU,GACVuD,UAAW,WACXC,WAAY,GACZC,YAAa,sBAEdC,IAAK,CACJxD,QAAS,gCACTiB,QAAS,UACTC,QAAS,WAEVuC,OAAQ,CACPC,OAAQ,SACRC,MAAO,kCACPC,UAAW,iCACXC,MAAO,gEAERC,UAAW,CACVhC,QAAS,CAAEiC,mBAAoB,IAAKC,aAAc,KAClDtC,OAAQ,CAAEuC,iBAAkB,IAAKF,mBAAoB,IAAKG,cAAe,EAAGF,aAAc,QAC1FG,SAAU,CAAEF,iBAAkB,IAAKF,mBAAoB,IAAKG,cAAe,EAAGE,OAAQ,GAAIC,OAAQ,GAAIL,aAAc,QACpHM,KAAM,CACLC,SAAU,CACT,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAC1C,WAAY,QAAS,QAAS,WAAY,QAAS,WAAY,UAEhEC,WAAY,CACX,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAC7E,UAAW,UAAW,OAAQ,QAAS,MAAO,OAAQ,UAAW,OAAQ,YAAa,UAAW,WAAY,YAE9GC,KAAM,CAAC,KAAM,KAAM,KAAM,MACzBC,EAAG,SAAUC,GACZ,OAAa,IAANA,EAAU,KAAO,KAEzBC,UAAW,QACXC,UAAW,QACXC,MAAO,CACNC,UAAW,QACXC,SAAU,YACVC,aAAc,kBACdC,SAAU,MACVC,UAAW,MACXC,SAAU,QACVC,UAAW,UAKfzG,EAAE0G,MAAQ1G,EAAE0G,OAAS,GACrB1G,EAAE2G,QAAO,EAAM3G,EAAE0G,MAAO,CACvBnG,SAAU,CACTqG,OAAQ,SAETC,QAAS,CAMRC,GAAI9G,EAAE2G,OAAO,GAAItG,EAAS,CAAE0G,KAAM,WAAYC,YAAa,WAC3DC,QAASjH,EAAE2G,OAAO,GAAItG,EAAS,CAAE0G,KAAM,oBAAqBC,YAAa","file":"grid.locale-fr.js"}prewikka-5.1.1/prewikka/htdocs/js/locales/jqgrid/grid.locale-it.js0000664000175000017500000001014113555143652026517 0ustar tandrejatandreja00000000000000!function(a){"use strict";"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof module&&module.exports?module.exports=function(e,t){return void 0===t&&(t="undefined"!=typeof window?require("jquery"):require("jquery")(e||window)),a(t),t}:a(jQuery)}(function(e){"use strict";var t={isRTL:!1,defaults:{recordtext:"Visualizzati {0} - {1} di {2}",emptyrecords:"Nessun record da visualizzare",loadtext:"Caricamento...",pgtext:"Pagina {0} di {1}",pgfirst:"First Page",pglast:"Last Page",pgnext:"Next Page",pgprev:"Previous Page",pgrecs:"Records per Page",showhide:"Toggle Expand Collapse Grid",savetext:"Salvataggio in corso..."},search:{caption:"Ricerca...",Find:"Cerca",Reset:"Pulisci",odata:[{oper:"eq",text:"uguale"},{oper:"ne",text:"diverso"},{oper:"lt",text:"minore"},{oper:"le",text:"minore o uguale"},{oper:"gt",text:"maggiore"},{oper:"ge",text:"maggiore o uguale"},{oper:"bw",text:"inizia con"},{oper:"bn",text:"non inizia con"},{oper:"in",text:"in"},{oper:"ni",text:"non in"},{oper:"ew",text:"termina con"},{oper:"en",text:"non termina con"},{oper:"cn",text:"contiene"},{oper:"nc",text:"non contiene"},{oper:"nu",text:"is null"},{oper:"nn",text:"is not null"}],groupOps:[{op:"AND",text:"tutto"},{op:"OR",text:"almeno uno"}],addGroupTitle:"Add subgroup",deleteGroupTitle:"Delete group",addRuleTitle:"Add rule",deleteRuleTitle:"Delete rule",operandTitle:"Click to select search operation.",resetTitle:"Reset Search Value"},edit:{addCaption:"Aggiungi Record",editCaption:"Modifica Record",bSubmit:"Invia",bCancel:"Chiudi",bClose:"Chiudi",saveData:"Alcuni dati modificati! Salvare i cambiamenti?",bYes:"Si",bNo:"No",bExit:"Esci",msg:{required:"Campo richiesto",number:"Per favore, inserisci un valore valido",minValue:"il valore deve essere maggiore o uguale a ",maxValue:"il valore deve essere minore o uguale a",email:"e-mail non corretta",integer:"Per favore, inserisci un numero intero valido",date:"Per favore, inserisci una data valida",url:"URL non valido. Prefisso richiesto ('http://' or 'https://')",nodefined:" non è definito!",novalue:" valore di ritorno richiesto!",customarray:"La function custon deve tornare un array!",customfcheck:"La function custom deve esistere per il custom checking!"}},view:{caption:"Visualizzazione Record",bClose:"Chiudi"},del:{caption:"Cancella",msg:"Cancellare record selezionato/i?",bSubmit:"Cancella",bCancel:"Annulla"},nav:{edittext:"",edittitle:"Modifica record selezionato",addtext:"",addtitle:"Aggiungi nuovo record",deltext:"",deltitle:"Cancella record selezionato",searchtext:"",searchtitle:"Ricerca record",refreshtext:"",refreshtitle:"Aggiorna griglia",alertcap:"Attenzione",alerttext:"Per favore, seleziona un record",viewtext:"",viewtitle:"Visualizza riga selezionata",savetext:"",savetitle:"Salva riga",canceltext:"",canceltitle:"Annulla modifica riga"},col:{caption:"Mostra/Nascondi Colonne",bSubmit:"Invia",bCancel:"Annulla"},errors:{errcap:"Errore",nourl:"Url non settata",norecords:"Nessun record da elaborare",model:"Lunghezza di colNames <> colModel!"},formatter:{integer:{thousandsSeparator:" ",defaultValue:"0"},number:{decimalSeparator:",",thousandsSeparator:" ",decimalPlaces:2,defaultValue:"0,00"},currency:{decimalSeparator:",",thousandsSeparator:" ",decimalPlaces:2,prefix:"",suffix:"",defaultValue:"0,00"},date:{dayNames:["Dom","Lun","Mar","Mer","Gio","Ven","Sab","Domenica","Lunedì","Martedì","Mercoledì","Giovedì","Venerdì","Sabato"],monthNames:["Gen","Feb","Mar","Apr","Mag","Gui","Lug","Ago","Set","Ott","Nov","Dic","Genneio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Movembre","Dicembre"],AmPm:["am","pm","AM","PM"],S:function(e){return e<11||13 http://cldr.unicode.org/index) * Tomasz Pęczek tpeczek@gmail.com * http://tpeczek.blogspot.com; http://tpeczek.codeplex.com * * 22-01-2015: Updated locale strings * Robert 'Wooya' Gaudyn * * Dual licensed under the MIT and GPL licenses: * http://www.opensource.org/licenses/mit-license.php * http://www.gnu.org/licenses/gpl.html **/ !function(t){"use strict";"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&module.exports?module.exports=function(e,a){return void 0===a&&(a="undefined"!=typeof window?require("jquery"):require("jquery")(e||window)),t(a),a}:t(jQuery)}(function(e){"use strict";var a={isRTL:!1,defaults:{recordtext:"Pokaż {0} - {1} z {2}",emptyrecords:"Brak rekordów do pokazania",loadtext:"Ładowanie...",pgtext:"Strona {0} z {1}",pgfirst:"Pierwsza strona",pglast:"Ostatnia strona",pgnext:"Następna strona",pgprev:"Poprzednia strona",pgrecs:"Rekordów na stronę",showhide:"Przełącz zwinięcie/rozwinięcie tabeli",savetext:"Trwa zapisywanie..."},search:{caption:"Wyszukiwanie...",Find:"Szukaj",Reset:"Czyść",odata:[{oper:"eq",text:"dokładnie"},{oper:"ne",text:"różne od"},{oper:"lt",text:"mniejsze od"},{oper:"le",text:"mniejsze lub równe"},{oper:"gt",text:"większe od"},{oper:"ge",text:"większe lub równe"},{oper:"bw",text:"zaczyna się od"},{oper:"bn",text:"nie zaczyna się od"},{oper:"in",text:"jest w"},{oper:"ni",text:"nie jest w"},{oper:"ew",text:"kończy się na"},{oper:"en",text:"nie kończy się na"},{oper:"cn",text:"zawiera"},{oper:"nc",text:"nie zawiera"},{oper:"nu",text:"jest null"},{oper:"nn",text:"nie jest null"}],groupOps:[{op:"AND",text:"oraz"},{op:"OR",text:"lub"}],addGroupTitle:"Dodaj podgrupę",deleteGroupTitle:"Usuń grupę",addRuleTitle:"Dodaj regułę",deleteRuleTitle:"Usuń regułę",operandTitle:"Kliknij, aby wybrać operację wyszukiwania.",resetTitle:"Zresetuj wartość wyszukiwania"},edit:{addCaption:"Dodaj rekord",editCaption:"Edytuj rekord",bSubmit:"Zapisz",bCancel:"Anuluj",bClose:"Zamknij",saveData:"Dane zostały zmienione! Zapisać zmiany?",bYes:"Tak",bNo:"Nie",bExit:"Anuluj",msg:{required:"Pole jest wymagane",number:"Proszę wpisać poprawną liczbę",minValue:"Wartość musi być większa lub równa od",maxValue:"Wartość musi być mniejsza lub równa od",email:"nie jest poprawnym adresem e-mail",integer:"Proszę wpisać poprawną liczbę",date:"Proszę podaj poprawną datę",url:"jest niewłaściwym adresem URL. Pamiętaj o prefiksie ('http://' lub 'https://')",nodefined:" niezdefiniowane!",novalue:" wymagana jest wartość zwracana!",customarray:"Funkcja niestandardowa powinna zwracać tablicę!",customfcheck:"Funkcja niestandardowa powinna być obecna w przypadku niestandardowego sprawdzania!"}},view:{caption:"Pokaż rekord",bClose:"Zamknij"},del:{caption:"Usuń",msg:"Czy usunąć wybrany rekord(y)?",bSubmit:"Usuń",bCancel:"Anuluj"},nav:{edittext:"",edittitle:"Edytuj wybrany wiersz",addtext:"",addtitle:"Dodaj nowy wiersz",deltext:"",deltitle:"Usuń wybrany wiersz",searchtext:"",searchtitle:"Wyszukaj rekord",refreshtext:"",refreshtitle:"Przeładuj",alertcap:"Uwaga",alerttext:"Proszę wybrać wiersz",viewtext:"",viewtitle:"Pokaż wybrany wiersz",savetext:"",savetitle:"Zapisz wiersz",canceltext:"",canceltitle:"Anuluj edycję wiersza"},col:{caption:"Pokaż/Ukryj kolumny",bSubmit:"Zatwierdź",bCancel:"Anuluj"},errors:{errcap:"Błąd",nourl:"Brak adresu url",norecords:"Brak danych",model:"Długość colNames <> colModel!"},formatter:{integer:{thousandsSeparator:" ",defaultValue:"0"},number:{decimalSeparator:",",thousandsSeparator:" ",decimalPlaces:2,defaultValue:"0,00"},currency:{decimalSeparator:",",thousandsSeparator:" ",decimalPlaces:2,prefix:"",suffix:" zł",defaultValue:"0,00"},date:{dayNames:["niedz.","pon.","wt.","śr.","czw.","pt.","sob.","niedziela","poniedziałek","wtorek","środa","czwartek","piątek","sobota"],monthNames:["sty","lut","mar","kwi","maj","cze","lip","sie","wrz","paź","lis","gru","styczeń","luty","marzec","kwiecień","maj","czerwiec","lipiec","sierpień","wrzesień","październik","listopad","grudzień"],AmPm:["","","",""],S:function(){return""},srcformat:"Y-m-d",newformat:"d.m.Y",masks:{ShortDate:"d.m.y",LongDate:"l, j F Y",FullDateTime:"l, j F Y H:i:s",MonthDay:"j F",ShortTime:"H:i",LongTime:"H:i:s",YearMonth:"F Y"}}}};e.jgrid=e.jgrid||{},e.extend(!0,e.jgrid,{defaults:{locale:"pl"},locales:{pl:e.extend({},a,{name:"polski",nameEnglish:"Polish"}),"pl-PL":e.extend({},a,{name:"polski (Polska)",nameEnglish:"Polish (Poland)"})}})}); //# sourceMappingURL=grid.locale-pl.js.mapprewikka-5.1.1/prewikka/htdocs/js/locales/jqgrid/grid.locale-pl.js.map0000664000175000017500000000754213555143652027305 0ustar tandrejatandreja00000000000000{"version":3,"sources":["../grid.locale-pl.js"],"names":["factory","define","amd","module","exports","root","$","undefined","window","require","jQuery","locInfo","isRTL","defaults","recordtext","emptyrecords","loadtext","pgtext","pgfirst","pglast","pgnext","pgprev","pgrecs","showhide","savetext","search","caption","Find","Reset","odata","oper","text","groupOps","op","addGroupTitle","deleteGroupTitle","addRuleTitle","deleteRuleTitle","operandTitle","resetTitle","edit","addCaption","editCaption","bSubmit","bCancel","bClose","saveData","bYes","bNo","bExit","msg","required","number","minValue","maxValue","email","integer","date","url","nodefined","novalue","customarray","customfcheck","view","del","nav","edittext","edittitle","addtext","addtitle","deltext","deltitle","searchtext","searchtitle","refreshtext","refreshtitle","alertcap","alerttext","viewtext","viewtitle","savetitle","canceltext","canceltitle","col","errors","errcap","nourl","norecords","model","formatter","thousandsSeparator","defaultValue","decimalSeparator","decimalPlaces","currency","prefix","suffix","dayNames","monthNames","AmPm","S","srcformat","newformat","masks","ShortDate","LongDate","FullDateTime","MonthDay","ShortTime","LongTime","YearMonth","jgrid","extend","locale","locales","pl","name","nameEnglish","pl-PL"],"mappings":";;;;;;;;;;;;;;;;CAmBC,SAAUA,GACV,aACsB,mBAAXC,QAAyBA,OAAOC,IAE1CD,OAAO,CAAC,UAAWD,GACS,iBAAXG,QAAuBA,OAAOC,QAE/CD,OAAOC,QAAU,SAAUC,EAAMC,GAWhC,YAVUC,IAAND,IAKHA,EAAsB,oBAAXE,OACTC,QAAQ,UACRA,QAAQ,SAARA,CAAkBJ,GAAQG,SAE7BR,EAAQM,GACDA,GAIRN,EAAQU,QAtBV,CAwBE,SAAUJ,GACZ,aACA,IAAIK,EAAU,CACbC,OAAO,EACPC,SAAU,CACTC,WAAY,wBACZC,aAAc,6BACdC,SAAU,eACVC,OAAQ,mBACRC,QAAS,kBACTC,OAAQ,kBACRC,OAAQ,kBACRC,OAAQ,oBACRC,OAAQ,qBACRC,SAAU,wCACVC,SAAU,uBAEXC,OAAQ,CACPC,QAAS,kBACTC,KAAM,SACNC,MAAO,QACPC,MAAO,CACN,CAAEC,KAAM,KAAMC,KAAM,aACpB,CAAED,KAAM,KAAMC,KAAM,YACpB,CAAED,KAAM,KAAMC,KAAM,eACpB,CAAED,KAAM,KAAMC,KAAM,sBACpB,CAAED,KAAM,KAAMC,KAAM,cACpB,CAAED,KAAM,KAAMC,KAAM,qBACpB,CAAED,KAAM,KAAMC,KAAM,kBACpB,CAAED,KAAM,KAAMC,KAAM,sBACpB,CAAED,KAAM,KAAMC,KAAM,UACpB,CAAED,KAAM,KAAMC,KAAM,cACpB,CAAED,KAAM,KAAMC,KAAM,iBACpB,CAAED,KAAM,KAAMC,KAAM,qBACpB,CAAED,KAAM,KAAMC,KAAM,WACpB,CAAED,KAAM,KAAMC,KAAM,eACpB,CAAED,KAAM,KAAMC,KAAM,aACpB,CAAED,KAAM,KAAMC,KAAM,kBAErBC,SAAU,CACT,CAAEC,GAAI,MAAOF,KAAM,QACnB,CAAEE,GAAI,KAAOF,KAAM,QAEpBG,cAAe,iBACfC,iBAAkB,aAClBC,aAAc,eACdC,gBAAiB,cACjBC,aAAc,6CACdC,WAAY,iCAEbC,KAAM,CACLC,WAAY,eACZC,YAAa,gBACbC,QAAS,SACTC,QAAS,SACTC,OAAQ,UACRC,SAAU,0CACVC,KAAM,MACNC,IAAK,MACLC,MAAO,SACPC,IAAK,CACJC,SAAU,qBACVC,OAAQ,gCACRC,SAAU,wCACVC,SAAU,yCACVC,MAAO,oCACPC,QAAS,gCACTC,KAAM,6BACNC,IAAK,iFACLC,UAAW,oBACXC,QAAS,mCACTC,YAAa,kDACbC,aAAc,wFAGhBC,KAAM,CACLrC,QAAS,eACTmB,OAAQ,WAETmB,IAAK,CACJtC,QAAS,OACTwB,IAAK,gCACLP,QAAS,OACTC,QAAS,UAEVqB,IAAK,CACJC,SAAU,GACVC,UAAW,wBACXC,QAAS,GACTC,SAAU,oBACVC,QAAS,GACTC,SAAU,sBACVC,WAAY,GACZC,YAAa,kBACbC,YAAa,GACbC,aAAc,YACdC,SAAU,QACVC,UAAW,uBACXC,SAAU,GACVC,UAAW,uBACXvD,SAAU,GACVwD,UAAW,gBACXC,WAAY,GACZC,YAAa,yBAEdC,IAAK,CACJzD,QAAS,sBACTiB,QAAS,YACTC,QAAS,UAEVwC,OAAQ,CACPC,OAAQ,OACRC,MAAO,kBACPC,UAAW,cACXC,MAAO,iCAERC,UAAW,CACVjC,QAAS,CAAEkC,mBAAoB,IAAKC,aAAc,KAClDvC,OAAQ,CAAEwC,iBAAkB,IAAKF,mBAAoB,IAAKG,cAAe,EAAGF,aAAc,QAC1FG,SAAU,CAAEF,iBAAkB,IAAKF,mBAAoB,IAAKG,cAAe,EAAGE,OAAQ,GAAIC,OAAQ,MAAOL,aAAc,QACvHlC,KAAM,CACLwC,SAAY,CACX,SAAU,OAAQ,MAAO,MAAO,OAAQ,MAAO,OAC/C,YAAa,eAAgB,SAAU,QAAS,WAAY,SAAU,UAEvEC,WAAY,CACX,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAC7E,UAAW,OAAQ,SAAU,WAAY,MAAO,WAAY,SAAU,WAAY,WAAY,cAAe,WAAY,YAE1HC,KAAM,CAAC,GAAI,GAAI,GAAI,IACnBC,EAAG,WAAc,MAAO,IACxBC,UAAW,QACXC,UAAW,QACXC,MAAO,CACNC,UAAW,QACXC,SAAU,WACVC,aAAc,iBACdC,SAAU,MACVC,UAAW,MACXC,SAAU,QACVC,UAAW,UAKfxG,EAAEyG,MAAQzG,EAAEyG,OAAS,GACrBzG,EAAE0G,QAAO,EAAM1G,EAAEyG,MAAO,CACvBlG,SAAU,CACToG,OAAQ,MAETC,QAAS,CAMRC,GAAI7G,EAAE0G,OAAO,GAAIrG,EAAS,CAAEyG,KAAM,SAAUC,YAAa,WACzDC,QAAShH,EAAE0G,OAAO,GAAIrG,EAAS,CAAEyG,KAAM,kBAAmBC,YAAa","file":"grid.locale-pl.js"}prewikka-5.1.1/prewikka/htdocs/js/locales/jqgrid/grid.locale-pt.js0000664000175000017500000001050213555143652026527 0ustar tandrejatandreja00000000000000/** * @license jqGrid Portuguese Translation * Tradução da jqGrid em Portugues por Frederico Carvalho, http://www.eyeviewdesign.pt * Dual licensed under the MIT and GPL licenses: * http://www.opensource.org/licenses/mit-license.php * http://www.gnu.org/licenses/gpl.html **/ !function(r){"use strict";"function"==typeof define&&define.amd?define(["jquery"],r):"object"==typeof module&&module.exports?module.exports=function(e,t){return void 0===t&&(t="undefined"!=typeof window?require("jquery"):require("jquery")(e||window)),r(t),t}:r(jQuery)}(function(e){"use strict";var t={isRTL:!1,defaults:{recordtext:"View {0} - {1} of {2}",emptyrecords:"No records to view",loadtext:"A carregar...",pgtext:"Página {0} de {1}",pgfirst:"First Page",pglast:"Last Page",pgnext:"Next Page",pgprev:"Previous Page",pgrecs:"Records per Page",showhide:"Toggle Expand Collapse Grid",savetext:"A guardar..."},search:{caption:"Busca...",Find:"Procurar",Reset:"Limpar",odata:[{oper:"eq",text:"equal"},{oper:"ne",text:"not equal"},{oper:"lt",text:"less"},{oper:"le",text:"less or equal"},{oper:"gt",text:"greater"},{oper:"ge",text:"greater or equal"},{oper:"bw",text:"begins with"},{oper:"bn",text:"does not begin with"},{oper:"in",text:"is in"},{oper:"ni",text:"is not in"},{oper:"ew",text:"ends with"},{oper:"en",text:"does not end with"},{oper:"cn",text:"contains"},{oper:"nc",text:"does not contain"},{oper:"nu",text:"is null"},{oper:"nn",text:"is not null"}],groupOps:[{op:"AND",text:"all"},{op:"OR",text:"any"}],addGroupTitle:"Add subgroup",deleteGroupTitle:"Delete group",addRuleTitle:"Add rule",deleteRuleTitle:"Delete rule",operandTitle:"Click to select search operation.",resetTitle:"Reset Search Value"},edit:{addCaption:"Adicionar Registo",editCaption:"Modificar Registo",bSubmit:"Submeter",bCancel:"Cancelar",bClose:"Fechar",saveData:"Data has been changed! Save changes?",bYes:"Yes",bNo:"No",bExit:"Cancel",msg:{required:"Campo obrigatório",number:"Por favor, introduza um numero",minValue:"O valor deve ser maior ou igual que",maxValue:"O valor deve ser menor ou igual a",email:"Não é um endereço de email válido",integer:"Por favor, introduza um numero inteiro",url:"is not a valid URL. Prefix required ('http://' or 'https://')",nodefined:" is not defined!",novalue:" return value is required!",customarray:"Custom function should return array!",customfcheck:"Custom function should be present in case of custom checking!"}},view:{caption:"View Record",bClose:"Close"},del:{caption:"Eliminar",msg:"Deseja eliminar o(s) registo(s) seleccionado(s)?",bSubmit:"Eliminar",bCancel:"Cancelar"},nav:{edittext:"",edittitle:"Modificar registo seleccionado",addtext:"",addtitle:"Adicionar novo registo",deltext:"",deltitle:"Eliminar registo seleccionado",searchtext:"",searchtitle:"Procurar",refreshtext:"",refreshtitle:"Actualizar",alertcap:"Aviso",alerttext:"Por favor, seleccione um registo",viewtext:"",viewtitle:"View selected row",savetext:"",savetitle:"Save row",canceltext:"",canceltitle:"Cancel row editing"},col:{caption:"Mostrar/Ocultar Colunas",bSubmit:"Enviar",bCancel:"Cancelar"},errors:{errcap:"Erro",nourl:"Não especificou um url",norecords:"Não existem dados para processar",model:"Tamanho do colNames <> colModel!"},formatter:{integer:{thousandsSeparator:" ",defaultValue:"0"},number:{decimalSeparator:".",thousandsSeparator:" ",decimalPlaces:2,defaultValue:"0.00"},currency:{decimalSeparator:".",thousandsSeparator:" ",decimalPlaces:2,prefix:"",suffix:"",defaultValue:"0.00"},date:{dayNames:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb","Domingo","Segunda-Feira","Terça-Feira","Quarta-Feira","Quinta-Feira","Sexta-Feira","Sábado"],monthNames:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez","Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],AmPm:["am","pm","AM","PM"],S:function(e){return e<11||131)?"s":""},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Saisissez au moins "+t+" caractère"+(t>1)?"s":""},loadingMore:function(){return"Chargement de résultats supplémentaires…"},maximumSelected:function(e){return"Vous pouvez seulement sélectionner "+e.maximum+" élément"+(e.maximum>1)?"s":""},noResults:function(){return"Aucun résultat trouvé"},searching:function(){return"Recherche en cours…"}}}),{define:e.define,require:e.require}})();prewikka-5.1.1/prewikka/htdocs/js/locales/select2/it.js0000664000175000017500000000155413555143652024427 0ustar tandrejatandreja00000000000000/*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/it",[],function(){return{errorLoading:function(){return"I risultati non possono essere caricati."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Per favore cancella "+t+" caratter";return t!==1?n+="i":n+="e",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Per favore inserisci "+t+" o più caratteri";return n},loadingMore:function(){return"Caricando più risultati…"},maximumSelected:function(e){var t="Puoi selezionare solo "+e.maximum+" element";return e.maximum!==1?t+="i":t+="o",t},noResults:function(){return"Nessun risultato trovato"},searching:function(){return"Sto cercando…"}}}),{define:e.define,require:e.require}})();prewikka-5.1.1/prewikka/htdocs/js/locales/select2/pl.js0000664000175000017500000000163513555143652024426 0ustar tandrejatandreja00000000000000/*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/pl",[],function(){var e=["znak","znaki","znaków"],t=["element","elementy","elementów"],n=function(t,n){if(t===1)return n[0];if(t>1&&t<=4)return n[1];if(t>=5)return n[2]};return{errorLoading:function(){return"Nie można załadować wyników."},inputTooLong:function(t){var r=t.input.length-t.maximum;return"Usuń "+r+" "+n(r,e)},inputTooShort:function(t){var r=t.minimum-t.input.length;return"Podaj przynajmniej "+r+" "+n(r,e)},loadingMore:function(){return"Trwa ładowanie…"},maximumSelected:function(e){return"Możesz zaznaczyć tylko "+e.maximum+" "+n(e.maximum,t)},noResults:function(){return"Brak wyników"},searching:function(){return"Trwa wyszukiwanie…"}}}),{define:e.define,require:e.require}})();prewikka-5.1.1/prewikka/htdocs/js/locales/select2/pt.js0000664000175000017500000000153313555143652024433 0ustar tandrejatandreja00000000000000/*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/pt",[],function(){return{errorLoading:function(){return"Os resultados não puderam ser carregados."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Por favor apague "+t+" ";return n+=t!=1?"caracteres":"caractere",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Introduza "+t+" ou mais caracteres";return n},loadingMore:function(){return"A carregar mais resultados…"},maximumSelected:function(e){var t="Apenas pode seleccionar "+e.maximum+" ";return t+=e.maximum!=1?"itens":"item",t},noResults:function(){return"Sem resultados"},searching:function(){return"A procurar…"}}}),{define:e.define,require:e.require}})();prewikka-5.1.1/prewikka/htdocs/js/locales/select2/ru.js0000664000175000017500000000214713555143652024440 0ustar tandrejatandreja00000000000000/*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ru",[],function(){function e(e,t,n,r){return e%10<5&&e%10>0&&e%100<5||e%100>20?e%10>1?n:t:r}return{errorLoading:function(){return"Невозможно загрузить результаты"},inputTooLong:function(t){var n=t.input.length-t.maximum,r="Пожалуйста, введите на "+n+" символ";return r+=e(n,"","a","ов"),r+=" меньше",r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Пожалуйста, введите еще хотя бы "+n+" символ";return r+=e(n,"","a","ов"),r},loadingMore:function(){return"Загрузка данных…"},maximumSelected:function(t){var n="Вы можете выбрать не более "+t.maximum+" элемент";return n+=e(t.maximum,"","a","ов"),n},noResults:function(){return"Совпадений не найдено"},searching:function(){return"Поиск…"}}}),{define:e.define,require:e.require}})();prewikka-5.1.1/prewikka/htdocs/js/EventSource.js0000664000175000017500000001516413555143652023274 0ustar tandrejatandreja00000000000000/* Copyright (c) 2010 Remy Sharp, http://remysharp.com * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ ;(function (global) { if ("EventSource" in global) return; var reTrim = /^(\s|\u00A0)+|(\s|\u00A0)+$/g; var EventSource = function (url) { var eventsource = this, interval = 500, // polling interval lastEventId = null, cache = ''; if (!url || typeof url != 'string') { throw new SyntaxError('Not enough arguments'); } this.URL = url; this.readyState = this.CONNECTING; this._pollTimer = null; this._xhr = null; function pollAgain(interval) { eventsource._pollTimer = setTimeout(function () { poll.call(eventsource); }, interval); } function poll() { try { // force hiding of the error message... insane? if (eventsource.readyState == eventsource.CLOSED) return; // NOTE: IE7 and upwards support var xhr = new XMLHttpRequest(); xhr.open('GET', eventsource.URL, true); xhr.setRequestHeader('Accept', 'text/event-stream'); xhr.setRequestHeader('Cache-Control', 'no-cache'); // we must make use of this on the server side if we're working with Android - because they don't trigger // readychange until the server connection is closed xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); if (lastEventId != null) xhr.setRequestHeader('Last-Event-ID', lastEventId); cache = ''; xhr.timeout = 50000; xhr.onreadystatechange = function () { if (this.readyState == 3 || (this.readyState == 4 && this.status == 200)) { // on success if (eventsource.readyState == eventsource.CONNECTING) { eventsource.readyState = eventsource.OPEN; eventsource.dispatchEvent('open', { type: 'open' }); } var responseText = ''; try { responseText = this.responseText || ''; } catch (e) {} // process this.responseText var parts = responseText.substr(cache.length).split("\n"), eventType = 'message', data = [], i = 0, line = ''; cache = responseText; // TODO handle 'event' (for buffer name), retry for (; i < parts.length; i++) { line = parts[i].replace(reTrim, ''); if (line.indexOf('event') == 0) { eventType = line.replace(/event:?\s*/, ''); } else if (line.indexOf('retry') == 0) { retry = parseInt(line.replace(/retry:?\s*/, '')); if(!isNaN(retry)) { interval = retry; } } else if (line.indexOf('data') == 0) { data.push(line.replace(/data:?\s*/, '')); } else if (line.indexOf('id:') == 0) { lastEventId = line.replace(/id:?\s*/, ''); } else if (line.indexOf('id') == 0) { // this resets the id lastEventId = null; } else if (line == '') { if (data.length) { var event = new MessageEvent(data.join('\n'), eventsource.url, lastEventId); eventsource.dispatchEvent(eventType, event); data = []; eventType = 'message'; } } } if (this.readyState == 4) pollAgain(interval); // don't need to poll again, because we're long-loading } else if (eventsource.readyState !== eventsource.CLOSED) { if (this.readyState == 4) { // and some other status // dispatch error eventsource.readyState = eventsource.CONNECTING; eventsource.dispatchEvent('error', { type: 'error' }); pollAgain(interval); } else if (this.readyState == 0) { // likely aborted pollAgain(interval); } else { } } }; xhr.send(); setTimeout(function () { if (true || xhr.readyState == 3) xhr.abort(); }, xhr.timeout); eventsource._xhr = xhr; } catch (e) { // in an attempt to silence the errors eventsource.dispatchEvent('error', { type: 'error', data: e.message }); // ??? } }; poll(); // init now }; EventSource.prototype = { close: function () { // closes the connection - disabling the polling this.readyState = this.CLOSED; clearInterval(this._pollTimer); this._xhr.abort(); }, CONNECTING: 0, OPEN: 1, CLOSED: 2, dispatchEvent: function (type, event) { var handlers = this['_' + type + 'Handlers']; if (handlers) { for (var i = 0; i < handlers.length; i++) { handlers[i].call(this, event); } } if (this['on' + type]) { this['on' + type].call(this, event); } }, addEventListener: function (type, handler) { if (!this['_' + type + 'Handlers']) { this['_' + type + 'Handlers'] = []; } this['_' + type + 'Handlers'].push(handler); }, removeEventListener: function (type, handler) { var handlers = this['_' + type + 'Handlers']; if (!handlers) { return; } for (var i = handlers.length - 1; i >= 0; --i) { if (handlers[i] === handler) { handlers.splice(i, 1); break; } } }, onerror: null, onmessage: null, onopen: null, readyState: 0, URL: '' }; var MessageEvent = function (data, origin, lastEventId) { this.data = data; this.origin = origin; this.lastEventId = lastEventId || ''; }; MessageEvent.prototype = { data: null, type: 'message', lastEventId: '', origin: '' }; if ('module' in global) module.exports = EventSource; global.EventSource = EventSource; })(this); prewikka-5.1.1/prewikka/htdocs/js/LAB.min.js0000664000175000017500000001256213555143652022211 0ustar tandrejatandreja00000000000000/*! LAB.js (LABjs :: Loading And Blocking JavaScript) v2.0.3 (c) Kyle Simpson MIT License */ (function(o){var K=o.$LAB,y="UseLocalXHR",z="AlwaysPreserveOrder",u="AllowDuplicates",A="CacheBust",B="BasePath",C=/^[^?#]*\//.exec(location.href)[0],D=/^\w+\:\/\/\/?[^\/]+/.exec(C)[0],i=document.head||document.getElementsByTagName("head"),L=(o.opera&&Object.prototype.toString.call(o.opera)=="[object Opera]")||("MozAppearance"in document.documentElement.style),q=document.createElement("script"),E=typeof q.preload=="boolean",r=E||(q.readyState&&q.readyState=="uninitialized"),F=!r&&q.async===true,M=!r&&!F&&!L;function G(a){return Object.prototype.toString.call(a)=="[object Function]"}function H(a){return Object.prototype.toString.call(a)=="[object Array]"}function N(a,c){var b=/^\w+\:\/\//;if(/^\/\/\/?/.test(a)){a=location.protocol+a}else if(!b.test(a)&&a.charAt(0)!="/"){a=(c||"")+a}return b.test(a)?a:((a.charAt(0)=="/"?D:C)+a)}function s(a,c){for(var b in a){if(a.hasOwnProperty(b)){c[b]=a[b]}}return c}function O(a){var c=false;for(var b=0;b0){for(var a=0;a=0;){d=n.shift();a=a[d.type].apply(null,d.args)}return a},noConflict:function(){o.$LAB=K;return m},sandbox:function(){return J()}};return m}o.$LAB=J();(function(a,c,b){if(document.readyState==null&&document[a]){document.readyState="loading";document[a](c,b=function(){document.removeEventListener(c,b,false);document.readyState="complete"},false)}})("addEventListener","DOMContentLoaded")})(this);prewikka-5.1.1/prewikka/htdocs/js/ajax.js0000664000175000017500000002763313555143652021761 0ustar tandrejatandreja00000000000000"use strict"; var PrewikkaAjaxTarget = Object.freeze({"AUTO": 1, "TAB": 2, "LAYOUT": 3}); $(function() { $.xhrPool = function() { var that = {}; that.pool = []; that.active = 0; that.push = function(xhr, settings) { if ( settings.prewikka.target == PrewikkaAjaxTarget.LAYOUT ) return; that.active++; xhr._pool_index = that.pool.push(xhr) - 1; }; that.done = function(xhr) { if ( xhr._pool_index == undefined || xhr._aborted ) /* LAYOUT target */ return; that.pool[xhr._pool_index] = null; if ( --that.active == 0 ) that.pool = []; }; that.abortAll = function() { $(that.pool).each(function(idx, xhr) { if ( xhr ) { xhr._aborted = true; xhr.abort(); xhr.onreadystatechange = null; } }); that.active = 0; that.pool = []; }; return that; }(); $.eventSourcePool = function() { var that = {}; that.pool = []; that.active = 0; that.push = function(stream) { that.active++; stream._pool_index = that.pool.push(stream) - 1; }; that.done = function(stream) { if ( stream._pool_index == undefined ) return; that.pool[stream._pool_index] = null; if ( --that.active == 0 ) that.pool = []; }; that.abortAll = function() { $(that.pool).each(function(idx, stream) { if ( stream ) { stream.close(); } }); that.active = 0; that.pool = []; }; return that; }(); $.ajaxSetup({ prewikka: { spinner: true, error: true, target: PrewikkaAjaxTarget.AUTO, history: true, bypass: false } }); $(document).ajaxSend(function(event, xhr, settings) { if ( ! _csrf_safe_method(settings.type) && check_same_origin(settings.url) ); xhr.setRequestHeader("X-CSRFToken", get_cookie("CSRF_COOKIE")); if ( settings.prewikka.spinner ) $("#ajax-spinner").show(); $.xhrPool.push(xhr, settings); }); $(document).ajaxSuccess(function(event, xhr, settings, data) { $.xhrPool.done(xhr); if ( ! settings.prewikka.bypass ) prewikka_process_ajax_response(settings, data, xhr); }); $(document).ajaxComplete(function(event, xhr, settings) { if ( settings.prewikka.spinner ) $("#ajax-spinner").hide(); }); $(document).ajaxError(function(event, xhr, settings) { $.xhrPool.done(xhr); /* * User aborted the request or no error handling required */ if ( xhr._aborted || ! settings.prewikka.error ) return; if ( ! xhr.responseText ) $("#prewikka-dialog-connection-error").modal(); else if ( xhr.getResponseHeader("content-type") == "application/json" ) prewikka_json_dialog(JSON.parse(xhr.responseText)); else prewikka_json_dialog({content: xhr.responseText, error: true}); }); $(window).on('resize', prewikka_resizeTopMenu); }); function prewikka_location() { return window.history.location || window.location; } function _mergedict(obj1, obj2) { var obj3 = {}; for ( var attrname in obj1 ) { obj3[attrname] = obj1[attrname]; } for ( var attrname in obj2 ) { obj3[attrname] = obj2[attrname]; } return obj3; } function _initialize_components(container) { $(container).find('[data-toggle="tooltip"]').tooltip(); $(container).find('[data-toggle="popover"]').popover(); $(container).find('[data-title-url]').ajaxTooltip(); $(container).find('[autofocus]').focus(); $(container).find('.form-control-select2').select2_container(); } function _destroy_components(container) { $(container).find('[data-toggle="tooltip"]').tooltip("destroy"); $(container).find('[data-toggle="popover"]').popover("destroy"); $(container).find('[data-title-url]').tooltip("destroy"); $(container).find('.form-control-select2').select2("destroy"); } function _csrf_safe_method(method) { return /^(GET|HEAD|OPTIONS|TRACE)$/.test(method); } function get_cookie(name) { var value = "; " + document.cookie; var parts = value.split("; " + name + "="); if (parts.length == 2) return parts.pop().split(";").shift(); } function prewikka_drawTab(data) { var form; var content = $(data.content); if ( ! data.content ) return; $.eventSourcePool.abortAll(); $.xhrPool.abortAll(); /* * Check self and descendant */ form = $(content).find("form").addBack("form").first(); if ( ! form.length ) form = content = content.wrapAll('
').parent(); if ( ! _csrf_safe_method(form.attr("method")) ) form.prepend(''); form.prepend(data._extensions.menu); prewikka_resource_destroy($("#main")); $("#main").off().html(content); $("#topmenu_right .prewikka-help-button").data("href", data._extensions.help).prop("disabled", data._extensions.help ? false : true); $("#topmenu_right .prewikka-config-button").prop("disabled", $("#main .prewikka-view-config").length == 0); prewikka_resizeTopMenu(); _initialize_components("#main"); window.scrollTo(0, 0); } function _update_browser_title(title) { /* Update the document's title according to the names of the section*/ if ( ! document.orig_title ) document.orig_title = document.title; document.title = document.orig_title + " - " + title; } function _split_url(url) { var idx = url.indexOf('#'); var frag = ''; if ( idx != -1 ) { frag = url.substr(idx); url = url.substr(0, idx); } return [url, frag]; } /* Update the tab's menu according to the url */ function _url_update(xhr, settings) { var redirect = false; var url = _split_url(settings.url); var fragment = url[1]; url = url[0]; var newurl = xhr.getResponseHeader("X-responseURL"); if ( newurl && newurl != url ) { url = newurl; redirect = true; } var tab = $("#topmenu .topmenu_item a[href='" + url.split("?")[0] + fragment + "']"); if ( redirect || (settings.prewikka.history && (settings.type || "").toUpperCase() != "POST") ) { var params = settings['data']; if ( params && ! redirect ) { if ( typeof(params) != 'string' ) params = $.param(params); url += "?" + params; } url += fragment; history.pushState(url, document.title, url); } if ( tab.length > 0 ) { $("#topmenu ul.topmenu_section").hide(); $(tab).parent().parent().show(); $("#topmenu .active").toggleClass("active", false); $(tab).parent().toggleClass("active", true); _update_browser_title($("#topmenu .active").closest("ul").data("section-title")); } } function _process_widget(data, widget) { widget.attr("tabindex", -1); $(widget).wrapInner(''); if ( data._extensions.help ) { var help = $("").addClass(this._triggerClass).html(o?t("").attr({src:o,alt:n,title:n}):n)),e[r?"before":"after"](i.trigger),i.trigger.on("click",function(){return t.datepicker._datepickerShowing&&t.datepicker._lastInput===e[0]?t.datepicker._hideDatepicker():t.datepicker._datepickerShowing&&t.datepicker._lastInput!==e[0]?(t.datepicker._hideDatepicker(),t.datepicker._showDatepicker(e[0])):t.datepicker._showDatepicker(e[0]),!1}))},_autoSize:function(t){if(this._get(t,"autoSize")&&!t.inline){var e,i,s,n,o=new Date(2009,11,20),a=this._get(t,"dateFormat");a.match(/[DM]/)&&(e=function(t){for(i=0,s=0,n=0;t.length>n;n++)t[n].length>i&&(i=t[n].length,s=n);return s},o.setMonth(e(this._get(t,a.match(/MM/)?"monthNames":"monthNamesShort"))),o.setDate(e(this._get(t,a.match(/DD/)?"dayNames":"dayNamesShort"))+20-o.getDay())),t.input.attr("size",this._formatDate(t,o).length)}},_inlineDatepicker:function(e,i){var s=t(e);s.hasClass(this.markerClassName)||(s.addClass(this.markerClassName).append(i.dpDiv),t.data(e,"datepicker",i),this._setDate(i,this._getDefaultDate(i),!0),this._updateDatepicker(i),this._updateAlternate(i),i.settings.disabled&&this._disableDatepicker(e),i.dpDiv.css("display","block"))},_dialogDatepicker:function(e,i,s,n,o){var r,l,h,c,u,d=this._dialogInst;return d||(this.uuid+=1,r="dp"+this.uuid,this._dialogInput=t(""),this._dialogInput.on("keydown",this._doKeyDown),t("body").append(this._dialogInput),d=this._dialogInst=this._newInst(this._dialogInput,!1),d.settings={},t.data(this._dialogInput[0],"datepicker",d)),a(d.settings,n||{}),i=i&&i.constructor===Date?this._formatDate(d,i):i,this._dialogInput.val(i),this._pos=o?o.length?o:[o.pageX,o.pageY]:null,this._pos||(l=document.documentElement.clientWidth,h=document.documentElement.clientHeight,c=document.documentElement.scrollLeft||document.body.scrollLeft,u=document.documentElement.scrollTop||document.body.scrollTop,this._pos=[l/2-100+c,h/2-150+u]),this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px"),d.settings.onSelect=s,this._inDialog=!0,this.dpDiv.addClass(this._dialogClass),this._showDatepicker(this._dialogInput[0]),t.blockUI&&t.blockUI(this.dpDiv),t.data(this._dialogInput[0],"datepicker",d),this},_destroyDatepicker:function(e){var i,s=t(e),n=t.data(e,"datepicker");s.hasClass(this.markerClassName)&&(i=e.nodeName.toLowerCase(),t.removeData(e,"datepicker"),"input"===i?(n.append.remove(),n.trigger.remove(),s.removeClass(this.markerClassName).off("focus",this._showDatepicker).off("keydown",this._doKeyDown).off("keypress",this._doKeyPress).off("keyup",this._doKeyUp)):("div"===i||"span"===i)&&s.removeClass(this.markerClassName).empty(),p===n&&(p=null))},_enableDatepicker:function(e){var i,s,n=t(e),o=t.data(e,"datepicker");n.hasClass(this.markerClassName)&&(i=e.nodeName.toLowerCase(),"input"===i?(e.disabled=!1,o.trigger.filter("button").each(function(){this.disabled=!1}).end().filter("img").css({opacity:"1.0",cursor:""})):("div"===i||"span"===i)&&(s=n.children("."+this._inlineClass),s.children().removeClass("ui-state-disabled"),s.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!1)),this._disabledInputs=t.map(this._disabledInputs,function(t){return t===e?null:t}))},_disableDatepicker:function(e){var i,s,n=t(e),o=t.data(e,"datepicker");n.hasClass(this.markerClassName)&&(i=e.nodeName.toLowerCase(),"input"===i?(e.disabled=!0,o.trigger.filter("button").each(function(){this.disabled=!0}).end().filter("img").css({opacity:"0.5",cursor:"default"})):("div"===i||"span"===i)&&(s=n.children("."+this._inlineClass),s.children().addClass("ui-state-disabled"),s.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!0)),this._disabledInputs=t.map(this._disabledInputs,function(t){return t===e?null:t}),this._disabledInputs[this._disabledInputs.length]=e)},_isDisabledDatepicker:function(t){if(!t)return!1;for(var e=0;this._disabledInputs.length>e;e++)if(this._disabledInputs[e]===t)return!0;return!1},_getInst:function(e){try{return t.data(e,"datepicker")}catch(i){throw"Missing instance data for this datepicker"}},_optionDatepicker:function(e,i,s){var n,o,r,l,h=this._getInst(e);return 2===arguments.length&&"string"==typeof i?"defaults"===i?t.extend({},t.datepicker._defaults):h?"all"===i?t.extend({},h.settings):this._get(h,i):null:(n=i||{},"string"==typeof i&&(n={},n[i]=s),h&&(this._curInst===h&&this._hideDatepicker(),o=this._getDateDatepicker(e,!0),r=this._getMinMaxDate(h,"min"),l=this._getMinMaxDate(h,"max"),a(h.settings,n),null!==r&&void 0!==n.dateFormat&&void 0===n.minDate&&(h.settings.minDate=this._formatDate(h,r)),null!==l&&void 0!==n.dateFormat&&void 0===n.maxDate&&(h.settings.maxDate=this._formatDate(h,l)),"disabled"in n&&(n.disabled?this._disableDatepicker(e):this._enableDatepicker(e)),this._attachments(t(e),h),this._autoSize(h),this._setDate(h,o),this._updateAlternate(h),this._updateDatepicker(h)),void 0)},_changeDatepicker:function(t,e,i){this._optionDatepicker(t,e,i)},_refreshDatepicker:function(t){var e=this._getInst(t);e&&this._updateDatepicker(e)},_setDateDatepicker:function(t,e){var i=this._getInst(t);i&&(this._setDate(i,e),this._updateDatepicker(i),this._updateAlternate(i))},_getDateDatepicker:function(t,e){var i=this._getInst(t);return i&&!i.inline&&this._setDateFromField(i,e),i?this._getDate(i):null},_doKeyDown:function(e){var i,s,n,o=t.datepicker._getInst(e.target),a=!0,r=o.dpDiv.is(".ui-datepicker-rtl");if(o._keyEvent=!0,t.datepicker._datepickerShowing)switch(e.keyCode){case 9:t.datepicker._hideDatepicker(),a=!1;break;case 13:return n=t("td."+t.datepicker._dayOverClass+":not(."+t.datepicker._currentClass+")",o.dpDiv),n[0]&&t.datepicker._selectDay(e.target,o.selectedMonth,o.selectedYear,n[0]),i=t.datepicker._get(o,"onSelect"),i?(s=t.datepicker._formatDate(o),i.apply(o.input?o.input[0]:null,[s,o])):t.datepicker._hideDatepicker(),!1;case 27:t.datepicker._hideDatepicker();break;case 33:t.datepicker._adjustDate(e.target,e.ctrlKey?-t.datepicker._get(o,"stepBigMonths"):-t.datepicker._get(o,"stepMonths"),"M");break;case 34:t.datepicker._adjustDate(e.target,e.ctrlKey?+t.datepicker._get(o,"stepBigMonths"):+t.datepicker._get(o,"stepMonths"),"M");break;case 35:(e.ctrlKey||e.metaKey)&&t.datepicker._clearDate(e.target),a=e.ctrlKey||e.metaKey;break;case 36:(e.ctrlKey||e.metaKey)&&t.datepicker._gotoToday(e.target),a=e.ctrlKey||e.metaKey;break;case 37:(e.ctrlKey||e.metaKey)&&t.datepicker._adjustDate(e.target,r?1:-1,"D"),a=e.ctrlKey||e.metaKey,e.originalEvent.altKey&&t.datepicker._adjustDate(e.target,e.ctrlKey?-t.datepicker._get(o,"stepBigMonths"):-t.datepicker._get(o,"stepMonths"),"M");break;case 38:(e.ctrlKey||e.metaKey)&&t.datepicker._adjustDate(e.target,-7,"D"),a=e.ctrlKey||e.metaKey;break;case 39:(e.ctrlKey||e.metaKey)&&t.datepicker._adjustDate(e.target,r?-1:1,"D"),a=e.ctrlKey||e.metaKey,e.originalEvent.altKey&&t.datepicker._adjustDate(e.target,e.ctrlKey?+t.datepicker._get(o,"stepBigMonths"):+t.datepicker._get(o,"stepMonths"),"M");break;case 40:(e.ctrlKey||e.metaKey)&&t.datepicker._adjustDate(e.target,7,"D"),a=e.ctrlKey||e.metaKey;break;default:a=!1}else 36===e.keyCode&&e.ctrlKey?t.datepicker._showDatepicker(this):a=!1;a&&(e.preventDefault(),e.stopPropagation())},_doKeyPress:function(e){var i,s,n=t.datepicker._getInst(e.target);return t.datepicker._get(n,"constrainInput")?(i=t.datepicker._possibleChars(t.datepicker._get(n,"dateFormat")),s=String.fromCharCode(null==e.charCode?e.keyCode:e.charCode),e.ctrlKey||e.metaKey||" ">s||!i||i.indexOf(s)>-1):void 0},_doKeyUp:function(e){var i,s=t.datepicker._getInst(e.target);if(s.input.val()!==s.lastVal)try{i=t.datepicker.parseDate(t.datepicker._get(s,"dateFormat"),s.input?s.input.val():null,t.datepicker._getFormatConfig(s)),i&&(t.datepicker._setDateFromField(s),t.datepicker._updateAlternate(s),t.datepicker._updateDatepicker(s))}catch(n){}return!0},_showDatepicker:function(e){if(e=e.target||e,"input"!==e.nodeName.toLowerCase()&&(e=t("input",e.parentNode)[0]),!t.datepicker._isDisabledDatepicker(e)&&t.datepicker._lastInput!==e){var s,n,o,r,l,h,c;s=t.datepicker._getInst(e),t.datepicker._curInst&&t.datepicker._curInst!==s&&(t.datepicker._curInst.dpDiv.stop(!0,!0),s&&t.datepicker._datepickerShowing&&t.datepicker._hideDatepicker(t.datepicker._curInst.input[0])),n=t.datepicker._get(s,"beforeShow"),o=n?n.apply(e,[e,s]):{},o!==!1&&(a(s.settings,o),s.lastVal=null,t.datepicker._lastInput=e,t.datepicker._setDateFromField(s),t.datepicker._inDialog&&(e.value=""),t.datepicker._pos||(t.datepicker._pos=t.datepicker._findPos(e),t.datepicker._pos[1]+=e.offsetHeight),r=!1,t(e).parents().each(function(){return r|="fixed"===t(this).css("position"),!r}),l={left:t.datepicker._pos[0],top:t.datepicker._pos[1]},t.datepicker._pos=null,s.dpDiv.empty(),s.dpDiv.css({position:"absolute",display:"block",top:"-1000px"}),t.datepicker._updateDatepicker(s),l=t.datepicker._checkOffset(s,l,r),s.dpDiv.css({position:t.datepicker._inDialog&&t.blockUI?"static":r?"fixed":"absolute",display:"none",left:l.left+"px",top:l.top+"px"}),s.inline||(h=t.datepicker._get(s,"showAnim"),c=t.datepicker._get(s,"duration"),s.dpDiv.css("z-index",i(t(e))+1),t.datepicker._datepickerShowing=!0,t.effects&&t.effects.effect[h]?s.dpDiv.show(h,t.datepicker._get(s,"showOptions"),c):s.dpDiv[h||"show"](h?c:null),t.datepicker._shouldFocusInput(s)&&s.input.trigger("focus"),t.datepicker._curInst=s))}},_updateDatepicker:function(e){this.maxRows=4,p=e,e.dpDiv.empty().append(this._generateHTML(e)),this._attachHandlers(e);var i,s=this._getNumberOfMonths(e),n=s[1],a=17,r=e.dpDiv.find("."+this._dayOverClass+" a");r.length>0&&o.apply(r.get(0)),e.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width(""),n>1&&e.dpDiv.addClass("ui-datepicker-multi-"+n).css("width",a*n+"em"),e.dpDiv[(1!==s[0]||1!==s[1]?"add":"remove")+"Class"]("ui-datepicker-multi"),e.dpDiv[(this._get(e,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"),e===t.datepicker._curInst&&t.datepicker._datepickerShowing&&t.datepicker._shouldFocusInput(e)&&e.input.trigger("focus"),e.yearshtml&&(i=e.yearshtml,setTimeout(function(){i===e.yearshtml&&e.yearshtml&&e.dpDiv.find("select.ui-datepicker-year:first").replaceWith(e.yearshtml),i=e.yearshtml=null},0))},_shouldFocusInput:function(t){return t.input&&t.input.is(":visible")&&!t.input.is(":disabled")&&!t.input.is(":focus")},_checkOffset:function(e,i,s){var n=e.dpDiv.outerWidth(),o=e.dpDiv.outerHeight(),a=e.input?e.input.outerWidth():0,r=e.input?e.input.outerHeight():0,l=document.documentElement.clientWidth+(s?0:t(document).scrollLeft()),h=document.documentElement.clientHeight+(s?0:t(document).scrollTop());return i.left-=this._get(e,"isRTL")?n-a:0,i.left-=s&&i.left===e.input.offset().left?t(document).scrollLeft():0,i.top-=s&&i.top===e.input.offset().top+r?t(document).scrollTop():0,i.left-=Math.min(i.left,i.left+n>l&&l>n?Math.abs(i.left+n-l):0),i.top-=Math.min(i.top,i.top+o>h&&h>o?Math.abs(o+r):0),i},_findPos:function(e){for(var i,s=this._getInst(e),n=this._get(s,"isRTL");e&&("hidden"===e.type||1!==e.nodeType||t.expr.filters.hidden(e));)e=e[n?"previousSibling":"nextSibling"];return i=t(e).offset(),[i.left,i.top]},_hideDatepicker:function(e){var i,s,n,o,a=this._curInst;!a||e&&a!==t.data(e,"datepicker")||this._datepickerShowing&&(i=this._get(a,"showAnim"),s=this._get(a,"duration"),n=function(){t.datepicker._tidyDialog(a)},t.effects&&(t.effects.effect[i]||t.effects[i])?a.dpDiv.hide(i,t.datepicker._get(a,"showOptions"),s,n):a.dpDiv["slideDown"===i?"slideUp":"fadeIn"===i?"fadeOut":"hide"](i?s:null,n),i||n(),this._datepickerShowing=!1,o=this._get(a,"onClose"),o&&o.apply(a.input?a.input[0]:null,[a.input?a.input.val():"",a]),this._lastInput=null,this._inDialog&&(this._dialogInput.css({position:"absolute",left:"0",top:"-100px"}),t.blockUI&&(t.unblockUI(),t("body").append(this.dpDiv))),this._inDialog=!1)},_tidyDialog:function(t){t.dpDiv.removeClass(this._dialogClass).off(".ui-datepicker-calendar")},_checkExternalClick:function(e){if(t.datepicker._curInst){var i=t(e.target),s=t.datepicker._getInst(i[0]);(i[0].id!==t.datepicker._mainDivId&&0===i.parents("#"+t.datepicker._mainDivId).length&&!i.hasClass(t.datepicker.markerClassName)&&!i.closest("."+t.datepicker._triggerClass).length&&t.datepicker._datepickerShowing&&(!t.datepicker._inDialog||!t.blockUI)||i.hasClass(t.datepicker.markerClassName)&&t.datepicker._curInst!==s)&&t.datepicker._hideDatepicker()}},_adjustDate:function(e,i,s){var n=t(e),o=this._getInst(n[0]);this._isDisabledDatepicker(n[0])||(this._adjustInstDate(o,i+("M"===s?this._get(o,"showCurrentAtPos"):0),s),this._updateDatepicker(o))},_gotoToday:function(e){var i,s=t(e),n=this._getInst(s[0]);this._get(n,"gotoCurrent")&&n.currentDay?(n.selectedDay=n.currentDay,n.drawMonth=n.selectedMonth=n.currentMonth,n.drawYear=n.selectedYear=n.currentYear):(i=new Date,n.selectedDay=i.getDate(),n.drawMonth=n.selectedMonth=i.getMonth(),n.drawYear=n.selectedYear=i.getFullYear()),this._notifyChange(n),this._adjustDate(s)},_selectMonthYear:function(e,i,s){var n=t(e),o=this._getInst(n[0]);o["selected"+("M"===s?"Month":"Year")]=o["draw"+("M"===s?"Month":"Year")]=parseInt(i.options[i.selectedIndex].value,10),this._notifyChange(o),this._adjustDate(n)},_selectDay:function(e,i,s,n){var o,a=t(e);t(n).hasClass(this._unselectableClass)||this._isDisabledDatepicker(a[0])||(o=this._getInst(a[0]),o.selectedDay=o.currentDay=t("a",n).html(),o.selectedMonth=o.currentMonth=i,o.selectedYear=o.currentYear=s,this._selectDate(e,this._formatDate(o,o.currentDay,o.currentMonth,o.currentYear)))},_clearDate:function(e){var i=t(e);this._selectDate(i,"")},_selectDate:function(e,i){var s,n=t(e),o=this._getInst(n[0]);i=null!=i?i:this._formatDate(o),o.input&&o.input.val(i),this._updateAlternate(o),s=this._get(o,"onSelect"),s?s.apply(o.input?o.input[0]:null,[i,o]):o.input&&o.input.trigger("change"),o.inline?this._updateDatepicker(o):(this._hideDatepicker(),this._lastInput=o.input[0],"object"!=typeof o.input[0]&&o.input.trigger("focus"),this._lastInput=null)},_updateAlternate:function(e){var i,s,n,o=this._get(e,"altField");o&&(i=this._get(e,"altFormat")||this._get(e,"dateFormat"),s=this._getDate(e),n=this.formatDate(i,s,this._getFormatConfig(e)),t(o).val(n))},noWeekends:function(t){var e=t.getDay();return[e>0&&6>e,""]},iso8601Week:function(t){var e,i=new Date(t.getTime());return i.setDate(i.getDate()+4-(i.getDay()||7)),e=i.getTime(),i.setMonth(0),i.setDate(1),Math.floor(Math.round((e-i)/864e5)/7)+1},parseDate:function(e,i,s){if(null==e||null==i)throw"Invalid arguments";if(i="object"==typeof i?""+i:i+"",""===i)return null;var n,o,a,r,l=0,h=(s?s.shortYearCutoff:null)||this._defaults.shortYearCutoff,c="string"!=typeof h?h:(new Date).getFullYear()%100+parseInt(h,10),u=(s?s.dayNamesShort:null)||this._defaults.dayNamesShort,d=(s?s.dayNames:null)||this._defaults.dayNames,p=(s?s.monthNamesShort:null)||this._defaults.monthNamesShort,f=(s?s.monthNames:null)||this._defaults.monthNames,g=-1,m=-1,_=-1,v=-1,b=!1,y=function(t){var i=e.length>n+1&&e.charAt(n+1)===t;return i&&n++,i},w=function(t){var e=y(t),s="@"===t?14:"!"===t?20:"y"===t&&e?4:"o"===t?3:2,n="y"===t?s:1,o=RegExp("^\\d{"+n+","+s+"}"),a=i.substring(l).match(o);if(!a)throw"Missing number at position "+l;return l+=a[0].length,parseInt(a[0],10)},k=function(e,s,n){var o=-1,a=t.map(y(e)?n:s,function(t,e){return[[e,t]]}).sort(function(t,e){return-(t[1].length-e[1].length)});if(t.each(a,function(t,e){var s=e[1];return i.substr(l,s.length).toLowerCase()===s.toLowerCase()?(o=e[0],l+=s.length,!1):void 0}),-1!==o)return o+1;throw"Unknown name at position "+l},x=function(){if(i.charAt(l)!==e.charAt(n))throw"Unexpected literal at position "+l;l++};for(n=0;e.length>n;n++)if(b)"'"!==e.charAt(n)||y("'")?x():b=!1;else switch(e.charAt(n)){case"d":_=w("d");break;case"D":k("D",u,d);break;case"o":v=w("o");break;case"m":m=w("m");break;case"M":m=k("M",p,f);break;case"y":g=w("y");break;case"@":r=new Date(w("@")),g=r.getFullYear(),m=r.getMonth()+1,_=r.getDate();break;case"!":r=new Date((w("!")-this._ticksTo1970)/1e4),g=r.getFullYear(),m=r.getMonth()+1,_=r.getDate();break;case"'":y("'")?x():b=!0;break;default:x()}if(i.length>l&&(a=i.substr(l),!/^\s+/.test(a)))throw"Extra/unparsed characters found in date: "+a;if(-1===g?g=(new Date).getFullYear():100>g&&(g+=(new Date).getFullYear()-(new Date).getFullYear()%100+(c>=g?0:-100)),v>-1)for(m=1,_=v;;){if(o=this._getDaysInMonth(g,m-1),o>=_)break;m++,_-=o}if(r=this._daylightSavingAdjust(new Date(g,m-1,_)),r.getFullYear()!==g||r.getMonth()+1!==m||r.getDate()!==_)throw"Invalid date";return r},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:1e7*60*60*24*(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925)),formatDate:function(t,e,i){if(!e)return"";var s,n=(i?i.dayNamesShort:null)||this._defaults.dayNamesShort,o=(i?i.dayNames:null)||this._defaults.dayNames,a=(i?i.monthNamesShort:null)||this._defaults.monthNamesShort,r=(i?i.monthNames:null)||this._defaults.monthNames,l=function(e){var i=t.length>s+1&&t.charAt(s+1)===e;return i&&s++,i},h=function(t,e,i){var s=""+e;if(l(t))for(;i>s.length;)s="0"+s;return s},c=function(t,e,i,s){return l(t)?s[e]:i[e]},u="",d=!1;if(e)for(s=0;t.length>s;s++)if(d)"'"!==t.charAt(s)||l("'")?u+=t.charAt(s):d=!1;else switch(t.charAt(s)){case"d":u+=h("d",e.getDate(),2);break;case"D":u+=c("D",e.getDay(),n,o);break;case"o":u+=h("o",Math.round((new Date(e.getFullYear(),e.getMonth(),e.getDate()).getTime()-new Date(e.getFullYear(),0,0).getTime())/864e5),3);break;case"m":u+=h("m",e.getMonth()+1,2);break;case"M":u+=c("M",e.getMonth(),a,r);break;case"y":u+=l("y")?e.getFullYear():(10>e.getFullYear()%100?"0":"")+e.getFullYear()%100;break;case"@":u+=e.getTime();break;case"!":u+=1e4*e.getTime()+this._ticksTo1970;break;case"'":l("'")?u+="'":d=!0;break;default:u+=t.charAt(s)}return u},_possibleChars:function(t){var e,i="",s=!1,n=function(i){var s=t.length>e+1&&t.charAt(e+1)===i;return s&&e++,s};for(e=0;t.length>e;e++)if(s)"'"!==t.charAt(e)||n("'")?i+=t.charAt(e):s=!1;else switch(t.charAt(e)){case"d":case"m":case"y":case"@":i+="0123456789";break;case"D":case"M":return null;case"'":n("'")?i+="'":s=!0;break;default:i+=t.charAt(e)}return i},_get:function(t,e){return void 0!==t.settings[e]?t.settings[e]:this._defaults[e]},_setDateFromField:function(t,e){if(t.input.val()!==t.lastVal){var i=this._get(t,"dateFormat"),s=t.lastVal=t.input?t.input.val():null,n=this._getDefaultDate(t),o=n,a=this._getFormatConfig(t);try{o=this.parseDate(i,s,a)||n}catch(r){s=e?"":s}t.selectedDay=o.getDate(),t.drawMonth=t.selectedMonth=o.getMonth(),t.drawYear=t.selectedYear=o.getFullYear(),t.currentDay=s?o.getDate():0,t.currentMonth=s?o.getMonth():0,t.currentYear=s?o.getFullYear():0,this._adjustInstDate(t)}},_getDefaultDate:function(t){return this._restrictMinMax(t,this._determineDate(t,this._get(t,"defaultDate"),new Date))},_determineDate:function(e,i,s){var n=function(t){var e=new Date;return e.setDate(e.getDate()+t),e},o=function(i){try{return t.datepicker.parseDate(t.datepicker._get(e,"dateFormat"),i,t.datepicker._getFormatConfig(e))}catch(s){}for(var n=(i.toLowerCase().match(/^c/)?t.datepicker._getDate(e):null)||new Date,o=n.getFullYear(),a=n.getMonth(),r=n.getDate(),l=/([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,h=l.exec(i);h;){switch(h[2]||"d"){case"d":case"D":r+=parseInt(h[1],10);break;case"w":case"W":r+=7*parseInt(h[1],10);break;case"m":case"M":a+=parseInt(h[1],10),r=Math.min(r,t.datepicker._getDaysInMonth(o,a));break;case"y":case"Y":o+=parseInt(h[1],10),r=Math.min(r,t.datepicker._getDaysInMonth(o,a))}h=l.exec(i)}return new Date(o,a,r)},a=null==i||""===i?s:"string"==typeof i?o(i):"number"==typeof i?isNaN(i)?s:n(i):new Date(i.getTime());return a=a&&"Invalid Date"==""+a?s:a,a&&(a.setHours(0),a.setMinutes(0),a.setSeconds(0),a.setMilliseconds(0)),this._daylightSavingAdjust(a)},_daylightSavingAdjust:function(t){return t?(t.setHours(t.getHours()>12?t.getHours()+2:0),t):null},_setDate:function(t,e,i){var s=!e,n=t.selectedMonth,o=t.selectedYear,a=this._restrictMinMax(t,this._determineDate(t,e,new Date));t.selectedDay=t.currentDay=a.getDate(),t.drawMonth=t.selectedMonth=t.currentMonth=a.getMonth(),t.drawYear=t.selectedYear=t.currentYear=a.getFullYear(),n===t.selectedMonth&&o===t.selectedYear||i||this._notifyChange(t),this._adjustInstDate(t),t.input&&t.input.val(s?"":this._formatDate(t))},_getDate:function(t){var e=!t.currentYear||t.input&&""===t.input.val()?null:this._daylightSavingAdjust(new Date(t.currentYear,t.currentMonth,t.currentDay));return e},_attachHandlers:function(e){var i=this._get(e,"stepMonths"),s="#"+e.id.replace(/\\\\/g,"\\");e.dpDiv.find("[data-handler]").map(function(){var e={prev:function(){t.datepicker._adjustDate(s,-i,"M")},next:function(){t.datepicker._adjustDate(s,+i,"M")},hide:function(){t.datepicker._hideDatepicker()},today:function(){t.datepicker._gotoToday(s)},selectDay:function(){return t.datepicker._selectDay(s,+this.getAttribute("data-month"),+this.getAttribute("data-year"),this),!1},selectMonth:function(){return t.datepicker._selectMonthYear(s,this,"M"),!1},selectYear:function(){return t.datepicker._selectMonthYear(s,this,"Y"),!1}};t(this).on(this.getAttribute("data-event"),e[this.getAttribute("data-handler")])})},_generateHTML:function(t){var e,i,s,n,o,a,r,l,h,c,u,d,p,f,g,m,_,v,b,y,w,k,x,C,D,T,I,M,P,S,N,H,A,z,O,E,W,F,L,R=new Date,Y=this._daylightSavingAdjust(new Date(R.getFullYear(),R.getMonth(),R.getDate())),B=this._get(t,"isRTL"),j=this._get(t,"showButtonPanel"),q=this._get(t,"hideIfNoPrevNext"),K=this._get(t,"navigationAsDateFormat"),U=this._getNumberOfMonths(t),V=this._get(t,"showCurrentAtPos"),X=this._get(t,"stepMonths"),$=1!==U[0]||1!==U[1],G=this._daylightSavingAdjust(t.currentDay?new Date(t.currentYear,t.currentMonth,t.currentDay):new Date(9999,9,9)),J=this._getMinMaxDate(t,"min"),Q=this._getMinMaxDate(t,"max"),Z=t.drawMonth-V,te=t.drawYear;if(0>Z&&(Z+=12,te--),Q)for(e=this._daylightSavingAdjust(new Date(Q.getFullYear(),Q.getMonth()-U[0]*U[1]+1,Q.getDate())),e=J&&J>e?J:e;this._daylightSavingAdjust(new Date(te,Z,1))>e;)Z--,0>Z&&(Z=11,te--);for(t.drawMonth=Z,t.drawYear=te,i=this._get(t,"prevText"),i=K?this.formatDate(i,this._daylightSavingAdjust(new Date(te,Z-X,1)),this._getFormatConfig(t)):i,s=this._canAdjustMonth(t,-1,te,Z)?"
"+i+"":q?"":""+i+"",n=this._get(t,"nextText"),n=K?this.formatDate(n,this._daylightSavingAdjust(new Date(te,Z+X,1)),this._getFormatConfig(t)):n,o=this._canAdjustMonth(t,1,te,Z)?""+n+"":q?"":""+n+"",a=this._get(t,"currentText"),r=this._get(t,"gotoCurrent")&&t.currentDay?G:Y,a=K?this.formatDate(a,r,this._getFormatConfig(t)):a,l=t.inline?"":"",h=j?"
"+(B?l:"")+(this._isInRange(t,r)?"":"")+(B?"":l)+"
":"",c=parseInt(this._get(t,"firstDay"),10),c=isNaN(c)?0:c,u=this._get(t,"showWeek"),d=this._get(t,"dayNames"),p=this._get(t,"dayNamesMin"),f=this._get(t,"monthNames"),g=this._get(t,"monthNamesShort"),m=this._get(t,"beforeShowDay"),_=this._get(t,"showOtherMonths"),v=this._get(t,"selectOtherMonths"),b=this._getDefaultDate(t),y="",k=0;U[0]>k;k++){for(x="",this.maxRows=4,C=0;U[1]>C;C++){if(D=this._daylightSavingAdjust(new Date(te,Z,t.selectedDay)),T=" ui-corner-all",I="",$){if(I+="
"}for(I+="
"+(/all|left/.test(T)&&0===k?B?o:s:"")+(/all|right/.test(T)&&0===k?B?s:o:"")+this._generateMonthYearHeader(t,Z,te,J,Q,k>0||C>0,f,g)+"
"+"",M=u?"":"",w=0;7>w;w++)P=(w+c)%7,M+="";for(I+=M+"",S=this._getDaysInMonth(te,Z),te===t.selectedYear&&Z===t.selectedMonth&&(t.selectedDay=Math.min(t.selectedDay,S)),N=(this._getFirstDayOfMonth(te,Z)-c+7)%7,H=Math.ceil((N+S)/7),A=$?this.maxRows>H?this.maxRows:H:H,this.maxRows=A,z=this._daylightSavingAdjust(new Date(te,Z,1-N)),O=0;A>O;O++){for(I+="",E=u?"":"",w=0;7>w;w++)W=m?m.apply(t.input?t.input[0]:null,[z]):[!0,""],F=z.getMonth()!==Z,L=F&&!v||!W[0]||J&&J>z||Q&&z>Q,E+="",z.setDate(z.getDate()+1),z=this._daylightSavingAdjust(z);I+=E+""}Z++,Z>11&&(Z=0,te++),I+="
"+this._get(t,"weekHeader")+"=5?" class='ui-datepicker-week-end'":"")+">"+""+p[P]+"
"+this._get(t,"calculateWeek")(z)+""+(F&&!_?" ":L?""+z.getDate()+"":""+z.getDate()+"")+"
"+($?"
"+(U[0]>0&&C===U[1]-1?"
":""):""),x+=I}y+=x}return y+=h,t._keyEvent=!1,y},_generateMonthYearHeader:function(t,e,i,s,n,o,a,r){var l,h,c,u,d,p,f,g,m=this._get(t,"changeMonth"),_=this._get(t,"changeYear"),v=this._get(t,"showMonthAfterYear"),b="
",y="";if(o||!m)y+=""+a[e]+"";else{for(l=s&&s.getFullYear()===i,h=n&&n.getFullYear()===i,y+=""}if(v||(b+=y+(!o&&m&&_?"":" ")),!t.yearshtml)if(t.yearshtml="",o||!_)b+=""+i+"";else{for(u=this._get(t,"yearRange").split(":"),d=(new Date).getFullYear(),p=function(t){var e=t.match(/c[+\-].*/)?i+parseInt(t.substring(1),10):t.match(/[+\-].*/)?d+parseInt(t,10):parseInt(t,10);return isNaN(e)?d:e},f=p(u[0]),g=Math.max(f,p(u[1]||"")),f=s?Math.max(f,s.getFullYear()):f,g=n?Math.min(g,n.getFullYear()):g,t.yearshtml+="",b+=t.yearshtml,t.yearshtml=null}return b+=this._get(t,"yearSuffix"),v&&(b+=(!o&&m&&_?"":" ")+y),b+="
"},_adjustInstDate:function(t,e,i){var s=t.selectedYear+("Y"===i?e:0),n=t.selectedMonth+("M"===i?e:0),o=Math.min(t.selectedDay,this._getDaysInMonth(s,n))+("D"===i?e:0),a=this._restrictMinMax(t,this._daylightSavingAdjust(new Date(s,n,o)));t.selectedDay=a.getDate(),t.drawMonth=t.selectedMonth=a.getMonth(),t.drawYear=t.selectedYear=a.getFullYear(),("M"===i||"Y"===i)&&this._notifyChange(t)},_restrictMinMax:function(t,e){var i=this._getMinMaxDate(t,"min"),s=this._getMinMaxDate(t,"max"),n=i&&i>e?i:e;return s&&n>s?s:n},_notifyChange:function(t){var e=this._get(t,"onChangeMonthYear");e&&e.apply(t.input?t.input[0]:null,[t.selectedYear,t.selectedMonth+1,t])},_getNumberOfMonths:function(t){var e=this._get(t,"numberOfMonths");return null==e?[1,1]:"number"==typeof e?[1,e]:e},_getMinMaxDate:function(t,e){return this._determineDate(t,this._get(t,e+"Date"),null)},_getDaysInMonth:function(t,e){return 32-this._daylightSavingAdjust(new Date(t,e,32)).getDate()},_getFirstDayOfMonth:function(t,e){return new Date(t,e,1).getDay()},_canAdjustMonth:function(t,e,i,s){var n=this._getNumberOfMonths(t),o=this._daylightSavingAdjust(new Date(i,s+(0>e?e:n[0]*n[1]),1));return 0>e&&o.setDate(this._getDaysInMonth(o.getFullYear(),o.getMonth())),this._isInRange(t,o)},_isInRange:function(t,e){var i,s,n=this._getMinMaxDate(t,"min"),o=this._getMinMaxDate(t,"max"),a=null,r=null,l=this._get(t,"yearRange");return l&&(i=l.split(":"),s=(new Date).getFullYear(),a=parseInt(i[0],10),r=parseInt(i[1],10),i[0].match(/[+\-].*/)&&(a+=s),i[1].match(/[+\-].*/)&&(r+=s)),(!n||e.getTime()>=n.getTime())&&(!o||e.getTime()<=o.getTime())&&(!a||e.getFullYear()>=a)&&(!r||r>=e.getFullYear())},_getFormatConfig:function(t){var e=this._get(t,"shortYearCutoff");return e="string"!=typeof e?e:(new Date).getFullYear()%100+parseInt(e,10),{shortYearCutoff:e,dayNamesShort:this._get(t,"dayNamesShort"),dayNames:this._get(t,"dayNames"),monthNamesShort:this._get(t,"monthNamesShort"),monthNames:this._get(t,"monthNames")}},_formatDate:function(t,e,i,s){e||(t.currentDay=t.selectedDay,t.currentMonth=t.selectedMonth,t.currentYear=t.selectedYear);var n=e?"object"==typeof e?e:this._daylightSavingAdjust(new Date(s,i,e)):this._daylightSavingAdjust(new Date(t.currentYear,t.currentMonth,t.currentDay));return this.formatDate(this._get(t,"dateFormat"),n,this._getFormatConfig(t))}}),t.fn.datepicker=function(e){if(!this.length)return this;t.datepicker.initialized||(t(document).on("mousedown",t.datepicker._checkExternalClick),t.datepicker.initialized=!0),0===t("#"+t.datepicker._mainDivId).length&&t("body").append(t.datepicker.dpDiv);var i=Array.prototype.slice.call(arguments,1);return"string"!=typeof e||"isDisabled"!==e&&"getDate"!==e&&"widget"!==e?"option"===e&&2===arguments.length&&"string"==typeof arguments[1]?t.datepicker["_"+e+"Datepicker"].apply(t.datepicker,[this[0]].concat(i)):this.each(function(){"string"==typeof e?t.datepicker["_"+e+"Datepicker"].apply(t.datepicker,[this].concat(i)):t.datepicker._attachDatepicker(this,e)}):t.datepicker["_"+e+"Datepicker"].apply(t.datepicker,[this[0]].concat(i))},t.datepicker=new s,t.datepicker.initialized=!1,t.datepicker.uuid=(new Date).getTime(),t.datepicker.version="1.12.1",t.datepicker,t.widget("ui.dialog",{version:"1.12.1",options:{appendTo:"body",autoOpen:!0,buttons:[],classes:{"ui-dialog":"ui-corner-all","ui-dialog-titlebar":"ui-corner-all"},closeOnEscape:!0,closeText:"Close",draggable:!0,hide:null,height:"auto",maxHeight:null,maxWidth:null,minHeight:150,minWidth:150,modal:!1,position:{my:"center",at:"center",of:window,collision:"fit",using:function(e){var i=t(this).css(e).offset().top;0>i&&t(this).css("top",e.top-i)}},resizable:!0,show:null,title:null,width:300,beforeClose:null,close:null,drag:null,dragStart:null,dragStop:null,focus:null,open:null,resize:null,resizeStart:null,resizeStop:null},sizeRelatedOptions:{buttons:!0,height:!0,maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0,width:!0},resizableRelatedOptions:{maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0},_create:function(){this.originalCss={display:this.element[0].style.display,width:this.element[0].style.width,minHeight:this.element[0].style.minHeight,maxHeight:this.element[0].style.maxHeight,height:this.element[0].style.height},this.originalPosition={parent:this.element.parent(),index:this.element.parent().children().index(this.element)},this.originalTitle=this.element.attr("title"),null==this.options.title&&null!=this.originalTitle&&(this.options.title=this.originalTitle),this.options.disabled&&(this.options.disabled=!1),this._createWrapper(),this.element.show().removeAttr("title").appendTo(this.uiDialog),this._addClass("ui-dialog-content","ui-widget-content"),this._createTitlebar(),this._createButtonPane(),this.options.draggable&&t.fn.draggable&&this._makeDraggable(),this.options.resizable&&t.fn.resizable&&this._makeResizable(),this._isOpen=!1,this._trackFocus()},_init:function(){this.options.autoOpen&&this.open()},_appendTo:function(){var e=this.options.appendTo;return e&&(e.jquery||e.nodeType)?t(e):this.document.find(e||"body").eq(0)},_destroy:function(){var t,e=this.originalPosition;this._untrackInstance(),this._destroyOverlay(),this.element.removeUniqueId().css(this.originalCss).detach(),this.uiDialog.remove(),this.originalTitle&&this.element.attr("title",this.originalTitle),t=e.parent.children().eq(e.index),t.length&&t[0]!==this.element[0]?t.before(this.element):e.parent.append(this.element)},widget:function(){return this.uiDialog},disable:t.noop,enable:t.noop,close:function(e){var i=this;this._isOpen&&this._trigger("beforeClose",e)!==!1&&(this._isOpen=!1,this._focusedElement=null,this._destroyOverlay(),this._untrackInstance(),this.opener.filter(":focusable").trigger("focus").length||t.ui.safeBlur(t.ui.safeActiveElement(this.document[0])),this._hide(this.uiDialog,this.options.hide,function(){i._trigger("close",e)}))},isOpen:function(){return this._isOpen},moveToTop:function(){this._moveToTop()},_moveToTop:function(e,i){var s=!1,n=this.uiDialog.siblings(".ui-front:visible").map(function(){return+t(this).css("z-index")}).get(),o=Math.max.apply(null,n);return o>=+this.uiDialog.css("z-index")&&(this.uiDialog.css("z-index",o+1),s=!0),s&&!i&&this._trigger("focus",e),s},open:function(){var e=this;return this._isOpen?(this._moveToTop()&&this._focusTabbable(),void 0):(this._isOpen=!0,this.opener=t(t.ui.safeActiveElement(this.document[0])),this._size(),this._position(),this._createOverlay(),this._moveToTop(null,!0),this.overlay&&this.overlay.css("z-index",this.uiDialog.css("z-index")-1),this._show(this.uiDialog,this.options.show,function(){e._focusTabbable(),e._trigger("focus")}),this._makeFocusTarget(),this._trigger("open"),void 0)},_focusTabbable:function(){var t=this._focusedElement;t||(t=this.element.find("[autofocus]")),t.length||(t=this.element.find(":tabbable")),t.length||(t=this.uiDialogButtonPane.find(":tabbable")),t.length||(t=this.uiDialogTitlebarClose.filter(":tabbable")),t.length||(t=this.uiDialog),t.eq(0).trigger("focus")},_keepFocus:function(e){function i(){var e=t.ui.safeActiveElement(this.document[0]),i=this.uiDialog[0]===e||t.contains(this.uiDialog[0],e);i||this._focusTabbable()}e.preventDefault(),i.call(this),this._delay(i)},_createWrapper:function(){this.uiDialog=t("
").hide().attr({tabIndex:-1,role:"dialog"}).appendTo(this._appendTo()),this._addClass(this.uiDialog,"ui-dialog","ui-widget ui-widget-content ui-front"),this._on(this.uiDialog,{keydown:function(e){if(this.options.closeOnEscape&&!e.isDefaultPrevented()&&e.keyCode&&e.keyCode===t.ui.keyCode.ESCAPE)return e.preventDefault(),this.close(e),void 0;if(e.keyCode===t.ui.keyCode.TAB&&!e.isDefaultPrevented()){var i=this.uiDialog.find(":tabbable"),s=i.filter(":first"),n=i.filter(":last");e.target!==n[0]&&e.target!==this.uiDialog[0]||e.shiftKey?e.target!==s[0]&&e.target!==this.uiDialog[0]||!e.shiftKey||(this._delay(function(){n.trigger("focus")}),e.preventDefault()):(this._delay(function(){s.trigger("focus")}),e.preventDefault())}},mousedown:function(t){this._moveToTop(t)&&this._focusTabbable()}}),this.element.find("[aria-describedby]").length||this.uiDialog.attr({"aria-describedby":this.element.uniqueId().attr("id")})},_createTitlebar:function(){var e;this.uiDialogTitlebar=t("
"),this._addClass(this.uiDialogTitlebar,"ui-dialog-titlebar","ui-widget-header ui-helper-clearfix"),this._on(this.uiDialogTitlebar,{mousedown:function(e){t(e.target).closest(".ui-dialog-titlebar-close")||this.uiDialog.trigger("focus")}}),this.uiDialogTitlebarClose=t("").button({label:t("").text(this.options.closeText).html(),icon:"ui-icon-closethick",showLabel:!1}).appendTo(this.uiDialogTitlebar),this._addClass(this.uiDialogTitlebarClose,"ui-dialog-titlebar-close"),this._on(this.uiDialogTitlebarClose,{click:function(t){t.preventDefault(),this.close(t)}}),e=t("").uniqueId().prependTo(this.uiDialogTitlebar),this._addClass(e,"ui-dialog-title"),this._title(e),this.uiDialogTitlebar.prependTo(this.uiDialog),this.uiDialog.attr({"aria-labelledby":e.attr("id")})},_title:function(t){this.options.title?t.text(this.options.title):t.html(" ")},_createButtonPane:function(){this.uiDialogButtonPane=t("
"),this._addClass(this.uiDialogButtonPane,"ui-dialog-buttonpane","ui-widget-content ui-helper-clearfix"),this.uiButtonSet=t("
").appendTo(this.uiDialogButtonPane),this._addClass(this.uiButtonSet,"ui-dialog-buttonset"),this._createButtons()},_createButtons:function(){var e=this,i=this.options.buttons;return this.uiDialogButtonPane.remove(),this.uiButtonSet.empty(),t.isEmptyObject(i)||t.isArray(i)&&!i.length?(this._removeClass(this.uiDialog,"ui-dialog-buttons"),void 0):(t.each(i,function(i,s){var n,o;s=t.isFunction(s)?{click:s,text:i}:s,s=t.extend({type:"button"},s),n=s.click,o={icon:s.icon,iconPosition:s.iconPosition,showLabel:s.showLabel,icons:s.icons,text:s.text},delete s.click,delete s.icon,delete s.iconPosition,delete s.showLabel,delete s.icons,"boolean"==typeof s.text&&delete s.text,t("",s).button(o).appendTo(e.uiButtonSet).on("click",function(){n.apply(e.element[0],arguments)})}),this._addClass(this.uiDialog,"ui-dialog-buttons"),this.uiDialogButtonPane.appendTo(this.uiDialog),void 0)},_makeDraggable:function(){function e(t){return{position:t.position,offset:t.offset}}var i=this,s=this.options;this.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(s,n){i._addClass(t(this),"ui-dialog-dragging"),i._blockFrames(),i._trigger("dragStart",s,e(n))},drag:function(t,s){i._trigger("drag",t,e(s))},stop:function(n,o){var a=o.offset.left-i.document.scrollLeft(),r=o.offset.top-i.document.scrollTop();s.position={my:"left top",at:"left"+(a>=0?"+":"")+a+" "+"top"+(r>=0?"+":"")+r,of:i.window},i._removeClass(t(this),"ui-dialog-dragging"),i._unblockFrames(),i._trigger("dragStop",n,e(o))}})},_makeResizable:function(){function e(t){return{originalPosition:t.originalPosition,originalSize:t.originalSize,position:t.position,size:t.size}}var i=this,s=this.options,n=s.resizable,o=this.uiDialog.css("position"),a="string"==typeof n?n:"n,e,s,w,se,sw,ne,nw";this.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:this.element,maxWidth:s.maxWidth,maxHeight:s.maxHeight,minWidth:s.minWidth,minHeight:this._minHeight(),handles:a,start:function(s,n){i._addClass(t(this),"ui-dialog-resizing"),i._blockFrames(),i._trigger("resizeStart",s,e(n))},resize:function(t,s){i._trigger("resize",t,e(s))},stop:function(n,o){var a=i.uiDialog.offset(),r=a.left-i.document.scrollLeft(),l=a.top-i.document.scrollTop();s.height=i.uiDialog.height(),s.width=i.uiDialog.width(),s.position={my:"left top",at:"left"+(r>=0?"+":"")+r+" "+"top"+(l>=0?"+":"")+l,of:i.window},i._removeClass(t(this),"ui-dialog-resizing"),i._unblockFrames(),i._trigger("resizeStop",n,e(o))}}).css("position",o)},_trackFocus:function(){this._on(this.widget(),{focusin:function(e){this._makeFocusTarget(),this._focusedElement=t(e.target)}})},_makeFocusTarget:function(){this._untrackInstance(),this._trackingInstances().unshift(this)},_untrackInstance:function(){var e=this._trackingInstances(),i=t.inArray(this,e);-1!==i&&e.splice(i,1)},_trackingInstances:function(){var t=this.document.data("ui-dialog-instances");return t||(t=[],this.document.data("ui-dialog-instances",t)),t},_minHeight:function(){var t=this.options;return"auto"===t.height?t.minHeight:Math.min(t.minHeight,t.height)},_position:function(){var t=this.uiDialog.is(":visible");t||this.uiDialog.show(),this.uiDialog.position(this.options.position),t||this.uiDialog.hide()},_setOptions:function(e){var i=this,s=!1,n={};t.each(e,function(t,e){i._setOption(t,e),t in i.sizeRelatedOptions&&(s=!0),t in i.resizableRelatedOptions&&(n[t]=e)}),s&&(this._size(),this._position()),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option",n)},_setOption:function(e,i){var s,n,o=this.uiDialog;"disabled"!==e&&(this._super(e,i),"appendTo"===e&&this.uiDialog.appendTo(this._appendTo()),"buttons"===e&&this._createButtons(),"closeText"===e&&this.uiDialogTitlebarClose.button({label:t("").text(""+this.options.closeText).html()}),"draggable"===e&&(s=o.is(":data(ui-draggable)"),s&&!i&&o.draggable("destroy"),!s&&i&&this._makeDraggable()),"position"===e&&this._position(),"resizable"===e&&(n=o.is(":data(ui-resizable)"),n&&!i&&o.resizable("destroy"),n&&"string"==typeof i&&o.resizable("option","handles",i),n||i===!1||this._makeResizable()),"title"===e&&this._title(this.uiDialogTitlebar.find(".ui-dialog-title")))},_size:function(){var t,e,i,s=this.options;this.element.show().css({width:"auto",minHeight:0,maxHeight:"none",height:0}),s.minWidth>s.width&&(s.width=s.minWidth),t=this.uiDialog.css({height:"auto",width:s.width}).outerHeight(),e=Math.max(0,s.minHeight-t),i="number"==typeof s.maxHeight?Math.max(0,s.maxHeight-t):"none","auto"===s.height?this.element.css({minHeight:e,maxHeight:i,height:"auto"}):this.element.height(Math.max(0,s.height-t)),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())},_blockFrames:function(){this.iframeBlocks=this.document.find("iframe").map(function(){var e=t(this);return t("
").css({position:"absolute",width:e.outerWidth(),height:e.outerHeight()}).appendTo(e.parent()).offset(e.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_allowInteraction:function(e){return t(e.target).closest(".ui-dialog").length?!0:!!t(e.target).closest(".ui-datepicker").length},_createOverlay:function(){if(this.options.modal){var e=!0;this._delay(function(){e=!1}),this.document.data("ui-dialog-overlays")||this._on(this.document,{focusin:function(t){e||this._allowInteraction(t)||(t.preventDefault(),this._trackingInstances()[0]._focusTabbable())}}),this.overlay=t("
").appendTo(this._appendTo()),this._addClass(this.overlay,null,"ui-widget-overlay ui-front"),this._on(this.overlay,{mousedown:"_keepFocus"}),this.document.data("ui-dialog-overlays",(this.document.data("ui-dialog-overlays")||0)+1)}},_destroyOverlay:function(){if(this.options.modal&&this.overlay){var t=this.document.data("ui-dialog-overlays")-1;t?this.document.data("ui-dialog-overlays",t):(this._off(this.document,"focusin"),this.document.removeData("ui-dialog-overlays")),this.overlay.remove(),this.overlay=null}}}),t.uiBackCompat!==!1&&t.widget("ui.dialog",t.ui.dialog,{options:{dialogClass:""},_createWrapper:function(){this._super(),this.uiDialog.addClass(this.options.dialogClass)},_setOption:function(t,e){"dialogClass"===t&&this.uiDialog.removeClass(this.options.dialogClass).addClass(e),this._superApply(arguments)}}),t.ui.dialog,t.widget("ui.progressbar",{version:"1.12.1",options:{classes:{"ui-progressbar":"ui-corner-all","ui-progressbar-value":"ui-corner-left","ui-progressbar-complete":"ui-corner-right"},max:100,value:0,change:null,complete:null},min:0,_create:function(){this.oldValue=this.options.value=this._constrainedValue(),this.element.attr({role:"progressbar","aria-valuemin":this.min}),this._addClass("ui-progressbar","ui-widget ui-widget-content"),this.valueDiv=t("
").appendTo(this.element),this._addClass(this.valueDiv,"ui-progressbar-value","ui-widget-header"),this._refreshValue()},_destroy:function(){this.element.removeAttr("role aria-valuemin aria-valuemax aria-valuenow"),this.valueDiv.remove()},value:function(t){return void 0===t?this.options.value:(this.options.value=this._constrainedValue(t),this._refreshValue(),void 0)},_constrainedValue:function(t){return void 0===t&&(t=this.options.value),this.indeterminate=t===!1,"number"!=typeof t&&(t=0),this.indeterminate?!1:Math.min(this.options.max,Math.max(this.min,t))},_setOptions:function(t){var e=t.value;delete t.value,this._super(t),this.options.value=this._constrainedValue(e),this._refreshValue()},_setOption:function(t,e){"max"===t&&(e=Math.max(this.min,e)),this._super(t,e)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",t),this._toggleClass(null,"ui-state-disabled",!!t)},_percentage:function(){return this.indeterminate?100:100*(this.options.value-this.min)/(this.options.max-this.min)},_refreshValue:function(){var e=this.options.value,i=this._percentage();this.valueDiv.toggle(this.indeterminate||e>this.min).width(i.toFixed(0)+"%"),this._toggleClass(this.valueDiv,"ui-progressbar-complete",null,e===this.options.max)._toggleClass("ui-progressbar-indeterminate",null,this.indeterminate),this.indeterminate?(this.element.removeAttr("aria-valuenow"),this.overlayDiv||(this.overlayDiv=t("
").appendTo(this.valueDiv),this._addClass(this.overlayDiv,"ui-progressbar-overlay"))):(this.element.attr({"aria-valuemax":this.options.max,"aria-valuenow":e}),this.overlayDiv&&(this.overlayDiv.remove(),this.overlayDiv=null)),this.oldValue!==e&&(this.oldValue=e,this._trigger("change")),e===this.options.max&&this._trigger("complete")}}),t.widget("ui.selectmenu",[t.ui.formResetMixin,{version:"1.12.1",defaultElement:"",widgetEventPrefix:"spin",options:{classes:{"ui-spinner":"ui-corner-all","ui-spinner-down":"ui-corner-br","ui-spinner-up":"ui-corner-tr"},culture:null,icons:{down:"ui-icon-triangle-1-s",up:"ui-icon-triangle-1-n"},incremental:!0,max:null,min:null,numberFormat:null,page:10,step:1,change:null,spin:null,start:null,stop:null},_create:function(){this._setOption("max",this.options.max),this._setOption("min",this.options.min),this._setOption("step",this.options.step),""!==this.value()&&this._value(this.element.val(),!0),this._draw(),this._on(this._events),this._refresh(),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_getCreateOptions:function(){var e=this._super(),i=this.element;return t.each(["min","max","step"],function(t,s){var n=i.attr(s);null!=n&&n.length&&(e[s]=n)}),e},_events:{keydown:function(t){this._start(t)&&this._keydown(t)&&t.preventDefault()},keyup:"_stop",focus:function(){this.previous=this.element.val()},blur:function(t){return this.cancelBlur?(delete this.cancelBlur,void 0):(this._stop(),this._refresh(),this.previous!==this.element.val()&&this._trigger("change",t),void 0)},mousewheel:function(t,e){if(e){if(!this.spinning&&!this._start(t))return!1;this._spin((e>0?1:-1)*this.options.step,t),clearTimeout(this.mousewheelTimer),this.mousewheelTimer=this._delay(function(){this.spinning&&this._stop(t)},100),t.preventDefault()}},"mousedown .ui-spinner-button":function(e){function i(){var e=this.element[0]===t.ui.safeActiveElement(this.document[0]);e||(this.element.trigger("focus"),this.previous=s,this._delay(function(){this.previous=s}))}var s;s=this.element[0]===t.ui.safeActiveElement(this.document[0])?this.previous:this.element.val(),e.preventDefault(),i.call(this),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur,i.call(this)}),this._start(e)!==!1&&this._repeat(null,t(e.currentTarget).hasClass("ui-spinner-up")?1:-1,e)},"mouseup .ui-spinner-button":"_stop","mouseenter .ui-spinner-button":function(e){return t(e.currentTarget).hasClass("ui-state-active")?this._start(e)===!1?!1:(this._repeat(null,t(e.currentTarget).hasClass("ui-spinner-up")?1:-1,e),void 0):void 0},"mouseleave .ui-spinner-button":"_stop"},_enhance:function(){this.uiSpinner=this.element.attr("autocomplete","off").wrap("").parent().append("")},_draw:function(){this._enhance(),this._addClass(this.uiSpinner,"ui-spinner","ui-widget ui-widget-content"),this._addClass("ui-spinner-input"),this.element.attr("role","spinbutton"),this.buttons=this.uiSpinner.children("a").attr("tabIndex",-1).attr("aria-hidden",!0).button({classes:{"ui-button":""}}),this._removeClass(this.buttons,"ui-corner-all"),this._addClass(this.buttons.first(),"ui-spinner-button ui-spinner-up"),this._addClass(this.buttons.last(),"ui-spinner-button ui-spinner-down"),this.buttons.first().button({icon:this.options.icons.up,showLabel:!1}),this.buttons.last().button({icon:this.options.icons.down,showLabel:!1}),this.buttons.height()>Math.ceil(.5*this.uiSpinner.height())&&this.uiSpinner.height()>0&&this.uiSpinner.height(this.uiSpinner.height())},_keydown:function(e){var i=this.options,s=t.ui.keyCode;switch(e.keyCode){case s.UP:return this._repeat(null,1,e),!0;case s.DOWN:return this._repeat(null,-1,e),!0;case s.PAGE_UP:return this._repeat(null,i.page,e),!0;case s.PAGE_DOWN:return this._repeat(null,-i.page,e),!0}return!1},_start:function(t){return this.spinning||this._trigger("start",t)!==!1?(this.counter||(this.counter=1),this.spinning=!0,!0):!1},_repeat:function(t,e,i){t=t||500,clearTimeout(this.timer),this.timer=this._delay(function(){this._repeat(40,e,i)},t),this._spin(e*this.options.step,i)},_spin:function(t,e){var i=this.value()||0;this.counter||(this.counter=1),i=this._adjustValue(i+t*this._increment(this.counter)),this.spinning&&this._trigger("spin",e,{value:i})===!1||(this._value(i),this.counter++)},_increment:function(e){var i=this.options.incremental;return i?t.isFunction(i)?i(e):Math.floor(e*e*e/5e4-e*e/500+17*e/200+1):1},_precision:function(){var t=this._precisionOf(this.options.step);return null!==this.options.min&&(t=Math.max(t,this._precisionOf(this.options.min))),t},_precisionOf:function(t){var e=""+t,i=e.indexOf(".");return-1===i?0:e.length-i-1},_adjustValue:function(t){var e,i,s=this.options;return e=null!==s.min?s.min:0,i=t-e,i=Math.round(i/s.step)*s.step,t=e+i,t=parseFloat(t.toFixed(this._precision())),null!==s.max&&t>s.max?s.max:null!==s.min&&s.min>t?s.min:t},_stop:function(t){this.spinning&&(clearTimeout(this.timer),clearTimeout(this.mousewheelTimer),this.counter=0,this.spinning=!1,this._trigger("stop",t))},_setOption:function(t,e){var i,s,n;return"culture"===t||"numberFormat"===t?(i=this._parse(this.element.val()),this.options[t]=e,this.element.val(this._format(i)),void 0):(("max"===t||"min"===t||"step"===t)&&"string"==typeof e&&(e=this._parse(e)),"icons"===t&&(s=this.buttons.first().find(".ui-icon"),this._removeClass(s,null,this.options.icons.up),this._addClass(s,null,e.up),n=this.buttons.last().find(".ui-icon"),this._removeClass(n,null,this.options.icons.down),this._addClass(n,null,e.down)),this._super(t,e),void 0)},_setOptionDisabled:function(t){this._super(t),this._toggleClass(this.uiSpinner,null,"ui-state-disabled",!!t),this.element.prop("disabled",!!t),this.buttons.button(t?"disable":"enable")},_setOptions:r(function(t){this._super(t)}),_parse:function(t){return"string"==typeof t&&""!==t&&(t=window.Globalize&&this.options.numberFormat?Globalize.parseFloat(t,10,this.options.culture):+t),""===t||isNaN(t)?null:t},_format:function(t){return""===t?"":window.Globalize&&this.options.numberFormat?Globalize.format(t,this.options.numberFormat,this.options.culture):t},_refresh:function(){this.element.attr({"aria-valuemin":this.options.min,"aria-valuemax":this.options.max,"aria-valuenow":this._parse(this.element.val())})},isValid:function(){var t=this.value();return null===t?!1:t===this._adjustValue(t)},_value:function(t,e){var i;""!==t&&(i=this._parse(t),null!==i&&(e||(i=this._adjustValue(i)),t=this._format(i))),this.element.val(t),this._refresh()},_destroy:function(){this.element.prop("disabled",!1).removeAttr("autocomplete role aria-valuemin aria-valuemax aria-valuenow"),this.uiSpinner.replaceWith(this.element)},stepUp:r(function(t){this._stepUp(t)}),_stepUp:function(t){this._start()&&(this._spin((t||1)*this.options.step),this._stop())},stepDown:r(function(t){this._stepDown(t)}),_stepDown:function(t){this._start()&&(this._spin((t||1)*-this.options.step),this._stop())},pageUp:r(function(t){this._stepUp((t||1)*this.options.page)}),pageDown:r(function(t){this._stepDown((t||1)*this.options.page)}),value:function(t){return arguments.length?(r(this._value).call(this,t),void 0):this._parse(this.element.val())},widget:function(){return this.uiSpinner}}),t.uiBackCompat!==!1&&t.widget("ui.spinner",t.ui.spinner,{_enhance:function(){this.uiSpinner=this.element.attr("autocomplete","off").wrap(this._uiSpinnerHtml()).parent().append(this._buttonHtml())},_uiSpinnerHtml:function(){return""},_buttonHtml:function(){return""}}),t.ui.spinner,t.widget("ui.tabs",{version:"1.12.1",delay:300,options:{active:null,classes:{"ui-tabs":"ui-corner-all","ui-tabs-nav":"ui-corner-all","ui-tabs-panel":"ui-corner-bottom","ui-tabs-tab":"ui-corner-top"},collapsible:!1,event:"click",heightStyle:"content",hide:null,show:null,activate:null,beforeActivate:null,beforeLoad:null,load:null},_isLocal:function(){var t=/#.*$/;return function(e){var i,s;i=e.href.replace(t,""),s=location.href.replace(t,"");try{i=decodeURIComponent(i)}catch(n){}try{s=decodeURIComponent(s)}catch(n){}return e.hash.length>1&&i===s}}(),_create:function(){var e=this,i=this.options;this.running=!1,this._addClass("ui-tabs","ui-widget ui-widget-content"),this._toggleClass("ui-tabs-collapsible",null,i.collapsible),this._processTabs(),i.active=this._initialActive(),t.isArray(i.disabled)&&(i.disabled=t.unique(i.disabled.concat(t.map(this.tabs.filter(".ui-state-disabled"),function(t){return e.tabs.index(t)}))).sort()),this.active=this.options.active!==!1&&this.anchors.length?this._findActive(i.active):t(),this._refresh(),this.active.length&&this.load(i.active)},_initialActive:function(){var e=this.options.active,i=this.options.collapsible,s=location.hash.substring(1);return null===e&&(s&&this.tabs.each(function(i,n){return t(n).attr("aria-controls")===s?(e=i,!1):void 0}),null===e&&(e=this.tabs.index(this.tabs.filter(".ui-tabs-active"))),(null===e||-1===e)&&(e=this.tabs.length?0:!1)),e!==!1&&(e=this.tabs.index(this.tabs.eq(e)),-1===e&&(e=i?!1:0)),!i&&e===!1&&this.anchors.length&&(e=0),e},_getCreateEventData:function(){return{tab:this.active,panel:this.active.length?this._getPanelForTab(this.active):t()}},_tabKeydown:function(e){var i=t(t.ui.safeActiveElement(this.document[0])).closest("li"),s=this.tabs.index(i),n=!0;if(!this._handlePageNav(e)){switch(e.keyCode){case t.ui.keyCode.RIGHT:case t.ui.keyCode.DOWN:s++;break;case t.ui.keyCode.UP:case t.ui.keyCode.LEFT:n=!1,s--;break;case t.ui.keyCode.END:s=this.anchors.length-1;break;case t.ui.keyCode.HOME:s=0;break;case t.ui.keyCode.SPACE:return e.preventDefault(),clearTimeout(this.activating),this._activate(s),void 0;case t.ui.keyCode.ENTER:return e.preventDefault(),clearTimeout(this.activating),this._activate(s===this.options.active?!1:s),void 0;default:return}e.preventDefault(),clearTimeout(this.activating),s=this._focusNextTab(s,n),e.ctrlKey||e.metaKey||(i.attr("aria-selected","false"),this.tabs.eq(s).attr("aria-selected","true"),this.activating=this._delay(function(){this.option("active",s)},this.delay))}},_panelKeydown:function(e){this._handlePageNav(e)||e.ctrlKey&&e.keyCode===t.ui.keyCode.UP&&(e.preventDefault(),this.active.trigger("focus"))},_handlePageNav:function(e){return e.altKey&&e.keyCode===t.ui.keyCode.PAGE_UP?(this._activate(this._focusNextTab(this.options.active-1,!1)),!0):e.altKey&&e.keyCode===t.ui.keyCode.PAGE_DOWN?(this._activate(this._focusNextTab(this.options.active+1,!0)),!0):void 0},_findNextTab:function(e,i){function s(){return e>n&&(e=0),0>e&&(e=n),e}for(var n=this.tabs.length-1;-1!==t.inArray(s(),this.options.disabled);)e=i?e+1:e-1;return e},_focusNextTab:function(t,e){return t=this._findNextTab(t,e),this.tabs.eq(t).trigger("focus"),t},_setOption:function(t,e){return"active"===t?(this._activate(e),void 0):(this._super(t,e),"collapsible"===t&&(this._toggleClass("ui-tabs-collapsible",null,e),e||this.options.active!==!1||this._activate(0)),"event"===t&&this._setupEvents(e),"heightStyle"===t&&this._setupHeightStyle(e),void 0)},_sanitizeSelector:function(t){return t?t.replace(/[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g,"\\$&"):""},refresh:function(){var e=this.options,i=this.tablist.children(":has(a[href])");e.disabled=t.map(i.filter(".ui-state-disabled"),function(t){return i.index(t)}),this._processTabs(),e.active!==!1&&this.anchors.length?this.active.length&&!t.contains(this.tablist[0],this.active[0])?this.tabs.length===e.disabled.length?(e.active=!1,this.active=t()):this._activate(this._findNextTab(Math.max(0,e.active-1),!1)):e.active=this.tabs.index(this.active):(e.active=!1,this.active=t()),this._refresh()},_refresh:function(){this._setOptionDisabled(this.options.disabled),this._setupEvents(this.options.event),this._setupHeightStyle(this.options.heightStyle),this.tabs.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}),this.panels.not(this._getPanelForTab(this.active)).hide().attr({"aria-hidden":"true"}),this.active.length?(this.active.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}),this._addClass(this.active,"ui-tabs-active","ui-state-active"),this._getPanelForTab(this.active).show().attr({"aria-hidden":"false"})):this.tabs.eq(0).attr("tabIndex",0)},_processTabs:function(){var e=this,i=this.tabs,s=this.anchors,n=this.panels;this.tablist=this._getList().attr("role","tablist"),this._addClass(this.tablist,"ui-tabs-nav","ui-helper-reset ui-helper-clearfix ui-widget-header"),this.tablist.on("mousedown"+this.eventNamespace,"> li",function(e){t(this).is(".ui-state-disabled")&&e.preventDefault()}).on("focus"+this.eventNamespace,".ui-tabs-anchor",function(){t(this).closest("li").is(".ui-state-disabled")&&this.blur()}),this.tabs=this.tablist.find("> li:has(a[href])").attr({role:"tab",tabIndex:-1}),this._addClass(this.tabs,"ui-tabs-tab","ui-state-default"),this.anchors=this.tabs.map(function(){return t("a",this)[0]}).attr({role:"presentation",tabIndex:-1}),this._addClass(this.anchors,"ui-tabs-anchor"),this.panels=t(),this.anchors.each(function(i,s){var n,o,a,r=t(s).uniqueId().attr("id"),l=t(s).closest("li"),h=l.attr("aria-controls");e._isLocal(s)?(n=s.hash,a=n.substring(1),o=e.element.find(e._sanitizeSelector(n))):(a=l.attr("aria-controls")||t({}).uniqueId()[0].id,n="#"+a,o=e.element.find(n),o.length||(o=e._createPanel(a),o.insertAfter(e.panels[i-1]||e.tablist)),o.attr("aria-live","polite")),o.length&&(e.panels=e.panels.add(o)),h&&l.data("ui-tabs-aria-controls",h),l.attr({"aria-controls":a,"aria-labelledby":r}),o.attr("aria-labelledby",r)}),this.panels.attr("role","tabpanel"),this._addClass(this.panels,"ui-tabs-panel","ui-widget-content"),i&&(this._off(i.not(this.tabs)),this._off(s.not(this.anchors)),this._off(n.not(this.panels)))},_getList:function(){return this.tablist||this.element.find("ol, ul").eq(0)},_createPanel:function(e){return t("
").attr("id",e).data("ui-tabs-destroy",!0)},_setOptionDisabled:function(e){var i,s,n;for(t.isArray(e)&&(e.length?e.length===this.anchors.length&&(e=!0):e=!1),n=0;s=this.tabs[n];n++)i=t(s),e===!0||-1!==t.inArray(n,e)?(i.attr("aria-disabled","true"),this._addClass(i,null,"ui-state-disabled")):(i.removeAttr("aria-disabled"),this._removeClass(i,null,"ui-state-disabled"));this.options.disabled=e,this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,e===!0)},_setupEvents:function(e){var i={};e&&t.each(e.split(" "),function(t,e){i[e]="_eventHandler"}),this._off(this.anchors.add(this.tabs).add(this.panels)),this._on(!0,this.anchors,{click:function(t){t.preventDefault()}}),this._on(this.anchors,i),this._on(this.tabs,{keydown:"_tabKeydown"}),this._on(this.panels,{keydown:"_panelKeydown"}),this._focusable(this.tabs),this._hoverable(this.tabs)},_setupHeightStyle:function(e){var i,s=this.element.parent();"fill"===e?(i=s.height(),i-=this.element.outerHeight()-this.element.height(),this.element.siblings(":visible").each(function(){var e=t(this),s=e.css("position");"absolute"!==s&&"fixed"!==s&&(i-=e.outerHeight(!0))}),this.element.children().not(this.panels).each(function(){i-=t(this).outerHeight(!0)}),this.panels.each(function(){t(this).height(Math.max(0,i-t(this).innerHeight()+t(this).height()))}).css("overflow","auto")):"auto"===e&&(i=0,this.panels.each(function(){i=Math.max(i,t(this).height("").height())}).height(i))},_eventHandler:function(e){var i=this.options,s=this.active,n=t(e.currentTarget),o=n.closest("li"),a=o[0]===s[0],r=a&&i.collapsible,l=r?t():this._getPanelForTab(o),h=s.length?this._getPanelForTab(s):t(),c={oldTab:s,oldPanel:h,newTab:r?t():o,newPanel:l};e.preventDefault(),o.hasClass("ui-state-disabled")||o.hasClass("ui-tabs-loading")||this.running||a&&!i.collapsible||this._trigger("beforeActivate",e,c)===!1||(i.active=r?!1:this.tabs.index(o),this.active=a?t():o,this.xhr&&this.xhr.abort(),h.length||l.length||t.error("jQuery UI Tabs: Mismatching fragment identifier."),l.length&&this.load(this.tabs.index(o),e),this._toggle(e,c))},_toggle:function(e,i){function s(){o.running=!1,o._trigger("activate",e,i)}function n(){o._addClass(i.newTab.closest("li"),"ui-tabs-active","ui-state-active"),a.length&&o.options.show?o._show(a,o.options.show,s):(a.show(),s())}var o=this,a=i.newPanel,r=i.oldPanel;this.running=!0,r.length&&this.options.hide?this._hide(r,this.options.hide,function(){o._removeClass(i.oldTab.closest("li"),"ui-tabs-active","ui-state-active"),n()}):(this._removeClass(i.oldTab.closest("li"),"ui-tabs-active","ui-state-active"),r.hide(),n()),r.attr("aria-hidden","true"),i.oldTab.attr({"aria-selected":"false","aria-expanded":"false"}),a.length&&r.length?i.oldTab.attr("tabIndex",-1):a.length&&this.tabs.filter(function(){return 0===t(this).attr("tabIndex")}).attr("tabIndex",-1),a.attr("aria-hidden","false"),i.newTab.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_activate:function(e){var i,s=this._findActive(e);s[0]!==this.active[0]&&(s.length||(s=this.active),i=s.find(".ui-tabs-anchor")[0],this._eventHandler({target:i,currentTarget:i,preventDefault:t.noop}))},_findActive:function(e){return e===!1?t():this.tabs.eq(e)},_getIndex:function(e){return"string"==typeof e&&(e=this.anchors.index(this.anchors.filter("[href$='"+t.ui.escapeSelector(e)+"']"))),e},_destroy:function(){this.xhr&&this.xhr.abort(),this.tablist.removeAttr("role").off(this.eventNamespace),this.anchors.removeAttr("role tabIndex").removeUniqueId(),this.tabs.add(this.panels).each(function(){t.data(this,"ui-tabs-destroy")?t(this).remove():t(this).removeAttr("role tabIndex aria-live aria-busy aria-selected aria-labelledby aria-hidden aria-expanded")}),this.tabs.each(function(){var e=t(this),i=e.data("ui-tabs-aria-controls");i?e.attr("aria-controls",i).removeData("ui-tabs-aria-controls"):e.removeAttr("aria-controls")}),this.panels.show(),"content"!==this.options.heightStyle&&this.panels.css("height","")},enable:function(e){var i=this.options.disabled;i!==!1&&(void 0===e?i=!1:(e=this._getIndex(e),i=t.isArray(i)?t.map(i,function(t){return t!==e?t:null}):t.map(this.tabs,function(t,i){return i!==e?i:null})),this._setOptionDisabled(i))},disable:function(e){var i=this.options.disabled;if(i!==!0){if(void 0===e)i=!0;else{if(e=this._getIndex(e),-1!==t.inArray(e,i))return;i=t.isArray(i)?t.merge([e],i).sort():[e]}this._setOptionDisabled(i)}},load:function(e,i){e=this._getIndex(e);var s=this,n=this.tabs.eq(e),o=n.find(".ui-tabs-anchor"),a=this._getPanelForTab(n),r={tab:n,panel:a},l=function(t,e){"abort"===e&&s.panels.stop(!1,!0),s._removeClass(n,"ui-tabs-loading"),a.removeAttr("aria-busy"),t===s.xhr&&delete s.xhr};this._isLocal(o[0])||(this.xhr=t.ajax(this._ajaxSettings(o,i,r)),this.xhr&&"canceled"!==this.xhr.statusText&&(this._addClass(n,"ui-tabs-loading"),a.attr("aria-busy","true"),this.xhr.done(function(t,e,n){setTimeout(function(){a.html(t),s._trigger("load",i,r),l(n,e)},1)}).fail(function(t,e){setTimeout(function(){l(t,e)},1)})))},_ajaxSettings:function(e,i,s){var n=this;return{url:e.attr("href").replace(/#.*$/,""),beforeSend:function(e,o){return n._trigger("beforeLoad",i,t.extend({jqXHR:e,ajaxSettings:o},s))}}},_getPanelForTab:function(e){var i=t(e).attr("aria-controls");return this.element.find(this._sanitizeSelector("#"+i))}}),t.uiBackCompat!==!1&&t.widget("ui.tabs",t.ui.tabs,{_processTabs:function(){this._superApply(arguments),this._addClass(this.tabs,"ui-tab")}}),t.ui.tabs,t.widget("ui.tooltip",{version:"1.12.1",options:{classes:{"ui-tooltip":"ui-corner-all ui-widget-shadow"},content:function(){var e=t(this).attr("title")||"";return t("").text(e).html()},hide:!0,items:"[title]:not([disabled])",position:{my:"left top+15",at:"left bottom",collision:"flipfit flip"},show:!0,track:!1,close:null,open:null},_addDescribedBy:function(e,i){var s=(e.attr("aria-describedby")||"").split(/\s+/);s.push(i),e.data("ui-tooltip-id",i).attr("aria-describedby",t.trim(s.join(" ")))},_removeDescribedBy:function(e){var i=e.data("ui-tooltip-id"),s=(e.attr("aria-describedby")||"").split(/\s+/),n=t.inArray(i,s);-1!==n&&s.splice(n,1),e.removeData("ui-tooltip-id"),s=t.trim(s.join(" ")),s?e.attr("aria-describedby",s):e.removeAttr("aria-describedby")},_create:function(){this._on({mouseover:"open",focusin:"open"}),this.tooltips={},this.parents={},this.liveRegion=t("
").attr({role:"log","aria-live":"assertive","aria-relevant":"additions"}).appendTo(this.document[0].body),this._addClass(this.liveRegion,null,"ui-helper-hidden-accessible"),this.disabledTitles=t([])},_setOption:function(e,i){var s=this;this._super(e,i),"content"===e&&t.each(this.tooltips,function(t,e){s._updateContent(e.element)})},_setOptionDisabled:function(t){this[t?"_disable":"_enable"]()},_disable:function(){var e=this;t.each(this.tooltips,function(i,s){var n=t.Event("blur");n.target=n.currentTarget=s.element[0],e.close(n,!0)}),this.disabledTitles=this.disabledTitles.add(this.element.find(this.options.items).addBack().filter(function(){var e=t(this);return e.is("[title]")?e.data("ui-tooltip-title",e.attr("title")).removeAttr("title"):void 0}))},_enable:function(){this.disabledTitles.each(function(){var e=t(this);e.data("ui-tooltip-title")&&e.attr("title",e.data("ui-tooltip-title"))}),this.disabledTitles=t([])},open:function(e){var i=this,s=t(e?e.target:this.element).closest(this.options.items);s.length&&!s.data("ui-tooltip-id")&&(s.attr("title")&&s.data("ui-tooltip-title",s.attr("title")),s.data("ui-tooltip-open",!0),e&&"mouseover"===e.type&&s.parents().each(function(){var e,s=t(this);s.data("ui-tooltip-open")&&(e=t.Event("blur"),e.target=e.currentTarget=this,i.close(e,!0)),s.attr("title")&&(s.uniqueId(),i.parents[this.id]={element:this,title:s.attr("title")},s.attr("title",""))}),this._registerCloseHandlers(e,s),this._updateContent(s,e))},_updateContent:function(t,e){var i,s=this.options.content,n=this,o=e?e.type:null;return"string"==typeof s||s.nodeType||s.jquery?this._open(e,t,s):(i=s.call(t[0],function(i){n._delay(function(){t.data("ui-tooltip-open")&&(e&&(e.type=o),this._open(e,t,i))})}),i&&this._open(e,t,i),void 0)},_open:function(e,i,s){function n(t){h.of=t,a.is(":hidden")||a.position(h)}var o,a,r,l,h=t.extend({},this.options.position);if(s){if(o=this._find(i))return o.tooltip.find(".ui-tooltip-content").html(s),void 0;i.is("[title]")&&(e&&"mouseover"===e.type?i.attr("title",""):i.removeAttr("title")),o=this._tooltip(i),a=o.tooltip,this._addDescribedBy(i,a.attr("id")),a.find(".ui-tooltip-content").html(s),this.liveRegion.children().hide(),l=t("
").html(a.find(".ui-tooltip-content").html()),l.removeAttr("name").find("[name]").removeAttr("name"),l.removeAttr("id").find("[id]").removeAttr("id"),l.appendTo(this.liveRegion),this.options.track&&e&&/^mouse/.test(e.type)?(this._on(this.document,{mousemove:n}),n(e)):a.position(t.extend({of:i},this.options.position)),a.hide(),this._show(a,this.options.show),this.options.track&&this.options.show&&this.options.show.delay&&(r=this.delayedShow=setInterval(function(){a.is(":visible")&&(n(h.of),clearInterval(r))},t.fx.interval)),this._trigger("open",e,{tooltip:a})}},_registerCloseHandlers:function(e,i){var s={keyup:function(e){if(e.keyCode===t.ui.keyCode.ESCAPE){var s=t.Event(e);s.currentTarget=i[0],this.close(s,!0)}}};i[0]!==this.element[0]&&(s.remove=function(){this._removeTooltip(this._find(i).tooltip)}),e&&"mouseover"!==e.type||(s.mouseleave="close"),e&&"focusin"!==e.type||(s.focusout="close"),this._on(!0,i,s)},close:function(e){var i,s=this,n=t(e?e.currentTarget:this.element),o=this._find(n);return o?(i=o.tooltip,o.closing||(clearInterval(this.delayedShow),n.data("ui-tooltip-title")&&!n.attr("title")&&n.attr("title",n.data("ui-tooltip-title")),this._removeDescribedBy(n),o.hiding=!0,i.stop(!0),this._hide(i,this.options.hide,function(){s._removeTooltip(t(this))}),n.removeData("ui-tooltip-open"),this._off(n,"mouseleave focusout keyup"),n[0]!==this.element[0]&&this._off(n,"remove"),this._off(this.document,"mousemove"),e&&"mouseleave"===e.type&&t.each(this.parents,function(e,i){t(i.element).attr("title",i.title),delete s.parents[e] }),o.closing=!0,this._trigger("close",e,{tooltip:i}),o.hiding||(o.closing=!1)),void 0):(n.removeData("ui-tooltip-open"),void 0)},_tooltip:function(e){var i=t("
").attr("role","tooltip"),s=t("
").appendTo(i),n=i.uniqueId().attr("id");return this._addClass(s,"ui-tooltip-content"),this._addClass(i,"ui-tooltip","ui-widget ui-widget-content"),i.appendTo(this._appendTo(e)),this.tooltips[n]={element:e,tooltip:i}},_find:function(t){var e=t.data("ui-tooltip-id");return e?this.tooltips[e]:null},_removeTooltip:function(t){t.remove(),delete this.tooltips[t.attr("id")]},_appendTo:function(t){var e=t.closest(".ui-front, dialog");return e.length||(e=this.document[0].body),e},_destroy:function(){var e=this;t.each(this.tooltips,function(i,s){var n=t.Event("blur"),o=s.element;n.target=n.currentTarget=o[0],e.close(n,!0),t("#"+i).remove(),o.data("ui-tooltip-title")&&(o.attr("title")||o.attr("title",o.data("ui-tooltip-title")),o.removeData("ui-tooltip-title"))}),this.liveRegion.remove()}}),t.uiBackCompat!==!1&&t.widget("ui.tooltip",t.ui.tooltip,{options:{tooltipClass:null},_tooltip:function(){var t=this._superApply(arguments);return this.options.tooltipClass&&t.tooltip.addClass(this.options.tooltipClass),t}}),t.ui.tooltip;var f="ui-effects-",g="ui-effects-style",m="ui-effects-animated",_=t;t.effects={effect:{}},function(t,e){function i(t,e,i){var s=u[e.type]||{};return null==t?i||!e.def?null:e.def:(t=s.floor?~~t:parseFloat(t),isNaN(t)?e.def:s.mod?(t+s.mod)%s.mod:0>t?0:t>s.max?s.max:t)}function s(i){var s=h(),n=s._rgba=[];return i=i.toLowerCase(),f(l,function(t,o){var a,r=o.re.exec(i),l=r&&o.parse(r),h=o.space||"rgba";return l?(a=s[h](l),s[c[h].cache]=a[c[h].cache],n=s._rgba=a._rgba,!1):e}),n.length?("0,0,0,0"===n.join()&&t.extend(n,o.transparent),s):o[i]}function n(t,e,i){return i=(i+1)%1,1>6*i?t+6*(e-t)*i:1>2*i?e:2>3*i?t+6*(e-t)*(2/3-i):t}var o,a="backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",r=/^([\-+])=\s*(\d+\.?\d*)/,l=[{re:/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(t){return[t[1],t[2],t[3],t[4]]}},{re:/rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(t){return[2.55*t[1],2.55*t[2],2.55*t[3],t[4]]}},{re:/#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,parse:function(t){return[parseInt(t[1],16),parseInt(t[2],16),parseInt(t[3],16)]}},{re:/#([a-f0-9])([a-f0-9])([a-f0-9])/,parse:function(t){return[parseInt(t[1]+t[1],16),parseInt(t[2]+t[2],16),parseInt(t[3]+t[3],16)]}},{re:/hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,space:"hsla",parse:function(t){return[t[1],t[2]/100,t[3]/100,t[4]]}}],h=t.Color=function(e,i,s,n){return new t.Color.fn.parse(e,i,s,n)},c={rgba:{props:{red:{idx:0,type:"byte"},green:{idx:1,type:"byte"},blue:{idx:2,type:"byte"}}},hsla:{props:{hue:{idx:0,type:"degrees"},saturation:{idx:1,type:"percent"},lightness:{idx:2,type:"percent"}}}},u={"byte":{floor:!0,max:255},percent:{max:1},degrees:{mod:360,floor:!0}},d=h.support={},p=t("

")[0],f=t.each;p.style.cssText="background-color:rgba(1,1,1,.5)",d.rgba=p.style.backgroundColor.indexOf("rgba")>-1,f(c,function(t,e){e.cache="_"+t,e.props.alpha={idx:3,type:"percent",def:1}}),h.fn=t.extend(h.prototype,{parse:function(n,a,r,l){if(n===e)return this._rgba=[null,null,null,null],this;(n.jquery||n.nodeType)&&(n=t(n).css(a),a=e);var u=this,d=t.type(n),p=this._rgba=[];return a!==e&&(n=[n,a,r,l],d="array"),"string"===d?this.parse(s(n)||o._default):"array"===d?(f(c.rgba.props,function(t,e){p[e.idx]=i(n[e.idx],e)}),this):"object"===d?(n instanceof h?f(c,function(t,e){n[e.cache]&&(u[e.cache]=n[e.cache].slice())}):f(c,function(e,s){var o=s.cache;f(s.props,function(t,e){if(!u[o]&&s.to){if("alpha"===t||null==n[t])return;u[o]=s.to(u._rgba)}u[o][e.idx]=i(n[t],e,!0)}),u[o]&&0>t.inArray(null,u[o].slice(0,3))&&(u[o][3]=1,s.from&&(u._rgba=s.from(u[o])))}),this):e},is:function(t){var i=h(t),s=!0,n=this;return f(c,function(t,o){var a,r=i[o.cache];return r&&(a=n[o.cache]||o.to&&o.to(n._rgba)||[],f(o.props,function(t,i){return null!=r[i.idx]?s=r[i.idx]===a[i.idx]:e})),s}),s},_space:function(){var t=[],e=this;return f(c,function(i,s){e[s.cache]&&t.push(i)}),t.pop()},transition:function(t,e){var s=h(t),n=s._space(),o=c[n],a=0===this.alpha()?h("transparent"):this,r=a[o.cache]||o.to(a._rgba),l=r.slice();return s=s[o.cache],f(o.props,function(t,n){var o=n.idx,a=r[o],h=s[o],c=u[n.type]||{};null!==h&&(null===a?l[o]=h:(c.mod&&(h-a>c.mod/2?a+=c.mod:a-h>c.mod/2&&(a-=c.mod)),l[o]=i((h-a)*e+a,n)))}),this[n](l)},blend:function(e){if(1===this._rgba[3])return this;var i=this._rgba.slice(),s=i.pop(),n=h(e)._rgba;return h(t.map(i,function(t,e){return(1-s)*n[e]+s*t}))},toRgbaString:function(){var e="rgba(",i=t.map(this._rgba,function(t,e){return null==t?e>2?1:0:t});return 1===i[3]&&(i.pop(),e="rgb("),e+i.join()+")"},toHslaString:function(){var e="hsla(",i=t.map(this.hsla(),function(t,e){return null==t&&(t=e>2?1:0),e&&3>e&&(t=Math.round(100*t)+"%"),t});return 1===i[3]&&(i.pop(),e="hsl("),e+i.join()+")"},toHexString:function(e){var i=this._rgba.slice(),s=i.pop();return e&&i.push(~~(255*s)),"#"+t.map(i,function(t){return t=(t||0).toString(16),1===t.length?"0"+t:t}).join("")},toString:function(){return 0===this._rgba[3]?"transparent":this.toRgbaString()}}),h.fn.parse.prototype=h.fn,c.hsla.to=function(t){if(null==t[0]||null==t[1]||null==t[2])return[null,null,null,t[3]];var e,i,s=t[0]/255,n=t[1]/255,o=t[2]/255,a=t[3],r=Math.max(s,n,o),l=Math.min(s,n,o),h=r-l,c=r+l,u=.5*c;return e=l===r?0:s===r?60*(n-o)/h+360:n===r?60*(o-s)/h+120:60*(s-n)/h+240,i=0===h?0:.5>=u?h/c:h/(2-c),[Math.round(e)%360,i,u,null==a?1:a]},c.hsla.from=function(t){if(null==t[0]||null==t[1]||null==t[2])return[null,null,null,t[3]];var e=t[0]/360,i=t[1],s=t[2],o=t[3],a=.5>=s?s*(1+i):s+i-s*i,r=2*s-a;return[Math.round(255*n(r,a,e+1/3)),Math.round(255*n(r,a,e)),Math.round(255*n(r,a,e-1/3)),o]},f(c,function(s,n){var o=n.props,a=n.cache,l=n.to,c=n.from;h.fn[s]=function(s){if(l&&!this[a]&&(this[a]=l(this._rgba)),s===e)return this[a].slice();var n,r=t.type(s),u="array"===r||"object"===r?s:arguments,d=this[a].slice();return f(o,function(t,e){var s=u["object"===r?t:e.idx];null==s&&(s=d[e.idx]),d[e.idx]=i(s,e)}),c?(n=h(c(d)),n[a]=d,n):h(d)},f(o,function(e,i){h.fn[e]||(h.fn[e]=function(n){var o,a=t.type(n),l="alpha"===e?this._hsla?"hsla":"rgba":s,h=this[l](),c=h[i.idx];return"undefined"===a?c:("function"===a&&(n=n.call(this,c),a=t.type(n)),null==n&&i.empty?this:("string"===a&&(o=r.exec(n),o&&(n=c+parseFloat(o[2])*("+"===o[1]?1:-1))),h[i.idx]=n,this[l](h)))})})}),h.hook=function(e){var i=e.split(" ");f(i,function(e,i){t.cssHooks[i]={set:function(e,n){var o,a,r="";if("transparent"!==n&&("string"!==t.type(n)||(o=s(n)))){if(n=h(o||n),!d.rgba&&1!==n._rgba[3]){for(a="backgroundColor"===i?e.parentNode:e;(""===r||"transparent"===r)&&a&&a.style;)try{r=t.css(a,"backgroundColor"),a=a.parentNode}catch(l){}n=n.blend(r&&"transparent"!==r?r:"_default")}n=n.toRgbaString()}try{e.style[i]=n}catch(l){}}},t.fx.step[i]=function(e){e.colorInit||(e.start=h(e.elem,i),e.end=h(e.end),e.colorInit=!0),t.cssHooks[i].set(e.elem,e.start.transition(e.end,e.pos))}})},h.hook(a),t.cssHooks.borderColor={expand:function(t){var e={};return f(["Top","Right","Bottom","Left"],function(i,s){e["border"+s+"Color"]=t}),e}},o=t.Color.names={aqua:"#00ffff",black:"#000000",blue:"#0000ff",fuchsia:"#ff00ff",gray:"#808080",green:"#008000",lime:"#00ff00",maroon:"#800000",navy:"#000080",olive:"#808000",purple:"#800080",red:"#ff0000",silver:"#c0c0c0",teal:"#008080",white:"#ffffff",yellow:"#ffff00",transparent:[null,null,null,0],_default:"#ffffff"}}(_),function(){function e(e){var i,s,n=e.ownerDocument.defaultView?e.ownerDocument.defaultView.getComputedStyle(e,null):e.currentStyle,o={};if(n&&n.length&&n[0]&&n[n[0]])for(s=n.length;s--;)i=n[s],"string"==typeof n[i]&&(o[t.camelCase(i)]=n[i]);else for(i in n)"string"==typeof n[i]&&(o[i]=n[i]);return o}function i(e,i){var s,o,a={};for(s in i)o=i[s],e[s]!==o&&(n[s]||(t.fx.step[s]||!isNaN(parseFloat(o)))&&(a[s]=o));return a}var s=["add","remove","toggle"],n={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};t.each(["borderLeftStyle","borderRightStyle","borderBottomStyle","borderTopStyle"],function(e,i){t.fx.step[i]=function(t){("none"!==t.end&&!t.setAttr||1===t.pos&&!t.setAttr)&&(_.style(t.elem,i,t.end),t.setAttr=!0)}}),t.fn.addBack||(t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.effects.animateClass=function(n,o,a,r){var l=t.speed(o,a,r);return this.queue(function(){var o,a=t(this),r=a.attr("class")||"",h=l.children?a.find("*").addBack():a;h=h.map(function(){var i=t(this);return{el:i,start:e(this)}}),o=function(){t.each(s,function(t,e){n[e]&&a[e+"Class"](n[e])})},o(),h=h.map(function(){return this.end=e(this.el[0]),this.diff=i(this.start,this.end),this}),a.attr("class",r),h=h.map(function(){var e=this,i=t.Deferred(),s=t.extend({},l,{queue:!1,complete:function(){i.resolve(e)}});return this.el.animate(this.diff,s),i.promise()}),t.when.apply(t,h.get()).done(function(){o(),t.each(arguments,function(){var e=this.el;t.each(this.diff,function(t){e.css(t,"")})}),l.complete.call(a[0])})})},t.fn.extend({addClass:function(e){return function(i,s,n,o){return s?t.effects.animateClass.call(this,{add:i},s,n,o):e.apply(this,arguments)}}(t.fn.addClass),removeClass:function(e){return function(i,s,n,o){return arguments.length>1?t.effects.animateClass.call(this,{remove:i},s,n,o):e.apply(this,arguments)}}(t.fn.removeClass),toggleClass:function(e){return function(i,s,n,o,a){return"boolean"==typeof s||void 0===s?n?t.effects.animateClass.call(this,s?{add:i}:{remove:i},n,o,a):e.apply(this,arguments):t.effects.animateClass.call(this,{toggle:i},s,n,o)}}(t.fn.toggleClass),switchClass:function(e,i,s,n,o){return t.effects.animateClass.call(this,{add:i,remove:e},s,n,o)}})}(),function(){function e(e,i,s,n){return t.isPlainObject(e)&&(i=e,e=e.effect),e={effect:e},null==i&&(i={}),t.isFunction(i)&&(n=i,s=null,i={}),("number"==typeof i||t.fx.speeds[i])&&(n=s,s=i,i={}),t.isFunction(s)&&(n=s,s=null),i&&t.extend(e,i),s=s||i.duration,e.duration=t.fx.off?0:"number"==typeof s?s:s in t.fx.speeds?t.fx.speeds[s]:t.fx.speeds._default,e.complete=n||i.complete,e}function i(e){return!e||"number"==typeof e||t.fx.speeds[e]?!0:"string"!=typeof e||t.effects.effect[e]?t.isFunction(e)?!0:"object"!=typeof e||e.effect?!1:!0:!0}function s(t,e){var i=e.outerWidth(),s=e.outerHeight(),n=/^rect\((-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto)\)$/,o=n.exec(t)||["",0,i,s,0];return{top:parseFloat(o[1])||0,right:"auto"===o[2]?i:parseFloat(o[2]),bottom:"auto"===o[3]?s:parseFloat(o[3]),left:parseFloat(o[4])||0}}t.expr&&t.expr.filters&&t.expr.filters.animated&&(t.expr.filters.animated=function(e){return function(i){return!!t(i).data(m)||e(i)}}(t.expr.filters.animated)),t.uiBackCompat!==!1&&t.extend(t.effects,{save:function(t,e){for(var i=0,s=e.length;s>i;i++)null!==e[i]&&t.data(f+e[i],t[0].style[e[i]])},restore:function(t,e){for(var i,s=0,n=e.length;n>s;s++)null!==e[s]&&(i=t.data(f+e[s]),t.css(e[s],i))},setMode:function(t,e){return"toggle"===e&&(e=t.is(":hidden")?"show":"hide"),e},createWrapper:function(e){if(e.parent().is(".ui-effects-wrapper"))return e.parent();var i={width:e.outerWidth(!0),height:e.outerHeight(!0),"float":e.css("float")},s=t("

").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),n={width:e.width(),height:e.height()},o=document.activeElement;try{o.id}catch(a){o=document.body}return e.wrap(s),(e[0]===o||t.contains(e[0],o))&&t(o).trigger("focus"),s=e.parent(),"static"===e.css("position")?(s.css({position:"relative"}),e.css({position:"relative"})):(t.extend(i,{position:e.css("position"),zIndex:e.css("z-index")}),t.each(["top","left","bottom","right"],function(t,s){i[s]=e.css(s),isNaN(parseInt(i[s],10))&&(i[s]="auto")}),e.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),e.css(n),s.css(i).show()},removeWrapper:function(e){var i=document.activeElement;return e.parent().is(".ui-effects-wrapper")&&(e.parent().replaceWith(e),(e[0]===i||t.contains(e[0],i))&&t(i).trigger("focus")),e}}),t.extend(t.effects,{version:"1.12.1",define:function(e,i,s){return s||(s=i,i="effect"),t.effects.effect[e]=s,t.effects.effect[e].mode=i,s},scaledDimensions:function(t,e,i){if(0===e)return{height:0,width:0,outerHeight:0,outerWidth:0};var s="horizontal"!==i?(e||100)/100:1,n="vertical"!==i?(e||100)/100:1;return{height:t.height()*n,width:t.width()*s,outerHeight:t.outerHeight()*n,outerWidth:t.outerWidth()*s}},clipToBox:function(t){return{width:t.clip.right-t.clip.left,height:t.clip.bottom-t.clip.top,left:t.clip.left,top:t.clip.top}},unshift:function(t,e,i){var s=t.queue();e>1&&s.splice.apply(s,[1,0].concat(s.splice(e,i))),t.dequeue()},saveStyle:function(t){t.data(g,t[0].style.cssText)},restoreStyle:function(t){t[0].style.cssText=t.data(g)||"",t.removeData(g)},mode:function(t,e){var i=t.is(":hidden");return"toggle"===e&&(e=i?"show":"hide"),(i?"hide"===e:"show"===e)&&(e="none"),e},getBaseline:function(t,e){var i,s;switch(t[0]){case"top":i=0;break;case"middle":i=.5;break;case"bottom":i=1;break;default:i=t[0]/e.height}switch(t[1]){case"left":s=0;break;case"center":s=.5;break;case"right":s=1;break;default:s=t[1]/e.width}return{x:s,y:i}},createPlaceholder:function(e){var i,s=e.css("position"),n=e.position();return e.css({marginTop:e.css("marginTop"),marginBottom:e.css("marginBottom"),marginLeft:e.css("marginLeft"),marginRight:e.css("marginRight")}).outerWidth(e.outerWidth()).outerHeight(e.outerHeight()),/^(static|relative)/.test(s)&&(s="absolute",i=t("<"+e[0].nodeName+">").insertAfter(e).css({display:/^(inline|ruby)/.test(e.css("display"))?"inline-block":"block",visibility:"hidden",marginTop:e.css("marginTop"),marginBottom:e.css("marginBottom"),marginLeft:e.css("marginLeft"),marginRight:e.css("marginRight"),"float":e.css("float")}).outerWidth(e.outerWidth()).outerHeight(e.outerHeight()).addClass("ui-effects-placeholder"),e.data(f+"placeholder",i)),e.css({position:s,left:n.left,top:n.top}),i},removePlaceholder:function(t){var e=f+"placeholder",i=t.data(e);i&&(i.remove(),t.removeData(e))},cleanUp:function(e){t.effects.restoreStyle(e),t.effects.removePlaceholder(e)},setTransition:function(e,i,s,n){return n=n||{},t.each(i,function(t,i){var o=e.cssUnit(i);o[0]>0&&(n[i]=o[0]*s+o[1])}),n}}),t.fn.extend({effect:function(){function i(e){function i(){r.removeData(m),t.effects.cleanUp(r),"hide"===s.mode&&r.hide(),a()}function a(){t.isFunction(l)&&l.call(r[0]),t.isFunction(e)&&e()}var r=t(this);s.mode=c.shift(),t.uiBackCompat===!1||o?"none"===s.mode?(r[h](),a()):n.call(r[0],s,i):(r.is(":hidden")?"hide"===h:"show"===h)?(r[h](),a()):n.call(r[0],s,a)}var s=e.apply(this,arguments),n=t.effects.effect[s.effect],o=n.mode,a=s.queue,r=a||"fx",l=s.complete,h=s.mode,c=[],u=function(e){var i=t(this),s=t.effects.mode(i,h)||o;i.data(m,!0),c.push(s),o&&("show"===s||s===o&&"hide"===s)&&i.show(),o&&"none"===s||t.effects.saveStyle(i),t.isFunction(e)&&e()};return t.fx.off||!n?h?this[h](s.duration,l):this.each(function(){l&&l.call(this)}):a===!1?this.each(u).each(i):this.queue(r,u).queue(r,i)},show:function(t){return function(s){if(i(s))return t.apply(this,arguments);var n=e.apply(this,arguments);return n.mode="show",this.effect.call(this,n)}}(t.fn.show),hide:function(t){return function(s){if(i(s))return t.apply(this,arguments);var n=e.apply(this,arguments);return n.mode="hide",this.effect.call(this,n)}}(t.fn.hide),toggle:function(t){return function(s){if(i(s)||"boolean"==typeof s)return t.apply(this,arguments);var n=e.apply(this,arguments);return n.mode="toggle",this.effect.call(this,n)}}(t.fn.toggle),cssUnit:function(e){var i=this.css(e),s=[];return t.each(["em","px","%","pt"],function(t,e){i.indexOf(e)>0&&(s=[parseFloat(i),e])}),s},cssClip:function(t){return t?this.css("clip","rect("+t.top+"px "+t.right+"px "+t.bottom+"px "+t.left+"px)"):s(this.css("clip"),this)},transfer:function(e,i){var s=t(this),n=t(e.to),o="fixed"===n.css("position"),a=t("body"),r=o?a.scrollTop():0,l=o?a.scrollLeft():0,h=n.offset(),c={top:h.top-r,left:h.left-l,height:n.innerHeight(),width:n.innerWidth()},u=s.offset(),d=t("
").appendTo("body").addClass(e.className).css({top:u.top-r,left:u.left-l,height:s.innerHeight(),width:s.innerWidth(),position:o?"fixed":"absolute"}).animate(c,e.duration,e.easing,function(){d.remove(),t.isFunction(i)&&i()})}}),t.fx.step.clip=function(e){e.clipInit||(e.start=t(e.elem).cssClip(),"string"==typeof e.end&&(e.end=s(e.end,e.elem)),e.clipInit=!0),t(e.elem).cssClip({top:e.pos*(e.end.top-e.start.top)+e.start.top,right:e.pos*(e.end.right-e.start.right)+e.start.right,bottom:e.pos*(e.end.bottom-e.start.bottom)+e.start.bottom,left:e.pos*(e.end.left-e.start.left)+e.start.left})}}(),function(){var e={};t.each(["Quad","Cubic","Quart","Quint","Expo"],function(t,i){e[i]=function(e){return Math.pow(e,t+2)}}),t.extend(e,{Sine:function(t){return 1-Math.cos(t*Math.PI/2)},Circ:function(t){return 1-Math.sqrt(1-t*t)},Elastic:function(t){return 0===t||1===t?t:-Math.pow(2,8*(t-1))*Math.sin((80*(t-1)-7.5)*Math.PI/15)},Back:function(t){return t*t*(3*t-2)},Bounce:function(t){for(var e,i=4;((e=Math.pow(2,--i))-1)/11>t;);return 1/Math.pow(4,3-i)-7.5625*Math.pow((3*e-2)/22-t,2)}}),t.each(e,function(e,i){t.easing["easeIn"+e]=i,t.easing["easeOut"+e]=function(t){return 1-i(1-t)},t.easing["easeInOut"+e]=function(t){return.5>t?i(2*t)/2:1-i(-2*t+2)/2}})}();var v=t.effects;t.effects.define("blind","hide",function(e,i){var s={up:["bottom","top"],vertical:["bottom","top"],down:["top","bottom"],left:["right","left"],horizontal:["right","left"],right:["left","right"]},n=t(this),o=e.direction||"up",a=n.cssClip(),r={clip:t.extend({},a)},l=t.effects.createPlaceholder(n);r.clip[s[o][0]]=r.clip[s[o][1]],"show"===e.mode&&(n.cssClip(r.clip),l&&l.css(t.effects.clipToBox(r)),r.clip=a),l&&l.animate(t.effects.clipToBox(r),e.duration,e.easing),n.animate(r,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("bounce",function(e,i){var s,n,o,a=t(this),r=e.mode,l="hide"===r,h="show"===r,c=e.direction||"up",u=e.distance,d=e.times||5,p=2*d+(h||l?1:0),f=e.duration/p,g=e.easing,m="up"===c||"down"===c?"top":"left",_="up"===c||"left"===c,v=0,b=a.queue().length;for(t.effects.createPlaceholder(a),o=a.css(m),u||(u=a["top"===m?"outerHeight":"outerWidth"]()/3),h&&(n={opacity:1},n[m]=o,a.css("opacity",0).css(m,_?2*-u:2*u).animate(n,f,g)),l&&(u/=Math.pow(2,d-1)),n={},n[m]=o;d>v;v++)s={},s[m]=(_?"-=":"+=")+u,a.animate(s,f,g).animate(n,f,g),u=l?2*u:u/2;l&&(s={opacity:0},s[m]=(_?"-=":"+=")+u,a.animate(s,f,g)),a.queue(i),t.effects.unshift(a,b,p+1)}),t.effects.define("clip","hide",function(e,i){var s,n={},o=t(this),a=e.direction||"vertical",r="both"===a,l=r||"horizontal"===a,h=r||"vertical"===a;s=o.cssClip(),n.clip={top:h?(s.bottom-s.top)/2:s.top,right:l?(s.right-s.left)/2:s.right,bottom:h?(s.bottom-s.top)/2:s.bottom,left:l?(s.right-s.left)/2:s.left},t.effects.createPlaceholder(o),"show"===e.mode&&(o.cssClip(n.clip),n.clip=s),o.animate(n,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("drop","hide",function(e,i){var s,n=t(this),o=e.mode,a="show"===o,r=e.direction||"left",l="up"===r||"down"===r?"top":"left",h="up"===r||"left"===r?"-=":"+=",c="+="===h?"-=":"+=",u={opacity:0};t.effects.createPlaceholder(n),s=e.distance||n["top"===l?"outerHeight":"outerWidth"](!0)/2,u[l]=h+s,a&&(n.css(u),u[l]=c+s,u.opacity=1),n.animate(u,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("explode","hide",function(e,i){function s(){b.push(this),b.length===u*d&&n()}function n(){p.css({visibility:"visible"}),t(b).remove(),i()}var o,a,r,l,h,c,u=e.pieces?Math.round(Math.sqrt(e.pieces)):3,d=u,p=t(this),f=e.mode,g="show"===f,m=p.show().css("visibility","hidden").offset(),_=Math.ceil(p.outerWidth()/d),v=Math.ceil(p.outerHeight()/u),b=[];for(o=0;u>o;o++)for(l=m.top+o*v,c=o-(u-1)/2,a=0;d>a;a++)r=m.left+a*_,h=a-(d-1)/2,p.clone().appendTo("body").wrap("
").css({position:"absolute",visibility:"visible",left:-a*_,top:-o*v}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:_,height:v,left:r+(g?h*_:0),top:l+(g?c*v:0),opacity:g?0:1}).animate({left:r+(g?0:h*_),top:l+(g?0:c*v),opacity:g?1:0},e.duration||500,e.easing,s)}),t.effects.define("fade","toggle",function(e,i){var s="show"===e.mode;t(this).css("opacity",s?0:1).animate({opacity:s?1:0},{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("fold","hide",function(e,i){var s=t(this),n=e.mode,o="show"===n,a="hide"===n,r=e.size||15,l=/([0-9]+)%/.exec(r),h=!!e.horizFirst,c=h?["right","bottom"]:["bottom","right"],u=e.duration/2,d=t.effects.createPlaceholder(s),p=s.cssClip(),f={clip:t.extend({},p)},g={clip:t.extend({},p)},m=[p[c[0]],p[c[1]]],_=s.queue().length;l&&(r=parseInt(l[1],10)/100*m[a?0:1]),f.clip[c[0]]=r,g.clip[c[0]]=r,g.clip[c[1]]=0,o&&(s.cssClip(g.clip),d&&d.css(t.effects.clipToBox(g)),g.clip=p),s.queue(function(i){d&&d.animate(t.effects.clipToBox(f),u,e.easing).animate(t.effects.clipToBox(g),u,e.easing),i()}).animate(f,u,e.easing).animate(g,u,e.easing).queue(i),t.effects.unshift(s,_,4)}),t.effects.define("highlight","show",function(e,i){var s=t(this),n={backgroundColor:s.css("backgroundColor")};"hide"===e.mode&&(n.opacity=0),t.effects.saveStyle(s),s.css({backgroundImage:"none",backgroundColor:e.color||"#ffff99"}).animate(n,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("size",function(e,i){var s,n,o,a=t(this),r=["fontSize"],l=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],h=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],c=e.mode,u="effect"!==c,d=e.scale||"both",p=e.origin||["middle","center"],f=a.css("position"),g=a.position(),m=t.effects.scaledDimensions(a),_=e.from||m,v=e.to||t.effects.scaledDimensions(a,0);t.effects.createPlaceholder(a),"show"===c&&(o=_,_=v,v=o),n={from:{y:_.height/m.height,x:_.width/m.width},to:{y:v.height/m.height,x:v.width/m.width}},("box"===d||"both"===d)&&(n.from.y!==n.to.y&&(_=t.effects.setTransition(a,l,n.from.y,_),v=t.effects.setTransition(a,l,n.to.y,v)),n.from.x!==n.to.x&&(_=t.effects.setTransition(a,h,n.from.x,_),v=t.effects.setTransition(a,h,n.to.x,v))),("content"===d||"both"===d)&&n.from.y!==n.to.y&&(_=t.effects.setTransition(a,r,n.from.y,_),v=t.effects.setTransition(a,r,n.to.y,v)),p&&(s=t.effects.getBaseline(p,m),_.top=(m.outerHeight-_.outerHeight)*s.y+g.top,_.left=(m.outerWidth-_.outerWidth)*s.x+g.left,v.top=(m.outerHeight-v.outerHeight)*s.y+g.top,v.left=(m.outerWidth-v.outerWidth)*s.x+g.left),a.css(_),("content"===d||"both"===d)&&(l=l.concat(["marginTop","marginBottom"]).concat(r),h=h.concat(["marginLeft","marginRight"]),a.find("*[width]").each(function(){var i=t(this),s=t.effects.scaledDimensions(i),o={height:s.height*n.from.y,width:s.width*n.from.x,outerHeight:s.outerHeight*n.from.y,outerWidth:s.outerWidth*n.from.x},a={height:s.height*n.to.y,width:s.width*n.to.x,outerHeight:s.height*n.to.y,outerWidth:s.width*n.to.x};n.from.y!==n.to.y&&(o=t.effects.setTransition(i,l,n.from.y,o),a=t.effects.setTransition(i,l,n.to.y,a)),n.from.x!==n.to.x&&(o=t.effects.setTransition(i,h,n.from.x,o),a=t.effects.setTransition(i,h,n.to.x,a)),u&&t.effects.saveStyle(i),i.css(o),i.animate(a,e.duration,e.easing,function(){u&&t.effects.restoreStyle(i)})})),a.animate(v,{queue:!1,duration:e.duration,easing:e.easing,complete:function(){var e=a.offset();0===v.opacity&&a.css("opacity",_.opacity),u||(a.css("position","static"===f?"relative":f).offset(e),t.effects.saveStyle(a)),i()}})}),t.effects.define("scale",function(e,i){var s=t(this),n=e.mode,o=parseInt(e.percent,10)||(0===parseInt(e.percent,10)?0:"effect"!==n?0:100),a=t.extend(!0,{from:t.effects.scaledDimensions(s),to:t.effects.scaledDimensions(s,o,e.direction||"both"),origin:e.origin||["middle","center"]},e);e.fade&&(a.from.opacity=1,a.to.opacity=0),t.effects.effect.size.call(this,a,i)}),t.effects.define("puff","hide",function(e,i){var s=t.extend(!0,{},e,{fade:!0,percent:parseInt(e.percent,10)||150});t.effects.effect.scale.call(this,s,i)}),t.effects.define("pulsate","show",function(e,i){var s=t(this),n=e.mode,o="show"===n,a="hide"===n,r=o||a,l=2*(e.times||5)+(r?1:0),h=e.duration/l,c=0,u=1,d=s.queue().length;for((o||!s.is(":visible"))&&(s.css("opacity",0).show(),c=1);l>u;u++)s.animate({opacity:c},h,e.easing),c=1-c;s.animate({opacity:c},h,e.easing),s.queue(i),t.effects.unshift(s,d,l+1)}),t.effects.define("shake",function(e,i){var s=1,n=t(this),o=e.direction||"left",a=e.distance||20,r=e.times||3,l=2*r+1,h=Math.round(e.duration/l),c="up"===o||"down"===o?"top":"left",u="up"===o||"left"===o,d={},p={},f={},g=n.queue().length;for(t.effects.createPlaceholder(n),d[c]=(u?"-=":"+=")+a,p[c]=(u?"+=":"-=")+2*a,f[c]=(u?"-=":"+=")+2*a,n.animate(d,h,e.easing);r>s;s++)n.animate(p,h,e.easing).animate(f,h,e.easing);n.animate(p,h,e.easing).animate(d,h/2,e.easing).queue(i),t.effects.unshift(n,g,l+1)}),t.effects.define("slide","show",function(e,i){var s,n,o=t(this),a={up:["bottom","top"],down:["top","bottom"],left:["right","left"],right:["left","right"]},r=e.mode,l=e.direction||"left",h="up"===l||"down"===l?"top":"left",c="up"===l||"left"===l,u=e.distance||o["top"===h?"outerHeight":"outerWidth"](!0),d={};t.effects.createPlaceholder(o),s=o.cssClip(),n=o.position()[h],d[h]=(c?-1:1)*u+n,d.clip=o.cssClip(),d.clip[a[l][1]]=d.clip[a[l][0]],"show"===r&&(o.cssClip(d.clip),o.css(h,d[h]),d.clip=s,d[h]=n),o.animate(d,{queue:!1,duration:e.duration,easing:e.easing,complete:i})});var v;t.uiBackCompat!==!1&&(v=t.effects.define("transfer",function(e,i){t(this).transfer(e,i)}))});prewikka-5.1.1/prewikka/htdocs/js/jquery.jeditable.js0000664000175000017500000005745413555143652024303 0ustar tandrejatandreja00000000000000/* * Jeditable - jQuery in place edit plugin * * Copyright (c) 2006-2009 Mika Tuupola, Dylan Verheul * * Licensed under the MIT license: * http://www.opensource.org/licenses/mit-license.php * * Project home: * http://www.appelsiini.net/projects/jeditable * * Based on editable by Dylan Verheul : * http://www.dyve.net/jquery/?editable * */ /** * Version 1.7.1 * * ** means there is basic unit tests for this parameter. * * @name Jeditable * @type jQuery * @param String target (POST) URL or function to send edited content to ** * @param Hash options additional options * @param String options[method] method to use to send edited content (POST or PUT) ** * @param Function options[callback] Function to run after submitting edited content ** * @param String options[name] POST parameter name of edited content * @param String options[id] POST parameter name of edited div id * @param Hash options[submitdata] Extra parameters to send when submitting edited content. * @param String options[type] text, textarea or select (or any 3rd party input type) ** * @param Integer options[rows] number of rows if using textarea ** * @param Integer options[cols] number of columns if using textarea ** * @param Mixed options[height] 'auto', 'none' or height in pixels ** * @param Mixed options[width] 'auto', 'none' or width in pixels ** * @param String options[loadurl] URL to fetch input content before editing ** * @param String options[loadtype] Request type for load url. Should be GET or POST. * @param String options[loadtext] Text to display while loading external content. * @param Mixed options[loaddata] Extra parameters to pass when fetching content before editing. * @param Mixed options[data] Or content given as paramameter. String or function.** * @param String options[indicator] indicator html to show when saving * @param String options[tooltip] optional tooltip text via title attribute ** * @param String options[event] jQuery event such as 'click' of 'dblclick' ** * @param String options[submit] submit button value, empty means no button ** * @param String options[cancel] cancel button value, empty means no button ** * @param String options[cssclass] CSS class to apply to input form. 'inherit' to copy from parent. ** * @param String options[style] Style to apply to input form 'inherit' to copy from parent. ** * @param String options[select] true or false, when true text is highlighted ?? * @param String options[placeholder] Placeholder text or html to insert when element is empty. ** * @param String options[onblur] 'cancel', 'submit', 'ignore' or function ?? * * @param Function options[onsubmit] function(settings, original) { ... } called before submit * @param Function options[onreset] function(settings, original) { ... } called before reset * @param Function options[onerror] function(settings, original, xhr) { ... } called on error * * @param Hash options[ajaxoptions] jQuery Ajax options. See docs.jquery.com. * */ (function($) { $.fn.editable = function(target, options) { if ('disable' == target) { $(this).data('disabled.editable', true); return; } if ('enable' == target) { $(this).data('disabled.editable', false); return; } if ('destroy' == target) { $(this) .unbind($(this).data('event.editable')) .removeData('disabled.editable') .removeData('event.editable'); return; } var settings = $.extend({}, $.fn.editable.defaults, {target:target}, options); /* setup some functions */ var plugin = $.editable.types[settings.type].plugin || function() { }; var submit = $.editable.types[settings.type].submit || function() { }; var buttons = $.editable.types[settings.type].buttons || $.editable.types['defaults'].buttons; var content = $.editable.types[settings.type].content || $.editable.types['defaults'].content; var element = $.editable.types[settings.type].element || $.editable.types['defaults'].element; var reset = $.editable.types[settings.type].reset || $.editable.types['defaults'].reset; var callback = settings.callback || function() { }; var onedit = settings.onedit || function() { }; var onsubmit = settings.onsubmit || function() { }; var onreset = settings.onreset || function() { }; var onerror = settings.onerror || reset; /* show tooltip */ if (settings.tooltip) { $(this).attr('title', settings.tooltip); } settings.autowidth = 'auto' == settings.width; settings.autoheight = 'auto' == settings.height; return this.each(function() { /* save this to self because this changes when scope changes */ var self = this; /* inlined block elements lose their width and height after first edit */ /* save them for later use as workaround */ var savedwidth = $(self).width(); var savedheight = $(self).height(); /* save so it can be later used by $.editable('destroy') */ $(this).data('event.editable', settings.event); /* if element is empty add something clickable (if requested) */ if (!$.trim($(this).html())) { $(this).html(settings.placeholder); } $(this).bind(settings.event, function(e) { /* abort if disabled for this element */ if (true === $(this).data('disabled.editable')) { return; } /* prevent throwing an exeption if edit field is clicked again */ if (self.editing) { return; } /* abort if onedit hook returns false */ if (false === onedit.apply(this, [settings, self])) { return; } /* prevent default action and bubbling */ e.preventDefault(); e.stopPropagation(); /* remove tooltip */ if (settings.tooltip) { $(self).removeAttr('title'); } /* figure out how wide and tall we are, saved width and height */ /* are workaround for http://dev.jquery.com/ticket/2190 */ if (0 == $(self).width()) { //$(self).css('visibility', 'hidden'); settings.width = savedwidth; settings.height = savedheight; } else { if (settings.width != 'none') { settings.width = settings.autowidth ? $(self).width() : settings.width; } if (settings.height != 'none') { settings.height = settings.autoheight ? $(self).height() : settings.height; } } //$(this).css('visibility', ''); /* remove placeholder text, replace is here because of IE */ if ($(this).html().toLowerCase().replace(/(;|")/g, '') == settings.placeholder.toLowerCase().replace(/(;|")/g, '')) { $(this).html(''); } self.editing = true; self.revert = $(self).html(); $(self).html(''); /* create the form object */ var form = $('
'); /* apply css or style or both */ if (settings.cssclass) { if ('inherit' == settings.cssclass) { form.attr('class', $(self).attr('class')); } else { form.attr('class', settings.cssclass); } } if (settings.style) { if ('inherit' == settings.style) { form.attr('style', $(self).attr('style')); /* IE needs the second line or display wont be inherited */ form.css('display', $(self).css('display')); } else { form.attr('style', settings.style); } } /* add main input element to form and store it in input */ var input = element.apply(form, [settings, self]); /* set input content via POST, GET, given data or existing value */ var input_content; if (settings.loadurl) { var t = setTimeout(function() { input.disabled = true; content.apply(form, [settings.loadtext, settings, self]); }, 100); var loaddata = {}; loaddata[settings.id] = self.id; if ($.isFunction(settings.loaddata)) { $.extend(loaddata, settings.loaddata.apply(self, [self.revert, settings])); } else { $.extend(loaddata, settings.loaddata); } $.ajax({ type : settings.loadtype, url : settings.loadurl, data : loaddata, async : false, success: function(result) { window.clearTimeout(t); input_content = result; input.disabled = false; } }); } else if (settings.data) { input_content = settings.data; if ($.isFunction(settings.data)) { input_content = settings.data.apply(self, [self.revert, settings]); } } else { input_content = self.revert; } content.apply(form, [input_content, settings, self]); input.attr('name', settings.name); /* add buttons to the form */ buttons.apply(form, [settings, self]); /* add created form to self */ $(self).append(form); /* attach 3rd party plugin if requested */ plugin.apply(form, [settings, self]); /* focus to first visible form element */ $(':input:visible:enabled:first', form).focus(); /* highlight input contents when requested */ if (settings.select) { input.select(); } /* discard changes if pressing esc */ input.keydown(function(e) { if (e.keyCode == 27) { e.preventDefault(); //self.reset(); reset.apply(form, [settings, self]); } }); /* discard, submit or nothing with changes when clicking outside */ /* do nothing is usable when navigating with tab */ var t; if ('cancel' == settings.onblur) { input.blur(function(e) { /* prevent canceling if submit was clicked */ t = setTimeout(function() { reset.apply(form, [settings, self]); }, 500); }); } else if ('submit' == settings.onblur) { input.blur(function(e) { /* prevent double submit if submit was clicked */ t = setTimeout(function() { form.submit(); }, 200); }); } else if ($.isFunction(settings.onblur)) { input.blur(function(e) { settings.onblur.apply(self, [input.val(), settings]); }); } else { input.blur(function(e) { /* TODO: maybe something here */ }); } form.submit(function(e) { if (t) { clearTimeout(t); } /* do no submit */ e.preventDefault(); /* call before submit hook. */ /* if it returns false abort submitting */ if (false !== onsubmit.apply(form, [settings, self])) { /* custom inputs call before submit hook. */ /* if it returns false abort submitting */ if (false !== submit.apply(form, [settings, self])) { /* check if given target is function */ if ($.isFunction(settings.target)) { var str = settings.target.apply(self, [input.val(), settings]); $(self).html(str); self.editing = false; callback.apply(self, [self.innerHTML, settings]); /* TODO: this is not dry */ if (!$.trim($(self).html())) { $(self).html(settings.placeholder); } } else { /* add edited content and id of edited element to POST */ var submitdata = {}; submitdata[settings.name] = input.val(); submitdata[settings.id] = self.id; /* add extra data to be POST:ed */ if ($.isFunction(settings.submitdata)) { $.extend(submitdata, settings.submitdata.apply(self, [self.revert, settings])); } else { $.extend(submitdata, settings.submitdata); } /* quick and dirty PUT support */ if ('PUT' == settings.method) { submitdata['_method'] = 'put'; } /* show the saving indicator */ $(self).html(settings.indicator); /* defaults for ajaxoptions */ var ajaxoptions = { type : 'POST', data : submitdata, dataType: 'html', url : settings.target, success : function(result, status) { if (ajaxoptions.dataType == 'html') { $(self).html(result); } self.editing = false; callback.apply(self, [result, settings]); if (!$.trim($(self).html())) { $(self).html(settings.placeholder); } }, error : function(xhr, status, error) { onerror.apply(form, [settings, self, xhr]); } }; /* override with what is given in settings.ajaxoptions */ $.extend(ajaxoptions, settings.ajaxoptions); $.ajax(ajaxoptions); } } } /* show tooltip again */ $(self).attr('title', settings.tooltip); return false; }); }); /* privileged methods */ this.reset = function(form) { /* prevent calling reset twice when blurring */ if (this.editing) { /* before reset hook, if it returns false abort reseting */ if (false !== onreset.apply(form, [settings, self])) { $(self).html(self.revert); self.editing = false; if (!$.trim($(self).html())) { $(self).html(settings.placeholder); } /* show tooltip again */ if (settings.tooltip) { $(self).attr('title', settings.tooltip); } } } }; }); }; $.editable = { types: { defaults: { element : function(settings, original) { var input = $(''); $(this).append(input); return(input); }, content : function(string, settings, original) { $(':input:first', this).val(string); }, reset : function(settings, original) { original.reset(this); }, buttons : function(settings, original) { var form = this; if (settings.submit) { /* if given html string use that */ if (settings.submit.match(/>$/)) { var submit = $(settings.submit).click(function() { if (submit.attr("type") != "submit") { form.submit(); } }); /* otherwise use button with given string as text */ } else { var submit = $('
").appendTo(this.availableContainer),this.selectedList=c('
').bind("selectstart",function(){return!1}).appendTo(this.selectedContainer),this.availableList=c('
').bind("selectstart",function(){return!1}).appendTo(this.availableContainer);var i=this;this.container.width(this.element.width()+1),this.selectedContainer.width(Math.floor(this.element.width()*this.options.dividerLocation)),this.availableContainer.width(Math.floor(this.element.width()*(1-this.options.dividerLocation))),this.selectedList.height(Math.max(this.element.height()-this.selectedActions.height(),1)),this.availableList.height(Math.max(this.element.height()-this.availableActions.height(),1)),this.options.animated||(this.options.show="show",this.options.hide="hide"),this._populateLists(this.element.find("option")),this.options.sortable&&this.selectedList.sortable({placeholder:"ui-state-highlight",axis:"y",update:function(e,t){i.selectedList.find("li").each(function(){c(this).data("optionLink")&&c(this).data("optionLink").remove().appendTo(i.element)})},receive:function(e,t){t.item.data("optionLink").prop("selected",!0),i.count+=1,i._updateCount(),i.selectedList.children(".ui-draggable").each(function(){c(this).removeClass("ui-draggable"),c(this).data("optionLink",t.item.data("optionLink")),c(this).data("idx",t.item.data("idx")),i._applyItemState(c(this),!0)}),setTimeout(function(){t.item.remove()},1)}}),this.options.searchable?this._registerSearchEvents(this.availableContainer.find("input.search")):c(".search").hide(),this.container.find(".remove-all").click(function(){return i._populateLists(i.element.find("option").prop("selected",!1)),!1}),this.container.find(".add-all").click(function(){var t=i.element.find("option").not(":selected");return 1'+e.text()+'').hide();return t.data("optionLink",e),t},_cloneWithData:function(e){var t=e.clone(!1,!1);return t.data("optionLink",e.data("optionLink")),t.data("idx",e.data("idx")),t},_setSelected:function(e,t){if(e.data("optionLink").prop("selected",t),t){var i=this._cloneWithData(e);return e[this.options.hide](this.options.animated,function(){c(this).remove()}),i.appendTo(this.selectedList).hide()[this.options.show](this.options.animated),this._applyItemState(i,!0),i}var s=this.availableList.find("li"),n=this.options.nodeComparator,a=null,o=e.data("idx"),l=n(e,c(s[o]));if(l){for(;0<=o&&o=0&&o>i;i+=n){var a=u?u[i]:i;e=r(e,t[a],a,t)}return e}return function(r,e,u,i){e=b(e,i,4);var o=!k(r)&&m.keys(r),a=(o||r).length,c=n>0?0:a-1;return arguments.length<3&&(u=r[o?o[c]:c],c+=n),t(r,e,u,o,c,a)}}function t(n){return function(t,r,e){r=x(r,e);for(var u=O(t),i=n>0?0:u-1;i>=0&&u>i;i+=n)if(r(t[i],i,t))return i;return-1}}function r(n,t,r){return function(e,u,i){var o=0,a=O(e);if("number"==typeof i)n>0?o=i>=0?i:Math.max(i+a,o):a=i>=0?Math.min(i+1,a):i+a+1;else if(r&&i&&a)return i=r(e,u),e[i]===u?i:-1;if(u!==u)return i=t(l.call(e,o,a),m.isNaN),i>=0?i+o:-1;for(i=n>0?o:a-1;i>=0&&a>i;i+=n)if(e[i]===u)return i;return-1}}function e(n,t){var r=I.length,e=n.constructor,u=m.isFunction(e)&&e.prototype||a,i="constructor";for(m.has(n,i)&&!m.contains(t,i)&&t.push(i);r--;)i=I[r],i in n&&n[i]!==u[i]&&!m.contains(t,i)&&t.push(i)}var u=this,i=u._,o=Array.prototype,a=Object.prototype,c=Function.prototype,f=o.push,l=o.slice,s=a.toString,p=a.hasOwnProperty,h=Array.isArray,v=Object.keys,g=c.bind,y=Object.create,d=function(){},m=function(n){return n instanceof m?n:this instanceof m?void(this._wrapped=n):new m(n)};"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=m),exports._=m):u._=m,m.VERSION="1.8.3";var b=function(n,t,r){if(t===void 0)return n;switch(null==r?3:r){case 1:return function(r){return n.call(t,r)};case 2:return function(r,e){return n.call(t,r,e)};case 3:return function(r,e,u){return n.call(t,r,e,u)};case 4:return function(r,e,u,i){return n.call(t,r,e,u,i)}}return function(){return n.apply(t,arguments)}},x=function(n,t,r){return null==n?m.identity:m.isFunction(n)?b(n,t,r):m.isObject(n)?m.matcher(n):m.property(n)};m.iteratee=function(n,t){return x(n,t,1/0)};var _=function(n,t){return function(r){var e=arguments.length;if(2>e||null==r)return r;for(var u=1;e>u;u++)for(var i=arguments[u],o=n(i),a=o.length,c=0;a>c;c++){var f=o[c];t&&r[f]!==void 0||(r[f]=i[f])}return r}},j=function(n){if(!m.isObject(n))return{};if(y)return y(n);d.prototype=n;var t=new d;return d.prototype=null,t},w=function(n){return function(t){return null==t?void 0:t[n]}},A=Math.pow(2,53)-1,O=w("length"),k=function(n){var t=O(n);return"number"==typeof t&&t>=0&&A>=t};m.each=m.forEach=function(n,t,r){t=b(t,r);var e,u;if(k(n))for(e=0,u=n.length;u>e;e++)t(n[e],e,n);else{var i=m.keys(n);for(e=0,u=i.length;u>e;e++)t(n[i[e]],i[e],n)}return n},m.map=m.collect=function(n,t,r){t=x(t,r);for(var e=!k(n)&&m.keys(n),u=(e||n).length,i=Array(u),o=0;u>o;o++){var a=e?e[o]:o;i[o]=t(n[a],a,n)}return i},m.reduce=m.foldl=m.inject=n(1),m.reduceRight=m.foldr=n(-1),m.find=m.detect=function(n,t,r){var e;return e=k(n)?m.findIndex(n,t,r):m.findKey(n,t,r),e!==void 0&&e!==-1?n[e]:void 0},m.filter=m.select=function(n,t,r){var e=[];return t=x(t,r),m.each(n,function(n,r,u){t(n,r,u)&&e.push(n)}),e},m.reject=function(n,t,r){return m.filter(n,m.negate(x(t)),r)},m.every=m.all=function(n,t,r){t=x(t,r);for(var e=!k(n)&&m.keys(n),u=(e||n).length,i=0;u>i;i++){var o=e?e[i]:i;if(!t(n[o],o,n))return!1}return!0},m.some=m.any=function(n,t,r){t=x(t,r);for(var e=!k(n)&&m.keys(n),u=(e||n).length,i=0;u>i;i++){var o=e?e[i]:i;if(t(n[o],o,n))return!0}return!1},m.contains=m.includes=m.include=function(n,t,r,e){return k(n)||(n=m.values(n)),("number"!=typeof r||e)&&(r=0),m.indexOf(n,t,r)>=0},m.invoke=function(n,t){var r=l.call(arguments,2),e=m.isFunction(t);return m.map(n,function(n){var u=e?t:n[t];return null==u?u:u.apply(n,r)})},m.pluck=function(n,t){return m.map(n,m.property(t))},m.where=function(n,t){return m.filter(n,m.matcher(t))},m.findWhere=function(n,t){return m.find(n,m.matcher(t))},m.max=function(n,t,r){var e,u,i=-1/0,o=-1/0;if(null==t&&null!=n){n=k(n)?n:m.values(n);for(var a=0,c=n.length;c>a;a++)e=n[a],e>i&&(i=e)}else t=x(t,r),m.each(n,function(n,r,e){u=t(n,r,e),(u>o||u===-1/0&&i===-1/0)&&(i=n,o=u)});return i},m.min=function(n,t,r){var e,u,i=1/0,o=1/0;if(null==t&&null!=n){n=k(n)?n:m.values(n);for(var a=0,c=n.length;c>a;a++)e=n[a],i>e&&(i=e)}else t=x(t,r),m.each(n,function(n,r,e){u=t(n,r,e),(o>u||1/0===u&&1/0===i)&&(i=n,o=u)});return i},m.shuffle=function(n){for(var t,r=k(n)?n:m.values(n),e=r.length,u=Array(e),i=0;e>i;i++)t=m.random(0,i),t!==i&&(u[i]=u[t]),u[t]=r[i];return u},m.sample=function(n,t,r){return null==t||r?(k(n)||(n=m.values(n)),n[m.random(n.length-1)]):m.shuffle(n).slice(0,Math.max(0,t))},m.sortBy=function(n,t,r){return t=x(t,r),m.pluck(m.map(n,function(n,r,e){return{value:n,index:r,criteria:t(n,r,e)}}).sort(function(n,t){var r=n.criteria,e=t.criteria;if(r!==e){if(r>e||r===void 0)return 1;if(e>r||e===void 0)return-1}return n.index-t.index}),"value")};var F=function(n){return function(t,r,e){var u={};return r=x(r,e),m.each(t,function(e,i){var o=r(e,i,t);n(u,e,o)}),u}};m.groupBy=F(function(n,t,r){m.has(n,r)?n[r].push(t):n[r]=[t]}),m.indexBy=F(function(n,t,r){n[r]=t}),m.countBy=F(function(n,t,r){m.has(n,r)?n[r]++:n[r]=1}),m.toArray=function(n){return n?m.isArray(n)?l.call(n):k(n)?m.map(n,m.identity):m.values(n):[]},m.size=function(n){return null==n?0:k(n)?n.length:m.keys(n).length},m.partition=function(n,t,r){t=x(t,r);var e=[],u=[];return m.each(n,function(n,r,i){(t(n,r,i)?e:u).push(n)}),[e,u]},m.first=m.head=m.take=function(n,t,r){return null==n?void 0:null==t||r?n[0]:m.initial(n,n.length-t)},m.initial=function(n,t,r){return l.call(n,0,Math.max(0,n.length-(null==t||r?1:t)))},m.last=function(n,t,r){return null==n?void 0:null==t||r?n[n.length-1]:m.rest(n,Math.max(0,n.length-t))},m.rest=m.tail=m.drop=function(n,t,r){return l.call(n,null==t||r?1:t)},m.compact=function(n){return m.filter(n,m.identity)};var S=function(n,t,r,e){for(var u=[],i=0,o=e||0,a=O(n);a>o;o++){var c=n[o];if(k(c)&&(m.isArray(c)||m.isArguments(c))){t||(c=S(c,t,r));var f=0,l=c.length;for(u.length+=l;l>f;)u[i++]=c[f++]}else r||(u[i++]=c)}return u};m.flatten=function(n,t){return S(n,t,!1)},m.without=function(n){return m.difference(n,l.call(arguments,1))},m.uniq=m.unique=function(n,t,r,e){m.isBoolean(t)||(e=r,r=t,t=!1),null!=r&&(r=x(r,e));for(var u=[],i=[],o=0,a=O(n);a>o;o++){var c=n[o],f=r?r(c,o,n):c;t?(o&&i===f||u.push(c),i=f):r?m.contains(i,f)||(i.push(f),u.push(c)):m.contains(u,c)||u.push(c)}return u},m.union=function(){return m.uniq(S(arguments,!0,!0))},m.intersection=function(n){for(var t=[],r=arguments.length,e=0,u=O(n);u>e;e++){var i=n[e];if(!m.contains(t,i)){for(var o=1;r>o&&m.contains(arguments[o],i);o++);o===r&&t.push(i)}}return t},m.difference=function(n){var t=S(arguments,!0,!0,1);return m.filter(n,function(n){return!m.contains(t,n)})},m.zip=function(){return m.unzip(arguments)},m.unzip=function(n){for(var t=n&&m.max(n,O).length||0,r=Array(t),e=0;t>e;e++)r[e]=m.pluck(n,e);return r},m.object=function(n,t){for(var r={},e=0,u=O(n);u>e;e++)t?r[n[e]]=t[e]:r[n[e][0]]=n[e][1];return r},m.findIndex=t(1),m.findLastIndex=t(-1),m.sortedIndex=function(n,t,r,e){r=x(r,e,1);for(var u=r(t),i=0,o=O(n);o>i;){var a=Math.floor((i+o)/2);r(n[a])i;i++,n+=r)u[i]=n;return u};var E=function(n,t,r,e,u){if(!(e instanceof t))return n.apply(r,u);var i=j(n.prototype),o=n.apply(i,u);return m.isObject(o)?o:i};m.bind=function(n,t){if(g&&n.bind===g)return g.apply(n,l.call(arguments,1));if(!m.isFunction(n))throw new TypeError("Bind must be called on a function");var r=l.call(arguments,2),e=function(){return E(n,e,t,this,r.concat(l.call(arguments)))};return e},m.partial=function(n){var t=l.call(arguments,1),r=function(){for(var e=0,u=t.length,i=Array(u),o=0;u>o;o++)i[o]=t[o]===m?arguments[e++]:t[o];for(;e=e)throw new Error("bindAll must be passed function names");for(t=1;e>t;t++)r=arguments[t],n[r]=m.bind(n[r],n);return n},m.memoize=function(n,t){var r=function(e){var u=r.cache,i=""+(t?t.apply(this,arguments):e);return m.has(u,i)||(u[i]=n.apply(this,arguments)),u[i]};return r.cache={},r},m.delay=function(n,t){var r=l.call(arguments,2);return setTimeout(function(){return n.apply(null,r)},t)},m.defer=m.partial(m.delay,m,1),m.throttle=function(n,t,r){var e,u,i,o=null,a=0;r||(r={});var c=function(){a=r.leading===!1?0:m.now(),o=null,i=n.apply(e,u),o||(e=u=null)};return function(){var f=m.now();a||r.leading!==!1||(a=f);var l=t-(f-a);return e=this,u=arguments,0>=l||l>t?(o&&(clearTimeout(o),o=null),a=f,i=n.apply(e,u),o||(e=u=null)):o||r.trailing===!1||(o=setTimeout(c,l)),i}},m.debounce=function(n,t,r){var e,u,i,o,a,c=function(){var f=m.now()-o;t>f&&f>=0?e=setTimeout(c,t-f):(e=null,r||(a=n.apply(i,u),e||(i=u=null)))};return function(){i=this,u=arguments,o=m.now();var f=r&&!e;return e||(e=setTimeout(c,t)),f&&(a=n.apply(i,u),i=u=null),a}},m.wrap=function(n,t){return m.partial(t,n)},m.negate=function(n){return function(){return!n.apply(this,arguments)}},m.compose=function(){var n=arguments,t=n.length-1;return function(){for(var r=t,e=n[t].apply(this,arguments);r--;)e=n[r].call(this,e);return e}},m.after=function(n,t){return function(){return--n<1?t.apply(this,arguments):void 0}},m.before=function(n,t){var r;return function(){return--n>0&&(r=t.apply(this,arguments)),1>=n&&(t=null),r}},m.once=m.partial(m.before,2);var M=!{toString:null}.propertyIsEnumerable("toString"),I=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"];m.keys=function(n){if(!m.isObject(n))return[];if(v)return v(n);var t=[];for(var r in n)m.has(n,r)&&t.push(r);return M&&e(n,t),t},m.allKeys=function(n){if(!m.isObject(n))return[];var t=[];for(var r in n)t.push(r);return M&&e(n,t),t},m.values=function(n){for(var t=m.keys(n),r=t.length,e=Array(r),u=0;r>u;u++)e[u]=n[t[u]];return e},m.mapObject=function(n,t,r){t=x(t,r);for(var e,u=m.keys(n),i=u.length,o={},a=0;i>a;a++)e=u[a],o[e]=t(n[e],e,n);return o},m.pairs=function(n){for(var t=m.keys(n),r=t.length,e=Array(r),u=0;r>u;u++)e[u]=[t[u],n[t[u]]];return e},m.invert=function(n){for(var t={},r=m.keys(n),e=0,u=r.length;u>e;e++)t[n[r[e]]]=r[e];return t},m.functions=m.methods=function(n){var t=[];for(var r in n)m.isFunction(n[r])&&t.push(r);return t.sort()},m.extend=_(m.allKeys),m.extendOwn=m.assign=_(m.keys),m.findKey=function(n,t,r){t=x(t,r);for(var e,u=m.keys(n),i=0,o=u.length;o>i;i++)if(e=u[i],t(n[e],e,n))return e},m.pick=function(n,t,r){var e,u,i={},o=n;if(null==o)return i;m.isFunction(t)?(u=m.allKeys(o),e=b(t,r)):(u=S(arguments,!1,!1,1),e=function(n,t,r){return t in r},o=Object(o));for(var a=0,c=u.length;c>a;a++){var f=u[a],l=o[f];e(l,f,o)&&(i[f]=l)}return i},m.omit=function(n,t,r){if(m.isFunction(t))t=m.negate(t);else{var e=m.map(S(arguments,!1,!1,1),String);t=function(n,t){return!m.contains(e,t)}}return m.pick(n,t,r)},m.defaults=_(m.allKeys,!0),m.create=function(n,t){var r=j(n);return t&&m.extendOwn(r,t),r},m.clone=function(n){return m.isObject(n)?m.isArray(n)?n.slice():m.extend({},n):n},m.tap=function(n,t){return t(n),n},m.isMatch=function(n,t){var r=m.keys(t),e=r.length;if(null==n)return!e;for(var u=Object(n),i=0;e>i;i++){var o=r[i];if(t[o]!==u[o]||!(o in u))return!1}return!0};var N=function(n,t,r,e){if(n===t)return 0!==n||1/n===1/t;if(null==n||null==t)return n===t;n instanceof m&&(n=n._wrapped),t instanceof m&&(t=t._wrapped);var u=s.call(n);if(u!==s.call(t))return!1;switch(u){case"[object RegExp]":case"[object String]":return""+n==""+t;case"[object Number]":return+n!==+n?+t!==+t:0===+n?1/+n===1/t:+n===+t;case"[object Date]":case"[object Boolean]":return+n===+t}var i="[object Array]"===u;if(!i){if("object"!=typeof n||"object"!=typeof t)return!1;var o=n.constructor,a=t.constructor;if(o!==a&&!(m.isFunction(o)&&o instanceof o&&m.isFunction(a)&&a instanceof a)&&"constructor"in n&&"constructor"in t)return!1}r=r||[],e=e||[];for(var c=r.length;c--;)if(r[c]===n)return e[c]===t;if(r.push(n),e.push(t),i){if(c=n.length,c!==t.length)return!1;for(;c--;)if(!N(n[c],t[c],r,e))return!1}else{var f,l=m.keys(n);if(c=l.length,m.keys(t).length!==c)return!1;for(;c--;)if(f=l[c],!m.has(t,f)||!N(n[f],t[f],r,e))return!1}return r.pop(),e.pop(),!0};m.isEqual=function(n,t){return N(n,t)},m.isEmpty=function(n){return null==n?!0:k(n)&&(m.isArray(n)||m.isString(n)||m.isArguments(n))?0===n.length:0===m.keys(n).length},m.isElement=function(n){return!(!n||1!==n.nodeType)},m.isArray=h||function(n){return"[object Array]"===s.call(n)},m.isObject=function(n){var t=typeof n;return"function"===t||"object"===t&&!!n},m.each(["Arguments","Function","String","Number","Date","RegExp","Error"],function(n){m["is"+n]=function(t){return s.call(t)==="[object "+n+"]"}}),m.isArguments(arguments)||(m.isArguments=function(n){return m.has(n,"callee")}),"function"!=typeof/./&&"object"!=typeof Int8Array&&(m.isFunction=function(n){return"function"==typeof n||!1}),m.isFinite=function(n){return isFinite(n)&&!isNaN(parseFloat(n))},m.isNaN=function(n){return m.isNumber(n)&&n!==+n},m.isBoolean=function(n){return n===!0||n===!1||"[object Boolean]"===s.call(n)},m.isNull=function(n){return null===n},m.isUndefined=function(n){return n===void 0},m.has=function(n,t){return null!=n&&p.call(n,t)},m.noConflict=function(){return u._=i,this},m.identity=function(n){return n},m.constant=function(n){return function(){return n}},m.noop=function(){},m.property=w,m.propertyOf=function(n){return null==n?function(){}:function(t){return n[t]}},m.matcher=m.matches=function(n){return n=m.extendOwn({},n),function(t){return m.isMatch(t,n)}},m.times=function(n,t,r){var e=Array(Math.max(0,n));t=b(t,r,1);for(var u=0;n>u;u++)e[u]=t(u);return e},m.random=function(n,t){return null==t&&(t=n,n=0),n+Math.floor(Math.random()*(t-n+1))},m.now=Date.now||function(){return(new Date).getTime()};var B={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},T=m.invert(B),R=function(n){var t=function(t){return n[t]},r="(?:"+m.keys(n).join("|")+")",e=RegExp(r),u=RegExp(r,"g");return function(n){return n=null==n?"":""+n,e.test(n)?n.replace(u,t):n}};m.escape=R(B),m.unescape=R(T),m.result=function(n,t,r){var e=null==n?void 0:n[t];return e===void 0&&(e=r),m.isFunction(e)?e.call(n):e};var q=0;m.uniqueId=function(n){var t=++q+"";return n?n+t:t},m.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var K=/(.)^/,z={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},D=/\\|'|\r|\n|\u2028|\u2029/g,L=function(n){return"\\"+z[n]};m.template=function(n,t,r){!t&&r&&(t=r),t=m.defaults({},t,m.templateSettings);var e=RegExp([(t.escape||K).source,(t.interpolate||K).source,(t.evaluate||K).source].join("|")+"|$","g"),u=0,i="__p+='";n.replace(e,function(t,r,e,o,a){return i+=n.slice(u,a).replace(D,L),u=a+t.length,r?i+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'":e?i+="'+\n((__t=("+e+"))==null?'':__t)+\n'":o&&(i+="';\n"+o+"\n__p+='"),t}),i+="';\n",t.variable||(i="with(obj||{}){\n"+i+"}\n"),i="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+i+"return __p;\n";try{var o=new Function(t.variable||"obj","_",i)}catch(a){throw a.source=i,a}var c=function(n){return o.call(this,n,m)},f=t.variable||"obj";return c.source="function("+f+"){\n"+i+"}",c},m.chain=function(n){var t=m(n);return t._chain=!0,t};var P=function(n,t){return n._chain?m(t).chain():t};m.mixin=function(n){m.each(m.functions(n),function(t){var r=m[t]=n[t];m.prototype[t]=function(){var n=[this._wrapped];return f.apply(n,arguments),P(this,r.apply(m,n))}})},m.mixin(m),m.each(["pop","push","reverse","shift","sort","splice","unshift"],function(n){var t=o[n];m.prototype[n]=function(){var r=this._wrapped;return t.apply(r,arguments),"shift"!==n&&"splice"!==n||0!==r.length||delete r[0],P(this,r)}}),m.each(["concat","join","slice"],function(n){var t=o[n];m.prototype[n]=function(){return P(this,t.apply(this._wrapped,arguments))}}),m.prototype.value=function(){return this._wrapped},m.prototype.valueOf=m.prototype.toJSON=m.prototype.value,m.prototype.toString=function(){return""+this._wrapped},"function"==typeof define&&define.amd&&define("underscore",[],function(){return m})}).call(this); //# sourceMappingURL=underscore-min.mapprewikka-5.1.1/prewikka/htdocs/js/underscore-min.map0000664000175000017500000006570513555143652024133 0ustar tandrejatandreja00000000000000{"version":3,"file":"underscore-min.js","sources":["underscore.js"],"names":["createReduce","dir","iterator","obj","iteratee","memo","keys","index","length","currentKey","context","optimizeCb","isArrayLike","_","arguments","createPredicateIndexFinder","array","predicate","cb","getLength","createIndexFinder","predicateFind","sortedIndex","item","idx","i","Math","max","min","slice","call","isNaN","collectNonEnumProps","nonEnumIdx","nonEnumerableProps","constructor","proto","isFunction","prototype","ObjProto","prop","has","contains","push","root","this","previousUnderscore","ArrayProto","Array","Object","FuncProto","Function","toString","hasOwnProperty","nativeIsArray","isArray","nativeKeys","nativeBind","bind","nativeCreate","create","Ctor","_wrapped","exports","module","VERSION","func","argCount","value","other","collection","accumulator","apply","identity","isObject","matcher","property","Infinity","createAssigner","keysFunc","undefinedOnly","source","l","key","baseCreate","result","MAX_ARRAY_INDEX","pow","each","forEach","map","collect","results","reduce","foldl","inject","reduceRight","foldr","find","detect","findIndex","findKey","filter","select","list","reject","negate","every","all","some","any","includes","include","fromIndex","guard","values","indexOf","invoke","method","args","isFunc","pluck","where","attrs","findWhere","computed","lastComputed","shuffle","rand","set","shuffled","random","sample","n","sortBy","criteria","sort","left","right","a","b","group","behavior","groupBy","indexBy","countBy","toArray","size","partition","pass","fail","first","head","take","initial","last","rest","tail","drop","compact","flatten","input","shallow","strict","startIndex","output","isArguments","j","len","without","difference","uniq","unique","isSorted","isBoolean","seen","union","intersection","argsLength","zip","unzip","object","findLastIndex","low","high","mid","floor","lastIndexOf","range","start","stop","step","ceil","executeBound","sourceFunc","boundFunc","callingContext","self","TypeError","bound","concat","partial","boundArgs","position","bindAll","Error","memoize","hasher","cache","address","delay","wait","setTimeout","defer","throttle","options","timeout","previous","later","leading","now","remaining","clearTimeout","trailing","debounce","immediate","timestamp","callNow","wrap","wrapper","compose","after","times","before","once","hasEnumBug","propertyIsEnumerable","allKeys","mapObject","pairs","invert","functions","methods","names","extend","extendOwn","assign","pick","oiteratee","omit","String","defaults","props","clone","tap","interceptor","isMatch","eq","aStack","bStack","className","areArrays","aCtor","bCtor","pop","isEqual","isEmpty","isString","isElement","nodeType","type","name","Int8Array","isFinite","parseFloat","isNumber","isNull","isUndefined","noConflict","constant","noop","propertyOf","matches","accum","Date","getTime","escapeMap","&","<",">","\"","'","`","unescapeMap","createEscaper","escaper","match","join","testRegexp","RegExp","replaceRegexp","string","test","replace","escape","unescape","fallback","idCounter","uniqueId","prefix","id","templateSettings","evaluate","interpolate","noMatch","escapes","\\","\r","\n","
","
","escapeChar","template","text","settings","oldSettings","offset","variable","render","e","data","argument","chain","instance","_chain","mixin","valueOf","toJSON","define","amd"],"mappings":";;;;CAKC,WA4KC,QAASA,GAAaC,GAGpB,QAASC,GAASC,EAAKC,EAAUC,EAAMC,EAAMC,EAAOC,GAClD,KAAOD,GAAS,GAAaC,EAARD,EAAgBA,GAASN,EAAK,CACjD,GAAIQ,GAAaH,EAAOA,EAAKC,GAASA,CACtCF,GAAOD,EAASC,EAAMF,EAAIM,GAAaA,EAAYN,GAErD,MAAOE,GAGT,MAAO,UAASF,EAAKC,EAAUC,EAAMK,GACnCN,EAAWO,EAAWP,EAAUM,EAAS,EACzC,IAAIJ,IAAQM,EAAYT,IAAQU,EAAEP,KAAKH,GACnCK,GAAUF,GAAQH,GAAKK,OACvBD,EAAQN,EAAM,EAAI,EAAIO,EAAS,CAMnC,OAJIM,WAAUN,OAAS,IACrBH,EAAOF,EAAIG,EAAOA,EAAKC,GAASA,GAChCA,GAASN,GAEJC,EAASC,EAAKC,EAAUC,EAAMC,EAAMC,EAAOC,IA+ZtD,QAASO,GAA2Bd,GAClC,MAAO,UAASe,EAAOC,EAAWP,GAChCO,EAAYC,EAAGD,EAAWP,EAG1B,KAFA,GAAIF,GAASW,EAAUH,GACnBT,EAAQN,EAAM,EAAI,EAAIO,EAAS,EAC5BD,GAAS,GAAaC,EAARD,EAAgBA,GAASN,EAC5C,GAAIgB,EAAUD,EAAMT,GAAQA,EAAOS,GAAQ,MAAOT,EAEpD,QAAQ,GAsBZ,QAASa,GAAkBnB,EAAKoB,EAAeC,GAC7C,MAAO,UAASN,EAAOO,EAAMC,GAC3B,GAAIC,GAAI,EAAGjB,EAASW,EAAUH,EAC9B,IAAkB,gBAAPQ,GACLvB,EAAM,EACNwB,EAAID,GAAO,EAAIA,EAAME,KAAKC,IAAIH,EAAMhB,EAAQiB,GAE5CjB,EAASgB,GAAO,EAAIE,KAAKE,IAAIJ,EAAM,EAAGhB,GAAUgB,EAAMhB,EAAS,MAE9D,IAAIc,GAAeE,GAAOhB,EAE/B,MADAgB,GAAMF,EAAYN,EAAOO,GAClBP,EAAMQ,KAASD,EAAOC,GAAO,CAEtC,IAAID,IAASA,EAEX,MADAC,GAAMH,EAAcQ,EAAMC,KAAKd,EAAOS,EAAGjB,GAASK,EAAEkB,OAC7CP,GAAO,EAAIA,EAAMC,GAAK,CAE/B,KAAKD,EAAMvB,EAAM,EAAIwB,EAAIjB,EAAS,EAAGgB,GAAO,GAAWhB,EAANgB,EAAcA,GAAOvB,EACpE,GAAIe,EAAMQ,KAASD,EAAM,MAAOC,EAElC,QAAQ,GAqPZ,QAASQ,GAAoB7B,EAAKG,GAChC,GAAI2B,GAAaC,EAAmB1B,OAChC2B,EAAchC,EAAIgC,YAClBC,EAASvB,EAAEwB,WAAWF,IAAgBA,EAAYG,WAAcC,EAGhEC,EAAO,aAGX,KAFI3B,EAAE4B,IAAItC,EAAKqC,KAAU3B,EAAE6B,SAASpC,EAAMkC,IAAOlC,EAAKqC,KAAKH,GAEpDP,KACLO,EAAON,EAAmBD,GACtBO,IAAQrC,IAAOA,EAAIqC,KAAUJ,EAAMI,KAAU3B,EAAE6B,SAASpC,EAAMkC,IAChElC,EAAKqC,KAAKH,GA74BhB,GAAII,GAAOC,KAGPC,EAAqBF,EAAK/B,EAG1BkC,EAAaC,MAAMV,UAAWC,EAAWU,OAAOX,UAAWY,EAAYC,SAASb,UAIlFK,EAAmBI,EAAWJ,KAC9Bd,EAAmBkB,EAAWlB,MAC9BuB,EAAmBb,EAASa,SAC5BC,EAAmBd,EAASc,eAK5BC,EAAqBN,MAAMO,QAC3BC,EAAqBP,OAAO3C,KAC5BmD,EAAqBP,EAAUQ,KAC/BC,EAAqBV,OAAOW,OAG1BC,EAAO,aAGPhD,EAAI,SAASV,GACf,MAAIA,aAAeU,GAAUV,EACvB0C,eAAgBhC,QACtBgC,KAAKiB,SAAW3D,GADiB,GAAIU,GAAEV,GAOlB,oBAAZ4D,UACa,mBAAXC,SAA0BA,OAAOD,UAC1CA,QAAUC,OAAOD,QAAUlD,GAE7BkD,QAAQlD,EAAIA,GAEZ+B,EAAK/B,EAAIA,EAIXA,EAAEoD,QAAU,OAKZ,IAAItD,GAAa,SAASuD,EAAMxD,EAASyD,GACvC,GAAIzD,QAAiB,GAAG,MAAOwD,EAC/B,QAAoB,MAAZC,EAAmB,EAAIA,GAC7B,IAAK,GAAG,MAAO,UAASC,GACtB,MAAOF,GAAKpC,KAAKpB,EAAS0D,GAE5B,KAAK,GAAG,MAAO,UAASA,EAAOC,GAC7B,MAAOH,GAAKpC,KAAKpB,EAAS0D,EAAOC,GAEnC,KAAK,GAAG,MAAO,UAASD,EAAO7D,EAAO+D,GACpC,MAAOJ,GAAKpC,KAAKpB,EAAS0D,EAAO7D,EAAO+D,GAE1C,KAAK,GAAG,MAAO,UAASC,EAAaH,EAAO7D,EAAO+D,GACjD,MAAOJ,GAAKpC,KAAKpB,EAAS6D,EAAaH,EAAO7D,EAAO+D,IAGzD,MAAO,YACL,MAAOJ,GAAKM,MAAM9D,EAASI,aAO3BI,EAAK,SAASkD,EAAO1D,EAASyD,GAChC,MAAa,OAATC,EAAsBvD,EAAE4D,SACxB5D,EAAEwB,WAAW+B,GAAezD,EAAWyD,EAAO1D,EAASyD,GACvDtD,EAAE6D,SAASN,GAAevD,EAAE8D,QAAQP,GACjCvD,EAAE+D,SAASR,GAEpBvD,GAAET,SAAW,SAASgE,EAAO1D,GAC3B,MAAOQ,GAAGkD,EAAO1D,EAASmE,KAI5B,IAAIC,GAAiB,SAASC,EAAUC,GACtC,MAAO,UAAS7E,GACd,GAAIK,GAASM,UAAUN,MACvB,IAAa,EAATA,GAAqB,MAAPL,EAAa,MAAOA,EACtC,KAAK,GAAII,GAAQ,EAAWC,EAARD,EAAgBA,IAIlC,IAAK,GAHD0E,GAASnE,UAAUP,GACnBD,EAAOyE,EAASE,GAChBC,EAAI5E,EAAKE,OACJiB,EAAI,EAAOyD,EAAJzD,EAAOA,IAAK,CAC1B,GAAI0D,GAAM7E,EAAKmB,EACVuD,IAAiB7E,EAAIgF,SAAc,KAAGhF,EAAIgF,GAAOF,EAAOE,IAGjE,MAAOhF,KAKPiF,EAAa,SAAS9C,GACxB,IAAKzB,EAAE6D,SAASpC,GAAY,QAC5B,IAAIqB,EAAc,MAAOA,GAAarB,EACtCuB,GAAKvB,UAAYA,CACjB,IAAI+C,GAAS,GAAIxB,EAEjB,OADAA,GAAKvB,UAAY,KACV+C,GAGLT,EAAW,SAASO,GACtB,MAAO,UAAShF,GACd,MAAc,OAAPA,MAAmB,GAAIA,EAAIgF,KAQlCG,EAAkB5D,KAAK6D,IAAI,EAAG,IAAM,EACpCpE,EAAYyD,EAAS,UACrBhE,EAAc,SAAS0D,GACzB,GAAI9D,GAASW,EAAUmD,EACvB,OAAwB,gBAAV9D,IAAsBA,GAAU,GAAe8E,GAAV9E,EASrDK,GAAE2E,KAAO3E,EAAE4E,QAAU,SAAStF,EAAKC,EAAUM,GAC3CN,EAAWO,EAAWP,EAAUM,EAChC,IAAIe,GAAGjB,CACP,IAAII,EAAYT,GACd,IAAKsB,EAAI,EAAGjB,EAASL,EAAIK,OAAYA,EAAJiB,EAAYA,IAC3CrB,EAASD,EAAIsB,GAAIA,EAAGtB,OAEjB,CACL,GAAIG,GAAOO,EAAEP,KAAKH,EAClB,KAAKsB,EAAI,EAAGjB,EAASF,EAAKE,OAAYA,EAAJiB,EAAYA,IAC5CrB,EAASD,EAAIG,EAAKmB,IAAKnB,EAAKmB,GAAItB,GAGpC,MAAOA,IAITU,EAAE6E,IAAM7E,EAAE8E,QAAU,SAASxF,EAAKC,EAAUM,GAC1CN,EAAWc,EAAGd,EAAUM,EAIxB,KAAK,GAHDJ,IAAQM,EAAYT,IAAQU,EAAEP,KAAKH,GACnCK,GAAUF,GAAQH,GAAKK,OACvBoF,EAAU5C,MAAMxC,GACXD,EAAQ,EAAWC,EAARD,EAAgBA,IAAS,CAC3C,GAAIE,GAAaH,EAAOA,EAAKC,GAASA,CACtCqF,GAAQrF,GAASH,EAASD,EAAIM,GAAaA,EAAYN,GAEzD,MAAOyF,IA+BT/E,EAAEgF,OAAShF,EAAEiF,MAAQjF,EAAEkF,OAAS/F,EAAa,GAG7Ca,EAAEmF,YAAcnF,EAAEoF,MAAQjG,GAAc,GAGxCa,EAAEqF,KAAOrF,EAAEsF,OAAS,SAAShG,EAAKc,EAAWP,GAC3C,GAAIyE,EAMJ,OAJEA,GADEvE,EAAYT,GACRU,EAAEuF,UAAUjG,EAAKc,EAAWP,GAE5BG,EAAEwF,QAAQlG,EAAKc,EAAWP,GAE9ByE,QAAa,IAAKA,KAAS,EAAUhF,EAAIgF,GAA7C,QAKFtE,EAAEyF,OAASzF,EAAE0F,OAAS,SAASpG,EAAKc,EAAWP,GAC7C,GAAIkF,KAKJ,OAJA3E,GAAYC,EAAGD,EAAWP,GAC1BG,EAAE2E,KAAKrF,EAAK,SAASiE,EAAO7D,EAAOiG,GAC7BvF,EAAUmD,EAAO7D,EAAOiG,IAAOZ,EAAQjD,KAAKyB,KAE3CwB,GAIT/E,EAAE4F,OAAS,SAAStG,EAAKc,EAAWP,GAClC,MAAOG,GAAEyF,OAAOnG,EAAKU,EAAE6F,OAAOxF,EAAGD,IAAaP,IAKhDG,EAAE8F,MAAQ9F,EAAE+F,IAAM,SAASzG,EAAKc,EAAWP,GACzCO,EAAYC,EAAGD,EAAWP,EAG1B,KAAK,GAFDJ,IAAQM,EAAYT,IAAQU,EAAEP,KAAKH,GACnCK,GAAUF,GAAQH,GAAKK,OAClBD,EAAQ,EAAWC,EAARD,EAAgBA,IAAS,CAC3C,GAAIE,GAAaH,EAAOA,EAAKC,GAASA,CACtC,KAAKU,EAAUd,EAAIM,GAAaA,EAAYN,GAAM,OAAO,EAE3D,OAAO,GAKTU,EAAEgG,KAAOhG,EAAEiG,IAAM,SAAS3G,EAAKc,EAAWP,GACxCO,EAAYC,EAAGD,EAAWP,EAG1B,KAAK,GAFDJ,IAAQM,EAAYT,IAAQU,EAAEP,KAAKH,GACnCK,GAAUF,GAAQH,GAAKK,OAClBD,EAAQ,EAAWC,EAARD,EAAgBA,IAAS,CAC3C,GAAIE,GAAaH,EAAOA,EAAKC,GAASA,CACtC,IAAIU,EAAUd,EAAIM,GAAaA,EAAYN,GAAM,OAAO,EAE1D,OAAO,GAKTU,EAAE6B,SAAW7B,EAAEkG,SAAWlG,EAAEmG,QAAU,SAAS7G,EAAKoB,EAAM0F,EAAWC,GAGnE,MAFKtG,GAAYT,KAAMA,EAAMU,EAAEsG,OAAOhH,KACd,gBAAb8G,IAAyBC,KAAOD,EAAY,GAChDpG,EAAEuG,QAAQjH,EAAKoB,EAAM0F,IAAc,GAI5CpG,EAAEwG,OAAS,SAASlH,EAAKmH,GACvB,GAAIC,GAAO1F,EAAMC,KAAKhB,UAAW,GAC7B0G,EAAS3G,EAAEwB,WAAWiF,EAC1B,OAAOzG,GAAE6E,IAAIvF,EAAK,SAASiE,GACzB,GAAIF,GAAOsD,EAASF,EAASlD,EAAMkD,EACnC,OAAe,OAARpD,EAAeA,EAAOA,EAAKM,MAAMJ,EAAOmD,MAKnD1G,EAAE4G,MAAQ,SAAStH,EAAKgF,GACtB,MAAOtE,GAAE6E,IAAIvF,EAAKU,EAAE+D,SAASO,KAK/BtE,EAAE6G,MAAQ,SAASvH,EAAKwH,GACtB,MAAO9G,GAAEyF,OAAOnG,EAAKU,EAAE8D,QAAQgD,KAKjC9G,EAAE+G,UAAY,SAASzH,EAAKwH,GAC1B,MAAO9G,GAAEqF,KAAK/F,EAAKU,EAAE8D,QAAQgD,KAI/B9G,EAAEc,IAAM,SAASxB,EAAKC,EAAUM,GAC9B,GACI0D,GAAOyD,EADPxC,GAAUR,IAAUiD,GAAgBjD,GAExC,IAAgB,MAAZzE,GAA2B,MAAPD,EAAa,CACnCA,EAAMS,EAAYT,GAAOA,EAAMU,EAAEsG,OAAOhH,EACxC,KAAK,GAAIsB,GAAI,EAAGjB,EAASL,EAAIK,OAAYA,EAAJiB,EAAYA,IAC/C2C,EAAQjE,EAAIsB,GACR2C,EAAQiB,IACVA,EAASjB,OAIbhE,GAAWc,EAAGd,EAAUM,GACxBG,EAAE2E,KAAKrF,EAAK,SAASiE,EAAO7D,EAAOiG,GACjCqB,EAAWzH,EAASgE,EAAO7D,EAAOiG,IAC9BqB,EAAWC,GAAgBD,KAAchD,KAAYQ,KAAYR,OACnEQ,EAASjB,EACT0D,EAAeD,IAIrB,OAAOxC,IAITxE,EAAEe,IAAM,SAASzB,EAAKC,EAAUM,GAC9B,GACI0D,GAAOyD,EADPxC,EAASR,IAAUiD,EAAejD,GAEtC,IAAgB,MAAZzE,GAA2B,MAAPD,EAAa,CACnCA,EAAMS,EAAYT,GAAOA,EAAMU,EAAEsG,OAAOhH,EACxC,KAAK,GAAIsB,GAAI,EAAGjB,EAASL,EAAIK,OAAYA,EAAJiB,EAAYA,IAC/C2C,EAAQjE,EAAIsB,GACA4D,EAARjB,IACFiB,EAASjB,OAIbhE,GAAWc,EAAGd,EAAUM,GACxBG,EAAE2E,KAAKrF,EAAK,SAASiE,EAAO7D,EAAOiG,GACjCqB,EAAWzH,EAASgE,EAAO7D,EAAOiG,IACnBsB,EAAXD,GAAwChD,MAAbgD,GAAoChD,MAAXQ,KACtDA,EAASjB,EACT0D,EAAeD,IAIrB,OAAOxC,IAKTxE,EAAEkH,QAAU,SAAS5H,GAInB,IAAK,GAAe6H,GAHhBC,EAAMrH,EAAYT,GAAOA,EAAMU,EAAEsG,OAAOhH,GACxCK,EAASyH,EAAIzH,OACb0H,EAAWlF,MAAMxC,GACZD,EAAQ,EAAiBC,EAARD,EAAgBA,IACxCyH,EAAOnH,EAAEsH,OAAO,EAAG5H,GACfyH,IAASzH,IAAO2H,EAAS3H,GAAS2H,EAASF,IAC/CE,EAASF,GAAQC,EAAI1H,EAEvB,OAAO2H,IAMTrH,EAAEuH,OAAS,SAASjI,EAAKkI,EAAGnB,GAC1B,MAAS,OAALmB,GAAanB,GACVtG,EAAYT,KAAMA,EAAMU,EAAEsG,OAAOhH,IAC/BA,EAAIU,EAAEsH,OAAOhI,EAAIK,OAAS,KAE5BK,EAAEkH,QAAQ5H,GAAK0B,MAAM,EAAGH,KAAKC,IAAI,EAAG0G,KAI7CxH,EAAEyH,OAAS,SAASnI,EAAKC,EAAUM,GAEjC,MADAN,GAAWc,EAAGd,EAAUM,GACjBG,EAAE4G,MAAM5G,EAAE6E,IAAIvF,EAAK,SAASiE,EAAO7D,EAAOiG,GAC/C,OACEpC,MAAOA,EACP7D,MAAOA,EACPgI,SAAUnI,EAASgE,EAAO7D,EAAOiG,MAElCgC,KAAK,SAASC,EAAMC,GACrB,GAAIC,GAAIF,EAAKF,SACTK,EAAIF,EAAMH,QACd,IAAII,IAAMC,EAAG,CACX,GAAID,EAAIC,GAAKD,QAAW,GAAG,MAAO,EAClC,IAAQC,EAAJD,GAASC,QAAW,GAAG,OAAQ,EAErC,MAAOH,GAAKlI,MAAQmI,EAAMnI,QACxB,SAIN,IAAIsI,GAAQ,SAASC,GACnB,MAAO,UAAS3I,EAAKC,EAAUM,GAC7B,GAAI2E,KAMJ,OALAjF,GAAWc,EAAGd,EAAUM,GACxBG,EAAE2E,KAAKrF,EAAK,SAASiE,EAAO7D,GAC1B,GAAI4E,GAAM/E,EAASgE,EAAO7D,EAAOJ,EACjC2I,GAASzD,EAAQjB,EAAOe,KAEnBE,GAMXxE,GAAEkI,QAAUF,EAAM,SAASxD,EAAQjB,EAAOe,GACpCtE,EAAE4B,IAAI4C,EAAQF,GAAME,EAAOF,GAAKxC,KAAKyB,GAAaiB,EAAOF,IAAQf,KAKvEvD,EAAEmI,QAAUH,EAAM,SAASxD,EAAQjB,EAAOe,GACxCE,EAAOF,GAAOf,IAMhBvD,EAAEoI,QAAUJ,EAAM,SAASxD,EAAQjB,EAAOe,GACpCtE,EAAE4B,IAAI4C,EAAQF,GAAME,EAAOF,KAAaE,EAAOF,GAAO,IAI5DtE,EAAEqI,QAAU,SAAS/I,GACnB,MAAKA,GACDU,EAAE0C,QAAQpD,GAAa0B,EAAMC,KAAK3B,GAClCS,EAAYT,GAAaU,EAAE6E,IAAIvF,EAAKU,EAAE4D,UACnC5D,EAAEsG,OAAOhH,OAIlBU,EAAEsI,KAAO,SAAShJ,GAChB,MAAW,OAAPA,EAAoB,EACjBS,EAAYT,GAAOA,EAAIK,OAASK,EAAEP,KAAKH,GAAKK,QAKrDK,EAAEuI,UAAY,SAASjJ,EAAKc,EAAWP,GACrCO,EAAYC,EAAGD,EAAWP,EAC1B,IAAI2I,MAAWC,IAIf,OAHAzI,GAAE2E,KAAKrF,EAAK,SAASiE,EAAOe,EAAKhF,IAC9Bc,EAAUmD,EAAOe,EAAKhF,GAAOkJ,EAAOC,GAAM3G,KAAKyB,MAE1CiF,EAAMC,IAShBzI,EAAE0I,MAAQ1I,EAAE2I,KAAO3I,EAAE4I,KAAO,SAASzI,EAAOqH,EAAGnB,GAC7C,MAAa,OAATlG,MAA2B,GACtB,MAALqH,GAAanB,EAAclG,EAAM,GAC9BH,EAAE6I,QAAQ1I,EAAOA,EAAMR,OAAS6H,IAMzCxH,EAAE6I,QAAU,SAAS1I,EAAOqH,EAAGnB,GAC7B,MAAOrF,GAAMC,KAAKd,EAAO,EAAGU,KAAKC,IAAI,EAAGX,EAAMR,QAAe,MAAL6H,GAAanB,EAAQ,EAAImB,MAKnFxH,EAAE8I,KAAO,SAAS3I,EAAOqH,EAAGnB,GAC1B,MAAa,OAATlG,MAA2B,GACtB,MAALqH,GAAanB,EAAclG,EAAMA,EAAMR,OAAS,GAC7CK,EAAE+I,KAAK5I,EAAOU,KAAKC,IAAI,EAAGX,EAAMR,OAAS6H,KAMlDxH,EAAE+I,KAAO/I,EAAEgJ,KAAOhJ,EAAEiJ,KAAO,SAAS9I,EAAOqH,EAAGnB,GAC5C,MAAOrF,GAAMC,KAAKd,EAAY,MAALqH,GAAanB,EAAQ,EAAImB,IAIpDxH,EAAEkJ,QAAU,SAAS/I,GACnB,MAAOH,GAAEyF,OAAOtF,EAAOH,EAAE4D,UAI3B,IAAIuF,GAAU,SAASC,EAAOC,EAASC,EAAQC,GAE7C,IAAK,GADDC,MAAa7I,EAAM,EACdC,EAAI2I,GAAc,EAAG5J,EAASW,EAAU8I,GAAYzJ,EAAJiB,EAAYA,IAAK,CACxE,GAAI2C,GAAQ6F,EAAMxI,EAClB,IAAIb,EAAYwD,KAAWvD,EAAE0C,QAAQa,IAAUvD,EAAEyJ,YAAYlG,IAAS,CAE/D8F,IAAS9F,EAAQ4F,EAAQ5F,EAAO8F,EAASC,GAC9C,IAAII,GAAI,EAAGC,EAAMpG,EAAM5D,MAEvB,KADA6J,EAAO7J,QAAUgK,EACNA,EAAJD,GACLF,EAAO7I,KAAS4C,EAAMmG,SAEdJ,KACVE,EAAO7I,KAAS4C,GAGpB,MAAOiG,GAITxJ,GAAEmJ,QAAU,SAAShJ,EAAOkJ,GAC1B,MAAOF,GAAQhJ,EAAOkJ,GAAS,IAIjCrJ,EAAE4J,QAAU,SAASzJ,GACnB,MAAOH,GAAE6J,WAAW1J,EAAOa,EAAMC,KAAKhB,UAAW,KAMnDD,EAAE8J,KAAO9J,EAAE+J,OAAS,SAAS5J,EAAO6J,EAAUzK,EAAUM,GACjDG,EAAEiK,UAAUD,KACfnK,EAAUN,EACVA,EAAWyK,EACXA,GAAW,GAEG,MAAZzK,IAAkBA,EAAWc,EAAGd,EAAUM,GAG9C,KAAK,GAFD2E,MACA0F,KACKtJ,EAAI,EAAGjB,EAASW,EAAUH,GAAYR,EAAJiB,EAAYA,IAAK,CAC1D,GAAI2C,GAAQpD,EAAMS,GACdoG,EAAWzH,EAAWA,EAASgE,EAAO3C,EAAGT,GAASoD,CAClDyG,IACGpJ,GAAKsJ,IAASlD,GAAUxC,EAAO1C,KAAKyB,GACzC2G,EAAOlD,GACEzH,EACJS,EAAE6B,SAASqI,EAAMlD,KACpBkD,EAAKpI,KAAKkF,GACVxC,EAAO1C,KAAKyB,IAEJvD,EAAE6B,SAAS2C,EAAQjB,IAC7BiB,EAAO1C,KAAKyB,GAGhB,MAAOiB,IAKTxE,EAAEmK,MAAQ,WACR,MAAOnK,GAAE8J,KAAKX,EAAQlJ,WAAW,GAAM,KAKzCD,EAAEoK,aAAe,SAASjK,GAGxB,IAAK,GAFDqE,MACA6F,EAAapK,UAAUN,OAClBiB,EAAI,EAAGjB,EAASW,EAAUH,GAAYR,EAAJiB,EAAYA,IAAK,CAC1D,GAAIF,GAAOP,EAAMS,EACjB,KAAIZ,EAAE6B,SAAS2C,EAAQ9D,GAAvB,CACA,IAAK,GAAIgJ,GAAI,EAAOW,EAAJX,GACT1J,EAAE6B,SAAS5B,UAAUyJ,GAAIhJ,GADAgJ,KAG5BA,IAAMW,GAAY7F,EAAO1C,KAAKpB,IAEpC,MAAO8D,IAKTxE,EAAE6J,WAAa,SAAS1J,GACtB,GAAI4I,GAAOI,EAAQlJ,WAAW,GAAM,EAAM,EAC1C,OAAOD,GAAEyF,OAAOtF,EAAO,SAASoD,GAC9B,OAAQvD,EAAE6B,SAASkH,EAAMxF,MAM7BvD,EAAEsK,IAAM,WACN,MAAOtK,GAAEuK,MAAMtK,YAKjBD,EAAEuK,MAAQ,SAASpK,GAIjB,IAAK,GAHDR,GAASQ,GAASH,EAAEc,IAAIX,EAAOG,GAAWX,QAAU,EACpD6E,EAASrC,MAAMxC,GAEVD,EAAQ,EAAWC,EAARD,EAAgBA,IAClC8E,EAAO9E,GAASM,EAAE4G,MAAMzG,EAAOT,EAEjC,OAAO8E,IAMTxE,EAAEwK,OAAS,SAAS7E,EAAMW,GAExB,IAAK,GADD9B,MACK5D,EAAI,EAAGjB,EAASW,EAAUqF,GAAWhG,EAAJiB,EAAYA,IAChD0F,EACF9B,EAAOmB,EAAK/E,IAAM0F,EAAO1F,GAEzB4D,EAAOmB,EAAK/E,GAAG,IAAM+E,EAAK/E,GAAG,EAGjC,OAAO4D,IAiBTxE,EAAEuF,UAAYrF,EAA2B,GACzCF,EAAEyK,cAAgBvK,GAA4B,GAI9CF,EAAES,YAAc,SAASN,EAAOb,EAAKC,EAAUM,GAC7CN,EAAWc,EAAGd,EAAUM,EAAS,EAGjC,KAFA,GAAI0D,GAAQhE,EAASD,GACjBoL,EAAM,EAAGC,EAAOrK,EAAUH,GACjBwK,EAAND,GAAY,CACjB,GAAIE,GAAM/J,KAAKgK,OAAOH,EAAMC,GAAQ,EAChCpL,GAASY,EAAMyK,IAAQrH,EAAOmH,EAAME,EAAM,EAAQD,EAAOC,EAE/D,MAAOF,IAgCT1K,EAAEuG,QAAUhG,EAAkB,EAAGP,EAAEuF,UAAWvF,EAAES,aAChDT,EAAE8K,YAAcvK,GAAmB,EAAGP,EAAEyK,eAKxCzK,EAAE+K,MAAQ,SAASC,EAAOC,EAAMC,GAClB,MAARD,IACFA,EAAOD,GAAS,EAChBA,EAAQ,GAEVE,EAAOA,GAAQ,CAKf,KAAK,GAHDvL,GAASkB,KAAKC,IAAID,KAAKsK,MAAMF,EAAOD,GAASE,GAAO,GACpDH,EAAQ5I,MAAMxC,GAETgB,EAAM,EAAShB,EAANgB,EAAcA,IAAOqK,GAASE,EAC9CH,EAAMpK,GAAOqK,CAGf,OAAOD,GAQT,IAAIK,GAAe,SAASC,EAAYC,EAAWzL,EAAS0L,EAAgB7E,GAC1E,KAAM6E,YAA0BD,IAAY,MAAOD,GAAW1H,MAAM9D,EAAS6G,EAC7E,IAAI8E,GAAOjH,EAAW8G,EAAW5J,WAC7B+C,EAAS6G,EAAW1H,MAAM6H,EAAM9E,EACpC,OAAI1G,GAAE6D,SAASW,GAAgBA,EACxBgH,EAMTxL,GAAE6C,KAAO,SAASQ,EAAMxD,GACtB,GAAI+C,GAAcS,EAAKR,OAASD,EAAY,MAAOA,GAAWe,MAAMN,EAAMrC,EAAMC,KAAKhB,UAAW,GAChG,KAAKD,EAAEwB,WAAW6B,GAAO,KAAM,IAAIoI,WAAU,oCAC7C,IAAI/E,GAAO1F,EAAMC,KAAKhB,UAAW,GAC7ByL,EAAQ,WACV,MAAON,GAAa/H,EAAMqI,EAAO7L,EAASmC,KAAM0E,EAAKiF,OAAO3K,EAAMC,KAAKhB,aAEzE,OAAOyL,IAMT1L,EAAE4L,QAAU,SAASvI,GACnB,GAAIwI,GAAY7K,EAAMC,KAAKhB,UAAW,GAClCyL,EAAQ,WAGV,IAAK,GAFDI,GAAW,EAAGnM,EAASkM,EAAUlM,OACjC+G,EAAOvE,MAAMxC,GACRiB,EAAI,EAAOjB,EAAJiB,EAAYA,IAC1B8F,EAAK9F,GAAKiL,EAAUjL,KAAOZ,EAAIC,UAAU6L,KAAcD,EAAUjL,EAEnE,MAAOkL,EAAW7L,UAAUN,QAAQ+G,EAAK5E,KAAK7B,UAAU6L,KACxD,OAAOV,GAAa/H,EAAMqI,EAAO1J,KAAMA,KAAM0E,GAE/C,OAAOgF,IAMT1L,EAAE+L,QAAU,SAASzM,GACnB,GAAIsB,GAA8B0D,EAA3B3E,EAASM,UAAUN,MAC1B,IAAc,GAAVA,EAAa,KAAM,IAAIqM,OAAM,wCACjC,KAAKpL,EAAI,EAAOjB,EAAJiB,EAAYA,IACtB0D,EAAMrE,UAAUW,GAChBtB,EAAIgF,GAAOtE,EAAE6C,KAAKvD,EAAIgF,GAAMhF,EAE9B,OAAOA,IAITU,EAAEiM,QAAU,SAAS5I,EAAM6I,GACzB,GAAID,GAAU,SAAS3H,GACrB,GAAI6H,GAAQF,EAAQE,MAChBC,EAAU,IAAMF,EAASA,EAAOvI,MAAM3B,KAAM/B,WAAaqE,EAE7D,OADKtE,GAAE4B,IAAIuK,EAAOC,KAAUD,EAAMC,GAAW/I,EAAKM,MAAM3B,KAAM/B,YACvDkM,EAAMC,GAGf,OADAH,GAAQE,SACDF,GAKTjM,EAAEqM,MAAQ,SAAShJ,EAAMiJ,GACvB,GAAI5F,GAAO1F,EAAMC,KAAKhB,UAAW,EACjC,OAAOsM,YAAW,WAChB,MAAOlJ,GAAKM,MAAM,KAAM+C,IACvB4F,IAKLtM,EAAEwM,MAAQxM,EAAE4L,QAAQ5L,EAAEqM,MAAOrM,EAAG,GAOhCA,EAAEyM,SAAW,SAASpJ,EAAMiJ,EAAMI,GAChC,GAAI7M,GAAS6G,EAAMlC,EACfmI,EAAU,KACVC,EAAW,CACVF,KAASA,KACd,IAAIG,GAAQ,WACVD,EAAWF,EAAQI,WAAY,EAAQ,EAAI9M,EAAE+M,MAC7CJ,EAAU,KACVnI,EAASnB,EAAKM,MAAM9D,EAAS6G,GACxBiG,IAAS9M,EAAU6G,EAAO,MAEjC,OAAO,YACL,GAAIqG,GAAM/M,EAAE+M,KACPH,IAAYF,EAAQI,WAAY,IAAOF,EAAWG,EACvD,IAAIC,GAAYV,GAAQS,EAAMH,EAc9B,OAbA/M,GAAUmC,KACV0E,EAAOzG,UACU,GAAb+M,GAAkBA,EAAYV,GAC5BK,IACFM,aAAaN,GACbA,EAAU,MAEZC,EAAWG,EACXvI,EAASnB,EAAKM,MAAM9D,EAAS6G,GACxBiG,IAAS9M,EAAU6G,EAAO,OACrBiG,GAAWD,EAAQQ,YAAa,IAC1CP,EAAUJ,WAAWM,EAAOG,IAEvBxI,IAQXxE,EAAEmN,SAAW,SAAS9J,EAAMiJ,EAAMc,GAChC,GAAIT,GAASjG,EAAM7G,EAASwN,EAAW7I,EAEnCqI,EAAQ,WACV,GAAI/D,GAAO9I,EAAE+M,MAAQM,CAEVf,GAAPxD,GAAeA,GAAQ,EACzB6D,EAAUJ,WAAWM,EAAOP,EAAOxD,IAEnC6D,EAAU,KACLS,IACH5I,EAASnB,EAAKM,MAAM9D,EAAS6G,GACxBiG,IAAS9M,EAAU6G,EAAO,QAKrC,OAAO,YACL7G,EAAUmC,KACV0E,EAAOzG,UACPoN,EAAYrN,EAAE+M,KACd,IAAIO,GAAUF,IAAcT,CAO5B,OANKA,KAASA,EAAUJ,WAAWM,EAAOP,IACtCgB,IACF9I,EAASnB,EAAKM,MAAM9D,EAAS6G,GAC7B7G,EAAU6G,EAAO,MAGZlC,IAOXxE,EAAEuN,KAAO,SAASlK,EAAMmK,GACtB,MAAOxN,GAAE4L,QAAQ4B,EAASnK,IAI5BrD,EAAE6F,OAAS,SAASzF,GAClB,MAAO,YACL,OAAQA,EAAUuD,MAAM3B,KAAM/B,aAMlCD,EAAEyN,QAAU,WACV,GAAI/G,GAAOzG,UACP+K,EAAQtE,EAAK/G,OAAS,CAC1B,OAAO,YAGL,IAFA,GAAIiB,GAAIoK,EACJxG,EAASkC,EAAKsE,GAAOrH,MAAM3B,KAAM/B,WAC9BW,KAAK4D,EAASkC,EAAK9F,GAAGK,KAAKe,KAAMwC,EACxC,OAAOA,KAKXxE,EAAE0N,MAAQ,SAASC,EAAOtK,GACxB,MAAO,YACL,QAAMsK,EAAQ,EACLtK,EAAKM,MAAM3B,KAAM/B,WAD1B,SAOJD,EAAE4N,OAAS,SAASD,EAAOtK,GACzB,GAAI7D,EACJ,OAAO,YAKL,QAJMmO,EAAQ,IACZnO,EAAO6D,EAAKM,MAAM3B,KAAM/B,YAEb,GAAT0N,IAAYtK,EAAO,MAChB7D,IAMXQ,EAAE6N,KAAO7N,EAAE4L,QAAQ5L,EAAE4N,OAAQ,EAM7B,IAAIE,KAAevL,SAAU,MAAMwL,qBAAqB,YACpD1M,GAAsB,UAAW,gBAAiB,WAClC,uBAAwB,iBAAkB,iBAqB9DrB,GAAEP,KAAO,SAASH,GAChB,IAAKU,EAAE6D,SAASvE,GAAM,QACtB,IAAIqD,EAAY,MAAOA,GAAWrD,EAClC,IAAIG,KACJ,KAAK,GAAI6E,KAAOhF,GAASU,EAAE4B,IAAItC,EAAKgF,IAAM7E,EAAKqC,KAAKwC,EAGpD,OADIwJ,IAAY3M,EAAoB7B,EAAKG,GAClCA,GAITO,EAAEgO,QAAU,SAAS1O,GACnB,IAAKU,EAAE6D,SAASvE,GAAM,QACtB,IAAIG,KACJ,KAAK,GAAI6E,KAAOhF,GAAKG,EAAKqC,KAAKwC,EAG/B,OADIwJ,IAAY3M,EAAoB7B,EAAKG,GAClCA,GAITO,EAAEsG,OAAS,SAAShH,GAIlB,IAAK,GAHDG,GAAOO,EAAEP,KAAKH,GACdK,EAASF,EAAKE,OACd2G,EAASnE,MAAMxC,GACViB,EAAI,EAAOjB,EAAJiB,EAAYA,IAC1B0F,EAAO1F,GAAKtB,EAAIG,EAAKmB,GAEvB,OAAO0F,IAKTtG,EAAEiO,UAAY,SAAS3O,EAAKC,EAAUM,GACpCN,EAAWc,EAAGd,EAAUM,EAKtB,KAAK,GADDD,GAHFH,EAAQO,EAAEP,KAAKH,GACbK,EAASF,EAAKE,OACdoF,KAEKrF,EAAQ,EAAWC,EAARD,EAAgBA,IAClCE,EAAaH,EAAKC,GAClBqF,EAAQnF,GAAcL,EAASD,EAAIM,GAAaA,EAAYN,EAE9D,OAAOyF,IAIX/E,EAAEkO,MAAQ,SAAS5O,GAIjB,IAAK,GAHDG,GAAOO,EAAEP,KAAKH,GACdK,EAASF,EAAKE,OACduO,EAAQ/L,MAAMxC,GACTiB,EAAI,EAAOjB,EAAJiB,EAAYA,IAC1BsN,EAAMtN,IAAMnB,EAAKmB,GAAItB,EAAIG,EAAKmB,IAEhC,OAAOsN,IAITlO,EAAEmO,OAAS,SAAS7O,GAGlB,IAAK,GAFDkF,MACA/E,EAAOO,EAAEP,KAAKH,GACTsB,EAAI,EAAGjB,EAASF,EAAKE,OAAYA,EAAJiB,EAAYA,IAChD4D,EAAOlF,EAAIG,EAAKmB,KAAOnB,EAAKmB,EAE9B,OAAO4D,IAKTxE,EAAEoO,UAAYpO,EAAEqO,QAAU,SAAS/O,GACjC,GAAIgP,KACJ,KAAK,GAAIhK,KAAOhF,GACVU,EAAEwB,WAAWlC,EAAIgF,KAAOgK,EAAMxM,KAAKwC,EAEzC,OAAOgK,GAAM3G,QAIf3H,EAAEuO,OAAStK,EAAejE,EAAEgO,SAI5BhO,EAAEwO,UAAYxO,EAAEyO,OAASxK,EAAejE,EAAEP,MAG1CO,EAAEwF,QAAU,SAASlG,EAAKc,EAAWP,GACnCO,EAAYC,EAAGD,EAAWP,EAE1B,KAAK,GADmByE,GAApB7E,EAAOO,EAAEP,KAAKH,GACTsB,EAAI,EAAGjB,EAASF,EAAKE,OAAYA,EAAJiB,EAAYA,IAEhD,GADA0D,EAAM7E,EAAKmB,GACPR,EAAUd,EAAIgF,GAAMA,EAAKhF,GAAM,MAAOgF,IAK9CtE,EAAE0O,KAAO,SAASlE,EAAQmE,EAAW9O,GACnC,GAA+BN,GAAUE,EAArC+E,KAAalF,EAAMkL,CACvB,IAAW,MAAPlL,EAAa,MAAOkF,EACpBxE,GAAEwB,WAAWmN,IACflP,EAAOO,EAAEgO,QAAQ1O,GACjBC,EAAWO,EAAW6O,EAAW9O,KAEjCJ,EAAO0J,EAAQlJ,WAAW,GAAO,EAAO,GACxCV,EAAW,SAASgE,EAAOe,EAAKhF,GAAO,MAAOgF,KAAOhF,IACrDA,EAAM8C,OAAO9C,GAEf,KAAK,GAAIsB,GAAI,EAAGjB,EAASF,EAAKE,OAAYA,EAAJiB,EAAYA,IAAK,CACrD,GAAI0D,GAAM7E,EAAKmB,GACX2C,EAAQjE,EAAIgF,EACZ/E,GAASgE,EAAOe,EAAKhF,KAAMkF,EAAOF,GAAOf,GAE/C,MAAOiB,IAITxE,EAAE4O,KAAO,SAAStP,EAAKC,EAAUM,GAC/B,GAAIG,EAAEwB,WAAWjC,GACfA,EAAWS,EAAE6F,OAAOtG,OACf,CACL,GAAIE,GAAOO,EAAE6E,IAAIsE,EAAQlJ,WAAW,GAAO,EAAO,GAAI4O,OACtDtP,GAAW,SAASgE,EAAOe,GACzB,OAAQtE,EAAE6B,SAASpC,EAAM6E,IAG7B,MAAOtE,GAAE0O,KAAKpP,EAAKC,EAAUM,IAI/BG,EAAE8O,SAAW7K,EAAejE,EAAEgO,SAAS,GAKvChO,EAAE+C,OAAS,SAAStB,EAAWsN,GAC7B,GAAIvK,GAASD,EAAW9C,EAExB,OADIsN,IAAO/O,EAAEwO,UAAUhK,EAAQuK,GACxBvK,GAITxE,EAAEgP,MAAQ,SAAS1P,GACjB,MAAKU,GAAE6D,SAASvE,GACTU,EAAE0C,QAAQpD,GAAOA,EAAI0B,QAAUhB,EAAEuO,UAAWjP,GADtBA,GAO/BU,EAAEiP,IAAM,SAAS3P,EAAK4P,GAEpB,MADAA,GAAY5P,GACLA,GAITU,EAAEmP,QAAU,SAAS3E,EAAQ1D,GAC3B,GAAIrH,GAAOO,EAAEP,KAAKqH,GAAQnH,EAASF,EAAKE,MACxC,IAAc,MAAV6K,EAAgB,OAAQ7K,CAE5B,KAAK,GADDL,GAAM8C,OAAOoI,GACR5J,EAAI,EAAOjB,EAAJiB,EAAYA,IAAK,CAC/B,GAAI0D,GAAM7E,EAAKmB,EACf,IAAIkG,EAAMxC,KAAShF,EAAIgF,MAAUA,IAAOhF,IAAM,OAAO,EAEvD,OAAO,EAKT,IAAI8P,GAAK,SAAStH,EAAGC,EAAGsH,EAAQC,GAG9B,GAAIxH,IAAMC,EAAG,MAAa,KAAND,GAAW,EAAIA,IAAM,EAAIC,CAE7C,IAAS,MAALD,GAAkB,MAALC,EAAW,MAAOD,KAAMC,CAErCD,aAAa9H,KAAG8H,EAAIA,EAAE7E,UACtB8E,YAAa/H,KAAG+H,EAAIA,EAAE9E,SAE1B,IAAIsM,GAAYhN,EAAStB,KAAK6G,EAC9B,IAAIyH,IAAchN,EAAStB,KAAK8G,GAAI,OAAO,CAC3C,QAAQwH,GAEN,IAAK,kBAEL,IAAK,kBAGH,MAAO,GAAKzH,GAAM,GAAKC,CACzB,KAAK,kBAGH,OAAKD,KAAOA,GAAWC,KAAOA,EAEhB,KAAND,EAAU,GAAKA,IAAM,EAAIC,GAAKD,KAAOC,CAC/C,KAAK,gBACL,IAAK,mBAIH,OAAQD,KAAOC,EAGnB,GAAIyH,GAA0B,mBAAdD,CAChB,KAAKC,EAAW,CACd,GAAgB,gBAAL1H,IAA6B,gBAALC,GAAe,OAAO,CAIzD,IAAI0H,GAAQ3H,EAAExG,YAAaoO,EAAQ3H,EAAEzG,WACrC,IAAImO,IAAUC,KAAW1P,EAAEwB,WAAWiO,IAAUA,YAAiBA,IACxCzP,EAAEwB,WAAWkO,IAAUA,YAAiBA,KACzC,eAAiB5H,IAAK,eAAiBC,GAC7D,OAAO,EAQXsH,EAASA,MACTC,EAASA,KAET,KADA,GAAI3P,GAAS0P,EAAO1P,OACbA,KAGL,GAAI0P,EAAO1P,KAAYmI,EAAG,MAAOwH,GAAO3P,KAAYoI,CAQtD,IAJAsH,EAAOvN,KAAKgG,GACZwH,EAAOxN,KAAKiG,GAGRyH,EAAW,CAGb,GADA7P,EAASmI,EAAEnI,OACPA,IAAWoI,EAAEpI,OAAQ,OAAO,CAEhC,MAAOA,KACL,IAAKyP,EAAGtH,EAAEnI,GAASoI,EAAEpI,GAAS0P,EAAQC,GAAS,OAAO,MAEnD,CAEL,GAAsBhL,GAAlB7E,EAAOO,EAAEP,KAAKqI,EAGlB,IAFAnI,EAASF,EAAKE,OAEVK,EAAEP,KAAKsI,GAAGpI,SAAWA,EAAQ,OAAO,CACxC,MAAOA,KAGL,GADA2E,EAAM7E,EAAKE,IACLK,EAAE4B,IAAImG,EAAGzD,KAAQ8K,EAAGtH,EAAExD,GAAMyD,EAAEzD,GAAM+K,EAAQC,GAAU,OAAO,EAMvE,MAFAD,GAAOM,MACPL,EAAOK,OACA,EAIT3P,GAAE4P,QAAU,SAAS9H,EAAGC,GACtB,MAAOqH,GAAGtH,EAAGC,IAKf/H,EAAE6P,QAAU,SAASvQ,GACnB,MAAW,OAAPA,GAAoB,EACpBS,EAAYT,KAASU,EAAE0C,QAAQpD,IAAQU,EAAE8P,SAASxQ,IAAQU,EAAEyJ,YAAYnK,IAA6B,IAAfA,EAAIK,OAChE,IAAvBK,EAAEP,KAAKH,GAAKK,QAIrBK,EAAE+P,UAAY,SAASzQ,GACrB,SAAUA,GAAwB,IAAjBA,EAAI0Q,WAKvBhQ,EAAE0C,QAAUD,GAAiB,SAASnD,GACpC,MAA8B,mBAAvBiD,EAAStB,KAAK3B,IAIvBU,EAAE6D,SAAW,SAASvE,GACpB,GAAI2Q,SAAc3Q,EAClB,OAAgB,aAAT2Q,GAAgC,WAATA,KAAuB3Q,GAIvDU,EAAE2E,MAAM,YAAa,WAAY,SAAU,SAAU,OAAQ,SAAU,SAAU,SAASuL,GACxFlQ,EAAE,KAAOkQ,GAAQ,SAAS5Q,GACxB,MAAOiD,GAAStB,KAAK3B,KAAS,WAAa4Q,EAAO,OAMjDlQ,EAAEyJ,YAAYxJ,aACjBD,EAAEyJ,YAAc,SAASnK,GACvB,MAAOU,GAAE4B,IAAItC,EAAK,YAMJ,kBAAP,KAAyC,gBAAb6Q,aACrCnQ,EAAEwB,WAAa,SAASlC,GACtB,MAAqB,kBAAPA,KAAqB,IAKvCU,EAAEoQ,SAAW,SAAS9Q,GACpB,MAAO8Q,UAAS9Q,KAAS4B,MAAMmP,WAAW/Q,KAI5CU,EAAEkB,MAAQ,SAAS5B,GACjB,MAAOU,GAAEsQ,SAAShR,IAAQA,KAASA,GAIrCU,EAAEiK,UAAY,SAAS3K,GACrB,MAAOA,MAAQ,GAAQA,KAAQ,GAAgC,qBAAvBiD,EAAStB,KAAK3B,IAIxDU,EAAEuQ,OAAS,SAASjR,GAClB,MAAe,QAARA,GAITU,EAAEwQ,YAAc,SAASlR,GACvB,MAAOA,SAAa,IAKtBU,EAAE4B,IAAM,SAAStC,EAAKgF,GACpB,MAAc,OAAPhF,GAAekD,EAAevB,KAAK3B,EAAKgF,IAQjDtE,EAAEyQ,WAAa,WAEb,MADA1O,GAAK/B,EAAIiC,EACFD,MAIThC,EAAE4D,SAAW,SAASL,GACpB,MAAOA,IAITvD,EAAE0Q,SAAW,SAASnN,GACpB,MAAO,YACL,MAAOA,KAIXvD,EAAE2Q,KAAO,aAET3Q,EAAE+D,SAAWA,EAGb/D,EAAE4Q,WAAa,SAAStR,GACtB,MAAc,OAAPA,EAAc,aAAe,SAASgF,GAC3C,MAAOhF,GAAIgF,KAMftE,EAAE8D,QAAU9D,EAAE6Q,QAAU,SAAS/J,GAE/B,MADAA,GAAQ9G,EAAEwO,aAAc1H,GACjB,SAASxH,GACd,MAAOU,GAAEmP,QAAQ7P,EAAKwH,KAK1B9G,EAAE2N,MAAQ,SAASnG,EAAGjI,EAAUM,GAC9B,GAAIiR,GAAQ3O,MAAMtB,KAAKC,IAAI,EAAG0G,GAC9BjI,GAAWO,EAAWP,EAAUM,EAAS,EACzC,KAAK,GAAIe,GAAI,EAAO4G,EAAJ5G,EAAOA,IAAKkQ,EAAMlQ,GAAKrB,EAASqB,EAChD,OAAOkQ,IAIT9Q,EAAEsH,OAAS,SAASvG,EAAKD,GAKvB,MAJW,OAAPA,IACFA,EAAMC,EACNA,EAAM,GAEDA,EAAMF,KAAKgK,MAAMhK,KAAKyG,UAAYxG,EAAMC,EAAM,KAIvDf,EAAE+M,IAAMgE,KAAKhE,KAAO,WAClB,OAAO,GAAIgE,OAAOC,UAIpB,IAAIC,IACFC,IAAK,QACLC,IAAK,OACLC,IAAK,OACLC,IAAK,SACLC,IAAK,SACLC,IAAK,UAEHC,EAAcxR,EAAEmO,OAAO8C,GAGvBQ,EAAgB,SAAS5M,GAC3B,GAAI6M,GAAU,SAASC,GACrB,MAAO9M,GAAI8M,IAGTvN,EAAS,MAAQpE,EAAEP,KAAKoF,GAAK+M,KAAK,KAAO,IACzCC,EAAaC,OAAO1N,GACpB2N,EAAgBD,OAAO1N,EAAQ,IACnC,OAAO,UAAS4N,GAEd,MADAA,GAAmB,MAAVA,EAAiB,GAAK,GAAKA,EAC7BH,EAAWI,KAAKD,GAAUA,EAAOE,QAAQH,EAAeL,GAAWM,GAG9EhS,GAAEmS,OAASV,EAAcR,GACzBjR,EAAEoS,SAAWX,EAAcD,GAI3BxR,EAAEwE,OAAS,SAASgG,EAAQzG,EAAUsO,GACpC,GAAI9O,GAAkB,MAAViH,MAAsB,GAAIA,EAAOzG,EAI7C,OAHIR,SAAe,KACjBA,EAAQ8O,GAEHrS,EAAEwB,WAAW+B,GAASA,EAAMtC,KAAKuJ,GAAUjH,EAKpD,IAAI+O,GAAY,CAChBtS,GAAEuS,SAAW,SAASC,GACpB,GAAIC,KAAOH,EAAY,EACvB,OAAOE,GAASA,EAASC,EAAKA,GAKhCzS,EAAE0S,kBACAC,SAAc,kBACdC,YAAc,mBACdT,OAAc,mBAMhB,IAAIU,GAAU,OAIVC,GACFxB,IAAU,IACVyB,KAAU,KACVC,KAAU,IACVC,KAAU,IACVC,SAAU,QACVC,SAAU,SAGRzB,EAAU,4BAEV0B,EAAa,SAASzB,GACxB,MAAO,KAAOmB,EAAQnB,GAOxB3R,GAAEqT,SAAW,SAASC,EAAMC,EAAUC,IAC/BD,GAAYC,IAAaD,EAAWC,GACzCD,EAAWvT,EAAE8O,YAAayE,EAAUvT,EAAE0S,iBAGtC,IAAI5O,GAAUgO,SACXyB,EAASpB,QAAUU,GAASzO,QAC5BmP,EAASX,aAAeC,GAASzO,QACjCmP,EAASZ,UAAYE,GAASzO,QAC/BwN,KAAK,KAAO,KAAM,KAGhBlS,EAAQ,EACR0E,EAAS,QACbkP,GAAKpB,QAAQpO,EAAS,SAAS6N,EAAOQ,EAAQS,EAAaD,EAAUc,GAanE,MAZArP,IAAUkP,EAAKtS,MAAMtB,EAAO+T,GAAQvB,QAAQR,EAAS0B,GACrD1T,EAAQ+T,EAAS9B,EAAMhS,OAEnBwS,EACF/N,GAAU,cAAgB+N,EAAS,iCAC1BS,EACTxO,GAAU,cAAgBwO,EAAc,uBAC/BD,IACTvO,GAAU,OAASuO,EAAW,YAIzBhB,IAETvN,GAAU,OAGLmP,EAASG,WAAUtP,EAAS,mBAAqBA,EAAS,OAE/DA,EAAS,2CACP,oDACAA,EAAS,eAEX,KACE,GAAIuP,GAAS,GAAIrR,UAASiR,EAASG,UAAY,MAAO,IAAKtP,GAC3D,MAAOwP,GAEP,KADAA,GAAExP,OAASA,EACLwP,EAGR,GAAIP,GAAW,SAASQ,GACtB,MAAOF,GAAO1S,KAAKe,KAAM6R,EAAM7T,IAI7B8T,EAAWP,EAASG,UAAY,KAGpC,OAFAL,GAASjP,OAAS,YAAc0P,EAAW,OAAS1P,EAAS,IAEtDiP,GAITrT,EAAE+T,MAAQ,SAASzU,GACjB,GAAI0U,GAAWhU,EAAEV,EAEjB,OADA0U,GAASC,QAAS,EACXD,EAUT,IAAIxP,GAAS,SAASwP,EAAU1U,GAC9B,MAAO0U,GAASC,OAASjU,EAAEV,GAAKyU,QAAUzU,EAI5CU,GAAEkU,MAAQ,SAAS5U,GACjBU,EAAE2E,KAAK3E,EAAEoO,UAAU9O,GAAM,SAAS4Q,GAChC,GAAI7M,GAAOrD,EAAEkQ,GAAQ5Q,EAAI4Q,EACzBlQ,GAAEyB,UAAUyO,GAAQ,WAClB,GAAIxJ,IAAQ1E,KAAKiB,SAEjB,OADAnB,GAAK6B,MAAM+C,EAAMzG,WACVuE,EAAOxC,KAAMqB,EAAKM,MAAM3D,EAAG0G,QAMxC1G,EAAEkU,MAAMlU,GAGRA,EAAE2E,MAAM,MAAO,OAAQ,UAAW,QAAS,OAAQ,SAAU,WAAY,SAASuL,GAChF,GAAIzJ,GAASvE,EAAWgO,EACxBlQ,GAAEyB,UAAUyO,GAAQ,WAClB,GAAI5Q,GAAM0C,KAAKiB,QAGf,OAFAwD,GAAO9C,MAAMrE,EAAKW,WACJ,UAATiQ,GAA6B,WAATA,GAAqC,IAAf5Q,EAAIK,cAAqBL,GAAI,GACrEkF,EAAOxC,KAAM1C,MAKxBU,EAAE2E,MAAM,SAAU,OAAQ,SAAU,SAASuL,GAC3C,GAAIzJ,GAASvE,EAAWgO,EACxBlQ,GAAEyB,UAAUyO,GAAQ,WAClB,MAAO1L,GAAOxC,KAAMyE,EAAO9C,MAAM3B,KAAKiB,SAAUhD,eAKpDD,EAAEyB,UAAU8B,MAAQ,WAClB,MAAOvB,MAAKiB,UAKdjD,EAAEyB,UAAU0S,QAAUnU,EAAEyB,UAAU2S,OAASpU,EAAEyB,UAAU8B,MAEvDvD,EAAEyB,UAAUc,SAAW,WACrB,MAAO,GAAKP,KAAKiB,UAUG,kBAAXoR,SAAyBA,OAAOC,KACzCD,OAAO,gBAAkB,WACvB,MAAOrU,OAGXiB,KAAKe"}prewikka-5.1.1/prewikka/locale/0000775000175000017500000000000013555143705020023 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/locale/de/0000775000175000017500000000000013555143705020413 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/locale/de/LC_MESSAGES/0000775000175000017500000000000013555143705022200 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/locale/de/LC_MESSAGES/prewikka.po0000664000175000017500000016726013555143652024372 0ustar tandrejatandreja00000000000000# German Translation for Prewikka # Copyright (C) 2007-2019 CS-SI # This file is distributed under the same license as the prewikka package. # Bjoern Weiland , 2007. # msgid "" msgstr "" "Project-Id-Version: Prewikka 5.1.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-09-04 19:03+0200\n" "PO-Revision-Date: 2018-02-09 12:07+0100\n" "Last-Translator: Bjoern Weiland \n" "Language-Team: German\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 0.9.6\n" #: prewikka/baseview.py:79 prewikka/usergroup.py:52 msgid "Permission Denied" msgstr "Zugriff verweigert" #: prewikka/baseview.py:79 msgid "Missing permission to access the specified file" msgstr "" #: prewikka/config.py:37 prewikka/dataprovider/__init__.py:645 msgid "Configuration error" msgstr "Konfigurationsfehler" #: prewikka/config.py:43 #, python-format msgid "Parse error in \"%(txt)s\" at %(file)s line %(line)d" msgstr "" #: prewikka/config.py:48 prewikka/view.py:82 #, python-format msgid "Invalid value '%(value)s' for parameter '%(name)s'" msgstr "" #: prewikka/config.py:54 #, python-format msgid "Missing value for parameter '%(name)s'" msgstr "" #: prewikka/crontab.py:37 msgid "Hourly" msgstr "Stündlich" #: prewikka/crontab.py:38 msgid "Daily" msgstr "Täglich" #: prewikka/crontab.py:39 msgid "Weekly" msgstr "Wöchentlich" #: prewikka/crontab.py:40 msgid "Monthly" msgstr "Monatlich" #: prewikka/crontab.py:41 msgid "Yearly" msgstr "Jährlich" #: prewikka/crontab.py:42 prewikka/mainmenu.py:302 #: prewikka/templates/mainmenu.mak:92 msgid "Custom" msgstr "Maßgeschneidert" #: prewikka/crontab.py:43 prewikka/views/crontab/__init__.py:84 msgid "Disabled" msgstr "Deaktiviert" #: prewikka/crontab.py:105 msgid "Scheduled job execution failed" msgstr "" #: prewikka/crontab.py:139 #, fuzzy msgid "Invalid job extension" msgstr "Session ungültig" #: prewikka/crontab.py:139 #, python-format msgid "Scheduled job with invalid extension type '%s'" msgstr "" #: prewikka/crontab.py:206 #, fuzzy msgid "Invalid CronJob" msgstr "Session ungültig" #: prewikka/crontab.py:206 #, python-format msgid "CronJob with id=%d cannot be found in database" msgstr "" #: prewikka/crontab.py:260 msgid "Invalid schedule" msgstr "Ungültiger Zeitplan" #: prewikka/crontab.py:260 msgid "The specified job schedule is invalid" msgstr "" #: prewikka/crontab.py:286 #, python-format msgid "Custom (%s)" msgstr "Maßgeschneidert (%s)" #: prewikka/database.py:43 msgid "Database error" msgstr "Datenbanksfehler" #: prewikka/database.py:50 msgid "Database schema error" msgstr "Datenbankschema Fehler" #: prewikka/database.py:293 msgid "database installation required" msgstr "" #: prewikka/database.py:296 msgid "database activation required" msgstr "" #: prewikka/database.py:299 #, python-format msgid "database schema branch %(required)s required (found %(current)s)" msgstr "" #: prewikka/database.py:305 #, python-format msgid "database schema version %(required)s required (found %(current)s)" msgstr "" #: prewikka/database.py:372 msgid "Database installation error" msgstr "" #: prewikka/database.py:374 #, python-format msgid "" "No database installation script found for module %(module)s, version " "%(version)s" msgstr "" #: prewikka/database.py:382 prewikka/database.py:420 msgid "Database migration error" msgstr "" #: prewikka/database.py:386 #, python-format msgid "" "No database branch migration script found for module %(module)s, branch " "transition %(current)s -> %(required)s" msgstr "" #: prewikka/database.py:424 #, python-format msgid "" "No linear migration script found for module %(module)s %(version1)s -> " "%(version2)s" msgstr "" #: prewikka/database.py:841 #, fuzzy msgid "Database configuration error" msgstr "Konfigurationsfehler" #: prewikka/database.py:841 msgid "Only MySQL and PostgreSQL databases are supported at the moment" msgstr "" #: prewikka/error.py:48 prewikka/templates/error.mak:139 msgid "An unexpected condition happened" msgstr "" #: prewikka/error.py:148 msgid "Not implemented" msgstr "" #: prewikka/error.py:150 msgid "Backend does not implement this operation" msgstr "" #: prewikka/history.py:32 msgid "Search history deletion" msgstr "" #: prewikka/localization.py:143 msgid "%m/%Y" msgstr "%m.%Y" #: prewikka/localization.py:144 #, python-format msgid "%m/%d/%Y" msgstr "%d.%m.%Y" #: prewikka/localization.py:145 #, python-format msgid "%m/%d/%Y %Hh" msgstr "%d.%m.%Y %H:00" #: prewikka/localization.py:146 #, python-format msgid "%m/%d/%Y %H:%M" msgstr "%d.%m.%Y %H:%M" #: prewikka/localization.py:147 #, python-format msgid "%m/%d/%Y %H:%M:%S" msgstr "%d.%m.%Y %H:%M:%S" #: prewikka/localization.py:149 msgid "%H:%M" msgstr "%H:%M" #: prewikka/localization.py:150 msgid "%H:%M:%S" msgstr "%H:%M:%S" #: prewikka/localization.py:235 prewikka/localization.py:253 #: prewikka/renderer/__init__.py:62 prewikka/views/crontab/__init__.py:95 msgid "n/a" msgstr "" #: prewikka/localization.py:246 #, python-format msgid "%(days)dd %(hours)dh %(minutes)d'" msgstr "%(days)dT %(hours)dS %(minutes)d'" #: prewikka/main.py:45 msgid "Version Requirement error" msgstr "" #: prewikka/main.py:48 #, python-format msgid "Prewikka %(vPre)s requires libprelude %(vLib)s or higher" msgstr "Prewikka %(vPre)s benötigt libprelude %(vLib)s oder höher" #: prewikka/main.py:53 #, python-format msgid "Prewikka %(vPre)s requires libpreludedb %(vLib)s or higher" msgstr "Prewikka %(vPre)s benötigt libpreludedb %(vLib)s oder höher" #: prewikka/main.py:136 prewikka/main.py:149 #: prewikka/dataprovider/plugins/idmef/__init__.py:57 msgid "Initialization error" msgstr "" #: prewikka/main.py:150 #, python-format msgid "" "Cannot use %(type)s mode '%(name)s', please contact your local " "administrator." msgstr "" #: prewikka/main.py:192 #, python-format msgid "Session '%s' does not accept any authentication module" msgstr "" #: prewikka/main.py:298 #, python-format msgid "An unexpected condition happened while trying to load %s" msgstr "" #: prewikka/mainmenu.py:114 #, python-format msgid "%S.%.6f" msgstr "" #: prewikka/mainmenu.py:115 #, python-format msgid "%S.%.3f" msgstr "" #: prewikka/mainmenu.py:260 msgid "Today" msgstr "Heute" #: prewikka/mainmenu.py:261 msgid "Yesterday" msgstr "Gestern" #: prewikka/mainmenu.py:262 msgid "This week" msgstr "Diese Woche" #: prewikka/mainmenu.py:263 msgid "Last week" msgstr "Letzte Woche" #: prewikka/mainmenu.py:264 msgid "This month" msgstr "Diesen Monat" #: prewikka/mainmenu.py:265 msgid "Last month" msgstr "Letzten Monat" #: prewikka/mainmenu.py:266 prewikka/mainmenu.py:267 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d Stunde" msgstr[1] "%d Stunden" #: prewikka/mainmenu.py:268 prewikka/mainmenu.py:269 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d Tag" msgstr[1] "%d Tage" #: prewikka/mainmenu.py:270 #, python-format msgid "%d week" msgid_plural "%d weeks" msgstr[0] "%d Woche" msgstr[1] "%d Wochen" #: prewikka/mainmenu.py:271 prewikka/mainmenu.py:272 #, python-format msgid "%d month" msgid_plural "%d months" msgstr[0] "%d Monat" msgstr[1] "%d Monate" #: prewikka/mainmenu.py:273 #, python-format msgid "%d year" msgid_plural "%d years" msgstr[0] "%d Jahr" msgstr[1] "%d Jahre" #: prewikka/mainmenu.py:277 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d Sekunde" msgstr[1] "%d Sekunden" #: prewikka/mainmenu.py:278 prewikka/mainmenu.py:279 prewikka/mainmenu.py:280 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d Minute" msgstr[1] "%d Minuten" #: prewikka/mainmenu.py:299 prewikka/templates/mainmenu.mak:61 msgid "Inactive" msgstr "Inaktiv" #: prewikka/mainmenu.py:305 prewikka/templates/mainmenu.mak:89 msgid "None" msgstr "Kein" #: prewikka/menu.py:70 prewikka/menu.py:73 prewikka/menu.py:79 #: prewikka/menu.py:83 prewikka/menu.py:91 msgid "Menu error" msgstr "Menü Fehler" #: prewikka/menu.py:70 msgid "The provided YAML menu is invalid" msgstr "" #: prewikka/menu.py:73 msgid "Empty menu" msgstr "" #: prewikka/menu.py:79 #, python-format msgid "Menu without a name in %s" msgstr "" #: prewikka/menu.py:83 msgid "Multiple default menus" msgstr "" #: prewikka/menu.py:91 msgid "Multiple default views" msgstr "" #: prewikka/pluginmanager.py:163 #, python-format msgid "Circular dependencies detected: %s" msgstr "" #: prewikka/pluginmanager.py:171 #, python-format msgid "Missing dependency: %s" msgstr "" #: prewikka/resolve.py:170 #, python-format msgid "" "Asynchronous DNS resolution disabled: twisted.names and twisted.internet " "required: %s" msgstr "" #: prewikka/usergroup.py:44 #, python-format msgid "Access to view '%(view)s' forbidden. Required permissions: %(permissions)s" msgstr "" "Zugang zur Aussicht '%(view)s' verboten. Erforderliche Berechtigungen: " "%(permissions)s" #: prewikka/usergroup.py:47 #, python-format msgid "Access to view '%s' forbidden" msgstr "" #: prewikka/usergroup.py:50 #, python-format msgid "Required permissions: %s" msgstr "Erforderliche Berechtigungen: %s" #: prewikka/view.py:74 prewikka/view.py:81 prewikka/view.py:88 msgid "Parameters Normalization failed" msgstr "Parameter-Normalisierung fehlgeschlagen" #: prewikka/view.py:75 #, python-format msgid "Parameter '%s' is not valid" msgstr "Parameter '%s' is nicht gültig" #: prewikka/view.py:89 #, python-format msgid "Required parameter '%s' is missing" msgstr "" #: prewikka/view.py:95 msgid "Invalid method" msgstr "Ungültige Methode" #: prewikka/view.py:102 msgid "Invalid view" msgstr "Ungültige Aussicht" #: prewikka/view.py:528 #, python-format msgid "Method '%(method)s' is not allowed for view '%(view)s'" msgstr "" #: prewikka/view.py:532 prewikka/view.py:651 #, python-format msgid "View '%s' does not exist" msgstr "Die Aussicht '%s' existiert nicht" #: prewikka/auth/auth.py:30 msgid "Authentication failed" msgstr "Authentifizierung fehlgeschlagen" #: prewikka/dataprovider/__init__.py:35 msgid "Equal" msgstr "Gleich" #: prewikka/dataprovider/__init__.py:36 msgid "Equal (case-insensitive)" msgstr "Gleich (Groß-/Kleinschreibung egal)" #: prewikka/dataprovider/__init__.py:37 msgid "Not equal" msgstr "Nicht gleich" #: prewikka/dataprovider/__init__.py:38 msgid "Not equal (case-insensitive)" msgstr "Nicht gleich (Groß-/Kleinschreibung egal)" #: prewikka/dataprovider/__init__.py:39 msgid "Regular expression" msgstr "Regulärer Ausdruck" #: prewikka/dataprovider/__init__.py:40 msgid "Regular expression (case-insensitive)" msgstr "Regulärer Ausdruck (Groß-/Kleinschreibung egal)" #: prewikka/dataprovider/__init__.py:41 msgid "Not regular expression" msgstr "Nicht regulärer Ausdruck" #: prewikka/dataprovider/__init__.py:42 msgid "Not regular expression (case-insensitive)" msgstr "Nicht regulärer Ausdruck (Groß-/Kleinschreibung egal)" #: prewikka/dataprovider/__init__.py:43 msgid "Lesser than" msgstr "Weniger als" #: prewikka/dataprovider/__init__.py:44 msgid "Lesser or equal" msgstr "Kleiner oder gleich" #: prewikka/dataprovider/__init__.py:45 msgid "Greater than" msgstr "Größer als" #: prewikka/dataprovider/__init__.py:46 msgid "Greater or equal" msgstr "Größer oder gleich" #: prewikka/dataprovider/__init__.py:47 msgid "Substring" msgstr "Teilstring" #: prewikka/dataprovider/__init__.py:48 msgid "Substring (case-insensitive)" msgstr "Teilstring (Groß-/Kleinschreibung egal)" #: prewikka/dataprovider/__init__.py:49 msgid "Not substring" msgstr "Nicht Teilstring" #: prewikka/dataprovider/__init__.py:50 msgid "Not substring (case-insensitive)" msgstr "Nicht Teilstring (Groß-/Kleinschreibung egal)" #: prewikka/dataprovider/__init__.py:92 prewikka/dataprovider/__init__.py:158 msgid "Conversion error" msgstr "Umwandlungsfehler" #: prewikka/dataprovider/__init__.py:93 prewikka/dataprovider/__init__.py:159 #, python-format msgid "Value %(value)r cannot be converted to %(type)s" msgstr "" #: prewikka/dataprovider/__init__.py:109 msgid "Backend error" msgstr "Backendfehler" #: prewikka/dataprovider/__init__.py:109 #, python-format msgid "No backend available for '%s' datatype" msgstr "" #: prewikka/dataprovider/__init__.py:116 prewikka/dataprovider/__init__.py:123 msgid "Syntax error" msgstr "Syntaxfehler" #: prewikka/dataprovider/__init__.py:116 #, python-format msgid "Unknown path: %s" msgstr "Unbekannter Pfad: %s" #: prewikka/dataprovider/__init__.py:123 scripts/prewikka-cli:109 #: scripts/prewikka-cli:118 scripts/prewikka-cli:129 #, fuzzy msgid "Could not parse input" msgstr "Wählen Sie einen Filter" #: prewikka/dataprovider/__init__.py:635 #, python-format msgid "No handler configured for '%s' datatype" msgstr "" #: prewikka/dataprovider/__init__.py:646 #, python-format msgid "Only one manager should be configured for '%s' backend" msgstr "" #: prewikka/dataprovider/idmef.py:128 msgid "High" msgstr "Hoch" #: prewikka/dataprovider/idmef.py:129 msgid "Medium" msgstr "Mittel" #: prewikka/dataprovider/idmef.py:130 msgid "Low" msgstr "Niedrig" #: prewikka/dataprovider/idmef.py:131 msgid "Informational" msgstr "Informationell" #: prewikka/dataprovider/idmef.py:141 msgid "Provides an API to fetch IDMEF alerts" msgstr "" #: prewikka/dataprovider/idmef.py:142 #: prewikka/views/agents/templates/agents.mak:83 #: prewikka/views/datasearch/alert.py:75 prewikka/views/datasearch/alert.py:76 msgid "Alerts" msgstr "Alarme" #: prewikka/dataprovider/idmef.py:149 prewikka/views/datasearch/alert.py:88 #: prewikka/views/datasearch/threat.py:75 msgid "Classification" msgstr "Klassifikation" #: prewikka/dataprovider/idmef.py:150 msgid "Source IP" msgstr "Quell-IP" #: prewikka/dataprovider/idmef.py:151 #: prewikka/views/messagesummary/messagesummary.py:548 #: prewikka/views/messagesummary/messagesummary.py:569 msgid "Source port" msgstr "Quellport" #: prewikka/dataprovider/idmef.py:152 msgid "Target IP" msgstr "Ziel-IP" #: prewikka/dataprovider/idmef.py:153 #: prewikka/views/messagesummary/messagesummary.py:549 #: prewikka/views/messagesummary/messagesummary.py:570 msgid "Target port" msgstr "Zielport" #: prewikka/dataprovider/idmef.py:154 msgid "Analyzer name" msgstr "Analysator Name" #: prewikka/dataprovider/idmef.py:157 #, fuzzy msgid "Alert deletion" msgstr "Alarm-Liste" #: prewikka/dataprovider/idmef.py:182 msgid "Provides an API to fetch IDMEF heartbeats" msgstr "" #: prewikka/dataprovider/idmef.py:183 #: prewikka/views/agents/templates/agents.mak:87 #: prewikka/views/datasearch/heartbeat.py:56 msgid "Heartbeats" msgstr "Heartbeats" #: prewikka/dataprovider/idmef.py:188 #, fuzzy msgid "Heartbeat deletion" msgstr "Heartbeat-Liste" #: prewikka/dataprovider/parsers/lucene/__init__.py:52 #, fuzzy msgid "Lucene emulation error" msgstr "Konfigurationsfehler" #: prewikka/dataprovider/parsers/lucene/__init__.py:53 msgid "" "This Lucene expression cannot be emulated properly using the Criterion " "backend" msgstr "" #: prewikka/dataprovider/plugins/idmef/__init__.py:97 msgid "Plugin for fetching IDMEF alerts from the Prelude database" msgstr "" #: prewikka/dataprovider/plugins/idmef/__init__.py:111 msgid "Plugin for fetching IDMEF heartbeats from the Prelude database" msgstr "" #: prewikka/plugins/warning/__init__.py:33 msgid "Prelude Warning message" msgstr "" #: prewikka/plugins/warning/templates/warning.mak:14 msgid "WARNING" msgstr "" #: prewikka/plugins/warning/templates/warning.mak:17 msgid "Prelude OSS is the open-source version of the Prelude SIEM" msgstr "" #: prewikka/plugins/warning/templates/warning.mak:21 #, python-format msgid "" "This OSS version has lower " "performance and less features than the Pro/Enterprise versions." msgstr "" #: prewikka/plugins/warning/templates/warning.mak:22 msgid "" "It is intended for tests and small environments, and should not be used " "in critical environments." msgstr "" #: prewikka/plugins/warning/templates/warning.mak:26 #, python-format msgid "Prelude OSS is distributed under the %s." msgstr "" #: prewikka/plugins/warning/templates/warning.mak:27 msgid "" "Products derivated from Prelude OSS modules are therefore subject to the " "terms of the GPLv2." msgstr "" #: prewikka/plugins/warning/templates/warning.mak:30 #: prewikka/templates/error.mak:171 prewikka/templates/toplayout.mak:62 #: prewikka/templates/toplayout.mak:77 prewikka/templates/toplayout.mak:94 #: prewikka/views/aboutplugin/templates/aboutplugin.mak:44 msgid "OK" msgstr "OK" #: prewikka/renderer/__init__.py:44 msgid "No data to display." msgstr "" #: prewikka/renderer/__init__.py:143 prewikka/renderer/__init__.py:147 #: prewikka/renderer/__init__.py:151 msgid "Renderer error" msgstr "Rendererfehler" #: prewikka/renderer/__init__.py:144 #, python-format msgid "No backend supporting render type '%s'" msgstr "" #: prewikka/renderer/__init__.py:148 #, python-format msgid "No backend named '%s'" msgstr "" #: prewikka/renderer/__init__.py:152 #, python-format msgid "Backend '%(backend)s' does not support render type '%(type)s'" msgstr "" #: prewikka/renderer/chartjs/__init__.py:104 msgid "ChartJS renderer backend" msgstr "" #: prewikka/renderer/chartjs/bar/__init__.py:38 msgid "ChartJS Bar renderer type" msgstr "" #: prewikka/renderer/chartjs/timeline/__init__.py:85 msgid "ChartJS Timebar renderer type" msgstr "" #: prewikka/session/session.py:39 msgid "Invalid session" msgstr "Session ungültig" #: prewikka/session/session.py:40 msgid "The session cookie carried by your browser is invalid" msgstr "" #: prewikka/session/session.py:44 msgid "Session expired" msgstr "Session abgelaufen" #: prewikka/session/session.py:45 msgid "Your session has expired: please sign in again to continue using Prelude" msgstr "" #: prewikka/session/session.py:181 msgid "Logged out" msgstr "Ausgeloggt" #: prewikka/session/anonymous/anonymous.py:31 #, fuzzy msgid "Anonymous authentication" msgstr "Authentifizierung" #: prewikka/templates/baseview.mak:148 msgid "View options" msgstr "Aussichtsoptionen" #: prewikka/templates/baseview.mak:151 msgid "View help" msgstr "Aussichtshilfe" #: prewikka/templates/baseview.mak:205 msgid "This app has been disabled or failed to load." msgstr "Diese App war deaktiviert oder konnte nicht geladen werden." #: prewikka/templates/baseview.mak:211 prewikka/templates/baseview.mak:222 msgid "name" msgstr "Name" #: prewikka/templates/baseview.mak:287 msgid "About" msgstr "Über" #: prewikka/templates/baseview.mak:290 msgid "Are you sure you want to log out?" msgstr "Sind Sie sicher, sich ausloggen zu wollen?" #: prewikka/templates/baseview.mak:290 msgid "Logout" msgstr "Ausloggen" #: prewikka/templates/error.mak:66 msgid "Detail" msgstr "Detail" #: prewikka/templates/error.mak:67 msgid "Copy to clipboard" msgstr "In die Zwischenablage kopieren" #: prewikka/templates/error.mak:137 prewikka/templates/error.mak:145 msgid "Error: {0}" msgstr "" #: prewikka/templates/error.mak:155 msgid "This may be due to one or more of the following reasons:" msgstr "" #: prewikka/templates/error.mak:157 msgid "You don't have the required permissions." msgstr "" #: prewikka/templates/error.mak:158 #, python-format msgid "Required apps are disabled. See the %s page for more details." msgstr "" #: prewikka/templates/error.mak:176 prewikka/templates/toplayout.mak:61 #: prewikka/views/crontab/templates/cronjob.mak:122 #: prewikka/views/filter/templates/filteredition.mak:122 msgid "Cancel" msgstr "Abbrechen" #: prewikka/templates/error.mak:177 msgid "Sign in" msgstr "Anmelden" #: prewikka/templates/error.mak:181 msgid "Back" msgstr "Zurück" #: prewikka/templates/error.mak:184 msgid "Retry" msgstr "Wiederholen" #: prewikka/templates/error.mak:186 msgid "Redirect to main page" msgstr "Zur Hauptseite umleiten" #: prewikka/templates/mainmenu.mak:44 msgid "Refresh:" msgstr "Erfrischen:" #: prewikka/templates/mainmenu.mak:49 msgid "Update frequency of the current page" msgstr "Aktualisierungsfrequenz der aktuellen Seite" #: prewikka/templates/mainmenu.mak:76 msgid "Period:" msgstr "Periode:" #: prewikka/templates/mainmenu.mak:81 msgid "Period to visualize" msgstr "Visualisierungsperiode" #: prewikka/templates/mainmenu.mak:111 msgid "Start:" msgstr "Anfang:" #: prewikka/templates/mainmenu.mak:117 msgid "start" msgstr "Anfang" #: prewikka/templates/mainmenu.mak:117 msgid "Start date" msgstr "Anfangsdatum" #: prewikka/templates/mainmenu.mak:123 msgid "End:" msgstr "Ende:" #: prewikka/templates/mainmenu.mak:130 msgid "end" msgstr "Ende" #: prewikka/templates/mainmenu.mak:130 msgid "End date" msgstr "Endesdatum" #: prewikka/templates/toplayout.mak:57 msgid "Please Confirm" msgstr "Bitte bestätigen" #: prewikka/templates/toplayout.mak:73 #, fuzzy msgid "Prelude Dialog" msgstr "Prelude interner Fehler" #: prewikka/templates/toplayout.mak:88 msgid "Connection error" msgstr "Verbindungsfehler" #: prewikka/templates/toplayout.mak:91 msgid "" "Connection failed, the server may be down or you may be experiencing " "network issues." msgstr "" #: prewikka/utils/misc.py:72 prewikka/views/agents/agents.py:45 msgid "Offline" msgstr "Offline" #: prewikka/utils/misc.py:75 prewikka/views/agents/agents.py:210 msgid "Unknown" msgstr "Unbekannt" #: prewikka/utils/misc.py:78 msgid "Missing" msgstr "Vermisst" #: prewikka/utils/misc.py:80 prewikka/views/agents/agents.py:44 msgid "Online" msgstr "Online" #: prewikka/views/about/__init__.py:13 msgid "Prelude About page" msgstr "" #: prewikka/views/about/templates/about.mak:11 #, python-format msgid "Prelude version %s" msgstr "Prelude Version %s" #: prewikka/views/about/templates/about.mak:15 msgid "Prelude is a SIEM (Security Information and Event Management)" msgstr "Prelude ist ein SIEM (Security Information and Event Management)" #: prewikka/views/about/templates/about.mak:21 msgid "" "{prelude} is a security management solution that collects, filters, " "normalizes, correlates, stores and archives data from various sources of " "your information system. Based on all this information Prelude can " "provide a global vision of your system's security level and thus prevent " "attacks, intrusions as well as viral infections." msgstr "" "{prelude} ist ein Sicherheitsmanagement-Lösung, die sammelt, " "normalisiert, korreliert, speichert und archiviert Daten aus " "verschiedenen Quellen von Ihrem Informationssystem. Aus allen diesen " "Informationen Prelude kann eine globale Vision der Sicherheitsstufe Ihres" " Systems bieten und daher Angriffe und Virusinfektionen verhindern." #: prewikka/views/about/templates/about.mak:24 msgid "Prelude Team:" msgstr "Prelude Mannschaft:" #: prewikka/views/about/templates/about.mak:25 msgid "" "Prelude OSS is an open-source project originally created by Yoann " "Vandoorselaere in 1998." msgstr "" "Prelude OSS ist ein Open-Source-Projekt ursprünglich erstellt von Yoann " "Vandoorselaere in 1998." #: prewikka/views/about/templates/about.mak:27 msgid "Vigilo is a NMS (Network Management System)" msgstr "Vigilo ist ein NMS (Network Management System)" #: prewikka/views/about/templates/about.mak:33 msgid "" "{vigilo} is a complete monitoring and performance management solution " "capable of handling medium and large-scale systems (network - servers - " "applications) due to its distributed and modular architecture. Vigilo " "offers all the features required for performance supervision: states and " "alarms management, metrology, cartography, event correlation and " "reporting." msgstr "" "{vigilo} ist eine komplette Leistungsüberwachung-Lösung, die mittlere und" " große Systeme (Netzwerk - Server - Anwendungen) behandeln kann, aufgrund" " seiner verteilten und modularen Architektur. Vigilo bietet alle " "erforderlichen Funktionen für Leistungsüberwachung: Verwaltung von " "Zustanden und Alarmen, Metrologie, Kartographie, Ereigniskorrelation und " "Berichterstattung." #: prewikka/views/about/templates/about.mak:39 #, python-format msgid "" "Prelude SIEM and Vigilo NMS are being developed by the %s company, " "designer, integrator and operator of mission critical systems." msgstr "" "Prelude SIEM und Vigilo NMS werden von der Firma %s entwickelt, " "Entwerfer, Integrator und Operator von kritischen Systemen." #: prewikka/views/about/templates/about.mak:44 msgid "Contact" msgstr "Kontakt" #: prewikka/views/about/templates/about.mak:46 msgid "Phone:" msgstr "Telefon:" #: prewikka/views/about/templates/about.mak:47 msgid "Fax:" msgstr "Fax:" #: prewikka/views/about/templates/about.mak:50 msgid "Office" msgstr "Büro" #: prewikka/views/about/templates/about.mak:56 msgid "Websites" msgstr "Webseiten" #: prewikka/views/about/templates/about.mak:67 #: prewikka/views/aboutplugin/templates/aboutplugin.mak:132 #: prewikka/views/agents/templates/heartbeatanalyze.mak:71 #: prewikka/views/messagesummary/templates/messagesummary.mak:93 msgid "Close" msgstr "Schließen" #: prewikka/views/aboutplugin/__init__.py:36 msgid "Plugin installation and activation management page" msgstr "" #: prewikka/views/aboutplugin/__init__.py:40 #: prewikka/views/crontab/__init__.py:37 msgid "USER_MANAGEMENT" msgstr "" #: prewikka/views/aboutplugin/__init__.py:42 msgid "Apps: View" msgstr "Apps: Aussicht" #: prewikka/views/aboutplugin/__init__.py:43 msgid "Apps: API" msgstr "Apps: API" #: prewikka/views/aboutplugin/__init__.py:44 msgid "Apps: Dataprovider backend" msgstr "" #: prewikka/views/aboutplugin/__init__.py:45 msgid "Apps: Dataprovider type" msgstr "" #: prewikka/views/aboutplugin/__init__.py:46 msgid "Apps: Authentication" msgstr "Apps: Authentifizierung" #: prewikka/views/aboutplugin/__init__.py:47 msgid "Apps: Identification" msgstr "Apps: Identifizierung" #: prewikka/views/aboutplugin/__init__.py:48 msgid "Apps: Renderer backend" msgstr "" #: prewikka/views/aboutplugin/__init__.py:49 msgid "Apps: Renderer type" msgstr "" #: prewikka/views/aboutplugin/__init__.py:82 msgid "list plugin: list installed plugins" msgstr "" #: prewikka/views/aboutplugin/__init__.py:91 msgid "Apps" msgstr "Apps" #: prewikka/views/aboutplugin/__init__.py:120 msgid "sync plugin: initialize the plugin database schemas" msgstr "" #: prewikka/views/aboutplugin/__init__.py:134 #, python-format msgid "Applying %(module)s %(script)s..." msgstr "" #: prewikka/views/aboutplugin/__init__.py:144 msgid "All updates applied" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:44 msgid "ERROR" msgstr "FEHLER" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:48 #, fuzzy msgid "Update failed" msgstr "fehlgeschlagen" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:111 #, fuzzy msgid "Update Dialog" msgstr "fehlgeschlagen" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:121 msgid "Plugin" msgstr "Plugin" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:122 msgid "Script" msgstr "Skript" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:123 msgid "Result" msgstr "Ergebnis" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:144 msgid "Plugin Maintenance" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:147 msgid "" "The following apps need to be updated before they can be loaded into the " "system" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:154 #: prewikka/views/aboutplugin/templates/aboutplugin.mak:190 #: prewikka/views/agents/templates/agents.mak:29 #: prewikka/views/agents/templates/heartbeatanalyze.mak:19 #: prewikka/views/crontab/templates/cronjob.mak:114 #: prewikka/views/crontab/templates/crontab.mak:17 #: prewikka/views/filter/templates/filterlisting.mak:23 #: prewikka/views/messagesummary/messagesummary.py:288 #: prewikka/views/messagesummary/messagesummary.py:425 #: prewikka/views/messagesummary/messagesummary.py:676 #: prewikka/views/messagesummary/messagesummary.py:693 #: prewikka/views/messagesummary/messagesummary.py:716 #: prewikka/views/messagesummary/messagesummary.py:778 #: prewikka/views/messagesummary/messagesummary.py:797 #: prewikka/views/messagesummary/messagesummary.py:833 #: prewikka/views/usermanagement/templates/usersettings.mak:15 msgid "Name" msgstr "Name" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:155 #: prewikka/views/aboutplugin/templates/aboutplugin.mak:191 #: prewikka/views/filter/templates/filterlisting.mak:28 #: prewikka/views/idmefnav/templates/idmefnav.mak:56 #: prewikka/views/messagesummary/messagesummary.py:745 #: prewikka/views/messagesummary/messagesummary.py:751 msgid "Description" msgstr "Beschreibung" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:156 #: prewikka/views/aboutplugin/templates/aboutplugin.mak:192 #: prewikka/views/agents/templates/agents.mak:33 #: prewikka/views/messagesummary/messagesummary.py:427 #: prewikka/views/messagesummary/messagesummary.py:530 msgid "Version" msgstr "Version" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:157 msgid "Current database version" msgstr "Aktuelle Datenbankversion" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:158 msgid "Required database update" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:174 msgid "Install update" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:182 msgid "Installed Apps" msgstr "Installierte Apps" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:193 msgid "Database version" msgstr "Datenbankversion" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:194 msgid "Active" msgstr "Aktiv" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:215 msgid "Update the selected apps?" msgstr "Die ausgewählten Apps aktualisieren?" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:215 msgid "Update" msgstr "Aktualisieren" #: prewikka/views/agents/__init__.py:12 #, fuzzy msgid "Agents status information page" msgstr "Adress Informationen" #: prewikka/views/agents/agents.py:64 prewikka/views/agents/agents.py:133 msgid "Agents" msgstr "Agenten" #: prewikka/views/agents/agents.py:110 msgid "Node name n/a" msgstr "Knotenname n/a" #: prewikka/views/agents/agents.py:111 msgid "OS version n/a" msgstr "Betriebssystem Version n/a" #: prewikka/views/agents/agents.py:112 msgid "OS type n/a" msgstr "Betriebssystem n/a" #: prewikka/views/agents/agents.py:117 msgid "Node location n/a" msgstr "Knoten Standort n/a" #: prewikka/views/agents/agents.py:127 msgid "Alert listing" msgstr "Alarm-Liste" #: prewikka/views/agents/agents.py:128 msgid "Heartbeat listing" msgstr "Heartbeat-Liste" #: prewikka/views/agents/agents.py:129 #: prewikka/views/agents/templates/heartbeatanalyze.mak:12 msgid "Heartbeat analysis" msgstr "Heartbeat-Analyse" #: prewikka/views/agents/agents.py:133 prewikka/views/agents/agents.py:157 #: prewikka/views/datasearch/idmef.py:158 #: prewikka/views/messagesummary/messagesummary.py:332 msgid "IDMEF_VIEW" msgstr "" #: prewikka/views/agents/agents.py:133 #: prewikka/views/datasearch/heartbeat.py:55 msgid "Monitoring" msgstr "Überwachung" #: prewikka/views/agents/agents.py:142 msgid "IDMEF_ALTER" msgstr "" #: prewikka/views/agents/agents.py:184 msgid "Normal sensor start" msgstr "Normaler Sensor-Start" #: prewikka/views/agents/agents.py:186 msgid "Unexpected sensor restart" msgstr "Unerwarteter Sensor-Neustart" #: prewikka/views/agents/agents.py:192 #, python-format msgid "Unexpected heartbeat interval: %(delta)s" msgstr "Unerwartetes Heartbeat-Intervall: %(delta)s" #: prewikka/views/agents/agents.py:195 msgid "Normal sensor stop" msgstr "Normaler Sensor-Halt" #: prewikka/views/agents/agents.py:207 #, python-format msgid "Sensor is down since %s" msgstr "Der Sensor ist vermisst seit %s" #: prewikka/views/agents/agents.py:216 #, python-format msgid "" "No anomaly in the last %(count)d heartbeats (one heartbeat every " "%(delta)s average)" msgstr "" "Keine Anomalie in der %(count)d letzten Heartbeats (ein Heartbeatalle " "%(delta)s durchschnittlich)" #: prewikka/views/agents/templates/agents.mak:24 msgid "Show/Hide all" msgstr "Alles einblenden/ausblenden" #: prewikka/views/agents/templates/agents.mak:24 msgid "Search:" msgstr "Suchen:" #: prewikka/views/agents/templates/agents.mak:30 msgid "Location" msgstr "Standort" #: prewikka/views/agents/templates/agents.mak:31 msgid "Node" msgstr "Knoten" #: prewikka/views/agents/templates/agents.mak:32 #: prewikka/views/agents/templates/heartbeatanalyze.mak:20 #: prewikka/views/datasearch/heartbeat.py:67 #: prewikka/views/messagesummary/messagesummary.py:424 msgid "Model" msgstr "Modell" #: prewikka/views/agents/templates/agents.mak:34 #: prewikka/views/messagesummary/messagesummary.py:428 msgid "Class" msgstr "Klasse" #: prewikka/views/agents/templates/agents.mak:38 #: prewikka/views/agents/templates/heartbeatanalyze.mak:25 msgid "Latest heartbeat" msgstr "Neuster Heartbeat" #: prewikka/views/agents/templates/agents.mak:39 msgid "Status" msgstr "Status" #: prewikka/views/agents/templates/agents.mak:83 #, fuzzy msgid "Delete the alerts of the selected agent(s)" msgstr "Diese Heartbeats löschen?" #: prewikka/views/agents/templates/agents.mak:87 msgid "Delete the heartbeats of the selected agent(s)" msgstr "" #: prewikka/views/agents/templates/agents.mak:89 msgid "Delete the selected IDMEF messages?" msgstr "" #: prewikka/views/agents/templates/agents.mak:89 #: prewikka/views/datasearch/idmef.py:195 #: prewikka/views/filter/templates/filterlisting.mak:42 msgid "Delete" msgstr "Löschen" #: prewikka/views/agents/templates/heartbeatanalyze.mak:21 #, fuzzy msgid "OS" msgstr "TOS" #: prewikka/views/agents/templates/heartbeatanalyze.mak:22 #: prewikka/views/datasearch/heartbeat.py:66 #: prewikka/views/messagesummary/messagesummary.py:412 msgid "Node name" msgstr "Knotenname" #: prewikka/views/agents/templates/heartbeatanalyze.mak:23 #: prewikka/views/messagesummary/messagesummary.py:395 msgid "Node location" msgstr "Knoten Standort" #: prewikka/views/agents/templates/heartbeatanalyze.mak:24 #: prewikka/views/datasearch/heartbeat.py:65 #: prewikka/views/messagesummary/messagesummary.py:418 msgid "Node address" msgstr "Knotenadresse" #: prewikka/views/agents/templates/heartbeatanalyze.mak:26 msgid "Current status" msgstr "Aktueller Status" #: prewikka/views/agents/templates/heartbeatanalyze.mak:56 msgid "Events" msgstr "Ereignisse" #: prewikka/views/crontab/__init__.py:30 msgid "Scheduling management" msgstr "" #: prewikka/views/crontab/__init__.py:35 #, fuzzy msgid "Scheduled jobs management page" msgstr "Nach Agent filtern" #: prewikka/views/crontab/__init__.py:62 msgid "Configuration" msgstr "Konfiguration" #: prewikka/views/crontab/__init__.py:62 msgid "Scheduling" msgstr "Planung" #: prewikka/views/crontab/__init__.py:75 prewikka/views/crontab/__init__.py:104 msgid "SYSTEM" msgstr "SYSTEM" #: prewikka/views/crontab/__init__.py:88 msgid "Pending" msgstr "Anstehend" #: prewikka/views/crontab/__init__.py:98 msgid "Error" msgstr "Fehler" #: prewikka/views/crontab/templates/cronjob.mak:54 msgid "Schedule:" msgstr "Zeitplan:" #: prewikka/views/crontab/templates/cronjob.mak:69 msgid "custom" msgstr "maßgeschneidert" #: prewikka/views/crontab/templates/cronjob.mak:70 msgid "disabled" msgstr "deaktiviert" #: prewikka/views/crontab/templates/cronjob.mak:79 msgid "Minute:" msgstr "Minute:" #: prewikka/views/crontab/templates/cronjob.mak:83 msgid "Hour:" msgstr "Stunde:" #: prewikka/views/crontab/templates/cronjob.mak:87 msgid "Day:" msgstr "Tag:" #: prewikka/views/crontab/templates/cronjob.mak:91 msgid "Month:" msgstr "Monat:" #: prewikka/views/crontab/templates/cronjob.mak:95 msgid "Weekday:" msgstr "Wochentag:" #: prewikka/views/crontab/templates/cronjob.mak:107 msgid "Edit Job" msgstr "" #: prewikka/views/crontab/templates/cronjob.mak:112 #: prewikka/views/filter/templates/filteredition.mak:73 #: prewikka/views/usermanagement/templates/usersettings.mak:13 msgid "Name:" msgstr "Name:" #: prewikka/views/crontab/templates/cronjob.mak:123 #: prewikka/views/filter/templates/filteredition.mak:123 #: prewikka/views/usermanagement/templates/usersettings.mak:61 msgid "Save" msgstr "Sichern" #: prewikka/views/crontab/templates/crontab.mak:15 msgid "Scheduled Jobs" msgstr "Geplante Aufgaben" #: prewikka/views/crontab/templates/crontab.mak:18 msgid "Schedule" msgstr "Zeitplan" #: prewikka/views/crontab/templates/crontab.mak:19 msgid "User" msgstr "Benutzer" #: prewikka/views/crontab/templates/crontab.mak:20 msgid "Last execution" msgstr "Letzte Ausführung" #: prewikka/views/crontab/templates/crontab.mak:21 msgid "Next execution" msgstr "Nächste Ausführung" #: prewikka/views/crontab/templates/crontab.mak:69 msgid "Disable" msgstr "Deaktivieren" #: prewikka/views/crontab/templates/crontab.mak:70 msgid "Enable" msgstr "Aktivieren" #: prewikka/views/datasearch/alert.py:71 #, fuzzy msgid "Alert listing page" msgstr "Alarm-Liste" #: prewikka/views/datasearch/alert.py:76 msgid "Aggregated alerts" msgstr "Aggregierte Alarme" #: prewikka/views/datasearch/alert.py:87 #: prewikka/views/datasearch/heartbeat.py:63 #: prewikka/views/datasearch/threat.py:74 msgid "Date" msgstr "Datum" #: prewikka/views/datasearch/alert.py:89 prewikka/views/datasearch/threat.py:76 msgid "Source" msgstr "Quelle" #: prewikka/views/datasearch/alert.py:90 prewikka/views/datasearch/threat.py:77 msgid "Target" msgstr "Ziel" #: prewikka/views/datasearch/alert.py:91 msgid "Analyzer" msgstr "Analysator" #: prewikka/views/datasearch/alert.py:94 msgid "Delete the selected alerts?" msgstr "" #: prewikka/views/datasearch/alert.py:148 #: prewikka/views/idmefnav/__init__.py:44 msgid "IDMEF" msgstr "IDMEF" #: prewikka/views/datasearch/datasearch.py:48 msgid "minute" msgstr "Minute" #: prewikka/views/datasearch/datasearch.py:48 msgid "hour" msgstr "Stunde" #: prewikka/views/datasearch/datasearch.py:48 msgid "day" msgstr "Tag" #: prewikka/views/datasearch/datasearch.py:48 msgid "month" msgstr "Monat" #: prewikka/views/datasearch/datasearch.py:48 msgid "year" msgstr "Jahr" #: prewikka/views/datasearch/datasearch.py:161 #, fuzzy msgid "Time group error" msgstr "Menü Fehler" #: prewikka/views/datasearch/datasearch.py:161 msgid "Only one time unit can be specified in a groupby query" msgstr "" #: prewikka/views/datasearch/datasearch.py:446 msgid "Forensic" msgstr "" #: prewikka/views/datasearch/datasearch.py:446 msgid "Dashboard" msgstr "" #: prewikka/views/datasearch/datasearch.py:490 msgid "CSV export" msgstr "" #: prewikka/views/datasearch/datasearch.py:622 msgid "General" msgstr "General" #: prewikka/views/datasearch/heartbeat.py:51 #, fuzzy msgid "Heartbeat listing page" msgstr "Heartbeat-Liste" #: prewikka/views/datasearch/heartbeat.py:56 #, fuzzy msgid "Aggregated heartbeats" msgstr "Neuster Heartbeat" #: prewikka/views/datasearch/heartbeat.py:64 msgid "Agent" msgstr "Agent" #: prewikka/views/datasearch/heartbeat.py:69 msgid "Delete the selected heartbeats?" msgstr "Diese Heartbeats löschen?" #: prewikka/views/datasearch/idmef.py:46 msgid "See IDMEF details" msgstr "IDMEF Detail sehen" #: prewikka/views/datasearch/threat.py:66 #, fuzzy msgid "Threat listing page" msgstr "Heartbeat-Liste" #: prewikka/views/datasearch/threat.py:69 #: prewikka/views/datasearch/threat.py:70 msgid "Threats" msgstr "Bedrohungen" #: prewikka/views/datasearch/threat.py:70 msgid "Aggregated threats" msgstr "Aggregierte Bedrohungen" #: prewikka/views/datasearch/threat.py:78 msgid "Program" msgstr "Programm" #: prewikka/views/datasearch/templates/details.mak:26 #, python-format msgid "Group by %s" msgstr "Gruppieren nach %s" #: prewikka/views/datasearch/templates/details.mak:30 #: prewikka/views/datasearch/templates/forensic.mak:219 msgid "Add to search" msgstr "Zur Suche hinzufügen" #: prewikka/views/datasearch/templates/details.mak:31 #: prewikka/views/datasearch/templates/forensic.mak:220 msgid "Exclude from search" msgstr "Von der Suche ausschließen" #: prewikka/views/datasearch/templates/forensic.mak:9 msgid "Fields" msgstr "Felder" #: prewikka/views/datasearch/templates/forensic.mak:10 msgid "Query history" msgstr "Abfrageverlauf" #: prewikka/views/datasearch/templates/forensic.mak:63 msgid "Chart type" msgstr "Grafiktyp" #: prewikka/views/datasearch/templates/forensic.mak:73 msgid "Limit" msgstr "Grenze" #: prewikka/views/datasearch/templates/forensic.mak:89 msgid "Expert mode" msgstr "Expertenmodus" #: prewikka/views/datasearch/templates/forensic.mak:96 msgid "Condensed mode" msgstr "Kondensierter Modus" #: prewikka/views/datasearch/templates/forensic.mak:108 msgid "Search mode" msgstr "Suchmodus" #: prewikka/views/datasearch/templates/forensic.mak:112 #: prewikka/views/datasearch/templates/forensic.mak:217 msgid "Search" msgstr "Suchen" #: prewikka/views/datasearch/templates/forensic.mak:114 msgid "Reset search" msgstr "Die Suche zurückstellen" #: prewikka/views/datasearch/templates/forensic.mak:124 #: prewikka/views/datasearch/templates/forensic.mak:222 msgid "Group by" msgstr "Gruppieren nach" #: prewikka/views/datasearch/templates/forensic.mak:125 msgid "Select your field" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:126 #, fuzzy msgid "Time values" msgstr "Wert" #: prewikka/views/datasearch/templates/forensic.mak:131 #, python-format msgid "%s fields" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:167 msgid "Timeline" msgstr "Zeitleiste" #: prewikka/views/datasearch/templates/forensic.mak:221 msgid "New search" msgstr "Neue Suche" #: prewikka/views/datasearch/templates/forensic.mak:231 #: prewikka/views/messagesummary/messagesummary.py:1026 msgid "Actions" msgstr "Aktionen" #: prewikka/views/datasearch/templates/forensic.mak:244 msgid "Informations" msgstr "Informationen" #: prewikka/views/datasearch/templates/infos.mak:3 msgid "Field" msgstr "Feld" #: prewikka/views/datasearch/templates/infos.mak:9 #, fuzzy msgid "Occurrence" msgstr "Quelle" #: prewikka/views/datasearch/templates/table.mak:12 msgid "Count" msgstr "Zählung" #: prewikka/views/filter/__init__.py:11 #, fuzzy msgid "Filters management page" msgstr "Nach Agent filtern" #: prewikka/views/filter/filter.py:113 #: prewikka/views/usermanagement/usermanagement.py:18 msgid "Preferences" msgstr "Vorlieben" #: prewikka/views/filter/filter.py:113 #: prewikka/views/filter/templates/filterlisting.mak:17 msgid "Filters" msgstr "Filter" #: prewikka/views/filter/filter.py:124 #: prewikka/views/filter/templates/filteredition.mak:66 #, python-format msgid "Filter %s" msgstr "Filter %s" #: prewikka/views/filter/filter.py:199 msgid "Filter error" msgstr "Filterfehler" #: prewikka/views/filter/filter.py:199 #, python-format msgid "Filter '%s' does not exist" msgstr "Der Filter '%s' existiert nicht" #: prewikka/views/filter/filter.py:236 prewikka/views/filter/filter.py:248 #, fuzzy msgid "Could not save filter" msgstr "Wählen Sie einen Filter" #: prewikka/views/filter/filter.py:236 msgid "No name for this filter was provided" msgstr "" #: prewikka/views/filter/filter.py:248 msgid "The filter name is already used by another filter" msgstr "" #: prewikka/views/filter/templates/filteredition.mak:66 #: prewikka/views/filter/templates/filterlisting.mak:17 #: prewikka/views/filter/templates/menu.mak:48 msgid "New filter" msgstr "Neuer Filter" #: prewikka/views/filter/templates/filteredition.mak:75 msgid "Filter name" msgstr "Filtername" #: prewikka/views/filter/templates/filteredition.mak:80 msgid "Category:" msgstr "Kategorie:" #: prewikka/views/filter/templates/filteredition.mak:92 msgid "Description:" msgstr "Beschreibung:" #: prewikka/views/filter/templates/filterlisting.mak:24 #: prewikka/views/messagesummary/messagesummary.py:750 msgid "Category" msgstr "Kategorie" #: prewikka/views/filter/templates/filterlisting.mak:40 msgid "Create" msgstr "Erstellen" #: prewikka/views/filter/templates/filterlisting.mak:41 msgid "Duplicate" msgstr "Duplizieren" #: prewikka/views/filter/templates/filterlisting.mak:42 msgid "Delete the selected filters?" msgstr "Diese Filter löschen?" #: prewikka/views/filter/templates/menu.mak:4 msgid "Filter:" msgstr "Filter:" #: prewikka/views/filter/templates/menu.mak:38 msgid "Available filters" msgstr "Verfügbare Filter" #: prewikka/views/filter/templates/menu.mak:46 msgid "No filter" msgstr "Kein Filter" #: prewikka/views/filter/templates/menu.mak:51 msgid "No category" msgstr "Keine Kategorie" #: prewikka/views/filter/templates/widget.mak:7 msgid "Select a path..." msgstr "Wählen Sie ein Pfad..." #: prewikka/views/filter/templates/widget.mak:9 msgid "Default paths" msgstr "Standardpfade" #: prewikka/views/filter/templates/widget.mak:15 msgid "All paths" msgstr "Alle Pfade" #: prewikka/views/filter/templates/widget.mak:25 #: prewikka/views/filter/templates/widget.mak:46 msgid "Change operator" msgstr "Operator verändern" #: prewikka/views/filter/templates/widget.mak:32 msgid "value" msgstr "Wert" #: prewikka/views/filter/templates/widget.mak:34 msgid "Delete condition" msgstr "Bedingung löschen" #: prewikka/views/filter/templates/widget.mak:42 msgid "AND" msgstr "UND" #: prewikka/views/filter/templates/widget.mak:42 msgid "OR" msgstr "ODER" #: prewikka/views/filter/templates/widget.mak:56 msgid "Add condition" msgstr "Bedingung hinzufügen" #: prewikka/views/filter/templates/widget.mak:57 msgid "Add group" msgstr "Gruppe hinzufügen" #: prewikka/views/filter/templates/widget.mak:59 msgid "Delete group" msgstr "Gruppe löschen" #: prewikka/views/idmefnav/__init__.py:36 msgid "IDMEF navigator" msgstr "" #: prewikka/views/idmefnav/__init__.py:44 msgid "Help" msgstr "Hilfe" #: prewikka/views/idmefnav/templates/idmefnav.mak:12 msgid "Children" msgstr "Kinder" #: prewikka/views/idmefnav/templates/idmefnav.mak:20 #, fuzzy msgid "Aggregates" msgstr "Korrelierte Alarme" #: prewikka/views/idmefnav/templates/idmefnav.mak:36 msgid "Attributes" msgstr "Attribute" #: prewikka/views/idmefnav/templates/idmefnav.mak:54 msgid "Rank" msgstr "" #: prewikka/views/idmefnav/templates/idmefnav.mak:55 msgid "Keyword" msgstr "Stichwort" #: prewikka/views/messagesummary/__init__.py:13 #, fuzzy msgid "Detailed alert and heartbeat page" msgstr "Generisch (Alarm und Heartbeat)" #: prewikka/views/messagesummary/messagesummary.py:289 #: prewikka/views/messagesummary/messagesummary.py:578 msgid "Code" msgstr "Code" #: prewikka/views/messagesummary/messagesummary.py:290 msgid "Data length" msgstr "Datenlänge" #: prewikka/views/messagesummary/messagesummary.py:291 msgid "Data" msgstr "Daten" #: prewikka/views/messagesummary/messagesummary.py:365 #, python-format msgid "(agent local time: %s)" msgstr "(Sensor Lokalzeit: %s)" #: prewikka/views/messagesummary/messagesummary.py:372 #: prewikka/views/messagesummary/messagesummary.py:835 msgid "Create time" msgstr "Erstellungszeit" #: prewikka/views/messagesummary/messagesummary.py:375 msgid "Detect time" msgstr "Detektionszeit" #: prewikka/views/messagesummary/messagesummary.py:380 msgid "Analyzer time" msgstr "Analysator Zeit" #: prewikka/views/messagesummary/messagesummary.py:386 msgid "Process" msgstr "Prozess" #: prewikka/views/messagesummary/messagesummary.py:387 msgid "Process Path" msgstr "Prozess Pfad" #: prewikka/views/messagesummary/messagesummary.py:388 msgid "Process PID" msgstr "Prozess PID" #: prewikka/views/messagesummary/messagesummary.py:415 msgid "Node name (resolved)" msgstr "Knotenname (aufgelöst)" #: prewikka/views/messagesummary/messagesummary.py:426 msgid "Analyzerid" msgstr "Analysator-ID" #: prewikka/views/messagesummary/messagesummary.py:430 msgid "Manufacturer" msgstr "Hersteller" #: prewikka/views/messagesummary/messagesummary.py:438 msgid "Operating System" msgstr "Betriebssystem" #: prewikka/views/messagesummary/messagesummary.py:456 #, python-format msgid "Analyzer Path (%d not shown)" msgstr "Analysator Pfad (%d nicht gezeigt)" #: prewikka/views/messagesummary/messagesummary.py:463 #: prewikka/views/messagesummary/messagesummary.py:1035 #: prewikka/views/messagesummary/messagesummary.py:1106 #, python-format msgid "Analyzer #%d" msgstr "Analysator #%d" #: prewikka/views/messagesummary/messagesummary.py:473 msgid "Additional data" msgstr "Zusätzliche Daten" #: prewikka/views/messagesummary/messagesummary.py:476 #: prewikka/views/messagesummary/messagesummary.py:717 msgid "Meaning" msgstr "Bedeutung" #: prewikka/views/messagesummary/messagesummary.py:477 msgid "Value" msgstr "Wert" #: prewikka/views/messagesummary/messagesummary.py:531 #: prewikka/views/messagesummary/messagesummary.py:552 msgid "Header length" msgstr "Headerlänge" #: prewikka/views/messagesummary/messagesummary.py:532 msgid "TOS" msgstr "TOS" #: prewikka/views/messagesummary/messagesummary.py:533 #: prewikka/views/messagesummary/messagesummary.py:571 msgid "Length" msgstr "Länge" #: prewikka/views/messagesummary/messagesummary.py:534 #: prewikka/views/messagesummary/messagesummary.py:580 msgid "Id" msgstr "Id" #: prewikka/views/messagesummary/messagesummary.py:538 msgid "Ip offset" msgstr "Ip Offset" #: prewikka/views/messagesummary/messagesummary.py:539 msgid "TTL" msgstr "TTL" #: prewikka/views/messagesummary/messagesummary.py:540 #: prewikka/views/messagesummary/messagesummary.py:926 #: prewikka/views/messagesummary/messagesummary.py:929 #: prewikka/views/messagesummary/messagesummary.py:932 msgid "Protocol" msgstr "Protokoll" #: prewikka/views/messagesummary/messagesummary.py:541 #: prewikka/views/messagesummary/messagesummary.py:563 #: prewikka/views/messagesummary/messagesummary.py:572 #: prewikka/views/messagesummary/messagesummary.py:579 msgid "Checksum" msgstr "Prüfsumme" #: prewikka/views/messagesummary/messagesummary.py:542 msgid "Source address" msgstr "Quelladresse" #: prewikka/views/messagesummary/messagesummary.py:543 msgid "Target address" msgstr "Zieladresse" #: prewikka/views/messagesummary/messagesummary.py:553 msgid "Reserved" msgstr "Reserviert" #: prewikka/views/messagesummary/messagesummary.py:562 msgid "Window" msgstr "Fenster" #: prewikka/views/messagesummary/messagesummary.py:564 msgid "URP" msgstr "URP" #: prewikka/views/messagesummary/messagesummary.py:577 #: prewikka/views/messagesummary/messagesummary.py:744 #: prewikka/views/messagesummary/messagesummary.py:777 #: prewikka/views/messagesummary/messagesummary.py:796 msgid "Type" msgstr "Typ" #: prewikka/views/messagesummary/messagesummary.py:581 msgid "Seq #" msgstr "Seq #" #: prewikka/views/messagesummary/messagesummary.py:582 msgid "Mask" msgstr "Maske" #: prewikka/views/messagesummary/messagesummary.py:583 msgid "Gateway Address" msgstr "Gatewayadresse" #: prewikka/views/messagesummary/messagesummary.py:584 msgid "Num address" msgstr "Numadresse" #: prewikka/views/messagesummary/messagesummary.py:585 msgid "Wpa" msgstr "Wpa" #: prewikka/views/messagesummary/messagesummary.py:586 msgid "Lifetime" msgstr "Lifetime" #: prewikka/views/messagesummary/messagesummary.py:587 msgid "Otime" msgstr "OZeit" #: prewikka/views/messagesummary/messagesummary.py:588 msgid "Rtime" msgstr "RZeit" #: prewikka/views/messagesummary/messagesummary.py:589 msgid "Ttime" msgstr "TZeit" #: prewikka/views/messagesummary/messagesummary.py:595 #: prewikka/views/messagesummary/messagesummary.py:1082 msgid "Payload" msgstr "Payload" #: prewikka/views/messagesummary/messagesummary.py:648 msgid "Alert details" msgstr "Alarm Detail" #: prewikka/views/messagesummary/messagesummary.py:653 #, python-format msgid "%d linked alerts missing (probably deleted)" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:657 #, python-format msgid "%d linked alerts omitted" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:674 #: prewikka/views/messagesummary/messagesummary.py:991 msgid "Correlation Alert" msgstr "Korrelations-Alarm" #: prewikka/views/messagesummary/messagesummary.py:680 msgid "Correlated Alerts" msgstr "Korrelierte Alarme" #: prewikka/views/messagesummary/messagesummary.py:681 #: prewikka/views/messagesummary/messagesummary.py:698 msgid "Source Analyzer" msgstr "Quell Analysator" #: prewikka/views/messagesummary/messagesummary.py:691 #: prewikka/views/messagesummary/messagesummary.py:994 msgid "Tool Alert" msgstr "Tool-Alarme" #: prewikka/views/messagesummary/messagesummary.py:697 msgid "Linked Alerts" msgstr "Bezogene Alarme" #: prewikka/views/messagesummary/messagesummary.py:708 msgid "Text" msgstr "Text" #: prewikka/views/messagesummary/messagesummary.py:710 msgid "Ident" msgstr "Ident" #: prewikka/views/messagesummary/messagesummary.py:715 msgid "Origin" msgstr "Ursprung" #: prewikka/views/messagesummary/messagesummary.py:738 msgid "Severity" msgstr "Heftigkeit" #: prewikka/views/messagesummary/messagesummary.py:741 msgid "Completion" msgstr "Beendigung" #: prewikka/views/messagesummary/messagesummary.py:774 msgid "User category" msgstr "Benutzer Kategorie" #: prewikka/views/messagesummary/messagesummary.py:779 #: prewikka/views/messagesummary/messagesummary.py:798 msgid "Number" msgstr "Nummer" #: prewikka/views/messagesummary/messagesummary.py:780 msgid "Tty" msgstr "Tty" #: prewikka/views/messagesummary/messagesummary.py:799 msgid "Permission" msgstr "Rechte:" #: prewikka/views/messagesummary/messagesummary.py:821 msgid "Change time" msgstr "Änderungszeit" #: prewikka/views/messagesummary/messagesummary.py:822 msgid "Inode Number" msgstr "Inode Nummer" #: prewikka/views/messagesummary/messagesummary.py:823 msgid "Major device" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:824 msgid "Minor device" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:825 msgid "C Major device" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:826 msgid "C Minor device" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:830 #, python-format msgid "Target file %s" msgstr "Ziel-Datei %s" #: prewikka/views/messagesummary/messagesummary.py:830 msgid "category" msgstr "Kategorie" #: prewikka/views/messagesummary/messagesummary.py:834 msgid "Path" msgstr "Pfad" #: prewikka/views/messagesummary/messagesummary.py:836 msgid "Modify time" msgstr "Änderungsdatum" #: prewikka/views/messagesummary/messagesummary.py:837 msgid "Access time" msgstr "Zugriffsdatum" #: prewikka/views/messagesummary/messagesummary.py:838 msgid "Data size" msgstr "Datengröße" #: prewikka/views/messagesummary/messagesummary.py:839 msgid "Disk size" msgstr "Plattengröße" #: prewikka/views/messagesummary/messagesummary.py:858 msgid "Web Service" msgstr "Web Service" #: prewikka/views/messagesummary/messagesummary.py:861 msgid "Url" msgstr "Url" #: prewikka/views/messagesummary/messagesummary.py:862 msgid "Cgi" msgstr "Cgi" #: prewikka/views/messagesummary/messagesummary.py:863 msgid "Http Method" msgstr "Http Methode" #: prewikka/views/messagesummary/messagesummary.py:866 msgid "CGI Argument" msgstr "Cgi Argument" #: prewikka/views/messagesummary/messagesummary.py:875 msgid "SNMP Service" msgstr "SNMP Dienst" #: prewikka/views/messagesummary/messagesummary.py:878 msgid "oid" msgstr "oid" #: prewikka/views/messagesummary/messagesummary.py:879 msgid "messageProcessingModel" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:880 msgid "securityModel" msgstr "Sicherheitsmodell" #: prewikka/views/messagesummary/messagesummary.py:881 msgid "securityName" msgstr "Sicherheitsname" #: prewikka/views/messagesummary/messagesummary.py:882 msgid "securityLevel" msgstr "Sicherheitslevel" #: prewikka/views/messagesummary/messagesummary.py:883 msgid "contextName" msgstr "KontextName" #: prewikka/views/messagesummary/messagesummary.py:884 msgid "contextEngineID" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:885 msgid "command" msgstr "Kommando" #: prewikka/views/messagesummary/messagesummary.py:897 #: prewikka/views/messagesummary/messagesummary.py:899 msgid "Port" msgstr "Port" #: prewikka/views/messagesummary/messagesummary.py:919 msgid "PortList" msgstr "Portliste" #: prewikka/views/messagesummary/messagesummary.py:922 #, fuzzy msgid "ip_version" msgstr "Version" #: prewikka/views/messagesummary/messagesummary.py:958 #, python-format msgid "Source(%d)" msgstr "Quelle(%d)" #: prewikka/views/messagesummary/messagesummary.py:973 #, python-format msgid "Target(%d)" msgstr "Ziel(%d)" #: prewikka/views/messagesummary/messagesummary.py:997 msgid "Overflow Alert" msgstr "Overflow Alarm" #: prewikka/views/messagesummary/messagesummary.py:1000 msgid "Alert" msgstr "Alarm" #: prewikka/views/messagesummary/messagesummary.py:1018 msgid "MessageID" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:1065 msgid "Network centric information" msgstr "Netzwerkinformationen" #: prewikka/views/messagesummary/messagesummary.py:1087 msgid "ASCII Payload" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:1103 msgid "Heartbeat" msgstr "Heartbeat" #: prewikka/views/messagesummary/templates/messagesummary.mak:85 msgid "Summary" msgstr "Zusammenfassung" #: prewikka/views/usermanagement/__init__.py:14 #, fuzzy msgid "User settings page" msgstr "Benutzer-Liste" #: prewikka/views/usermanagement/usermanagement.py:18 msgid "My account" msgstr "Mein Konto" #: prewikka/views/usermanagement/usermanagement.py:23 msgid "Invalid User" msgstr "Ungültiger Benutzer" #: prewikka/views/usermanagement/usermanagement.py:23 #, python-format msgid "Requested user '%s' does not exist" msgstr "Der Benutzer '%s' existiert nicht" #: prewikka/views/usermanagement/usermanagement.py:43 msgid "Invalid Language" msgstr "Ungültige Sprache" #: prewikka/views/usermanagement/usermanagement.py:43 msgid "Specified language does not exist" msgstr "Die spezifierte Sprache existiert nicht" #: prewikka/views/usermanagement/usermanagement.py:47 msgid "Invalid Timezone" msgstr "Ungültige Zeitzone" #: prewikka/views/usermanagement/usermanagement.py:47 msgid "Specified timezone does not exist" msgstr "Die spezifierte Zeitzone existiert nicht" #: prewikka/views/usermanagement/templates/usersettings.mak:6 msgid "Login:" msgstr "Login:" #: prewikka/views/usermanagement/templates/usersettings.mak:20 msgid "Email:" msgstr "Email:" #: prewikka/views/usermanagement/templates/usersettings.mak:22 msgid "Email" msgstr "Email" #: prewikka/views/usermanagement/templates/usersettings.mak:27 msgid "Language:" msgstr "Sprache:" #: prewikka/views/usermanagement/templates/usersettings.mak:39 msgid "Theme:" msgstr "Thema:" #: prewikka/views/usermanagement/templates/usersettings.mak:50 msgid "Timezone:" msgstr "Zeitzone:" #: scripts/prewikka-cli:59 #, fuzzy msgid "Unknown command" msgstr "Kommando" #: scripts/prewikka-cli:67 #, python-format msgid "An unexpected error occurred: %s" msgstr "" #: scripts/prewikka-cli:154 msgid "Create an object of the specified type" msgstr "" #: scripts/prewikka-cli:157 msgid "Delete an object of the specified type" msgstr "" #: scripts/prewikka-cli:160 msgid "Import objects of the specified type from files" msgstr "" #: scripts/prewikka-cli:163 msgid "List objects of the specified type" msgstr "" #: scripts/prewikka-cli:166 msgid "Synchronize objects of the specified type" msgstr "" #: scripts/prewikka-cli:169 msgid "Update objects of the specified type" msgstr "" #: scripts/prewikka-cli:207 msgid "Prewikka command-line tool" msgstr "" #: scripts/prewikka-cli:208 msgid "name of the user" msgstr "" #: scripts/prewikka-cli:209 scripts/prewikka-crontab:99 #: scripts/prewikka-httpd:93 #, python-format msgid "configuration file to use (default: %(default)s)" msgstr "" #: scripts/prewikka-cli:210 msgid "command to execute" msgstr "" #: scripts/prewikka-cli:211 msgid "enable debugging output" msgstr "" #: scripts/prewikka-cli:218 msgid "prewikka-cli must be executed as the prewikka user" msgstr "" #: scripts/prewikka-cli:243 #, python-format msgid "Prewikka command-line tool (%s)" msgstr "" #: scripts/prewikka-cli:244 msgid "Type \"help\" or \"?\" to list commands" msgstr "" #: scripts/prewikka-crontab:100 msgid "run as a system daemon" msgstr "" #: scripts/prewikka-crontab:101 scripts/prewikka-httpd:96 msgid "show this help message and exit" msgstr "" #: scripts/prewikka-crontab:102 scripts/prewikka-httpd:97 msgid "show program's version number and exit" msgstr "" #: scripts/prewikka-httpd:88 msgid "root where the server is accessible" msgstr "" #: scripts/prewikka-httpd:89 #, python-format msgid "IP to bind to (default: %(default)s)" msgstr "" #: scripts/prewikka-httpd:90 #, python-format msgid "port number to use (default: %(default)d)" msgstr "" #: scripts/prewikka-httpd:91 msgid "SSL private key to use (default: no SSL)" msgstr "" #: scripts/prewikka-httpd:92 msgid "SSL certificate to use (default: no SSL)" msgstr "" #: scripts/prewikka-httpd:95 #, python-format msgid "" "number of processes to use. Default value matches the number of available" " CPUs (i.e. %d)" msgstr "" prewikka-5.1.1/prewikka/locale/en/0000775000175000017500000000000013555143705020425 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/locale/en/LC_MESSAGES/0000775000175000017500000000000013555143705022212 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/locale/en/LC_MESSAGES/prewikka.po0000664000175000017500000015205313555143652024376 0ustar tandrejatandreja00000000000000# English Translation for Prewikka # Copyright (C) 2012-2019 CS-SI # This file is distributed under the same license as the prewikka package. # msgid "" msgstr "" "Project-Id-Version: Prewikka 5.1.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-09-04 19:03+0200\n" "PO-Revision-Date: 2018-02-09 12:07+0100\n" "Last-Translator: FULL NAME \n" "Language-Team: English\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 0.9.6\n" #: prewikka/baseview.py:79 prewikka/usergroup.py:52 msgid "Permission Denied" msgstr "" #: prewikka/baseview.py:79 msgid "Missing permission to access the specified file" msgstr "" #: prewikka/config.py:37 prewikka/dataprovider/__init__.py:645 msgid "Configuration error" msgstr "" #: prewikka/config.py:43 #, python-format msgid "Parse error in \"%(txt)s\" at %(file)s line %(line)d" msgstr "" #: prewikka/config.py:48 prewikka/view.py:82 #, python-format msgid "Invalid value '%(value)s' for parameter '%(name)s'" msgstr "" #: prewikka/config.py:54 #, python-format msgid "Missing value for parameter '%(name)s'" msgstr "" #: prewikka/crontab.py:37 msgid "Hourly" msgstr "" #: prewikka/crontab.py:38 msgid "Daily" msgstr "" #: prewikka/crontab.py:39 msgid "Weekly" msgstr "" #: prewikka/crontab.py:40 msgid "Monthly" msgstr "" #: prewikka/crontab.py:41 msgid "Yearly" msgstr "" #: prewikka/crontab.py:42 prewikka/mainmenu.py:302 #: prewikka/templates/mainmenu.mak:92 msgid "Custom" msgstr "" #: prewikka/crontab.py:43 prewikka/views/crontab/__init__.py:84 msgid "Disabled" msgstr "" #: prewikka/crontab.py:105 msgid "Scheduled job execution failed" msgstr "" #: prewikka/crontab.py:139 msgid "Invalid job extension" msgstr "" #: prewikka/crontab.py:139 #, python-format msgid "Scheduled job with invalid extension type '%s'" msgstr "" #: prewikka/crontab.py:206 msgid "Invalid CronJob" msgstr "" #: prewikka/crontab.py:206 #, python-format msgid "CronJob with id=%d cannot be found in database" msgstr "" #: prewikka/crontab.py:260 msgid "Invalid schedule" msgstr "" #: prewikka/crontab.py:260 msgid "The specified job schedule is invalid" msgstr "" #: prewikka/crontab.py:286 #, python-format msgid "Custom (%s)" msgstr "" #: prewikka/database.py:43 msgid "Database error" msgstr "" #: prewikka/database.py:50 msgid "Database schema error" msgstr "" #: prewikka/database.py:293 msgid "database installation required" msgstr "" #: prewikka/database.py:296 msgid "database activation required" msgstr "" #: prewikka/database.py:299 #, python-format msgid "database schema branch %(required)s required (found %(current)s)" msgstr "" #: prewikka/database.py:305 #, python-format msgid "database schema version %(required)s required (found %(current)s)" msgstr "" #: prewikka/database.py:372 msgid "Database installation error" msgstr "" #: prewikka/database.py:374 #, python-format msgid "" "No database installation script found for module %(module)s, version " "%(version)s" msgstr "" #: prewikka/database.py:382 prewikka/database.py:420 msgid "Database migration error" msgstr "" #: prewikka/database.py:386 #, python-format msgid "" "No database branch migration script found for module %(module)s, branch " "transition %(current)s -> %(required)s" msgstr "" #: prewikka/database.py:424 #, python-format msgid "" "No linear migration script found for module %(module)s %(version1)s -> " "%(version2)s" msgstr "" #: prewikka/database.py:841 msgid "Database configuration error" msgstr "" #: prewikka/database.py:841 msgid "Only MySQL and PostgreSQL databases are supported at the moment" msgstr "" #: prewikka/error.py:48 prewikka/templates/error.mak:139 msgid "An unexpected condition happened" msgstr "" #: prewikka/error.py:148 msgid "Not implemented" msgstr "" #: prewikka/error.py:150 msgid "Backend does not implement this operation" msgstr "" #: prewikka/history.py:32 msgid "Search history deletion" msgstr "" #: prewikka/localization.py:143 msgid "%m/%Y" msgstr "" #: prewikka/localization.py:144 #, python-format msgid "%m/%d/%Y" msgstr "" #: prewikka/localization.py:145 #, python-format msgid "%m/%d/%Y %Hh" msgstr "" #: prewikka/localization.py:146 #, python-format msgid "%m/%d/%Y %H:%M" msgstr "" #: prewikka/localization.py:147 #, python-format msgid "%m/%d/%Y %H:%M:%S" msgstr "" #: prewikka/localization.py:149 msgid "%H:%M" msgstr "" #: prewikka/localization.py:150 msgid "%H:%M:%S" msgstr "" #: prewikka/localization.py:235 prewikka/localization.py:253 #: prewikka/renderer/__init__.py:62 prewikka/views/crontab/__init__.py:95 msgid "n/a" msgstr "" #: prewikka/localization.py:246 #, python-format msgid "%(days)dd %(hours)dh %(minutes)d'" msgstr "" #: prewikka/main.py:45 msgid "Version Requirement error" msgstr "" #: prewikka/main.py:48 #, python-format msgid "Prewikka %(vPre)s requires libprelude %(vLib)s or higher" msgstr "" #: prewikka/main.py:53 #, python-format msgid "Prewikka %(vPre)s requires libpreludedb %(vLib)s or higher" msgstr "" #: prewikka/main.py:136 prewikka/main.py:149 #: prewikka/dataprovider/plugins/idmef/__init__.py:57 msgid "Initialization error" msgstr "" #: prewikka/main.py:150 #, python-format msgid "" "Cannot use %(type)s mode '%(name)s', please contact your local " "administrator." msgstr "" #: prewikka/main.py:192 #, python-format msgid "Session '%s' does not accept any authentication module" msgstr "" #: prewikka/main.py:298 #, python-format msgid "An unexpected condition happened while trying to load %s" msgstr "" #: prewikka/mainmenu.py:114 #, python-format msgid "%S.%.6f" msgstr "" #: prewikka/mainmenu.py:115 #, python-format msgid "%S.%.3f" msgstr "" #: prewikka/mainmenu.py:260 msgid "Today" msgstr "" #: prewikka/mainmenu.py:261 msgid "Yesterday" msgstr "" #: prewikka/mainmenu.py:262 msgid "This week" msgstr "" #: prewikka/mainmenu.py:263 #, fuzzy msgid "Last week" msgstr "" #: prewikka/mainmenu.py:264 msgid "This month" msgstr "" #: prewikka/mainmenu.py:265 #, fuzzy msgid "Last month" msgstr "" #: prewikka/mainmenu.py:266 prewikka/mainmenu.py:267 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "" msgstr[1] "" #: prewikka/mainmenu.py:268 prewikka/mainmenu.py:269 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "" msgstr[1] "" #: prewikka/mainmenu.py:270 #, python-format msgid "%d week" msgid_plural "%d weeks" msgstr[0] "" msgstr[1] "" #: prewikka/mainmenu.py:271 prewikka/mainmenu.py:272 #, python-format msgid "%d month" msgid_plural "%d months" msgstr[0] "" msgstr[1] "" #: prewikka/mainmenu.py:273 #, python-format msgid "%d year" msgid_plural "%d years" msgstr[0] "" msgstr[1] "" #: prewikka/mainmenu.py:277 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "" msgstr[1] "" #: prewikka/mainmenu.py:278 prewikka/mainmenu.py:279 prewikka/mainmenu.py:280 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "" msgstr[1] "" #: prewikka/mainmenu.py:299 prewikka/templates/mainmenu.mak:61 msgid "Inactive" msgstr "" #: prewikka/mainmenu.py:305 prewikka/templates/mainmenu.mak:89 msgid "None" msgstr "" #: prewikka/menu.py:70 prewikka/menu.py:73 prewikka/menu.py:79 #: prewikka/menu.py:83 prewikka/menu.py:91 msgid "Menu error" msgstr "" #: prewikka/menu.py:70 msgid "The provided YAML menu is invalid" msgstr "" #: prewikka/menu.py:73 msgid "Empty menu" msgstr "" #: prewikka/menu.py:79 #, python-format msgid "Menu without a name in %s" msgstr "" #: prewikka/menu.py:83 msgid "Multiple default menus" msgstr "" #: prewikka/menu.py:91 msgid "Multiple default views" msgstr "" #: prewikka/pluginmanager.py:163 #, python-format msgid "Circular dependencies detected: %s" msgstr "" #: prewikka/pluginmanager.py:171 #, python-format msgid "Missing dependency: %s" msgstr "" #: prewikka/resolve.py:170 #, python-format msgid "" "Asynchronous DNS resolution disabled: twisted.names and twisted.internet " "required: %s" msgstr "" #: prewikka/usergroup.py:44 #, python-format msgid "Access to view '%(view)s' forbidden. Required permissions: %(permissions)s" msgstr "" #: prewikka/usergroup.py:47 #, python-format msgid "Access to view '%s' forbidden" msgstr "" #: prewikka/usergroup.py:50 #, python-format msgid "Required permissions: %s" msgstr "" #: prewikka/view.py:74 prewikka/view.py:81 prewikka/view.py:88 msgid "Parameters Normalization failed" msgstr "" #: prewikka/view.py:75 #, python-format msgid "Parameter '%s' is not valid" msgstr "" #: prewikka/view.py:89 #, python-format msgid "Required parameter '%s' is missing" msgstr "" #: prewikka/view.py:95 msgid "Invalid method" msgstr "" #: prewikka/view.py:102 msgid "Invalid view" msgstr "" #: prewikka/view.py:528 #, python-format msgid "Method '%(method)s' is not allowed for view '%(view)s'" msgstr "" #: prewikka/view.py:532 prewikka/view.py:651 #, python-format msgid "View '%s' does not exist" msgstr "" #: prewikka/auth/auth.py:30 msgid "Authentication failed" msgstr "" #: prewikka/dataprovider/__init__.py:35 msgid "Equal" msgstr "" #: prewikka/dataprovider/__init__.py:36 msgid "Equal (case-insensitive)" msgstr "" #: prewikka/dataprovider/__init__.py:37 msgid "Not equal" msgstr "" #: prewikka/dataprovider/__init__.py:38 msgid "Not equal (case-insensitive)" msgstr "" #: prewikka/dataprovider/__init__.py:39 msgid "Regular expression" msgstr "" #: prewikka/dataprovider/__init__.py:40 msgid "Regular expression (case-insensitive)" msgstr "" #: prewikka/dataprovider/__init__.py:41 msgid "Not regular expression" msgstr "" #: prewikka/dataprovider/__init__.py:42 msgid "Not regular expression (case-insensitive)" msgstr "" #: prewikka/dataprovider/__init__.py:43 msgid "Lesser than" msgstr "" #: prewikka/dataprovider/__init__.py:44 msgid "Lesser or equal" msgstr "" #: prewikka/dataprovider/__init__.py:45 msgid "Greater than" msgstr "" #: prewikka/dataprovider/__init__.py:46 msgid "Greater or equal" msgstr "" #: prewikka/dataprovider/__init__.py:47 msgid "Substring" msgstr "" #: prewikka/dataprovider/__init__.py:48 msgid "Substring (case-insensitive)" msgstr "" #: prewikka/dataprovider/__init__.py:49 msgid "Not substring" msgstr "" #: prewikka/dataprovider/__init__.py:50 msgid "Not substring (case-insensitive)" msgstr "" #: prewikka/dataprovider/__init__.py:92 prewikka/dataprovider/__init__.py:158 msgid "Conversion error" msgstr "" #: prewikka/dataprovider/__init__.py:93 prewikka/dataprovider/__init__.py:159 #, python-format msgid "Value %(value)r cannot be converted to %(type)s" msgstr "" #: prewikka/dataprovider/__init__.py:109 msgid "Backend error" msgstr "" #: prewikka/dataprovider/__init__.py:109 #, python-format msgid "No backend available for '%s' datatype" msgstr "" #: prewikka/dataprovider/__init__.py:116 prewikka/dataprovider/__init__.py:123 msgid "Syntax error" msgstr "" #: prewikka/dataprovider/__init__.py:116 #, python-format msgid "Unknown path: %s" msgstr "" #: prewikka/dataprovider/__init__.py:123 scripts/prewikka-cli:109 #: scripts/prewikka-cli:118 scripts/prewikka-cli:129 msgid "Could not parse input" msgstr "" #: prewikka/dataprovider/__init__.py:635 #, python-format msgid "No handler configured for '%s' datatype" msgstr "" #: prewikka/dataprovider/__init__.py:646 #, python-format msgid "Only one manager should be configured for '%s' backend" msgstr "" #: prewikka/dataprovider/idmef.py:128 msgid "High" msgstr "" #: prewikka/dataprovider/idmef.py:129 msgid "Medium" msgstr "" #: prewikka/dataprovider/idmef.py:130 msgid "Low" msgstr "" #: prewikka/dataprovider/idmef.py:131 msgid "Informational" msgstr "" #: prewikka/dataprovider/idmef.py:141 msgid "Provides an API to fetch IDMEF alerts" msgstr "" #: prewikka/dataprovider/idmef.py:142 #: prewikka/views/agents/templates/agents.mak:83 #: prewikka/views/datasearch/alert.py:75 prewikka/views/datasearch/alert.py:76 msgid "Alerts" msgstr "" #: prewikka/dataprovider/idmef.py:149 prewikka/views/datasearch/alert.py:88 #: prewikka/views/datasearch/threat.py:75 msgid "Classification" msgstr "" #: prewikka/dataprovider/idmef.py:150 msgid "Source IP" msgstr "" #: prewikka/dataprovider/idmef.py:151 #: prewikka/views/messagesummary/messagesummary.py:548 #: prewikka/views/messagesummary/messagesummary.py:569 msgid "Source port" msgstr "" #: prewikka/dataprovider/idmef.py:152 msgid "Target IP" msgstr "" #: prewikka/dataprovider/idmef.py:153 #: prewikka/views/messagesummary/messagesummary.py:549 #: prewikka/views/messagesummary/messagesummary.py:570 msgid "Target port" msgstr "" #: prewikka/dataprovider/idmef.py:154 msgid "Analyzer name" msgstr "" #: prewikka/dataprovider/idmef.py:157 msgid "Alert deletion" msgstr "" #: prewikka/dataprovider/idmef.py:182 msgid "Provides an API to fetch IDMEF heartbeats" msgstr "" #: prewikka/dataprovider/idmef.py:183 #: prewikka/views/agents/templates/agents.mak:87 #: prewikka/views/datasearch/heartbeat.py:56 msgid "Heartbeats" msgstr "" #: prewikka/dataprovider/idmef.py:188 msgid "Heartbeat deletion" msgstr "" #: prewikka/dataprovider/parsers/lucene/__init__.py:52 msgid "Lucene emulation error" msgstr "" #: prewikka/dataprovider/parsers/lucene/__init__.py:53 msgid "" "This Lucene expression cannot be emulated properly using the Criterion " "backend" msgstr "" #: prewikka/dataprovider/plugins/idmef/__init__.py:97 msgid "Plugin for fetching IDMEF alerts from the Prelude database" msgstr "" #: prewikka/dataprovider/plugins/idmef/__init__.py:111 msgid "Plugin for fetching IDMEF heartbeats from the Prelude database" msgstr "" #: prewikka/plugins/warning/__init__.py:33 msgid "Prelude Warning message" msgstr "" #: prewikka/plugins/warning/templates/warning.mak:14 msgid "WARNING" msgstr "" #: prewikka/plugins/warning/templates/warning.mak:17 msgid "Prelude OSS is the open-source version of the Prelude SIEM" msgstr "" #: prewikka/plugins/warning/templates/warning.mak:21 #, python-format msgid "" "This OSS version has lower " "performance and less features than the Pro/Enterprise versions." msgstr "" #: prewikka/plugins/warning/templates/warning.mak:22 msgid "" "It is intended for tests and small environments, and should not be used " "in critical environments." msgstr "" #: prewikka/plugins/warning/templates/warning.mak:26 #, python-format msgid "Prelude OSS is distributed under the %s." msgstr "" #: prewikka/plugins/warning/templates/warning.mak:27 msgid "" "Products derivated from Prelude OSS modules are therefore subject to the " "terms of the GPLv2." msgstr "" #: prewikka/plugins/warning/templates/warning.mak:30 #: prewikka/templates/error.mak:171 prewikka/templates/toplayout.mak:62 #: prewikka/templates/toplayout.mak:77 prewikka/templates/toplayout.mak:94 #: prewikka/views/aboutplugin/templates/aboutplugin.mak:44 msgid "OK" msgstr "" #: prewikka/renderer/__init__.py:44 msgid "No data to display." msgstr "" #: prewikka/renderer/__init__.py:143 prewikka/renderer/__init__.py:147 #: prewikka/renderer/__init__.py:151 msgid "Renderer error" msgstr "" #: prewikka/renderer/__init__.py:144 #, python-format msgid "No backend supporting render type '%s'" msgstr "" #: prewikka/renderer/__init__.py:148 #, python-format msgid "No backend named '%s'" msgstr "" #: prewikka/renderer/__init__.py:152 #, python-format msgid "Backend '%(backend)s' does not support render type '%(type)s'" msgstr "" #: prewikka/renderer/chartjs/__init__.py:104 msgid "ChartJS renderer backend" msgstr "" #: prewikka/renderer/chartjs/bar/__init__.py:38 msgid "ChartJS Bar renderer type" msgstr "" #: prewikka/renderer/chartjs/timeline/__init__.py:85 msgid "ChartJS Timebar renderer type" msgstr "" #: prewikka/session/session.py:39 msgid "Invalid session" msgstr "" #: prewikka/session/session.py:40 msgid "The session cookie carried by your browser is invalid" msgstr "" #: prewikka/session/session.py:44 msgid "Session expired" msgstr "" #: prewikka/session/session.py:45 msgid "Your session has expired: please sign in again to continue using Prelude" msgstr "" #: prewikka/session/session.py:181 msgid "Logged out" msgstr "" #: prewikka/session/anonymous/anonymous.py:31 msgid "Anonymous authentication" msgstr "" #: prewikka/templates/baseview.mak:148 msgid "View options" msgstr "" #: prewikka/templates/baseview.mak:151 msgid "View help" msgstr "" #: prewikka/templates/baseview.mak:205 msgid "This app has been disabled or failed to load." msgstr "" #: prewikka/templates/baseview.mak:211 prewikka/templates/baseview.mak:222 msgid "name" msgstr "" #: prewikka/templates/baseview.mak:287 msgid "About" msgstr "" #: prewikka/templates/baseview.mak:290 msgid "Are you sure you want to log out?" msgstr "" #: prewikka/templates/baseview.mak:290 msgid "Logout" msgstr "" #: prewikka/templates/error.mak:66 msgid "Detail" msgstr "" #: prewikka/templates/error.mak:67 msgid "Copy to clipboard" msgstr "" #: prewikka/templates/error.mak:137 prewikka/templates/error.mak:145 msgid "Error: {0}" msgstr "" #: prewikka/templates/error.mak:155 msgid "This may be due to one or more of the following reasons:" msgstr "" #: prewikka/templates/error.mak:157 msgid "You don't have the required permissions." msgstr "" #: prewikka/templates/error.mak:158 #, python-format msgid "Required apps are disabled. See the %s page for more details." msgstr "" #: prewikka/templates/error.mak:176 prewikka/templates/toplayout.mak:61 #: prewikka/views/crontab/templates/cronjob.mak:122 #: prewikka/views/filter/templates/filteredition.mak:122 msgid "Cancel" msgstr "" #: prewikka/templates/error.mak:177 msgid "Sign in" msgstr "" #: prewikka/templates/error.mak:181 msgid "Back" msgstr "" #: prewikka/templates/error.mak:184 msgid "Retry" msgstr "" #: prewikka/templates/error.mak:186 msgid "Redirect to main page" msgstr "" #: prewikka/templates/mainmenu.mak:44 msgid "Refresh:" msgstr "" #: prewikka/templates/mainmenu.mak:49 msgid "Update frequency of the current page" msgstr "" #: prewikka/templates/mainmenu.mak:76 msgid "Period:" msgstr "" #: prewikka/templates/mainmenu.mak:81 msgid "Period to visualize" msgstr "" #: prewikka/templates/mainmenu.mak:111 msgid "Start:" msgstr "" #: prewikka/templates/mainmenu.mak:117 msgid "start" msgstr "" #: prewikka/templates/mainmenu.mak:117 msgid "Start date" msgstr "" #: prewikka/templates/mainmenu.mak:123 msgid "End:" msgstr "" #: prewikka/templates/mainmenu.mak:130 msgid "end" msgstr "" #: prewikka/templates/mainmenu.mak:130 msgid "End date" msgstr "" #: prewikka/templates/toplayout.mak:57 msgid "Please Confirm" msgstr "" #: prewikka/templates/toplayout.mak:73 msgid "Prelude Dialog" msgstr "" #: prewikka/templates/toplayout.mak:88 msgid "Connection error" msgstr "" #: prewikka/templates/toplayout.mak:91 msgid "" "Connection failed, the server may be down or you may be experiencing " "network issues." msgstr "" #: prewikka/utils/misc.py:72 prewikka/views/agents/agents.py:45 msgid "Offline" msgstr "" #: prewikka/utils/misc.py:75 prewikka/views/agents/agents.py:210 msgid "Unknown" msgstr "" #: prewikka/utils/misc.py:78 msgid "Missing" msgstr "" #: prewikka/utils/misc.py:80 prewikka/views/agents/agents.py:44 msgid "Online" msgstr "" #: prewikka/views/about/__init__.py:13 msgid "Prelude About page" msgstr "" #: prewikka/views/about/templates/about.mak:11 #, python-format msgid "Prelude version %s" msgstr "" #: prewikka/views/about/templates/about.mak:15 msgid "Prelude is a SIEM (Security Information and Event Management)" msgstr "" #: prewikka/views/about/templates/about.mak:21 msgid "" "{prelude} is a security management solution that collects, filters, " "normalizes, correlates, stores and archives data from various sources of " "your information system. Based on all this information Prelude can " "provide a global vision of your system's security level and thus prevent " "attacks, intrusions as well as viral infections." msgstr "" #: prewikka/views/about/templates/about.mak:24 msgid "Prelude Team:" msgstr "" #: prewikka/views/about/templates/about.mak:25 msgid "" "Prelude OSS is an open-source project originally created by Yoann " "Vandoorselaere in 1998." msgstr "" #: prewikka/views/about/templates/about.mak:27 msgid "Vigilo is a NMS (Network Management System)" msgstr "" #: prewikka/views/about/templates/about.mak:33 msgid "" "{vigilo} is a complete monitoring and performance management solution " "capable of handling medium and large-scale systems (network - servers - " "applications) due to its distributed and modular architecture. Vigilo " "offers all the features required for performance supervision: states and " "alarms management, metrology, cartography, event correlation and " "reporting." msgstr "" #: prewikka/views/about/templates/about.mak:39 #, python-format msgid "" "Prelude SIEM and Vigilo NMS are being developed by the %s company, " "designer, integrator and operator of mission critical systems." msgstr "" #: prewikka/views/about/templates/about.mak:44 msgid "Contact" msgstr "" #: prewikka/views/about/templates/about.mak:46 msgid "Phone:" msgstr "" #: prewikka/views/about/templates/about.mak:47 msgid "Fax:" msgstr "" #: prewikka/views/about/templates/about.mak:50 msgid "Office" msgstr "" #: prewikka/views/about/templates/about.mak:56 msgid "Websites" msgstr "" #: prewikka/views/about/templates/about.mak:67 #: prewikka/views/aboutplugin/templates/aboutplugin.mak:132 #: prewikka/views/agents/templates/heartbeatanalyze.mak:71 #: prewikka/views/messagesummary/templates/messagesummary.mak:93 msgid "Close" msgstr "" #: prewikka/views/aboutplugin/__init__.py:36 msgid "Plugin installation and activation management page" msgstr "" #: prewikka/views/aboutplugin/__init__.py:40 #: prewikka/views/crontab/__init__.py:37 msgid "USER_MANAGEMENT" msgstr "USER MANAGEMENET" #: prewikka/views/aboutplugin/__init__.py:42 msgid "Apps: View" msgstr "" #: prewikka/views/aboutplugin/__init__.py:43 msgid "Apps: API" msgstr "" #: prewikka/views/aboutplugin/__init__.py:44 msgid "Apps: Dataprovider backend" msgstr "" #: prewikka/views/aboutplugin/__init__.py:45 msgid "Apps: Dataprovider type" msgstr "" #: prewikka/views/aboutplugin/__init__.py:46 msgid "Apps: Authentication" msgstr "" #: prewikka/views/aboutplugin/__init__.py:47 msgid "Apps: Identification" msgstr "" #: prewikka/views/aboutplugin/__init__.py:48 msgid "Apps: Renderer backend" msgstr "" #: prewikka/views/aboutplugin/__init__.py:49 msgid "Apps: Renderer type" msgstr "" #: prewikka/views/aboutplugin/__init__.py:82 msgid "list plugin: list installed plugins" msgstr "" #: prewikka/views/aboutplugin/__init__.py:91 msgid "Apps" msgstr "" #: prewikka/views/aboutplugin/__init__.py:120 msgid "sync plugin: initialize the plugin database schemas" msgstr "" #: prewikka/views/aboutplugin/__init__.py:134 #, python-format msgid "Applying %(module)s %(script)s..." msgstr "" #: prewikka/views/aboutplugin/__init__.py:144 msgid "All updates applied" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:44 msgid "ERROR" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:48 msgid "Update failed" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:111 msgid "Update Dialog" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:121 msgid "Plugin" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:122 msgid "Script" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:123 msgid "Result" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:144 msgid "Plugin Maintenance" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:147 msgid "" "The following apps need to be updated before they can be loaded into the " "system" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:154 #: prewikka/views/aboutplugin/templates/aboutplugin.mak:190 #: prewikka/views/agents/templates/agents.mak:29 #: prewikka/views/agents/templates/heartbeatanalyze.mak:19 #: prewikka/views/crontab/templates/cronjob.mak:114 #: prewikka/views/crontab/templates/crontab.mak:17 #: prewikka/views/filter/templates/filterlisting.mak:23 #: prewikka/views/messagesummary/messagesummary.py:288 #: prewikka/views/messagesummary/messagesummary.py:425 #: prewikka/views/messagesummary/messagesummary.py:676 #: prewikka/views/messagesummary/messagesummary.py:693 #: prewikka/views/messagesummary/messagesummary.py:716 #: prewikka/views/messagesummary/messagesummary.py:778 #: prewikka/views/messagesummary/messagesummary.py:797 #: prewikka/views/messagesummary/messagesummary.py:833 #: prewikka/views/usermanagement/templates/usersettings.mak:15 msgid "Name" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:155 #: prewikka/views/aboutplugin/templates/aboutplugin.mak:191 #: prewikka/views/filter/templates/filterlisting.mak:28 #: prewikka/views/idmefnav/templates/idmefnav.mak:56 #: prewikka/views/messagesummary/messagesummary.py:745 #: prewikka/views/messagesummary/messagesummary.py:751 msgid "Description" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:156 #: prewikka/views/aboutplugin/templates/aboutplugin.mak:192 #: prewikka/views/agents/templates/agents.mak:33 #: prewikka/views/messagesummary/messagesummary.py:427 #: prewikka/views/messagesummary/messagesummary.py:530 msgid "Version" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:157 msgid "Current database version" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:158 msgid "Required database update" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:174 msgid "Install update" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:182 msgid "Installed Apps" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:193 msgid "Database version" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:194 msgid "Active" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:215 msgid "Update the selected apps?" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:215 msgid "Update" msgstr "" #: prewikka/views/agents/__init__.py:12 msgid "Agents status information page" msgstr "" #: prewikka/views/agents/agents.py:64 prewikka/views/agents/agents.py:133 msgid "Agents" msgstr "" #: prewikka/views/agents/agents.py:110 msgid "Node name n/a" msgstr "" #: prewikka/views/agents/agents.py:111 msgid "OS version n/a" msgstr "" #: prewikka/views/agents/agents.py:112 msgid "OS type n/a" msgstr "" #: prewikka/views/agents/agents.py:117 msgid "Node location n/a" msgstr "" #: prewikka/views/agents/agents.py:127 msgid "Alert listing" msgstr "" #: prewikka/views/agents/agents.py:128 msgid "Heartbeat listing" msgstr "" #: prewikka/views/agents/agents.py:129 #: prewikka/views/agents/templates/heartbeatanalyze.mak:12 msgid "Heartbeat analysis" msgstr "" #: prewikka/views/agents/agents.py:133 prewikka/views/agents/agents.py:157 #: prewikka/views/datasearch/idmef.py:158 #: prewikka/views/messagesummary/messagesummary.py:332 msgid "IDMEF_VIEW" msgstr "IDMEF VIEW" #: prewikka/views/agents/agents.py:133 #: prewikka/views/datasearch/heartbeat.py:55 msgid "Monitoring" msgstr "" #: prewikka/views/agents/agents.py:142 msgid "IDMEF_ALTER" msgstr "IDMEF ALTER" #: prewikka/views/agents/agents.py:184 msgid "Normal sensor start" msgstr "" #: prewikka/views/agents/agents.py:186 msgid "Unexpected sensor restart" msgstr "" #: prewikka/views/agents/agents.py:192 #, python-format msgid "Unexpected heartbeat interval: %(delta)s" msgstr "" #: prewikka/views/agents/agents.py:195 msgid "Normal sensor stop" msgstr "" #: prewikka/views/agents/agents.py:207 #, python-format msgid "Sensor is down since %s" msgstr "" #: prewikka/views/agents/agents.py:216 #, python-format msgid "" "No anomaly in the last %(count)d heartbeats (one heartbeat every " "%(delta)s average)" msgstr "" #: prewikka/views/agents/templates/agents.mak:24 msgid "Show/Hide all" msgstr "" #: prewikka/views/agents/templates/agents.mak:24 msgid "Search:" msgstr "" #: prewikka/views/agents/templates/agents.mak:30 msgid "Location" msgstr "" #: prewikka/views/agents/templates/agents.mak:31 msgid "Node" msgstr "" #: prewikka/views/agents/templates/agents.mak:32 #: prewikka/views/agents/templates/heartbeatanalyze.mak:20 #: prewikka/views/datasearch/heartbeat.py:67 #: prewikka/views/messagesummary/messagesummary.py:424 msgid "Model" msgstr "" #: prewikka/views/agents/templates/agents.mak:34 #: prewikka/views/messagesummary/messagesummary.py:428 msgid "Class" msgstr "" #: prewikka/views/agents/templates/agents.mak:38 #: prewikka/views/agents/templates/heartbeatanalyze.mak:25 msgid "Latest heartbeat" msgstr "" #: prewikka/views/agents/templates/agents.mak:39 msgid "Status" msgstr "" #: prewikka/views/agents/templates/agents.mak:83 msgid "Delete the alerts of the selected agent(s)" msgstr "" #: prewikka/views/agents/templates/agents.mak:87 msgid "Delete the heartbeats of the selected agent(s)" msgstr "" #: prewikka/views/agents/templates/agents.mak:89 msgid "Delete the selected IDMEF messages?" msgstr "" #: prewikka/views/agents/templates/agents.mak:89 #: prewikka/views/datasearch/idmef.py:195 #: prewikka/views/filter/templates/filterlisting.mak:42 msgid "Delete" msgstr "" #: prewikka/views/agents/templates/heartbeatanalyze.mak:21 msgid "OS" msgstr "" #: prewikka/views/agents/templates/heartbeatanalyze.mak:22 #: prewikka/views/datasearch/heartbeat.py:66 #: prewikka/views/messagesummary/messagesummary.py:412 msgid "Node name" msgstr "" #: prewikka/views/agents/templates/heartbeatanalyze.mak:23 #: prewikka/views/messagesummary/messagesummary.py:395 msgid "Node location" msgstr "" #: prewikka/views/agents/templates/heartbeatanalyze.mak:24 #: prewikka/views/datasearch/heartbeat.py:65 #: prewikka/views/messagesummary/messagesummary.py:418 msgid "Node address" msgstr "" #: prewikka/views/agents/templates/heartbeatanalyze.mak:26 msgid "Current status" msgstr "" #: prewikka/views/agents/templates/heartbeatanalyze.mak:56 msgid "Events" msgstr "" #: prewikka/views/crontab/__init__.py:30 msgid "Scheduling management" msgstr "" #: prewikka/views/crontab/__init__.py:35 msgid "Scheduled jobs management page" msgstr "" #: prewikka/views/crontab/__init__.py:62 msgid "Configuration" msgstr "" #: prewikka/views/crontab/__init__.py:62 msgid "Scheduling" msgstr "" #: prewikka/views/crontab/__init__.py:75 prewikka/views/crontab/__init__.py:104 msgid "SYSTEM" msgstr "" #: prewikka/views/crontab/__init__.py:88 msgid "Pending" msgstr "" #: prewikka/views/crontab/__init__.py:98 msgid "Error" msgstr "" #: prewikka/views/crontab/templates/cronjob.mak:54 msgid "Schedule:" msgstr "" #: prewikka/views/crontab/templates/cronjob.mak:69 msgid "custom" msgstr "" #: prewikka/views/crontab/templates/cronjob.mak:70 msgid "disabled" msgstr "" #: prewikka/views/crontab/templates/cronjob.mak:79 msgid "Minute:" msgstr "" #: prewikka/views/crontab/templates/cronjob.mak:83 msgid "Hour:" msgstr "" #: prewikka/views/crontab/templates/cronjob.mak:87 msgid "Day:" msgstr "" #: prewikka/views/crontab/templates/cronjob.mak:91 msgid "Month:" msgstr "" #: prewikka/views/crontab/templates/cronjob.mak:95 msgid "Weekday:" msgstr "" #: prewikka/views/crontab/templates/cronjob.mak:107 msgid "Edit Job" msgstr "" #: prewikka/views/crontab/templates/cronjob.mak:112 #: prewikka/views/filter/templates/filteredition.mak:73 #: prewikka/views/usermanagement/templates/usersettings.mak:13 msgid "Name:" msgstr "" #: prewikka/views/crontab/templates/cronjob.mak:123 #: prewikka/views/filter/templates/filteredition.mak:123 #: prewikka/views/usermanagement/templates/usersettings.mak:61 msgid "Save" msgstr "" #: prewikka/views/crontab/templates/crontab.mak:15 msgid "Scheduled Jobs" msgstr "" #: prewikka/views/crontab/templates/crontab.mak:18 msgid "Schedule" msgstr "" #: prewikka/views/crontab/templates/crontab.mak:19 msgid "User" msgstr "" #: prewikka/views/crontab/templates/crontab.mak:20 msgid "Last execution" msgstr "" #: prewikka/views/crontab/templates/crontab.mak:21 msgid "Next execution" msgstr "" #: prewikka/views/crontab/templates/crontab.mak:69 msgid "Disable" msgstr "" #: prewikka/views/crontab/templates/crontab.mak:70 msgid "Enable" msgstr "" #: prewikka/views/datasearch/alert.py:71 msgid "Alert listing page" msgstr "" #: prewikka/views/datasearch/alert.py:76 msgid "Aggregated alerts" msgstr "" #: prewikka/views/datasearch/alert.py:87 #: prewikka/views/datasearch/heartbeat.py:63 #: prewikka/views/datasearch/threat.py:74 msgid "Date" msgstr "" #: prewikka/views/datasearch/alert.py:89 prewikka/views/datasearch/threat.py:76 msgid "Source" msgstr "" #: prewikka/views/datasearch/alert.py:90 prewikka/views/datasearch/threat.py:77 msgid "Target" msgstr "" #: prewikka/views/datasearch/alert.py:91 msgid "Analyzer" msgstr "" #: prewikka/views/datasearch/alert.py:94 msgid "Delete the selected alerts?" msgstr "" #: prewikka/views/datasearch/alert.py:148 #: prewikka/views/idmefnav/__init__.py:44 msgid "IDMEF" msgstr "" #: prewikka/views/datasearch/datasearch.py:48 msgid "minute" msgstr "" #: prewikka/views/datasearch/datasearch.py:48 msgid "hour" msgstr "" #: prewikka/views/datasearch/datasearch.py:48 msgid "day" msgstr "" #: prewikka/views/datasearch/datasearch.py:48 msgid "month" msgstr "" #: prewikka/views/datasearch/datasearch.py:48 msgid "year" msgstr "" #: prewikka/views/datasearch/datasearch.py:161 msgid "Time group error" msgstr "" #: prewikka/views/datasearch/datasearch.py:161 msgid "Only one time unit can be specified in a groupby query" msgstr "" #: prewikka/views/datasearch/datasearch.py:446 msgid "Forensic" msgstr "" #: prewikka/views/datasearch/datasearch.py:446 msgid "Dashboard" msgstr "" #: prewikka/views/datasearch/datasearch.py:490 msgid "CSV export" msgstr "" #: prewikka/views/datasearch/datasearch.py:622 msgid "General" msgstr "" #: prewikka/views/datasearch/heartbeat.py:51 msgid "Heartbeat listing page" msgstr "" #: prewikka/views/datasearch/heartbeat.py:56 msgid "Aggregated heartbeats" msgstr "" #: prewikka/views/datasearch/heartbeat.py:64 msgid "Agent" msgstr "" #: prewikka/views/datasearch/heartbeat.py:69 msgid "Delete the selected heartbeats?" msgstr "" #: prewikka/views/datasearch/idmef.py:46 msgid "See IDMEF details" msgstr "" #: prewikka/views/datasearch/threat.py:66 msgid "Threat listing page" msgstr "" #: prewikka/views/datasearch/threat.py:69 #: prewikka/views/datasearch/threat.py:70 msgid "Threats" msgstr "" #: prewikka/views/datasearch/threat.py:70 msgid "Aggregated threats" msgstr "" #: prewikka/views/datasearch/threat.py:78 msgid "Program" msgstr "" #: prewikka/views/datasearch/templates/details.mak:26 #, python-format msgid "Group by %s" msgstr "" #: prewikka/views/datasearch/templates/details.mak:30 #: prewikka/views/datasearch/templates/forensic.mak:219 msgid "Add to search" msgstr "" #: prewikka/views/datasearch/templates/details.mak:31 #: prewikka/views/datasearch/templates/forensic.mak:220 msgid "Exclude from search" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:9 msgid "Fields" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:10 msgid "Query history" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:63 msgid "Chart type" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:73 msgid "Limit" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:89 msgid "Expert mode" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:96 msgid "Condensed mode" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:108 msgid "Search mode" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:112 #: prewikka/views/datasearch/templates/forensic.mak:217 msgid "Search" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:114 msgid "Reset search" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:124 #: prewikka/views/datasearch/templates/forensic.mak:222 msgid "Group by" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:125 msgid "Select your field" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:126 msgid "Time values" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:131 #, python-format msgid "%s fields" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:167 msgid "Timeline" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:221 msgid "New search" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:231 #: prewikka/views/messagesummary/messagesummary.py:1026 msgid "Actions" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:244 msgid "Informations" msgstr "" #: prewikka/views/datasearch/templates/infos.mak:3 msgid "Field" msgstr "" #: prewikka/views/datasearch/templates/infos.mak:9 msgid "Occurrence" msgstr "" #: prewikka/views/datasearch/templates/table.mak:12 msgid "Count" msgstr "" #: prewikka/views/filter/__init__.py:11 msgid "Filters management page" msgstr "" #: prewikka/views/filter/filter.py:113 #: prewikka/views/usermanagement/usermanagement.py:18 msgid "Preferences" msgstr "" #: prewikka/views/filter/filter.py:113 #: prewikka/views/filter/templates/filterlisting.mak:17 msgid "Filters" msgstr "" #: prewikka/views/filter/filter.py:124 #: prewikka/views/filter/templates/filteredition.mak:66 #, python-format msgid "Filter %s" msgstr "" #: prewikka/views/filter/filter.py:199 msgid "Filter error" msgstr "" #: prewikka/views/filter/filter.py:199 #, python-format msgid "Filter '%s' does not exist" msgstr "" #: prewikka/views/filter/filter.py:236 prewikka/views/filter/filter.py:248 msgid "Could not save filter" msgstr "" #: prewikka/views/filter/filter.py:236 msgid "No name for this filter was provided" msgstr "" #: prewikka/views/filter/filter.py:248 msgid "The filter name is already used by another filter" msgstr "" #: prewikka/views/filter/templates/filteredition.mak:66 #: prewikka/views/filter/templates/filterlisting.mak:17 #: prewikka/views/filter/templates/menu.mak:48 msgid "New filter" msgstr "" #: prewikka/views/filter/templates/filteredition.mak:75 msgid "Filter name" msgstr "" #: prewikka/views/filter/templates/filteredition.mak:80 msgid "Category:" msgstr "" #: prewikka/views/filter/templates/filteredition.mak:92 msgid "Description:" msgstr "" #: prewikka/views/filter/templates/filterlisting.mak:24 #: prewikka/views/messagesummary/messagesummary.py:750 msgid "Category" msgstr "" #: prewikka/views/filter/templates/filterlisting.mak:40 msgid "Create" msgstr "" #: prewikka/views/filter/templates/filterlisting.mak:41 msgid "Duplicate" msgstr "" #: prewikka/views/filter/templates/filterlisting.mak:42 msgid "Delete the selected filters?" msgstr "" #: prewikka/views/filter/templates/menu.mak:4 msgid "Filter:" msgstr "" #: prewikka/views/filter/templates/menu.mak:38 msgid "Available filters" msgstr "" #: prewikka/views/filter/templates/menu.mak:46 msgid "No filter" msgstr "" #: prewikka/views/filter/templates/menu.mak:51 msgid "No category" msgstr "" #: prewikka/views/filter/templates/widget.mak:7 msgid "Select a path..." msgstr "" #: prewikka/views/filter/templates/widget.mak:9 msgid "Default paths" msgstr "" #: prewikka/views/filter/templates/widget.mak:15 msgid "All paths" msgstr "" #: prewikka/views/filter/templates/widget.mak:25 #: prewikka/views/filter/templates/widget.mak:46 msgid "Change operator" msgstr "" #: prewikka/views/filter/templates/widget.mak:32 msgid "value" msgstr "" #: prewikka/views/filter/templates/widget.mak:34 msgid "Delete condition" msgstr "" #: prewikka/views/filter/templates/widget.mak:42 msgid "AND" msgstr "" #: prewikka/views/filter/templates/widget.mak:42 msgid "OR" msgstr "" #: prewikka/views/filter/templates/widget.mak:56 msgid "Add condition" msgstr "" #: prewikka/views/filter/templates/widget.mak:57 msgid "Add group" msgstr "" #: prewikka/views/filter/templates/widget.mak:59 msgid "Delete group" msgstr "" #: prewikka/views/idmefnav/__init__.py:36 msgid "IDMEF navigator" msgstr "" #: prewikka/views/idmefnav/__init__.py:44 msgid "Help" msgstr "" #: prewikka/views/idmefnav/templates/idmefnav.mak:12 msgid "Children" msgstr "" #: prewikka/views/idmefnav/templates/idmefnav.mak:20 msgid "Aggregates" msgstr "" #: prewikka/views/idmefnav/templates/idmefnav.mak:36 msgid "Attributes" msgstr "" #: prewikka/views/idmefnav/templates/idmefnav.mak:54 msgid "Rank" msgstr "" #: prewikka/views/idmefnav/templates/idmefnav.mak:55 msgid "Keyword" msgstr "" #: prewikka/views/messagesummary/__init__.py:13 msgid "Detailed alert and heartbeat page" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:289 #: prewikka/views/messagesummary/messagesummary.py:578 msgid "Code" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:290 msgid "Data length" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:291 msgid "Data" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:365 #, python-format msgid "(agent local time: %s)" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:372 #: prewikka/views/messagesummary/messagesummary.py:835 msgid "Create time" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:375 msgid "Detect time" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:380 msgid "Analyzer time" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:386 msgid "Process" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:387 msgid "Process Path" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:388 msgid "Process PID" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:415 msgid "Node name (resolved)" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:426 msgid "Analyzerid" msgstr "Analyzer ID" #: prewikka/views/messagesummary/messagesummary.py:430 msgid "Manufacturer" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:438 msgid "Operating System" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:456 #, python-format msgid "Analyzer Path (%d not shown)" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:463 #: prewikka/views/messagesummary/messagesummary.py:1035 #: prewikka/views/messagesummary/messagesummary.py:1106 #, python-format msgid "Analyzer #%d" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:473 msgid "Additional data" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:476 #: prewikka/views/messagesummary/messagesummary.py:717 msgid "Meaning" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:477 msgid "Value" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:531 #: prewikka/views/messagesummary/messagesummary.py:552 msgid "Header length" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:532 msgid "TOS" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:533 #: prewikka/views/messagesummary/messagesummary.py:571 msgid "Length" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:534 #: prewikka/views/messagesummary/messagesummary.py:580 msgid "Id" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:538 msgid "Ip offset" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:539 msgid "TTL" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:540 #: prewikka/views/messagesummary/messagesummary.py:926 #: prewikka/views/messagesummary/messagesummary.py:929 #: prewikka/views/messagesummary/messagesummary.py:932 msgid "Protocol" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:541 #: prewikka/views/messagesummary/messagesummary.py:563 #: prewikka/views/messagesummary/messagesummary.py:572 #: prewikka/views/messagesummary/messagesummary.py:579 msgid "Checksum" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:542 msgid "Source address" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:543 msgid "Target address" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:553 msgid "Reserved" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:562 msgid "Window" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:564 msgid "URP" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:577 #: prewikka/views/messagesummary/messagesummary.py:744 #: prewikka/views/messagesummary/messagesummary.py:777 #: prewikka/views/messagesummary/messagesummary.py:796 msgid "Type" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:581 msgid "Seq #" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:582 msgid "Mask" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:583 msgid "Gateway Address" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:584 msgid "Num address" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:585 msgid "Wpa" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:586 msgid "Lifetime" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:587 msgid "Otime" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:588 msgid "Rtime" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:589 msgid "Ttime" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:595 #: prewikka/views/messagesummary/messagesummary.py:1082 msgid "Payload" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:648 msgid "Alert details" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:653 #, python-format msgid "%d linked alerts missing (probably deleted)" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:657 #, python-format msgid "%d linked alerts omitted" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:674 #: prewikka/views/messagesummary/messagesummary.py:991 msgid "Correlation Alert" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:680 msgid "Correlated Alerts" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:681 #: prewikka/views/messagesummary/messagesummary.py:698 msgid "Source Analyzer" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:691 #: prewikka/views/messagesummary/messagesummary.py:994 msgid "Tool Alert" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:697 msgid "Linked Alerts" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:708 msgid "Text" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:710 msgid "Ident" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:715 msgid "Origin" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:738 msgid "Severity" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:741 msgid "Completion" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:774 msgid "User category" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:779 #: prewikka/views/messagesummary/messagesummary.py:798 msgid "Number" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:780 msgid "Tty" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:799 msgid "Permission" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:821 msgid "Change time" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:822 msgid "Inode Number" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:823 msgid "Major device" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:824 msgid "Minor device" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:825 msgid "C Major device" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:826 msgid "C Minor device" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:830 #, python-format msgid "Target file %s" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:830 msgid "category" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:834 msgid "Path" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:836 msgid "Modify time" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:837 msgid "Access time" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:838 msgid "Data size" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:839 msgid "Disk size" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:858 msgid "Web Service" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:861 msgid "Url" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:862 msgid "Cgi" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:863 msgid "Http Method" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:866 msgid "CGI Argument" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:875 msgid "SNMP Service" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:878 msgid "oid" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:879 msgid "messageProcessingModel" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:880 msgid "securityModel" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:881 msgid "securityName" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:882 msgid "securityLevel" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:883 msgid "contextName" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:884 msgid "contextEngineID" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:885 msgid "command" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:897 #: prewikka/views/messagesummary/messagesummary.py:899 msgid "Port" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:919 msgid "PortList" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:922 msgid "ip_version" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:958 #, python-format msgid "Source(%d)" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:973 #, python-format msgid "Target(%d)" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:997 msgid "Overflow Alert" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:1000 msgid "Alert" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:1018 msgid "MessageID" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:1065 msgid "Network centric information" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:1087 msgid "ASCII Payload" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:1103 msgid "Heartbeat" msgstr "" #: prewikka/views/messagesummary/templates/messagesummary.mak:85 msgid "Summary" msgstr "" #: prewikka/views/usermanagement/__init__.py:14 msgid "User settings page" msgstr "" #: prewikka/views/usermanagement/usermanagement.py:18 msgid "My account" msgstr "" #: prewikka/views/usermanagement/usermanagement.py:23 msgid "Invalid User" msgstr "" #: prewikka/views/usermanagement/usermanagement.py:23 #, python-format msgid "Requested user '%s' does not exist" msgstr "" #: prewikka/views/usermanagement/usermanagement.py:43 msgid "Invalid Language" msgstr "" #: prewikka/views/usermanagement/usermanagement.py:43 msgid "Specified language does not exist" msgstr "" #: prewikka/views/usermanagement/usermanagement.py:47 msgid "Invalid Timezone" msgstr "" #: prewikka/views/usermanagement/usermanagement.py:47 msgid "Specified timezone does not exist" msgstr "" #: prewikka/views/usermanagement/templates/usersettings.mak:6 msgid "Login:" msgstr "" #: prewikka/views/usermanagement/templates/usersettings.mak:20 msgid "Email:" msgstr "" #: prewikka/views/usermanagement/templates/usersettings.mak:22 msgid "Email" msgstr "" #: prewikka/views/usermanagement/templates/usersettings.mak:27 msgid "Language:" msgstr "" #: prewikka/views/usermanagement/templates/usersettings.mak:39 msgid "Theme:" msgstr "" #: prewikka/views/usermanagement/templates/usersettings.mak:50 msgid "Timezone:" msgstr "" #: scripts/prewikka-cli:59 msgid "Unknown command" msgstr "" #: scripts/prewikka-cli:67 #, python-format msgid "An unexpected error occurred: %s" msgstr "" #: scripts/prewikka-cli:154 msgid "Create an object of the specified type" msgstr "" #: scripts/prewikka-cli:157 msgid "Delete an object of the specified type" msgstr "" #: scripts/prewikka-cli:160 msgid "Import objects of the specified type from files" msgstr "" #: scripts/prewikka-cli:163 msgid "List objects of the specified type" msgstr "" #: scripts/prewikka-cli:166 msgid "Synchronize objects of the specified type" msgstr "" #: scripts/prewikka-cli:169 msgid "Update objects of the specified type" msgstr "" #: scripts/prewikka-cli:207 msgid "Prewikka command-line tool" msgstr "" #: scripts/prewikka-cli:208 msgid "name of the user" msgstr "" #: scripts/prewikka-cli:209 scripts/prewikka-crontab:99 #: scripts/prewikka-httpd:93 #, python-format msgid "configuration file to use (default: %(default)s)" msgstr "" #: scripts/prewikka-cli:210 msgid "command to execute" msgstr "" #: scripts/prewikka-cli:211 msgid "enable debugging output" msgstr "" #: scripts/prewikka-cli:218 msgid "prewikka-cli must be executed as the prewikka user" msgstr "" #: scripts/prewikka-cli:243 #, python-format msgid "Prewikka command-line tool (%s)" msgstr "" #: scripts/prewikka-cli:244 msgid "Type \"help\" or \"?\" to list commands" msgstr "" #: scripts/prewikka-crontab:100 msgid "run as a system daemon" msgstr "" #: scripts/prewikka-crontab:101 scripts/prewikka-httpd:96 msgid "show this help message and exit" msgstr "" #: scripts/prewikka-crontab:102 scripts/prewikka-httpd:97 msgid "show program's version number and exit" msgstr "" #: scripts/prewikka-httpd:88 msgid "root where the server is accessible" msgstr "" #: scripts/prewikka-httpd:89 #, python-format msgid "IP to bind to (default: %(default)s)" msgstr "" #: scripts/prewikka-httpd:90 #, python-format msgid "port number to use (default: %(default)d)" msgstr "" #: scripts/prewikka-httpd:91 msgid "SSL private key to use (default: no SSL)" msgstr "" #: scripts/prewikka-httpd:92 msgid "SSL certificate to use (default: no SSL)" msgstr "" #: scripts/prewikka-httpd:95 #, python-format msgid "" "number of processes to use. Default value matches the number of available" " CPUs (i.e. %d)" msgstr "" prewikka-5.1.1/prewikka/locale/es/0000775000175000017500000000000013555143705020432 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/locale/es/LC_MESSAGES/0000775000175000017500000000000013555143705022217 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/locale/es/LC_MESSAGES/prewikka.po0000664000175000017500000016204513555143652024405 0ustar tandrejatandreja00000000000000# Spanish translation for Prewikka # Copyright (C) 2007-2019 CS-SI # This file is distributed under the same license as the prewikka package. # Carlo G. Añez M. , 2007. # msgid "" msgstr "" "Project-Id-Version: Prewikka 5.1.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-09-04 19:03+0200\n" "PO-Revision-Date: 2018-02-09 12:07+0100\n" "Last-Translator: Carlo Anez \n" "Language-Team: Spanish\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 0.9.6\n" #: prewikka/baseview.py:79 prewikka/usergroup.py:52 msgid "Permission Denied" msgstr "Permiso Denegado" #: prewikka/baseview.py:79 msgid "Missing permission to access the specified file" msgstr "" #: prewikka/config.py:37 prewikka/dataprovider/__init__.py:645 #, fuzzy msgid "Configuration error" msgstr "Alerta de correlación" #: prewikka/config.py:43 #, python-format msgid "Parse error in \"%(txt)s\" at %(file)s line %(line)d" msgstr "" #: prewikka/config.py:48 prewikka/view.py:82 #, python-format msgid "Invalid value '%(value)s' for parameter '%(name)s'" msgstr "" #: prewikka/config.py:54 #, python-format msgid "Missing value for parameter '%(name)s'" msgstr "" #: prewikka/crontab.py:37 msgid "Hourly" msgstr "Cada hora" #: prewikka/crontab.py:38 msgid "Daily" msgstr "Diario" #: prewikka/crontab.py:39 msgid "Weekly" msgstr "Semanal" #: prewikka/crontab.py:40 msgid "Monthly" msgstr "Mensual" #: prewikka/crontab.py:41 msgid "Yearly" msgstr "Anual" #: prewikka/crontab.py:42 prewikka/mainmenu.py:302 #: prewikka/templates/mainmenu.mak:92 msgid "Custom" msgstr "Personalizado" #: prewikka/crontab.py:43 prewikka/views/crontab/__init__.py:84 msgid "Disabled" msgstr "Desactivado" #: prewikka/crontab.py:105 msgid "Scheduled job execution failed" msgstr "" #: prewikka/crontab.py:139 msgid "Invalid job extension" msgstr "" #: prewikka/crontab.py:139 #, python-format msgid "Scheduled job with invalid extension type '%s'" msgstr "" #: prewikka/crontab.py:206 #, fuzzy msgid "Invalid CronJob" msgstr "Zona horaria no válida" #: prewikka/crontab.py:206 #, python-format msgid "CronJob with id=%d cannot be found in database" msgstr "" #: prewikka/crontab.py:260 #, fuzzy msgid "Invalid schedule" msgstr "Idioma:" #: prewikka/crontab.py:260 msgid "The specified job schedule is invalid" msgstr "" #: prewikka/crontab.py:286 #, python-format msgid "Custom (%s)" msgstr "Personalizado (%s)" #: prewikka/database.py:43 msgid "Database error" msgstr "" #: prewikka/database.py:50 msgid "Database schema error" msgstr "" #: prewikka/database.py:293 msgid "database installation required" msgstr "" #: prewikka/database.py:296 msgid "database activation required" msgstr "" #: prewikka/database.py:299 #, python-format msgid "database schema branch %(required)s required (found %(current)s)" msgstr "" #: prewikka/database.py:305 #, python-format msgid "database schema version %(required)s required (found %(current)s)" msgstr "" #: prewikka/database.py:372 msgid "Database installation error" msgstr "" #: prewikka/database.py:374 #, python-format msgid "" "No database installation script found for module %(module)s, version " "%(version)s" msgstr "" #: prewikka/database.py:382 prewikka/database.py:420 msgid "Database migration error" msgstr "" #: prewikka/database.py:386 #, python-format msgid "" "No database branch migration script found for module %(module)s, branch " "transition %(current)s -> %(required)s" msgstr "" #: prewikka/database.py:424 #, python-format msgid "" "No linear migration script found for module %(module)s %(version1)s -> " "%(version2)s" msgstr "" #: prewikka/database.py:841 #, fuzzy msgid "Database configuration error" msgstr "Alerta de correlación" #: prewikka/database.py:841 msgid "Only MySQL and PostgreSQL databases are supported at the moment" msgstr "" #: prewikka/error.py:48 prewikka/templates/error.mak:139 msgid "An unexpected condition happened" msgstr "" #: prewikka/error.py:148 msgid "Not implemented" msgstr "" #: prewikka/error.py:150 msgid "Backend does not implement this operation" msgstr "" #: prewikka/history.py:32 msgid "Search history deletion" msgstr "" #: prewikka/localization.py:143 msgid "%m/%Y" msgstr "%m/%Y" #: prewikka/localization.py:144 #, python-format msgid "%m/%d/%Y" msgstr "%d/%m/%Y" #: prewikka/localization.py:145 #, python-format msgid "%m/%d/%Y %Hh" msgstr "%d/%m/%Y %Hh" #: prewikka/localization.py:146 #, python-format msgid "%m/%d/%Y %H:%M" msgstr "%d/%m/%Y %H:%M" #: prewikka/localization.py:147 #, python-format msgid "%m/%d/%Y %H:%M:%S" msgstr "%d/%m/%Y %H:%M:%S" #: prewikka/localization.py:149 msgid "%H:%M" msgstr "%H:%M" #: prewikka/localization.py:150 msgid "%H:%M:%S" msgstr "%H:%M:%S" #: prewikka/localization.py:235 prewikka/localization.py:253 #: prewikka/renderer/__init__.py:62 prewikka/views/crontab/__init__.py:95 msgid "n/a" msgstr "" #: prewikka/localization.py:246 #, python-format msgid "%(days)dd %(hours)dh %(minutes)d'" msgstr "" #: prewikka/main.py:45 msgid "Version Requirement error" msgstr "" #: prewikka/main.py:48 #, python-format msgid "Prewikka %(vPre)s requires libprelude %(vLib)s or higher" msgstr "" #: prewikka/main.py:53 #, python-format msgid "Prewikka %(vPre)s requires libpreludedb %(vLib)s or higher" msgstr "" #: prewikka/main.py:136 prewikka/main.py:149 #: prewikka/dataprovider/plugins/idmef/__init__.py:57 msgid "Initialization error" msgstr "" #: prewikka/main.py:150 #, python-format msgid "" "Cannot use %(type)s mode '%(name)s', please contact your local " "administrator." msgstr "" #: prewikka/main.py:192 #, python-format msgid "Session '%s' does not accept any authentication module" msgstr "" #: prewikka/main.py:298 #, python-format msgid "An unexpected condition happened while trying to load %s" msgstr "" #: prewikka/mainmenu.py:114 #, python-format msgid "%S.%.6f" msgstr "" #: prewikka/mainmenu.py:115 #, python-format msgid "%S.%.3f" msgstr "" #: prewikka/mainmenu.py:260 msgid "Today" msgstr "Hoy" #: prewikka/mainmenu.py:261 msgid "Yesterday" msgstr "Ayer" #: prewikka/mainmenu.py:262 msgid "This week" msgstr "Esta semana" #: prewikka/mainmenu.py:263 msgid "Last week" msgstr "La semana pasada" #: prewikka/mainmenu.py:264 msgid "This month" msgstr "Este mes" #: prewikka/mainmenu.py:265 msgid "Last month" msgstr "El mes pasado" #: prewikka/mainmenu.py:266 prewikka/mainmenu.py:267 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d hora" msgstr[1] "%d horas" #: prewikka/mainmenu.py:268 prewikka/mainmenu.py:269 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d día" msgstr[1] "%d días" #: prewikka/mainmenu.py:270 #, python-format msgid "%d week" msgid_plural "%d weeks" msgstr[0] "%d semana" msgstr[1] "%d semanas" #: prewikka/mainmenu.py:271 prewikka/mainmenu.py:272 #, python-format msgid "%d month" msgid_plural "%d months" msgstr[0] "%d mes" msgstr[1] "%d meses" #: prewikka/mainmenu.py:273 #, python-format msgid "%d year" msgid_plural "%d years" msgstr[0] "%d año" msgstr[1] "%d años" #: prewikka/mainmenu.py:277 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d segundo" msgstr[1] "%d segundos" #: prewikka/mainmenu.py:278 prewikka/mainmenu.py:279 prewikka/mainmenu.py:280 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d minuto" msgstr[1] "%d minutos" #: prewikka/mainmenu.py:299 prewikka/templates/mainmenu.mak:61 msgid "Inactive" msgstr "Inactivo" #: prewikka/mainmenu.py:305 prewikka/templates/mainmenu.mak:89 #, fuzzy msgid "None" msgstr "Telefono:" #: prewikka/menu.py:70 prewikka/menu.py:73 prewikka/menu.py:79 #: prewikka/menu.py:83 prewikka/menu.py:91 #, fuzzy msgid "Menu error" msgstr "Alerta de correlación" #: prewikka/menu.py:70 msgid "The provided YAML menu is invalid" msgstr "" #: prewikka/menu.py:73 msgid "Empty menu" msgstr "" #: prewikka/menu.py:79 #, python-format msgid "Menu without a name in %s" msgstr "" #: prewikka/menu.py:83 msgid "Multiple default menus" msgstr "" #: prewikka/menu.py:91 msgid "Multiple default views" msgstr "" #: prewikka/pluginmanager.py:163 #, python-format msgid "Circular dependencies detected: %s" msgstr "" #: prewikka/pluginmanager.py:171 #, python-format msgid "Missing dependency: %s" msgstr "" #: prewikka/resolve.py:170 #, python-format msgid "" "Asynchronous DNS resolution disabled: twisted.names and twisted.internet " "required: %s" msgstr "" #: prewikka/usergroup.py:44 #, python-format msgid "Access to view '%(view)s' forbidden. Required permissions: %(permissions)s" msgstr "El acceso a la vista '%(view)s' esta prohibida: %(permissions)s" #: prewikka/usergroup.py:47 #, python-format msgid "Access to view '%s' forbidden" msgstr "" #: prewikka/usergroup.py:50 #, python-format msgid "Required permissions: %s" msgstr "" #: prewikka/view.py:74 prewikka/view.py:81 prewikka/view.py:88 msgid "Parameters Normalization failed" msgstr "La normalización de los parámetros falló" #: prewikka/view.py:75 #, python-format msgid "Parameter '%s' is not valid" msgstr "" #: prewikka/view.py:89 #, python-format msgid "Required parameter '%s' is missing" msgstr "" #: prewikka/view.py:95 #, fuzzy msgid "Invalid method" msgstr "Zona horaria no valido" #: prewikka/view.py:102 #, fuzzy msgid "Invalid view" msgstr "Idioma:" #: prewikka/view.py:528 #, python-format msgid "Method '%(method)s' is not allowed for view '%(view)s'" msgstr "" #: prewikka/view.py:532 prewikka/view.py:651 #, python-format msgid "View '%s' does not exist" msgstr "" #: prewikka/auth/auth.py:30 msgid "Authentication failed" msgstr "Autenticación fallida" #: prewikka/dataprovider/__init__.py:35 msgid "Equal" msgstr "Igual" #: prewikka/dataprovider/__init__.py:36 msgid "Equal (case-insensitive)" msgstr "Igual (insensible)" #: prewikka/dataprovider/__init__.py:37 msgid "Not equal" msgstr "Diferente" #: prewikka/dataprovider/__init__.py:38 msgid "Not equal (case-insensitive)" msgstr "Diferente (insensible)" #: prewikka/dataprovider/__init__.py:39 msgid "Regular expression" msgstr "Expresión regular" #: prewikka/dataprovider/__init__.py:40 msgid "Regular expression (case-insensitive)" msgstr "Expresión regular (insensible)" #: prewikka/dataprovider/__init__.py:41 msgid "Not regular expression" msgstr "No expresión regular" #: prewikka/dataprovider/__init__.py:42 msgid "Not regular expression (case-insensitive)" msgstr "No expresión regular (insensible)" #: prewikka/dataprovider/__init__.py:43 msgid "Lesser than" msgstr "Menor que" #: prewikka/dataprovider/__init__.py:44 msgid "Lesser or equal" msgstr "Menor o igual" #: prewikka/dataprovider/__init__.py:45 msgid "Greater than" msgstr "Mayor que" #: prewikka/dataprovider/__init__.py:46 msgid "Greater or equal" msgstr "Mayor o igual" #: prewikka/dataprovider/__init__.py:47 msgid "Substring" msgstr "Subcadena" #: prewikka/dataprovider/__init__.py:48 msgid "Substring (case-insensitive)" msgstr "Subcadena (insensible)" #: prewikka/dataprovider/__init__.py:49 msgid "Not substring" msgstr "No subcadena" #: prewikka/dataprovider/__init__.py:50 msgid "Not substring (case-insensitive)" msgstr "No subcadena (insensible)" #: prewikka/dataprovider/__init__.py:92 prewikka/dataprovider/__init__.py:158 msgid "Conversion error" msgstr "Error de conversión" #: prewikka/dataprovider/__init__.py:93 prewikka/dataprovider/__init__.py:159 #, python-format msgid "Value %(value)r cannot be converted to %(type)s" msgstr "" #: prewikka/dataprovider/__init__.py:109 msgid "Backend error" msgstr "Error de backend" #: prewikka/dataprovider/__init__.py:109 #, python-format msgid "No backend available for '%s' datatype" msgstr "" #: prewikka/dataprovider/__init__.py:116 prewikka/dataprovider/__init__.py:123 msgid "Syntax error" msgstr "Error de sintaxis" #: prewikka/dataprovider/__init__.py:116 #, python-format msgid "Unknown path: %s" msgstr "Camino desconocido: %s" #: prewikka/dataprovider/__init__.py:123 scripts/prewikka-cli:109 #: scripts/prewikka-cli:118 scripts/prewikka-cli:129 msgid "Could not parse input" msgstr "" #: prewikka/dataprovider/__init__.py:635 #, python-format msgid "No handler configured for '%s' datatype" msgstr "" #: prewikka/dataprovider/__init__.py:646 #, python-format msgid "Only one manager should be configured for '%s' backend" msgstr "" #: prewikka/dataprovider/idmef.py:128 msgid "High" msgstr "Alta" #: prewikka/dataprovider/idmef.py:129 msgid "Medium" msgstr "Mediana" #: prewikka/dataprovider/idmef.py:130 msgid "Low" msgstr "Baja" #: prewikka/dataprovider/idmef.py:131 msgid "Informational" msgstr "Informativa" #: prewikka/dataprovider/idmef.py:141 msgid "Provides an API to fetch IDMEF alerts" msgstr "" #: prewikka/dataprovider/idmef.py:142 #: prewikka/views/agents/templates/agents.mak:83 #: prewikka/views/datasearch/alert.py:75 prewikka/views/datasearch/alert.py:76 msgid "Alerts" msgstr "Alertas" #: prewikka/dataprovider/idmef.py:149 prewikka/views/datasearch/alert.py:88 #: prewikka/views/datasearch/threat.py:75 msgid "Classification" msgstr "Clasificación" #: prewikka/dataprovider/idmef.py:150 msgid "Source IP" msgstr "IP de origen" #: prewikka/dataprovider/idmef.py:151 #: prewikka/views/messagesummary/messagesummary.py:548 #: prewikka/views/messagesummary/messagesummary.py:569 msgid "Source port" msgstr "Puerto de origen" #: prewikka/dataprovider/idmef.py:152 msgid "Target IP" msgstr "IP de destino" #: prewikka/dataprovider/idmef.py:153 #: prewikka/views/messagesummary/messagesummary.py:549 #: prewikka/views/messagesummary/messagesummary.py:570 msgid "Target port" msgstr "Puerto de destino" #: prewikka/dataprovider/idmef.py:154 msgid "Analyzer name" msgstr "Nombre del analizador" #: prewikka/dataprovider/idmef.py:157 #, fuzzy msgid "Alert deletion" msgstr "Lista de alertas" #: prewikka/dataprovider/idmef.py:182 msgid "Provides an API to fetch IDMEF heartbeats" msgstr "" #: prewikka/dataprovider/idmef.py:183 #: prewikka/views/agents/templates/agents.mak:87 #: prewikka/views/datasearch/heartbeat.py:56 msgid "Heartbeats" msgstr "Pulsos" #: prewikka/dataprovider/idmef.py:188 #, fuzzy msgid "Heartbeat deletion" msgstr "Lista de pulsos" #: prewikka/dataprovider/parsers/lucene/__init__.py:52 #, fuzzy msgid "Lucene emulation error" msgstr "Alerta de correlación" #: prewikka/dataprovider/parsers/lucene/__init__.py:53 msgid "" "This Lucene expression cannot be emulated properly using the Criterion " "backend" msgstr "" #: prewikka/dataprovider/plugins/idmef/__init__.py:97 msgid "Plugin for fetching IDMEF alerts from the Prelude database" msgstr "" #: prewikka/dataprovider/plugins/idmef/__init__.py:111 msgid "Plugin for fetching IDMEF heartbeats from the Prelude database" msgstr "" #: prewikka/plugins/warning/__init__.py:33 msgid "Prelude Warning message" msgstr "" #: prewikka/plugins/warning/templates/warning.mak:14 msgid "WARNING" msgstr "" #: prewikka/plugins/warning/templates/warning.mak:17 msgid "Prelude OSS is the open-source version of the Prelude SIEM" msgstr "" #: prewikka/plugins/warning/templates/warning.mak:21 #, python-format msgid "" "This OSS version has lower " "performance and less features than the Pro/Enterprise versions." msgstr "" #: prewikka/plugins/warning/templates/warning.mak:22 msgid "" "It is intended for tests and small environments, and should not be used " "in critical environments." msgstr "" #: prewikka/plugins/warning/templates/warning.mak:26 #, python-format msgid "Prelude OSS is distributed under the %s." msgstr "" #: prewikka/plugins/warning/templates/warning.mak:27 msgid "" "Products derivated from Prelude OSS modules are therefore subject to the " "terms of the GPLv2." msgstr "" #: prewikka/plugins/warning/templates/warning.mak:30 #: prewikka/templates/error.mak:171 prewikka/templates/toplayout.mak:62 #: prewikka/templates/toplayout.mak:77 prewikka/templates/toplayout.mak:94 #: prewikka/views/aboutplugin/templates/aboutplugin.mak:44 msgid "OK" msgstr "OK" #: prewikka/renderer/__init__.py:44 msgid "No data to display." msgstr "" #: prewikka/renderer/__init__.py:143 prewikka/renderer/__init__.py:147 #: prewikka/renderer/__init__.py:151 msgid "Renderer error" msgstr "Error de renderizador" #: prewikka/renderer/__init__.py:144 #, python-format msgid "No backend supporting render type '%s'" msgstr "" #: prewikka/renderer/__init__.py:148 #, python-format msgid "No backend named '%s'" msgstr "" #: prewikka/renderer/__init__.py:152 #, python-format msgid "Backend '%(backend)s' does not support render type '%(type)s'" msgstr "" #: prewikka/renderer/chartjs/__init__.py:104 msgid "ChartJS renderer backend" msgstr "" #: prewikka/renderer/chartjs/bar/__init__.py:38 msgid "ChartJS Bar renderer type" msgstr "" #: prewikka/renderer/chartjs/timeline/__init__.py:85 msgid "ChartJS Timebar renderer type" msgstr "" #: prewikka/session/session.py:39 msgid "Invalid session" msgstr "" #: prewikka/session/session.py:40 msgid "The session cookie carried by your browser is invalid" msgstr "" #: prewikka/session/session.py:44 msgid "Session expired" msgstr "Sesión expirada" #: prewikka/session/session.py:45 msgid "Your session has expired: please sign in again to continue using Prelude" msgstr "" #: prewikka/session/session.py:181 msgid "Logged out" msgstr "Desconectado" #: prewikka/session/anonymous/anonymous.py:31 #, fuzzy msgid "Anonymous authentication" msgstr "Autenticación fallida" #: prewikka/templates/baseview.mak:148 msgid "View options" msgstr "Opciones de vista" #: prewikka/templates/baseview.mak:151 msgid "View help" msgstr "Ayuda de vista" #: prewikka/templates/baseview.mak:205 msgid "This app has been disabled or failed to load." msgstr "" #: prewikka/templates/baseview.mak:211 prewikka/templates/baseview.mak:222 msgid "name" msgstr "nombre" #: prewikka/templates/baseview.mak:287 msgid "About" msgstr "Información" #: prewikka/templates/baseview.mak:290 msgid "Are you sure you want to log out?" msgstr "" #: prewikka/templates/baseview.mak:290 msgid "Logout" msgstr "Desconectarse" #: prewikka/templates/error.mak:66 msgid "Detail" msgstr "Detalle" #: prewikka/templates/error.mak:67 msgid "Copy to clipboard" msgstr "Copiar al portapapeles" #: prewikka/templates/error.mak:137 prewikka/templates/error.mak:145 msgid "Error: {0}" msgstr "Error: {0}" #: prewikka/templates/error.mak:155 msgid "This may be due to one or more of the following reasons:" msgstr "" #: prewikka/templates/error.mak:157 msgid "You don't have the required permissions." msgstr "" #: prewikka/templates/error.mak:158 #, python-format msgid "Required apps are disabled. See the %s page for more details." msgstr "" #: prewikka/templates/error.mak:176 prewikka/templates/toplayout.mak:61 #: prewikka/views/crontab/templates/cronjob.mak:122 #: prewikka/views/filter/templates/filteredition.mak:122 msgid "Cancel" msgstr "Cancelar" #: prewikka/templates/error.mak:177 msgid "Sign in" msgstr "" #: prewikka/templates/error.mak:181 msgid "Back" msgstr "" #: prewikka/templates/error.mak:184 msgid "Retry" msgstr "" #: prewikka/templates/error.mak:186 msgid "Redirect to main page" msgstr "" #: prewikka/templates/mainmenu.mak:44 msgid "Refresh:" msgstr "Refrescar:" #: prewikka/templates/mainmenu.mak:49 msgid "Update frequency of the current page" msgstr "Frecuencia de actualización de la página actual" #: prewikka/templates/mainmenu.mak:76 msgid "Period:" msgstr "Período:" #: prewikka/templates/mainmenu.mak:81 msgid "Period to visualize" msgstr "Período para visualizar" #: prewikka/templates/mainmenu.mak:111 msgid "Start:" msgstr "Comienzo:" #: prewikka/templates/mainmenu.mak:117 msgid "start" msgstr "comienzo" #: prewikka/templates/mainmenu.mak:117 msgid "Start date" msgstr "Fecha de inicio" #: prewikka/templates/mainmenu.mak:123 msgid "End:" msgstr "Fin:" #: prewikka/templates/mainmenu.mak:130 msgid "end" msgstr "fin" #: prewikka/templates/mainmenu.mak:130 msgid "End date" msgstr "Fecha final" #: prewikka/templates/toplayout.mak:57 msgid "Please Confirm" msgstr "" #: prewikka/templates/toplayout.mak:73 msgid "Prelude Dialog" msgstr "" #: prewikka/templates/toplayout.mak:88 msgid "Connection error" msgstr "Error de conexión" #: prewikka/templates/toplayout.mak:91 msgid "" "Connection failed, the server may be down or you may be experiencing " "network issues." msgstr "" #: prewikka/utils/misc.py:72 prewikka/views/agents/agents.py:45 msgid "Offline" msgstr "Desconectado" #: prewikka/utils/misc.py:75 prewikka/views/agents/agents.py:210 msgid "Unknown" msgstr "Desconocido" #: prewikka/utils/misc.py:78 msgid "Missing" msgstr "Desaparecido" #: prewikka/utils/misc.py:80 prewikka/views/agents/agents.py:44 msgid "Online" msgstr "Conectado" #: prewikka/views/about/__init__.py:13 msgid "Prelude About page" msgstr "" #: prewikka/views/about/templates/about.mak:11 #, python-format msgid "Prelude version %s" msgstr "" #: prewikka/views/about/templates/about.mak:15 msgid "Prelude is a SIEM (Security Information and Event Management)" msgstr "" #: prewikka/views/about/templates/about.mak:21 msgid "" "{prelude} is a security management solution that collects, filters, " "normalizes, correlates, stores and archives data from various sources of " "your information system. Based on all this information Prelude can " "provide a global vision of your system's security level and thus prevent " "attacks, intrusions as well as viral infections." msgstr "" #: prewikka/views/about/templates/about.mak:24 msgid "Prelude Team:" msgstr "" #: prewikka/views/about/templates/about.mak:25 msgid "" "Prelude OSS is an open-source project originally created by Yoann " "Vandoorselaere in 1998." msgstr "" #: prewikka/views/about/templates/about.mak:27 msgid "Vigilo is a NMS (Network Management System)" msgstr "" #: prewikka/views/about/templates/about.mak:33 msgid "" "{vigilo} is a complete monitoring and performance management solution " "capable of handling medium and large-scale systems (network - servers - " "applications) due to its distributed and modular architecture. Vigilo " "offers all the features required for performance supervision: states and " "alarms management, metrology, cartography, event correlation and " "reporting." msgstr "" #: prewikka/views/about/templates/about.mak:39 #, python-format msgid "" "Prelude SIEM and Vigilo NMS are being developed by the %s company, " "designer, integrator and operator of mission critical systems." msgstr "" #: prewikka/views/about/templates/about.mak:44 msgid "Contact" msgstr "Contacto" #: prewikka/views/about/templates/about.mak:46 msgid "Phone:" msgstr "Telefono:" #: prewikka/views/about/templates/about.mak:47 msgid "Fax:" msgstr "Fax:" #: prewikka/views/about/templates/about.mak:50 msgid "Office" msgstr "Oficina" #: prewikka/views/about/templates/about.mak:56 msgid "Websites" msgstr "Sitios Web" #: prewikka/views/about/templates/about.mak:67 #: prewikka/views/aboutplugin/templates/aboutplugin.mak:132 #: prewikka/views/agents/templates/heartbeatanalyze.mak:71 #: prewikka/views/messagesummary/templates/messagesummary.mak:93 msgid "Close" msgstr "Cerrar" #: prewikka/views/aboutplugin/__init__.py:36 msgid "Plugin installation and activation management page" msgstr "" #: prewikka/views/aboutplugin/__init__.py:40 #: prewikka/views/crontab/__init__.py:37 msgid "USER_MANAGEMENT" msgstr "" #: prewikka/views/aboutplugin/__init__.py:42 msgid "Apps: View" msgstr "" #: prewikka/views/aboutplugin/__init__.py:43 msgid "Apps: API" msgstr "" #: prewikka/views/aboutplugin/__init__.py:44 msgid "Apps: Dataprovider backend" msgstr "" #: prewikka/views/aboutplugin/__init__.py:45 msgid "Apps: Dataprovider type" msgstr "" #: prewikka/views/aboutplugin/__init__.py:46 #, fuzzy msgid "Apps: Authentication" msgstr "Autenticación fallida" #: prewikka/views/aboutplugin/__init__.py:47 msgid "Apps: Identification" msgstr "" #: prewikka/views/aboutplugin/__init__.py:48 msgid "Apps: Renderer backend" msgstr "" #: prewikka/views/aboutplugin/__init__.py:49 msgid "Apps: Renderer type" msgstr "" #: prewikka/views/aboutplugin/__init__.py:82 msgid "list plugin: list installed plugins" msgstr "" #: prewikka/views/aboutplugin/__init__.py:91 msgid "Apps" msgstr "Apps" #: prewikka/views/aboutplugin/__init__.py:120 msgid "sync plugin: initialize the plugin database schemas" msgstr "" #: prewikka/views/aboutplugin/__init__.py:134 #, python-format msgid "Applying %(module)s %(script)s..." msgstr "" #: prewikka/views/aboutplugin/__init__.py:144 msgid "All updates applied" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:44 msgid "ERROR" msgstr "ERROR" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:48 #, fuzzy msgid "Update failed" msgstr "fallido" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:111 #, fuzzy msgid "Update Dialog" msgstr "fallido" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:121 msgid "Plugin" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:122 #, fuzzy msgid "Script" msgstr "Descripción" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:123 msgid "Result" msgstr "Resultado" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:144 msgid "Plugin Maintenance" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:147 msgid "" "The following apps need to be updated before they can be loaded into the " "system" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:154 #: prewikka/views/aboutplugin/templates/aboutplugin.mak:190 #: prewikka/views/agents/templates/agents.mak:29 #: prewikka/views/agents/templates/heartbeatanalyze.mak:19 #: prewikka/views/crontab/templates/cronjob.mak:114 #: prewikka/views/crontab/templates/crontab.mak:17 #: prewikka/views/filter/templates/filterlisting.mak:23 #: prewikka/views/messagesummary/messagesummary.py:288 #: prewikka/views/messagesummary/messagesummary.py:425 #: prewikka/views/messagesummary/messagesummary.py:676 #: prewikka/views/messagesummary/messagesummary.py:693 #: prewikka/views/messagesummary/messagesummary.py:716 #: prewikka/views/messagesummary/messagesummary.py:778 #: prewikka/views/messagesummary/messagesummary.py:797 #: prewikka/views/messagesummary/messagesummary.py:833 #: prewikka/views/usermanagement/templates/usersettings.mak:15 msgid "Name" msgstr "Nombre" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:155 #: prewikka/views/aboutplugin/templates/aboutplugin.mak:191 #: prewikka/views/filter/templates/filterlisting.mak:28 #: prewikka/views/idmefnav/templates/idmefnav.mak:56 #: prewikka/views/messagesummary/messagesummary.py:745 #: prewikka/views/messagesummary/messagesummary.py:751 msgid "Description" msgstr "Descripción" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:156 #: prewikka/views/aboutplugin/templates/aboutplugin.mak:192 #: prewikka/views/agents/templates/agents.mak:33 #: prewikka/views/messagesummary/messagesummary.py:427 #: prewikka/views/messagesummary/messagesummary.py:530 msgid "Version" msgstr "Versión" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:157 msgid "Current database version" msgstr "Versión actual de la base de datos" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:158 msgid "Required database update" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:174 msgid "Install update" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:182 msgid "Installed Apps" msgstr "Apps instaladas" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:193 msgid "Database version" msgstr "Versión de la base de datos" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:194 msgid "Active" msgstr "Activo" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:215 msgid "Update the selected apps?" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:215 msgid "Update" msgstr "Actualizar" #: prewikka/views/agents/__init__.py:12 #, fuzzy msgid "Agents status information page" msgstr "Información de la dirección" #: prewikka/views/agents/agents.py:64 prewikka/views/agents/agents.py:133 msgid "Agents" msgstr "Agentes" #: prewikka/views/agents/agents.py:110 msgid "Node name n/a" msgstr "Nombre del nodo n/a" #: prewikka/views/agents/agents.py:111 #, fuzzy msgid "OS version n/a" msgstr "Sesión invalida" #: prewikka/views/agents/agents.py:112 msgid "OS type n/a" msgstr "" #: prewikka/views/agents/agents.py:117 msgid "Node location n/a" msgstr "Lugar del nodo n/a" #: prewikka/views/agents/agents.py:127 msgid "Alert listing" msgstr "Lista de alertas" #: prewikka/views/agents/agents.py:128 msgid "Heartbeat listing" msgstr "Lista de pulsos" #: prewikka/views/agents/agents.py:129 #: prewikka/views/agents/templates/heartbeatanalyze.mak:12 msgid "Heartbeat analysis" msgstr "Análisis de pulsos" #: prewikka/views/agents/agents.py:133 prewikka/views/agents/agents.py:157 #: prewikka/views/datasearch/idmef.py:158 #: prewikka/views/messagesummary/messagesummary.py:332 msgid "IDMEF_VIEW" msgstr "" #: prewikka/views/agents/agents.py:133 #: prewikka/views/datasearch/heartbeat.py:55 msgid "Monitoring" msgstr "Supervisión" #: prewikka/views/agents/agents.py:142 msgid "IDMEF_ALTER" msgstr "" #: prewikka/views/agents/agents.py:184 msgid "Normal sensor start" msgstr "" #: prewikka/views/agents/agents.py:186 msgid "Unexpected sensor restart" msgstr "" #: prewikka/views/agents/agents.py:192 #, python-format msgid "Unexpected heartbeat interval: %(delta)s" msgstr "" #: prewikka/views/agents/agents.py:195 msgid "Normal sensor stop" msgstr "" #: prewikka/views/agents/agents.py:207 #, python-format msgid "Sensor is down since %s" msgstr "" #: prewikka/views/agents/agents.py:216 #, python-format msgid "" "No anomaly in the last %(count)d heartbeats (one heartbeat every " "%(delta)s average)" msgstr "" #: prewikka/views/agents/templates/agents.mak:24 msgid "Show/Hide all" msgstr "" #: prewikka/views/agents/templates/agents.mak:24 msgid "Search:" msgstr "Buscar:" #: prewikka/views/agents/templates/agents.mak:30 msgid "Location" msgstr "Localización" #: prewikka/views/agents/templates/agents.mak:31 msgid "Node" msgstr "Nodo" #: prewikka/views/agents/templates/agents.mak:32 #: prewikka/views/agents/templates/heartbeatanalyze.mak:20 #: prewikka/views/datasearch/heartbeat.py:67 #: prewikka/views/messagesummary/messagesummary.py:424 msgid "Model" msgstr "Modelo" #: prewikka/views/agents/templates/agents.mak:34 #: prewikka/views/messagesummary/messagesummary.py:428 msgid "Class" msgstr "Categoría" #: prewikka/views/agents/templates/agents.mak:38 #: prewikka/views/agents/templates/heartbeatanalyze.mak:25 msgid "Latest heartbeat" msgstr "Hora de último pulso" #: prewikka/views/agents/templates/agents.mak:39 msgid "Status" msgstr "Estado" #: prewikka/views/agents/templates/agents.mak:83 msgid "Delete the alerts of the selected agent(s)" msgstr "" #: prewikka/views/agents/templates/agents.mak:87 msgid "Delete the heartbeats of the selected agent(s)" msgstr "" #: prewikka/views/agents/templates/agents.mak:89 msgid "Delete the selected IDMEF messages?" msgstr "" #: prewikka/views/agents/templates/agents.mak:89 #: prewikka/views/datasearch/idmef.py:195 #: prewikka/views/filter/templates/filterlisting.mak:42 msgid "Delete" msgstr "Borrar" #: prewikka/views/agents/templates/heartbeatanalyze.mak:21 #, fuzzy msgid "OS" msgstr "SO" #: prewikka/views/agents/templates/heartbeatanalyze.mak:22 #: prewikka/views/datasearch/heartbeat.py:66 #: prewikka/views/messagesummary/messagesummary.py:412 msgid "Node name" msgstr "Nombre del nodo" #: prewikka/views/agents/templates/heartbeatanalyze.mak:23 #: prewikka/views/messagesummary/messagesummary.py:395 msgid "Node location" msgstr "Lugar del nodo" #: prewikka/views/agents/templates/heartbeatanalyze.mak:24 #: prewikka/views/datasearch/heartbeat.py:65 #: prewikka/views/messagesummary/messagesummary.py:418 msgid "Node address" msgstr "Dirección del nodo" #: prewikka/views/agents/templates/heartbeatanalyze.mak:26 msgid "Current status" msgstr "Estado actual" #: prewikka/views/agents/templates/heartbeatanalyze.mak:56 msgid "Events" msgstr "Eventos" #: prewikka/views/crontab/__init__.py:30 msgid "Scheduling management" msgstr "" #: prewikka/views/crontab/__init__.py:35 #, fuzzy msgid "Scheduled jobs management page" msgstr "Filtrar por agente" #: prewikka/views/crontab/__init__.py:62 msgid "Configuration" msgstr "Configuración" #: prewikka/views/crontab/__init__.py:62 msgid "Scheduling" msgstr "Programación" #: prewikka/views/crontab/__init__.py:75 prewikka/views/crontab/__init__.py:104 msgid "SYSTEM" msgstr "SISTEMA" #: prewikka/views/crontab/__init__.py:88 msgid "Pending" msgstr "Pendiente" #: prewikka/views/crontab/__init__.py:98 msgid "Error" msgstr "Error" #: prewikka/views/crontab/templates/cronjob.mak:54 msgid "Schedule:" msgstr "Programa:" #: prewikka/views/crontab/templates/cronjob.mak:69 msgid "custom" msgstr "personalizado" #: prewikka/views/crontab/templates/cronjob.mak:70 msgid "disabled" msgstr "desactivado" #: prewikka/views/crontab/templates/cronjob.mak:79 msgid "Minute:" msgstr "Minuto:" #: prewikka/views/crontab/templates/cronjob.mak:83 msgid "Hour:" msgstr "Hora:" #: prewikka/views/crontab/templates/cronjob.mak:87 msgid "Day:" msgstr "Día:" #: prewikka/views/crontab/templates/cronjob.mak:91 msgid "Month:" msgstr "Mes:" #: prewikka/views/crontab/templates/cronjob.mak:95 msgid "Weekday:" msgstr "Día de la semana:" #: prewikka/views/crontab/templates/cronjob.mak:107 msgid "Edit Job" msgstr "" #: prewikka/views/crontab/templates/cronjob.mak:112 #: prewikka/views/filter/templates/filteredition.mak:73 #: prewikka/views/usermanagement/templates/usersettings.mak:13 msgid "Name:" msgstr "Nombre:" #: prewikka/views/crontab/templates/cronjob.mak:123 #: prewikka/views/filter/templates/filteredition.mak:123 #: prewikka/views/usermanagement/templates/usersettings.mak:61 msgid "Save" msgstr "Guardar" #: prewikka/views/crontab/templates/crontab.mak:15 msgid "Scheduled Jobs" msgstr "Tareas programadas" #: prewikka/views/crontab/templates/crontab.mak:18 msgid "Schedule" msgstr "Programa" #: prewikka/views/crontab/templates/crontab.mak:19 msgid "User" msgstr "Usuario" #: prewikka/views/crontab/templates/crontab.mak:20 msgid "Last execution" msgstr "Última ejecución" #: prewikka/views/crontab/templates/crontab.mak:21 msgid "Next execution" msgstr "Próxima ejecución" #: prewikka/views/crontab/templates/crontab.mak:69 msgid "Disable" msgstr "Desactivar" #: prewikka/views/crontab/templates/crontab.mak:70 msgid "Enable" msgstr "Activar" #: prewikka/views/datasearch/alert.py:71 #, fuzzy msgid "Alert listing page" msgstr "Lista de alertas" #: prewikka/views/datasearch/alert.py:76 msgid "Aggregated alerts" msgstr "Alertas agregadas" #: prewikka/views/datasearch/alert.py:87 #: prewikka/views/datasearch/heartbeat.py:63 #: prewikka/views/datasearch/threat.py:74 msgid "Date" msgstr "Fecha" #: prewikka/views/datasearch/alert.py:89 prewikka/views/datasearch/threat.py:76 msgid "Source" msgstr "Origen" #: prewikka/views/datasearch/alert.py:90 prewikka/views/datasearch/threat.py:77 msgid "Target" msgstr "Destino" #: prewikka/views/datasearch/alert.py:91 msgid "Analyzer" msgstr "Analizador" #: prewikka/views/datasearch/alert.py:94 msgid "Delete the selected alerts?" msgstr "" #: prewikka/views/datasearch/alert.py:148 #: prewikka/views/idmefnav/__init__.py:44 msgid "IDMEF" msgstr "IDMEF" #: prewikka/views/datasearch/datasearch.py:48 msgid "minute" msgstr "minuto" #: prewikka/views/datasearch/datasearch.py:48 msgid "hour" msgstr "hora" #: prewikka/views/datasearch/datasearch.py:48 msgid "day" msgstr "día" #: prewikka/views/datasearch/datasearch.py:48 msgid "month" msgstr "mes" #: prewikka/views/datasearch/datasearch.py:48 msgid "year" msgstr "año" #: prewikka/views/datasearch/datasearch.py:161 #, fuzzy msgid "Time group error" msgstr "Alerta de correlación" #: prewikka/views/datasearch/datasearch.py:161 msgid "Only one time unit can be specified in a groupby query" msgstr "" #: prewikka/views/datasearch/datasearch.py:446 msgid "Forensic" msgstr "" #: prewikka/views/datasearch/datasearch.py:446 msgid "Dashboard" msgstr "Salpicadero" #: prewikka/views/datasearch/datasearch.py:490 msgid "CSV export" msgstr "" #: prewikka/views/datasearch/datasearch.py:622 msgid "General" msgstr "General" #: prewikka/views/datasearch/heartbeat.py:51 #, fuzzy msgid "Heartbeat listing page" msgstr "Lista de pulsos" #: prewikka/views/datasearch/heartbeat.py:56 #, fuzzy msgid "Aggregated heartbeats" msgstr "Hora de último pulso" #: prewikka/views/datasearch/heartbeat.py:64 msgid "Agent" msgstr "Agente" #: prewikka/views/datasearch/heartbeat.py:69 msgid "Delete the selected heartbeats?" msgstr "" #: prewikka/views/datasearch/idmef.py:46 #, fuzzy msgid "See IDMEF details" msgstr "Alertas" #: prewikka/views/datasearch/threat.py:66 #, fuzzy msgid "Threat listing page" msgstr "Lista de pulsos" #: prewikka/views/datasearch/threat.py:69 #: prewikka/views/datasearch/threat.py:70 msgid "Threats" msgstr "Amenazas" #: prewikka/views/datasearch/threat.py:70 msgid "Aggregated threats" msgstr "Amenazas agregadas" #: prewikka/views/datasearch/threat.py:78 msgid "Program" msgstr "Programa" #: prewikka/views/datasearch/templates/details.mak:26 #, python-format msgid "Group by %s" msgstr "Agrupar por %s" #: prewikka/views/datasearch/templates/details.mak:30 #: prewikka/views/datasearch/templates/forensic.mak:219 msgid "Add to search" msgstr "Añadir a la búsqueda" #: prewikka/views/datasearch/templates/details.mak:31 #: prewikka/views/datasearch/templates/forensic.mak:220 msgid "Exclude from search" msgstr "Excluir de la búsqueda" #: prewikka/views/datasearch/templates/forensic.mak:9 msgid "Fields" msgstr "Campos" #: prewikka/views/datasearch/templates/forensic.mak:10 msgid "Query history" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:63 #, fuzzy msgid "Chart type" msgstr "Fecha de inicio" #: prewikka/views/datasearch/templates/forensic.mak:73 msgid "Limit" msgstr "Límite" #: prewikka/views/datasearch/templates/forensic.mak:89 msgid "Expert mode" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:96 msgid "Condensed mode" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:108 msgid "Search mode" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:112 #: prewikka/views/datasearch/templates/forensic.mak:217 msgid "Search" msgstr "Buscar" #: prewikka/views/datasearch/templates/forensic.mak:114 msgid "Reset search" msgstr "Reiniciar búsqueda" #: prewikka/views/datasearch/templates/forensic.mak:124 #: prewikka/views/datasearch/templates/forensic.mak:222 msgid "Group by" msgstr "Agrupar por" #: prewikka/views/datasearch/templates/forensic.mak:125 msgid "Select your field" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:126 #, fuzzy msgid "Time values" msgstr "valor" #: prewikka/views/datasearch/templates/forensic.mak:131 #, python-format msgid "%s fields" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:167 #, fuzzy msgid "Timeline" msgstr "Hora" #: prewikka/views/datasearch/templates/forensic.mak:221 msgid "New search" msgstr "Nueva búsqueda" #: prewikka/views/datasearch/templates/forensic.mak:231 #: prewikka/views/messagesummary/messagesummary.py:1026 msgid "Actions" msgstr "Acciones" #: prewikka/views/datasearch/templates/forensic.mak:244 msgid "Informations" msgstr "Informationes" #: prewikka/views/datasearch/templates/infos.mak:3 msgid "Field" msgstr "Campo" #: prewikka/views/datasearch/templates/infos.mak:9 #, fuzzy msgid "Occurrence" msgstr "Origen" #: prewikka/views/datasearch/templates/table.mak:12 #, fuzzy msgid "Count" msgstr "Mi cuenta" #: prewikka/views/filter/__init__.py:11 #, fuzzy msgid "Filters management page" msgstr "Filtrar por agente" #: prewikka/views/filter/filter.py:113 #: prewikka/views/usermanagement/usermanagement.py:18 msgid "Preferences" msgstr "Preferencias" #: prewikka/views/filter/filter.py:113 #: prewikka/views/filter/templates/filterlisting.mak:17 msgid "Filters" msgstr "Filtros" #: prewikka/views/filter/filter.py:124 #: prewikka/views/filter/templates/filteredition.mak:66 #, python-format msgid "Filter %s" msgstr "Filtro %s" #: prewikka/views/filter/filter.py:199 msgid "Filter error" msgstr "Error de filtro" #: prewikka/views/filter/filter.py:199 #, python-format msgid "Filter '%s' does not exist" msgstr "" #: prewikka/views/filter/filter.py:236 prewikka/views/filter/filter.py:248 msgid "Could not save filter" msgstr "" #: prewikka/views/filter/filter.py:236 msgid "No name for this filter was provided" msgstr "" #: prewikka/views/filter/filter.py:248 msgid "The filter name is already used by another filter" msgstr "" #: prewikka/views/filter/templates/filteredition.mak:66 #: prewikka/views/filter/templates/filterlisting.mak:17 #: prewikka/views/filter/templates/menu.mak:48 msgid "New filter" msgstr "Nuevo filtro" #: prewikka/views/filter/templates/filteredition.mak:75 msgid "Filter name" msgstr "Nombre del filtro" #: prewikka/views/filter/templates/filteredition.mak:80 msgid "Category:" msgstr "Categoría:" #: prewikka/views/filter/templates/filteredition.mak:92 msgid "Description:" msgstr "Descripción:" #: prewikka/views/filter/templates/filterlisting.mak:24 #: prewikka/views/messagesummary/messagesummary.py:750 msgid "Category" msgstr "Categoría" #: prewikka/views/filter/templates/filterlisting.mak:40 msgid "Create" msgstr "Crear" #: prewikka/views/filter/templates/filterlisting.mak:41 msgid "Duplicate" msgstr "Duplicar" #: prewikka/views/filter/templates/filterlisting.mak:42 msgid "Delete the selected filters?" msgstr "" #: prewikka/views/filter/templates/menu.mak:4 msgid "Filter:" msgstr "Filtro:" #: prewikka/views/filter/templates/menu.mak:38 msgid "Available filters" msgstr "Filtros disponibles" #: prewikka/views/filter/templates/menu.mak:46 msgid "No filter" msgstr "Sin filtro" #: prewikka/views/filter/templates/menu.mak:51 msgid "No category" msgstr "Sin categoría" #: prewikka/views/filter/templates/widget.mak:7 msgid "Select a path..." msgstr "" #: prewikka/views/filter/templates/widget.mak:9 msgid "Default paths" msgstr "" #: prewikka/views/filter/templates/widget.mak:15 msgid "All paths" msgstr "Todos los caminos" #: prewikka/views/filter/templates/widget.mak:25 #: prewikka/views/filter/templates/widget.mak:46 msgid "Change operator" msgstr "Cambiar el operador" #: prewikka/views/filter/templates/widget.mak:32 msgid "value" msgstr "valor" #: prewikka/views/filter/templates/widget.mak:34 msgid "Delete condition" msgstr "Borrar condición" #: prewikka/views/filter/templates/widget.mak:42 msgid "AND" msgstr "Y" #: prewikka/views/filter/templates/widget.mak:42 msgid "OR" msgstr "O" #: prewikka/views/filter/templates/widget.mak:56 msgid "Add condition" msgstr "Añadir condición" #: prewikka/views/filter/templates/widget.mak:57 msgid "Add group" msgstr "Añadir grupo" #: prewikka/views/filter/templates/widget.mak:59 msgid "Delete group" msgstr "Borrar grupo" #: prewikka/views/idmefnav/__init__.py:36 msgid "IDMEF navigator" msgstr "" #: prewikka/views/idmefnav/__init__.py:44 msgid "Help" msgstr "Ayuda" #: prewikka/views/idmefnav/templates/idmefnav.mak:12 msgid "Children" msgstr "" #: prewikka/views/idmefnav/templates/idmefnav.mak:20 #, fuzzy msgid "Aggregates" msgstr "Alertas de correlación" #: prewikka/views/idmefnav/templates/idmefnav.mak:36 msgid "Attributes" msgstr "" #: prewikka/views/idmefnav/templates/idmefnav.mak:54 msgid "Rank" msgstr "" #: prewikka/views/idmefnav/templates/idmefnav.mak:55 msgid "Keyword" msgstr "" #: prewikka/views/messagesummary/__init__.py:13 msgid "Detailed alert and heartbeat page" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:289 #: prewikka/views/messagesummary/messagesummary.py:578 msgid "Code" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:290 msgid "Data length" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:291 msgid "Data" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:365 #, python-format msgid "(agent local time: %s)" msgstr "(hora local del sensor: %s)" #: prewikka/views/messagesummary/messagesummary.py:372 #: prewikka/views/messagesummary/messagesummary.py:835 msgid "Create time" msgstr "Tiempo de creación" #: prewikka/views/messagesummary/messagesummary.py:375 msgid "Detect time" msgstr "Tiempo de detección" #: prewikka/views/messagesummary/messagesummary.py:380 msgid "Analyzer time" msgstr "Tiempo del analizador" #: prewikka/views/messagesummary/messagesummary.py:386 msgid "Process" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:387 msgid "Process Path" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:388 msgid "Process PID" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:415 msgid "Node name (resolved)" msgstr "Nombre del nodo (resuelto)" #: prewikka/views/messagesummary/messagesummary.py:426 msgid "Analyzerid" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:430 msgid "Manufacturer" msgstr "Fabricante" #: prewikka/views/messagesummary/messagesummary.py:438 msgid "Operating System" msgstr "Sistema operativo" #: prewikka/views/messagesummary/messagesummary.py:456 #, python-format msgid "Analyzer Path (%d not shown)" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:463 #: prewikka/views/messagesummary/messagesummary.py:1035 #: prewikka/views/messagesummary/messagesummary.py:1106 #, python-format msgid "Analyzer #%d" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:473 msgid "Additional data" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:476 #: prewikka/views/messagesummary/messagesummary.py:717 msgid "Meaning" msgstr "Sentido" #: prewikka/views/messagesummary/messagesummary.py:477 msgid "Value" msgstr "Valor" #: prewikka/views/messagesummary/messagesummary.py:531 #: prewikka/views/messagesummary/messagesummary.py:552 msgid "Header length" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:532 #, fuzzy msgid "TOS" msgstr "SO" #: prewikka/views/messagesummary/messagesummary.py:533 #: prewikka/views/messagesummary/messagesummary.py:571 msgid "Length" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:534 #: prewikka/views/messagesummary/messagesummary.py:580 msgid "Id" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:538 msgid "Ip offset" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:539 msgid "TTL" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:540 #: prewikka/views/messagesummary/messagesummary.py:926 #: prewikka/views/messagesummary/messagesummary.py:929 #: prewikka/views/messagesummary/messagesummary.py:932 msgid "Protocol" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:541 #: prewikka/views/messagesummary/messagesummary.py:563 #: prewikka/views/messagesummary/messagesummary.py:572 #: prewikka/views/messagesummary/messagesummary.py:579 msgid "Checksum" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:542 msgid "Source address" msgstr "Dirección de origen" #: prewikka/views/messagesummary/messagesummary.py:543 msgid "Target address" msgstr "Dirección de destino" #: prewikka/views/messagesummary/messagesummary.py:553 msgid "Reserved" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:562 #, fuzzy msgid "Window" msgstr "informacion" #: prewikka/views/messagesummary/messagesummary.py:564 msgid "URP" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:577 #: prewikka/views/messagesummary/messagesummary.py:744 #: prewikka/views/messagesummary/messagesummary.py:777 #: prewikka/views/messagesummary/messagesummary.py:796 msgid "Type" msgstr "Tipo" #: prewikka/views/messagesummary/messagesummary.py:581 msgid "Seq #" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:582 msgid "Mask" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:583 #, fuzzy msgid "Gateway Address" msgstr "Dirección del nodo" #: prewikka/views/messagesummary/messagesummary.py:584 #, fuzzy msgid "Num address" msgstr "Dirección del nodo" #: prewikka/views/messagesummary/messagesummary.py:585 msgid "Wpa" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:586 msgid "Lifetime" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:587 #, fuzzy msgid "Otime" msgstr "Hora" #: prewikka/views/messagesummary/messagesummary.py:588 #, fuzzy msgid "Rtime" msgstr "Hora" #: prewikka/views/messagesummary/messagesummary.py:589 #, fuzzy msgid "Ttime" msgstr "Hora" #: prewikka/views/messagesummary/messagesummary.py:595 #: prewikka/views/messagesummary/messagesummary.py:1082 msgid "Payload" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:648 #, fuzzy msgid "Alert details" msgstr "Alertas" #: prewikka/views/messagesummary/messagesummary.py:653 #, python-format msgid "%d linked alerts missing (probably deleted)" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:657 #, python-format msgid "%d linked alerts omitted" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:674 #: prewikka/views/messagesummary/messagesummary.py:991 msgid "Correlation Alert" msgstr "Alerta de correlación" #: prewikka/views/messagesummary/messagesummary.py:680 msgid "Correlated Alerts" msgstr "Alertas de correlación" #: prewikka/views/messagesummary/messagesummary.py:681 #: prewikka/views/messagesummary/messagesummary.py:698 msgid "Source Analyzer" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:691 #: prewikka/views/messagesummary/messagesummary.py:994 msgid "Tool Alert" msgstr "Alerta de herramienta" #: prewikka/views/messagesummary/messagesummary.py:697 msgid "Linked Alerts" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:708 msgid "Text" msgstr "Texto" #: prewikka/views/messagesummary/messagesummary.py:710 #, fuzzy msgid "Ident" msgstr "Agente:" #: prewikka/views/messagesummary/messagesummary.py:715 msgid "Origin" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:738 msgid "Severity" msgstr "Severidad" #: prewikka/views/messagesummary/messagesummary.py:741 msgid "Completion" msgstr "Terminación" #: prewikka/views/messagesummary/messagesummary.py:774 msgid "User category" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:779 #: prewikka/views/messagesummary/messagesummary.py:798 msgid "Number" msgstr "Número" #: prewikka/views/messagesummary/messagesummary.py:780 msgid "Tty" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:799 msgid "Permission" msgstr "Permiso" #: prewikka/views/messagesummary/messagesummary.py:821 msgid "Change time" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:822 #, fuzzy msgid "Inode Number" msgstr "Nombre del nodo" #: prewikka/views/messagesummary/messagesummary.py:823 msgid "Major device" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:824 msgid "Minor device" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:825 msgid "C Major device" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:826 msgid "C Minor device" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:830 #, fuzzy, python-format msgid "Target file %s" msgstr "Destino" #: prewikka/views/messagesummary/messagesummary.py:830 msgid "category" msgstr "categoría" #: prewikka/views/messagesummary/messagesummary.py:834 msgid "Path" msgstr "Camino" #: prewikka/views/messagesummary/messagesummary.py:836 msgid "Modify time" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:837 msgid "Access time" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:838 msgid "Data size" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:839 msgid "Disk size" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:858 msgid "Web Service" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:861 msgid "Url" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:862 msgid "Cgi" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:863 msgid "Http Method" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:866 msgid "CGI Argument" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:875 msgid "SNMP Service" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:878 msgid "oid" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:879 msgid "messageProcessingModel" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:880 msgid "securityModel" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:881 msgid "securityName" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:882 msgid "securityLevel" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:883 #, fuzzy msgid "contextName" msgstr "Nombre del nodo" #: prewikka/views/messagesummary/messagesummary.py:884 msgid "contextEngineID" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:885 msgid "command" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:897 #: prewikka/views/messagesummary/messagesummary.py:899 msgid "Port" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:919 msgid "PortList" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:922 #, fuzzy msgid "ip_version" msgstr "Permisos:" #: prewikka/views/messagesummary/messagesummary.py:958 #, python-format msgid "Source(%d)" msgstr "Origen(%d)" #: prewikka/views/messagesummary/messagesummary.py:973 #, python-format msgid "Target(%d)" msgstr "Destino(%d)" #: prewikka/views/messagesummary/messagesummary.py:997 msgid "Overflow Alert" msgstr "Alerta de desborde" #: prewikka/views/messagesummary/messagesummary.py:1000 msgid "Alert" msgstr "Alerta" #: prewikka/views/messagesummary/messagesummary.py:1018 msgid "MessageID" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:1065 #, fuzzy msgid "Network centric information" msgstr "Información sobre cuentas" #: prewikka/views/messagesummary/messagesummary.py:1087 msgid "ASCII Payload" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:1103 msgid "Heartbeat" msgstr "Pulso" #: prewikka/views/messagesummary/templates/messagesummary.mak:85 msgid "Summary" msgstr "Resumen" #: prewikka/views/usermanagement/__init__.py:14 #, fuzzy msgid "User settings page" msgstr "Configuraciones" #: prewikka/views/usermanagement/usermanagement.py:18 msgid "My account" msgstr "Mi cuenta" #: prewikka/views/usermanagement/usermanagement.py:23 #, fuzzy msgid "Invalid User" msgstr "Idioma:" #: prewikka/views/usermanagement/usermanagement.py:23 #, python-format msgid "Requested user '%s' does not exist" msgstr "" #: prewikka/views/usermanagement/usermanagement.py:43 msgid "Invalid Language" msgstr "Idioma no válido" #: prewikka/views/usermanagement/usermanagement.py:43 msgid "Specified language does not exist" msgstr "" #: prewikka/views/usermanagement/usermanagement.py:47 msgid "Invalid Timezone" msgstr "Zona horaria no válida" #: prewikka/views/usermanagement/usermanagement.py:47 msgid "Specified timezone does not exist" msgstr "" #: prewikka/views/usermanagement/templates/usersettings.mak:6 msgid "Login:" msgstr "Ingreso:" #: prewikka/views/usermanagement/templates/usersettings.mak:20 msgid "Email:" msgstr "E-mail:" #: prewikka/views/usermanagement/templates/usersettings.mak:22 msgid "Email" msgstr "E-mail" #: prewikka/views/usermanagement/templates/usersettings.mak:27 msgid "Language:" msgstr "Idioma:" #: prewikka/views/usermanagement/templates/usersettings.mak:39 msgid "Theme:" msgstr "Tema:" #: prewikka/views/usermanagement/templates/usersettings.mak:50 msgid "Timezone:" msgstr "Zona horaria:" #: scripts/prewikka-cli:59 msgid "Unknown command" msgstr "" #: scripts/prewikka-cli:67 #, python-format msgid "An unexpected error occurred: %s" msgstr "" #: scripts/prewikka-cli:154 msgid "Create an object of the specified type" msgstr "" #: scripts/prewikka-cli:157 msgid "Delete an object of the specified type" msgstr "" #: scripts/prewikka-cli:160 msgid "Import objects of the specified type from files" msgstr "" #: scripts/prewikka-cli:163 msgid "List objects of the specified type" msgstr "" #: scripts/prewikka-cli:166 msgid "Synchronize objects of the specified type" msgstr "" #: scripts/prewikka-cli:169 msgid "Update objects of the specified type" msgstr "" #: scripts/prewikka-cli:207 msgid "Prewikka command-line tool" msgstr "" #: scripts/prewikka-cli:208 msgid "name of the user" msgstr "" #: scripts/prewikka-cli:209 scripts/prewikka-crontab:99 #: scripts/prewikka-httpd:93 #, python-format msgid "configuration file to use (default: %(default)s)" msgstr "" #: scripts/prewikka-cli:210 msgid "command to execute" msgstr "" #: scripts/prewikka-cli:211 msgid "enable debugging output" msgstr "" #: scripts/prewikka-cli:218 msgid "prewikka-cli must be executed as the prewikka user" msgstr "" #: scripts/prewikka-cli:243 #, python-format msgid "Prewikka command-line tool (%s)" msgstr "" #: scripts/prewikka-cli:244 msgid "Type \"help\" or \"?\" to list commands" msgstr "" #: scripts/prewikka-crontab:100 msgid "run as a system daemon" msgstr "" #: scripts/prewikka-crontab:101 scripts/prewikka-httpd:96 msgid "show this help message and exit" msgstr "" #: scripts/prewikka-crontab:102 scripts/prewikka-httpd:97 msgid "show program's version number and exit" msgstr "" #: scripts/prewikka-httpd:88 msgid "root where the server is accessible" msgstr "" #: scripts/prewikka-httpd:89 #, python-format msgid "IP to bind to (default: %(default)s)" msgstr "" #: scripts/prewikka-httpd:90 #, python-format msgid "port number to use (default: %(default)d)" msgstr "" #: scripts/prewikka-httpd:91 msgid "SSL private key to use (default: no SSL)" msgstr "" #: scripts/prewikka-httpd:92 msgid "SSL certificate to use (default: no SSL)" msgstr "" #: scripts/prewikka-httpd:95 #, python-format msgid "" "number of processes to use. Default value matches the number of available" " CPUs (i.e. %d)" msgstr "" prewikka-5.1.1/prewikka/locale/fr/0000775000175000017500000000000013555143705020432 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/locale/fr/LC_MESSAGES/0000775000175000017500000000000013555143705022217 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/locale/fr/LC_MESSAGES/prewikka.po0000664000175000017500000020435313555143652024404 0ustar tandrejatandreja00000000000000# French Translation for Prewikka # Copyright (C) 2007-2019 CS-SI # This file is distributed under the same license as the prewikka package. # sebastien.tricaud@wengo.com, 2007. msgid "" msgstr "" "Project-Id-Version: Prewikka 5.1.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-09-04 19:03+0200\n" "PO-Revision-Date: 2018-02-09 12:07+0100\n" "Last-Translator: Girard \n" "Language-Team: French\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 0.9.6\n" #: prewikka/baseview.py:79 prewikka/usergroup.py:52 msgid "Permission Denied" msgstr "Accès refusé" #: prewikka/baseview.py:79 msgid "Missing permission to access the specified file" msgstr "Permission manquante pour accéder au fichier spécifié" #: prewikka/config.py:37 prewikka/dataprovider/__init__.py:645 msgid "Configuration error" msgstr "Erreur de configuration" #: prewikka/config.py:43 #, python-format msgid "Parse error in \"%(txt)s\" at %(file)s line %(line)d" msgstr "Erreur de parsing dans \"%(txt)s\" à la ligne %(line)d de %(file)s" #: prewikka/config.py:48 prewikka/view.py:82 #, python-format msgid "Invalid value '%(value)s' for parameter '%(name)s'" msgstr "Valeur invalide '%(value)s' pour le paramètre '%(name)s'" #: prewikka/config.py:54 #, python-format msgid "Missing value for parameter '%(name)s'" msgstr "Valeur manquante pour le paramètre '%(name)s'" #: prewikka/crontab.py:37 msgid "Hourly" msgstr "Toutes les heures" #: prewikka/crontab.py:38 msgid "Daily" msgstr "Quotidien" #: prewikka/crontab.py:39 msgid "Weekly" msgstr "Hebdomadaire" #: prewikka/crontab.py:40 msgid "Monthly" msgstr "Mensuel" #: prewikka/crontab.py:41 msgid "Yearly" msgstr "Annuel" #: prewikka/crontab.py:42 prewikka/mainmenu.py:302 #: prewikka/templates/mainmenu.mak:92 msgid "Custom" msgstr "Personnalisé" #: prewikka/crontab.py:43 prewikka/views/crontab/__init__.py:84 msgid "Disabled" msgstr "Désactivé" #: prewikka/crontab.py:105 msgid "Scheduled job execution failed" msgstr "Échec de l'exécution de la tâche planifiée" #: prewikka/crontab.py:139 msgid "Invalid job extension" msgstr "Extension de tâche invalide" #: prewikka/crontab.py:139 #, python-format msgid "Scheduled job with invalid extension type '%s'" msgstr "Tâche planifiée avec type d'extension invalide '%s'" #: prewikka/crontab.py:206 msgid "Invalid CronJob" msgstr "Tâche planifiée invalide" #: prewikka/crontab.py:206 #, python-format msgid "CronJob with id=%d cannot be found in database" msgstr "Tâche planifiée avec id=%d introuvable dans la base" #: prewikka/crontab.py:260 msgid "Invalid schedule" msgstr "Planification invalide" #: prewikka/crontab.py:260 msgid "The specified job schedule is invalid" msgstr "La planification spécifiée pour la tâche est invalide" #: prewikka/crontab.py:286 #, python-format msgid "Custom (%s)" msgstr "Personnalisé (%s)" #: prewikka/database.py:43 msgid "Database error" msgstr "Erreur de base de données" #: prewikka/database.py:50 msgid "Database schema error" msgstr "Erreur de schéma de base de données" #: prewikka/database.py:293 msgid "database installation required" msgstr "installation de base de données nécessaire" #: prewikka/database.py:296 msgid "database activation required" msgstr "activation de base de données nécessaire" #: prewikka/database.py:299 #, python-format msgid "database schema branch %(required)s required (found %(current)s)" msgstr "" "branche %(required)s du schéma de base de données nécessaire (%(current)s" " trouvée)" #: prewikka/database.py:305 #, python-format msgid "database schema version %(required)s required (found %(current)s)" msgstr "" "version %(required)s du schéma de base de données nécessaire (%(current)s" " trouvée)" #: prewikka/database.py:372 msgid "Database installation error" msgstr "Erreur d'installation de base de données" #: prewikka/database.py:374 #, python-format msgid "" "No database installation script found for module %(module)s, version " "%(version)s" msgstr "" "Aucun script d'installation de base de données trouvé pour le module " "%(module)s, version %(version)s" #: prewikka/database.py:382 prewikka/database.py:420 msgid "Database migration error" msgstr "Erreur de migration de base de données" #: prewikka/database.py:386 #, python-format msgid "" "No database branch migration script found for module %(module)s, branch " "transition %(current)s -> %(required)s" msgstr "" "Aucun script de migration de base de données trouvé pour le module " "%(module)s, transition de branche %(current)s -> %(required)s" #: prewikka/database.py:424 #, python-format msgid "" "No linear migration script found for module %(module)s %(version1)s -> " "%(version2)s" msgstr "" "Aucun script de migration linéaire trouvé pour le module %(module)s " "%(version1)s -> %(version2)s" #: prewikka/database.py:841 msgid "Database configuration error" msgstr "Erreur de configuration de base de données" #: prewikka/database.py:841 msgid "Only MySQL and PostgreSQL databases are supported at the moment" msgstr "" "Seules les bases de données MySQL et PostgreSQL sont supportées " "actuellement" #: prewikka/error.py:48 prewikka/templates/error.mak:139 msgid "An unexpected condition happened" msgstr "Une erreur inattendue s'est produite" #: prewikka/error.py:148 msgid "Not implemented" msgstr "Non implémenté" #: prewikka/error.py:150 msgid "Backend does not implement this operation" msgstr "Le backend n'implémente pas cette opération" #: prewikka/history.py:32 msgid "Search history deletion" msgstr "Suppression de l'historique de recherche" #: prewikka/localization.py:143 msgid "%m/%Y" msgstr "%m/%Y" #: prewikka/localization.py:144 #, python-format msgid "%m/%d/%Y" msgstr "%d/%m/%Y" #: prewikka/localization.py:145 #, python-format msgid "%m/%d/%Y %Hh" msgstr "%d/%m/%Y %Hh" #: prewikka/localization.py:146 #, python-format msgid "%m/%d/%Y %H:%M" msgstr "%d/%m/%Y %H:%M" #: prewikka/localization.py:147 #, python-format msgid "%m/%d/%Y %H:%M:%S" msgstr "%d/%m/%Y %H:%M:%S" #: prewikka/localization.py:149 msgid "%H:%M" msgstr "%H:%M" #: prewikka/localization.py:150 msgid "%H:%M:%S" msgstr "%H:%M:%S" #: prewikka/localization.py:235 prewikka/localization.py:253 #: prewikka/renderer/__init__.py:62 prewikka/views/crontab/__init__.py:95 msgid "n/a" msgstr "n/a" #: prewikka/localization.py:246 #, python-format msgid "%(days)dd %(hours)dh %(minutes)d'" msgstr "%(days)dj %(hours)dh %(minutes)d'" #: prewikka/main.py:45 msgid "Version Requirement error" msgstr "Erreur de version requise" #: prewikka/main.py:48 #, python-format msgid "Prewikka %(vPre)s requires libprelude %(vLib)s or higher" msgstr "Prewikka %(vPre)s requiert libprelude %(vLib)s ou supérieure" #: prewikka/main.py:53 #, python-format msgid "Prewikka %(vPre)s requires libpreludedb %(vLib)s or higher" msgstr "Prewikka %(vPre)s requiert libpreludedb %(vLib)s ou supérieure" #: prewikka/main.py:136 prewikka/main.py:149 #: prewikka/dataprovider/plugins/idmef/__init__.py:57 msgid "Initialization error" msgstr "Erreur d'initialisation" #: prewikka/main.py:150 #, python-format msgid "" "Cannot use %(type)s mode '%(name)s', please contact your local " "administrator." msgstr "" "Impossible d'utiliser le mode '%(name)s' de type '%(type)s', veuillez " "contacter votre administrateur local." #: prewikka/main.py:192 #, python-format msgid "Session '%s' does not accept any authentication module" msgstr "La session '%s' n'accepte pas de module d'authentification" #: prewikka/main.py:298 #, python-format msgid "An unexpected condition happened while trying to load %s" msgstr "Une erreur inattendue s'est produite au chargement de %s" #: prewikka/mainmenu.py:114 #, python-format msgid "%S.%.6f" msgstr "%S.%.6f" #: prewikka/mainmenu.py:115 #, python-format msgid "%S.%.3f" msgstr "%S.%.3f" #: prewikka/mainmenu.py:260 msgid "Today" msgstr "Aujourd'hui" #: prewikka/mainmenu.py:261 msgid "Yesterday" msgstr "Hier" #: prewikka/mainmenu.py:262 msgid "This week" msgstr "Cette semaine" #: prewikka/mainmenu.py:263 msgid "Last week" msgstr "La semaine dernière" #: prewikka/mainmenu.py:264 msgid "This month" msgstr "Ce mois" #: prewikka/mainmenu.py:265 msgid "Last month" msgstr "Le mois dernier" #: prewikka/mainmenu.py:266 prewikka/mainmenu.py:267 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d heure" msgstr[1] "%d heures" #: prewikka/mainmenu.py:268 prewikka/mainmenu.py:269 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d jour" msgstr[1] "%d jours" #: prewikka/mainmenu.py:270 #, python-format msgid "%d week" msgid_plural "%d weeks" msgstr[0] "%d semaine" msgstr[1] "%d semaines" #: prewikka/mainmenu.py:271 prewikka/mainmenu.py:272 #, python-format msgid "%d month" msgid_plural "%d months" msgstr[0] "%d mois" msgstr[1] "%d mois" #: prewikka/mainmenu.py:273 #, python-format msgid "%d year" msgid_plural "%d years" msgstr[0] "%d an" msgstr[1] "%d ans" #: prewikka/mainmenu.py:277 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d seconde" msgstr[1] "%d secondes" #: prewikka/mainmenu.py:278 prewikka/mainmenu.py:279 prewikka/mainmenu.py:280 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d minute" msgstr[1] "%d minutes" #: prewikka/mainmenu.py:299 prewikka/templates/mainmenu.mak:61 msgid "Inactive" msgstr "Inactif" #: prewikka/mainmenu.py:305 prewikka/templates/mainmenu.mak:89 msgid "None" msgstr "Aucun" #: prewikka/menu.py:70 prewikka/menu.py:73 prewikka/menu.py:79 #: prewikka/menu.py:83 prewikka/menu.py:91 msgid "Menu error" msgstr "Erreur du menu" #: prewikka/menu.py:70 msgid "The provided YAML menu is invalid" msgstr "Le menu YAML fourni est invalide" #: prewikka/menu.py:73 msgid "Empty menu" msgstr "Menu vide" #: prewikka/menu.py:79 #, python-format msgid "Menu without a name in %s" msgstr "Menu non nommé dans %s" #: prewikka/menu.py:83 msgid "Multiple default menus" msgstr "Plusieurs menus par défaut" #: prewikka/menu.py:91 msgid "Multiple default views" msgstr "Plusieurs vues par défaut" #: prewikka/pluginmanager.py:163 #, python-format msgid "Circular dependencies detected: %s" msgstr "Dépendances circulaires détectées : %s" #: prewikka/pluginmanager.py:171 #, python-format msgid "Missing dependency: %s" msgstr "Dépendance manquante : %s" #: prewikka/resolve.py:170 #, python-format msgid "" "Asynchronous DNS resolution disabled: twisted.names and twisted.internet " "required: %s" msgstr "" "Résolution DNS asynchrone désactivée : twisted.names et twisted.internet " "requis : %s" #: prewikka/usergroup.py:44 #, python-format msgid "Access to view '%(view)s' forbidden. Required permissions: %(permissions)s" msgstr "Accès à la vue '%(view)s' interdit. Permissions requises : %(permissions)s" #: prewikka/usergroup.py:47 #, python-format msgid "Access to view '%s' forbidden" msgstr "Accès à la vue '%s' interdit" #: prewikka/usergroup.py:50 #, python-format msgid "Required permissions: %s" msgstr "Permissions requises : %s" #: prewikka/view.py:74 prewikka/view.py:81 prewikka/view.py:88 msgid "Parameters Normalization failed" msgstr "Échec de normalisation des paramètres" #: prewikka/view.py:75 #, python-format msgid "Parameter '%s' is not valid" msgstr "Le paramètre '%s' est invalide" #: prewikka/view.py:89 #, python-format msgid "Required parameter '%s' is missing" msgstr "Le paramètre requis '%s' est manquant" #: prewikka/view.py:95 msgid "Invalid method" msgstr "Méthode invalide" #: prewikka/view.py:102 msgid "Invalid view" msgstr "Vue invalide" #: prewikka/view.py:528 #, python-format msgid "Method '%(method)s' is not allowed for view '%(view)s'" msgstr "La méthode '%(method)s' n'est pas autorisée pour la vue '%(view)s'" #: prewikka/view.py:532 prewikka/view.py:651 #, python-format msgid "View '%s' does not exist" msgstr "La vue '%s' n'existe pas" #: prewikka/auth/auth.py:30 msgid "Authentication failed" msgstr "Échec de l'authentification" #: prewikka/dataprovider/__init__.py:35 msgid "Equal" msgstr "Égal" #: prewikka/dataprovider/__init__.py:36 msgid "Equal (case-insensitive)" msgstr "Égal (insensible à la casse)" #: prewikka/dataprovider/__init__.py:37 msgid "Not equal" msgstr "Différent" #: prewikka/dataprovider/__init__.py:38 msgid "Not equal (case-insensitive)" msgstr "Non égal (insensible à la casse)" #: prewikka/dataprovider/__init__.py:39 msgid "Regular expression" msgstr "Expression régulière" #: prewikka/dataprovider/__init__.py:40 msgid "Regular expression (case-insensitive)" msgstr "Expression régulière (insensible à la casse)" #: prewikka/dataprovider/__init__.py:41 msgid "Not regular expression" msgstr "Non expression régulière" #: prewikka/dataprovider/__init__.py:42 msgid "Not regular expression (case-insensitive)" msgstr "Non expression régulière (insensible à la casse)" #: prewikka/dataprovider/__init__.py:43 msgid "Lesser than" msgstr "Plus petit que" #: prewikka/dataprovider/__init__.py:44 msgid "Lesser or equal" msgstr "Plus petit ou égal" #: prewikka/dataprovider/__init__.py:45 msgid "Greater than" msgstr "Plus grand que" #: prewikka/dataprovider/__init__.py:46 msgid "Greater or equal" msgstr "Plus grand ou égal" #: prewikka/dataprovider/__init__.py:47 msgid "Substring" msgstr "Sous-chaîne" #: prewikka/dataprovider/__init__.py:48 msgid "Substring (case-insensitive)" msgstr "Sous-chaîne (insensible à la casse)" #: prewikka/dataprovider/__init__.py:49 msgid "Not substring" msgstr "Non sous-chaîne" #: prewikka/dataprovider/__init__.py:50 msgid "Not substring (case-insensitive)" msgstr "Non sous-chaîne (insensible à la casse)" #: prewikka/dataprovider/__init__.py:92 prewikka/dataprovider/__init__.py:158 msgid "Conversion error" msgstr "Erreur de conversion" #: prewikka/dataprovider/__init__.py:93 prewikka/dataprovider/__init__.py:159 #, python-format msgid "Value %(value)r cannot be converted to %(type)s" msgstr "La valeur %(value)r ne peut pas être convertie en %(type)s" #: prewikka/dataprovider/__init__.py:109 msgid "Backend error" msgstr "Erreur de backend" #: prewikka/dataprovider/__init__.py:109 #, python-format msgid "No backend available for '%s' datatype" msgstr "Aucun gestionnaire disponible pour le type de données '%s'" #: prewikka/dataprovider/__init__.py:116 prewikka/dataprovider/__init__.py:123 msgid "Syntax error" msgstr "Erreur de syntaxe" #: prewikka/dataprovider/__init__.py:116 #, python-format msgid "Unknown path: %s" msgstr "Chemin inconnu : %s" #: prewikka/dataprovider/__init__.py:123 scripts/prewikka-cli:109 #: scripts/prewikka-cli:118 scripts/prewikka-cli:129 msgid "Could not parse input" msgstr "Impossible d'interpréter la saisie" #: prewikka/dataprovider/__init__.py:635 #, python-format msgid "No handler configured for '%s' datatype" msgstr "Aucun gestionnaire configuré pour le type de données '%s'" #: prewikka/dataprovider/__init__.py:646 #, python-format msgid "Only one manager should be configured for '%s' backend" msgstr "Seulement un manager doit être configuré pour le backend '%s'" #: prewikka/dataprovider/idmef.py:128 msgid "High" msgstr "Haute" #: prewikka/dataprovider/idmef.py:129 msgid "Medium" msgstr "Moyenne" #: prewikka/dataprovider/idmef.py:130 msgid "Low" msgstr "Basse" #: prewikka/dataprovider/idmef.py:131 msgid "Informational" msgstr "Informationnel" #: prewikka/dataprovider/idmef.py:141 msgid "Provides an API to fetch IDMEF alerts" msgstr "Fournit une API pour accéder aux alertes IDMEF" #: prewikka/dataprovider/idmef.py:142 #: prewikka/views/agents/templates/agents.mak:83 #: prewikka/views/datasearch/alert.py:75 prewikka/views/datasearch/alert.py:76 msgid "Alerts" msgstr "Alertes" #: prewikka/dataprovider/idmef.py:149 prewikka/views/datasearch/alert.py:88 #: prewikka/views/datasearch/threat.py:75 msgid "Classification" msgstr "Classification" #: prewikka/dataprovider/idmef.py:150 msgid "Source IP" msgstr "IP source" #: prewikka/dataprovider/idmef.py:151 #: prewikka/views/messagesummary/messagesummary.py:548 #: prewikka/views/messagesummary/messagesummary.py:569 msgid "Source port" msgstr "Port source" #: prewikka/dataprovider/idmef.py:152 msgid "Target IP" msgstr "IP cible" #: prewikka/dataprovider/idmef.py:153 #: prewikka/views/messagesummary/messagesummary.py:549 #: prewikka/views/messagesummary/messagesummary.py:570 msgid "Target port" msgstr "Port cible" #: prewikka/dataprovider/idmef.py:154 msgid "Analyzer name" msgstr "Nom de l'analyseur" #: prewikka/dataprovider/idmef.py:157 msgid "Alert deletion" msgstr "Suppression des alertes" #: prewikka/dataprovider/idmef.py:182 msgid "Provides an API to fetch IDMEF heartbeats" msgstr "Fournit une API pour accéder aux pulsations IDMEF" #: prewikka/dataprovider/idmef.py:183 #: prewikka/views/agents/templates/agents.mak:87 #: prewikka/views/datasearch/heartbeat.py:56 msgid "Heartbeats" msgstr "Pulsations" #: prewikka/dataprovider/idmef.py:188 msgid "Heartbeat deletion" msgstr "Suppression des pulsations" #: prewikka/dataprovider/parsers/lucene/__init__.py:52 msgid "Lucene emulation error" msgstr "Erreur d'émulation Lucene" #: prewikka/dataprovider/parsers/lucene/__init__.py:53 msgid "" "This Lucene expression cannot be emulated properly using the Criterion " "backend" msgstr "" "Cette expression Lucene ne peut pas être émulée correctement par le " "backend Criterion" #: prewikka/dataprovider/plugins/idmef/__init__.py:97 msgid "Plugin for fetching IDMEF alerts from the Prelude database" msgstr "Plugin pour accéder aux alertes IDMEF de la base de données Prelude" #: prewikka/dataprovider/plugins/idmef/__init__.py:111 msgid "Plugin for fetching IDMEF heartbeats from the Prelude database" msgstr "Plugin pour accéder aux pulsations IDMEF de la base de données Prelude" #: prewikka/plugins/warning/__init__.py:33 msgid "Prelude Warning message" msgstr "Message d'avertissement de Prelude" #: prewikka/plugins/warning/templates/warning.mak:14 msgid "WARNING" msgstr "AVERTISSEMENT" #: prewikka/plugins/warning/templates/warning.mak:17 msgid "Prelude OSS is the open-source version of the Prelude SIEM" msgstr "Prelude OSS est la version open-source du SIEM Prelude" #: prewikka/plugins/warning/templates/warning.mak:21 #, python-format msgid "" "This OSS version has lower " "performance and less features than the Pro/Enterprise versions." msgstr "" "Cette version OSS possède des performances moindres et moins de fonctionnalités que les versions " "Pro/Entreprise." #: prewikka/plugins/warning/templates/warning.mak:22 msgid "" "It is intended for tests and small environments, and should not be used " "in critical environments." msgstr "" "Elle est destinée aux tests et aux petits environnements et ne doit pas " "être utilisée dans des environnements critiques." #: prewikka/plugins/warning/templates/warning.mak:26 #, python-format msgid "Prelude OSS is distributed under the %s." msgstr "Prelude OSS est distribué sous la %s." #: prewikka/plugins/warning/templates/warning.mak:27 msgid "" "Products derivated from Prelude OSS modules are therefore subject to the " "terms of the GPLv2." msgstr "" "Tout produit dérivé de modules Prelude OSS est donc soumis aux termes de " "la GPLv2." #: prewikka/plugins/warning/templates/warning.mak:30 #: prewikka/templates/error.mak:171 prewikka/templates/toplayout.mak:62 #: prewikka/templates/toplayout.mak:77 prewikka/templates/toplayout.mak:94 #: prewikka/views/aboutplugin/templates/aboutplugin.mak:44 msgid "OK" msgstr "OK" #: prewikka/renderer/__init__.py:44 msgid "No data to display." msgstr "Aucune donnée à afficher." #: prewikka/renderer/__init__.py:143 prewikka/renderer/__init__.py:147 #: prewikka/renderer/__init__.py:151 msgid "Renderer error" msgstr "Erreur de rendu" #: prewikka/renderer/__init__.py:144 #, python-format msgid "No backend supporting render type '%s'" msgstr "Aucun backend ne supporte le type de rendu '%s'" #: prewikka/renderer/__init__.py:148 #, python-format msgid "No backend named '%s'" msgstr "Aucun backend nommé '%s'" #: prewikka/renderer/__init__.py:152 #, python-format msgid "Backend '%(backend)s' does not support render type '%(type)s'" msgstr "Le backend '%(backend)s' ne supporte pas le type de rendu '%(type)s'" #: prewikka/renderer/chartjs/__init__.py:104 msgid "ChartJS renderer backend" msgstr "Backend de rendu ChartJS" #: prewikka/renderer/chartjs/bar/__init__.py:38 msgid "ChartJS Bar renderer type" msgstr "Type de rendu ChartJS/Histogramme" #: prewikka/renderer/chartjs/timeline/__init__.py:85 msgid "ChartJS Timebar renderer type" msgstr "Type de rendu ChartJS/Histogramme temporel" #: prewikka/session/session.py:39 msgid "Invalid session" msgstr "Session invalide" #: prewikka/session/session.py:40 msgid "The session cookie carried by your browser is invalid" msgstr "Le cookie de session de votre navigateur est invalide" #: prewikka/session/session.py:44 msgid "Session expired" msgstr "Session expirée" #: prewikka/session/session.py:45 msgid "Your session has expired: please sign in again to continue using Prelude" msgstr "" "Votre session a expiré : veuillez vous réauthentifier pour continuer " "d'utiliser Prelude" #: prewikka/session/session.py:181 msgid "Logged out" msgstr "Session terminée" #: prewikka/session/anonymous/anonymous.py:31 msgid "Anonymous authentication" msgstr "Authentification anonyme" #: prewikka/templates/baseview.mak:148 msgid "View options" msgstr "Options de la vue" #: prewikka/templates/baseview.mak:151 msgid "View help" msgstr "Aide de la vue" #: prewikka/templates/baseview.mak:205 msgid "This app has been disabled or failed to load." msgstr "Cette app a été désactivée ou est impossible à charger" #: prewikka/templates/baseview.mak:211 prewikka/templates/baseview.mak:222 msgid "name" msgstr "nom" #: prewikka/templates/baseview.mak:287 msgid "About" msgstr "À propos" #: prewikka/templates/baseview.mak:290 msgid "Are you sure you want to log out?" msgstr "Êtes-vous sûr de vouloir vous déconnecter ?" #: prewikka/templates/baseview.mak:290 msgid "Logout" msgstr "Déconnexion" #: prewikka/templates/error.mak:66 msgid "Detail" msgstr "Détail" #: prewikka/templates/error.mak:67 msgid "Copy to clipboard" msgstr "Copier dans le presse papier" #: prewikka/templates/error.mak:137 prewikka/templates/error.mak:145 msgid "Error: {0}" msgstr "Erreur : {0}" #: prewikka/templates/error.mak:155 msgid "This may be due to one or more of the following reasons:" msgstr "Cela pourrait être dû à une ou plusieurs des raisons suivantes :" #: prewikka/templates/error.mak:157 msgid "You don't have the required permissions." msgstr "Vous n'avez pas les permissions requises." #: prewikka/templates/error.mak:158 #, python-format msgid "Required apps are disabled. See the %s page for more details." msgstr "" "Les apps nécessaires sont désactivées. Voir la page %s pour plus de " "détails." #: prewikka/templates/error.mak:176 prewikka/templates/toplayout.mak:61 #: prewikka/views/crontab/templates/cronjob.mak:122 #: prewikka/views/filter/templates/filteredition.mak:122 msgid "Cancel" msgstr "Annuler" #: prewikka/templates/error.mak:177 msgid "Sign in" msgstr "Authentification" #: prewikka/templates/error.mak:181 msgid "Back" msgstr "Retour" #: prewikka/templates/error.mak:184 msgid "Retry" msgstr "Réessayer" #: prewikka/templates/error.mak:186 msgid "Redirect to main page" msgstr "Page principale" #: prewikka/templates/mainmenu.mak:44 msgid "Refresh:" msgstr "Rafraîchir :" #: prewikka/templates/mainmenu.mak:49 msgid "Update frequency of the current page" msgstr "Fréquence de rafraîchissement de la page" #: prewikka/templates/mainmenu.mak:76 msgid "Period:" msgstr "Période :" #: prewikka/templates/mainmenu.mak:81 msgid "Period to visualize" msgstr "Période à visualiser" #: prewikka/templates/mainmenu.mak:111 msgid "Start:" msgstr "Début :" #: prewikka/templates/mainmenu.mak:117 msgid "start" msgstr "début" #: prewikka/templates/mainmenu.mak:117 msgid "Start date" msgstr "Date de début" #: prewikka/templates/mainmenu.mak:123 msgid "End:" msgstr "Fin :" #: prewikka/templates/mainmenu.mak:130 msgid "end" msgstr "fin" #: prewikka/templates/mainmenu.mak:130 msgid "End date" msgstr "Date de fin" #: prewikka/templates/toplayout.mak:57 msgid "Please Confirm" msgstr "Veuillez confirmer" #: prewikka/templates/toplayout.mak:73 msgid "Prelude Dialog" msgstr "Dialogue Prelude" #: prewikka/templates/toplayout.mak:88 msgid "Connection error" msgstr "Erreur de connexion" #: prewikka/templates/toplayout.mak:91 msgid "" "Connection failed, the server may be down or you may be experiencing " "network issues." msgstr "" "Connexion échouée, il peut s'agir d'un problème côté serveur ou de " "problèmes réseau." #: prewikka/utils/misc.py:72 prewikka/views/agents/agents.py:45 msgid "Offline" msgstr "Déconnecté" #: prewikka/utils/misc.py:75 prewikka/views/agents/agents.py:210 msgid "Unknown" msgstr "Inconnu" #: prewikka/utils/misc.py:78 msgid "Missing" msgstr "Manquant" #: prewikka/utils/misc.py:80 prewikka/views/agents/agents.py:44 msgid "Online" msgstr "Connecté" #: prewikka/views/about/__init__.py:13 msgid "Prelude About page" msgstr "Page d'à propos de Prelude" #: prewikka/views/about/templates/about.mak:11 #, python-format msgid "Prelude version %s" msgstr "Prelude version %s" #: prewikka/views/about/templates/about.mak:15 msgid "Prelude is a SIEM (Security Information and Event Management)" msgstr "Prelude est un SIEM (Security Information and Event Management)" #: prewikka/views/about/templates/about.mak:21 msgid "" "{prelude} is a security management solution that collects, filters, " "normalizes, correlates, stores and archives data from various sources of " "your information system. Based on all this information Prelude can " "provide a global vision of your system's security level and thus prevent " "attacks, intrusions as well as viral infections." msgstr "" "{prelude} est une solution de supervision de sécurité qui collecte, " "filtre, normalise, corrèle, stocke et archive les informations issues de " "sources disparates sur votre système d'information. À partir de " "l'ensemble de ces données Prelude peut fournir une vision globale du " "niveau de sécurité de votre système et ainsi prévenir les attaques, " "intrusions et autres infections virales." #: prewikka/views/about/templates/about.mak:24 msgid "Prelude Team:" msgstr "Équipe Prelude :" #: prewikka/views/about/templates/about.mak:25 msgid "" "Prelude OSS is an open-source project originally created by Yoann " "Vandoorselaere in 1998." msgstr "" "Prelude OSS est un projet open-source créé à l'origine par Yoann " "Vandoorselaere en 1998." #: prewikka/views/about/templates/about.mak:27 msgid "Vigilo is a NMS (Network Management System)" msgstr "Vigilo est un NMS (Network Management System)" #: prewikka/views/about/templates/about.mak:33 msgid "" "{vigilo} is a complete monitoring and performance management solution " "capable of handling medium and large-scale systems (network - servers - " "applications) due to its distributed and modular architecture. Vigilo " "offers all the features required for performance supervision: states and " "alarms management, metrology, cartography, event correlation and " "reporting." msgstr "" "{vigilo} est une solution complète de supervision de performances capable" " de gérer des systèmes de moyenne et grande envergure (réseau - serveurs " "- applications) grâce à une architecture répartie et modulaire. Vigilo " "offre toutes les fonctions nécessaires à la supervision de performances :" " la gestion des états et des alarmes, la métrologie, la cartographie, la " "corrélation d'événements et le reporting." #: prewikka/views/about/templates/about.mak:39 #, python-format msgid "" "Prelude SIEM and Vigilo NMS are being developed by the %s company, " "designer, integrator and operator of mission critical systems." msgstr "" "Prelude SIEM et Vigilo NMS sont développés par la société %s, concepteur," " intégrateur et opérateur de systèmes critiques." #: prewikka/views/about/templates/about.mak:44 msgid "Contact" msgstr "Contact" #: prewikka/views/about/templates/about.mak:46 msgid "Phone:" msgstr "Téléphone :" #: prewikka/views/about/templates/about.mak:47 msgid "Fax:" msgstr "Fax :" #: prewikka/views/about/templates/about.mak:50 msgid "Office" msgstr "Bureau" #: prewikka/views/about/templates/about.mak:56 msgid "Websites" msgstr "Sites web" #: prewikka/views/about/templates/about.mak:67 #: prewikka/views/aboutplugin/templates/aboutplugin.mak:132 #: prewikka/views/agents/templates/heartbeatanalyze.mak:71 #: prewikka/views/messagesummary/templates/messagesummary.mak:93 msgid "Close" msgstr "Fermer" #: prewikka/views/aboutplugin/__init__.py:36 msgid "Plugin installation and activation management page" msgstr "Page de gestion des plugins" #: prewikka/views/aboutplugin/__init__.py:40 #: prewikka/views/crontab/__init__.py:37 msgid "USER_MANAGEMENT" msgstr "USER MANAGEMENT" #: prewikka/views/aboutplugin/__init__.py:42 msgid "Apps: View" msgstr "Apps : Vues" #: prewikka/views/aboutplugin/__init__.py:43 msgid "Apps: API" msgstr "Apps : API" #: prewikka/views/aboutplugin/__init__.py:44 msgid "Apps: Dataprovider backend" msgstr "Apps : Moteur de collecte de données" #: prewikka/views/aboutplugin/__init__.py:45 msgid "Apps: Dataprovider type" msgstr "Apps : Type de collecte de données" #: prewikka/views/aboutplugin/__init__.py:46 msgid "Apps: Authentication" msgstr "Apps : Authentification" #: prewikka/views/aboutplugin/__init__.py:47 msgid "Apps: Identification" msgstr "Apps : Identification" #: prewikka/views/aboutplugin/__init__.py:48 msgid "Apps: Renderer backend" msgstr "Apps : Moteur de rendu" #: prewikka/views/aboutplugin/__init__.py:49 msgid "Apps: Renderer type" msgstr "Apps : Type de rendu" #: prewikka/views/aboutplugin/__init__.py:82 msgid "list plugin: list installed plugins" msgstr "list plugin : lister les plugins installés" #: prewikka/views/aboutplugin/__init__.py:91 msgid "Apps" msgstr "Apps" #: prewikka/views/aboutplugin/__init__.py:120 msgid "sync plugin: initialize the plugin database schemas" msgstr "sync plugin : initialiser les schémas de base de données des plugins" #: prewikka/views/aboutplugin/__init__.py:134 #, python-format msgid "Applying %(module)s %(script)s..." msgstr "Application de %(module)s %(script)s..." #: prewikka/views/aboutplugin/__init__.py:144 msgid "All updates applied" msgstr "Toutes les mises à jour appliquées" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:44 msgid "ERROR" msgstr "ERREUR" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:48 msgid "Update failed" msgstr "Mise à jour échouée" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:111 msgid "Update Dialog" msgstr "Dialogue de mise à jour" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:121 msgid "Plugin" msgstr "Plugin" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:122 msgid "Script" msgstr "Script" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:123 msgid "Result" msgstr "Résultat" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:144 msgid "Plugin Maintenance" msgstr "Maintenance des modules" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:147 msgid "" "The following apps need to be updated before they can be loaded into the " "system" msgstr "" "Les apps suivantes doivent être mises à jour avant d'être chargées dans " "le système" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:154 #: prewikka/views/aboutplugin/templates/aboutplugin.mak:190 #: prewikka/views/agents/templates/agents.mak:29 #: prewikka/views/agents/templates/heartbeatanalyze.mak:19 #: prewikka/views/crontab/templates/cronjob.mak:114 #: prewikka/views/crontab/templates/crontab.mak:17 #: prewikka/views/filter/templates/filterlisting.mak:23 #: prewikka/views/messagesummary/messagesummary.py:288 #: prewikka/views/messagesummary/messagesummary.py:425 #: prewikka/views/messagesummary/messagesummary.py:676 #: prewikka/views/messagesummary/messagesummary.py:693 #: prewikka/views/messagesummary/messagesummary.py:716 #: prewikka/views/messagesummary/messagesummary.py:778 #: prewikka/views/messagesummary/messagesummary.py:797 #: prewikka/views/messagesummary/messagesummary.py:833 #: prewikka/views/usermanagement/templates/usersettings.mak:15 msgid "Name" msgstr "Nom" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:155 #: prewikka/views/aboutplugin/templates/aboutplugin.mak:191 #: prewikka/views/filter/templates/filterlisting.mak:28 #: prewikka/views/idmefnav/templates/idmefnav.mak:56 #: prewikka/views/messagesummary/messagesummary.py:745 #: prewikka/views/messagesummary/messagesummary.py:751 msgid "Description" msgstr "Description" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:156 #: prewikka/views/aboutplugin/templates/aboutplugin.mak:192 #: prewikka/views/agents/templates/agents.mak:33 #: prewikka/views/messagesummary/messagesummary.py:427 #: prewikka/views/messagesummary/messagesummary.py:530 msgid "Version" msgstr "Version" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:157 msgid "Current database version" msgstr "Version actuelle de base de données" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:158 msgid "Required database update" msgstr "Mise à jour de base de données nécessaire" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:174 msgid "Install update" msgstr "Installer mise à jour" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:182 msgid "Installed Apps" msgstr "Apps installées" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:193 msgid "Database version" msgstr "Version de base de données" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:194 msgid "Active" msgstr "Actif" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:215 msgid "Update the selected apps?" msgstr "Mettre à jour les apps sélectionnées ?" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:215 msgid "Update" msgstr "Mettre à jour" #: prewikka/views/agents/__init__.py:12 msgid "Agents status information page" msgstr "Page d'information sur l'état des agents" #: prewikka/views/agents/agents.py:64 prewikka/views/agents/agents.py:133 msgid "Agents" msgstr "Agents" #: prewikka/views/agents/agents.py:110 msgid "Node name n/a" msgstr "Nom du nœud inconnu" #: prewikka/views/agents/agents.py:111 msgid "OS version n/a" msgstr "Version système inconnu" #: prewikka/views/agents/agents.py:112 msgid "OS type n/a" msgstr "Type du système inconnu" #: prewikka/views/agents/agents.py:117 msgid "Node location n/a" msgstr "Emplacement inconnu" #: prewikka/views/agents/agents.py:127 msgid "Alert listing" msgstr "Liste des alertes" #: prewikka/views/agents/agents.py:128 msgid "Heartbeat listing" msgstr "Liste des pulsations" #: prewikka/views/agents/agents.py:129 #: prewikka/views/agents/templates/heartbeatanalyze.mak:12 msgid "Heartbeat analysis" msgstr "Analyse des pulsations" #: prewikka/views/agents/agents.py:133 prewikka/views/agents/agents.py:157 #: prewikka/views/datasearch/idmef.py:158 #: prewikka/views/messagesummary/messagesummary.py:332 msgid "IDMEF_VIEW" msgstr "IDMEF VIEW" #: prewikka/views/agents/agents.py:133 #: prewikka/views/datasearch/heartbeat.py:55 msgid "Monitoring" msgstr "Supervision" #: prewikka/views/agents/agents.py:142 msgid "IDMEF_ALTER" msgstr "IDMEF ALTER" #: prewikka/views/agents/agents.py:184 msgid "Normal sensor start" msgstr "Démarrage normal de la sonde" #: prewikka/views/agents/agents.py:186 msgid "Unexpected sensor restart" msgstr "Redémarrage inopiné de la sonde" #: prewikka/views/agents/agents.py:192 #, python-format msgid "Unexpected heartbeat interval: %(delta)s" msgstr "Intervalle de pulsation inopiné : %(delta)s" #: prewikka/views/agents/agents.py:195 msgid "Normal sensor stop" msgstr "Arrêt normal de la sonde" #: prewikka/views/agents/agents.py:207 #, python-format msgid "Sensor is down since %s" msgstr "Sonde déconnectée depuis %s" #: prewikka/views/agents/agents.py:216 #, python-format msgid "" "No anomaly in the last %(count)d heartbeats (one heartbeat every " "%(delta)s average)" msgstr "" "Pas d'anomalie au cours des %(count)d dernières pulsations (une pulsation" " toutes les %(delta)s en moyenne)" #: prewikka/views/agents/templates/agents.mak:24 msgid "Show/Hide all" msgstr "Afficher/Cacher tout" #: prewikka/views/agents/templates/agents.mak:24 msgid "Search:" msgstr "Recherche :" #: prewikka/views/agents/templates/agents.mak:30 msgid "Location" msgstr "Emplacement" #: prewikka/views/agents/templates/agents.mak:31 msgid "Node" msgstr "Nœud" #: prewikka/views/agents/templates/agents.mak:32 #: prewikka/views/agents/templates/heartbeatanalyze.mak:20 #: prewikka/views/datasearch/heartbeat.py:67 #: prewikka/views/messagesummary/messagesummary.py:424 msgid "Model" msgstr "Modèle" #: prewikka/views/agents/templates/agents.mak:34 #: prewikka/views/messagesummary/messagesummary.py:428 msgid "Class" msgstr "Classe" #: prewikka/views/agents/templates/agents.mak:38 #: prewikka/views/agents/templates/heartbeatanalyze.mak:25 msgid "Latest heartbeat" msgstr "Dernière pulsation" #: prewikka/views/agents/templates/agents.mak:39 msgid "Status" msgstr "État" #: prewikka/views/agents/templates/agents.mak:83 msgid "Delete the alerts of the selected agent(s)" msgstr "Supprimer les alertes des agents sélectionnés ?" #: prewikka/views/agents/templates/agents.mak:87 msgid "Delete the heartbeats of the selected agent(s)" msgstr "Supprimer les pulsations des agents sélectionnés ?" #: prewikka/views/agents/templates/agents.mak:89 msgid "Delete the selected IDMEF messages?" msgstr "Supprimer les messages IDMEF sélectionnés ?" #: prewikka/views/agents/templates/agents.mak:89 #: prewikka/views/datasearch/idmef.py:195 #: prewikka/views/filter/templates/filterlisting.mak:42 msgid "Delete" msgstr "Effacer" #: prewikka/views/agents/templates/heartbeatanalyze.mak:21 msgid "OS" msgstr "OS" #: prewikka/views/agents/templates/heartbeatanalyze.mak:22 #: prewikka/views/datasearch/heartbeat.py:66 #: prewikka/views/messagesummary/messagesummary.py:412 msgid "Node name" msgstr "Nom du nœud" #: prewikka/views/agents/templates/heartbeatanalyze.mak:23 #: prewikka/views/messagesummary/messagesummary.py:395 msgid "Node location" msgstr "Emplacement du nœud" #: prewikka/views/agents/templates/heartbeatanalyze.mak:24 #: prewikka/views/datasearch/heartbeat.py:65 #: prewikka/views/messagesummary/messagesummary.py:418 msgid "Node address" msgstr "Adresse du nœud" #: prewikka/views/agents/templates/heartbeatanalyze.mak:26 msgid "Current status" msgstr "État actuel" #: prewikka/views/agents/templates/heartbeatanalyze.mak:56 msgid "Events" msgstr "Événements" #: prewikka/views/crontab/__init__.py:30 msgid "Scheduling management" msgstr "Gestion de la planification" #: prewikka/views/crontab/__init__.py:35 msgid "Scheduled jobs management page" msgstr "Page de gestion des tâches planifiées" #: prewikka/views/crontab/__init__.py:62 msgid "Configuration" msgstr "Configuration" #: prewikka/views/crontab/__init__.py:62 msgid "Scheduling" msgstr "Planification" #: prewikka/views/crontab/__init__.py:75 prewikka/views/crontab/__init__.py:104 msgid "SYSTEM" msgstr "SYSTÈME" #: prewikka/views/crontab/__init__.py:88 msgid "Pending" msgstr "En attente" #: prewikka/views/crontab/__init__.py:98 msgid "Error" msgstr "Erreur" #: prewikka/views/crontab/templates/cronjob.mak:54 msgid "Schedule:" msgstr "Planification :" #: prewikka/views/crontab/templates/cronjob.mak:69 msgid "custom" msgstr "personnalisé" #: prewikka/views/crontab/templates/cronjob.mak:70 msgid "disabled" msgstr "désactivé" #: prewikka/views/crontab/templates/cronjob.mak:79 msgid "Minute:" msgstr "Minute :" #: prewikka/views/crontab/templates/cronjob.mak:83 msgid "Hour:" msgstr "Heure :" #: prewikka/views/crontab/templates/cronjob.mak:87 msgid "Day:" msgstr "Jour :" #: prewikka/views/crontab/templates/cronjob.mak:91 msgid "Month:" msgstr "Mois :" #: prewikka/views/crontab/templates/cronjob.mak:95 msgid "Weekday:" msgstr "Jour de la semaine :" #: prewikka/views/crontab/templates/cronjob.mak:107 msgid "Edit Job" msgstr "Éditer la tâche" #: prewikka/views/crontab/templates/cronjob.mak:112 #: prewikka/views/filter/templates/filteredition.mak:73 #: prewikka/views/usermanagement/templates/usersettings.mak:13 msgid "Name:" msgstr "Nom :" #: prewikka/views/crontab/templates/cronjob.mak:123 #: prewikka/views/filter/templates/filteredition.mak:123 #: prewikka/views/usermanagement/templates/usersettings.mak:61 msgid "Save" msgstr "Enregistrer" #: prewikka/views/crontab/templates/crontab.mak:15 msgid "Scheduled Jobs" msgstr "Tâches planifiées" #: prewikka/views/crontab/templates/crontab.mak:18 msgid "Schedule" msgstr "Planification" #: prewikka/views/crontab/templates/crontab.mak:19 msgid "User" msgstr "Utilisateur" #: prewikka/views/crontab/templates/crontab.mak:20 msgid "Last execution" msgstr "Dernière exécution" #: prewikka/views/crontab/templates/crontab.mak:21 msgid "Next execution" msgstr "Prochaine exécution" #: prewikka/views/crontab/templates/crontab.mak:69 msgid "Disable" msgstr "Désactiver" #: prewikka/views/crontab/templates/crontab.mak:70 msgid "Enable" msgstr "Activer" #: prewikka/views/datasearch/alert.py:71 msgid "Alert listing page" msgstr "Page des alertes" #: prewikka/views/datasearch/alert.py:76 msgid "Aggregated alerts" msgstr "Alertes agrégées" #: prewikka/views/datasearch/alert.py:87 #: prewikka/views/datasearch/heartbeat.py:63 #: prewikka/views/datasearch/threat.py:74 msgid "Date" msgstr "Date" #: prewikka/views/datasearch/alert.py:89 prewikka/views/datasearch/threat.py:76 msgid "Source" msgstr "Source" #: prewikka/views/datasearch/alert.py:90 prewikka/views/datasearch/threat.py:77 msgid "Target" msgstr "Cible" #: prewikka/views/datasearch/alert.py:91 msgid "Analyzer" msgstr "Analyseur" #: prewikka/views/datasearch/alert.py:94 msgid "Delete the selected alerts?" msgstr "Supprimer les alertes sélectionnées ?" #: prewikka/views/datasearch/alert.py:148 #: prewikka/views/idmefnav/__init__.py:44 msgid "IDMEF" msgstr "IDMEF" #: prewikka/views/datasearch/datasearch.py:48 msgid "minute" msgstr "minute" #: prewikka/views/datasearch/datasearch.py:48 msgid "hour" msgstr "heure" #: prewikka/views/datasearch/datasearch.py:48 msgid "day" msgstr "jour" #: prewikka/views/datasearch/datasearch.py:48 msgid "month" msgstr "mois" #: prewikka/views/datasearch/datasearch.py:48 msgid "year" msgstr "an" #: prewikka/views/datasearch/datasearch.py:161 msgid "Time group error" msgstr "Erreur de groupe temporel" #: prewikka/views/datasearch/datasearch.py:161 msgid "Only one time unit can be specified in a groupby query" msgstr "" "Seule une unité temporelle peut être spécifiée dans une requête " "d'agrégation" #: prewikka/views/datasearch/datasearch.py:446 msgid "Forensic" msgstr "Forensic" #: prewikka/views/datasearch/datasearch.py:446 msgid "Dashboard" msgstr "Tableau de bord" #: prewikka/views/datasearch/datasearch.py:490 msgid "CSV export" msgstr "Export CSV" #: prewikka/views/datasearch/datasearch.py:622 msgid "General" msgstr "Général" #: prewikka/views/datasearch/heartbeat.py:51 msgid "Heartbeat listing page" msgstr "Page des pulsations" #: prewikka/views/datasearch/heartbeat.py:56 msgid "Aggregated heartbeats" msgstr "Pulsations agrégées" #: prewikka/views/datasearch/heartbeat.py:64 msgid "Agent" msgstr "Agent" #: prewikka/views/datasearch/heartbeat.py:69 msgid "Delete the selected heartbeats?" msgstr "Supprimer les pulsations sélectionnées ?" #: prewikka/views/datasearch/idmef.py:46 msgid "See IDMEF details" msgstr "Voir les détails IDMEF" #: prewikka/views/datasearch/threat.py:66 msgid "Threat listing page" msgstr "Page des menaces" #: prewikka/views/datasearch/threat.py:69 #: prewikka/views/datasearch/threat.py:70 msgid "Threats" msgstr "Menaces" #: prewikka/views/datasearch/threat.py:70 msgid "Aggregated threats" msgstr "Menaces agrégées" #: prewikka/views/datasearch/threat.py:78 msgid "Program" msgstr "Programme" #: prewikka/views/datasearch/templates/details.mak:26 #, python-format msgid "Group by %s" msgstr "Grouper par %s" #: prewikka/views/datasearch/templates/details.mak:30 #: prewikka/views/datasearch/templates/forensic.mak:219 msgid "Add to search" msgstr "Ajouter à la recherche" #: prewikka/views/datasearch/templates/details.mak:31 #: prewikka/views/datasearch/templates/forensic.mak:220 msgid "Exclude from search" msgstr "Exclure de la recherche" #: prewikka/views/datasearch/templates/forensic.mak:9 msgid "Fields" msgstr "Champs" #: prewikka/views/datasearch/templates/forensic.mak:10 msgid "Query history" msgstr "Historique des requêtes" #: prewikka/views/datasearch/templates/forensic.mak:63 msgid "Chart type" msgstr "Type de graphe" #: prewikka/views/datasearch/templates/forensic.mak:73 msgid "Limit" msgstr "Limite" #: prewikka/views/datasearch/templates/forensic.mak:89 msgid "Expert mode" msgstr "Mode expert" #: prewikka/views/datasearch/templates/forensic.mak:96 msgid "Condensed mode" msgstr "Mode condensé" #: prewikka/views/datasearch/templates/forensic.mak:108 msgid "Search mode" msgstr "Mode de recherche" #: prewikka/views/datasearch/templates/forensic.mak:112 #: prewikka/views/datasearch/templates/forensic.mak:217 msgid "Search" msgstr "Rechercher" #: prewikka/views/datasearch/templates/forensic.mak:114 msgid "Reset search" msgstr "Réinitialiser la recherche" #: prewikka/views/datasearch/templates/forensic.mak:124 #: prewikka/views/datasearch/templates/forensic.mak:222 msgid "Group by" msgstr "Grouper par" #: prewikka/views/datasearch/templates/forensic.mak:125 msgid "Select your field" msgstr "Sélectionner votre champ" #: prewikka/views/datasearch/templates/forensic.mak:126 msgid "Time values" msgstr "Valeurs temporelles" #: prewikka/views/datasearch/templates/forensic.mak:131 #, python-format msgid "%s fields" msgstr "Champs %s" #: prewikka/views/datasearch/templates/forensic.mak:167 msgid "Timeline" msgstr "Chronologie" #: prewikka/views/datasearch/templates/forensic.mak:221 msgid "New search" msgstr "Nouvelle recherche" #: prewikka/views/datasearch/templates/forensic.mak:231 #: prewikka/views/messagesummary/messagesummary.py:1026 msgid "Actions" msgstr "Actions" #: prewikka/views/datasearch/templates/forensic.mak:244 msgid "Informations" msgstr "Informations" #: prewikka/views/datasearch/templates/infos.mak:3 msgid "Field" msgstr "Champ" #: prewikka/views/datasearch/templates/infos.mak:9 msgid "Occurrence" msgstr "Occurrence" #: prewikka/views/datasearch/templates/table.mak:12 msgid "Count" msgstr "Total" #: prewikka/views/filter/__init__.py:11 msgid "Filters management page" msgstr "Page de gestion des filtres" #: prewikka/views/filter/filter.py:113 #: prewikka/views/usermanagement/usermanagement.py:18 msgid "Preferences" msgstr "Préférences" #: prewikka/views/filter/filter.py:113 #: prewikka/views/filter/templates/filterlisting.mak:17 msgid "Filters" msgstr "Filtres" #: prewikka/views/filter/filter.py:124 #: prewikka/views/filter/templates/filteredition.mak:66 #, python-format msgid "Filter %s" msgstr "Filtre %s" #: prewikka/views/filter/filter.py:199 msgid "Filter error" msgstr "Erreur de filtre" #: prewikka/views/filter/filter.py:199 #, python-format msgid "Filter '%s' does not exist" msgstr "Le filtre '%s' n'existe pas" #: prewikka/views/filter/filter.py:236 prewikka/views/filter/filter.py:248 msgid "Could not save filter" msgstr "Impossible de sauvegarder le filtre" #: prewikka/views/filter/filter.py:236 msgid "No name for this filter was provided" msgstr "Nom du filtre non renseigné" #: prewikka/views/filter/filter.py:248 msgid "The filter name is already used by another filter" msgstr "Le nom du filtre est déjà utilisé par un autre filtre" #: prewikka/views/filter/templates/filteredition.mak:66 #: prewikka/views/filter/templates/filterlisting.mak:17 #: prewikka/views/filter/templates/menu.mak:48 msgid "New filter" msgstr "Nouveau filtre" #: prewikka/views/filter/templates/filteredition.mak:75 msgid "Filter name" msgstr "Nom du filtre" #: prewikka/views/filter/templates/filteredition.mak:80 msgid "Category:" msgstr "Catégorie :" #: prewikka/views/filter/templates/filteredition.mak:92 msgid "Description:" msgstr "Description :" #: prewikka/views/filter/templates/filterlisting.mak:24 #: prewikka/views/messagesummary/messagesummary.py:750 msgid "Category" msgstr "Catégorie" #: prewikka/views/filter/templates/filterlisting.mak:40 msgid "Create" msgstr "Créer" #: prewikka/views/filter/templates/filterlisting.mak:41 msgid "Duplicate" msgstr "Dupliquer" #: prewikka/views/filter/templates/filterlisting.mak:42 msgid "Delete the selected filters?" msgstr "Supprimer les filtres sélectionnés ?" #: prewikka/views/filter/templates/menu.mak:4 msgid "Filter:" msgstr "Filtre :" #: prewikka/views/filter/templates/menu.mak:38 msgid "Available filters" msgstr "Filtres disponibles" #: prewikka/views/filter/templates/menu.mak:46 msgid "No filter" msgstr "Pas de filtre" #: prewikka/views/filter/templates/menu.mak:51 msgid "No category" msgstr "Pas de catégorie" #: prewikka/views/filter/templates/widget.mak:7 msgid "Select a path..." msgstr "Sélectionner un chemin..." #: prewikka/views/filter/templates/widget.mak:9 msgid "Default paths" msgstr "Chemins par défaut" #: prewikka/views/filter/templates/widget.mak:15 msgid "All paths" msgstr "Tous les chemins" #: prewikka/views/filter/templates/widget.mak:25 #: prewikka/views/filter/templates/widget.mak:46 msgid "Change operator" msgstr "Modifier l'opérateur" #: prewikka/views/filter/templates/widget.mak:32 msgid "value" msgstr "valeur" #: prewikka/views/filter/templates/widget.mak:34 msgid "Delete condition" msgstr "Supprimer la condition" #: prewikka/views/filter/templates/widget.mak:42 msgid "AND" msgstr "ET" #: prewikka/views/filter/templates/widget.mak:42 msgid "OR" msgstr "OU" #: prewikka/views/filter/templates/widget.mak:56 msgid "Add condition" msgstr "Ajouter une condition" #: prewikka/views/filter/templates/widget.mak:57 msgid "Add group" msgstr "Ajouter un groupe" #: prewikka/views/filter/templates/widget.mak:59 msgid "Delete group" msgstr "Supprimer le groupe" #: prewikka/views/idmefnav/__init__.py:36 msgid "IDMEF navigator" msgstr "Navigateur IDMEF" #: prewikka/views/idmefnav/__init__.py:44 msgid "Help" msgstr "Aide" #: prewikka/views/idmefnav/templates/idmefnav.mak:12 msgid "Children" msgstr "Enfants" #: prewikka/views/idmefnav/templates/idmefnav.mak:20 msgid "Aggregates" msgstr "Agrégats" #: prewikka/views/idmefnav/templates/idmefnav.mak:36 msgid "Attributes" msgstr "Attributs" #: prewikka/views/idmefnav/templates/idmefnav.mak:54 msgid "Rank" msgstr "Rang" #: prewikka/views/idmefnav/templates/idmefnav.mak:55 msgid "Keyword" msgstr "Mot-clé" #: prewikka/views/messagesummary/__init__.py:13 msgid "Detailed alert and heartbeat page" msgstr "Page détaillée d'alerte et pulsation" #: prewikka/views/messagesummary/messagesummary.py:289 #: prewikka/views/messagesummary/messagesummary.py:578 msgid "Code" msgstr "Code" #: prewikka/views/messagesummary/messagesummary.py:290 msgid "Data length" msgstr "Taille des données" #: prewikka/views/messagesummary/messagesummary.py:291 msgid "Data" msgstr "Données" #: prewikka/views/messagesummary/messagesummary.py:365 #, python-format msgid "(agent local time: %s)" msgstr "(heure locale de la sonde : %s)" #: prewikka/views/messagesummary/messagesummary.py:372 #: prewikka/views/messagesummary/messagesummary.py:835 msgid "Create time" msgstr "Heure de création" #: prewikka/views/messagesummary/messagesummary.py:375 msgid "Detect time" msgstr "Heure de détection" #: prewikka/views/messagesummary/messagesummary.py:380 msgid "Analyzer time" msgstr "Heure de l'analyseur" #: prewikka/views/messagesummary/messagesummary.py:386 msgid "Process" msgstr "Processus" #: prewikka/views/messagesummary/messagesummary.py:387 msgid "Process Path" msgstr "Chemin du processus" #: prewikka/views/messagesummary/messagesummary.py:388 msgid "Process PID" msgstr "ID du processus" #: prewikka/views/messagesummary/messagesummary.py:415 msgid "Node name (resolved)" msgstr "Nom du nœud (résolu)" #: prewikka/views/messagesummary/messagesummary.py:426 msgid "Analyzerid" msgstr "ID de l'analyseur" #: prewikka/views/messagesummary/messagesummary.py:430 msgid "Manufacturer" msgstr "Fabricant" #: prewikka/views/messagesummary/messagesummary.py:438 msgid "Operating System" msgstr "Système d'Exploitation" #: prewikka/views/messagesummary/messagesummary.py:456 #, python-format msgid "Analyzer Path (%d not shown)" msgstr "Chemin vers l'analyseur (%d non visibles)" #: prewikka/views/messagesummary/messagesummary.py:463 #: prewikka/views/messagesummary/messagesummary.py:1035 #: prewikka/views/messagesummary/messagesummary.py:1106 #, python-format msgid "Analyzer #%d" msgstr "Analyseur #%d" #: prewikka/views/messagesummary/messagesummary.py:473 msgid "Additional data" msgstr "Données Additionnelles" #: prewikka/views/messagesummary/messagesummary.py:476 #: prewikka/views/messagesummary/messagesummary.py:717 msgid "Meaning" msgstr "Signification" #: prewikka/views/messagesummary/messagesummary.py:477 msgid "Value" msgstr "Valeur" #: prewikka/views/messagesummary/messagesummary.py:531 #: prewikka/views/messagesummary/messagesummary.py:552 msgid "Header length" msgstr "Taille de l'en-tête" #: prewikka/views/messagesummary/messagesummary.py:532 msgid "TOS" msgstr "TOS" #: prewikka/views/messagesummary/messagesummary.py:533 #: prewikka/views/messagesummary/messagesummary.py:571 msgid "Length" msgstr "Taille" #: prewikka/views/messagesummary/messagesummary.py:534 #: prewikka/views/messagesummary/messagesummary.py:580 msgid "Id" msgstr "Id" #: prewikka/views/messagesummary/messagesummary.py:538 msgid "Ip offset" msgstr "Décalage ip" #: prewikka/views/messagesummary/messagesummary.py:539 msgid "TTL" msgstr "TTL" #: prewikka/views/messagesummary/messagesummary.py:540 #: prewikka/views/messagesummary/messagesummary.py:926 #: prewikka/views/messagesummary/messagesummary.py:929 #: prewikka/views/messagesummary/messagesummary.py:932 msgid "Protocol" msgstr "Protocole" #: prewikka/views/messagesummary/messagesummary.py:541 #: prewikka/views/messagesummary/messagesummary.py:563 #: prewikka/views/messagesummary/messagesummary.py:572 #: prewikka/views/messagesummary/messagesummary.py:579 msgid "Checksum" msgstr "Somme de contrôle" #: prewikka/views/messagesummary/messagesummary.py:542 msgid "Source address" msgstr "Adresse source" #: prewikka/views/messagesummary/messagesummary.py:543 msgid "Target address" msgstr "Adresse cible" #: prewikka/views/messagesummary/messagesummary.py:553 msgid "Reserved" msgstr "Réservé" #: prewikka/views/messagesummary/messagesummary.py:562 msgid "Window" msgstr "Fenêtre" #: prewikka/views/messagesummary/messagesummary.py:564 msgid "URP" msgstr "URP" #: prewikka/views/messagesummary/messagesummary.py:577 #: prewikka/views/messagesummary/messagesummary.py:744 #: prewikka/views/messagesummary/messagesummary.py:777 #: prewikka/views/messagesummary/messagesummary.py:796 msgid "Type" msgstr "Type" #: prewikka/views/messagesummary/messagesummary.py:581 msgid "Seq #" msgstr "Seq #" #: prewikka/views/messagesummary/messagesummary.py:582 msgid "Mask" msgstr "Masque" #: prewikka/views/messagesummary/messagesummary.py:583 msgid "Gateway Address" msgstr "Adresse de la Passerelle" #: prewikka/views/messagesummary/messagesummary.py:584 msgid "Num address" msgstr "Adresse" #: prewikka/views/messagesummary/messagesummary.py:585 msgid "Wpa" msgstr "Wpa" #: prewikka/views/messagesummary/messagesummary.py:586 msgid "Lifetime" msgstr "Durée de vie" #: prewikka/views/messagesummary/messagesummary.py:587 msgid "Otime" msgstr "OTemps" #: prewikka/views/messagesummary/messagesummary.py:588 msgid "Rtime" msgstr "Temps" #: prewikka/views/messagesummary/messagesummary.py:589 msgid "Ttime" msgstr "Temps" #: prewikka/views/messagesummary/messagesummary.py:595 #: prewikka/views/messagesummary/messagesummary.py:1082 msgid "Payload" msgstr "Charge utile" #: prewikka/views/messagesummary/messagesummary.py:648 msgid "Alert details" msgstr "Détails de l'alerte" #: prewikka/views/messagesummary/messagesummary.py:653 #, python-format msgid "%d linked alerts missing (probably deleted)" msgstr "%d alertes liées manquantes (probablement effacées)" #: prewikka/views/messagesummary/messagesummary.py:657 #, python-format msgid "%d linked alerts omitted" msgstr "%d alertes liées omises" #: prewikka/views/messagesummary/messagesummary.py:674 #: prewikka/views/messagesummary/messagesummary.py:991 msgid "Correlation Alert" msgstr "Alerte de Corrélation" #: prewikka/views/messagesummary/messagesummary.py:680 msgid "Correlated Alerts" msgstr "Alertes corrélées" #: prewikka/views/messagesummary/messagesummary.py:681 #: prewikka/views/messagesummary/messagesummary.py:698 msgid "Source Analyzer" msgstr "Analyseur Source" #: prewikka/views/messagesummary/messagesummary.py:691 #: prewikka/views/messagesummary/messagesummary.py:994 msgid "Tool Alert" msgstr "Alerte d'Outil" #: prewikka/views/messagesummary/messagesummary.py:697 msgid "Linked Alerts" msgstr "Alertes liées" #: prewikka/views/messagesummary/messagesummary.py:708 msgid "Text" msgstr "Texte" #: prewikka/views/messagesummary/messagesummary.py:710 msgid "Ident" msgstr "Identité" #: prewikka/views/messagesummary/messagesummary.py:715 msgid "Origin" msgstr "Origine" #: prewikka/views/messagesummary/messagesummary.py:738 msgid "Severity" msgstr "Gravité" #: prewikka/views/messagesummary/messagesummary.py:741 msgid "Completion" msgstr "Accomplissement" #: prewikka/views/messagesummary/messagesummary.py:774 msgid "User category" msgstr "Catégorie d'utilisateur" #: prewikka/views/messagesummary/messagesummary.py:779 #: prewikka/views/messagesummary/messagesummary.py:798 msgid "Number" msgstr "Nombre" #: prewikka/views/messagesummary/messagesummary.py:780 msgid "Tty" msgstr "Tty" #: prewikka/views/messagesummary/messagesummary.py:799 msgid "Permission" msgstr "Permission" #: prewikka/views/messagesummary/messagesummary.py:821 msgid "Change time" msgstr "Modifier le temps" #: prewikka/views/messagesummary/messagesummary.py:822 msgid "Inode Number" msgstr "Numéro de l'Inode" #: prewikka/views/messagesummary/messagesummary.py:823 msgid "Major device" msgstr "Périphérique majeur" #: prewikka/views/messagesummary/messagesummary.py:824 msgid "Minor device" msgstr "Périphérique mineur" #: prewikka/views/messagesummary/messagesummary.py:825 msgid "C Major device" msgstr "Périphérique majeur C" #: prewikka/views/messagesummary/messagesummary.py:826 msgid "C Minor device" msgstr "Périphérique mineur C" #: prewikka/views/messagesummary/messagesummary.py:830 #, python-format msgid "Target file %s" msgstr "Fichier cible %s" #: prewikka/views/messagesummary/messagesummary.py:830 msgid "category" msgstr "catégorie" #: prewikka/views/messagesummary/messagesummary.py:834 msgid "Path" msgstr "Chemin" #: prewikka/views/messagesummary/messagesummary.py:836 msgid "Modify time" msgstr "Temps de modification" #: prewikka/views/messagesummary/messagesummary.py:837 msgid "Access time" msgstr "Temps d'accès" #: prewikka/views/messagesummary/messagesummary.py:838 msgid "Data size" msgstr "Taille des données" #: prewikka/views/messagesummary/messagesummary.py:839 msgid "Disk size" msgstr "Taille du disque" #: prewikka/views/messagesummary/messagesummary.py:858 msgid "Web Service" msgstr "Service Web" #: prewikka/views/messagesummary/messagesummary.py:861 msgid "Url" msgstr "Url" #: prewikka/views/messagesummary/messagesummary.py:862 msgid "Cgi" msgstr "Cgi" #: prewikka/views/messagesummary/messagesummary.py:863 msgid "Http Method" msgstr "Méthode http" #: prewikka/views/messagesummary/messagesummary.py:866 msgid "CGI Argument" msgstr "Argument CGI" #: prewikka/views/messagesummary/messagesummary.py:875 msgid "SNMP Service" msgstr "Service SNMP" #: prewikka/views/messagesummary/messagesummary.py:878 msgid "oid" msgstr "oid" #: prewikka/views/messagesummary/messagesummary.py:879 msgid "messageProcessingModel" msgstr "modèleParcoursMessage" #: prewikka/views/messagesummary/messagesummary.py:880 msgid "securityModel" msgstr "modèleSécurité" #: prewikka/views/messagesummary/messagesummary.py:881 msgid "securityName" msgstr "nomSécurité" #: prewikka/views/messagesummary/messagesummary.py:882 msgid "securityLevel" msgstr "niveauSécurité" #: prewikka/views/messagesummary/messagesummary.py:883 msgid "contextName" msgstr "nomContexte" #: prewikka/views/messagesummary/messagesummary.py:884 msgid "contextEngineID" msgstr "IDmoteurContexte" #: prewikka/views/messagesummary/messagesummary.py:885 msgid "command" msgstr "commande" #: prewikka/views/messagesummary/messagesummary.py:897 #: prewikka/views/messagesummary/messagesummary.py:899 msgid "Port" msgstr "Port" #: prewikka/views/messagesummary/messagesummary.py:919 msgid "PortList" msgstr "Liste des ports" #: prewikka/views/messagesummary/messagesummary.py:922 msgid "ip_version" msgstr "Version IP" #: prewikka/views/messagesummary/messagesummary.py:958 #, python-format msgid "Source(%d)" msgstr "Source(%d)" #: prewikka/views/messagesummary/messagesummary.py:973 #, python-format msgid "Target(%d)" msgstr "Cible(%d)" #: prewikka/views/messagesummary/messagesummary.py:997 msgid "Overflow Alert" msgstr "Alerte de débordement" #: prewikka/views/messagesummary/messagesummary.py:1000 msgid "Alert" msgstr "Alerte" #: prewikka/views/messagesummary/messagesummary.py:1018 msgid "MessageID" msgstr "MessageID" #: prewikka/views/messagesummary/messagesummary.py:1065 msgid "Network centric information" msgstr "Informations réseau" #: prewikka/views/messagesummary/messagesummary.py:1087 msgid "ASCII Payload" msgstr "Charge utile ASCII" #: prewikka/views/messagesummary/messagesummary.py:1103 msgid "Heartbeat" msgstr "Pulsation" #: prewikka/views/messagesummary/templates/messagesummary.mak:85 msgid "Summary" msgstr "Résumé" #: prewikka/views/usermanagement/__init__.py:14 msgid "User settings page" msgstr "Page de paramètres utilisateur" #: prewikka/views/usermanagement/usermanagement.py:18 msgid "My account" msgstr "Mon compte" #: prewikka/views/usermanagement/usermanagement.py:23 msgid "Invalid User" msgstr "Utilisateur invalide" #: prewikka/views/usermanagement/usermanagement.py:23 #, python-format msgid "Requested user '%s' does not exist" msgstr "L'utilisateur '%s' n'existe pas" #: prewikka/views/usermanagement/usermanagement.py:43 msgid "Invalid Language" msgstr "Langue invalide" #: prewikka/views/usermanagement/usermanagement.py:43 msgid "Specified language does not exist" msgstr "La langue spécifiée n'existe pas" #: prewikka/views/usermanagement/usermanagement.py:47 msgid "Invalid Timezone" msgstr "Fuseau horaire invalide" #: prewikka/views/usermanagement/usermanagement.py:47 msgid "Specified timezone does not exist" msgstr "Le fuseau horaire spécifié n'existe pas" #: prewikka/views/usermanagement/templates/usersettings.mak:6 msgid "Login:" msgstr "Identifiant :" #: prewikka/views/usermanagement/templates/usersettings.mak:20 msgid "Email:" msgstr "Email :" #: prewikka/views/usermanagement/templates/usersettings.mak:22 msgid "Email" msgstr "Email" #: prewikka/views/usermanagement/templates/usersettings.mak:27 msgid "Language:" msgstr "Langue :" #: prewikka/views/usermanagement/templates/usersettings.mak:39 msgid "Theme:" msgstr "Thème :" #: prewikka/views/usermanagement/templates/usersettings.mak:50 msgid "Timezone:" msgstr "Fuseau horaire :" #: scripts/prewikka-cli:59 msgid "Unknown command" msgstr "Commande inconnue" #: scripts/prewikka-cli:67 #, python-format msgid "An unexpected error occurred: %s" msgstr "Une erreur inattendue s'est produite : %s" #: scripts/prewikka-cli:154 msgid "Create an object of the specified type" msgstr "Créer un objet du type spécifié" #: scripts/prewikka-cli:157 msgid "Delete an object of the specified type" msgstr "Supprimer un objet du type spécifié" #: scripts/prewikka-cli:160 msgid "Import objects of the specified type from files" msgstr "Importer des objets du type spécifié à partir de fichiers" #: scripts/prewikka-cli:163 msgid "List objects of the specified type" msgstr "Lister les objets du type spécifié" #: scripts/prewikka-cli:166 msgid "Synchronize objects of the specified type" msgstr "Synchroniser les objets du type spécifié" #: scripts/prewikka-cli:169 msgid "Update objects of the specified type" msgstr "Mettre à jour des objets du type spécifié" #: scripts/prewikka-cli:207 msgid "Prewikka command-line tool" msgstr "Outil Prewikka en ligne de commande" #: scripts/prewikka-cli:208 msgid "name of the user" msgstr "nom de l'utilisateur" #: scripts/prewikka-cli:209 scripts/prewikka-crontab:99 #: scripts/prewikka-httpd:93 #, python-format msgid "configuration file to use (default: %(default)s)" msgstr "fichier de configuration (défaut : %(default)s)" #: scripts/prewikka-cli:210 msgid "command to execute" msgstr "commande à exécuter" #: scripts/prewikka-cli:211 msgid "enable debugging output" msgstr "active la sortie de débogage" #: scripts/prewikka-cli:218 msgid "prewikka-cli must be executed as the prewikka user" msgstr "prewikka-cli doit être exécuté en tant qu'utilisateur prewikka" #: scripts/prewikka-cli:243 #, python-format msgid "Prewikka command-line tool (%s)" msgstr "Outil Prewikka en ligne de commande (%s)" #: scripts/prewikka-cli:244 msgid "Type \"help\" or \"?\" to list commands" msgstr "Taper \"help\" ou \"?\" pour lister les commandes" #: scripts/prewikka-crontab:100 msgid "run as a system daemon" msgstr "lancer en arrière-plan" #: scripts/prewikka-crontab:101 scripts/prewikka-httpd:96 msgid "show this help message and exit" msgstr "afficher ce message d'aide et quitter" #: scripts/prewikka-crontab:102 scripts/prewikka-httpd:97 msgid "show program's version number and exit" msgstr "afficher le numéro de version du programme et quitter" #: scripts/prewikka-httpd:88 msgid "root where the server is accessible" msgstr "racine où le serveur est accessible" #: scripts/prewikka-httpd:89 #, python-format msgid "IP to bind to (default: %(default)s)" msgstr "IP d'écoute (défaut : %(default)s)" #: scripts/prewikka-httpd:90 #, python-format msgid "port number to use (default: %(default)d)" msgstr "numéro de port (défaut : %(default)d)" #: scripts/prewikka-httpd:91 msgid "SSL private key to use (default: no SSL)" msgstr "clé privée SSL (défaut : pas de SSL)" #: scripts/prewikka-httpd:92 msgid "SSL certificate to use (default: no SSL)" msgstr "certificat SSL (défaut : pas de SSL)" #: scripts/prewikka-httpd:95 #, python-format msgid "" "number of processes to use. Default value matches the number of available" " CPUs (i.e. %d)" msgstr "" "nombre de processus. La valeur par défaut correspond au nombre de CPU " "disponibles (ici %d)" prewikka-5.1.1/prewikka/locale/it/0000775000175000017500000000000013555143705020437 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/locale/it/LC_MESSAGES/0000775000175000017500000000000013555143705022224 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/locale/it/LC_MESSAGES/prewikka.po0000664000175000017500000017335713555143652024422 0ustar tandrejatandreja00000000000000# Italian Translation for Prewikka # Copyright (C) 2012-2019 CS-SI # This file is distributed under the same license as the prewikka package. # msgid "" msgstr "" "Project-Id-Version: Prewikka 5.1.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-09-04 19:03+0200\n" "PO-Revision-Date: 2018-02-09 12:07+0100\n" "Last-Translator: FULL NAME \n" "Language-Team: Italian\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 0.9.6\n" #: prewikka/baseview.py:79 prewikka/usergroup.py:52 msgid "Permission Denied" msgstr "Accesso negato" #: prewikka/baseview.py:79 msgid "Missing permission to access the specified file" msgstr "" #: prewikka/config.py:37 prewikka/dataprovider/__init__.py:645 msgid "Configuration error" msgstr "Errore di configurazione" #: prewikka/config.py:43 #, python-format msgid "Parse error in \"%(txt)s\" at %(file)s line %(line)d" msgstr "Errore di parsing in \"%(txt)s\" alla linea %(line)d di %(file)s" #: prewikka/config.py:48 prewikka/view.py:82 #, python-format msgid "Invalid value '%(value)s' for parameter '%(name)s'" msgstr "Valore invalido '%(value)s' per il parametro '%(name)s'" #: prewikka/config.py:54 #, python-format msgid "Missing value for parameter '%(name)s'" msgstr "Valore mancante per il parametro '%(name)s'" #: prewikka/crontab.py:37 msgid "Hourly" msgstr "Ogni ora" #: prewikka/crontab.py:38 msgid "Daily" msgstr "Quotidiano" #: prewikka/crontab.py:39 msgid "Weekly" msgstr "Settimanale" #: prewikka/crontab.py:40 msgid "Monthly" msgstr "Mensile" #: prewikka/crontab.py:41 msgid "Yearly" msgstr "Annuale" #: prewikka/crontab.py:42 prewikka/mainmenu.py:302 #: prewikka/templates/mainmenu.mak:92 msgid "Custom" msgstr "Personalizzato" #: prewikka/crontab.py:43 prewikka/views/crontab/__init__.py:84 msgid "Disabled" msgstr "Disabilitato" #: prewikka/crontab.py:105 msgid "Scheduled job execution failed" msgstr "Esecuzione dell'operazione pianificata fallita" #: prewikka/crontab.py:139 msgid "Invalid job extension" msgstr "Estensione di operazione invalida" #: prewikka/crontab.py:139 #, python-format msgid "Scheduled job with invalid extension type '%s'" msgstr "Operazione pianificata con tipo di estensione invalido '%s'" #: prewikka/crontab.py:206 #, fuzzy msgid "Invalid CronJob" msgstr "Sessione invalida" #: prewikka/crontab.py:206 #, python-format msgid "CronJob with id=%d cannot be found in database" msgstr "" #: prewikka/crontab.py:260 msgid "Invalid schedule" msgstr "Pianificazione non valida" #: prewikka/crontab.py:260 msgid "The specified job schedule is invalid" msgstr "L'operazione pianificata è invalida" #: prewikka/crontab.py:286 #, python-format msgid "Custom (%s)" msgstr "Personalizzato (%s)" #: prewikka/database.py:43 msgid "Database error" msgstr "Errore di database" #: prewikka/database.py:50 msgid "Database schema error" msgstr "Errore di schema del database" #: prewikka/database.py:293 msgid "database installation required" msgstr "installazione del database richiesta" #: prewikka/database.py:296 msgid "database activation required" msgstr "attivazione del database richiesta" #: prewikka/database.py:299 #, fuzzy, python-format msgid "database schema branch %(required)s required (found %(current)s)" msgstr "attivazione del database richiesta" #: prewikka/database.py:305 #, fuzzy, python-format msgid "database schema version %(required)s required (found %(current)s)" msgstr "attivazione del database richiesta" #: prewikka/database.py:372 msgid "Database installation error" msgstr "Errore di installazione del database" #: prewikka/database.py:374 #, python-format msgid "" "No database installation script found for module %(module)s, version " "%(version)s" msgstr "" #: prewikka/database.py:382 prewikka/database.py:420 msgid "Database migration error" msgstr "Errore di migrazione del database" #: prewikka/database.py:386 #, python-format msgid "" "No database branch migration script found for module %(module)s, branch " "transition %(current)s -> %(required)s" msgstr "" #: prewikka/database.py:424 #, python-format msgid "" "No linear migration script found for module %(module)s %(version1)s -> " "%(version2)s" msgstr "" #: prewikka/database.py:841 msgid "Database configuration error" msgstr "Errore di configurazione del database" #: prewikka/database.py:841 msgid "Only MySQL and PostgreSQL databases are supported at the moment" msgstr "Solamente MySQL e PostgreSQL sono supportati in questo momento" #: prewikka/error.py:48 prewikka/templates/error.mak:139 msgid "An unexpected condition happened" msgstr "Si è verificato un errore imprevisto" #: prewikka/error.py:148 msgid "Not implemented" msgstr "Non implementato" #: prewikka/error.py:150 msgid "Backend does not implement this operation" msgstr "Il backend non implementa questa operazione" #: prewikka/history.py:32 msgid "Search history deletion" msgstr "" #: prewikka/localization.py:143 msgid "%m/%Y" msgstr "%m/%Y" #: prewikka/localization.py:144 #, python-format msgid "%m/%d/%Y" msgstr "%d/%m/%Y" #: prewikka/localization.py:145 #, python-format msgid "%m/%d/%Y %Hh" msgstr "%d/%m/%Y %H:00" #: prewikka/localization.py:146 #, python-format msgid "%m/%d/%Y %H:%M" msgstr "%d/%m/%Y %H:%M" #: prewikka/localization.py:147 #, python-format msgid "%m/%d/%Y %H:%M:%S" msgstr "%d/%m/%Y %H:%M:%S" #: prewikka/localization.py:149 msgid "%H:%M" msgstr "%H:%M" #: prewikka/localization.py:150 msgid "%H:%M:%S" msgstr "%H:%M:%S" #: prewikka/localization.py:235 prewikka/localization.py:253 #: prewikka/renderer/__init__.py:62 prewikka/views/crontab/__init__.py:95 msgid "n/a" msgstr "" #: prewikka/localization.py:246 #, python-format msgid "%(days)dd %(hours)dh %(minutes)d'" msgstr "%(days)dg %(hours)do %(minutes)d'" #: prewikka/main.py:45 msgid "Version Requirement error" msgstr "Errore di requisito di versione" #: prewikka/main.py:48 #, python-format msgid "Prewikka %(vPre)s requires libprelude %(vLib)s or higher" msgstr "Prewikka %(vPre)s richiede libprelude %(vLib)s o successiva" #: prewikka/main.py:53 #, python-format msgid "Prewikka %(vPre)s requires libpreludedb %(vLib)s or higher" msgstr "Prewikka %(vPre)s richiede libpreludedb %(vLib)s o successiva" #: prewikka/main.py:136 prewikka/main.py:149 #: prewikka/dataprovider/plugins/idmef/__init__.py:57 msgid "Initialization error" msgstr "Errore di inizializzazione" #: prewikka/main.py:150 #, python-format msgid "" "Cannot use %(type)s mode '%(name)s', please contact your local " "administrator." msgstr "" #: prewikka/main.py:192 #, python-format msgid "Session '%s' does not accept any authentication module" msgstr "" #: prewikka/main.py:298 #, python-format msgid "An unexpected condition happened while trying to load %s" msgstr "Si è verificato un errore imprevisto durante il tentativo di caricare %s" #: prewikka/mainmenu.py:114 #, python-format msgid "%S.%.6f" msgstr "" #: prewikka/mainmenu.py:115 #, python-format msgid "%S.%.3f" msgstr "" #: prewikka/mainmenu.py:260 msgid "Today" msgstr "Oggi" #: prewikka/mainmenu.py:261 msgid "Yesterday" msgstr "Ieri" #: prewikka/mainmenu.py:262 msgid "This week" msgstr "Questa settimana" #: prewikka/mainmenu.py:263 msgid "Last week" msgstr "La settimana scorsa" #: prewikka/mainmenu.py:264 msgid "This month" msgstr "Questo mese" #: prewikka/mainmenu.py:265 msgid "Last month" msgstr "Lo scorso mese" #: prewikka/mainmenu.py:266 prewikka/mainmenu.py:267 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d ora" msgstr[1] "%d ore" #: prewikka/mainmenu.py:268 prewikka/mainmenu.py:269 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d giorno" msgstr[1] "%d giorni" #: prewikka/mainmenu.py:270 #, python-format msgid "%d week" msgid_plural "%d weeks" msgstr[0] "%d settimana" msgstr[1] "%d settimane" #: prewikka/mainmenu.py:271 prewikka/mainmenu.py:272 #, python-format msgid "%d month" msgid_plural "%d months" msgstr[0] "%d mese" msgstr[1] "%d mesi" #: prewikka/mainmenu.py:273 #, python-format msgid "%d year" msgid_plural "%d years" msgstr[0] "%d anno" msgstr[1] "%d anni" #: prewikka/mainmenu.py:277 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d secondo" msgstr[1] "%d secondi" #: prewikka/mainmenu.py:278 prewikka/mainmenu.py:279 prewikka/mainmenu.py:280 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d minuto" msgstr[1] "%d minuti" #: prewikka/mainmenu.py:299 prewikka/templates/mainmenu.mak:61 msgid "Inactive" msgstr "Inattivo" #: prewikka/mainmenu.py:305 prewikka/templates/mainmenu.mak:89 msgid "None" msgstr "Nessun" #: prewikka/menu.py:70 prewikka/menu.py:73 prewikka/menu.py:79 #: prewikka/menu.py:83 prewikka/menu.py:91 msgid "Menu error" msgstr "Errore di menu" #: prewikka/menu.py:70 #, fuzzy msgid "The provided YAML menu is invalid" msgstr "L'operazione pianificata è invalida" #: prewikka/menu.py:73 msgid "Empty menu" msgstr "Menu vuoto" #: prewikka/menu.py:79 #, python-format msgid "Menu without a name in %s" msgstr "Menu senza nome in %s" #: prewikka/menu.py:83 msgid "Multiple default menus" msgstr "Menu predefiniti multipli" #: prewikka/menu.py:91 msgid "Multiple default views" msgstr "Viste predefinite multiple" #: prewikka/pluginmanager.py:163 #, python-format msgid "Circular dependencies detected: %s" msgstr "Dipendenze circolari rilevate: %s" #: prewikka/pluginmanager.py:171 #, python-format msgid "Missing dependency: %s" msgstr "Dipendenza mancante: %s" #: prewikka/resolve.py:170 #, python-format msgid "" "Asynchronous DNS resolution disabled: twisted.names and twisted.internet " "required: %s" msgstr "" "Risoluzione DNS asincrona disabile: twisted.names et twisted.internet " "richiesti: %s" #: prewikka/usergroup.py:44 #, python-format msgid "Access to view '%(view)s' forbidden. Required permissions: %(permissions)s" msgstr "" "Accesso vietato alla vista '%(view)s'. Autorizzazioni richiesti: " "%(permissions)s" #: prewikka/usergroup.py:47 #, python-format msgid "Access to view '%s' forbidden" msgstr "Accesso vietato alla vista '%s'" #: prewikka/usergroup.py:50 #, python-format msgid "Required permissions: %s" msgstr "Autorizzazioni richiesti: %s" #: prewikka/view.py:74 prewikka/view.py:81 prewikka/view.py:88 msgid "Parameters Normalization failed" msgstr "Fallimento di normalizzazione dei parametri" #: prewikka/view.py:75 #, python-format msgid "Parameter '%s' is not valid" msgstr "Il parametro '%s' non è valido" #: prewikka/view.py:89 #, python-format msgid "Required parameter '%s' is missing" msgstr "Il parametro richiesto '%s' è mancante" #: prewikka/view.py:95 msgid "Invalid method" msgstr "Metodo non valido" #: prewikka/view.py:102 msgid "Invalid view" msgstr "Vista invalida" #: prewikka/view.py:528 #, python-format msgid "Method '%(method)s' is not allowed for view '%(view)s'" msgstr "Il metodo '%(method)s' non è permesso per la vista '%(view)s'" #: prewikka/view.py:532 prewikka/view.py:651 #, python-format msgid "View '%s' does not exist" msgstr "La vista '%s' non esiste" #: prewikka/auth/auth.py:30 msgid "Authentication failed" msgstr "Autenticazione fallita" #: prewikka/dataprovider/__init__.py:35 msgid "Equal" msgstr "Uguale" #: prewikka/dataprovider/__init__.py:36 msgid "Equal (case-insensitive)" msgstr "Uguale (case-insensitive)" #: prewikka/dataprovider/__init__.py:37 msgid "Not equal" msgstr "Diverso" #: prewikka/dataprovider/__init__.py:38 msgid "Not equal (case-insensitive)" msgstr "Diverso (case-insensitive)" #: prewikka/dataprovider/__init__.py:39 msgid "Regular expression" msgstr "Espressione regolare" #: prewikka/dataprovider/__init__.py:40 msgid "Regular expression (case-insensitive)" msgstr "Espressione regolare (case-insensitive)" #: prewikka/dataprovider/__init__.py:41 msgid "Not regular expression" msgstr "Non espressione regolare" #: prewikka/dataprovider/__init__.py:42 msgid "Not regular expression (case-insensitive)" msgstr "Non espressione regolare (case-insensitive)" #: prewikka/dataprovider/__init__.py:43 msgid "Lesser than" msgstr "Minore di" #: prewikka/dataprovider/__init__.py:44 msgid "Lesser or equal" msgstr "Minore o uguale" #: prewikka/dataprovider/__init__.py:45 msgid "Greater than" msgstr "Maggiore di" #: prewikka/dataprovider/__init__.py:46 msgid "Greater or equal" msgstr "Maggiore o uguale" #: prewikka/dataprovider/__init__.py:47 msgid "Substring" msgstr "Sottostringa" #: prewikka/dataprovider/__init__.py:48 msgid "Substring (case-insensitive)" msgstr "Sottastringa (case-insensitive)" #: prewikka/dataprovider/__init__.py:49 msgid "Not substring" msgstr "Non sottostringa" #: prewikka/dataprovider/__init__.py:50 msgid "Not substring (case-insensitive)" msgstr "Non sottastringa (case-insensitive)" #: prewikka/dataprovider/__init__.py:92 prewikka/dataprovider/__init__.py:158 msgid "Conversion error" msgstr "Errore di conversione" #: prewikka/dataprovider/__init__.py:93 prewikka/dataprovider/__init__.py:159 #, python-format msgid "Value %(value)r cannot be converted to %(type)s" msgstr "Valore %(value)r non può essere convertito in %(type)s" #: prewikka/dataprovider/__init__.py:109 msgid "Backend error" msgstr "Errore di backend" #: prewikka/dataprovider/__init__.py:109 #, python-format msgid "No backend available for '%s' datatype" msgstr "" #: prewikka/dataprovider/__init__.py:116 prewikka/dataprovider/__init__.py:123 msgid "Syntax error" msgstr "Errore di sintassi" #: prewikka/dataprovider/__init__.py:116 #, python-format msgid "Unknown path: %s" msgstr "Percorso sconosciuto: %s" #: prewikka/dataprovider/__init__.py:123 scripts/prewikka-cli:109 #: scripts/prewikka-cli:118 scripts/prewikka-cli:129 #, fuzzy msgid "Could not parse input" msgstr "Impossibile salvare il filtro" #: prewikka/dataprovider/__init__.py:635 #, python-format msgid "No handler configured for '%s' datatype" msgstr "" #: prewikka/dataprovider/__init__.py:646 #, python-format msgid "Only one manager should be configured for '%s' backend" msgstr "" #: prewikka/dataprovider/idmef.py:128 msgid "High" msgstr "Alta" #: prewikka/dataprovider/idmef.py:129 msgid "Medium" msgstr "Media" #: prewikka/dataprovider/idmef.py:130 msgid "Low" msgstr "Bassa" #: prewikka/dataprovider/idmef.py:131 msgid "Informational" msgstr "Informativo" #: prewikka/dataprovider/idmef.py:141 msgid "Provides an API to fetch IDMEF alerts" msgstr "" #: prewikka/dataprovider/idmef.py:142 #: prewikka/views/agents/templates/agents.mak:83 #: prewikka/views/datasearch/alert.py:75 prewikka/views/datasearch/alert.py:76 msgid "Alerts" msgstr "Allerte" #: prewikka/dataprovider/idmef.py:149 prewikka/views/datasearch/alert.py:88 #: prewikka/views/datasearch/threat.py:75 msgid "Classification" msgstr "Classificazione" #: prewikka/dataprovider/idmef.py:150 msgid "Source IP" msgstr "IP di origine" #: prewikka/dataprovider/idmef.py:151 #: prewikka/views/messagesummary/messagesummary.py:548 #: prewikka/views/messagesummary/messagesummary.py:569 msgid "Source port" msgstr "Porta di origine" #: prewikka/dataprovider/idmef.py:152 msgid "Target IP" msgstr "IP di destinazione" #: prewikka/dataprovider/idmef.py:153 #: prewikka/views/messagesummary/messagesummary.py:549 #: prewikka/views/messagesummary/messagesummary.py:570 msgid "Target port" msgstr "Porta di destinazione" #: prewikka/dataprovider/idmef.py:154 msgid "Analyzer name" msgstr "Nome dell'analizzatore" #: prewikka/dataprovider/idmef.py:157 #, fuzzy msgid "Alert deletion" msgstr "Elenco delle allerte" #: prewikka/dataprovider/idmef.py:182 msgid "Provides an API to fetch IDMEF heartbeats" msgstr "" #: prewikka/dataprovider/idmef.py:183 #: prewikka/views/agents/templates/agents.mak:87 #: prewikka/views/datasearch/heartbeat.py:56 msgid "Heartbeats" msgstr "Pulsazioni" #: prewikka/dataprovider/idmef.py:188 #, fuzzy msgid "Heartbeat deletion" msgstr "Elenco delle pulsazioni" #: prewikka/dataprovider/parsers/lucene/__init__.py:52 #, fuzzy msgid "Lucene emulation error" msgstr "Errore di normalizzazione del backend" #: prewikka/dataprovider/parsers/lucene/__init__.py:53 msgid "" "This Lucene expression cannot be emulated properly using the Criterion " "backend" msgstr "" #: prewikka/dataprovider/plugins/idmef/__init__.py:97 msgid "Plugin for fetching IDMEF alerts from the Prelude database" msgstr "" #: prewikka/dataprovider/plugins/idmef/__init__.py:111 msgid "Plugin for fetching IDMEF heartbeats from the Prelude database" msgstr "" #: prewikka/plugins/warning/__init__.py:33 msgid "Prelude Warning message" msgstr "" #: prewikka/plugins/warning/templates/warning.mak:14 msgid "WARNING" msgstr "AVVERTTIMENTO" #: prewikka/plugins/warning/templates/warning.mak:17 msgid "Prelude OSS is the open-source version of the Prelude SIEM" msgstr "" #: prewikka/plugins/warning/templates/warning.mak:21 #, python-format msgid "" "This OSS version has lower " "performance and less features than the Pro/Enterprise versions." msgstr "" #: prewikka/plugins/warning/templates/warning.mak:22 msgid "" "It is intended for tests and small environments, and should not be used " "in critical environments." msgstr "" #: prewikka/plugins/warning/templates/warning.mak:26 #, python-format msgid "Prelude OSS is distributed under the %s." msgstr "" #: prewikka/plugins/warning/templates/warning.mak:27 msgid "" "Products derivated from Prelude OSS modules are therefore subject to the " "terms of the GPLv2." msgstr "" #: prewikka/plugins/warning/templates/warning.mak:30 #: prewikka/templates/error.mak:171 prewikka/templates/toplayout.mak:62 #: prewikka/templates/toplayout.mak:77 prewikka/templates/toplayout.mak:94 #: prewikka/views/aboutplugin/templates/aboutplugin.mak:44 msgid "OK" msgstr "OK" #: prewikka/renderer/__init__.py:44 msgid "No data to display." msgstr "Nessun dato da visualizzare." #: prewikka/renderer/__init__.py:143 prewikka/renderer/__init__.py:147 #: prewikka/renderer/__init__.py:151 msgid "Renderer error" msgstr "Errore di rendering" #: prewikka/renderer/__init__.py:144 #, python-format msgid "No backend supporting render type '%s'" msgstr "" #: prewikka/renderer/__init__.py:148 #, python-format msgid "No backend named '%s'" msgstr "" #: prewikka/renderer/__init__.py:152 #, python-format msgid "Backend '%(backend)s' does not support render type '%(type)s'" msgstr "" #: prewikka/renderer/chartjs/__init__.py:104 msgid "ChartJS renderer backend" msgstr "" #: prewikka/renderer/chartjs/bar/__init__.py:38 msgid "ChartJS Bar renderer type" msgstr "" #: prewikka/renderer/chartjs/timeline/__init__.py:85 msgid "ChartJS Timebar renderer type" msgstr "" #: prewikka/session/session.py:39 msgid "Invalid session" msgstr "Sessione invalida" #: prewikka/session/session.py:40 msgid "The session cookie carried by your browser is invalid" msgstr "Il cookie di sessione del browser non è valido" #: prewikka/session/session.py:44 msgid "Session expired" msgstr "Sessione scaduta" #: prewikka/session/session.py:45 msgid "Your session has expired: please sign in again to continue using Prelude" msgstr "" "La tua sessione è scaduta: accedi nuovamente per continuare ad usare " "Prelude" #: prewikka/session/session.py:181 msgid "Logged out" msgstr "Sessione finita" #: prewikka/session/anonymous/anonymous.py:31 msgid "Anonymous authentication" msgstr "Autenticazione anonima" #: prewikka/templates/baseview.mak:148 msgid "View options" msgstr "Opzioni di vista" #: prewikka/templates/baseview.mak:151 msgid "View help" msgstr "Aiuto di vista" #: prewikka/templates/baseview.mak:205 msgid "This app has been disabled or failed to load." msgstr "Questo app è stato disabilitato o non è riuscito a caricare." #: prewikka/templates/baseview.mak:211 prewikka/templates/baseview.mak:222 msgid "name" msgstr "nome" #: prewikka/templates/baseview.mak:287 msgid "About" msgstr "Circa" #: prewikka/templates/baseview.mak:290 msgid "Are you sure you want to log out?" msgstr "È sicuro di voler disconnettersi?" #: prewikka/templates/baseview.mak:290 msgid "Logout" msgstr "Sconnessione" #: prewikka/templates/error.mak:66 msgid "Detail" msgstr "Dettaglio" #: prewikka/templates/error.mak:67 msgid "Copy to clipboard" msgstr "Copiare negli appunti" #: prewikka/templates/error.mak:137 prewikka/templates/error.mak:145 msgid "Error: {0}" msgstr "Errore: {0}" #: prewikka/templates/error.mak:155 msgid "This may be due to one or more of the following reasons:" msgstr "" #: prewikka/templates/error.mak:157 msgid "You don't have the required permissions." msgstr "" #: prewikka/templates/error.mak:158 #, python-format msgid "Required apps are disabled. See the %s page for more details." msgstr "" #: prewikka/templates/error.mak:176 prewikka/templates/toplayout.mak:61 #: prewikka/views/crontab/templates/cronjob.mak:122 #: prewikka/views/filter/templates/filteredition.mak:122 msgid "Cancel" msgstr "Annullare" #: prewikka/templates/error.mak:177 msgid "Sign in" msgstr "Autenticare" #: prewikka/templates/error.mak:181 msgid "Back" msgstr "Ritorno" #: prewikka/templates/error.mak:184 msgid "Retry" msgstr "Riprovare" #: prewikka/templates/error.mak:186 msgid "Redirect to main page" msgstr "Reindirizzare alla pagina principale" #: prewikka/templates/mainmenu.mak:44 msgid "Refresh:" msgstr "Rinfrescare:" #: prewikka/templates/mainmenu.mak:49 msgid "Update frequency of the current page" msgstr "Frequenza di aggiornamento della pagina attuale" #: prewikka/templates/mainmenu.mak:76 msgid "Period:" msgstr "Periodo:" #: prewikka/templates/mainmenu.mak:81 msgid "Period to visualize" msgstr "Periodo da visualizzare" #: prewikka/templates/mainmenu.mak:111 msgid "Start:" msgstr "Inizio:" #: prewikka/templates/mainmenu.mak:117 msgid "start" msgstr "inizio" #: prewikka/templates/mainmenu.mak:117 msgid "Start date" msgstr "Data d'inizio" #: prewikka/templates/mainmenu.mak:123 msgid "End:" msgstr "Fine:" #: prewikka/templates/mainmenu.mak:130 msgid "end" msgstr "fine" #: prewikka/templates/mainmenu.mak:130 msgid "End date" msgstr "Data di fine" #: prewikka/templates/toplayout.mak:57 msgid "Please Confirm" msgstr "Si prega di confermare" #: prewikka/templates/toplayout.mak:73 msgid "Prelude Dialog" msgstr "Dialogo Prelude" #: prewikka/templates/toplayout.mak:88 msgid "Connection error" msgstr "Errore di connessione" #: prewikka/templates/toplayout.mak:91 msgid "" "Connection failed, the server may be down or you may be experiencing " "network issues." msgstr "" #: prewikka/utils/misc.py:72 prewikka/views/agents/agents.py:45 msgid "Offline" msgstr "Offline" #: prewikka/utils/misc.py:75 prewikka/views/agents/agents.py:210 msgid "Unknown" msgstr "Sconosciuto" #: prewikka/utils/misc.py:78 msgid "Missing" msgstr "Mancante" #: prewikka/utils/misc.py:80 prewikka/views/agents/agents.py:44 msgid "Online" msgstr "Online" #: prewikka/views/about/__init__.py:13 msgid "Prelude About page" msgstr "" #: prewikka/views/about/templates/about.mak:11 #, python-format msgid "Prelude version %s" msgstr "Prelude versione %s" #: prewikka/views/about/templates/about.mak:15 msgid "Prelude is a SIEM (Security Information and Event Management)" msgstr "Prelude è un SIEM (Security Information and Event Management)" #: prewikka/views/about/templates/about.mak:21 msgid "" "{prelude} is a security management solution that collects, filters, " "normalizes, correlates, stores and archives data from various sources of " "your information system. Based on all this information Prelude can " "provide a global vision of your system's security level and thus prevent " "attacks, intrusions as well as viral infections." msgstr "" "{prelude} è una soluzione di supervisione di sicurezza che raccoglie, " "filtra, normalizza, correla, memorizza et archivia informazioni da fonti " "disparate sul vostro sistema informatico. Da tutti questi dati Prelude " "può fornire una panoramica del livello di sicurizza del vostro sistema e " "così prevenire gli attachi, intrusioni e altri infezioni virali." #: prewikka/views/about/templates/about.mak:24 msgid "Prelude Team:" msgstr "Squadra Prelude:" #: prewikka/views/about/templates/about.mak:25 msgid "" "Prelude OSS is an open-source project originally created by Yoann " "Vandoorselaere in 1998." msgstr "" "Prelude OSS è un progetto open-source creato originariamente da Yoann " "Vandoorselaere nel 1998." #: prewikka/views/about/templates/about.mak:27 msgid "Vigilo is a NMS (Network Management System)" msgstr "Vigilo è un NMS (Network Management System)" #: prewikka/views/about/templates/about.mak:33 msgid "" "{vigilo} is a complete monitoring and performance management solution " "capable of handling medium and large-scale systems (network - servers - " "applications) due to its distributed and modular architecture. Vigilo " "offers all the features required for performance supervision: states and " "alarms management, metrology, cartography, event correlation and " "reporting." msgstr "" "{vigilo} è una soluzione completa di supervisione di prestazioni capace " "di gestire sistemi di scala media e grande (rete - server - applicazioni)" " attraverso un'architettura distribuita et componibile. Vigilo offre " "tutte le funzioni necessarie alla supervisione di prestazioni: la " "gestione degli stati e delle allarmi, la metrologia, la cartografia, la " "correlazione degli eventi e la reportistica." #: prewikka/views/about/templates/about.mak:39 #, python-format msgid "" "Prelude SIEM and Vigilo NMS are being developed by the %s company, " "designer, integrator and operator of mission critical systems." msgstr "" "Prelude SIEM e Vigilo NMS sono sviluppati dalla società %s, progettista, " "integratore e operatore di sistemi critici." #: prewikka/views/about/templates/about.mak:44 msgid "Contact" msgstr "Contatto" #: prewikka/views/about/templates/about.mak:46 msgid "Phone:" msgstr "Telefono:" #: prewikka/views/about/templates/about.mak:47 msgid "Fax:" msgstr "Fax:" #: prewikka/views/about/templates/about.mak:50 msgid "Office" msgstr "Ufficio" #: prewikka/views/about/templates/about.mak:56 msgid "Websites" msgstr "Siti web" #: prewikka/views/about/templates/about.mak:67 #: prewikka/views/aboutplugin/templates/aboutplugin.mak:132 #: prewikka/views/agents/templates/heartbeatanalyze.mak:71 #: prewikka/views/messagesummary/templates/messagesummary.mak:93 msgid "Close" msgstr "Chiudere" #: prewikka/views/aboutplugin/__init__.py:36 msgid "Plugin installation and activation management page" msgstr "" #: prewikka/views/aboutplugin/__init__.py:40 #: prewikka/views/crontab/__init__.py:37 msgid "USER_MANAGEMENT" msgstr "" #: prewikka/views/aboutplugin/__init__.py:42 msgid "Apps: View" msgstr "Apps: Vista" #: prewikka/views/aboutplugin/__init__.py:43 msgid "Apps: API" msgstr "Apps: API" #: prewikka/views/aboutplugin/__init__.py:44 msgid "Apps: Dataprovider backend" msgstr "" #: prewikka/views/aboutplugin/__init__.py:45 msgid "Apps: Dataprovider type" msgstr "" #: prewikka/views/aboutplugin/__init__.py:46 msgid "Apps: Authentication" msgstr "Apps: Autenticazione" #: prewikka/views/aboutplugin/__init__.py:47 msgid "Apps: Identification" msgstr "Apps: Identificazione" #: prewikka/views/aboutplugin/__init__.py:48 msgid "Apps: Renderer backend" msgstr "" #: prewikka/views/aboutplugin/__init__.py:49 msgid "Apps: Renderer type" msgstr "" #: prewikka/views/aboutplugin/__init__.py:82 msgid "list plugin: list installed plugins" msgstr "" #: prewikka/views/aboutplugin/__init__.py:91 msgid "Apps" msgstr "Apps" #: prewikka/views/aboutplugin/__init__.py:120 msgid "sync plugin: initialize the plugin database schemas" msgstr "" #: prewikka/views/aboutplugin/__init__.py:134 #, python-format msgid "Applying %(module)s %(script)s..." msgstr "" #: prewikka/views/aboutplugin/__init__.py:144 msgid "All updates applied" msgstr "Tutti gli aggiornamenti applicati" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:44 msgid "ERROR" msgstr "ERRORE" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:48 msgid "Update failed" msgstr "Aggiornamento non riuscito" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:111 msgid "Update Dialog" msgstr "Dialogo di aggiornamento" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:121 msgid "Plugin" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:122 #, fuzzy msgid "Script" msgstr "Descrizione" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:123 msgid "Result" msgstr "Risultato" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:144 msgid "Plugin Maintenance" msgstr "Manutenzione dei moduli" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:147 msgid "" "The following apps need to be updated before they can be loaded into the " "system" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:154 #: prewikka/views/aboutplugin/templates/aboutplugin.mak:190 #: prewikka/views/agents/templates/agents.mak:29 #: prewikka/views/agents/templates/heartbeatanalyze.mak:19 #: prewikka/views/crontab/templates/cronjob.mak:114 #: prewikka/views/crontab/templates/crontab.mak:17 #: prewikka/views/filter/templates/filterlisting.mak:23 #: prewikka/views/messagesummary/messagesummary.py:288 #: prewikka/views/messagesummary/messagesummary.py:425 #: prewikka/views/messagesummary/messagesummary.py:676 #: prewikka/views/messagesummary/messagesummary.py:693 #: prewikka/views/messagesummary/messagesummary.py:716 #: prewikka/views/messagesummary/messagesummary.py:778 #: prewikka/views/messagesummary/messagesummary.py:797 #: prewikka/views/messagesummary/messagesummary.py:833 #: prewikka/views/usermanagement/templates/usersettings.mak:15 msgid "Name" msgstr "Nome" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:155 #: prewikka/views/aboutplugin/templates/aboutplugin.mak:191 #: prewikka/views/filter/templates/filterlisting.mak:28 #: prewikka/views/idmefnav/templates/idmefnav.mak:56 #: prewikka/views/messagesummary/messagesummary.py:745 #: prewikka/views/messagesummary/messagesummary.py:751 msgid "Description" msgstr "Descrizione" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:156 #: prewikka/views/aboutplugin/templates/aboutplugin.mak:192 #: prewikka/views/agents/templates/agents.mak:33 #: prewikka/views/messagesummary/messagesummary.py:427 #: prewikka/views/messagesummary/messagesummary.py:530 msgid "Version" msgstr "Versione" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:157 msgid "Current database version" msgstr "Versione attuale di database" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:158 msgid "Required database update" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:174 msgid "Install update" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:182 msgid "Installed Apps" msgstr "Apps installate" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:193 msgid "Database version" msgstr "Versione di database" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:194 msgid "Active" msgstr "Attivo" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:215 msgid "Update the selected apps?" msgstr "Aggiornare le apps selezionate?" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:215 msgid "Update" msgstr "Aggiornare" #: prewikka/views/agents/__init__.py:12 #, fuzzy msgid "Agents status information page" msgstr "Informazioni sull'indirizzo" #: prewikka/views/agents/agents.py:64 prewikka/views/agents/agents.py:133 msgid "Agents" msgstr "Agenti" #: prewikka/views/agents/agents.py:110 msgid "Node name n/a" msgstr "Nome del nodo sconosciuto" #: prewikka/views/agents/agents.py:111 msgid "OS version n/a" msgstr "Versione sistema sconosciuta" #: prewikka/views/agents/agents.py:112 msgid "OS type n/a" msgstr "Tipo del systema sconosciuto" #: prewikka/views/agents/agents.py:117 msgid "Node location n/a" msgstr "Posizione sconosciuta" #: prewikka/views/agents/agents.py:127 msgid "Alert listing" msgstr "Elenco delle allerte" #: prewikka/views/agents/agents.py:128 msgid "Heartbeat listing" msgstr "Elenco delle pulsazioni" #: prewikka/views/agents/agents.py:129 #: prewikka/views/agents/templates/heartbeatanalyze.mak:12 msgid "Heartbeat analysis" msgstr "Analisi delle pulsazioni" #: prewikka/views/agents/agents.py:133 prewikka/views/agents/agents.py:157 #: prewikka/views/datasearch/idmef.py:158 #: prewikka/views/messagesummary/messagesummary.py:332 msgid "IDMEF_VIEW" msgstr "" #: prewikka/views/agents/agents.py:133 #: prewikka/views/datasearch/heartbeat.py:55 msgid "Monitoring" msgstr "Supervisione" #: prewikka/views/agents/agents.py:142 msgid "IDMEF_ALTER" msgstr "" #: prewikka/views/agents/agents.py:184 msgid "Normal sensor start" msgstr "Inizio normale del sensore" #: prewikka/views/agents/agents.py:186 msgid "Unexpected sensor restart" msgstr "Nuovo inizio inaspettato del sensore" #: prewikka/views/agents/agents.py:192 #, python-format msgid "Unexpected heartbeat interval: %(delta)s" msgstr "Intervallo di pulsazione inaspettato: %(delta)s" #: prewikka/views/agents/agents.py:195 msgid "Normal sensor stop" msgstr "Fermata normale del sensore" #: prewikka/views/agents/agents.py:207 #, python-format msgid "Sensor is down since %s" msgstr "Il sensore è mancante da %s" #: prewikka/views/agents/agents.py:216 #, python-format msgid "" "No anomaly in the last %(count)d heartbeats (one heartbeat every " "%(delta)s average)" msgstr "" "No anomalia nelle %(count)d scorse pulsazioni (una pulsazione ogni " "%(delta)s in media)" #: prewikka/views/agents/templates/agents.mak:24 msgid "Show/Hide all" msgstr "Mostrare/Nascondere tutto" #: prewikka/views/agents/templates/agents.mak:24 msgid "Search:" msgstr "Ricerca:" #: prewikka/views/agents/templates/agents.mak:30 msgid "Location" msgstr "Luogo" #: prewikka/views/agents/templates/agents.mak:31 msgid "Node" msgstr "Nodo" #: prewikka/views/agents/templates/agents.mak:32 #: prewikka/views/agents/templates/heartbeatanalyze.mak:20 #: prewikka/views/datasearch/heartbeat.py:67 #: prewikka/views/messagesummary/messagesummary.py:424 msgid "Model" msgstr "Modello" #: prewikka/views/agents/templates/agents.mak:34 #: prewikka/views/messagesummary/messagesummary.py:428 msgid "Class" msgstr "Classe" #: prewikka/views/agents/templates/agents.mak:38 #: prewikka/views/agents/templates/heartbeatanalyze.mak:25 msgid "Latest heartbeat" msgstr "Pulsazione scorsa" #: prewikka/views/agents/templates/agents.mak:39 msgid "Status" msgstr "Stato" #: prewikka/views/agents/templates/agents.mak:83 msgid "Delete the alerts of the selected agent(s)" msgstr "Rimovuere le allerte degli agenti selezionati?" #: prewikka/views/agents/templates/agents.mak:87 msgid "Delete the heartbeats of the selected agent(s)" msgstr "Rimovuere le pulsazioni degli agenti selezionati?" #: prewikka/views/agents/templates/agents.mak:89 msgid "Delete the selected IDMEF messages?" msgstr "Rimovuere i messaggi IDMEF selezionati?" #: prewikka/views/agents/templates/agents.mak:89 #: prewikka/views/datasearch/idmef.py:195 #: prewikka/views/filter/templates/filterlisting.mak:42 msgid "Delete" msgstr "Rimovuere" #: prewikka/views/agents/templates/heartbeatanalyze.mak:21 msgid "OS" msgstr "" #: prewikka/views/agents/templates/heartbeatanalyze.mak:22 #: prewikka/views/datasearch/heartbeat.py:66 #: prewikka/views/messagesummary/messagesummary.py:412 msgid "Node name" msgstr "Nome del nodo" #: prewikka/views/agents/templates/heartbeatanalyze.mak:23 #: prewikka/views/messagesummary/messagesummary.py:395 msgid "Node location" msgstr "Posizione del nodo" #: prewikka/views/agents/templates/heartbeatanalyze.mak:24 #: prewikka/views/datasearch/heartbeat.py:65 #: prewikka/views/messagesummary/messagesummary.py:418 msgid "Node address" msgstr "Indirizzo del nodo" #: prewikka/views/agents/templates/heartbeatanalyze.mak:26 msgid "Current status" msgstr "Stato attuale" #: prewikka/views/agents/templates/heartbeatanalyze.mak:56 msgid "Events" msgstr "Eventi" #: prewikka/views/crontab/__init__.py:30 msgid "Scheduling management" msgstr "" #: prewikka/views/crontab/__init__.py:35 #, fuzzy msgid "Scheduled jobs management page" msgstr "Filtrare sull'agente" #: prewikka/views/crontab/__init__.py:62 msgid "Configuration" msgstr "Configurazione" #: prewikka/views/crontab/__init__.py:62 msgid "Scheduling" msgstr "Pianificazione" #: prewikka/views/crontab/__init__.py:75 prewikka/views/crontab/__init__.py:104 msgid "SYSTEM" msgstr "SISTEMA" #: prewikka/views/crontab/__init__.py:88 msgid "Pending" msgstr "In attesa" #: prewikka/views/crontab/__init__.py:98 msgid "Error" msgstr "Errore" #: prewikka/views/crontab/templates/cronjob.mak:54 msgid "Schedule:" msgstr "Pianificazione:" #: prewikka/views/crontab/templates/cronjob.mak:69 msgid "custom" msgstr "personalizzato" #: prewikka/views/crontab/templates/cronjob.mak:70 msgid "disabled" msgstr "disabilitato" #: prewikka/views/crontab/templates/cronjob.mak:79 msgid "Minute:" msgstr "Minuto:" #: prewikka/views/crontab/templates/cronjob.mak:83 msgid "Hour:" msgstr "Ora:" #: prewikka/views/crontab/templates/cronjob.mak:87 msgid "Day:" msgstr "Giorno:" #: prewikka/views/crontab/templates/cronjob.mak:91 msgid "Month:" msgstr "Mese:" #: prewikka/views/crontab/templates/cronjob.mak:95 msgid "Weekday:" msgstr "Giorno della settimana:" #: prewikka/views/crontab/templates/cronjob.mak:107 msgid "Edit Job" msgstr "Modificare l'operazione" #: prewikka/views/crontab/templates/cronjob.mak:112 #: prewikka/views/filter/templates/filteredition.mak:73 #: prewikka/views/usermanagement/templates/usersettings.mak:13 msgid "Name:" msgstr "Nome:" #: prewikka/views/crontab/templates/cronjob.mak:123 #: prewikka/views/filter/templates/filteredition.mak:123 #: prewikka/views/usermanagement/templates/usersettings.mak:61 msgid "Save" msgstr "Salvare" #: prewikka/views/crontab/templates/crontab.mak:15 msgid "Scheduled Jobs" msgstr "Operazioni pianificate" #: prewikka/views/crontab/templates/crontab.mak:18 msgid "Schedule" msgstr "Pianificazione" #: prewikka/views/crontab/templates/crontab.mak:19 msgid "User" msgstr "Utente" #: prewikka/views/crontab/templates/crontab.mak:20 msgid "Last execution" msgstr "Esecuzione scorsa" #: prewikka/views/crontab/templates/crontab.mak:21 msgid "Next execution" msgstr "Esecuzione prossima" #: prewikka/views/crontab/templates/crontab.mak:69 msgid "Disable" msgstr "Disattivare" #: prewikka/views/crontab/templates/crontab.mak:70 msgid "Enable" msgstr "Attivare" #: prewikka/views/datasearch/alert.py:71 #, fuzzy msgid "Alert listing page" msgstr "Elenco delle allerte" #: prewikka/views/datasearch/alert.py:76 msgid "Aggregated alerts" msgstr "Allerte aggregate" #: prewikka/views/datasearch/alert.py:87 #: prewikka/views/datasearch/heartbeat.py:63 #: prewikka/views/datasearch/threat.py:74 msgid "Date" msgstr "Data" #: prewikka/views/datasearch/alert.py:89 prewikka/views/datasearch/threat.py:76 msgid "Source" msgstr "Fonte" #: prewikka/views/datasearch/alert.py:90 prewikka/views/datasearch/threat.py:77 msgid "Target" msgstr "Obiettivo" #: prewikka/views/datasearch/alert.py:91 msgid "Analyzer" msgstr "Analizzatore" #: prewikka/views/datasearch/alert.py:94 msgid "Delete the selected alerts?" msgstr "Rimovuere le allerte selezionate?" #: prewikka/views/datasearch/alert.py:148 #: prewikka/views/idmefnav/__init__.py:44 msgid "IDMEF" msgstr "IDMEF" #: prewikka/views/datasearch/datasearch.py:48 msgid "minute" msgstr "minuto" #: prewikka/views/datasearch/datasearch.py:48 msgid "hour" msgstr "ora" #: prewikka/views/datasearch/datasearch.py:48 msgid "day" msgstr "giorno" #: prewikka/views/datasearch/datasearch.py:48 msgid "month" msgstr "mese" #: prewikka/views/datasearch/datasearch.py:48 msgid "year" msgstr "anno" #: prewikka/views/datasearch/datasearch.py:161 #, fuzzy msgid "Time group error" msgstr "Errore di menu" #: prewikka/views/datasearch/datasearch.py:161 msgid "Only one time unit can be specified in a groupby query" msgstr "" #: prewikka/views/datasearch/datasearch.py:446 msgid "Forensic" msgstr "" #: prewikka/views/datasearch/datasearch.py:446 msgid "Dashboard" msgstr "Cruscotto" #: prewikka/views/datasearch/datasearch.py:490 msgid "CSV export" msgstr "" #: prewikka/views/datasearch/datasearch.py:622 msgid "General" msgstr "Generale" #: prewikka/views/datasearch/heartbeat.py:51 #, fuzzy msgid "Heartbeat listing page" msgstr "Elenco delle pulsazioni" #: prewikka/views/datasearch/heartbeat.py:56 msgid "Aggregated heartbeats" msgstr "Pulsazioni aggregate" #: prewikka/views/datasearch/heartbeat.py:64 msgid "Agent" msgstr "Agente" #: prewikka/views/datasearch/heartbeat.py:69 msgid "Delete the selected heartbeats?" msgstr "Rimovuere le pulsazioni selezionate?" #: prewikka/views/datasearch/idmef.py:46 msgid "See IDMEF details" msgstr "Vedere i dettagli IDMEF" #: prewikka/views/datasearch/threat.py:66 #, fuzzy msgid "Threat listing page" msgstr "Elenco delle pulsazioni" #: prewikka/views/datasearch/threat.py:69 #: prewikka/views/datasearch/threat.py:70 msgid "Threats" msgstr "Minacce" #: prewikka/views/datasearch/threat.py:70 msgid "Aggregated threats" msgstr "Minacce aggregate" #: prewikka/views/datasearch/threat.py:78 msgid "Program" msgstr "Programma" #: prewikka/views/datasearch/templates/details.mak:26 #, python-format msgid "Group by %s" msgstr "Raggrupa per %s" #: prewikka/views/datasearch/templates/details.mak:30 #: prewikka/views/datasearch/templates/forensic.mak:219 msgid "Add to search" msgstr "Aggiungere alla ricerca" #: prewikka/views/datasearch/templates/details.mak:31 #: prewikka/views/datasearch/templates/forensic.mak:220 msgid "Exclude from search" msgstr "Escludere della ricerca" #: prewikka/views/datasearch/templates/forensic.mak:9 msgid "Fields" msgstr "Campi" #: prewikka/views/datasearch/templates/forensic.mak:10 msgid "Query history" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:63 msgid "Chart type" msgstr "Tipo di grafico" #: prewikka/views/datasearch/templates/forensic.mak:73 msgid "Limit" msgstr "Limite" #: prewikka/views/datasearch/templates/forensic.mak:89 msgid "Expert mode" msgstr "Modo esperto" #: prewikka/views/datasearch/templates/forensic.mak:96 msgid "Condensed mode" msgstr "Modo condensato" #: prewikka/views/datasearch/templates/forensic.mak:108 msgid "Search mode" msgstr "Modo di ricerca" #: prewikka/views/datasearch/templates/forensic.mak:112 #: prewikka/views/datasearch/templates/forensic.mak:217 msgid "Search" msgstr "Cercare" #: prewikka/views/datasearch/templates/forensic.mak:114 msgid "Reset search" msgstr "Azzerare la ricerca" #: prewikka/views/datasearch/templates/forensic.mak:124 #: prewikka/views/datasearch/templates/forensic.mak:222 msgid "Group by" msgstr "Raggrupa per" #: prewikka/views/datasearch/templates/forensic.mak:125 msgid "Select your field" msgstr "Scegli il campo" #: prewikka/views/datasearch/templates/forensic.mak:126 msgid "Time values" msgstr "Valori temporali" #: prewikka/views/datasearch/templates/forensic.mak:131 #, python-format msgid "%s fields" msgstr "Campi %s" #: prewikka/views/datasearch/templates/forensic.mak:167 msgid "Timeline" msgstr "Cronologia" #: prewikka/views/datasearch/templates/forensic.mak:221 msgid "New search" msgstr "Nuova ricerca" #: prewikka/views/datasearch/templates/forensic.mak:231 #: prewikka/views/messagesummary/messagesummary.py:1026 msgid "Actions" msgstr "Azioni" #: prewikka/views/datasearch/templates/forensic.mak:244 msgid "Informations" msgstr "Informazioni" #: prewikka/views/datasearch/templates/infos.mak:3 msgid "Field" msgstr "Campo" #: prewikka/views/datasearch/templates/infos.mak:9 msgid "Occurrence" msgstr "Occorrenze" #: prewikka/views/datasearch/templates/table.mak:12 msgid "Count" msgstr "Conto" #: prewikka/views/filter/__init__.py:11 #, fuzzy msgid "Filters management page" msgstr "Filtrare sull'agente" #: prewikka/views/filter/filter.py:113 #: prewikka/views/usermanagement/usermanagement.py:18 msgid "Preferences" msgstr "Preferenze" #: prewikka/views/filter/filter.py:113 #: prewikka/views/filter/templates/filterlisting.mak:17 msgid "Filters" msgstr "Filtri" #: prewikka/views/filter/filter.py:124 #: prewikka/views/filter/templates/filteredition.mak:66 #, python-format msgid "Filter %s" msgstr "Filtro %s" #: prewikka/views/filter/filter.py:199 msgid "Filter error" msgstr "Errore di filtro" #: prewikka/views/filter/filter.py:199 #, python-format msgid "Filter '%s' does not exist" msgstr "Il filtro '%s' non esiste" #: prewikka/views/filter/filter.py:236 prewikka/views/filter/filter.py:248 msgid "Could not save filter" msgstr "Impossibile salvare il filtro" #: prewikka/views/filter/filter.py:236 msgid "No name for this filter was provided" msgstr "Nome del filtro mancante" #: prewikka/views/filter/filter.py:248 msgid "The filter name is already used by another filter" msgstr "Il nome del filtro è già usato da un altro filtro" #: prewikka/views/filter/templates/filteredition.mak:66 #: prewikka/views/filter/templates/filterlisting.mak:17 #: prewikka/views/filter/templates/menu.mak:48 msgid "New filter" msgstr "Nuovo filtro" #: prewikka/views/filter/templates/filteredition.mak:75 msgid "Filter name" msgstr "Nome del filtro" #: prewikka/views/filter/templates/filteredition.mak:80 msgid "Category:" msgstr "Categoria:" #: prewikka/views/filter/templates/filteredition.mak:92 msgid "Description:" msgstr "Descrizione:" #: prewikka/views/filter/templates/filterlisting.mak:24 #: prewikka/views/messagesummary/messagesummary.py:750 msgid "Category" msgstr "Categoria" #: prewikka/views/filter/templates/filterlisting.mak:40 msgid "Create" msgstr "Creare" #: prewikka/views/filter/templates/filterlisting.mak:41 msgid "Duplicate" msgstr "Duplicare" #: prewikka/views/filter/templates/filterlisting.mak:42 msgid "Delete the selected filters?" msgstr "Rimovuere i filtri selezionati?" #: prewikka/views/filter/templates/menu.mak:4 msgid "Filter:" msgstr "Filtro:" #: prewikka/views/filter/templates/menu.mak:38 msgid "Available filters" msgstr "Filtri disponibili" #: prewikka/views/filter/templates/menu.mak:46 msgid "No filter" msgstr "Nessun filtro" #: prewikka/views/filter/templates/menu.mak:51 msgid "No category" msgstr "Nessuna categoria" #: prewikka/views/filter/templates/widget.mak:7 msgid "Select a path..." msgstr "Selezionare un percorso..." #: prewikka/views/filter/templates/widget.mak:9 msgid "Default paths" msgstr "Percorsi predefiniti" #: prewikka/views/filter/templates/widget.mak:15 msgid "All paths" msgstr "Tutti i percorsi" #: prewikka/views/filter/templates/widget.mak:25 #: prewikka/views/filter/templates/widget.mak:46 msgid "Change operator" msgstr "Cambiare l'operatore" #: prewikka/views/filter/templates/widget.mak:32 msgid "value" msgstr "valore" #: prewikka/views/filter/templates/widget.mak:34 msgid "Delete condition" msgstr "Rimovuere condizione" #: prewikka/views/filter/templates/widget.mak:42 msgid "AND" msgstr "E" #: prewikka/views/filter/templates/widget.mak:42 msgid "OR" msgstr "O" #: prewikka/views/filter/templates/widget.mak:56 msgid "Add condition" msgstr "Aggiungere condizione" #: prewikka/views/filter/templates/widget.mak:57 msgid "Add group" msgstr "Aggiungere gruppo" #: prewikka/views/filter/templates/widget.mak:59 msgid "Delete group" msgstr "Rimuovere gruppo" #: prewikka/views/idmefnav/__init__.py:36 msgid "IDMEF navigator" msgstr "" #: prewikka/views/idmefnav/__init__.py:44 msgid "Help" msgstr "Aiuto" #: prewikka/views/idmefnav/templates/idmefnav.mak:12 msgid "Children" msgstr "" #: prewikka/views/idmefnav/templates/idmefnav.mak:20 #, fuzzy msgid "Aggregates" msgstr "Allerte aggregate" #: prewikka/views/idmefnav/templates/idmefnav.mak:36 msgid "Attributes" msgstr "" #: prewikka/views/idmefnav/templates/idmefnav.mak:54 msgid "Rank" msgstr "" #: prewikka/views/idmefnav/templates/idmefnav.mak:55 msgid "Keyword" msgstr "" #: prewikka/views/messagesummary/__init__.py:13 #, fuzzy msgid "Detailed alert and heartbeat page" msgstr "Generico (Allerta e Pulsazione)" #: prewikka/views/messagesummary/messagesummary.py:289 #: prewikka/views/messagesummary/messagesummary.py:578 msgid "Code" msgstr "Codice" #: prewikka/views/messagesummary/messagesummary.py:290 msgid "Data length" msgstr "Lunghezza dei dati" #: prewikka/views/messagesummary/messagesummary.py:291 msgid "Data" msgstr "Dati" #: prewikka/views/messagesummary/messagesummary.py:365 #, python-format msgid "(agent local time: %s)" msgstr "(ora locale della sonda: %s)" #: prewikka/views/messagesummary/messagesummary.py:372 #: prewikka/views/messagesummary/messagesummary.py:835 msgid "Create time" msgstr "Data di creazione" #: prewikka/views/messagesummary/messagesummary.py:375 msgid "Detect time" msgstr "Data di rivelazione" #: prewikka/views/messagesummary/messagesummary.py:380 msgid "Analyzer time" msgstr "Data dell'analizzatore" #: prewikka/views/messagesummary/messagesummary.py:386 msgid "Process" msgstr "Processo" #: prewikka/views/messagesummary/messagesummary.py:387 msgid "Process Path" msgstr "Percorso del processo" #: prewikka/views/messagesummary/messagesummary.py:388 msgid "Process PID" msgstr "ID del processo" #: prewikka/views/messagesummary/messagesummary.py:415 msgid "Node name (resolved)" msgstr "Nome del nodo (risolto)" #: prewikka/views/messagesummary/messagesummary.py:426 msgid "Analyzerid" msgstr "ID dell'analizzatore" #: prewikka/views/messagesummary/messagesummary.py:430 msgid "Manufacturer" msgstr "Fabbricante" #: prewikka/views/messagesummary/messagesummary.py:438 msgid "Operating System" msgstr "Sistema Operativo" #: prewikka/views/messagesummary/messagesummary.py:456 #, python-format msgid "Analyzer Path (%d not shown)" msgstr "Percorso verso l'analizzatore (%d non illustrati)" #: prewikka/views/messagesummary/messagesummary.py:463 #: prewikka/views/messagesummary/messagesummary.py:1035 #: prewikka/views/messagesummary/messagesummary.py:1106 #, python-format msgid "Analyzer #%d" msgstr "Analizzatore #%d" #: prewikka/views/messagesummary/messagesummary.py:473 msgid "Additional data" msgstr "Dati aggiuntivi" #: prewikka/views/messagesummary/messagesummary.py:476 #: prewikka/views/messagesummary/messagesummary.py:717 msgid "Meaning" msgstr "Significato" #: prewikka/views/messagesummary/messagesummary.py:477 msgid "Value" msgstr "Valore" #: prewikka/views/messagesummary/messagesummary.py:531 #: prewikka/views/messagesummary/messagesummary.py:552 msgid "Header length" msgstr "Lunghezza dell'intestazione" #: prewikka/views/messagesummary/messagesummary.py:532 msgid "TOS" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:533 #: prewikka/views/messagesummary/messagesummary.py:571 msgid "Length" msgstr "Lunghezza" #: prewikka/views/messagesummary/messagesummary.py:534 #: prewikka/views/messagesummary/messagesummary.py:580 msgid "Id" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:538 msgid "Ip offset" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:539 msgid "TTL" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:540 #: prewikka/views/messagesummary/messagesummary.py:926 #: prewikka/views/messagesummary/messagesummary.py:929 #: prewikka/views/messagesummary/messagesummary.py:932 msgid "Protocol" msgstr "Protocollo" #: prewikka/views/messagesummary/messagesummary.py:541 #: prewikka/views/messagesummary/messagesummary.py:563 #: prewikka/views/messagesummary/messagesummary.py:572 #: prewikka/views/messagesummary/messagesummary.py:579 msgid "Checksum" msgstr "Checksum" #: prewikka/views/messagesummary/messagesummary.py:542 msgid "Source address" msgstr "Indirizzo sorgente" #: prewikka/views/messagesummary/messagesummary.py:543 msgid "Target address" msgstr "Indirizzo destinazione" #: prewikka/views/messagesummary/messagesummary.py:553 msgid "Reserved" msgstr "Riservato" #: prewikka/views/messagesummary/messagesummary.py:562 msgid "Window" msgstr "Finestra" #: prewikka/views/messagesummary/messagesummary.py:564 msgid "URP" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:577 #: prewikka/views/messagesummary/messagesummary.py:744 #: prewikka/views/messagesummary/messagesummary.py:777 #: prewikka/views/messagesummary/messagesummary.py:796 msgid "Type" msgstr "Tipo" #: prewikka/views/messagesummary/messagesummary.py:581 msgid "Seq #" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:582 msgid "Mask" msgstr "Maschera" #: prewikka/views/messagesummary/messagesummary.py:583 msgid "Gateway Address" msgstr "Indirizzo del Gateway" #: prewikka/views/messagesummary/messagesummary.py:584 msgid "Num address" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:585 msgid "Wpa" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:586 msgid "Lifetime" msgstr "Durata della vita" #: prewikka/views/messagesummary/messagesummary.py:587 #, fuzzy msgid "Otime" msgstr "Tempo" #: prewikka/views/messagesummary/messagesummary.py:588 #, fuzzy msgid "Rtime" msgstr "Tempo" #: prewikka/views/messagesummary/messagesummary.py:589 #, fuzzy msgid "Ttime" msgstr "Tempo" #: prewikka/views/messagesummary/messagesummary.py:595 #: prewikka/views/messagesummary/messagesummary.py:1082 msgid "Payload" msgstr "Carico utile" #: prewikka/views/messagesummary/messagesummary.py:648 msgid "Alert details" msgstr "Dettaglio dell'allerta" #: prewikka/views/messagesummary/messagesummary.py:653 #, python-format msgid "%d linked alerts missing (probably deleted)" msgstr "%d allerte collegate mancanti (probabilmente cancellate)" #: prewikka/views/messagesummary/messagesummary.py:657 #, python-format msgid "%d linked alerts omitted" msgstr "%d allerte collegate omesse" #: prewikka/views/messagesummary/messagesummary.py:674 #: prewikka/views/messagesummary/messagesummary.py:991 msgid "Correlation Alert" msgstr "Allerta di Correlazione" #: prewikka/views/messagesummary/messagesummary.py:680 msgid "Correlated Alerts" msgstr "Allerte correlate" #: prewikka/views/messagesummary/messagesummary.py:681 #: prewikka/views/messagesummary/messagesummary.py:698 msgid "Source Analyzer" msgstr "Analizzatore di fonte" #: prewikka/views/messagesummary/messagesummary.py:691 #: prewikka/views/messagesummary/messagesummary.py:994 msgid "Tool Alert" msgstr "Allerta di Strumento" #: prewikka/views/messagesummary/messagesummary.py:697 msgid "Linked Alerts" msgstr "Allerte collegate" #: prewikka/views/messagesummary/messagesummary.py:708 msgid "Text" msgstr "Testo" #: prewikka/views/messagesummary/messagesummary.py:710 msgid "Ident" msgstr "Identità" #: prewikka/views/messagesummary/messagesummary.py:715 msgid "Origin" msgstr "Origine" #: prewikka/views/messagesummary/messagesummary.py:738 msgid "Severity" msgstr "Gravità" #: prewikka/views/messagesummary/messagesummary.py:741 msgid "Completion" msgstr "Completamento" #: prewikka/views/messagesummary/messagesummary.py:774 msgid "User category" msgstr "Categoria di utente" #: prewikka/views/messagesummary/messagesummary.py:779 #: prewikka/views/messagesummary/messagesummary.py:798 msgid "Number" msgstr "Numero" #: prewikka/views/messagesummary/messagesummary.py:780 msgid "Tty" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:799 msgid "Permission" msgstr "Autorizzazione" #: prewikka/views/messagesummary/messagesummary.py:821 msgid "Change time" msgstr "Modificare il tempo" #: prewikka/views/messagesummary/messagesummary.py:822 msgid "Inode Number" msgstr "Numero dell'Inode" #: prewikka/views/messagesummary/messagesummary.py:823 msgid "Major device" msgstr "Dispositivo maggiore" #: prewikka/views/messagesummary/messagesummary.py:824 msgid "Minor device" msgstr "Dispositivo minore" #: prewikka/views/messagesummary/messagesummary.py:825 msgid "C Major device" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:826 msgid "C Minor device" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:830 #, python-format msgid "Target file %s" msgstr "File di destinazione %s" #: prewikka/views/messagesummary/messagesummary.py:830 msgid "category" msgstr "categoria" #: prewikka/views/messagesummary/messagesummary.py:834 msgid "Path" msgstr "Percorso" #: prewikka/views/messagesummary/messagesummary.py:836 msgid "Modify time" msgstr "Data di modifica" #: prewikka/views/messagesummary/messagesummary.py:837 msgid "Access time" msgstr "Data di accesso" #: prewikka/views/messagesummary/messagesummary.py:838 msgid "Data size" msgstr "Dimensioni dei dati" #: prewikka/views/messagesummary/messagesummary.py:839 msgid "Disk size" msgstr "Dimensioni del disco" #: prewikka/views/messagesummary/messagesummary.py:858 msgid "Web Service" msgstr "Web Service" #: prewikka/views/messagesummary/messagesummary.py:861 msgid "Url" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:862 msgid "Cgi" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:863 msgid "Http Method" msgstr "Metodo http" #: prewikka/views/messagesummary/messagesummary.py:866 msgid "CGI Argument" msgstr "Argumento CGI" #: prewikka/views/messagesummary/messagesummary.py:875 msgid "SNMP Service" msgstr "SNMP Service" #: prewikka/views/messagesummary/messagesummary.py:878 msgid "oid" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:879 msgid "messageProcessingModel" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:880 msgid "securityModel" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:881 msgid "securityName" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:882 msgid "securityLevel" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:883 msgid "contextName" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:884 msgid "contextEngineID" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:885 msgid "command" msgstr "comando" #: prewikka/views/messagesummary/messagesummary.py:897 #: prewikka/views/messagesummary/messagesummary.py:899 msgid "Port" msgstr "Porta" #: prewikka/views/messagesummary/messagesummary.py:919 msgid "PortList" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:922 msgid "ip_version" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:958 #, python-format msgid "Source(%d)" msgstr "Fonte(%d)" #: prewikka/views/messagesummary/messagesummary.py:973 #, python-format msgid "Target(%d)" msgstr "Obiettivo(%d)" #: prewikka/views/messagesummary/messagesummary.py:997 msgid "Overflow Alert" msgstr "Allerta di overflow" #: prewikka/views/messagesummary/messagesummary.py:1000 msgid "Alert" msgstr "Allerta" #: prewikka/views/messagesummary/messagesummary.py:1018 msgid "MessageID" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:1065 msgid "Network centric information" msgstr "Informazioni sulla rete" #: prewikka/views/messagesummary/messagesummary.py:1087 msgid "ASCII Payload" msgstr "Carica utile ASCII" #: prewikka/views/messagesummary/messagesummary.py:1103 msgid "Heartbeat" msgstr "Pulsazione" #: prewikka/views/messagesummary/templates/messagesummary.mak:85 msgid "Summary" msgstr "Sommario" #: prewikka/views/usermanagement/__init__.py:14 #, fuzzy msgid "User settings page" msgstr "Parametri" #: prewikka/views/usermanagement/usermanagement.py:18 msgid "My account" msgstr "Il mio account" #: prewikka/views/usermanagement/usermanagement.py:23 msgid "Invalid User" msgstr "Utente non valido" #: prewikka/views/usermanagement/usermanagement.py:23 #, python-format msgid "Requested user '%s' does not exist" msgstr "Utente richiesto '%s' non esiste" #: prewikka/views/usermanagement/usermanagement.py:43 msgid "Invalid Language" msgstr "Lingua invalida" #: prewikka/views/usermanagement/usermanagement.py:43 msgid "Specified language does not exist" msgstr "La lingua specificata non esiste" #: prewikka/views/usermanagement/usermanagement.py:47 msgid "Invalid Timezone" msgstr "Fuso orario non valido" #: prewikka/views/usermanagement/usermanagement.py:47 msgid "Specified timezone does not exist" msgstr "Il fuso orario specificato non esiste" #: prewikka/views/usermanagement/templates/usersettings.mak:6 msgid "Login:" msgstr "Accesso:" #: prewikka/views/usermanagement/templates/usersettings.mak:20 msgid "Email:" msgstr "E-mail:" #: prewikka/views/usermanagement/templates/usersettings.mak:22 msgid "Email" msgstr "E-mail" #: prewikka/views/usermanagement/templates/usersettings.mak:27 msgid "Language:" msgstr "Lingua:" #: prewikka/views/usermanagement/templates/usersettings.mak:39 msgid "Theme:" msgstr "Tema:" #: prewikka/views/usermanagement/templates/usersettings.mak:50 msgid "Timezone:" msgstr "Fuso orario:" #: scripts/prewikka-cli:59 #, fuzzy msgid "Unknown command" msgstr "comando" #: scripts/prewikka-cli:67 #, python-format msgid "An unexpected error occurred: %s" msgstr "" #: scripts/prewikka-cli:154 msgid "Create an object of the specified type" msgstr "" #: scripts/prewikka-cli:157 msgid "Delete an object of the specified type" msgstr "" #: scripts/prewikka-cli:160 msgid "Import objects of the specified type from files" msgstr "" #: scripts/prewikka-cli:163 msgid "List objects of the specified type" msgstr "" #: scripts/prewikka-cli:166 msgid "Synchronize objects of the specified type" msgstr "" #: scripts/prewikka-cli:169 msgid "Update objects of the specified type" msgstr "" #: scripts/prewikka-cli:207 msgid "Prewikka command-line tool" msgstr "" #: scripts/prewikka-cli:208 msgid "name of the user" msgstr "" #: scripts/prewikka-cli:209 scripts/prewikka-crontab:99 #: scripts/prewikka-httpd:93 #, python-format msgid "configuration file to use (default: %(default)s)" msgstr "" #: scripts/prewikka-cli:210 msgid "command to execute" msgstr "" #: scripts/prewikka-cli:211 msgid "enable debugging output" msgstr "" #: scripts/prewikka-cli:218 msgid "prewikka-cli must be executed as the prewikka user" msgstr "" #: scripts/prewikka-cli:243 #, python-format msgid "Prewikka command-line tool (%s)" msgstr "" #: scripts/prewikka-cli:244 msgid "Type \"help\" or \"?\" to list commands" msgstr "" #: scripts/prewikka-crontab:100 msgid "run as a system daemon" msgstr "" #: scripts/prewikka-crontab:101 scripts/prewikka-httpd:96 msgid "show this help message and exit" msgstr "" #: scripts/prewikka-crontab:102 scripts/prewikka-httpd:97 msgid "show program's version number and exit" msgstr "" #: scripts/prewikka-httpd:88 msgid "root where the server is accessible" msgstr "" #: scripts/prewikka-httpd:89 #, python-format msgid "IP to bind to (default: %(default)s)" msgstr "" #: scripts/prewikka-httpd:90 #, python-format msgid "port number to use (default: %(default)d)" msgstr "" #: scripts/prewikka-httpd:91 msgid "SSL private key to use (default: no SSL)" msgstr "" #: scripts/prewikka-httpd:92 msgid "SSL certificate to use (default: no SSL)" msgstr "" #: scripts/prewikka-httpd:95 #, python-format msgid "" "number of processes to use. Default value matches the number of available" " CPUs (i.e. %d)" msgstr "" prewikka-5.1.1/prewikka/locale/pl/0000775000175000017500000000000013555143705020436 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/locale/pl/LC_MESSAGES/0000775000175000017500000000000013555143705022223 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/locale/pl/LC_MESSAGES/prewikka.po0000664000175000017500000016304513555143652024412 0ustar tandrejatandreja00000000000000# Polish Translation for Prewikka # Copyright (C) 2007-2019 CS-SI # This file is distributed under the same license as the prewikka package. # msgid "" msgstr "" "Project-Id-Version: Prewikka 5.1.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-09-04 19:03+0200\n" "PO-Revision-Date: 2018-02-09 12:07+0100\n" "Last-Translator: Konrad Kosmowski \n" "Language-Team: Polish\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && " "(n%100<10 || n%100>=20) ? 1 : 2)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 0.9.6\n" #: prewikka/baseview.py:79 prewikka/usergroup.py:52 msgid "Permission Denied" msgstr "Odmowa dostępu" #: prewikka/baseview.py:79 msgid "Missing permission to access the specified file" msgstr "" #: prewikka/config.py:37 prewikka/dataprovider/__init__.py:645 #, fuzzy msgid "Configuration error" msgstr "Alert korelacji" #: prewikka/config.py:43 #, python-format msgid "Parse error in \"%(txt)s\" at %(file)s line %(line)d" msgstr "" #: prewikka/config.py:48 prewikka/view.py:82 #, python-format msgid "Invalid value '%(value)s' for parameter '%(name)s'" msgstr "" #: prewikka/config.py:54 #, python-format msgid "Missing value for parameter '%(name)s'" msgstr "" #: prewikka/crontab.py:37 #, fuzzy msgid "Hourly" msgstr "%d godzina" #: prewikka/crontab.py:38 #, fuzzy msgid "Daily" msgstr "Dzisiaj" #: prewikka/crontab.py:39 #, fuzzy msgid "Weekly" msgstr "%d tydzień" #: prewikka/crontab.py:40 #, fuzzy msgid "Monthly" msgstr "%d miesiąc" #: prewikka/crontab.py:41 #, fuzzy msgid "Yearly" msgstr "%d rok" #: prewikka/crontab.py:42 prewikka/mainmenu.py:302 #: prewikka/templates/mainmenu.mak:92 msgid "Custom" msgstr "Dostosowane" #: prewikka/crontab.py:43 prewikka/views/crontab/__init__.py:84 msgid "Disabled" msgstr "" #: prewikka/crontab.py:105 msgid "Scheduled job execution failed" msgstr "" #: prewikka/crontab.py:139 #, fuzzy msgid "Invalid job extension" msgstr "Nieprawidłowa sesja" #: prewikka/crontab.py:139 #, python-format msgid "Scheduled job with invalid extension type '%s'" msgstr "" #: prewikka/crontab.py:206 #, fuzzy msgid "Invalid CronJob" msgstr "Nieprawidłowa sesja" #: prewikka/crontab.py:206 #, python-format msgid "CronJob with id=%d cannot be found in database" msgstr "" #: prewikka/crontab.py:260 #, fuzzy msgid "Invalid schedule" msgstr "Nieprawidłowa sesja" #: prewikka/crontab.py:260 msgid "The specified job schedule is invalid" msgstr "" #: prewikka/crontab.py:286 #, python-format msgid "Custom (%s)" msgstr "" #: prewikka/database.py:43 msgid "Database error" msgstr "" #: prewikka/database.py:50 msgid "Database schema error" msgstr "" #: prewikka/database.py:293 msgid "database installation required" msgstr "" #: prewikka/database.py:296 msgid "database activation required" msgstr "" #: prewikka/database.py:299 #, python-format msgid "database schema branch %(required)s required (found %(current)s)" msgstr "" #: prewikka/database.py:305 #, python-format msgid "database schema version %(required)s required (found %(current)s)" msgstr "" #: prewikka/database.py:372 msgid "Database installation error" msgstr "" #: prewikka/database.py:374 #, python-format msgid "" "No database installation script found for module %(module)s, version " "%(version)s" msgstr "" #: prewikka/database.py:382 prewikka/database.py:420 msgid "Database migration error" msgstr "" #: prewikka/database.py:386 #, python-format msgid "" "No database branch migration script found for module %(module)s, branch " "transition %(current)s -> %(required)s" msgstr "" #: prewikka/database.py:424 #, python-format msgid "" "No linear migration script found for module %(module)s %(version1)s -> " "%(version2)s" msgstr "" #: prewikka/database.py:841 #, fuzzy msgid "Database configuration error" msgstr "Alert korelacji" #: prewikka/database.py:841 msgid "Only MySQL and PostgreSQL databases are supported at the moment" msgstr "" #: prewikka/error.py:48 prewikka/templates/error.mak:139 msgid "An unexpected condition happened" msgstr "" #: prewikka/error.py:148 msgid "Not implemented" msgstr "" #: prewikka/error.py:150 msgid "Backend does not implement this operation" msgstr "" #: prewikka/history.py:32 msgid "Search history deletion" msgstr "" #: prewikka/localization.py:143 msgid "%m/%Y" msgstr "%Y-%m" #: prewikka/localization.py:144 #, python-format msgid "%m/%d/%Y" msgstr "%Y-%m-%d" #: prewikka/localization.py:145 #, python-format msgid "%m/%d/%Y %Hh" msgstr "%Y-%m-%d %H:00" #: prewikka/localization.py:146 #, python-format msgid "%m/%d/%Y %H:%M" msgstr "%Y-%m-%d %H:%M" #: prewikka/localization.py:147 #, python-format msgid "%m/%d/%Y %H:%M:%S" msgstr "%Y-%m-%d %H:%M:%S" #: prewikka/localization.py:149 msgid "%H:%M" msgstr "%H:%M" #: prewikka/localization.py:150 msgid "%H:%M:%S" msgstr "%H:%M:%S" #: prewikka/localization.py:235 prewikka/localization.py:253 #: prewikka/renderer/__init__.py:62 prewikka/views/crontab/__init__.py:95 msgid "n/a" msgstr "" #: prewikka/localization.py:246 #, python-format msgid "%(days)dd %(hours)dh %(minutes)d'" msgstr "" #: prewikka/main.py:45 msgid "Version Requirement error" msgstr "" #: prewikka/main.py:48 #, python-format msgid "Prewikka %(vPre)s requires libprelude %(vLib)s or higher" msgstr "" #: prewikka/main.py:53 #, python-format msgid "Prewikka %(vPre)s requires libpreludedb %(vLib)s or higher" msgstr "" #: prewikka/main.py:136 prewikka/main.py:149 #: prewikka/dataprovider/plugins/idmef/__init__.py:57 msgid "Initialization error" msgstr "" #: prewikka/main.py:150 #, python-format msgid "" "Cannot use %(type)s mode '%(name)s', please contact your local " "administrator." msgstr "" #: prewikka/main.py:192 #, python-format msgid "Session '%s' does not accept any authentication module" msgstr "" #: prewikka/main.py:298 #, python-format msgid "An unexpected condition happened while trying to load %s" msgstr "" #: prewikka/mainmenu.py:114 #, python-format msgid "%S.%.6f" msgstr "" #: prewikka/mainmenu.py:115 #, python-format msgid "%S.%.3f" msgstr "" #: prewikka/mainmenu.py:260 msgid "Today" msgstr "Dzisiaj" #: prewikka/mainmenu.py:261 msgid "Yesterday" msgstr "Wczoraj" #: prewikka/mainmenu.py:262 msgid "This week" msgstr "W tym tygodniu" #: prewikka/mainmenu.py:263 msgid "Last week" msgstr "Zeszły tydzień" #: prewikka/mainmenu.py:264 msgid "This month" msgstr "Ten miesiąc" #: prewikka/mainmenu.py:265 msgid "Last month" msgstr "W zeszłym miesiącu" #: prewikka/mainmenu.py:266 prewikka/mainmenu.py:267 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d godzina" msgstr[1] "%d godziny" msgstr[2] "%d godzin" #: prewikka/mainmenu.py:268 prewikka/mainmenu.py:269 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d dzień" msgstr[1] "%d dni" msgstr[2] "%d dni" #: prewikka/mainmenu.py:270 #, python-format msgid "%d week" msgid_plural "%d weeks" msgstr[0] "%d tydzień" msgstr[1] "%d tygodnie" msgstr[2] "%d tygodni" #: prewikka/mainmenu.py:271 prewikka/mainmenu.py:272 #, python-format msgid "%d month" msgid_plural "%d months" msgstr[0] "%d miesiąc" msgstr[1] "%d miesiące" msgstr[2] "%d miesięcy" #: prewikka/mainmenu.py:273 #, python-format msgid "%d year" msgid_plural "%d years" msgstr[0] "%d rok" msgstr[1] "%d lata" msgstr[2] "%d lat" #: prewikka/mainmenu.py:277 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d sekunda" msgstr[1] "%d sekundy" msgstr[2] "%d sekund" #: prewikka/mainmenu.py:278 prewikka/mainmenu.py:279 prewikka/mainmenu.py:280 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d minuta" msgstr[1] "%d minuty" msgstr[2] "%d minut" #: prewikka/mainmenu.py:299 prewikka/templates/mainmenu.mak:61 msgid "Inactive" msgstr "Nieaktywny" #: prewikka/mainmenu.py:305 prewikka/templates/mainmenu.mak:89 #, fuzzy msgid "None" msgstr "Telefon:" #: prewikka/menu.py:70 prewikka/menu.py:73 prewikka/menu.py:79 #: prewikka/menu.py:83 prewikka/menu.py:91 #, fuzzy msgid "Menu error" msgstr "Alert korelacji" #: prewikka/menu.py:70 msgid "The provided YAML menu is invalid" msgstr "" #: prewikka/menu.py:73 msgid "Empty menu" msgstr "" #: prewikka/menu.py:79 #, python-format msgid "Menu without a name in %s" msgstr "" #: prewikka/menu.py:83 msgid "Multiple default menus" msgstr "" #: prewikka/menu.py:91 msgid "Multiple default views" msgstr "" #: prewikka/pluginmanager.py:163 #, python-format msgid "Circular dependencies detected: %s" msgstr "" #: prewikka/pluginmanager.py:171 #, python-format msgid "Missing dependency: %s" msgstr "" #: prewikka/resolve.py:170 #, python-format msgid "" "Asynchronous DNS resolution disabled: twisted.names and twisted.internet " "required: %s" msgstr "" #: prewikka/usergroup.py:44 #, python-format msgid "Access to view '%(view)s' forbidden. Required permissions: %(permissions)s" msgstr "Odmowa dostępu do widoku '%(view)s' : %(permissions)s" #: prewikka/usergroup.py:47 #, python-format msgid "Access to view '%s' forbidden" msgstr "" #: prewikka/usergroup.py:50 #, python-format msgid "Required permissions: %s" msgstr "" #: prewikka/view.py:74 prewikka/view.py:81 prewikka/view.py:88 msgid "Parameters Normalization failed" msgstr "Normalizacja parametrów nie powiodła się" #: prewikka/view.py:75 #, python-format msgid "Parameter '%s' is not valid" msgstr "" #: prewikka/view.py:89 #, python-format msgid "Required parameter '%s' is missing" msgstr "" #: prewikka/view.py:95 #, fuzzy msgid "Invalid method" msgstr "Nieprawidłowa sesja" #: prewikka/view.py:102 #, fuzzy msgid "Invalid view" msgstr "Nieprawidłowa sesja" #: prewikka/view.py:528 #, python-format msgid "Method '%(method)s' is not allowed for view '%(view)s'" msgstr "" #: prewikka/view.py:532 prewikka/view.py:651 #, python-format msgid "View '%s' does not exist" msgstr "" #: prewikka/auth/auth.py:30 msgid "Authentication failed" msgstr "Błąd uwierzytelniania" #: prewikka/dataprovider/__init__.py:35 msgid "Equal" msgstr "Równa się" #: prewikka/dataprovider/__init__.py:36 #, fuzzy msgid "Equal (case-insensitive)" msgstr "Wycinek frazy (ignoruj wielkość liter)" #: prewikka/dataprovider/__init__.py:37 msgid "Not equal" msgstr "" #: prewikka/dataprovider/__init__.py:38 #, fuzzy msgid "Not equal (case-insensitive)" msgstr "Wycinek frazy (ignoruj wielkość liter)" #: prewikka/dataprovider/__init__.py:39 msgid "Regular expression" msgstr "Wyrażenie regularne" #: prewikka/dataprovider/__init__.py:40 msgid "Regular expression (case-insensitive)" msgstr "Wyrażenie regularne (ignoruj wielkość liter)" #: prewikka/dataprovider/__init__.py:41 #, fuzzy msgid "Not regular expression" msgstr "Wyrażenie regularne" #: prewikka/dataprovider/__init__.py:42 #, fuzzy msgid "Not regular expression (case-insensitive)" msgstr "Wyrażenie regularne (ignoruj wielkość liter)" #: prewikka/dataprovider/__init__.py:43 msgid "Lesser than" msgstr "Mniej niż" #: prewikka/dataprovider/__init__.py:44 msgid "Lesser or equal" msgstr "Mniejszerówne niż" #: prewikka/dataprovider/__init__.py:45 msgid "Greater than" msgstr "Więcej niż" #: prewikka/dataprovider/__init__.py:46 msgid "Greater or equal" msgstr "Większerówne niż" #: prewikka/dataprovider/__init__.py:47 msgid "Substring" msgstr "Wycinek frazy" #: prewikka/dataprovider/__init__.py:48 msgid "Substring (case-insensitive)" msgstr "Wycinek frazy (ignoruj wielkość liter)" #: prewikka/dataprovider/__init__.py:49 #, fuzzy msgid "Not substring" msgstr "Wycinek frazy" #: prewikka/dataprovider/__init__.py:50 #, fuzzy msgid "Not substring (case-insensitive)" msgstr "Wycinek frazy (ignoruj wielkość liter)" #: prewikka/dataprovider/__init__.py:92 prewikka/dataprovider/__init__.py:158 #, fuzzy msgid "Conversion error" msgstr "Alert korelacji" #: prewikka/dataprovider/__init__.py:93 prewikka/dataprovider/__init__.py:159 #, python-format msgid "Value %(value)r cannot be converted to %(type)s" msgstr "" #: prewikka/dataprovider/__init__.py:109 #, fuzzy msgid "Backend error" msgstr "Alert korelacji" #: prewikka/dataprovider/__init__.py:109 #, python-format msgid "No backend available for '%s' datatype" msgstr "" #: prewikka/dataprovider/__init__.py:116 prewikka/dataprovider/__init__.py:123 #, fuzzy msgid "Syntax error" msgstr "Alert korelacji" #: prewikka/dataprovider/__init__.py:116 #, python-format msgid "Unknown path: %s" msgstr "" #: prewikka/dataprovider/__init__.py:123 scripts/prewikka-cli:109 #: scripts/prewikka-cli:118 scripts/prewikka-cli:129 msgid "Could not parse input" msgstr "" #: prewikka/dataprovider/__init__.py:635 #, python-format msgid "No handler configured for '%s' datatype" msgstr "" #: prewikka/dataprovider/__init__.py:646 #, python-format msgid "Only one manager should be configured for '%s' backend" msgstr "" #: prewikka/dataprovider/idmef.py:128 msgid "High" msgstr "" #: prewikka/dataprovider/idmef.py:129 msgid "Medium" msgstr "" #: prewikka/dataprovider/idmef.py:130 msgid "Low" msgstr "" #: prewikka/dataprovider/idmef.py:131 #, fuzzy msgid "Informational" msgstr "Info: %s" #: prewikka/dataprovider/idmef.py:141 msgid "Provides an API to fetch IDMEF alerts" msgstr "" #: prewikka/dataprovider/idmef.py:142 #: prewikka/views/agents/templates/agents.mak:83 #: prewikka/views/datasearch/alert.py:75 prewikka/views/datasearch/alert.py:76 msgid "Alerts" msgstr "Alerty" #: prewikka/dataprovider/idmef.py:149 prewikka/views/datasearch/alert.py:88 #: prewikka/views/datasearch/threat.py:75 msgid "Classification" msgstr "Klasyfikacja" #: prewikka/dataprovider/idmef.py:150 #, fuzzy msgid "Source IP" msgstr "Port źródłowy" #: prewikka/dataprovider/idmef.py:151 #: prewikka/views/messagesummary/messagesummary.py:548 #: prewikka/views/messagesummary/messagesummary.py:569 msgid "Source port" msgstr "Port źródłowy" #: prewikka/dataprovider/idmef.py:152 #, fuzzy msgid "Target IP" msgstr "Port docelowy" #: prewikka/dataprovider/idmef.py:153 #: prewikka/views/messagesummary/messagesummary.py:549 #: prewikka/views/messagesummary/messagesummary.py:570 msgid "Target port" msgstr "Port docelowy" #: prewikka/dataprovider/idmef.py:154 #, fuzzy msgid "Analyzer name" msgstr "Czas analizatora" #: prewikka/dataprovider/idmef.py:157 #, fuzzy msgid "Alert deletion" msgstr "Lista alertów" #: prewikka/dataprovider/idmef.py:182 msgid "Provides an API to fetch IDMEF heartbeats" msgstr "" #: prewikka/dataprovider/idmef.py:183 #: prewikka/views/agents/templates/agents.mak:87 #: prewikka/views/datasearch/heartbeat.py:56 msgid "Heartbeats" msgstr "Tętno" #: prewikka/dataprovider/idmef.py:188 #, fuzzy msgid "Heartbeat deletion" msgstr "Analiza tętna" #: prewikka/dataprovider/parsers/lucene/__init__.py:52 #, fuzzy msgid "Lucene emulation error" msgstr "Alert korelacji" #: prewikka/dataprovider/parsers/lucene/__init__.py:53 msgid "" "This Lucene expression cannot be emulated properly using the Criterion " "backend" msgstr "" #: prewikka/dataprovider/plugins/idmef/__init__.py:97 msgid "Plugin for fetching IDMEF alerts from the Prelude database" msgstr "" #: prewikka/dataprovider/plugins/idmef/__init__.py:111 msgid "Plugin for fetching IDMEF heartbeats from the Prelude database" msgstr "" #: prewikka/plugins/warning/__init__.py:33 msgid "Prelude Warning message" msgstr "" #: prewikka/plugins/warning/templates/warning.mak:14 msgid "WARNING" msgstr "" #: prewikka/plugins/warning/templates/warning.mak:17 msgid "Prelude OSS is the open-source version of the Prelude SIEM" msgstr "" #: prewikka/plugins/warning/templates/warning.mak:21 #, python-format msgid "" "This OSS version has lower " "performance and less features than the Pro/Enterprise versions." msgstr "" #: prewikka/plugins/warning/templates/warning.mak:22 msgid "" "It is intended for tests and small environments, and should not be used " "in critical environments." msgstr "" #: prewikka/plugins/warning/templates/warning.mak:26 #, python-format msgid "Prelude OSS is distributed under the %s." msgstr "" #: prewikka/plugins/warning/templates/warning.mak:27 msgid "" "Products derivated from Prelude OSS modules are therefore subject to the " "terms of the GPLv2." msgstr "" #: prewikka/plugins/warning/templates/warning.mak:30 #: prewikka/templates/error.mak:171 prewikka/templates/toplayout.mak:62 #: prewikka/templates/toplayout.mak:77 prewikka/templates/toplayout.mak:94 #: prewikka/views/aboutplugin/templates/aboutplugin.mak:44 msgid "OK" msgstr "" #: prewikka/renderer/__init__.py:44 msgid "No data to display." msgstr "" #: prewikka/renderer/__init__.py:143 prewikka/renderer/__init__.py:147 #: prewikka/renderer/__init__.py:151 #, fuzzy msgid "Renderer error" msgstr "Alert korelacji" #: prewikka/renderer/__init__.py:144 #, python-format msgid "No backend supporting render type '%s'" msgstr "" #: prewikka/renderer/__init__.py:148 #, python-format msgid "No backend named '%s'" msgstr "" #: prewikka/renderer/__init__.py:152 #, python-format msgid "Backend '%(backend)s' does not support render type '%(type)s'" msgstr "" #: prewikka/renderer/chartjs/__init__.py:104 msgid "ChartJS renderer backend" msgstr "" #: prewikka/renderer/chartjs/bar/__init__.py:38 msgid "ChartJS Bar renderer type" msgstr "" #: prewikka/renderer/chartjs/timeline/__init__.py:85 msgid "ChartJS Timebar renderer type" msgstr "" #: prewikka/session/session.py:39 msgid "Invalid session" msgstr "Nieprawidłowa sesja" #: prewikka/session/session.py:40 msgid "The session cookie carried by your browser is invalid" msgstr "" #: prewikka/session/session.py:44 msgid "Session expired" msgstr "Sesja wygasła" #: prewikka/session/session.py:45 msgid "Your session has expired: please sign in again to continue using Prelude" msgstr "" #: prewikka/session/session.py:181 msgid "Logged out" msgstr "Wylogowany" #: prewikka/session/anonymous/anonymous.py:31 #, fuzzy msgid "Anonymous authentication" msgstr "Błąd uwierzytelniania" #: prewikka/templates/baseview.mak:148 msgid "View options" msgstr "" #: prewikka/templates/baseview.mak:151 msgid "View help" msgstr "" #: prewikka/templates/baseview.mak:205 msgid "This app has been disabled or failed to load." msgstr "" #: prewikka/templates/baseview.mak:211 prewikka/templates/baseview.mak:222 #, fuzzy msgid "name" msgstr "Nazwa" #: prewikka/templates/baseview.mak:287 msgid "About" msgstr "O systemie" #: prewikka/templates/baseview.mak:290 msgid "Are you sure you want to log out?" msgstr "" #: prewikka/templates/baseview.mak:290 msgid "Logout" msgstr "Wyloguj" #: prewikka/templates/error.mak:66 msgid "Detail" msgstr "Szczegół" #: prewikka/templates/error.mak:67 msgid "Copy to clipboard" msgstr "" #: prewikka/templates/error.mak:137 prewikka/templates/error.mak:145 msgid "Error: {0}" msgstr "" #: prewikka/templates/error.mak:155 msgid "This may be due to one or more of the following reasons:" msgstr "" #: prewikka/templates/error.mak:157 msgid "You don't have the required permissions." msgstr "" #: prewikka/templates/error.mak:158 #, python-format msgid "Required apps are disabled. See the %s page for more details." msgstr "" #: prewikka/templates/error.mak:176 prewikka/templates/toplayout.mak:61 #: prewikka/views/crontab/templates/cronjob.mak:122 #: prewikka/views/filter/templates/filteredition.mak:122 msgid "Cancel" msgstr "Anuluj" #: prewikka/templates/error.mak:177 #, fuzzy msgid "Sign in" msgstr "Pochodzenie" #: prewikka/templates/error.mak:181 msgid "Back" msgstr "" #: prewikka/templates/error.mak:184 msgid "Retry" msgstr "" #: prewikka/templates/error.mak:186 msgid "Redirect to main page" msgstr "" #: prewikka/templates/mainmenu.mak:44 msgid "Refresh:" msgstr "Odśwież:" #: prewikka/templates/mainmenu.mak:49 msgid "Update frequency of the current page" msgstr "" #: prewikka/templates/mainmenu.mak:76 msgid "Period:" msgstr "Okres:" #: prewikka/templates/mainmenu.mak:81 msgid "Period to visualize" msgstr "" #: prewikka/templates/mainmenu.mak:111 msgid "Start:" msgstr "Początek:" #: prewikka/templates/mainmenu.mak:117 msgid "start" msgstr "początek" #: prewikka/templates/mainmenu.mak:117 #, fuzzy msgid "Start date" msgstr "początek" #: prewikka/templates/mainmenu.mak:123 msgid "End:" msgstr "Koniec:" #: prewikka/templates/mainmenu.mak:130 msgid "end" msgstr "koniec" #: prewikka/templates/mainmenu.mak:130 msgid "End date" msgstr "" #: prewikka/templates/toplayout.mak:57 msgid "Please Confirm" msgstr "" #: prewikka/templates/toplayout.mak:73 msgid "Prelude Dialog" msgstr "" #: prewikka/templates/toplayout.mak:88 #, fuzzy msgid "Connection error" msgstr "Alert korelacji" #: prewikka/templates/toplayout.mak:91 msgid "" "Connection failed, the server may be down or you may be experiencing " "network issues." msgstr "" #: prewikka/utils/misc.py:72 prewikka/views/agents/agents.py:45 msgid "Offline" msgstr "Niedostepny" #: prewikka/utils/misc.py:75 prewikka/views/agents/agents.py:210 msgid "Unknown" msgstr "Nieznany" #: prewikka/utils/misc.py:78 msgid "Missing" msgstr "Brakujący" #: prewikka/utils/misc.py:80 prewikka/views/agents/agents.py:44 msgid "Online" msgstr "Dostępny" #: prewikka/views/about/__init__.py:13 msgid "Prelude About page" msgstr "" #: prewikka/views/about/templates/about.mak:11 #, python-format msgid "Prelude version %s" msgstr "" #: prewikka/views/about/templates/about.mak:15 msgid "Prelude is a SIEM (Security Information and Event Management)" msgstr "" #: prewikka/views/about/templates/about.mak:21 msgid "" "{prelude} is a security management solution that collects, filters, " "normalizes, correlates, stores and archives data from various sources of " "your information system. Based on all this information Prelude can " "provide a global vision of your system's security level and thus prevent " "attacks, intrusions as well as viral infections." msgstr "" #: prewikka/views/about/templates/about.mak:24 msgid "Prelude Team:" msgstr "" #: prewikka/views/about/templates/about.mak:25 msgid "" "Prelude OSS is an open-source project originally created by Yoann " "Vandoorselaere in 1998." msgstr "" #: prewikka/views/about/templates/about.mak:27 msgid "Vigilo is a NMS (Network Management System)" msgstr "" #: prewikka/views/about/templates/about.mak:33 msgid "" "{vigilo} is a complete monitoring and performance management solution " "capable of handling medium and large-scale systems (network - servers - " "applications) due to its distributed and modular architecture. Vigilo " "offers all the features required for performance supervision: states and " "alarms management, metrology, cartography, event correlation and " "reporting." msgstr "" #: prewikka/views/about/templates/about.mak:39 #, python-format msgid "" "Prelude SIEM and Vigilo NMS are being developed by the %s company, " "designer, integrator and operator of mission critical systems." msgstr "" #: prewikka/views/about/templates/about.mak:44 msgid "Contact" msgstr "Kontakt" #: prewikka/views/about/templates/about.mak:46 msgid "Phone:" msgstr "Telefon:" #: prewikka/views/about/templates/about.mak:47 msgid "Fax:" msgstr "Faks:" #: prewikka/views/about/templates/about.mak:50 msgid "Office" msgstr "Biuro" #: prewikka/views/about/templates/about.mak:56 msgid "Websites" msgstr "Strony internetowe" #: prewikka/views/about/templates/about.mak:67 #: prewikka/views/aboutplugin/templates/aboutplugin.mak:132 #: prewikka/views/agents/templates/heartbeatanalyze.mak:71 #: prewikka/views/messagesummary/templates/messagesummary.mak:93 #, fuzzy msgid "Close" msgstr "Kod" #: prewikka/views/aboutplugin/__init__.py:36 msgid "Plugin installation and activation management page" msgstr "" #: prewikka/views/aboutplugin/__init__.py:40 #: prewikka/views/crontab/__init__.py:37 msgid "USER_MANAGEMENT" msgstr "" #: prewikka/views/aboutplugin/__init__.py:42 msgid "Apps: View" msgstr "" #: prewikka/views/aboutplugin/__init__.py:43 msgid "Apps: API" msgstr "" #: prewikka/views/aboutplugin/__init__.py:44 msgid "Apps: Dataprovider backend" msgstr "" #: prewikka/views/aboutplugin/__init__.py:45 msgid "Apps: Dataprovider type" msgstr "" #: prewikka/views/aboutplugin/__init__.py:46 #, fuzzy msgid "Apps: Authentication" msgstr "Błąd uwierzytelniania" #: prewikka/views/aboutplugin/__init__.py:47 msgid "Apps: Identification" msgstr "" #: prewikka/views/aboutplugin/__init__.py:48 msgid "Apps: Renderer backend" msgstr "" #: prewikka/views/aboutplugin/__init__.py:49 msgid "Apps: Renderer type" msgstr "" #: prewikka/views/aboutplugin/__init__.py:82 msgid "list plugin: list installed plugins" msgstr "" #: prewikka/views/aboutplugin/__init__.py:91 #, fuzzy msgid "Apps" msgstr "Zastosuj" #: prewikka/views/aboutplugin/__init__.py:120 msgid "sync plugin: initialize the plugin database schemas" msgstr "" #: prewikka/views/aboutplugin/__init__.py:134 #, python-format msgid "Applying %(module)s %(script)s..." msgstr "" #: prewikka/views/aboutplugin/__init__.py:144 msgid "All updates applied" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:44 msgid "ERROR" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:48 #, fuzzy msgid "Update failed" msgstr "Filtr" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:111 #, fuzzy msgid "Update Dialog" msgstr "Filtr" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:121 msgid "Plugin" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:122 #, fuzzy msgid "Script" msgstr "Opis" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:123 msgid "Result" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:144 msgid "Plugin Maintenance" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:147 msgid "" "The following apps need to be updated before they can be loaded into the " "system" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:154 #: prewikka/views/aboutplugin/templates/aboutplugin.mak:190 #: prewikka/views/agents/templates/agents.mak:29 #: prewikka/views/agents/templates/heartbeatanalyze.mak:19 #: prewikka/views/crontab/templates/cronjob.mak:114 #: prewikka/views/crontab/templates/crontab.mak:17 #: prewikka/views/filter/templates/filterlisting.mak:23 #: prewikka/views/messagesummary/messagesummary.py:288 #: prewikka/views/messagesummary/messagesummary.py:425 #: prewikka/views/messagesummary/messagesummary.py:676 #: prewikka/views/messagesummary/messagesummary.py:693 #: prewikka/views/messagesummary/messagesummary.py:716 #: prewikka/views/messagesummary/messagesummary.py:778 #: prewikka/views/messagesummary/messagesummary.py:797 #: prewikka/views/messagesummary/messagesummary.py:833 #: prewikka/views/usermanagement/templates/usersettings.mak:15 msgid "Name" msgstr "Nazwa" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:155 #: prewikka/views/aboutplugin/templates/aboutplugin.mak:191 #: prewikka/views/filter/templates/filterlisting.mak:28 #: prewikka/views/idmefnav/templates/idmefnav.mak:56 #: prewikka/views/messagesummary/messagesummary.py:745 #: prewikka/views/messagesummary/messagesummary.py:751 msgid "Description" msgstr "Opis" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:156 #: prewikka/views/aboutplugin/templates/aboutplugin.mak:192 #: prewikka/views/agents/templates/agents.mak:33 #: prewikka/views/messagesummary/messagesummary.py:427 #: prewikka/views/messagesummary/messagesummary.py:530 msgid "Version" msgstr "Wersja" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:157 #, fuzzy msgid "Current database version" msgstr "Wersja bazy danych" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:158 msgid "Required database update" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:174 msgid "Install update" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:182 msgid "Installed Apps" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:193 msgid "Database version" msgstr "Wersja bazy danych" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:194 msgid "Active" msgstr "Aktywny" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:215 msgid "Update the selected apps?" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:215 msgid "Update" msgstr "Aktualizacja" #: prewikka/views/agents/__init__.py:12 #, fuzzy msgid "Agents status information page" msgstr "Informacje o adresie" #: prewikka/views/agents/agents.py:64 prewikka/views/agents/agents.py:133 msgid "Agents" msgstr "Agenci" #: prewikka/views/agents/agents.py:110 msgid "Node name n/a" msgstr "Nazwa węzła - bd." #: prewikka/views/agents/agents.py:111 msgid "OS version n/a" msgstr "Wersja systemu - bd." #: prewikka/views/agents/agents.py:112 msgid "OS type n/a" msgstr "Typ systemu - bd." #: prewikka/views/agents/agents.py:117 msgid "Node location n/a" msgstr "Lokalizacja węzła - bd." #: prewikka/views/agents/agents.py:127 msgid "Alert listing" msgstr "Lista alertów" #: prewikka/views/agents/agents.py:128 #, fuzzy msgid "Heartbeat listing" msgstr "Analiza tętna" #: prewikka/views/agents/agents.py:129 #: prewikka/views/agents/templates/heartbeatanalyze.mak:12 msgid "Heartbeat analysis" msgstr "Analiza tętna" #: prewikka/views/agents/agents.py:133 prewikka/views/agents/agents.py:157 #: prewikka/views/datasearch/idmef.py:158 #: prewikka/views/messagesummary/messagesummary.py:332 msgid "IDMEF_VIEW" msgstr "" #: prewikka/views/agents/agents.py:133 #: prewikka/views/datasearch/heartbeat.py:55 msgid "Monitoring" msgstr "Monitorowanie" #: prewikka/views/agents/agents.py:142 msgid "IDMEF_ALTER" msgstr "" #: prewikka/views/agents/agents.py:184 msgid "Normal sensor start" msgstr "" #: prewikka/views/agents/agents.py:186 msgid "Unexpected sensor restart" msgstr "" #: prewikka/views/agents/agents.py:192 #, python-format msgid "Unexpected heartbeat interval: %(delta)s" msgstr "" #: prewikka/views/agents/agents.py:195 msgid "Normal sensor stop" msgstr "" #: prewikka/views/agents/agents.py:207 #, python-format msgid "Sensor is down since %s" msgstr "" #: prewikka/views/agents/agents.py:216 #, python-format msgid "" "No anomaly in the last %(count)d heartbeats (one heartbeat every " "%(delta)s average)" msgstr "" #: prewikka/views/agents/templates/agents.mak:24 msgid "Show/Hide all" msgstr "" #: prewikka/views/agents/templates/agents.mak:24 #, fuzzy msgid "Search:" msgstr "Początek:" #: prewikka/views/agents/templates/agents.mak:30 msgid "Location" msgstr "Lokalizacja" #: prewikka/views/agents/templates/agents.mak:31 msgid "Node" msgstr "Węzeł" #: prewikka/views/agents/templates/agents.mak:32 #: prewikka/views/agents/templates/heartbeatanalyze.mak:20 #: prewikka/views/datasearch/heartbeat.py:67 #: prewikka/views/messagesummary/messagesummary.py:424 msgid "Model" msgstr "Typ" #: prewikka/views/agents/templates/agents.mak:34 #: prewikka/views/messagesummary/messagesummary.py:428 msgid "Class" msgstr "Klasa" #: prewikka/views/agents/templates/agents.mak:38 #: prewikka/views/agents/templates/heartbeatanalyze.mak:25 msgid "Latest heartbeat" msgstr "Ostatnie tętno" #: prewikka/views/agents/templates/agents.mak:39 msgid "Status" msgstr "Status" #: prewikka/views/agents/templates/agents.mak:83 msgid "Delete the alerts of the selected agent(s)" msgstr "" #: prewikka/views/agents/templates/agents.mak:87 msgid "Delete the heartbeats of the selected agent(s)" msgstr "" #: prewikka/views/agents/templates/agents.mak:89 msgid "Delete the selected IDMEF messages?" msgstr "" #: prewikka/views/agents/templates/agents.mak:89 #: prewikka/views/datasearch/idmef.py:195 #: prewikka/views/filter/templates/filterlisting.mak:42 msgid "Delete" msgstr "Usuń" #: prewikka/views/agents/templates/heartbeatanalyze.mak:21 #, fuzzy msgid "OS" msgstr "TOS" #: prewikka/views/agents/templates/heartbeatanalyze.mak:22 #: prewikka/views/datasearch/heartbeat.py:66 #: prewikka/views/messagesummary/messagesummary.py:412 msgid "Node name" msgstr "Nazwa węzła" #: prewikka/views/agents/templates/heartbeatanalyze.mak:23 #: prewikka/views/messagesummary/messagesummary.py:395 msgid "Node location" msgstr "Lokalizacja węzła" #: prewikka/views/agents/templates/heartbeatanalyze.mak:24 #: prewikka/views/datasearch/heartbeat.py:65 #: prewikka/views/messagesummary/messagesummary.py:418 msgid "Node address" msgstr "Adres węzła" #: prewikka/views/agents/templates/heartbeatanalyze.mak:26 #, fuzzy msgid "Current status" msgstr "Hasło:" #: prewikka/views/agents/templates/heartbeatanalyze.mak:56 msgid "Events" msgstr "Zdarzenia" #: prewikka/views/crontab/__init__.py:30 msgid "Scheduling management" msgstr "" #: prewikka/views/crontab/__init__.py:35 #, fuzzy msgid "Scheduled jobs management page" msgstr "Filtruj po agencie" #: prewikka/views/crontab/__init__.py:62 msgid "Configuration" msgstr "Konfiguracja" #: prewikka/views/crontab/__init__.py:62 msgid "Scheduling" msgstr "" #: prewikka/views/crontab/__init__.py:75 prewikka/views/crontab/__init__.py:104 msgid "SYSTEM" msgstr "" #: prewikka/views/crontab/__init__.py:88 #, fuzzy msgid "Pending" msgstr "Zmienna" #: prewikka/views/crontab/__init__.py:98 #, fuzzy msgid "Error" msgstr "Alert korelacji" #: prewikka/views/crontab/templates/cronjob.mak:54 msgid "Schedule:" msgstr "" #: prewikka/views/crontab/templates/cronjob.mak:69 #, fuzzy msgid "custom" msgstr "Dostosowane" #: prewikka/views/crontab/templates/cronjob.mak:70 msgid "disabled" msgstr "" #: prewikka/views/crontab/templates/cronjob.mak:79 #, fuzzy msgid "Minute:" msgstr "%d minuta" #: prewikka/views/crontab/templates/cronjob.mak:83 #, fuzzy msgid "Hour:" msgstr "%d godzina" #: prewikka/views/crontab/templates/cronjob.mak:87 #, fuzzy msgid "Day:" msgstr "Dzisiaj" #: prewikka/views/crontab/templates/cronjob.mak:91 #, fuzzy msgid "Month:" msgstr "%d miesiąc" #: prewikka/views/crontab/templates/cronjob.mak:95 msgid "Weekday:" msgstr "" #: prewikka/views/crontab/templates/cronjob.mak:107 msgid "Edit Job" msgstr "" #: prewikka/views/crontab/templates/cronjob.mak:112 #: prewikka/views/filter/templates/filteredition.mak:73 #: prewikka/views/usermanagement/templates/usersettings.mak:13 msgid "Name:" msgstr "Nazwa:" #: prewikka/views/crontab/templates/cronjob.mak:123 #: prewikka/views/filter/templates/filteredition.mak:123 #: prewikka/views/usermanagement/templates/usersettings.mak:61 msgid "Save" msgstr "Zapisz" #: prewikka/views/crontab/templates/crontab.mak:15 msgid "Scheduled Jobs" msgstr "" #: prewikka/views/crontab/templates/crontab.mak:18 msgid "Schedule" msgstr "" #: prewikka/views/crontab/templates/crontab.mak:19 #, fuzzy msgid "User" msgstr "Numer" #: prewikka/views/crontab/templates/crontab.mak:20 msgid "Last execution" msgstr "" #: prewikka/views/crontab/templates/crontab.mak:21 msgid "Next execution" msgstr "" #: prewikka/views/crontab/templates/crontab.mak:69 msgid "Disable" msgstr "" #: prewikka/views/crontab/templates/crontab.mak:70 #, fuzzy msgid "Enable" msgstr "Nazwa" #: prewikka/views/datasearch/alert.py:71 #, fuzzy msgid "Alert listing page" msgstr "Lista alertów" #: prewikka/views/datasearch/alert.py:76 #, fuzzy msgid "Aggregated alerts" msgstr "Alerty skorelowany" #: prewikka/views/datasearch/alert.py:87 #: prewikka/views/datasearch/heartbeat.py:63 #: prewikka/views/datasearch/threat.py:74 msgid "Date" msgstr "Data" #: prewikka/views/datasearch/alert.py:89 prewikka/views/datasearch/threat.py:76 msgid "Source" msgstr "Źródło" #: prewikka/views/datasearch/alert.py:90 prewikka/views/datasearch/threat.py:77 msgid "Target" msgstr "Cel" #: prewikka/views/datasearch/alert.py:91 msgid "Analyzer" msgstr "Analizator" #: prewikka/views/datasearch/alert.py:94 msgid "Delete the selected alerts?" msgstr "" #: prewikka/views/datasearch/alert.py:148 #: prewikka/views/idmefnav/__init__.py:44 #, fuzzy msgid "IDMEF" msgstr "Ttime" #: prewikka/views/datasearch/datasearch.py:48 msgid "minute" msgstr "minuta" #: prewikka/views/datasearch/datasearch.py:48 msgid "hour" msgstr "godzina" #: prewikka/views/datasearch/datasearch.py:48 msgid "day" msgstr "dzień" #: prewikka/views/datasearch/datasearch.py:48 msgid "month" msgstr "miesiąc" #: prewikka/views/datasearch/datasearch.py:48 msgid "year" msgstr "rok" #: prewikka/views/datasearch/datasearch.py:161 #, fuzzy msgid "Time group error" msgstr "Alert korelacji" #: prewikka/views/datasearch/datasearch.py:161 msgid "Only one time unit can be specified in a groupby query" msgstr "" #: prewikka/views/datasearch/datasearch.py:446 msgid "Forensic" msgstr "" #: prewikka/views/datasearch/datasearch.py:446 msgid "Dashboard" msgstr "" #: prewikka/views/datasearch/datasearch.py:490 msgid "CSV export" msgstr "" #: prewikka/views/datasearch/datasearch.py:622 msgid "General" msgstr "" #: prewikka/views/datasearch/heartbeat.py:51 #, fuzzy msgid "Heartbeat listing page" msgstr "Analiza tętna" #: prewikka/views/datasearch/heartbeat.py:56 #, fuzzy msgid "Aggregated heartbeats" msgstr "Ostatnie tętno" #: prewikka/views/datasearch/heartbeat.py:64 msgid "Agent" msgstr "Agent" #: prewikka/views/datasearch/heartbeat.py:69 msgid "Delete the selected heartbeats?" msgstr "" #: prewikka/views/datasearch/idmef.py:46 #, fuzzy msgid "See IDMEF details" msgstr "Alerty" #: prewikka/views/datasearch/threat.py:66 #, fuzzy msgid "Threat listing page" msgstr "Analiza tętna" #: prewikka/views/datasearch/threat.py:69 #: prewikka/views/datasearch/threat.py:70 msgid "Threats" msgstr "Zagrożenia" #: prewikka/views/datasearch/threat.py:70 #, fuzzy msgid "Aggregated threats" msgstr "Ostatnie tętno" #: prewikka/views/datasearch/threat.py:78 msgid "Program" msgstr "Program" #: prewikka/views/datasearch/templates/details.mak:26 #, python-format msgid "Group by %s" msgstr "Grupuj po %s" #: prewikka/views/datasearch/templates/details.mak:30 #: prewikka/views/datasearch/templates/forensic.mak:219 msgid "Add to search" msgstr "" #: prewikka/views/datasearch/templates/details.mak:31 #: prewikka/views/datasearch/templates/forensic.mak:220 msgid "Exclude from search" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:9 msgid "Fields" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:10 msgid "Query history" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:63 #, fuzzy msgid "Chart type" msgstr "początek" #: prewikka/views/datasearch/templates/forensic.mak:73 msgid "Limit" msgstr "Limit" #: prewikka/views/datasearch/templates/forensic.mak:89 msgid "Expert mode" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:96 msgid "Condensed mode" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:108 msgid "Search mode" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:112 #: prewikka/views/datasearch/templates/forensic.mak:217 #, fuzzy msgid "Search" msgstr "Początek:" #: prewikka/views/datasearch/templates/forensic.mak:114 msgid "Reset search" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:124 #: prewikka/views/datasearch/templates/forensic.mak:222 msgid "Group by" msgstr "Grupuj po" #: prewikka/views/datasearch/templates/forensic.mak:125 msgid "Select your field" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:126 #, fuzzy msgid "Time values" msgstr "Wartość" #: prewikka/views/datasearch/templates/forensic.mak:131 #, python-format msgid "%s fields" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:167 #, fuzzy msgid "Timeline" msgstr "Ttime" #: prewikka/views/datasearch/templates/forensic.mak:221 msgid "New search" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:231 #: prewikka/views/messagesummary/messagesummary.py:1026 msgid "Actions" msgstr "Akcje" #: prewikka/views/datasearch/templates/forensic.mak:244 msgid "Informations" msgstr "Informacje" #: prewikka/views/datasearch/templates/infos.mak:3 msgid "Field" msgstr "" #: prewikka/views/datasearch/templates/infos.mak:9 #, fuzzy msgid "Occurrence" msgstr "Źródło" #: prewikka/views/datasearch/templates/table.mak:12 #, fuzzy msgid "Count" msgstr "Moje konto" #: prewikka/views/filter/__init__.py:11 #, fuzzy msgid "Filters management page" msgstr "Filtruj po agencie" #: prewikka/views/filter/filter.py:113 #: prewikka/views/usermanagement/usermanagement.py:18 msgid "Preferences" msgstr "Preferencje" #: prewikka/views/filter/filter.py:113 #: prewikka/views/filter/templates/filterlisting.mak:17 msgid "Filters" msgstr "Filtry" #: prewikka/views/filter/filter.py:124 #: prewikka/views/filter/templates/filteredition.mak:66 #, python-format msgid "Filter %s" msgstr "Filtr %s" #: prewikka/views/filter/filter.py:199 #, fuzzy msgid "Filter error" msgstr "Filtr" #: prewikka/views/filter/filter.py:199 #, python-format msgid "Filter '%s' does not exist" msgstr "" #: prewikka/views/filter/filter.py:236 prewikka/views/filter/filter.py:248 msgid "Could not save filter" msgstr "" #: prewikka/views/filter/filter.py:236 msgid "No name for this filter was provided" msgstr "" #: prewikka/views/filter/filter.py:248 msgid "The filter name is already used by another filter" msgstr "" #: prewikka/views/filter/templates/filteredition.mak:66 #: prewikka/views/filter/templates/filterlisting.mak:17 #: prewikka/views/filter/templates/menu.mak:48 msgid "New filter" msgstr "Nowy filtr" #: prewikka/views/filter/templates/filteredition.mak:75 msgid "Filter name" msgstr "Nazwa filtra" #: prewikka/views/filter/templates/filteredition.mak:80 msgid "Category:" msgstr "Kategoria:" #: prewikka/views/filter/templates/filteredition.mak:92 msgid "Description:" msgstr "Opis:" #: prewikka/views/filter/templates/filterlisting.mak:24 #: prewikka/views/messagesummary/messagesummary.py:750 msgid "Category" msgstr "Kategoria" #: prewikka/views/filter/templates/filterlisting.mak:40 msgid "Create" msgstr "Utwórz" #: prewikka/views/filter/templates/filterlisting.mak:41 msgid "Duplicate" msgstr "Duplikat" #: prewikka/views/filter/templates/filterlisting.mak:42 msgid "Delete the selected filters?" msgstr "" #: prewikka/views/filter/templates/menu.mak:4 msgid "Filter:" msgstr "Filtr:" #: prewikka/views/filter/templates/menu.mak:38 msgid "Available filters" msgstr "Dostępne filtry" #: prewikka/views/filter/templates/menu.mak:46 msgid "No filter" msgstr "Bez filtra" #: prewikka/views/filter/templates/menu.mak:51 #, fuzzy msgid "No category" msgstr "kategoria" #: prewikka/views/filter/templates/widget.mak:7 msgid "Select a path..." msgstr "" #: prewikka/views/filter/templates/widget.mak:9 msgid "Default paths" msgstr "" #: prewikka/views/filter/templates/widget.mak:15 msgid "All paths" msgstr "" #: prewikka/views/filter/templates/widget.mak:25 #: prewikka/views/filter/templates/widget.mak:46 msgid "Change operator" msgstr "" #: prewikka/views/filter/templates/widget.mak:32 msgid "value" msgstr "wartość" #: prewikka/views/filter/templates/widget.mak:34 msgid "Delete condition" msgstr "" #: prewikka/views/filter/templates/widget.mak:42 #, fuzzy msgid "AND" msgstr "rozwiń" #: prewikka/views/filter/templates/widget.mak:42 #, fuzzy msgid "OR" msgstr "Port" #: prewikka/views/filter/templates/widget.mak:56 msgid "Add condition" msgstr "" #: prewikka/views/filter/templates/widget.mak:57 msgid "Add group" msgstr "" #: prewikka/views/filter/templates/widget.mak:59 msgid "Delete group" msgstr "" #: prewikka/views/idmefnav/__init__.py:36 msgid "IDMEF navigator" msgstr "" #: prewikka/views/idmefnav/__init__.py:44 msgid "Help" msgstr "Pomoc" #: prewikka/views/idmefnav/templates/idmefnav.mak:12 msgid "Children" msgstr "" #: prewikka/views/idmefnav/templates/idmefnav.mak:20 #, fuzzy msgid "Aggregates" msgstr "Alerty skorelowany" #: prewikka/views/idmefnav/templates/idmefnav.mak:36 msgid "Attributes" msgstr "" #: prewikka/views/idmefnav/templates/idmefnav.mak:54 msgid "Rank" msgstr "" #: prewikka/views/idmefnav/templates/idmefnav.mak:55 msgid "Keyword" msgstr "" #: prewikka/views/messagesummary/__init__.py:13 msgid "Detailed alert and heartbeat page" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:289 #: prewikka/views/messagesummary/messagesummary.py:578 msgid "Code" msgstr "Kod" #: prewikka/views/messagesummary/messagesummary.py:290 msgid "Data length" msgstr "Długość danych" #: prewikka/views/messagesummary/messagesummary.py:291 msgid "Data" msgstr "Dane" #: prewikka/views/messagesummary/messagesummary.py:365 #, fuzzy, python-format msgid "(agent local time: %s)" msgstr "sondy" #: prewikka/views/messagesummary/messagesummary.py:372 #: prewikka/views/messagesummary/messagesummary.py:835 msgid "Create time" msgstr "Data utworzenia" #: prewikka/views/messagesummary/messagesummary.py:375 msgid "Detect time" msgstr "Data wykrycia" #: prewikka/views/messagesummary/messagesummary.py:380 msgid "Analyzer time" msgstr "Czas analizatora" #: prewikka/views/messagesummary/messagesummary.py:386 msgid "Process" msgstr "Proces" #: prewikka/views/messagesummary/messagesummary.py:387 msgid "Process Path" msgstr "Ścieżka procesu" #: prewikka/views/messagesummary/messagesummary.py:388 msgid "Process PID" msgstr "Identyfikator procesu" #: prewikka/views/messagesummary/messagesummary.py:415 #, fuzzy msgid "Node name (resolved)" msgstr "Nazwa węzła" #: prewikka/views/messagesummary/messagesummary.py:426 msgid "Analyzerid" msgstr "ID analizatora" #: prewikka/views/messagesummary/messagesummary.py:430 msgid "Manufacturer" msgstr "Dostawca" #: prewikka/views/messagesummary/messagesummary.py:438 msgid "Operating System" msgstr "System operacyjny" #: prewikka/views/messagesummary/messagesummary.py:456 #, python-format msgid "Analyzer Path (%d not shown)" msgstr "Ścieżka analizatora (%d ukryte)" #: prewikka/views/messagesummary/messagesummary.py:463 #: prewikka/views/messagesummary/messagesummary.py:1035 #: prewikka/views/messagesummary/messagesummary.py:1106 #, python-format msgid "Analyzer #%d" msgstr "Analizator nr %d" #: prewikka/views/messagesummary/messagesummary.py:473 msgid "Additional data" msgstr "Dodatkowe dane" #: prewikka/views/messagesummary/messagesummary.py:476 #: prewikka/views/messagesummary/messagesummary.py:717 msgid "Meaning" msgstr "Zmienna" #: prewikka/views/messagesummary/messagesummary.py:477 msgid "Value" msgstr "Wartość" #: prewikka/views/messagesummary/messagesummary.py:531 #: prewikka/views/messagesummary/messagesummary.py:552 msgid "Header length" msgstr "Nagłówek" #: prewikka/views/messagesummary/messagesummary.py:532 msgid "TOS" msgstr "TOS" #: prewikka/views/messagesummary/messagesummary.py:533 #: prewikka/views/messagesummary/messagesummary.py:571 msgid "Length" msgstr "Wielkość" #: prewikka/views/messagesummary/messagesummary.py:534 #: prewikka/views/messagesummary/messagesummary.py:580 msgid "Id" msgstr "ID" #: prewikka/views/messagesummary/messagesummary.py:538 msgid "Ip offset" msgstr "Ofset IP" #: prewikka/views/messagesummary/messagesummary.py:539 msgid "TTL" msgstr "TTL" #: prewikka/views/messagesummary/messagesummary.py:540 #: prewikka/views/messagesummary/messagesummary.py:926 #: prewikka/views/messagesummary/messagesummary.py:929 #: prewikka/views/messagesummary/messagesummary.py:932 msgid "Protocol" msgstr "Protokół" #: prewikka/views/messagesummary/messagesummary.py:541 #: prewikka/views/messagesummary/messagesummary.py:563 #: prewikka/views/messagesummary/messagesummary.py:572 #: prewikka/views/messagesummary/messagesummary.py:579 msgid "Checksum" msgstr "Suma" #: prewikka/views/messagesummary/messagesummary.py:542 msgid "Source address" msgstr "IP źródłowy" #: prewikka/views/messagesummary/messagesummary.py:543 msgid "Target address" msgstr "IP docelowy" #: prewikka/views/messagesummary/messagesummary.py:553 msgid "Reserved" msgstr "Rezerw." #: prewikka/views/messagesummary/messagesummary.py:562 msgid "Window" msgstr "Okno" #: prewikka/views/messagesummary/messagesummary.py:564 msgid "URP" msgstr "URP" #: prewikka/views/messagesummary/messagesummary.py:577 #: prewikka/views/messagesummary/messagesummary.py:744 #: prewikka/views/messagesummary/messagesummary.py:777 #: prewikka/views/messagesummary/messagesummary.py:796 msgid "Type" msgstr "Typ" #: prewikka/views/messagesummary/messagesummary.py:581 msgid "Seq #" msgstr "Nr sekw." #: prewikka/views/messagesummary/messagesummary.py:582 msgid "Mask" msgstr "Maska" #: prewikka/views/messagesummary/messagesummary.py:583 msgid "Gateway Address" msgstr "Adres bramy" #: prewikka/views/messagesummary/messagesummary.py:584 msgid "Num address" msgstr "Adres numeryczny" #: prewikka/views/messagesummary/messagesummary.py:585 msgid "Wpa" msgstr "WPA" #: prewikka/views/messagesummary/messagesummary.py:586 msgid "Lifetime" msgstr "Czas życia" #: prewikka/views/messagesummary/messagesummary.py:587 msgid "Otime" msgstr "Otime" #: prewikka/views/messagesummary/messagesummary.py:588 msgid "Rtime" msgstr "Rtime" #: prewikka/views/messagesummary/messagesummary.py:589 msgid "Ttime" msgstr "Ttime" #: prewikka/views/messagesummary/messagesummary.py:595 #: prewikka/views/messagesummary/messagesummary.py:1082 msgid "Payload" msgstr "Zawartość" #: prewikka/views/messagesummary/messagesummary.py:648 #, fuzzy msgid "Alert details" msgstr "Alerty" #: prewikka/views/messagesummary/messagesummary.py:653 #, python-format msgid "%d linked alerts missing (probably deleted)" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:657 #, python-format msgid "%d linked alerts omitted" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:674 #: prewikka/views/messagesummary/messagesummary.py:991 msgid "Correlation Alert" msgstr "Alert korelacji" #: prewikka/views/messagesummary/messagesummary.py:680 msgid "Correlated Alerts" msgstr "Alerty skorelowany" #: prewikka/views/messagesummary/messagesummary.py:681 #: prewikka/views/messagesummary/messagesummary.py:698 msgid "Source Analyzer" msgstr "Analizator źródłowy" #: prewikka/views/messagesummary/messagesummary.py:691 #: prewikka/views/messagesummary/messagesummary.py:994 msgid "Tool Alert" msgstr "Alert narzędzia" #: prewikka/views/messagesummary/messagesummary.py:697 msgid "Linked Alerts" msgstr "Alerty połączony" #: prewikka/views/messagesummary/messagesummary.py:708 msgid "Text" msgstr "Tekst" #: prewikka/views/messagesummary/messagesummary.py:710 msgid "Ident" msgstr "Identyfikator" #: prewikka/views/messagesummary/messagesummary.py:715 msgid "Origin" msgstr "Pochodzenie" #: prewikka/views/messagesummary/messagesummary.py:738 msgid "Severity" msgstr "Krytyczność" #: prewikka/views/messagesummary/messagesummary.py:741 msgid "Completion" msgstr "Wykonanie" #: prewikka/views/messagesummary/messagesummary.py:774 msgid "User category" msgstr "Kategoria użytkownika" #: prewikka/views/messagesummary/messagesummary.py:779 #: prewikka/views/messagesummary/messagesummary.py:798 msgid "Number" msgstr "Numer" #: prewikka/views/messagesummary/messagesummary.py:780 msgid "Tty" msgstr "TTY" #: prewikka/views/messagesummary/messagesummary.py:799 msgid "Permission" msgstr "Uprawnienia" #: prewikka/views/messagesummary/messagesummary.py:821 msgid "Change time" msgstr "Data zmiany" #: prewikka/views/messagesummary/messagesummary.py:822 msgid "Inode Number" msgstr "Numer 'inode'" #: prewikka/views/messagesummary/messagesummary.py:823 msgid "Major device" msgstr "Numer 'major' urządzenia" #: prewikka/views/messagesummary/messagesummary.py:824 msgid "Minor device" msgstr "Numer 'minor' urządzenia" #: prewikka/views/messagesummary/messagesummary.py:825 msgid "C Major device" msgstr "Urządzenie 'C major'" #: prewikka/views/messagesummary/messagesummary.py:826 msgid "C Minor device" msgstr "Urządzenie 'C minor'" #: prewikka/views/messagesummary/messagesummary.py:830 #, python-format msgid "Target file %s" msgstr "Docelowy plik %s" #: prewikka/views/messagesummary/messagesummary.py:830 msgid "category" msgstr "kategoria" #: prewikka/views/messagesummary/messagesummary.py:834 msgid "Path" msgstr "Ścieżka" #: prewikka/views/messagesummary/messagesummary.py:836 msgid "Modify time" msgstr "Data modyfikacji" #: prewikka/views/messagesummary/messagesummary.py:837 msgid "Access time" msgstr "Data dostępu" #: prewikka/views/messagesummary/messagesummary.py:838 msgid "Data size" msgstr "Rozmiar danych" #: prewikka/views/messagesummary/messagesummary.py:839 msgid "Disk size" msgstr "Rozmiar dysku" #: prewikka/views/messagesummary/messagesummary.py:858 msgid "Web Service" msgstr "Usługa web" #: prewikka/views/messagesummary/messagesummary.py:861 msgid "Url" msgstr "URL" #: prewikka/views/messagesummary/messagesummary.py:862 msgid "Cgi" msgstr "CGI" #: prewikka/views/messagesummary/messagesummary.py:863 msgid "Http Method" msgstr "Metoda HTTP" #: prewikka/views/messagesummary/messagesummary.py:866 msgid "CGI Argument" msgstr "Argument CGI" #: prewikka/views/messagesummary/messagesummary.py:875 msgid "SNMP Service" msgstr "Usługa SNMP" #: prewikka/views/messagesummary/messagesummary.py:878 msgid "oid" msgstr "OID" #: prewikka/views/messagesummary/messagesummary.py:879 msgid "messageProcessingModel" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:880 msgid "securityModel" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:881 msgid "securityName" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:882 msgid "securityLevel" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:883 msgid "contextName" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:884 msgid "contextEngineID" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:885 msgid "command" msgstr "polecenie" #: prewikka/views/messagesummary/messagesummary.py:897 #: prewikka/views/messagesummary/messagesummary.py:899 msgid "Port" msgstr "Port" #: prewikka/views/messagesummary/messagesummary.py:919 #, fuzzy msgid "PortList" msgstr "Port" #: prewikka/views/messagesummary/messagesummary.py:922 #, fuzzy msgid "ip_version" msgstr "Wersja" #: prewikka/views/messagesummary/messagesummary.py:958 #, python-format msgid "Source(%d)" msgstr "Źródło(%d)" #: prewikka/views/messagesummary/messagesummary.py:973 #, python-format msgid "Target(%d)" msgstr "Cel(%d)" #: prewikka/views/messagesummary/messagesummary.py:997 msgid "Overflow Alert" msgstr "Alert przeładowania" #: prewikka/views/messagesummary/messagesummary.py:1000 msgid "Alert" msgstr "Alert" #: prewikka/views/messagesummary/messagesummary.py:1018 msgid "MessageID" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:1065 msgid "Network centric information" msgstr "Informacje dotyczące sieci" #: prewikka/views/messagesummary/messagesummary.py:1087 msgid "ASCII Payload" msgstr "Zawartość (ASCII)" #: prewikka/views/messagesummary/messagesummary.py:1103 msgid "Heartbeat" msgstr "Tętno" #: prewikka/views/messagesummary/templates/messagesummary.mak:85 msgid "Summary" msgstr "Podsumowanie" #: prewikka/views/usermanagement/__init__.py:14 #, fuzzy msgid "User settings page" msgstr "Ustawienia" #: prewikka/views/usermanagement/usermanagement.py:18 msgid "My account" msgstr "Moje konto" #: prewikka/views/usermanagement/usermanagement.py:23 #, fuzzy msgid "Invalid User" msgstr "Nieprawidłowa sesja" #: prewikka/views/usermanagement/usermanagement.py:23 #, python-format msgid "Requested user '%s' does not exist" msgstr "" #: prewikka/views/usermanagement/usermanagement.py:43 #, fuzzy msgid "Invalid Language" msgstr "Nieprawidłowa sesja" #: prewikka/views/usermanagement/usermanagement.py:43 msgid "Specified language does not exist" msgstr "" #: prewikka/views/usermanagement/usermanagement.py:47 #, fuzzy msgid "Invalid Timezone" msgstr "Nieprawidłowa sesja" #: prewikka/views/usermanagement/usermanagement.py:47 msgid "Specified timezone does not exist" msgstr "" #: prewikka/views/usermanagement/templates/usersettings.mak:6 msgid "Login:" msgstr "Konto:" #: prewikka/views/usermanagement/templates/usersettings.mak:20 msgid "Email:" msgstr "E-mail:" #: prewikka/views/usermanagement/templates/usersettings.mak:22 msgid "Email" msgstr "E-mail" #: prewikka/views/usermanagement/templates/usersettings.mak:27 msgid "Language:" msgstr "Język:" #: prewikka/views/usermanagement/templates/usersettings.mak:39 msgid "Theme:" msgstr "Temat:" #: prewikka/views/usermanagement/templates/usersettings.mak:50 msgid "Timezone:" msgstr "Strefa czasowa:" #: scripts/prewikka-cli:59 #, fuzzy msgid "Unknown command" msgstr "polecenie" #: scripts/prewikka-cli:67 #, python-format msgid "An unexpected error occurred: %s" msgstr "" #: scripts/prewikka-cli:154 msgid "Create an object of the specified type" msgstr "" #: scripts/prewikka-cli:157 msgid "Delete an object of the specified type" msgstr "" #: scripts/prewikka-cli:160 msgid "Import objects of the specified type from files" msgstr "" #: scripts/prewikka-cli:163 msgid "List objects of the specified type" msgstr "" #: scripts/prewikka-cli:166 msgid "Synchronize objects of the specified type" msgstr "" #: scripts/prewikka-cli:169 msgid "Update objects of the specified type" msgstr "" #: scripts/prewikka-cli:207 msgid "Prewikka command-line tool" msgstr "" #: scripts/prewikka-cli:208 msgid "name of the user" msgstr "" #: scripts/prewikka-cli:209 scripts/prewikka-crontab:99 #: scripts/prewikka-httpd:93 #, python-format msgid "configuration file to use (default: %(default)s)" msgstr "" #: scripts/prewikka-cli:210 msgid "command to execute" msgstr "" #: scripts/prewikka-cli:211 msgid "enable debugging output" msgstr "" #: scripts/prewikka-cli:218 msgid "prewikka-cli must be executed as the prewikka user" msgstr "" #: scripts/prewikka-cli:243 #, python-format msgid "Prewikka command-line tool (%s)" msgstr "" #: scripts/prewikka-cli:244 msgid "Type \"help\" or \"?\" to list commands" msgstr "" #: scripts/prewikka-crontab:100 msgid "run as a system daemon" msgstr "" #: scripts/prewikka-crontab:101 scripts/prewikka-httpd:96 msgid "show this help message and exit" msgstr "" #: scripts/prewikka-crontab:102 scripts/prewikka-httpd:97 msgid "show program's version number and exit" msgstr "" #: scripts/prewikka-httpd:88 msgid "root where the server is accessible" msgstr "" #: scripts/prewikka-httpd:89 #, python-format msgid "IP to bind to (default: %(default)s)" msgstr "" #: scripts/prewikka-httpd:90 #, python-format msgid "port number to use (default: %(default)d)" msgstr "" #: scripts/prewikka-httpd:91 msgid "SSL private key to use (default: no SSL)" msgstr "" #: scripts/prewikka-httpd:92 msgid "SSL certificate to use (default: no SSL)" msgstr "" #: scripts/prewikka-httpd:95 #, python-format msgid "" "number of processes to use. Default value matches the number of available" " CPUs (i.e. %d)" msgstr "" prewikka-5.1.1/prewikka/locale/pt_BR/0000775000175000017500000000000013555143705021031 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/locale/pt_BR/LC_MESSAGES/0000775000175000017500000000000013555143705022616 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/locale/pt_BR/LC_MESSAGES/prewikka.po0000664000175000017500000016222713555143652025006 0ustar tandrejatandreja00000000000000# Brazilian Portuguese Translation for Prewikka # Copyright (C) 2007-2019 CS-SI # This file is distributed under the same license as the prewikka package. # edeunix@edeunix.com, 2007. # msgid "" msgstr "" "Project-Id-Version: Prewikka 5.1.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-09-04 19:03+0200\n" "PO-Revision-Date: 2018-02-09 12:07+0100\n" "Last-Translator: Edelberto Franco Silva \n" "Language-Team: Portuguese\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 0.9.6\n" #: prewikka/baseview.py:79 prewikka/usergroup.py:52 msgid "Permission Denied" msgstr "Permissão Negada" #: prewikka/baseview.py:79 msgid "Missing permission to access the specified file" msgstr "" #: prewikka/config.py:37 prewikka/dataprovider/__init__.py:645 msgid "Configuration error" msgstr "" #: prewikka/config.py:43 #, python-format msgid "Parse error in \"%(txt)s\" at %(file)s line %(line)d" msgstr "" #: prewikka/config.py:48 prewikka/view.py:82 #, python-format msgid "Invalid value '%(value)s' for parameter '%(name)s'" msgstr "" #: prewikka/config.py:54 #, python-format msgid "Missing value for parameter '%(name)s'" msgstr "" #: prewikka/crontab.py:37 msgid "Hourly" msgstr "Por hora" #: prewikka/crontab.py:38 msgid "Daily" msgstr "Diário" #: prewikka/crontab.py:39 msgid "Weekly" msgstr "Semanal" #: prewikka/crontab.py:40 msgid "Monthly" msgstr "Mensal" #: prewikka/crontab.py:41 msgid "Yearly" msgstr "Anual" #: prewikka/crontab.py:42 prewikka/mainmenu.py:302 #: prewikka/templates/mainmenu.mak:92 msgid "Custom" msgstr "Personalizado" #: prewikka/crontab.py:43 prewikka/views/crontab/__init__.py:84 msgid "Disabled" msgstr "Desativado" #: prewikka/crontab.py:105 msgid "Scheduled job execution failed" msgstr "" #: prewikka/crontab.py:139 #, fuzzy msgid "Invalid job extension" msgstr "Sessão inválida" #: prewikka/crontab.py:139 #, python-format msgid "Scheduled job with invalid extension type '%s'" msgstr "" #: prewikka/crontab.py:206 #, fuzzy msgid "Invalid CronJob" msgstr "Sessão inválida" #: prewikka/crontab.py:206 #, python-format msgid "CronJob with id=%d cannot be found in database" msgstr "" #: prewikka/crontab.py:260 #, fuzzy msgid "Invalid schedule" msgstr "Usuário inválido" #: prewikka/crontab.py:260 msgid "The specified job schedule is invalid" msgstr "" #: prewikka/crontab.py:286 #, python-format msgid "Custom (%s)" msgstr "Personalizado (%s)" #: prewikka/database.py:43 msgid "Database error" msgstr "" #: prewikka/database.py:50 msgid "Database schema error" msgstr "" #: prewikka/database.py:293 msgid "database installation required" msgstr "" #: prewikka/database.py:296 msgid "database activation required" msgstr "" #: prewikka/database.py:299 #, python-format msgid "database schema branch %(required)s required (found %(current)s)" msgstr "" #: prewikka/database.py:305 #, python-format msgid "database schema version %(required)s required (found %(current)s)" msgstr "" #: prewikka/database.py:372 msgid "Database installation error" msgstr "" #: prewikka/database.py:374 #, python-format msgid "" "No database installation script found for module %(module)s, version " "%(version)s" msgstr "" #: prewikka/database.py:382 prewikka/database.py:420 msgid "Database migration error" msgstr "" #: prewikka/database.py:386 #, python-format msgid "" "No database branch migration script found for module %(module)s, branch " "transition %(current)s -> %(required)s" msgstr "" #: prewikka/database.py:424 #, python-format msgid "" "No linear migration script found for module %(module)s %(version1)s -> " "%(version2)s" msgstr "" #: prewikka/database.py:841 msgid "Database configuration error" msgstr "" #: prewikka/database.py:841 msgid "Only MySQL and PostgreSQL databases are supported at the moment" msgstr "" #: prewikka/error.py:48 prewikka/templates/error.mak:139 msgid "An unexpected condition happened" msgstr "" #: prewikka/error.py:148 msgid "Not implemented" msgstr "" #: prewikka/error.py:150 msgid "Backend does not implement this operation" msgstr "" #: prewikka/history.py:32 msgid "Search history deletion" msgstr "" #: prewikka/localization.py:143 msgid "%m/%Y" msgstr "%m/%Y" #: prewikka/localization.py:144 #, python-format msgid "%m/%d/%Y" msgstr "%d/%m/%Y" #: prewikka/localization.py:145 #, python-format msgid "%m/%d/%Y %Hh" msgstr "%d/%m/%Y %H:00" #: prewikka/localization.py:146 #, python-format msgid "%m/%d/%Y %H:%M" msgstr "%d/%m/%Y %H:%M" #: prewikka/localization.py:147 #, python-format msgid "%m/%d/%Y %H:%M:%S" msgstr "%d/%m/%Y %H:%M:%S" #: prewikka/localization.py:149 msgid "%H:%M" msgstr "%H:%M" #: prewikka/localization.py:150 msgid "%H:%M:%S" msgstr "%H:%M:%S" #: prewikka/localization.py:235 prewikka/localization.py:253 #: prewikka/renderer/__init__.py:62 prewikka/views/crontab/__init__.py:95 msgid "n/a" msgstr "" #: prewikka/localization.py:246 #, python-format msgid "%(days)dd %(hours)dh %(minutes)d'" msgstr "" #: prewikka/main.py:45 msgid "Version Requirement error" msgstr "" #: prewikka/main.py:48 #, python-format msgid "Prewikka %(vPre)s requires libprelude %(vLib)s or higher" msgstr "" #: prewikka/main.py:53 #, python-format msgid "Prewikka %(vPre)s requires libpreludedb %(vLib)s or higher" msgstr "" #: prewikka/main.py:136 prewikka/main.py:149 #: prewikka/dataprovider/plugins/idmef/__init__.py:57 msgid "Initialization error" msgstr "" #: prewikka/main.py:150 #, python-format msgid "" "Cannot use %(type)s mode '%(name)s', please contact your local " "administrator." msgstr "" #: prewikka/main.py:192 #, python-format msgid "Session '%s' does not accept any authentication module" msgstr "" #: prewikka/main.py:298 #, python-format msgid "An unexpected condition happened while trying to load %s" msgstr "" #: prewikka/mainmenu.py:114 #, python-format msgid "%S.%.6f" msgstr "" #: prewikka/mainmenu.py:115 #, python-format msgid "%S.%.3f" msgstr "" #: prewikka/mainmenu.py:260 msgid "Today" msgstr "Hoje" #: prewikka/mainmenu.py:261 msgid "Yesterday" msgstr "Ontem" #: prewikka/mainmenu.py:262 msgid "This week" msgstr "Esta semana" #: prewikka/mainmenu.py:263 msgid "Last week" msgstr "Semana passada" #: prewikka/mainmenu.py:264 msgid "This month" msgstr "Este mês" #: prewikka/mainmenu.py:265 msgid "Last month" msgstr "Mês passado" #: prewikka/mainmenu.py:266 prewikka/mainmenu.py:267 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d hora" msgstr[1] "%d horas" #: prewikka/mainmenu.py:268 prewikka/mainmenu.py:269 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d dia" msgstr[1] "%d dias" #: prewikka/mainmenu.py:270 #, python-format msgid "%d week" msgid_plural "%d weeks" msgstr[0] "%d semana" msgstr[1] "%d semanas" #: prewikka/mainmenu.py:271 prewikka/mainmenu.py:272 #, python-format msgid "%d month" msgid_plural "%d months" msgstr[0] "%d mês" msgstr[1] "%d meses" #: prewikka/mainmenu.py:273 #, python-format msgid "%d year" msgid_plural "%d years" msgstr[0] "%d ano" msgstr[1] "%d anos" #: prewikka/mainmenu.py:277 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d segundo" msgstr[1] "%d segundos" #: prewikka/mainmenu.py:278 prewikka/mainmenu.py:279 prewikka/mainmenu.py:280 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d minuto" msgstr[1] "%d minutos" #: prewikka/mainmenu.py:299 prewikka/templates/mainmenu.mak:61 msgid "Inactive" msgstr "Inativo" #: prewikka/mainmenu.py:305 prewikka/templates/mainmenu.mak:89 #, fuzzy msgid "None" msgstr "Telefone:" #: prewikka/menu.py:70 prewikka/menu.py:73 prewikka/menu.py:79 #: prewikka/menu.py:83 prewikka/menu.py:91 msgid "Menu error" msgstr "" #: prewikka/menu.py:70 msgid "The provided YAML menu is invalid" msgstr "" #: prewikka/menu.py:73 msgid "Empty menu" msgstr "" #: prewikka/menu.py:79 #, python-format msgid "Menu without a name in %s" msgstr "" #: prewikka/menu.py:83 msgid "Multiple default menus" msgstr "" #: prewikka/menu.py:91 msgid "Multiple default views" msgstr "" #: prewikka/pluginmanager.py:163 #, python-format msgid "Circular dependencies detected: %s" msgstr "" #: prewikka/pluginmanager.py:171 #, python-format msgid "Missing dependency: %s" msgstr "" #: prewikka/resolve.py:170 #, python-format msgid "" "Asynchronous DNS resolution disabled: twisted.names and twisted.internet " "required: %s" msgstr "" #: prewikka/usergroup.py:44 #, python-format msgid "Access to view '%(view)s' forbidden. Required permissions: %(permissions)s" msgstr "A visualização de '%(view)s' está proibida : %(permissions)s" #: prewikka/usergroup.py:47 #, python-format msgid "Access to view '%s' forbidden" msgstr "" #: prewikka/usergroup.py:50 #, python-format msgid "Required permissions: %s" msgstr "" #: prewikka/view.py:74 prewikka/view.py:81 prewikka/view.py:88 msgid "Parameters Normalization failed" msgstr "A normalização dos parâmetros falhou" #: prewikka/view.py:75 #, python-format msgid "Parameter '%s' is not valid" msgstr "" #: prewikka/view.py:89 #, python-format msgid "Required parameter '%s' is missing" msgstr "" #: prewikka/view.py:95 msgid "Invalid method" msgstr "Método inválido" #: prewikka/view.py:102 msgid "Invalid view" msgstr "Visão inválida" #: prewikka/view.py:528 #, python-format msgid "Method '%(method)s' is not allowed for view '%(view)s'" msgstr "" #: prewikka/view.py:532 prewikka/view.py:651 #, python-format msgid "View '%s' does not exist" msgstr "" #: prewikka/auth/auth.py:30 msgid "Authentication failed" msgstr "A auntenticação falhou" #: prewikka/dataprovider/__init__.py:35 msgid "Equal" msgstr "Igual" #: prewikka/dataprovider/__init__.py:36 msgid "Equal (case-insensitive)" msgstr "Igual (case-insensitive)" #: prewikka/dataprovider/__init__.py:37 msgid "Not equal" msgstr "Não igual" #: prewikka/dataprovider/__init__.py:38 msgid "Not equal (case-insensitive)" msgstr "Não igual (case-insensitive)" #: prewikka/dataprovider/__init__.py:39 msgid "Regular expression" msgstr "Expressão regular" #: prewikka/dataprovider/__init__.py:40 msgid "Regular expression (case-insensitive)" msgstr "Expressão regular (case-insensitive)" #: prewikka/dataprovider/__init__.py:41 msgid "Not regular expression" msgstr "Não expressão regular" #: prewikka/dataprovider/__init__.py:42 msgid "Not regular expression (case-insensitive)" msgstr "Não expressão regular (case-insensitive)" #: prewikka/dataprovider/__init__.py:43 msgid "Lesser than" msgstr "Menor que" #: prewikka/dataprovider/__init__.py:44 msgid "Lesser or equal" msgstr "Menor ou igual" #: prewikka/dataprovider/__init__.py:45 msgid "Greater than" msgstr "Maior que" #: prewikka/dataprovider/__init__.py:46 msgid "Greater or equal" msgstr "Maior ou igual" #: prewikka/dataprovider/__init__.py:47 msgid "Substring" msgstr "Substring" #: prewikka/dataprovider/__init__.py:48 msgid "Substring (case-insensitive)" msgstr "Substring (case-insensitive)" #: prewikka/dataprovider/__init__.py:49 msgid "Not substring" msgstr "Não substring" #: prewikka/dataprovider/__init__.py:50 msgid "Not substring (case-insensitive)" msgstr "Não substring (case-insensitive)" #: prewikka/dataprovider/__init__.py:92 prewikka/dataprovider/__init__.py:158 msgid "Conversion error" msgstr "" #: prewikka/dataprovider/__init__.py:93 prewikka/dataprovider/__init__.py:159 #, python-format msgid "Value %(value)r cannot be converted to %(type)s" msgstr "" #: prewikka/dataprovider/__init__.py:109 msgid "Backend error" msgstr "" #: prewikka/dataprovider/__init__.py:109 #, python-format msgid "No backend available for '%s' datatype" msgstr "" #: prewikka/dataprovider/__init__.py:116 prewikka/dataprovider/__init__.py:123 msgid "Syntax error" msgstr "" #: prewikka/dataprovider/__init__.py:116 #, python-format msgid "Unknown path: %s" msgstr "" #: prewikka/dataprovider/__init__.py:123 scripts/prewikka-cli:109 #: scripts/prewikka-cli:118 scripts/prewikka-cli:129 msgid "Could not parse input" msgstr "" #: prewikka/dataprovider/__init__.py:635 #, python-format msgid "No handler configured for '%s' datatype" msgstr "" #: prewikka/dataprovider/__init__.py:646 #, python-format msgid "Only one manager should be configured for '%s' backend" msgstr "" #: prewikka/dataprovider/idmef.py:128 msgid "High" msgstr "Alta" #: prewikka/dataprovider/idmef.py:129 msgid "Medium" msgstr "Média" #: prewikka/dataprovider/idmef.py:130 msgid "Low" msgstr "Baixa" #: prewikka/dataprovider/idmef.py:131 msgid "Informational" msgstr "Informacional" #: prewikka/dataprovider/idmef.py:141 msgid "Provides an API to fetch IDMEF alerts" msgstr "" #: prewikka/dataprovider/idmef.py:142 #: prewikka/views/agents/templates/agents.mak:83 #: prewikka/views/datasearch/alert.py:75 prewikka/views/datasearch/alert.py:76 msgid "Alerts" msgstr "Alertas" #: prewikka/dataprovider/idmef.py:149 prewikka/views/datasearch/alert.py:88 #: prewikka/views/datasearch/threat.py:75 msgid "Classification" msgstr "Classificação" #: prewikka/dataprovider/idmef.py:150 msgid "Source IP" msgstr "IP fonte" #: prewikka/dataprovider/idmef.py:151 #: prewikka/views/messagesummary/messagesummary.py:548 #: prewikka/views/messagesummary/messagesummary.py:569 msgid "Source port" msgstr "Porta fonte" #: prewikka/dataprovider/idmef.py:152 msgid "Target IP" msgstr "IP alvo" #: prewikka/dataprovider/idmef.py:153 #: prewikka/views/messagesummary/messagesummary.py:549 #: prewikka/views/messagesummary/messagesummary.py:570 msgid "Target port" msgstr "Porta alvo" #: prewikka/dataprovider/idmef.py:154 #, fuzzy msgid "Analyzer name" msgstr "Tempo de análise" #: prewikka/dataprovider/idmef.py:157 #, fuzzy msgid "Alert deletion" msgstr "Lista de alertas" #: prewikka/dataprovider/idmef.py:182 msgid "Provides an API to fetch IDMEF heartbeats" msgstr "" #: prewikka/dataprovider/idmef.py:183 #: prewikka/views/agents/templates/agents.mak:87 #: prewikka/views/datasearch/heartbeat.py:56 msgid "Heartbeats" msgstr "Heartbeats" #: prewikka/dataprovider/idmef.py:188 #, fuzzy msgid "Heartbeat deletion" msgstr "Análise de Heartbeats" #: prewikka/dataprovider/parsers/lucene/__init__.py:52 msgid "Lucene emulation error" msgstr "" #: prewikka/dataprovider/parsers/lucene/__init__.py:53 msgid "" "This Lucene expression cannot be emulated properly using the Criterion " "backend" msgstr "" #: prewikka/dataprovider/plugins/idmef/__init__.py:97 msgid "Plugin for fetching IDMEF alerts from the Prelude database" msgstr "" #: prewikka/dataprovider/plugins/idmef/__init__.py:111 msgid "Plugin for fetching IDMEF heartbeats from the Prelude database" msgstr "" #: prewikka/plugins/warning/__init__.py:33 msgid "Prelude Warning message" msgstr "" #: prewikka/plugins/warning/templates/warning.mak:14 msgid "WARNING" msgstr "" #: prewikka/plugins/warning/templates/warning.mak:17 msgid "Prelude OSS is the open-source version of the Prelude SIEM" msgstr "" #: prewikka/plugins/warning/templates/warning.mak:21 #, python-format msgid "" "This OSS version has lower " "performance and less features than the Pro/Enterprise versions." msgstr "" #: prewikka/plugins/warning/templates/warning.mak:22 msgid "" "It is intended for tests and small environments, and should not be used " "in critical environments." msgstr "" #: prewikka/plugins/warning/templates/warning.mak:26 #, python-format msgid "Prelude OSS is distributed under the %s." msgstr "" #: prewikka/plugins/warning/templates/warning.mak:27 msgid "" "Products derivated from Prelude OSS modules are therefore subject to the " "terms of the GPLv2." msgstr "" #: prewikka/plugins/warning/templates/warning.mak:30 #: prewikka/templates/error.mak:171 prewikka/templates/toplayout.mak:62 #: prewikka/templates/toplayout.mak:77 prewikka/templates/toplayout.mak:94 #: prewikka/views/aboutplugin/templates/aboutplugin.mak:44 msgid "OK" msgstr "" #: prewikka/renderer/__init__.py:44 msgid "No data to display." msgstr "" #: prewikka/renderer/__init__.py:143 prewikka/renderer/__init__.py:147 #: prewikka/renderer/__init__.py:151 msgid "Renderer error" msgstr "" #: prewikka/renderer/__init__.py:144 #, python-format msgid "No backend supporting render type '%s'" msgstr "" #: prewikka/renderer/__init__.py:148 #, python-format msgid "No backend named '%s'" msgstr "" #: prewikka/renderer/__init__.py:152 #, python-format msgid "Backend '%(backend)s' does not support render type '%(type)s'" msgstr "" #: prewikka/renderer/chartjs/__init__.py:104 msgid "ChartJS renderer backend" msgstr "" #: prewikka/renderer/chartjs/bar/__init__.py:38 msgid "ChartJS Bar renderer type" msgstr "" #: prewikka/renderer/chartjs/timeline/__init__.py:85 msgid "ChartJS Timebar renderer type" msgstr "" #: prewikka/session/session.py:39 msgid "Invalid session" msgstr "Sessão inválida" #: prewikka/session/session.py:40 msgid "The session cookie carried by your browser is invalid" msgstr "" #: prewikka/session/session.py:44 msgid "Session expired" msgstr "Sessão expirada" #: prewikka/session/session.py:45 msgid "Your session has expired: please sign in again to continue using Prelude" msgstr "" #: prewikka/session/session.py:181 msgid "Logged out" msgstr "Deslogado" #: prewikka/session/anonymous/anonymous.py:31 #, fuzzy msgid "Anonymous authentication" msgstr "A auntenticação falhou" #: prewikka/templates/baseview.mak:148 msgid "View options" msgstr "" #: prewikka/templates/baseview.mak:151 msgid "View help" msgstr "" #: prewikka/templates/baseview.mak:205 msgid "This app has been disabled or failed to load." msgstr "" #: prewikka/templates/baseview.mak:211 prewikka/templates/baseview.mak:222 msgid "name" msgstr "nome" #: prewikka/templates/baseview.mak:287 msgid "About" msgstr "Sobre" #: prewikka/templates/baseview.mak:290 msgid "Are you sure you want to log out?" msgstr "" #: prewikka/templates/baseview.mak:290 msgid "Logout" msgstr "Sair" #: prewikka/templates/error.mak:66 #, fuzzy msgid "Detail" msgstr "Alertas" #: prewikka/templates/error.mak:67 msgid "Copy to clipboard" msgstr "" #: prewikka/templates/error.mak:137 prewikka/templates/error.mak:145 msgid "Error: {0}" msgstr "" #: prewikka/templates/error.mak:155 msgid "This may be due to one or more of the following reasons:" msgstr "" #: prewikka/templates/error.mak:157 msgid "You don't have the required permissions." msgstr "" #: prewikka/templates/error.mak:158 #, python-format msgid "Required apps are disabled. See the %s page for more details." msgstr "" #: prewikka/templates/error.mak:176 prewikka/templates/toplayout.mak:61 #: prewikka/views/crontab/templates/cronjob.mak:122 #: prewikka/views/filter/templates/filteredition.mak:122 msgid "Cancel" msgstr "Cancelar" #: prewikka/templates/error.mak:177 #, fuzzy msgid "Sign in" msgstr "Origem" #: prewikka/templates/error.mak:181 msgid "Back" msgstr "" #: prewikka/templates/error.mak:184 msgid "Retry" msgstr "" #: prewikka/templates/error.mak:186 msgid "Redirect to main page" msgstr "" #: prewikka/templates/mainmenu.mak:44 msgid "Refresh:" msgstr "Refrescar:" #: prewikka/templates/mainmenu.mak:49 msgid "Update frequency of the current page" msgstr "" #: prewikka/templates/mainmenu.mak:76 msgid "Period:" msgstr "Período:" #: prewikka/templates/mainmenu.mak:81 msgid "Period to visualize" msgstr "Período para visualizar" #: prewikka/templates/mainmenu.mak:111 msgid "Start:" msgstr "Início:" #: prewikka/templates/mainmenu.mak:117 msgid "start" msgstr "início" #: prewikka/templates/mainmenu.mak:117 msgid "Start date" msgstr "Data de início" #: prewikka/templates/mainmenu.mak:123 msgid "End:" msgstr "Fim:" #: prewikka/templates/mainmenu.mak:130 msgid "end" msgstr "fim" #: prewikka/templates/mainmenu.mak:130 msgid "End date" msgstr "Data final" #: prewikka/templates/toplayout.mak:57 msgid "Please Confirm" msgstr "" #: prewikka/templates/toplayout.mak:73 msgid "Prelude Dialog" msgstr "" #: prewikka/templates/toplayout.mak:88 msgid "Connection error" msgstr "" #: prewikka/templates/toplayout.mak:91 msgid "" "Connection failed, the server may be down or you may be experiencing " "network issues." msgstr "" #: prewikka/utils/misc.py:72 prewikka/views/agents/agents.py:45 msgid "Offline" msgstr "Desligado" #: prewikka/utils/misc.py:75 prewikka/views/agents/agents.py:210 msgid "Unknown" msgstr "Desconhecido" #: prewikka/utils/misc.py:78 msgid "Missing" msgstr "Perdido" #: prewikka/utils/misc.py:80 prewikka/views/agents/agents.py:44 msgid "Online" msgstr "Conectado" #: prewikka/views/about/__init__.py:13 msgid "Prelude About page" msgstr "" #: prewikka/views/about/templates/about.mak:11 #, python-format msgid "Prelude version %s" msgstr "" #: prewikka/views/about/templates/about.mak:15 msgid "Prelude is a SIEM (Security Information and Event Management)" msgstr "" #: prewikka/views/about/templates/about.mak:21 msgid "" "{prelude} is a security management solution that collects, filters, " "normalizes, correlates, stores and archives data from various sources of " "your information system. Based on all this information Prelude can " "provide a global vision of your system's security level and thus prevent " "attacks, intrusions as well as viral infections." msgstr "" #: prewikka/views/about/templates/about.mak:24 msgid "Prelude Team:" msgstr "" #: prewikka/views/about/templates/about.mak:25 msgid "" "Prelude OSS is an open-source project originally created by Yoann " "Vandoorselaere in 1998." msgstr "" #: prewikka/views/about/templates/about.mak:27 msgid "Vigilo is a NMS (Network Management System)" msgstr "" #: prewikka/views/about/templates/about.mak:33 msgid "" "{vigilo} is a complete monitoring and performance management solution " "capable of handling medium and large-scale systems (network - servers - " "applications) due to its distributed and modular architecture. Vigilo " "offers all the features required for performance supervision: states and " "alarms management, metrology, cartography, event correlation and " "reporting." msgstr "" #: prewikka/views/about/templates/about.mak:39 #, python-format msgid "" "Prelude SIEM and Vigilo NMS are being developed by the %s company, " "designer, integrator and operator of mission critical systems." msgstr "" #: prewikka/views/about/templates/about.mak:44 msgid "Contact" msgstr "Contato" #: prewikka/views/about/templates/about.mak:46 msgid "Phone:" msgstr "Telefone:" #: prewikka/views/about/templates/about.mak:47 msgid "Fax:" msgstr "Fax:" #: prewikka/views/about/templates/about.mak:50 msgid "Office" msgstr "Serviço" #: prewikka/views/about/templates/about.mak:56 msgid "Websites" msgstr "Sites" #: prewikka/views/about/templates/about.mak:67 #: prewikka/views/aboutplugin/templates/aboutplugin.mak:132 #: prewikka/views/agents/templates/heartbeatanalyze.mak:71 #: prewikka/views/messagesummary/templates/messagesummary.mak:93 msgid "Close" msgstr "Fechar" #: prewikka/views/aboutplugin/__init__.py:36 msgid "Plugin installation and activation management page" msgstr "" #: prewikka/views/aboutplugin/__init__.py:40 #: prewikka/views/crontab/__init__.py:37 msgid "USER_MANAGEMENT" msgstr "" #: prewikka/views/aboutplugin/__init__.py:42 msgid "Apps: View" msgstr "" #: prewikka/views/aboutplugin/__init__.py:43 msgid "Apps: API" msgstr "" #: prewikka/views/aboutplugin/__init__.py:44 msgid "Apps: Dataprovider backend" msgstr "" #: prewikka/views/aboutplugin/__init__.py:45 msgid "Apps: Dataprovider type" msgstr "" #: prewikka/views/aboutplugin/__init__.py:46 #, fuzzy msgid "Apps: Authentication" msgstr "A auntenticação falhou" #: prewikka/views/aboutplugin/__init__.py:47 msgid "Apps: Identification" msgstr "" #: prewikka/views/aboutplugin/__init__.py:48 msgid "Apps: Renderer backend" msgstr "" #: prewikka/views/aboutplugin/__init__.py:49 msgid "Apps: Renderer type" msgstr "" #: prewikka/views/aboutplugin/__init__.py:82 msgid "list plugin: list installed plugins" msgstr "" #: prewikka/views/aboutplugin/__init__.py:91 msgid "Apps" msgstr "Apps" #: prewikka/views/aboutplugin/__init__.py:120 msgid "sync plugin: initialize the plugin database schemas" msgstr "" #: prewikka/views/aboutplugin/__init__.py:134 #, python-format msgid "Applying %(module)s %(script)s..." msgstr "" #: prewikka/views/aboutplugin/__init__.py:144 msgid "All updates applied" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:44 #, fuzzy msgid "ERROR" msgstr "Operador" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:48 #, fuzzy msgid "Update failed" msgstr "falhou" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:111 #, fuzzy msgid "Update Dialog" msgstr "falhou" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:121 msgid "Plugin" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:122 #, fuzzy msgid "Script" msgstr "Descrição" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:123 msgid "Result" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:144 msgid "Plugin Maintenance" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:147 msgid "" "The following apps need to be updated before they can be loaded into the " "system" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:154 #: prewikka/views/aboutplugin/templates/aboutplugin.mak:190 #: prewikka/views/agents/templates/agents.mak:29 #: prewikka/views/agents/templates/heartbeatanalyze.mak:19 #: prewikka/views/crontab/templates/cronjob.mak:114 #: prewikka/views/crontab/templates/crontab.mak:17 #: prewikka/views/filter/templates/filterlisting.mak:23 #: prewikka/views/messagesummary/messagesummary.py:288 #: prewikka/views/messagesummary/messagesummary.py:425 #: prewikka/views/messagesummary/messagesummary.py:676 #: prewikka/views/messagesummary/messagesummary.py:693 #: prewikka/views/messagesummary/messagesummary.py:716 #: prewikka/views/messagesummary/messagesummary.py:778 #: prewikka/views/messagesummary/messagesummary.py:797 #: prewikka/views/messagesummary/messagesummary.py:833 #: prewikka/views/usermanagement/templates/usersettings.mak:15 msgid "Name" msgstr "Nome" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:155 #: prewikka/views/aboutplugin/templates/aboutplugin.mak:191 #: prewikka/views/filter/templates/filterlisting.mak:28 #: prewikka/views/idmefnav/templates/idmefnav.mak:56 #: prewikka/views/messagesummary/messagesummary.py:745 #: prewikka/views/messagesummary/messagesummary.py:751 msgid "Description" msgstr "Descrição" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:156 #: prewikka/views/aboutplugin/templates/aboutplugin.mak:192 #: prewikka/views/agents/templates/agents.mak:33 #: prewikka/views/messagesummary/messagesummary.py:427 #: prewikka/views/messagesummary/messagesummary.py:530 msgid "Version" msgstr "Versão" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:157 #, fuzzy msgid "Current database version" msgstr "Versão do banco de dados" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:158 msgid "Required database update" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:174 msgid "Install update" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:182 msgid "Installed Apps" msgstr "Apps instaladas" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:193 msgid "Database version" msgstr "Versão do banco de dados" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:194 msgid "Active" msgstr "Ativo" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:215 msgid "Update the selected apps?" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:215 msgid "Update" msgstr "Atualizar" #: prewikka/views/agents/__init__.py:12 #, fuzzy msgid "Agents status information page" msgstr "Endereço da informação" #: prewikka/views/agents/agents.py:64 prewikka/views/agents/agents.py:133 msgid "Agents" msgstr "Agentes" #: prewikka/views/agents/agents.py:110 msgid "Node name n/a" msgstr "Nome do nó n/a" #: prewikka/views/agents/agents.py:111 #, fuzzy msgid "OS version n/a" msgstr "Sessão inválida" #: prewikka/views/agents/agents.py:112 msgid "OS type n/a" msgstr "Sistema Operacional n/a" #: prewikka/views/agents/agents.py:117 msgid "Node location n/a" msgstr "Localização do nó n/a" #: prewikka/views/agents/agents.py:127 msgid "Alert listing" msgstr "Lista de alertas" #: prewikka/views/agents/agents.py:128 #, fuzzy msgid "Heartbeat listing" msgstr "Análise de Heartbeats" #: prewikka/views/agents/agents.py:129 #: prewikka/views/agents/templates/heartbeatanalyze.mak:12 msgid "Heartbeat analysis" msgstr "Análise de Heartbeats" #: prewikka/views/agents/agents.py:133 prewikka/views/agents/agents.py:157 #: prewikka/views/datasearch/idmef.py:158 #: prewikka/views/messagesummary/messagesummary.py:332 msgid "IDMEF_VIEW" msgstr "" #: prewikka/views/agents/agents.py:133 #: prewikka/views/datasearch/heartbeat.py:55 msgid "Monitoring" msgstr "Monitoramento" #: prewikka/views/agents/agents.py:142 msgid "IDMEF_ALTER" msgstr "" #: prewikka/views/agents/agents.py:184 msgid "Normal sensor start" msgstr "" #: prewikka/views/agents/agents.py:186 msgid "Unexpected sensor restart" msgstr "" #: prewikka/views/agents/agents.py:192 #, python-format msgid "Unexpected heartbeat interval: %(delta)s" msgstr "" #: prewikka/views/agents/agents.py:195 msgid "Normal sensor stop" msgstr "" #: prewikka/views/agents/agents.py:207 #, python-format msgid "Sensor is down since %s" msgstr "" #: prewikka/views/agents/agents.py:216 #, python-format msgid "" "No anomaly in the last %(count)d heartbeats (one heartbeat every " "%(delta)s average)" msgstr "" #: prewikka/views/agents/templates/agents.mak:24 msgid "Show/Hide all" msgstr "" #: prewikka/views/agents/templates/agents.mak:24 #, fuzzy msgid "Search:" msgstr "Status" #: prewikka/views/agents/templates/agents.mak:30 msgid "Location" msgstr "Localização" #: prewikka/views/agents/templates/agents.mak:31 msgid "Node" msgstr "Nó" #: prewikka/views/agents/templates/agents.mak:32 #: prewikka/views/agents/templates/heartbeatanalyze.mak:20 #: prewikka/views/datasearch/heartbeat.py:67 #: prewikka/views/messagesummary/messagesummary.py:424 msgid "Model" msgstr "Modelo" #: prewikka/views/agents/templates/agents.mak:34 #: prewikka/views/messagesummary/messagesummary.py:428 msgid "Class" msgstr "Classe" #: prewikka/views/agents/templates/agents.mak:38 #: prewikka/views/agents/templates/heartbeatanalyze.mak:25 #, fuzzy msgid "Latest heartbeat" msgstr "Heartbeats" #: prewikka/views/agents/templates/agents.mak:39 msgid "Status" msgstr "Status" #: prewikka/views/agents/templates/agents.mak:83 msgid "Delete the alerts of the selected agent(s)" msgstr "" #: prewikka/views/agents/templates/agents.mak:87 msgid "Delete the heartbeats of the selected agent(s)" msgstr "" #: prewikka/views/agents/templates/agents.mak:89 msgid "Delete the selected IDMEF messages?" msgstr "" #: prewikka/views/agents/templates/agents.mak:89 #: prewikka/views/datasearch/idmef.py:195 #: prewikka/views/filter/templates/filterlisting.mak:42 msgid "Delete" msgstr "Apagar" #: prewikka/views/agents/templates/heartbeatanalyze.mak:21 #, fuzzy msgid "OS" msgstr "TOS" #: prewikka/views/agents/templates/heartbeatanalyze.mak:22 #: prewikka/views/datasearch/heartbeat.py:66 #: prewikka/views/messagesummary/messagesummary.py:412 msgid "Node name" msgstr "Nome do nó" #: prewikka/views/agents/templates/heartbeatanalyze.mak:23 #: prewikka/views/messagesummary/messagesummary.py:395 msgid "Node location" msgstr "Localização do nó" #: prewikka/views/agents/templates/heartbeatanalyze.mak:24 #: prewikka/views/datasearch/heartbeat.py:65 #: prewikka/views/messagesummary/messagesummary.py:418 msgid "Node address" msgstr "Endereço do nó" #: prewikka/views/agents/templates/heartbeatanalyze.mak:26 msgid "Current status" msgstr "Situação atual" #: prewikka/views/agents/templates/heartbeatanalyze.mak:56 msgid "Events" msgstr "Eventos" #: prewikka/views/crontab/__init__.py:30 msgid "Scheduling management" msgstr "" #: prewikka/views/crontab/__init__.py:35 #, fuzzy msgid "Scheduled jobs management page" msgstr "Filtro no agente" #: prewikka/views/crontab/__init__.py:62 msgid "Configuration" msgstr "Configuração" #: prewikka/views/crontab/__init__.py:62 msgid "Scheduling" msgstr "" #: prewikka/views/crontab/__init__.py:75 prewikka/views/crontab/__init__.py:104 msgid "SYSTEM" msgstr "" #: prewikka/views/crontab/__init__.py:88 msgid "Pending" msgstr "Pendente" #: prewikka/views/crontab/__init__.py:98 msgid "Error" msgstr "Erro" #: prewikka/views/crontab/templates/cronjob.mak:54 msgid "Schedule:" msgstr "" #: prewikka/views/crontab/templates/cronjob.mak:69 msgid "custom" msgstr "personalizado" #: prewikka/views/crontab/templates/cronjob.mak:70 msgid "disabled" msgstr "desativado" #: prewikka/views/crontab/templates/cronjob.mak:79 msgid "Minute:" msgstr "Minuto:" #: prewikka/views/crontab/templates/cronjob.mak:83 msgid "Hour:" msgstr "Hora:" #: prewikka/views/crontab/templates/cronjob.mak:87 msgid "Day:" msgstr "Dia:" #: prewikka/views/crontab/templates/cronjob.mak:91 msgid "Month:" msgstr "Mês:" #: prewikka/views/crontab/templates/cronjob.mak:95 msgid "Weekday:" msgstr "Dia da semana:" #: prewikka/views/crontab/templates/cronjob.mak:107 msgid "Edit Job" msgstr "" #: prewikka/views/crontab/templates/cronjob.mak:112 #: prewikka/views/filter/templates/filteredition.mak:73 #: prewikka/views/usermanagement/templates/usersettings.mak:13 msgid "Name:" msgstr "Nome:" #: prewikka/views/crontab/templates/cronjob.mak:123 #: prewikka/views/filter/templates/filteredition.mak:123 #: prewikka/views/usermanagement/templates/usersettings.mak:61 msgid "Save" msgstr "Salvar" #: prewikka/views/crontab/templates/crontab.mak:15 msgid "Scheduled Jobs" msgstr "" #: prewikka/views/crontab/templates/crontab.mak:18 msgid "Schedule" msgstr "" #: prewikka/views/crontab/templates/crontab.mak:19 msgid "User" msgstr "Usuário" #: prewikka/views/crontab/templates/crontab.mak:20 msgid "Last execution" msgstr "" #: prewikka/views/crontab/templates/crontab.mak:21 msgid "Next execution" msgstr "" #: prewikka/views/crontab/templates/crontab.mak:69 msgid "Disable" msgstr "" #: prewikka/views/crontab/templates/crontab.mak:70 #, fuzzy msgid "Enable" msgstr "Nome" #: prewikka/views/datasearch/alert.py:71 #, fuzzy msgid "Alert listing page" msgstr "Lista de alertas" #: prewikka/views/datasearch/alert.py:76 #, fuzzy msgid "Aggregated alerts" msgstr "AlertasDeCorrelação" #: prewikka/views/datasearch/alert.py:87 #: prewikka/views/datasearch/heartbeat.py:63 #: prewikka/views/datasearch/threat.py:74 msgid "Date" msgstr "Data" #: prewikka/views/datasearch/alert.py:89 prewikka/views/datasearch/threat.py:76 msgid "Source" msgstr "Fonte" #: prewikka/views/datasearch/alert.py:90 prewikka/views/datasearch/threat.py:77 msgid "Target" msgstr "Alvo" #: prewikka/views/datasearch/alert.py:91 msgid "Analyzer" msgstr "Analisador" #: prewikka/views/datasearch/alert.py:94 msgid "Delete the selected alerts?" msgstr "" #: prewikka/views/datasearch/alert.py:148 #: prewikka/views/idmefnav/__init__.py:44 msgid "IDMEF" msgstr "IDMEF" #: prewikka/views/datasearch/datasearch.py:48 msgid "minute" msgstr "minuto" #: prewikka/views/datasearch/datasearch.py:48 msgid "hour" msgstr "hora" #: prewikka/views/datasearch/datasearch.py:48 msgid "day" msgstr "dia" #: prewikka/views/datasearch/datasearch.py:48 msgid "month" msgstr "mês" #: prewikka/views/datasearch/datasearch.py:48 msgid "year" msgstr "ano" #: prewikka/views/datasearch/datasearch.py:161 msgid "Time group error" msgstr "" #: prewikka/views/datasearch/datasearch.py:161 msgid "Only one time unit can be specified in a groupby query" msgstr "" #: prewikka/views/datasearch/datasearch.py:446 msgid "Forensic" msgstr "" #: prewikka/views/datasearch/datasearch.py:446 msgid "Dashboard" msgstr "Painel de controle" #: prewikka/views/datasearch/datasearch.py:490 msgid "CSV export" msgstr "" #: prewikka/views/datasearch/datasearch.py:622 msgid "General" msgstr "" #: prewikka/views/datasearch/heartbeat.py:51 #, fuzzy msgid "Heartbeat listing page" msgstr "Análise de Heartbeats" #: prewikka/views/datasearch/heartbeat.py:56 #, fuzzy msgid "Aggregated heartbeats" msgstr "Heartbeats" #: prewikka/views/datasearch/heartbeat.py:64 msgid "Agent" msgstr "Agente" #: prewikka/views/datasearch/heartbeat.py:69 msgid "Delete the selected heartbeats?" msgstr "" #: prewikka/views/datasearch/idmef.py:46 #, fuzzy msgid "See IDMEF details" msgstr "Alertas" #: prewikka/views/datasearch/threat.py:66 #, fuzzy msgid "Threat listing page" msgstr "Análise de Heartbeats" #: prewikka/views/datasearch/threat.py:69 #: prewikka/views/datasearch/threat.py:70 msgid "Threats" msgstr "Ameaças" #: prewikka/views/datasearch/threat.py:70 #, fuzzy msgid "Aggregated threats" msgstr "Heartbeats" #: prewikka/views/datasearch/threat.py:78 msgid "Program" msgstr "Programa" #: prewikka/views/datasearch/templates/details.mak:26 #, python-format msgid "Group by %s" msgstr "Agrupar por %s" #: prewikka/views/datasearch/templates/details.mak:30 #: prewikka/views/datasearch/templates/forensic.mak:219 msgid "Add to search" msgstr "" #: prewikka/views/datasearch/templates/details.mak:31 #: prewikka/views/datasearch/templates/forensic.mak:220 msgid "Exclude from search" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:9 msgid "Fields" msgstr "Campos" #: prewikka/views/datasearch/templates/forensic.mak:10 msgid "Query history" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:63 #, fuzzy msgid "Chart type" msgstr "Data de início" #: prewikka/views/datasearch/templates/forensic.mak:73 msgid "Limit" msgstr "Limite" #: prewikka/views/datasearch/templates/forensic.mak:89 msgid "Expert mode" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:96 msgid "Condensed mode" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:108 msgid "Search mode" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:112 #: prewikka/views/datasearch/templates/forensic.mak:217 #, fuzzy msgid "Search" msgstr "Status" #: prewikka/views/datasearch/templates/forensic.mak:114 msgid "Reset search" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:124 #: prewikka/views/datasearch/templates/forensic.mak:222 msgid "Group by" msgstr "Agrupar por" #: prewikka/views/datasearch/templates/forensic.mak:125 msgid "Select your field" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:126 #, fuzzy msgid "Time values" msgstr "valor" #: prewikka/views/datasearch/templates/forensic.mak:131 #, python-format msgid "%s fields" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:167 #, fuzzy msgid "Timeline" msgstr "Tempo" #: prewikka/views/datasearch/templates/forensic.mak:221 msgid "New search" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:231 #: prewikka/views/messagesummary/messagesummary.py:1026 msgid "Actions" msgstr "Ações" #: prewikka/views/datasearch/templates/forensic.mak:244 msgid "Informations" msgstr "Informações" #: prewikka/views/datasearch/templates/infos.mak:3 msgid "Field" msgstr "Campo" #: prewikka/views/datasearch/templates/infos.mak:9 #, fuzzy msgid "Occurrence" msgstr "Fonte" #: prewikka/views/datasearch/templates/table.mak:12 #, fuzzy msgid "Count" msgstr "Minha conta" #: prewikka/views/filter/__init__.py:11 #, fuzzy msgid "Filters management page" msgstr "Filtro no agente" #: prewikka/views/filter/filter.py:113 #: prewikka/views/usermanagement/usermanagement.py:18 msgid "Preferences" msgstr "Preferências" #: prewikka/views/filter/filter.py:113 #: prewikka/views/filter/templates/filterlisting.mak:17 msgid "Filters" msgstr "Filtros" #: prewikka/views/filter/filter.py:124 #: prewikka/views/filter/templates/filteredition.mak:66 #, python-format msgid "Filter %s" msgstr "Filtro %s" #: prewikka/views/filter/filter.py:199 #, fuzzy msgid "Filter error" msgstr "filtrado" #: prewikka/views/filter/filter.py:199 #, python-format msgid "Filter '%s' does not exist" msgstr "" #: prewikka/views/filter/filter.py:236 prewikka/views/filter/filter.py:248 msgid "Could not save filter" msgstr "" #: prewikka/views/filter/filter.py:236 msgid "No name for this filter was provided" msgstr "" #: prewikka/views/filter/filter.py:248 msgid "The filter name is already used by another filter" msgstr "" #: prewikka/views/filter/templates/filteredition.mak:66 #: prewikka/views/filter/templates/filterlisting.mak:17 #: prewikka/views/filter/templates/menu.mak:48 msgid "New filter" msgstr "Novo filtro" #: prewikka/views/filter/templates/filteredition.mak:75 msgid "Filter name" msgstr "Nome de filtro" #: prewikka/views/filter/templates/filteredition.mak:80 msgid "Category:" msgstr "Categoria:" #: prewikka/views/filter/templates/filteredition.mak:92 msgid "Description:" msgstr "Descrição:" #: prewikka/views/filter/templates/filterlisting.mak:24 #: prewikka/views/messagesummary/messagesummary.py:750 msgid "Category" msgstr "Categoria" #: prewikka/views/filter/templates/filterlisting.mak:40 msgid "Create" msgstr "Criar" #: prewikka/views/filter/templates/filterlisting.mak:41 msgid "Duplicate" msgstr "Duplicar" #: prewikka/views/filter/templates/filterlisting.mak:42 msgid "Delete the selected filters?" msgstr "" #: prewikka/views/filter/templates/menu.mak:4 msgid "Filter:" msgstr "Filtro:" #: prewikka/views/filter/templates/menu.mak:38 msgid "Available filters" msgstr "Filtros disponíveis" #: prewikka/views/filter/templates/menu.mak:46 msgid "No filter" msgstr "Sem filtro" #: prewikka/views/filter/templates/menu.mak:51 msgid "No category" msgstr "Sem categoria" #: prewikka/views/filter/templates/widget.mak:7 msgid "Select a path..." msgstr "" #: prewikka/views/filter/templates/widget.mak:9 msgid "Default paths" msgstr "" #: prewikka/views/filter/templates/widget.mak:15 msgid "All paths" msgstr "" #: prewikka/views/filter/templates/widget.mak:25 #: prewikka/views/filter/templates/widget.mak:46 msgid "Change operator" msgstr "" #: prewikka/views/filter/templates/widget.mak:32 msgid "value" msgstr "valor" #: prewikka/views/filter/templates/widget.mak:34 msgid "Delete condition" msgstr "" #: prewikka/views/filter/templates/widget.mak:42 msgid "AND" msgstr "E" #: prewikka/views/filter/templates/widget.mak:42 msgid "OR" msgstr "OU" #: prewikka/views/filter/templates/widget.mak:56 msgid "Add condition" msgstr "" #: prewikka/views/filter/templates/widget.mak:57 msgid "Add group" msgstr "" #: prewikka/views/filter/templates/widget.mak:59 msgid "Delete group" msgstr "" #: prewikka/views/idmefnav/__init__.py:36 msgid "IDMEF navigator" msgstr "" #: prewikka/views/idmefnav/__init__.py:44 msgid "Help" msgstr "Ajuda" #: prewikka/views/idmefnav/templates/idmefnav.mak:12 msgid "Children" msgstr "" #: prewikka/views/idmefnav/templates/idmefnav.mak:20 #, fuzzy msgid "Aggregates" msgstr "AlertasDeCorrelação" #: prewikka/views/idmefnav/templates/idmefnav.mak:36 msgid "Attributes" msgstr "" #: prewikka/views/idmefnav/templates/idmefnav.mak:54 msgid "Rank" msgstr "" #: prewikka/views/idmefnav/templates/idmefnav.mak:55 msgid "Keyword" msgstr "" #: prewikka/views/messagesummary/__init__.py:13 msgid "Detailed alert and heartbeat page" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:289 #: prewikka/views/messagesummary/messagesummary.py:578 msgid "Code" msgstr "Código" #: prewikka/views/messagesummary/messagesummary.py:290 msgid "Data length" msgstr "Tamanho dos dados" #: prewikka/views/messagesummary/messagesummary.py:291 msgid "Data" msgstr "Dados" #: prewikka/views/messagesummary/messagesummary.py:365 #, python-format msgid "(agent local time: %s)" msgstr "(hora do sensor: %s)" #: prewikka/views/messagesummary/messagesummary.py:372 #: prewikka/views/messagesummary/messagesummary.py:835 msgid "Create time" msgstr "Tempo de criação" #: prewikka/views/messagesummary/messagesummary.py:375 msgid "Detect time" msgstr "Tempo de descobrimento" #: prewikka/views/messagesummary/messagesummary.py:380 msgid "Analyzer time" msgstr "Tempo de análise" #: prewikka/views/messagesummary/messagesummary.py:386 msgid "Process" msgstr "Processo" #: prewikka/views/messagesummary/messagesummary.py:387 msgid "Process Path" msgstr "Caminho do processo" #: prewikka/views/messagesummary/messagesummary.py:388 msgid "Process PID" msgstr "PID do processo" #: prewikka/views/messagesummary/messagesummary.py:415 msgid "Node name (resolved)" msgstr "Nome do nó (resolvido)" #: prewikka/views/messagesummary/messagesummary.py:426 msgid "Analyzerid" msgstr "Analisador id" #: prewikka/views/messagesummary/messagesummary.py:430 msgid "Manufacturer" msgstr "Fabricante" #: prewikka/views/messagesummary/messagesummary.py:438 msgid "Operating System" msgstr "Sistema Operacional" #: prewikka/views/messagesummary/messagesummary.py:456 #, python-format msgid "Analyzer Path (%d not shown)" msgstr "Caminho do analisador (%d não mostrado)" #: prewikka/views/messagesummary/messagesummary.py:463 #: prewikka/views/messagesummary/messagesummary.py:1035 #: prewikka/views/messagesummary/messagesummary.py:1106 #, python-format msgid "Analyzer #%d" msgstr "Analisador #%d" #: prewikka/views/messagesummary/messagesummary.py:473 msgid "Additional data" msgstr "Dados adicionais" #: prewikka/views/messagesummary/messagesummary.py:476 #: prewikka/views/messagesummary/messagesummary.py:717 msgid "Meaning" msgstr "Querendo dizer" #: prewikka/views/messagesummary/messagesummary.py:477 msgid "Value" msgstr "Valor" #: prewikka/views/messagesummary/messagesummary.py:531 #: prewikka/views/messagesummary/messagesummary.py:552 msgid "Header length" msgstr "Compimento do cabeçalho" #: prewikka/views/messagesummary/messagesummary.py:532 msgid "TOS" msgstr "TOS" #: prewikka/views/messagesummary/messagesummary.py:533 #: prewikka/views/messagesummary/messagesummary.py:571 msgid "Length" msgstr "Comprimento" #: prewikka/views/messagesummary/messagesummary.py:534 #: prewikka/views/messagesummary/messagesummary.py:580 msgid "Id" msgstr "Id" #: prewikka/views/messagesummary/messagesummary.py:538 msgid "Ip offset" msgstr "Ip offset" #: prewikka/views/messagesummary/messagesummary.py:539 msgid "TTL" msgstr "TTL" #: prewikka/views/messagesummary/messagesummary.py:540 #: prewikka/views/messagesummary/messagesummary.py:926 #: prewikka/views/messagesummary/messagesummary.py:929 #: prewikka/views/messagesummary/messagesummary.py:932 msgid "Protocol" msgstr "Protocolo" #: prewikka/views/messagesummary/messagesummary.py:541 #: prewikka/views/messagesummary/messagesummary.py:563 #: prewikka/views/messagesummary/messagesummary.py:572 #: prewikka/views/messagesummary/messagesummary.py:579 msgid "Checksum" msgstr "Checksum" #: prewikka/views/messagesummary/messagesummary.py:542 msgid "Source address" msgstr "Endereço fonte" #: prewikka/views/messagesummary/messagesummary.py:543 msgid "Target address" msgstr "Endereço alvo" #: prewikka/views/messagesummary/messagesummary.py:553 msgid "Reserved" msgstr "Reservado" #: prewikka/views/messagesummary/messagesummary.py:562 msgid "Window" msgstr "Janela" #: prewikka/views/messagesummary/messagesummary.py:564 msgid "URP" msgstr "URP" #: prewikka/views/messagesummary/messagesummary.py:577 #: prewikka/views/messagesummary/messagesummary.py:744 #: prewikka/views/messagesummary/messagesummary.py:777 #: prewikka/views/messagesummary/messagesummary.py:796 msgid "Type" msgstr "Tipo" #: prewikka/views/messagesummary/messagesummary.py:581 msgid "Seq #" msgstr "Seq #" #: prewikka/views/messagesummary/messagesummary.py:582 msgid "Mask" msgstr "Máscara" #: prewikka/views/messagesummary/messagesummary.py:583 #, fuzzy msgid "Gateway Address" msgstr "Endereço do nó" #: prewikka/views/messagesummary/messagesummary.py:584 #, fuzzy msgid "Num address" msgstr "Endereço do nó" #: prewikka/views/messagesummary/messagesummary.py:585 msgid "Wpa" msgstr "Wpa" #: prewikka/views/messagesummary/messagesummary.py:586 msgid "Lifetime" msgstr "Tempo de vida" #: prewikka/views/messagesummary/messagesummary.py:587 #, fuzzy msgid "Otime" msgstr "Tempo" #: prewikka/views/messagesummary/messagesummary.py:588 #, fuzzy msgid "Rtime" msgstr "Tempo" #: prewikka/views/messagesummary/messagesummary.py:589 #, fuzzy msgid "Ttime" msgstr "Tempo" #: prewikka/views/messagesummary/messagesummary.py:595 #: prewikka/views/messagesummary/messagesummary.py:1082 msgid "Payload" msgstr "Carga exigida" #: prewikka/views/messagesummary/messagesummary.py:648 #, fuzzy msgid "Alert details" msgstr "Alertas" #: prewikka/views/messagesummary/messagesummary.py:653 #, python-format msgid "%d linked alerts missing (probably deleted)" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:657 #, python-format msgid "%d linked alerts omitted" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:674 #: prewikka/views/messagesummary/messagesummary.py:991 msgid "Correlation Alert" msgstr "Alerta de Correlação" #: prewikka/views/messagesummary/messagesummary.py:680 #, fuzzy msgid "Correlated Alerts" msgstr "AlertasDeCorrelação" #: prewikka/views/messagesummary/messagesummary.py:681 #: prewikka/views/messagesummary/messagesummary.py:698 msgid "Source Analyzer" msgstr "Analisador da fonte" #: prewikka/views/messagesummary/messagesummary.py:691 #: prewikka/views/messagesummary/messagesummary.py:994 msgid "Tool Alert" msgstr "Alerta das Ferramentas" #: prewikka/views/messagesummary/messagesummary.py:697 msgid "Linked Alerts" msgstr "Alertas ligados" #: prewikka/views/messagesummary/messagesummary.py:708 msgid "Text" msgstr "Texto" #: prewikka/views/messagesummary/messagesummary.py:710 #, fuzzy msgid "Ident" msgstr "Agente" #: prewikka/views/messagesummary/messagesummary.py:715 msgid "Origin" msgstr "Origem" #: prewikka/views/messagesummary/messagesummary.py:738 msgid "Severity" msgstr "Severidade" #: prewikka/views/messagesummary/messagesummary.py:741 msgid "Completion" msgstr "Conclusão" #: prewikka/views/messagesummary/messagesummary.py:774 msgid "User category" msgstr "Categoria do usuário" #: prewikka/views/messagesummary/messagesummary.py:779 #: prewikka/views/messagesummary/messagesummary.py:798 msgid "Number" msgstr "Número" #: prewikka/views/messagesummary/messagesummary.py:780 msgid "Tty" msgstr "Tty" #: prewikka/views/messagesummary/messagesummary.py:799 msgid "Permission" msgstr "Permissão" #: prewikka/views/messagesummary/messagesummary.py:821 msgid "Change time" msgstr "Mudar o tempo" #: prewikka/views/messagesummary/messagesummary.py:822 #, fuzzy msgid "Inode Number" msgstr "Nome do nó" #: prewikka/views/messagesummary/messagesummary.py:823 msgid "Major device" msgstr "Dispositivo importante" #: prewikka/views/messagesummary/messagesummary.py:824 msgid "Minor device" msgstr "Dispositivo secundário" #: prewikka/views/messagesummary/messagesummary.py:825 msgid "C Major device" msgstr "C Dispositivo importante" #: prewikka/views/messagesummary/messagesummary.py:826 msgid "C Minor device" msgstr "C Dispositivo secundário" #: prewikka/views/messagesummary/messagesummary.py:830 #, fuzzy, python-format msgid "Target file %s" msgstr "Alvo" #: prewikka/views/messagesummary/messagesummary.py:830 msgid "category" msgstr "categoria" #: prewikka/views/messagesummary/messagesummary.py:834 msgid "Path" msgstr "Caminho" #: prewikka/views/messagesummary/messagesummary.py:836 msgid "Modify time" msgstr "Tempo modificado" #: prewikka/views/messagesummary/messagesummary.py:837 msgid "Access time" msgstr "Tempo de acesso" #: prewikka/views/messagesummary/messagesummary.py:838 msgid "Data size" msgstr "Tamanho dos dados" #: prewikka/views/messagesummary/messagesummary.py:839 msgid "Disk size" msgstr "Tamanho do disco" #: prewikka/views/messagesummary/messagesummary.py:858 msgid "Web Service" msgstr "Serviço da WEB" #: prewikka/views/messagesummary/messagesummary.py:861 msgid "Url" msgstr "Url" #: prewikka/views/messagesummary/messagesummary.py:862 msgid "Cgi" msgstr "Cgi" #: prewikka/views/messagesummary/messagesummary.py:863 msgid "Http Method" msgstr "Método HTTP" #: prewikka/views/messagesummary/messagesummary.py:866 msgid "CGI Argument" msgstr "Argumento CGI" #: prewikka/views/messagesummary/messagesummary.py:875 msgid "SNMP Service" msgstr "Serviço SNMP" #: prewikka/views/messagesummary/messagesummary.py:878 msgid "oid" msgstr "oid" #: prewikka/views/messagesummary/messagesummary.py:879 msgid "messageProcessingModel" msgstr "messageProcessingModel" #: prewikka/views/messagesummary/messagesummary.py:880 msgid "securityModel" msgstr "securityModel" #: prewikka/views/messagesummary/messagesummary.py:881 msgid "securityName" msgstr "securityName" #: prewikka/views/messagesummary/messagesummary.py:882 msgid "securityLevel" msgstr "securityLevel" #: prewikka/views/messagesummary/messagesummary.py:883 #, fuzzy msgid "contextName" msgstr "Nome do nó" #: prewikka/views/messagesummary/messagesummary.py:884 msgid "contextEngineID" msgstr "contextEngineID" #: prewikka/views/messagesummary/messagesummary.py:885 msgid "command" msgstr "Comando" #: prewikka/views/messagesummary/messagesummary.py:897 #: prewikka/views/messagesummary/messagesummary.py:899 msgid "Port" msgstr "Porta" #: prewikka/views/messagesummary/messagesummary.py:919 #, fuzzy msgid "PortList" msgstr "Porta" #: prewikka/views/messagesummary/messagesummary.py:922 #, fuzzy msgid "ip_version" msgstr "Permissões:" #: prewikka/views/messagesummary/messagesummary.py:958 #, python-format msgid "Source(%d)" msgstr "Fonte(%d)" #: prewikka/views/messagesummary/messagesummary.py:973 #, python-format msgid "Target(%d)" msgstr "Alvo(%d)" #: prewikka/views/messagesummary/messagesummary.py:997 msgid "Overflow Alert" msgstr "Estouro de alerta" #: prewikka/views/messagesummary/messagesummary.py:1000 msgid "Alert" msgstr "Alerta" #: prewikka/views/messagesummary/messagesummary.py:1018 msgid "MessageID" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:1065 #, fuzzy msgid "Network centric information" msgstr "Informações sobre a conta" #: prewikka/views/messagesummary/messagesummary.py:1087 msgid "ASCII Payload" msgstr "Carga gasta ASCII" #: prewikka/views/messagesummary/messagesummary.py:1103 msgid "Heartbeat" msgstr "Heartbeat" #: prewikka/views/messagesummary/templates/messagesummary.mak:85 msgid "Summary" msgstr "Sumário" #: prewikka/views/usermanagement/__init__.py:14 #, fuzzy msgid "User settings page" msgstr "Ajustes" #: prewikka/views/usermanagement/usermanagement.py:18 msgid "My account" msgstr "Minha conta" #: prewikka/views/usermanagement/usermanagement.py:23 msgid "Invalid User" msgstr "Usuário inválido" #: prewikka/views/usermanagement/usermanagement.py:23 #, python-format msgid "Requested user '%s' does not exist" msgstr "" #: prewikka/views/usermanagement/usermanagement.py:43 msgid "Invalid Language" msgstr "Língua inválida" #: prewikka/views/usermanagement/usermanagement.py:43 msgid "Specified language does not exist" msgstr "" #: prewikka/views/usermanagement/usermanagement.py:47 msgid "Invalid Timezone" msgstr "Fuso horário inválido" #: prewikka/views/usermanagement/usermanagement.py:47 msgid "Specified timezone does not exist" msgstr "" #: prewikka/views/usermanagement/templates/usersettings.mak:6 msgid "Login:" msgstr "Usuário:" #: prewikka/views/usermanagement/templates/usersettings.mak:20 msgid "Email:" msgstr "Email:" #: prewikka/views/usermanagement/templates/usersettings.mak:22 msgid "Email" msgstr "Email" #: prewikka/views/usermanagement/templates/usersettings.mak:27 msgid "Language:" msgstr "Idioma:" #: prewikka/views/usermanagement/templates/usersettings.mak:39 msgid "Theme:" msgstr "Tema:" #: prewikka/views/usermanagement/templates/usersettings.mak:50 msgid "Timezone:" msgstr "Fuso horário:" #: scripts/prewikka-cli:59 #, fuzzy msgid "Unknown command" msgstr "Comando" #: scripts/prewikka-cli:67 #, python-format msgid "An unexpected error occurred: %s" msgstr "" #: scripts/prewikka-cli:154 msgid "Create an object of the specified type" msgstr "" #: scripts/prewikka-cli:157 msgid "Delete an object of the specified type" msgstr "" #: scripts/prewikka-cli:160 msgid "Import objects of the specified type from files" msgstr "" #: scripts/prewikka-cli:163 msgid "List objects of the specified type" msgstr "" #: scripts/prewikka-cli:166 msgid "Synchronize objects of the specified type" msgstr "" #: scripts/prewikka-cli:169 msgid "Update objects of the specified type" msgstr "" #: scripts/prewikka-cli:207 msgid "Prewikka command-line tool" msgstr "" #: scripts/prewikka-cli:208 msgid "name of the user" msgstr "" #: scripts/prewikka-cli:209 scripts/prewikka-crontab:99 #: scripts/prewikka-httpd:93 #, python-format msgid "configuration file to use (default: %(default)s)" msgstr "" #: scripts/prewikka-cli:210 msgid "command to execute" msgstr "" #: scripts/prewikka-cli:211 msgid "enable debugging output" msgstr "" #: scripts/prewikka-cli:218 msgid "prewikka-cli must be executed as the prewikka user" msgstr "" #: scripts/prewikka-cli:243 #, python-format msgid "Prewikka command-line tool (%s)" msgstr "" #: scripts/prewikka-cli:244 msgid "Type \"help\" or \"?\" to list commands" msgstr "" #: scripts/prewikka-crontab:100 msgid "run as a system daemon" msgstr "" #: scripts/prewikka-crontab:101 scripts/prewikka-httpd:96 msgid "show this help message and exit" msgstr "" #: scripts/prewikka-crontab:102 scripts/prewikka-httpd:97 msgid "show program's version number and exit" msgstr "" #: scripts/prewikka-httpd:88 msgid "root where the server is accessible" msgstr "" #: scripts/prewikka-httpd:89 #, python-format msgid "IP to bind to (default: %(default)s)" msgstr "" #: scripts/prewikka-httpd:90 #, python-format msgid "port number to use (default: %(default)d)" msgstr "" #: scripts/prewikka-httpd:91 msgid "SSL private key to use (default: no SSL)" msgstr "" #: scripts/prewikka-httpd:92 msgid "SSL certificate to use (default: no SSL)" msgstr "" #: scripts/prewikka-httpd:95 #, python-format msgid "" "number of processes to use. Default value matches the number of available" " CPUs (i.e. %d)" msgstr "" prewikka-5.1.1/prewikka/locale/ru/0000775000175000017500000000000013555143705020451 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/locale/ru/LC_MESSAGES/0000775000175000017500000000000013555143705022236 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/locale/ru/LC_MESSAGES/prewikka.po0000664000175000017500000021230113555143652024413 0ustar tandrejatandreja00000000000000# Russian Translation for Prewikka # Copyright (C) 2007-2019 CS-SI # This file is distributed under the same license as the prewikka package. # bogdanov.valentin@gmail.com, 2007. # # Modification for Prewikka 3.0 by IS-Systems LLC # info@is-systems.org, 2016 msgid "" msgstr "" "Project-Id-Version: Prewikka 5.1.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-09-04 19:03+0200\n" "PO-Revision-Date: 2018-02-09 12:07+0100\n" "Last-Translator: Alex Bochkin \n" "Language-Team: Russian\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 0.9.6\n" #: prewikka/baseview.py:79 prewikka/usergroup.py:52 msgid "Permission Denied" msgstr "Недостаточно прав" #: prewikka/baseview.py:79 msgid "Missing permission to access the specified file" msgstr "" #: prewikka/config.py:37 prewikka/dataprovider/__init__.py:645 msgid "Configuration error" msgstr "Ошибка конфигурации" #: prewikka/config.py:43 #, python-format msgid "Parse error in \"%(txt)s\" at %(file)s line %(line)d" msgstr "Ошибка обработки в \"%(txt)s\" в %(file)s строка %(line)d" #: prewikka/config.py:48 prewikka/view.py:82 #, python-format msgid "Invalid value '%(value)s' for parameter '%(name)s'" msgstr "Неверное значение '%(value)s' для параметра '%(name)s'" #: prewikka/config.py:54 #, python-format msgid "Missing value for parameter '%(name)s'" msgstr "Недостающее значение для параметра '%(name)s'" #: prewikka/crontab.py:37 msgid "Hourly" msgstr "Часовой" #: prewikka/crontab.py:38 msgid "Daily" msgstr "Cуточный" #: prewikka/crontab.py:39 msgid "Weekly" msgstr "Недельный" #: prewikka/crontab.py:40 msgid "Monthly" msgstr "Месячный" #: prewikka/crontab.py:41 msgid "Yearly" msgstr "Годовой" #: prewikka/crontab.py:42 prewikka/mainmenu.py:302 #: prewikka/templates/mainmenu.mak:92 msgid "Custom" msgstr "Настраиваемый" #: prewikka/crontab.py:43 prewikka/views/crontab/__init__.py:84 msgid "Disabled" msgstr "Выключено" #: prewikka/crontab.py:105 msgid "Scheduled job execution failed" msgstr "" #: prewikka/crontab.py:139 #, fuzzy msgid "Invalid job extension" msgstr "Неверная сессия" #: prewikka/crontab.py:139 #, python-format msgid "Scheduled job with invalid extension type '%s'" msgstr "" #: prewikka/crontab.py:206 #, fuzzy msgid "Invalid CronJob" msgstr "Неверная сессия" #: prewikka/crontab.py:206 #, python-format msgid "CronJob with id=%d cannot be found in database" msgstr "" #: prewikka/crontab.py:260 #, fuzzy msgid "Invalid schedule" msgstr "Неверный пользователь" #: prewikka/crontab.py:260 msgid "The specified job schedule is invalid" msgstr "" #: prewikka/crontab.py:286 #, python-format msgid "Custom (%s)" msgstr "Настраиваемый (%s)" #: prewikka/database.py:43 msgid "Database error" msgstr "Ошибка базы данных" #: prewikka/database.py:50 msgid "Database schema error" msgstr "Ошибка схемы базы данных" #: prewikka/database.py:293 msgid "database installation required" msgstr "Необходима установка базы данных" #: prewikka/database.py:296 msgid "database activation required" msgstr "Требуется активация базы данных" #: prewikka/database.py:299 #, python-format msgid "database schema branch %(required)s required (found %(current)s)" msgstr "" #: prewikka/database.py:305 #, python-format msgid "database schema version %(required)s required (found %(current)s)" msgstr "" #: prewikka/database.py:372 msgid "Database installation error" msgstr "Ошибка установки базы данных" #: prewikka/database.py:374 #, python-format msgid "" "No database installation script found for module %(module)s, version " "%(version)s" msgstr "" "Не найдет скрипт установки базы данных для модуля %(module)s, version " "%(version)s" #: prewikka/database.py:382 prewikka/database.py:420 msgid "Database migration error" msgstr "Ошибка миграции базы данных" #: prewikka/database.py:386 #, fuzzy, python-format msgid "" "No database branch migration script found for module %(module)s, branch " "transition %(current)s -> %(required)s" msgstr "" "Не найдет скрипт установки базы данных для модуля %(module)s, version " "%(version)s" #: prewikka/database.py:424 #, python-format msgid "" "No linear migration script found for module %(module)s %(version1)s -> " "%(version2)s" msgstr "" #: prewikka/database.py:841 #, fuzzy msgid "Database configuration error" msgstr "Ошибка миграции базы данных" #: prewikka/database.py:841 msgid "Only MySQL and PostgreSQL databases are supported at the moment" msgstr "" #: prewikka/error.py:48 prewikka/templates/error.mak:139 msgid "An unexpected condition happened" msgstr "" #: prewikka/error.py:148 msgid "Not implemented" msgstr "" #: prewikka/error.py:150 msgid "Backend does not implement this operation" msgstr "" #: prewikka/history.py:32 msgid "Search history deletion" msgstr "" #: prewikka/localization.py:143 msgid "%m/%Y" msgstr "%m.%Y" #: prewikka/localization.py:144 #, python-format msgid "%m/%d/%Y" msgstr "%d.%m.%Y" #: prewikka/localization.py:145 #, python-format msgid "%m/%d/%Y %Hh" msgstr "%d.%m.%Y %H:00" #: prewikka/localization.py:146 #, python-format msgid "%m/%d/%Y %H:%M" msgstr "%d.%m.%Y %H:%M" #: prewikka/localization.py:147 #, python-format msgid "%m/%d/%Y %H:%M:%S" msgstr "%d.%m.%Y %H:%M:%S" #: prewikka/localization.py:149 msgid "%H:%M" msgstr "%H:%M" #: prewikka/localization.py:150 msgid "%H:%M:%S" msgstr "%H:%M:%S" #: prewikka/localization.py:235 prewikka/localization.py:253 #: prewikka/renderer/__init__.py:62 prewikka/views/crontab/__init__.py:95 msgid "n/a" msgstr "" #: prewikka/localization.py:246 #, python-format msgid "%(days)dd %(hours)dh %(minutes)d'" msgstr "" #: prewikka/main.py:45 msgid "Version Requirement error" msgstr "Ошибка соответствия версии" #: prewikka/main.py:48 #, python-format msgid "Prewikka %(vPre)s requires libprelude %(vLib)s or higher" msgstr "Prewikka %(vPre)s требует libprelude %(vLib)s или выше" #: prewikka/main.py:53 #, python-format msgid "Prewikka %(vPre)s requires libpreludedb %(vLib)s or higher" msgstr "Prewikka %(vPre)s требует libpreludedb %(vLib)s или выше" #: prewikka/main.py:136 prewikka/main.py:149 #: prewikka/dataprovider/plugins/idmef/__init__.py:57 msgid "Initialization error" msgstr "Ошибка инициализации" #: prewikka/main.py:150 #, python-format msgid "" "Cannot use %(type)s mode '%(name)s', please contact your local " "administrator." msgstr "" #: prewikka/main.py:192 #, python-format msgid "Session '%s' does not accept any authentication module" msgstr "Сессия '%s' не принимает ни одного модуля аутентификации" #: prewikka/main.py:298 #, python-format msgid "An unexpected condition happened while trying to load %s" msgstr "" #: prewikka/mainmenu.py:114 #, python-format msgid "%S.%.6f" msgstr "" #: prewikka/mainmenu.py:115 #, python-format msgid "%S.%.3f" msgstr "" #: prewikka/mainmenu.py:260 msgid "Today" msgstr "Cегодня" #: prewikka/mainmenu.py:261 msgid "Yesterday" msgstr "Вчера" #: prewikka/mainmenu.py:262 msgid "This week" msgstr "Этой неделе" #: prewikka/mainmenu.py:263 msgid "Last week" msgstr "Прошлая неделя" #: prewikka/mainmenu.py:264 msgid "This month" msgstr "Этот месяц" #: prewikka/mainmenu.py:265 msgid "Last month" msgstr "Прошлый месяц" #: prewikka/mainmenu.py:266 prewikka/mainmenu.py:267 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d час" msgstr[1] "%d часа" msgstr[2] "%d часов" #: prewikka/mainmenu.py:268 prewikka/mainmenu.py:269 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d день" msgstr[1] "%d дня" msgstr[2] "%d дней" #: prewikka/mainmenu.py:270 #, python-format msgid "%d week" msgid_plural "%d weeks" msgstr[0] "%d неделя" msgstr[1] "%d недели" msgstr[2] "%d недель" #: prewikka/mainmenu.py:271 prewikka/mainmenu.py:272 #, python-format msgid "%d month" msgid_plural "%d months" msgstr[0] "%d месяц" msgstr[1] "%d месяца" msgstr[2] "%d месяцев" #: prewikka/mainmenu.py:273 #, python-format msgid "%d year" msgid_plural "%d years" msgstr[0] "%d год" msgstr[1] "%d года" msgstr[2] "%d лет" #: prewikka/mainmenu.py:277 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d секунда" msgstr[1] "%d секунды" msgstr[2] "%d секунд" #: prewikka/mainmenu.py:278 prewikka/mainmenu.py:279 prewikka/mainmenu.py:280 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d минута" msgstr[1] "%d минуты" msgstr[2] "%d минут" #: prewikka/mainmenu.py:299 prewikka/templates/mainmenu.mak:61 msgid "Inactive" msgstr "Неактивный" #: prewikka/mainmenu.py:305 prewikka/templates/mainmenu.mak:89 msgid "None" msgstr "Никто" #: prewikka/menu.py:70 prewikka/menu.py:73 prewikka/menu.py:79 #: prewikka/menu.py:83 prewikka/menu.py:91 #, fuzzy msgid "Menu error" msgstr "Внутренняя ошибка Prelude" #: prewikka/menu.py:70 msgid "The provided YAML menu is invalid" msgstr "" #: prewikka/menu.py:73 msgid "Empty menu" msgstr "" #: prewikka/menu.py:79 #, python-format msgid "Menu without a name in %s" msgstr "" #: prewikka/menu.py:83 msgid "Multiple default menus" msgstr "" #: prewikka/menu.py:91 msgid "Multiple default views" msgstr "" #: prewikka/pluginmanager.py:163 #, python-format msgid "Circular dependencies detected: %s" msgstr "" #: prewikka/pluginmanager.py:171 #, python-format msgid "Missing dependency: %s" msgstr "" #: prewikka/resolve.py:170 #, python-format msgid "" "Asynchronous DNS resolution disabled: twisted.names and twisted.internet " "required: %s" msgstr "" #: prewikka/usergroup.py:44 #, python-format msgid "Access to view '%(view)s' forbidden. Required permissions: %(permissions)s" msgstr "Просмотр '%(view)s' запрещен. Требуемые права : %(permissions)s" #: prewikka/usergroup.py:47 #, python-format msgid "Access to view '%s' forbidden" msgstr "Просмотр '%s' запрещен" #: prewikka/usergroup.py:50 #, python-format msgid "Required permissions: %s" msgstr "Требуемые права: %s" #: prewikka/view.py:74 prewikka/view.py:81 prewikka/view.py:88 msgid "Parameters Normalization failed" msgstr "Ошибка нормализации параметров" #: prewikka/view.py:75 #, python-format msgid "Parameter '%s' is not valid" msgstr "Параметр '%s' неверен" #: prewikka/view.py:89 #, python-format msgid "Required parameter '%s' is missing" msgstr "Требуемый параметр '%s' отсутствует" #: prewikka/view.py:95 #, fuzzy msgid "Invalid method" msgstr "неверная временная зона" #: prewikka/view.py:102 msgid "Invalid view" msgstr "Неверное отображение" #: prewikka/view.py:528 #, python-format msgid "Method '%(method)s' is not allowed for view '%(view)s'" msgstr "" #: prewikka/view.py:532 prewikka/view.py:651 #, python-format msgid "View '%s' does not exist" msgstr "Отображение '%s' не существует" #: prewikka/auth/auth.py:30 msgid "Authentication failed" msgstr "Ошибка аутентификации" #: prewikka/dataprovider/__init__.py:35 msgid "Equal" msgstr "Равно" #: prewikka/dataprovider/__init__.py:36 msgid "Equal (case-insensitive)" msgstr "Соответствует (нечувствительная к регистру)" #: prewikka/dataprovider/__init__.py:37 msgid "Not equal" msgstr "Не соответствует" #: prewikka/dataprovider/__init__.py:38 msgid "Not equal (case-insensitive)" msgstr "Не соответствует (нечувствительная к регистру)" #: prewikka/dataprovider/__init__.py:39 msgid "Regular expression" msgstr "Регулярное выражение" #: prewikka/dataprovider/__init__.py:40 msgid "Regular expression (case-insensitive)" msgstr "Регулярное выражение (нечувствительное к регистру)" #: prewikka/dataprovider/__init__.py:41 msgid "Not regular expression" msgstr "Не регулярное выражение" #: prewikka/dataprovider/__init__.py:42 msgid "Not regular expression (case-insensitive)" msgstr "Не регулярное выражение (нечувствительное к регистру)" #: prewikka/dataprovider/__init__.py:43 msgid "Lesser than" msgstr "Меньше чем" #: prewikka/dataprovider/__init__.py:44 msgid "Lesser or equal" msgstr "Меньше или равно" #: prewikka/dataprovider/__init__.py:45 msgid "Greater than" msgstr "Больше чем" #: prewikka/dataprovider/__init__.py:46 msgid "Greater or equal" msgstr "Больше или равно" #: prewikka/dataprovider/__init__.py:47 msgid "Substring" msgstr "Подстрока" #: prewikka/dataprovider/__init__.py:48 msgid "Substring (case-insensitive)" msgstr "Подстрока (нечувствительная к регистру)" #: prewikka/dataprovider/__init__.py:49 msgid "Not substring" msgstr "Не подстрока" #: prewikka/dataprovider/__init__.py:50 msgid "Not substring (case-insensitive)" msgstr "Не подстрока (нечувствительная к регистру)" #: prewikka/dataprovider/__init__.py:92 prewikka/dataprovider/__init__.py:158 msgid "Conversion error" msgstr "Ошибка конвертации" #: prewikka/dataprovider/__init__.py:93 prewikka/dataprovider/__init__.py:159 #, python-format msgid "Value %(value)r cannot be converted to %(type)s" msgstr "" #: prewikka/dataprovider/__init__.py:109 msgid "Backend error" msgstr "Ошибка бэкэнда" #: prewikka/dataprovider/__init__.py:109 #, fuzzy, python-format msgid "No backend available for '%s' datatype" msgstr "Не сконфигурирован обработчик для '%s' типа данных" #: prewikka/dataprovider/__init__.py:116 prewikka/dataprovider/__init__.py:123 msgid "Syntax error" msgstr "Ошибка синтаксиса" #: prewikka/dataprovider/__init__.py:116 #, python-format msgid "Unknown path: %s" msgstr "Неизвестный путь: %s" #: prewikka/dataprovider/__init__.py:123 scripts/prewikka-cli:109 #: scripts/prewikka-cli:118 scripts/prewikka-cli:129 #, fuzzy msgid "Could not parse input" msgstr "Невозможно сохранить фильтр" #: prewikka/dataprovider/__init__.py:635 #, python-format msgid "No handler configured for '%s' datatype" msgstr "Не сконфигурирован обработчик для '%s' типа данных" #: prewikka/dataprovider/__init__.py:646 #, python-format msgid "Only one manager should be configured for '%s' backend" msgstr "Только один менеджер может быть сконфигурирован для '%s' бэкенда" #: prewikka/dataprovider/idmef.py:128 msgid "High" msgstr "Высокий" #: prewikka/dataprovider/idmef.py:129 msgid "Medium" msgstr "Средний" #: prewikka/dataprovider/idmef.py:130 msgid "Low" msgstr "Низкий" #: prewikka/dataprovider/idmef.py:131 msgid "Informational" msgstr "Информационный" #: prewikka/dataprovider/idmef.py:141 #, fuzzy msgid "Provides an API to fetch IDMEF alerts" msgstr "Предоставляет API для получения событий безопасности" #: prewikka/dataprovider/idmef.py:142 #: prewikka/views/agents/templates/agents.mak:83 #: prewikka/views/datasearch/alert.py:75 prewikka/views/datasearch/alert.py:76 msgid "Alerts" msgstr "Сигналы тревоги" #: prewikka/dataprovider/idmef.py:149 prewikka/views/datasearch/alert.py:88 #: prewikka/views/datasearch/threat.py:75 msgid "Classification" msgstr "Классификация" #: prewikka/dataprovider/idmef.py:150 msgid "Source IP" msgstr "IP источника" #: prewikka/dataprovider/idmef.py:151 #: prewikka/views/messagesummary/messagesummary.py:548 #: prewikka/views/messagesummary/messagesummary.py:569 msgid "Source port" msgstr "Порт источника" #: prewikka/dataprovider/idmef.py:152 msgid "Target IP" msgstr "IP цели" #: prewikka/dataprovider/idmef.py:153 #: prewikka/views/messagesummary/messagesummary.py:549 #: prewikka/views/messagesummary/messagesummary.py:570 msgid "Target port" msgstr "Порт цели" #: prewikka/dataprovider/idmef.py:154 #, fuzzy msgid "Analyzer name" msgstr "Время анализатора" #: prewikka/dataprovider/idmef.py:157 #, fuzzy msgid "Alert deletion" msgstr "Список событий" #: prewikka/dataprovider/idmef.py:182 #, fuzzy msgid "Provides an API to fetch IDMEF heartbeats" msgstr "Предоставляет API для получения событий безопасности" #: prewikka/dataprovider/idmef.py:183 #: prewikka/views/agents/templates/agents.mak:87 #: prewikka/views/datasearch/heartbeat.py:56 msgid "Heartbeats" msgstr "События состояния" #: prewikka/dataprovider/idmef.py:188 #, fuzzy msgid "Heartbeat deletion" msgstr "Анализ событий состояния" #: prewikka/dataprovider/parsers/lucene/__init__.py:52 #, fuzzy msgid "Lucene emulation error" msgstr "Ошибка нормализации на бэкенде" #: prewikka/dataprovider/parsers/lucene/__init__.py:53 msgid "" "This Lucene expression cannot be emulated properly using the Criterion " "backend" msgstr "" #: prewikka/dataprovider/plugins/idmef/__init__.py:97 #, fuzzy msgid "Plugin for fetching IDMEF alerts from the Prelude database" msgstr "Плагин для получения событий IDMEF из базы данных Prelude" #: prewikka/dataprovider/plugins/idmef/__init__.py:111 #, fuzzy msgid "Plugin for fetching IDMEF heartbeats from the Prelude database" msgstr "Плагин для получения событий IDMEF из базы данных Prelude" #: prewikka/plugins/warning/__init__.py:33 msgid "Prelude Warning message" msgstr "" #: prewikka/plugins/warning/templates/warning.mak:14 msgid "WARNING" msgstr "ВНИМАНИЕ!" #: prewikka/plugins/warning/templates/warning.mak:17 msgid "Prelude OSS is the open-source version of the Prelude SIEM" msgstr "Prelude OSS это версия с открытым исходным кодом приложения Prelude SIEM" #: prewikka/plugins/warning/templates/warning.mak:21 #, python-format msgid "" "This OSS version has lower " "performance and less features than the Pro/Enterprise versions." msgstr "" "Эта OSS версия имеет пониженную " "производительность и меньше возможностей чем Pro/Enterprise версия." #: prewikka/plugins/warning/templates/warning.mak:22 msgid "" "It is intended for tests and small environments, and should not be used " "in critical environments." msgstr "" "Предполагается для тестов и небольших окружений. Не следует использовать " "вкритически важных системах" #: prewikka/plugins/warning/templates/warning.mak:26 #, python-format msgid "Prelude OSS is distributed under the %s." msgstr "Prelude OSS распространяется под %s." #: prewikka/plugins/warning/templates/warning.mak:27 msgid "" "Products derivated from Prelude OSS modules are therefore subject to the " "terms of the GPLv2." msgstr "" #: prewikka/plugins/warning/templates/warning.mak:30 #: prewikka/templates/error.mak:171 prewikka/templates/toplayout.mak:62 #: prewikka/templates/toplayout.mak:77 prewikka/templates/toplayout.mak:94 #: prewikka/views/aboutplugin/templates/aboutplugin.mak:44 msgid "OK" msgstr "" #: prewikka/renderer/__init__.py:44 msgid "No data to display." msgstr "Нет данных для отображения" #: prewikka/renderer/__init__.py:143 prewikka/renderer/__init__.py:147 #: prewikka/renderer/__init__.py:151 msgid "Renderer error" msgstr "Ошибка рендерера" #: prewikka/renderer/__init__.py:144 #, python-format msgid "No backend supporting render type '%s'" msgstr "" #: prewikka/renderer/__init__.py:148 #, python-format msgid "No backend named '%s'" msgstr "" #: prewikka/renderer/__init__.py:152 #, python-format msgid "Backend '%(backend)s' does not support render type '%(type)s'" msgstr "" #: prewikka/renderer/chartjs/__init__.py:104 #, fuzzy msgid "ChartJS renderer backend" msgstr "Плагины рендеринга бэкенда" #: prewikka/renderer/chartjs/bar/__init__.py:38 #, fuzzy msgid "ChartJS Bar renderer type" msgstr "Плагины типа рендеринга" #: prewikka/renderer/chartjs/timeline/__init__.py:85 msgid "ChartJS Timebar renderer type" msgstr "" #: prewikka/session/session.py:39 msgid "Invalid session" msgstr "Неверная сессия" #: prewikka/session/session.py:40 msgid "The session cookie carried by your browser is invalid" msgstr "" #: prewikka/session/session.py:44 msgid "Session expired" msgstr "Время жизни сессии истекло" #: prewikka/session/session.py:45 msgid "Your session has expired: please sign in again to continue using Prelude" msgstr "" #: prewikka/session/session.py:181 msgid "Logged out" msgstr "Пользователь вышел из системы" #: prewikka/session/anonymous/anonymous.py:31 msgid "Anonymous authentication" msgstr "Анонимная аутентификация" #: prewikka/templates/baseview.mak:148 msgid "View options" msgstr "" #: prewikka/templates/baseview.mak:151 msgid "View help" msgstr "" #: prewikka/templates/baseview.mak:205 msgid "This app has been disabled or failed to load." msgstr "Это приложение было выключено или возникла ошибка при его загрузке" #: prewikka/templates/baseview.mak:211 prewikka/templates/baseview.mak:222 msgid "name" msgstr "имя" #: prewikka/templates/baseview.mak:287 msgid "About" msgstr "О программе" #: prewikka/templates/baseview.mak:290 msgid "Are you sure you want to log out?" msgstr "Вы уверены что хотите выйти?" #: prewikka/templates/baseview.mak:290 msgid "Logout" msgstr "Выход" #: prewikka/templates/error.mak:66 msgid "Detail" msgstr "Детали" #: prewikka/templates/error.mak:67 msgid "Copy to clipboard" msgstr "Скопировать в буфер обмена" #: prewikka/templates/error.mak:137 prewikka/templates/error.mak:145 msgid "Error: {0}" msgstr "Ошибка: {0}" #: prewikka/templates/error.mak:155 msgid "This may be due to one or more of the following reasons:" msgstr "Это может случиться по следующим причинам:" #: prewikka/templates/error.mak:157 msgid "You don't have the required permissions." msgstr "" #: prewikka/templates/error.mak:158 #, python-format msgid "Required apps are disabled. See the %s page for more details." msgstr "" #: prewikka/templates/error.mak:176 prewikka/templates/toplayout.mak:61 #: prewikka/views/crontab/templates/cronjob.mak:122 #: prewikka/views/filter/templates/filteredition.mak:122 msgid "Cancel" msgstr "Отменить" #: prewikka/templates/error.mak:177 msgid "Sign in" msgstr "" #: prewikka/templates/error.mak:181 msgid "Back" msgstr "Назад" #: prewikka/templates/error.mak:184 msgid "Retry" msgstr "Повторная попытка" #: prewikka/templates/error.mak:186 msgid "Redirect to main page" msgstr "" #: prewikka/templates/mainmenu.mak:44 msgid "Refresh:" msgstr "Обновить:" #: prewikka/templates/mainmenu.mak:49 msgid "Update frequency of the current page" msgstr "Частота обновления текущей страницы" #: prewikka/templates/mainmenu.mak:76 msgid "Period:" msgstr "Период:" #: prewikka/templates/mainmenu.mak:81 msgid "Period to visualize" msgstr "Период для визуализации" #: prewikka/templates/mainmenu.mak:111 msgid "Start:" msgstr "Нача́ло:" #: prewikka/templates/mainmenu.mak:117 msgid "start" msgstr "нача́ло" #: prewikka/templates/mainmenu.mak:117 msgid "Start date" msgstr "Дата начала" #: prewikka/templates/mainmenu.mak:123 msgid "End:" msgstr "Конец:" #: prewikka/templates/mainmenu.mak:130 msgid "end" msgstr "конец" #: prewikka/templates/mainmenu.mak:130 msgid "End date" msgstr "Дата окончания" #: prewikka/templates/toplayout.mak:57 msgid "Please Confirm" msgstr "Пожалуйста подтвердите" #: prewikka/templates/toplayout.mak:73 #, fuzzy msgid "Prelude Dialog" msgstr "Внутренняя ошибка Prelude" #: prewikka/templates/toplayout.mak:88 #, fuzzy msgid "Connection error" msgstr "Ошибка конфигурации" #: prewikka/templates/toplayout.mak:91 msgid "" "Connection failed, the server may be down or you may be experiencing " "network issues." msgstr "" #: prewikka/utils/misc.py:72 prewikka/views/agents/agents.py:45 msgid "Offline" msgstr "Выключен" #: prewikka/utils/misc.py:75 prewikka/views/agents/agents.py:210 msgid "Unknown" msgstr "Неизвестен" #: prewikka/utils/misc.py:78 msgid "Missing" msgstr "Отсутствует" #: prewikka/utils/misc.py:80 prewikka/views/agents/agents.py:44 msgid "Online" msgstr "Доступен" #: prewikka/views/about/__init__.py:13 msgid "Prelude About page" msgstr "Страница о Prelude" #: prewikka/views/about/templates/about.mak:11 #, python-format msgid "Prelude version %s" msgstr "Версия Prelude %s" #: prewikka/views/about/templates/about.mak:15 msgid "Prelude is a SIEM (Security Information and Event Management)" msgstr "" "Prelude это SIEM (Security Information and Event Management)(Управление " "событиями безопасности)" #: prewikka/views/about/templates/about.mak:21 msgid "" "{prelude} is a security management solution that collects, filters, " "normalizes, correlates, stores and archives data from various sources of " "your information system. Based on all this information Prelude can " "provide a global vision of your system's security level and thus prevent " "attacks, intrusions as well as viral infections." msgstr "" "{prelude} это решение управления безопасностью, которое собирает, " "фильтрует и нормализует,коррелирует, хранит и архивирует данные от " "различных источников вашихинформационных систем. Основываясь на данной " "информации Prelude может предоставитьобщий вид уровня безопасности ваших " "систем и соответственно предотвратить атаки, вторжения, а также вирусные " "инфекции." #: prewikka/views/about/templates/about.mak:24 msgid "Prelude Team:" msgstr "Команда Prelude:" #: prewikka/views/about/templates/about.mak:25 msgid "" "Prelude OSS is an open-source project originally created by Yoann " "Vandoorselaere in 1998." msgstr "" "Prelude OSS проект с открытым исходным кодом изначально созданный Yoann " "Vandoorselaere в 1998." #: prewikka/views/about/templates/about.mak:27 msgid "Vigilo is a NMS (Network Management System)" msgstr "Vigilo это NMS (Network Management System)(Система управления сетью.)" #: prewikka/views/about/templates/about.mak:33 msgid "" "{vigilo} is a complete monitoring and performance management solution " "capable of handling medium and large-scale systems (network - servers - " "applications) due to its distributed and modular architecture. Vigilo " "offers all the features required for performance supervision: states and " "alarms management, metrology, cartography, event correlation and " "reporting." msgstr "" "{vigilo} представляет собой комплексное решение для мониторинга и " "управления производительностью, способноеобработывать данные средних и " "крупномасштабных систем (сеть, сервера, приложения)благодаря своей " "распределенной и модульной архитектуре. Vigilo предлагает всефункции, " "необходимые для надзора за производительностью: управление состоянием и " "событиями, метрология, картография, корреляция событий и отчетность." #: prewikka/views/about/templates/about.mak:39 #, python-format msgid "" "Prelude SIEM and Vigilo NMS are being developed by the %s company, " "designer, integrator and operator of mission critical systems." msgstr "" "Prelude SIEM и Vigilo NMS разрабатываются в компании %s - дизайнере, " "интеграторе и операторе критически важных систем." #: prewikka/views/about/templates/about.mak:44 msgid "Contact" msgstr "Контакт" #: prewikka/views/about/templates/about.mak:46 msgid "Phone:" msgstr "Телефон:" #: prewikka/views/about/templates/about.mak:47 msgid "Fax:" msgstr "Факс:" #: prewikka/views/about/templates/about.mak:50 msgid "Office" msgstr "Офис" #: prewikka/views/about/templates/about.mak:56 msgid "Websites" msgstr "Веб-сайты" #: prewikka/views/about/templates/about.mak:67 #: prewikka/views/aboutplugin/templates/aboutplugin.mak:132 #: prewikka/views/agents/templates/heartbeatanalyze.mak:71 #: prewikka/views/messagesummary/templates/messagesummary.mak:93 msgid "Close" msgstr "Закрыть" #: prewikka/views/aboutplugin/__init__.py:36 msgid "Plugin installation and activation management page" msgstr "Страница управления установкой и активацией плагинов" #: prewikka/views/aboutplugin/__init__.py:40 #: prewikka/views/crontab/__init__.py:37 msgid "USER_MANAGEMENT" msgstr "Управление пользователями" #: prewikka/views/aboutplugin/__init__.py:42 msgid "Apps: View" msgstr "Плагины просмотра" #: prewikka/views/aboutplugin/__init__.py:43 msgid "Apps: API" msgstr "Плагины API" #: prewikka/views/aboutplugin/__init__.py:44 msgid "Apps: Dataprovider backend" msgstr "Плагины провайдера данных для бэкенда" #: prewikka/views/aboutplugin/__init__.py:45 msgid "Apps: Dataprovider type" msgstr "Плаины типы провайдера данных" #: prewikka/views/aboutplugin/__init__.py:46 msgid "Apps: Authentication" msgstr "Плагины аутентификации пользователя" #: prewikka/views/aboutplugin/__init__.py:47 msgid "Apps: Identification" msgstr "Плагины идентификации" #: prewikka/views/aboutplugin/__init__.py:48 msgid "Apps: Renderer backend" msgstr "Плагины рендеринга бэкенда" #: prewikka/views/aboutplugin/__init__.py:49 msgid "Apps: Renderer type" msgstr "Плагины типа рендеринга" #: prewikka/views/aboutplugin/__init__.py:82 msgid "list plugin: list installed plugins" msgstr "" #: prewikka/views/aboutplugin/__init__.py:91 msgid "Apps" msgstr "Плагины" #: prewikka/views/aboutplugin/__init__.py:120 msgid "sync plugin: initialize the plugin database schemas" msgstr "" #: prewikka/views/aboutplugin/__init__.py:134 #, python-format msgid "Applying %(module)s %(script)s..." msgstr "Применяется %(module)s %(script)s..." #: prewikka/views/aboutplugin/__init__.py:144 msgid "All updates applied" msgstr "Все обновления применены" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:44 #, fuzzy msgid "ERROR" msgstr "Оператор" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:48 msgid "Update failed" msgstr "Ошибка обновления" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:111 #, fuzzy msgid "Update Dialog" msgstr "Журнал обновлений" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:121 msgid "Plugin" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:122 #, fuzzy msgid "Script" msgstr "Описание" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:123 msgid "Result" msgstr "Результат" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:144 msgid "Plugin Maintenance" msgstr "Управление плагинами" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:147 msgid "" "The following apps need to be updated before they can be loaded into the " "system" msgstr "" "Слебующие плагины необходимо обновить прежде чем они могут быть загружены" " в систему" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:154 #: prewikka/views/aboutplugin/templates/aboutplugin.mak:190 #: prewikka/views/agents/templates/agents.mak:29 #: prewikka/views/agents/templates/heartbeatanalyze.mak:19 #: prewikka/views/crontab/templates/cronjob.mak:114 #: prewikka/views/crontab/templates/crontab.mak:17 #: prewikka/views/filter/templates/filterlisting.mak:23 #: prewikka/views/messagesummary/messagesummary.py:288 #: prewikka/views/messagesummary/messagesummary.py:425 #: prewikka/views/messagesummary/messagesummary.py:676 #: prewikka/views/messagesummary/messagesummary.py:693 #: prewikka/views/messagesummary/messagesummary.py:716 #: prewikka/views/messagesummary/messagesummary.py:778 #: prewikka/views/messagesummary/messagesummary.py:797 #: prewikka/views/messagesummary/messagesummary.py:833 #: prewikka/views/usermanagement/templates/usersettings.mak:15 msgid "Name" msgstr "Имя" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:155 #: prewikka/views/aboutplugin/templates/aboutplugin.mak:191 #: prewikka/views/filter/templates/filterlisting.mak:28 #: prewikka/views/idmefnav/templates/idmefnav.mak:56 #: prewikka/views/messagesummary/messagesummary.py:745 #: prewikka/views/messagesummary/messagesummary.py:751 msgid "Description" msgstr "Описание" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:156 #: prewikka/views/aboutplugin/templates/aboutplugin.mak:192 #: prewikka/views/agents/templates/agents.mak:33 #: prewikka/views/messagesummary/messagesummary.py:427 #: prewikka/views/messagesummary/messagesummary.py:530 msgid "Version" msgstr "Версия" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:157 msgid "Current database version" msgstr "Текущая версия базы данных" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:158 msgid "Required database update" msgstr "Требуется обновление базы данных" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:174 msgid "Install update" msgstr "Установить обновления" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:182 msgid "Installed Apps" msgstr "Установленные плагины" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:193 msgid "Database version" msgstr "Версия базы данных" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:194 msgid "Active" msgstr "Активный" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:215 msgid "Update the selected apps?" msgstr "Обновить выбранные плагины?" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:215 msgid "Update" msgstr "Обновить" #: prewikka/views/agents/__init__.py:12 msgid "Agents status information page" msgstr "Страница информации о статусе агентов" #: prewikka/views/agents/agents.py:64 prewikka/views/agents/agents.py:133 msgid "Agents" msgstr "Агенты" #: prewikka/views/agents/agents.py:110 msgid "Node name n/a" msgstr "Имя узла неизвестно" #: prewikka/views/agents/agents.py:111 msgid "OS version n/a" msgstr "Версия ОС неизвестна" #: prewikka/views/agents/agents.py:112 msgid "OS type n/a" msgstr "Тип ОС неизвестен" #: prewikka/views/agents/agents.py:117 msgid "Node location n/a" msgstr "Расположение узла неизвестно" #: prewikka/views/agents/agents.py:127 msgid "Alert listing" msgstr "Список событий" #: prewikka/views/agents/agents.py:128 msgid "Heartbeat listing" msgstr "Анализ событий состояния" #: prewikka/views/agents/agents.py:129 #: prewikka/views/agents/templates/heartbeatanalyze.mak:12 msgid "Heartbeat analysis" msgstr "Анализ событий состояния" #: prewikka/views/agents/agents.py:133 prewikka/views/agents/agents.py:157 #: prewikka/views/datasearch/idmef.py:158 #: prewikka/views/messagesummary/messagesummary.py:332 msgid "IDMEF_VIEW" msgstr "IDMEF_VIEW (Просмотр IDMEF)" #: prewikka/views/agents/agents.py:133 #: prewikka/views/datasearch/heartbeat.py:55 msgid "Monitoring" msgstr "Мониторинг" #: prewikka/views/agents/agents.py:142 msgid "IDMEF_ALTER" msgstr "IDMEF_ALTER (Изменение IDMEF)" #: prewikka/views/agents/agents.py:184 msgid "Normal sensor start" msgstr "Нормальный запуск сенсора" #: prewikka/views/agents/agents.py:186 msgid "Unexpected sensor restart" msgstr "Неожиданный перезапуск сенсора" #: prewikka/views/agents/agents.py:192 #, python-format msgid "Unexpected heartbeat interval: %(delta)s" msgstr "Неожиданный интервал статусного сообщения (heartbeat): %(delta)s" #: prewikka/views/agents/agents.py:195 msgid "Normal sensor stop" msgstr "Нормальная остановка сенсора" #: prewikka/views/agents/agents.py:207 #, python-format msgid "Sensor is down since %s" msgstr "Сенсор недоступен с %s" #: prewikka/views/agents/agents.py:216 #, python-format msgid "" "No anomaly in the last %(count)d heartbeats (one heartbeat every " "%(delta)s average)" msgstr "" "Без аномалий в последних %(count)d статусных сообщениях (heartbeats) " "(одно сообщение каждые %(delta)s в среднем)" #: prewikka/views/agents/templates/agents.mak:24 msgid "Show/Hide all" msgstr "Показать/Скрыть всё" #: prewikka/views/agents/templates/agents.mak:24 msgid "Search:" msgstr "Поиск:" #: prewikka/views/agents/templates/agents.mak:30 msgid "Location" msgstr "Расположение" #: prewikka/views/agents/templates/agents.mak:31 msgid "Node" msgstr "Узел" #: prewikka/views/agents/templates/agents.mak:32 #: prewikka/views/agents/templates/heartbeatanalyze.mak:20 #: prewikka/views/datasearch/heartbeat.py:67 #: prewikka/views/messagesummary/messagesummary.py:424 msgid "Model" msgstr "Модель" #: prewikka/views/agents/templates/agents.mak:34 #: prewikka/views/messagesummary/messagesummary.py:428 msgid "Class" msgstr "Класс" #: prewikka/views/agents/templates/agents.mak:38 #: prewikka/views/agents/templates/heartbeatanalyze.mak:25 msgid "Latest heartbeat" msgstr "Последнее время событий состояния" #: prewikka/views/agents/templates/agents.mak:39 msgid "Status" msgstr "Состояние" #: prewikka/views/agents/templates/agents.mak:83 #, fuzzy msgid "Delete the alerts of the selected agent(s)" msgstr "Удалить выбранные события?" #: prewikka/views/agents/templates/agents.mak:87 #, fuzzy msgid "Delete the heartbeats of the selected agent(s)" msgstr "Удалить выбранные события?" #: prewikka/views/agents/templates/agents.mak:89 msgid "Delete the selected IDMEF messages?" msgstr "Удалить выбранные сообщения IDMEF?" #: prewikka/views/agents/templates/agents.mak:89 #: prewikka/views/datasearch/idmef.py:195 #: prewikka/views/filter/templates/filterlisting.mak:42 msgid "Delete" msgstr "Удалить" #: prewikka/views/agents/templates/heartbeatanalyze.mak:21 msgid "OS" msgstr "ОС" #: prewikka/views/agents/templates/heartbeatanalyze.mak:22 #: prewikka/views/datasearch/heartbeat.py:66 #: prewikka/views/messagesummary/messagesummary.py:412 msgid "Node name" msgstr "Имя узла" #: prewikka/views/agents/templates/heartbeatanalyze.mak:23 #: prewikka/views/messagesummary/messagesummary.py:395 msgid "Node location" msgstr "Расположение узла" #: prewikka/views/agents/templates/heartbeatanalyze.mak:24 #: prewikka/views/datasearch/heartbeat.py:65 #: prewikka/views/messagesummary/messagesummary.py:418 msgid "Node address" msgstr "Адрес узла" #: prewikka/views/agents/templates/heartbeatanalyze.mak:26 msgid "Current status" msgstr "Текущее состояние" #: prewikka/views/agents/templates/heartbeatanalyze.mak:56 msgid "Events" msgstr "События" #: prewikka/views/crontab/__init__.py:30 msgid "Scheduling management" msgstr "" #: prewikka/views/crontab/__init__.py:35 #, fuzzy msgid "Scheduled jobs management page" msgstr "Страница управления фильтрами" #: prewikka/views/crontab/__init__.py:62 msgid "Configuration" msgstr "Конфигурация" #: prewikka/views/crontab/__init__.py:62 msgid "Scheduling" msgstr "Планирование" #: prewikka/views/crontab/__init__.py:75 prewikka/views/crontab/__init__.py:104 msgid "SYSTEM" msgstr "СИСТЕМА" #: prewikka/views/crontab/__init__.py:88 msgid "Pending" msgstr "В ожидании" #: prewikka/views/crontab/__init__.py:98 msgid "Error" msgstr "Ошибка" #: prewikka/views/crontab/templates/cronjob.mak:54 msgid "Schedule:" msgstr "Расписание:" #: prewikka/views/crontab/templates/cronjob.mak:69 msgid "custom" msgstr "настраиваемый" #: prewikka/views/crontab/templates/cronjob.mak:70 msgid "disabled" msgstr "выключено" #: prewikka/views/crontab/templates/cronjob.mak:79 msgid "Minute:" msgstr "Минута:" #: prewikka/views/crontab/templates/cronjob.mak:83 msgid "Hour:" msgstr "Час:" #: prewikka/views/crontab/templates/cronjob.mak:87 msgid "Day:" msgstr "День:" #: prewikka/views/crontab/templates/cronjob.mak:91 msgid "Month:" msgstr "Месяц:" #: prewikka/views/crontab/templates/cronjob.mak:95 msgid "Weekday:" msgstr "День недели:" #: prewikka/views/crontab/templates/cronjob.mak:107 msgid "Edit Job" msgstr "" #: prewikka/views/crontab/templates/cronjob.mak:112 #: prewikka/views/filter/templates/filteredition.mak:73 #: prewikka/views/usermanagement/templates/usersettings.mak:13 msgid "Name:" msgstr "Имя:" #: prewikka/views/crontab/templates/cronjob.mak:123 #: prewikka/views/filter/templates/filteredition.mak:123 #: prewikka/views/usermanagement/templates/usersettings.mak:61 msgid "Save" msgstr "Сохранить" #: prewikka/views/crontab/templates/crontab.mak:15 msgid "Scheduled Jobs" msgstr "Дела по расписанию" #: prewikka/views/crontab/templates/crontab.mak:18 msgid "Schedule" msgstr "Расписание" #: prewikka/views/crontab/templates/crontab.mak:19 msgid "User" msgstr "Пользователь" #: prewikka/views/crontab/templates/crontab.mak:20 msgid "Last execution" msgstr "Последнее исполнение" #: prewikka/views/crontab/templates/crontab.mak:21 msgid "Next execution" msgstr "Следующее исполнение" #: prewikka/views/crontab/templates/crontab.mak:69 msgid "Disable" msgstr "Выключить" #: prewikka/views/crontab/templates/crontab.mak:70 msgid "Enable" msgstr "Включить" #: prewikka/views/datasearch/alert.py:71 #, fuzzy msgid "Alert listing page" msgstr "Список событий" #: prewikka/views/datasearch/alert.py:76 #, fuzzy msgid "Aggregated alerts" msgstr "Событие корреляции" #: prewikka/views/datasearch/alert.py:87 #: prewikka/views/datasearch/heartbeat.py:63 #: prewikka/views/datasearch/threat.py:74 msgid "Date" msgstr "Дата" #: prewikka/views/datasearch/alert.py:89 prewikka/views/datasearch/threat.py:76 msgid "Source" msgstr "Источник" #: prewikka/views/datasearch/alert.py:90 prewikka/views/datasearch/threat.py:77 msgid "Target" msgstr "Цель" #: prewikka/views/datasearch/alert.py:91 msgid "Analyzer" msgstr "Анализатор" #: prewikka/views/datasearch/alert.py:94 msgid "Delete the selected alerts?" msgstr "Удалить выбранные события?" #: prewikka/views/datasearch/alert.py:148 #: prewikka/views/idmefnav/__init__.py:44 msgid "IDMEF" msgstr "IDMEF" #: prewikka/views/datasearch/datasearch.py:48 msgid "minute" msgstr "минута" #: prewikka/views/datasearch/datasearch.py:48 msgid "hour" msgstr "час" #: prewikka/views/datasearch/datasearch.py:48 msgid "day" msgstr "день" #: prewikka/views/datasearch/datasearch.py:48 msgid "month" msgstr "месяц" #: prewikka/views/datasearch/datasearch.py:48 msgid "year" msgstr "год" #: prewikka/views/datasearch/datasearch.py:161 #, fuzzy msgid "Time group error" msgstr "Внутренняя ошибка Prelude" #: prewikka/views/datasearch/datasearch.py:161 msgid "Only one time unit can be specified in a groupby query" msgstr "" #: prewikka/views/datasearch/datasearch.py:446 msgid "Forensic" msgstr "" #: prewikka/views/datasearch/datasearch.py:446 msgid "Dashboard" msgstr "Доска диаграмм" #: prewikka/views/datasearch/datasearch.py:490 msgid "CSV export" msgstr "" #: prewikka/views/datasearch/datasearch.py:622 msgid "General" msgstr "Главная" #: prewikka/views/datasearch/heartbeat.py:51 #, fuzzy msgid "Heartbeat listing page" msgstr "Анализ событий состояния" #: prewikka/views/datasearch/heartbeat.py:56 #, fuzzy msgid "Aggregated heartbeats" msgstr "Последнее время событий состояния" #: prewikka/views/datasearch/heartbeat.py:64 msgid "Agent" msgstr "Агент" #: prewikka/views/datasearch/heartbeat.py:69 #, fuzzy msgid "Delete the selected heartbeats?" msgstr "Удалить выбранные события?" #: prewikka/views/datasearch/idmef.py:46 #, fuzzy msgid "See IDMEF details" msgstr "Сигналы тревоги" #: prewikka/views/datasearch/threat.py:66 #, fuzzy msgid "Threat listing page" msgstr "Анализ событий состояния" #: prewikka/views/datasearch/threat.py:69 #: prewikka/views/datasearch/threat.py:70 msgid "Threats" msgstr "Угрозы" #: prewikka/views/datasearch/threat.py:70 #, fuzzy msgid "Aggregated threats" msgstr "Последнее время событий состояния" #: prewikka/views/datasearch/threat.py:78 msgid "Program" msgstr "Программа" #: prewikka/views/datasearch/templates/details.mak:26 #, python-format msgid "Group by %s" msgstr "Группировать по %s" #: prewikka/views/datasearch/templates/details.mak:30 #: prewikka/views/datasearch/templates/forensic.mak:219 msgid "Add to search" msgstr "Добавить к поиску" #: prewikka/views/datasearch/templates/details.mak:31 #: prewikka/views/datasearch/templates/forensic.mak:220 msgid "Exclude from search" msgstr "Удалить из поиска" #: prewikka/views/datasearch/templates/forensic.mak:9 msgid "Fields" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:10 msgid "Query history" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:63 msgid "Chart type" msgstr "Тип диаграммы" #: prewikka/views/datasearch/templates/forensic.mak:73 msgid "Limit" msgstr "Лимит" #: prewikka/views/datasearch/templates/forensic.mak:89 msgid "Expert mode" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:96 msgid "Condensed mode" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:108 msgid "Search mode" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:112 #: prewikka/views/datasearch/templates/forensic.mak:217 msgid "Search" msgstr "Искать" #: prewikka/views/datasearch/templates/forensic.mak:114 msgid "Reset search" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:124 #: prewikka/views/datasearch/templates/forensic.mak:222 msgid "Group by" msgstr "Группировать по" #: prewikka/views/datasearch/templates/forensic.mak:125 msgid "Select your field" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:126 #, fuzzy msgid "Time values" msgstr "Значение" #: prewikka/views/datasearch/templates/forensic.mak:131 #, python-format msgid "%s fields" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:167 msgid "Timeline" msgstr "Временная шкала" #: prewikka/views/datasearch/templates/forensic.mak:221 msgid "New search" msgstr "Новый поиск" #: prewikka/views/datasearch/templates/forensic.mak:231 #: prewikka/views/messagesummary/messagesummary.py:1026 msgid "Actions" msgstr "Действие" #: prewikka/views/datasearch/templates/forensic.mak:244 msgid "Informations" msgstr "Информация" #: prewikka/views/datasearch/templates/infos.mak:3 msgid "Field" msgstr "" #: prewikka/views/datasearch/templates/infos.mak:9 #, fuzzy msgid "Occurrence" msgstr "Источник" #: prewikka/views/datasearch/templates/table.mak:12 msgid "Count" msgstr "Счет" #: prewikka/views/filter/__init__.py:11 msgid "Filters management page" msgstr "Страница управления фильтрами" #: prewikka/views/filter/filter.py:113 #: prewikka/views/usermanagement/usermanagement.py:18 msgid "Preferences" msgstr "Преферанс" #: prewikka/views/filter/filter.py:113 #: prewikka/views/filter/templates/filterlisting.mak:17 msgid "Filters" msgstr "Фильтры" #: prewikka/views/filter/filter.py:124 #: prewikka/views/filter/templates/filteredition.mak:66 #, python-format msgid "Filter %s" msgstr "Фильтр %s" #: prewikka/views/filter/filter.py:199 msgid "Filter error" msgstr "Ошибка фильтра" #: prewikka/views/filter/filter.py:199 #, python-format msgid "Filter '%s' does not exist" msgstr "Фильтр '%s' не существует" #: prewikka/views/filter/filter.py:236 prewikka/views/filter/filter.py:248 msgid "Could not save filter" msgstr "Невозможно сохранить фильтр" #: prewikka/views/filter/filter.py:236 msgid "No name for this filter was provided" msgstr "Не введено имя фильтра" #: prewikka/views/filter/filter.py:248 msgid "The filter name is already used by another filter" msgstr "Имя данного фильтра уже существует" #: prewikka/views/filter/templates/filteredition.mak:66 #: prewikka/views/filter/templates/filterlisting.mak:17 #: prewikka/views/filter/templates/menu.mak:48 msgid "New filter" msgstr "Новый фильтр" #: prewikka/views/filter/templates/filteredition.mak:75 msgid "Filter name" msgstr "Фильтровать по:" #: prewikka/views/filter/templates/filteredition.mak:80 msgid "Category:" msgstr "Категория:" #: prewikka/views/filter/templates/filteredition.mak:92 msgid "Description:" msgstr "Описание:" #: prewikka/views/filter/templates/filterlisting.mak:24 #: prewikka/views/messagesummary/messagesummary.py:750 msgid "Category" msgstr "Категория" #: prewikka/views/filter/templates/filterlisting.mak:40 msgid "Create" msgstr "Создать" #: prewikka/views/filter/templates/filterlisting.mak:41 msgid "Duplicate" msgstr "Дубликат" #: prewikka/views/filter/templates/filterlisting.mak:42 msgid "Delete the selected filters?" msgstr "Удалить выбранные фильтры?" #: prewikka/views/filter/templates/menu.mak:4 msgid "Filter:" msgstr "Фильтр:" #: prewikka/views/filter/templates/menu.mak:38 msgid "Available filters" msgstr "Доступные фильтры:" #: prewikka/views/filter/templates/menu.mak:46 msgid "No filter" msgstr "Нет фильтра" #: prewikka/views/filter/templates/menu.mak:51 msgid "No category" msgstr "Нет категории" #: prewikka/views/filter/templates/widget.mak:7 msgid "Select a path..." msgstr "Выберите путь..." #: prewikka/views/filter/templates/widget.mak:9 msgid "Default paths" msgstr "Пути по-умолчанию" #: prewikka/views/filter/templates/widget.mak:15 msgid "All paths" msgstr "Все пути" #: prewikka/views/filter/templates/widget.mak:25 #: prewikka/views/filter/templates/widget.mak:46 msgid "Change operator" msgstr "" #: prewikka/views/filter/templates/widget.mak:32 msgid "value" msgstr "значение" #: prewikka/views/filter/templates/widget.mak:34 msgid "Delete condition" msgstr "" #: prewikka/views/filter/templates/widget.mak:42 #, fuzzy msgid "AND" msgstr "раскрыть" #: prewikka/views/filter/templates/widget.mak:42 #, fuzzy msgid "OR" msgstr "Порт" #: prewikka/views/filter/templates/widget.mak:56 msgid "Add condition" msgstr "" #: prewikka/views/filter/templates/widget.mak:57 msgid "Add group" msgstr "" #: prewikka/views/filter/templates/widget.mak:59 msgid "Delete group" msgstr "" #: prewikka/views/idmefnav/__init__.py:36 msgid "IDMEF navigator" msgstr "" #: prewikka/views/idmefnav/__init__.py:44 msgid "Help" msgstr "Помощь" #: prewikka/views/idmefnav/templates/idmefnav.mak:12 msgid "Children" msgstr "" #: prewikka/views/idmefnav/templates/idmefnav.mak:20 #, fuzzy msgid "Aggregates" msgstr "Событие корреляции" #: prewikka/views/idmefnav/templates/idmefnav.mak:36 msgid "Attributes" msgstr "" #: prewikka/views/idmefnav/templates/idmefnav.mak:54 msgid "Rank" msgstr "" #: prewikka/views/idmefnav/templates/idmefnav.mak:55 msgid "Keyword" msgstr "" #: prewikka/views/messagesummary/__init__.py:13 msgid "Detailed alert and heartbeat page" msgstr "Детализированная страница событий и событий состояния" #: prewikka/views/messagesummary/messagesummary.py:289 #: prewikka/views/messagesummary/messagesummary.py:578 msgid "Code" msgstr "Код" #: prewikka/views/messagesummary/messagesummary.py:290 msgid "Data length" msgstr "Длина данных" #: prewikka/views/messagesummary/messagesummary.py:291 msgid "Data" msgstr "Данные" #: prewikka/views/messagesummary/messagesummary.py:365 #, python-format msgid "(agent local time: %s)" msgstr "(Локальное время сенсора: %s)" #: prewikka/views/messagesummary/messagesummary.py:372 #: prewikka/views/messagesummary/messagesummary.py:835 msgid "Create time" msgstr "Время создания" #: prewikka/views/messagesummary/messagesummary.py:375 msgid "Detect time" msgstr "Время обнаружения" #: prewikka/views/messagesummary/messagesummary.py:380 msgid "Analyzer time" msgstr "Время анализатора" #: prewikka/views/messagesummary/messagesummary.py:386 msgid "Process" msgstr "Процесс" #: prewikka/views/messagesummary/messagesummary.py:387 msgid "Process Path" msgstr "Путь процесса" #: prewikka/views/messagesummary/messagesummary.py:388 msgid "Process PID" msgstr "PID процесса" #: prewikka/views/messagesummary/messagesummary.py:415 msgid "Node name (resolved)" msgstr "Имя узла" #: prewikka/views/messagesummary/messagesummary.py:426 msgid "Analyzerid" msgstr "Идентификатор анализатора" #: prewikka/views/messagesummary/messagesummary.py:430 msgid "Manufacturer" msgstr "Производитель" #: prewikka/views/messagesummary/messagesummary.py:438 msgid "Operating System" msgstr "Операционная система" #: prewikka/views/messagesummary/messagesummary.py:456 #, python-format msgid "Analyzer Path (%d not shown)" msgstr "Путь анализатора (%d не показан)" #: prewikka/views/messagesummary/messagesummary.py:463 #: prewikka/views/messagesummary/messagesummary.py:1035 #: prewikka/views/messagesummary/messagesummary.py:1106 #, python-format msgid "Analyzer #%d" msgstr "Анализатор #%d" #: prewikka/views/messagesummary/messagesummary.py:473 msgid "Additional data" msgstr "Дополнительные данные" #: prewikka/views/messagesummary/messagesummary.py:476 #: prewikka/views/messagesummary/messagesummary.py:717 msgid "Meaning" msgstr "Смысл" #: prewikka/views/messagesummary/messagesummary.py:477 msgid "Value" msgstr "Значение" #: prewikka/views/messagesummary/messagesummary.py:531 #: prewikka/views/messagesummary/messagesummary.py:552 msgid "Header length" msgstr "Длина заголовка" #: prewikka/views/messagesummary/messagesummary.py:532 msgid "TOS" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:533 #: prewikka/views/messagesummary/messagesummary.py:571 msgid "Length" msgstr "Длина" #: prewikka/views/messagesummary/messagesummary.py:534 #: prewikka/views/messagesummary/messagesummary.py:580 msgid "Id" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:538 msgid "Ip offset" msgstr "Смещение Ip" #: prewikka/views/messagesummary/messagesummary.py:539 msgid "TTL" msgstr "TTL" #: prewikka/views/messagesummary/messagesummary.py:540 #: prewikka/views/messagesummary/messagesummary.py:926 #: prewikka/views/messagesummary/messagesummary.py:929 #: prewikka/views/messagesummary/messagesummary.py:932 msgid "Protocol" msgstr "Протокол" #: prewikka/views/messagesummary/messagesummary.py:541 #: prewikka/views/messagesummary/messagesummary.py:563 #: prewikka/views/messagesummary/messagesummary.py:572 #: prewikka/views/messagesummary/messagesummary.py:579 msgid "Checksum" msgstr "Контрольная сумма" #: prewikka/views/messagesummary/messagesummary.py:542 msgid "Source address" msgstr "Адрес источника" #: prewikka/views/messagesummary/messagesummary.py:543 msgid "Target address" msgstr "Адрес назначения" #: prewikka/views/messagesummary/messagesummary.py:553 msgid "Reserved" msgstr "Зарезервировано" #: prewikka/views/messagesummary/messagesummary.py:562 msgid "Window" msgstr "Окно" #: prewikka/views/messagesummary/messagesummary.py:564 msgid "URP" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:577 #: prewikka/views/messagesummary/messagesummary.py:744 #: prewikka/views/messagesummary/messagesummary.py:777 #: prewikka/views/messagesummary/messagesummary.py:796 msgid "Type" msgstr "Тип" #: prewikka/views/messagesummary/messagesummary.py:581 msgid "Seq #" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:582 msgid "Mask" msgstr "Маска" #: prewikka/views/messagesummary/messagesummary.py:583 msgid "Gateway Address" msgstr "Адрес шлюза" #: prewikka/views/messagesummary/messagesummary.py:584 msgid "Num address" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:585 msgid "Wpa" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:586 msgid "Lifetime" msgstr "Время жизни" #: prewikka/views/messagesummary/messagesummary.py:587 msgid "Otime" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:588 msgid "Rtime" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:589 msgid "Ttime" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:595 #: prewikka/views/messagesummary/messagesummary.py:1082 msgid "Payload" msgstr "Полезная нагрузка" #: prewikka/views/messagesummary/messagesummary.py:648 msgid "Alert details" msgstr "Сигналы тревоги" #: prewikka/views/messagesummary/messagesummary.py:653 #, python-format msgid "%d linked alerts missing (probably deleted)" msgstr "%d связанных событий отсутствует (вероятно удалено)" #: prewikka/views/messagesummary/messagesummary.py:657 #, fuzzy, python-format msgid "%d linked alerts omitted" msgstr "%d связанных событий отсутствует (вероятно удалено)" #: prewikka/views/messagesummary/messagesummary.py:674 #: prewikka/views/messagesummary/messagesummary.py:991 msgid "Correlation Alert" msgstr "Событие корреляции" #: prewikka/views/messagesummary/messagesummary.py:680 msgid "Correlated Alerts" msgstr "Событие корреляции" #: prewikka/views/messagesummary/messagesummary.py:681 #: prewikka/views/messagesummary/messagesummary.py:698 msgid "Source Analyzer" msgstr "Анализатор источника" #: prewikka/views/messagesummary/messagesummary.py:691 #: prewikka/views/messagesummary/messagesummary.py:994 msgid "Tool Alert" msgstr "Событие со средства защиты" #: prewikka/views/messagesummary/messagesummary.py:697 msgid "Linked Alerts" msgstr "Связанноые события" #: prewikka/views/messagesummary/messagesummary.py:708 msgid "Text" msgstr "Текст" #: prewikka/views/messagesummary/messagesummary.py:710 msgid "Ident" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:715 msgid "Origin" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:738 msgid "Severity" msgstr "Важность" #: prewikka/views/messagesummary/messagesummary.py:741 msgid "Completion" msgstr "Завершенность" #: prewikka/views/messagesummary/messagesummary.py:774 msgid "User category" msgstr "Категория пользователя" #: prewikka/views/messagesummary/messagesummary.py:779 #: prewikka/views/messagesummary/messagesummary.py:798 msgid "Number" msgstr "Номер" #: prewikka/views/messagesummary/messagesummary.py:780 msgid "Tty" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:799 msgid "Permission" msgstr "Привилегии" #: prewikka/views/messagesummary/messagesummary.py:821 msgid "Change time" msgstr "Изменение времени" #: prewikka/views/messagesummary/messagesummary.py:822 msgid "Inode Number" msgstr "Номер inode" #: prewikka/views/messagesummary/messagesummary.py:823 msgid "Major device" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:824 msgid "Minor device" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:825 msgid "C Major device" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:826 msgid "C Minor device" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:830 #, python-format msgid "Target file %s" msgstr "Целевой файл %s" #: prewikka/views/messagesummary/messagesummary.py:830 msgid "category" msgstr "Категория" #: prewikka/views/messagesummary/messagesummary.py:834 msgid "Path" msgstr "Путь" #: prewikka/views/messagesummary/messagesummary.py:836 msgid "Modify time" msgstr "Время модификации" #: prewikka/views/messagesummary/messagesummary.py:837 msgid "Access time" msgstr "Время доступа" #: prewikka/views/messagesummary/messagesummary.py:838 msgid "Data size" msgstr "Размер данных" #: prewikka/views/messagesummary/messagesummary.py:839 msgid "Disk size" msgstr "Размер диска" #: prewikka/views/messagesummary/messagesummary.py:858 msgid "Web Service" msgstr "Web сервис" #: prewikka/views/messagesummary/messagesummary.py:861 msgid "Url" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:862 msgid "Cgi" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:863 msgid "Http Method" msgstr "Метод http" #: prewikka/views/messagesummary/messagesummary.py:866 msgid "CGI Argument" msgstr "Аргумент CGI" #: prewikka/views/messagesummary/messagesummary.py:875 msgid "SNMP Service" msgstr "SNMP-сервис" #: prewikka/views/messagesummary/messagesummary.py:878 msgid "oid" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:879 msgid "messageProcessingModel" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:880 msgid "securityModel" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:881 msgid "securityName" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:882 msgid "securityLevel" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:883 msgid "contextName" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:884 msgid "contextEngineID" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:885 msgid "command" msgstr "команда" #: prewikka/views/messagesummary/messagesummary.py:897 #: prewikka/views/messagesummary/messagesummary.py:899 msgid "Port" msgstr "Порт" #: prewikka/views/messagesummary/messagesummary.py:919 msgid "PortList" msgstr "Порт" #: prewikka/views/messagesummary/messagesummary.py:922 msgid "ip_version" msgstr "Версия" #: prewikka/views/messagesummary/messagesummary.py:958 #, python-format msgid "Source(%d)" msgstr "Источник(%d)" #: prewikka/views/messagesummary/messagesummary.py:973 #, python-format msgid "Target(%d)" msgstr "Цель(%d)" #: prewikka/views/messagesummary/messagesummary.py:997 msgid "Overflow Alert" msgstr "Событие переполнения" #: prewikka/views/messagesummary/messagesummary.py:1000 msgid "Alert" msgstr "Событие" #: prewikka/views/messagesummary/messagesummary.py:1018 msgid "MessageID" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:1065 msgid "Network centric information" msgstr "Информация об учетной записи" #: prewikka/views/messagesummary/messagesummary.py:1087 msgid "ASCII Payload" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:1103 msgid "Heartbeat" msgstr "события состояния" #: prewikka/views/messagesummary/templates/messagesummary.mak:85 msgid "Summary" msgstr "Итого" #: prewikka/views/usermanagement/__init__.py:14 msgid "User settings page" msgstr "Настройки" #: prewikka/views/usermanagement/usermanagement.py:18 msgid "My account" msgstr "Моя учетная запись" #: prewikka/views/usermanagement/usermanagement.py:23 msgid "Invalid User" msgstr "Неверный пользователь" #: prewikka/views/usermanagement/usermanagement.py:23 #, python-format msgid "Requested user '%s' does not exist" msgstr "запрощенный пользователь '%s' не существует" #: prewikka/views/usermanagement/usermanagement.py:43 msgid "Invalid Language" msgstr "Неверный язык" #: prewikka/views/usermanagement/usermanagement.py:43 msgid "Specified language does not exist" msgstr "Выбранный язык не существует" #: prewikka/views/usermanagement/usermanagement.py:47 msgid "Invalid Timezone" msgstr "неверная временная зона" #: prewikka/views/usermanagement/usermanagement.py:47 msgid "Specified timezone does not exist" msgstr "Выбранная временная зона не существует" #: prewikka/views/usermanagement/templates/usersettings.mak:6 msgid "Login:" msgstr "Имя пользователя:" #: prewikka/views/usermanagement/templates/usersettings.mak:20 msgid "Email:" msgstr "Эл. адрес:" #: prewikka/views/usermanagement/templates/usersettings.mak:22 msgid "Email" msgstr "Эл. адрес" #: prewikka/views/usermanagement/templates/usersettings.mak:27 msgid "Language:" msgstr "Язык:" #: prewikka/views/usermanagement/templates/usersettings.mak:39 msgid "Theme:" msgstr "Тема:" #: prewikka/views/usermanagement/templates/usersettings.mak:50 msgid "Timezone:" msgstr "Часовой пояс:" #: scripts/prewikka-cli:59 #, fuzzy msgid "Unknown command" msgstr "команда" #: scripts/prewikka-cli:67 #, python-format msgid "An unexpected error occurred: %s" msgstr "" #: scripts/prewikka-cli:154 msgid "Create an object of the specified type" msgstr "" #: scripts/prewikka-cli:157 msgid "Delete an object of the specified type" msgstr "" #: scripts/prewikka-cli:160 msgid "Import objects of the specified type from files" msgstr "" #: scripts/prewikka-cli:163 msgid "List objects of the specified type" msgstr "" #: scripts/prewikka-cli:166 msgid "Synchronize objects of the specified type" msgstr "" #: scripts/prewikka-cli:169 msgid "Update objects of the specified type" msgstr "" #: scripts/prewikka-cli:207 msgid "Prewikka command-line tool" msgstr "" #: scripts/prewikka-cli:208 msgid "name of the user" msgstr "" #: scripts/prewikka-cli:209 scripts/prewikka-crontab:99 #: scripts/prewikka-httpd:93 #, python-format msgid "configuration file to use (default: %(default)s)" msgstr "" #: scripts/prewikka-cli:210 msgid "command to execute" msgstr "" #: scripts/prewikka-cli:211 msgid "enable debugging output" msgstr "" #: scripts/prewikka-cli:218 msgid "prewikka-cli must be executed as the prewikka user" msgstr "" #: scripts/prewikka-cli:243 #, python-format msgid "Prewikka command-line tool (%s)" msgstr "" #: scripts/prewikka-cli:244 msgid "Type \"help\" or \"?\" to list commands" msgstr "" #: scripts/prewikka-crontab:100 msgid "run as a system daemon" msgstr "" #: scripts/prewikka-crontab:101 scripts/prewikka-httpd:96 msgid "show this help message and exit" msgstr "" #: scripts/prewikka-crontab:102 scripts/prewikka-httpd:97 msgid "show program's version number and exit" msgstr "" #: scripts/prewikka-httpd:88 msgid "root where the server is accessible" msgstr "" #: scripts/prewikka-httpd:89 #, python-format msgid "IP to bind to (default: %(default)s)" msgstr "" #: scripts/prewikka-httpd:90 #, python-format msgid "port number to use (default: %(default)d)" msgstr "" #: scripts/prewikka-httpd:91 msgid "SSL private key to use (default: no SSL)" msgstr "" #: scripts/prewikka-httpd:92 msgid "SSL certificate to use (default: no SSL)" msgstr "" #: scripts/prewikka-httpd:95 #, python-format msgid "" "number of processes to use. Default value matches the number of available" " CPUs (i.e. %d)" msgstr "" prewikka-5.1.1/prewikka/plugins/0000775000175000017500000000000013555143705020245 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/plugins/warning/0000775000175000017500000000000013555143705021712 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/plugins/warning/templates/0000775000175000017500000000000013555143705023710 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/plugins/warning/templates/warning.mak0000664000175000017500000000327213555143652026054 0ustar tandrejatandreja00000000000000<%! from prewikka.utils.html import Markup %> prewikka-5.1.1/prewikka/plugins/warning/__init__.py0000664000175000017500000000330213555143652024022 0ustar tandrejatandreja00000000000000# Copyright (C) 2015-2019 CS-SI. All Rights Reserved. # Author: Antoine Luong # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from __future__ import absolute_import, division, print_function, unicode_literals from prewikka import hookmanager, resource, template, version, view # FIXME: this really is a plugin and not a view. Implement dependencies subsystem class Warning(view.View): plugin_name = "Warning" plugin_author = version.__author__ plugin_license = version.__license__ plugin_version = version.__version__ plugin_copyright = version.__copyright__ plugin_description = N_("Prelude Warning message") _template = template.PrewikkaTemplate(__name__, "templates/warning.mak") @hookmanager.register("HOOK_LOAD_BODY_CONTENT") def _toplayout_extra_content(self): if not env.request.web.input_cookie.get("warning"): env.request.web.add_cookie("warning", "warning", 365 * 24 * 60 * 60) return [resource.HTMLSource(self._template.render())] prewikka-5.1.1/prewikka/plugins/__init__.py0000664000175000017500000000000013555143652022345 0ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/renderer/0000775000175000017500000000000013555143705020372 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/renderer/chartjs/0000775000175000017500000000000013555143705022030 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/renderer/chartjs/bar/0000775000175000017500000000000013555143705022574 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/renderer/chartjs/bar/__init__.py0000664000175000017500000000467413555143652024721 0ustar tandrejatandreja00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2018-2019 CS-SI. All Rights Reserved. # Author: Sélim Menouar # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. """ ChartJS bar plugin """ from .. import ChartJSRenderer from prewikka.renderer import RendererUtils, RendererNoDataException from prewikka import version class ChartJSBarPlugin(ChartJSRenderer): """ ChartJS bar plugin """ renderer_type = "bar" plugin_name = "ChartJS : Bar" plugin_author = version.__author__ plugin_license = version.__license__ plugin_version = version.__version__ plugin_copyright = version.__copyright__ plugin_description = N_("ChartJS Bar renderer type") def render(self, data, query=None, **kwargs): """ Return the HTML for this chart Keyword arguments: data -- List of tuple containing the data for this chart [(count, value, link), ] """ rutils = RendererUtils(kwargs) labels = [] bar_data = [] mapping = {} for count, value, link in data[0]: label = rutils.get_label(value) bar_data.append(count) labels.append(label) mapping[label] = link color = rutils.get_color(0) if not bar_data: raise RendererNoDataException options = { "labels": labels, "datasets": [{ "backgroundColor": self._rgba(color, 0.5), "borderColor": self._rgba(color, 0.8), "hoverBackgroundColor": self._rgba(color, 0.75), "hoverBorderColor": self._rgba(color, 1), "data": bar_data }] } return self.generate_html(kwargs, options, {"legend": {"display": False}}, "bar", mapping) prewikka-5.1.1/prewikka/renderer/chartjs/htdocs/0000775000175000017500000000000013555143705023314 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/renderer/chartjs/htdocs/js/0000775000175000017500000000000013555143705023730 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/renderer/chartjs/htdocs/js/Chart.min.js0000664000175000017500000046762613555143652026137 0ustar tandrejatandreja00000000000000/*! * Chart.js * http://chartjs.org/ * Version: 2.7.2 * * Copyright 2018 Chart.js Contributors * Released under the MIT license * https://github.com/chartjs/Chart.js/blob/master/LICENSE.md */ !function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).Chart=t()}}(function(){return function t(e,i,n){function a(r,s){if(!i[r]){if(!e[r]){var l="function"==typeof require&&require;if(!s&&l)return l(r,!0);if(o)return o(r,!0);var u=new Error("Cannot find module '"+r+"'");throw u.code="MODULE_NOT_FOUND",u}var d=i[r]={exports:{}};e[r][0].call(d.exports,function(t){var i=e[r][1][t];return a(i||t)},d,d.exports,t,e,i,n)}return i[r].exports}for(var o="function"==typeof require&&require,r=0;ri?(e+.05)/(i+.05):(i+.05)/(e+.05)},level:function(t){var e=this.contrast(t);return e>=7.1?"AAA":e>=4.5?"AA":""},dark:function(){var t=this.values.rgb;return(299*t[0]+587*t[1]+114*t[2])/1e3<128},light:function(){return!this.dark()},negate:function(){for(var t=[],e=0;e<3;e++)t[e]=255-this.values.rgb[e];return this.setValues("rgb",t),this},lighten:function(t){var e=this.values.hsl;return e[2]+=e[2]*t,this.setValues("hsl",e),this},darken:function(t){var e=this.values.hsl;return e[2]-=e[2]*t,this.setValues("hsl",e),this},saturate:function(t){var e=this.values.hsl;return e[1]+=e[1]*t,this.setValues("hsl",e),this},desaturate:function(t){var e=this.values.hsl;return e[1]-=e[1]*t,this.setValues("hsl",e),this},whiten:function(t){var e=this.values.hwb;return e[1]+=e[1]*t,this.setValues("hwb",e),this},blacken:function(t){var e=this.values.hwb;return e[2]+=e[2]*t,this.setValues("hwb",e),this},greyscale:function(){var t=this.values.rgb,e=.3*t[0]+.59*t[1]+.11*t[2];return this.setValues("rgb",[e,e,e]),this},clearer:function(t){var e=this.values.alpha;return this.setValues("alpha",e-e*t),this},opaquer:function(t){var e=this.values.alpha;return this.setValues("alpha",e+e*t),this},rotate:function(t){var e=this.values.hsl,i=(e[0]+t)%360;return e[0]=i<0?360+i:i,this.setValues("hsl",e),this},mix:function(t,e){var i=this,n=t,a=void 0===e?.5:e,o=2*a-1,r=i.alpha()-n.alpha(),s=((o*r==-1?o:(o+r)/(1+o*r))+1)/2,l=1-s;return this.rgb(s*i.red()+l*n.red(),s*i.green()+l*n.green(),s*i.blue()+l*n.blue()).alpha(i.alpha()*a+n.alpha()*(1-a))},toJSON:function(){return this.rgb()},clone:function(){var t,e,i=new o,n=this.values,a=i.values;for(var r in n)n.hasOwnProperty(r)&&(t=n[r],"[object Array]"===(e={}.toString.call(t))?a[r]=t.slice(0):"[object Number]"===e?a[r]=t:console.error("unexpected color value:",t));return i}},o.prototype.spaces={rgb:["red","green","blue"],hsl:["hue","saturation","lightness"],hsv:["hue","saturation","value"],hwb:["hue","whiteness","blackness"],cmyk:["cyan","magenta","yellow","black"]},o.prototype.maxes={rgb:[255,255,255],hsl:[360,100,100],hsv:[360,100,100],hwb:[360,100,100],cmyk:[100,100,100,100]},o.prototype.getValues=function(t){for(var e=this.values,i={},n=0;n.04045?Math.pow((e+.055)/1.055,2.4):e/12.92)+.3576*(i=i>.04045?Math.pow((i+.055)/1.055,2.4):i/12.92)+.1805*(n=n>.04045?Math.pow((n+.055)/1.055,2.4):n/12.92)),100*(.2126*e+.7152*i+.0722*n),100*(.0193*e+.1192*i+.9505*n)]}function d(t){var e=u(t),i=e[0],n=e[1],a=e[2];return n/=100,a/=108.883,i=(i/=95.047)>.008856?Math.pow(i,1/3):7.787*i+16/116,[116*(n=n>.008856?Math.pow(n,1/3):7.787*n+16/116)-16,500*(i-n),200*(n-(a=a>.008856?Math.pow(a,1/3):7.787*a+16/116))]}function c(t){var e,i,n,a,o,r=t[0]/360,s=t[1]/100,l=t[2]/100;if(0==s)return[o=255*l,o,o];e=2*l-(i=l<.5?l*(1+s):l+s-l*s),a=[0,0,0];for(var u=0;u<3;u++)(n=r+1/3*-(u-1))<0&&n++,n>1&&n--,o=6*n<1?e+6*(i-e)*n:2*n<1?i:3*n<2?e+(i-e)*(2/3-n)*6:e,a[u]=255*o;return a}function h(t){var e=t[0]/60,i=t[1]/100,n=t[2]/100,a=Math.floor(e)%6,o=e-Math.floor(e),r=255*n*(1-i),s=255*n*(1-i*o),l=255*n*(1-i*(1-o));n*=255;switch(a){case 0:return[n,l,r];case 1:return[s,n,r];case 2:return[r,n,l];case 3:return[r,s,n];case 4:return[l,r,n];case 5:return[n,r,s]}}function f(t){var e,i,n,a,o=t[0]/360,s=t[1]/100,l=t[2]/100,u=s+l;switch(u>1&&(s/=u,l/=u),n=6*o-(e=Math.floor(6*o)),0!=(1&e)&&(n=1-n),a=s+n*((i=1-l)-s),e){default:case 6:case 0:r=i,g=a,b=s;break;case 1:r=a,g=i,b=s;break;case 2:r=s,g=i,b=a;break;case 3:r=s,g=a,b=i;break;case 4:r=a,g=s,b=i;break;case 5:r=i,g=s,b=a}return[255*r,255*g,255*b]}function p(t){var e=t[0]/100,i=t[1]/100,n=t[2]/100,a=t[3]/100;return[255*(1-Math.min(1,e*(1-a)+a)),255*(1-Math.min(1,i*(1-a)+a)),255*(1-Math.min(1,n*(1-a)+a))]}function m(t){var e,i,n,a=t[0]/100,o=t[1]/100,r=t[2]/100;return i=-.9689*a+1.8758*o+.0415*r,n=.0557*a+-.204*o+1.057*r,e=(e=3.2406*a+-1.5372*o+-.4986*r)>.0031308?1.055*Math.pow(e,1/2.4)-.055:e*=12.92,i=i>.0031308?1.055*Math.pow(i,1/2.4)-.055:i*=12.92,n=n>.0031308?1.055*Math.pow(n,1/2.4)-.055:n*=12.92,[255*(e=Math.min(Math.max(0,e),1)),255*(i=Math.min(Math.max(0,i),1)),255*(n=Math.min(Math.max(0,n),1))]}function v(t){var e=t[0],i=t[1],n=t[2];return i/=100,n/=108.883,e=(e/=95.047)>.008856?Math.pow(e,1/3):7.787*e+16/116,[116*(i=i>.008856?Math.pow(i,1/3):7.787*i+16/116)-16,500*(e-i),200*(i-(n=n>.008856?Math.pow(n,1/3):7.787*n+16/116))]}function x(t){var e,i,n,a,o=t[0],r=t[1],s=t[2];return o<=8?a=(i=100*o/903.3)/100*7.787+16/116:(i=100*Math.pow((o+16)/116,3),a=Math.pow(i/100,1/3)),[e=e/95.047<=.008856?e=95.047*(r/500+a-16/116)/7.787:95.047*Math.pow(r/500+a,3),i,n=n/108.883<=.008859?n=108.883*(a-s/200-16/116)/7.787:108.883*Math.pow(a-s/200,3)]}function y(t){var e,i=t[0],n=t[1],a=t[2];return(e=360*Math.atan2(a,n)/2/Math.PI)<0&&(e+=360),[i,Math.sqrt(n*n+a*a),e]}function k(t){return m(x(t))}function M(t){var e,i=t[0],n=t[1];return e=t[2]/360*2*Math.PI,[i,n*Math.cos(e),n*Math.sin(e)]}function w(t){return S[t]}e.exports={rgb2hsl:n,rgb2hsv:a,rgb2hwb:o,rgb2cmyk:s,rgb2keyword:l,rgb2xyz:u,rgb2lab:d,rgb2lch:function(t){return y(d(t))},hsl2rgb:c,hsl2hsv:function(t){var e=t[0],i=t[1]/100,n=t[2]/100;if(0===n)return[0,0,0];return[e,100*(2*(i*=(n*=2)<=1?n:2-n)/(n+i)),100*((n+i)/2)]},hsl2hwb:function(t){return o(c(t))},hsl2cmyk:function(t){return s(c(t))},hsl2keyword:function(t){return l(c(t))},hsv2rgb:h,hsv2hsl:function(t){var e,i,n=t[0],a=t[1]/100,o=t[2]/100;return e=a*o,[n,100*(e=(e/=(i=(2-a)*o)<=1?i:2-i)||0),100*(i/=2)]},hsv2hwb:function(t){return o(h(t))},hsv2cmyk:function(t){return s(h(t))},hsv2keyword:function(t){return l(h(t))},hwb2rgb:f,hwb2hsl:function(t){return n(f(t))},hwb2hsv:function(t){return a(f(t))},hwb2cmyk:function(t){return s(f(t))},hwb2keyword:function(t){return l(f(t))},cmyk2rgb:p,cmyk2hsl:function(t){return n(p(t))},cmyk2hsv:function(t){return a(p(t))},cmyk2hwb:function(t){return o(p(t))},cmyk2keyword:function(t){return l(p(t))},keyword2rgb:w,keyword2hsl:function(t){return n(w(t))},keyword2hsv:function(t){return a(w(t))},keyword2hwb:function(t){return o(w(t))},keyword2cmyk:function(t){return s(w(t))},keyword2lab:function(t){return d(w(t))},keyword2xyz:function(t){return u(w(t))},xyz2rgb:m,xyz2lab:v,xyz2lch:function(t){return y(v(t))},lab2xyz:x,lab2rgb:k,lab2lch:y,lch2lab:M,lch2xyz:function(t){return x(M(t))},lch2rgb:function(t){return k(M(t))}};var S={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},C={};for(var _ in S)C[JSON.stringify(S[_])]=_},{}],5:[function(t,e,i){var n=t(4),a=function(){return new u};for(var o in n){a[o+"Raw"]=function(t){return function(e){return"number"==typeof e&&(e=Array.prototype.slice.call(arguments)),n[t](e)}}(o);var r=/(\w+)2(\w+)/.exec(o),s=r[1],l=r[2];(a[s]=a[s]||{})[l]=a[o]=function(t){return function(e){"number"==typeof e&&(e=Array.prototype.slice.call(arguments));var i=n[t](e);if("string"==typeof i||void 0===i)return i;for(var a=0;a0&&(t[0].yLabel?i=t[0].yLabel:e.labels.length>0&&t[0].index0?Math.min(r,n-i):r,i=n;return r}(i,u):-1,pixels:u,start:s,end:l,stackCount:n,scale:i}},calculateBarValuePixels:function(t,e){var i,n,a,o,r,s,l=this.chart,u=this.getMeta(),d=this.getValueScale(),c=l.data.datasets,h=d.getRightValue(c[t].data[e]),f=d.options.stacked,g=u.stack,p=0;if(f||void 0===f&&void 0!==g)for(i=0;i=0&&a>0)&&(p+=a));return o=d.getPixelForValue(p),{size:s=((r=d.getPixelForValue(p+h))-o)/2,base:o,head:r,center:r+s/2}},calculateBarIndexPixels:function(t,e,i){var n,a,r,s,l,u,d,c,h,f,g,p,m,v,b,x,y,k=i.scale.options,M="flex"===k.barThickness?(h=e,g=k,m=(f=i).pixels,v=m[h],b=h>0?m[h-1]:null,x=h');var i=t.data,n=i.datasets,a=i.labels;if(n.length)for(var o=0;o'),a[o]&&e.push(a[o]),e.push("");return e.push(""),e.join("")},legend:{labels:{generateLabels:function(t){var e=t.data;return e.labels.length&&e.datasets.length?e.labels.map(function(i,n){var a=t.getDatasetMeta(0),r=e.datasets[0],s=a.data[n],l=s&&s.custom||{},u=o.valueAtIndexOrDefault,d=t.options.elements.arc;return{text:i,fillStyle:l.backgroundColor?l.backgroundColor:u(r.backgroundColor,n,d.backgroundColor),strokeStyle:l.borderColor?l.borderColor:u(r.borderColor,n,d.borderColor),lineWidth:l.borderWidth?l.borderWidth:u(r.borderWidth,n,d.borderWidth),hidden:isNaN(r.data[n])||a.data[n].hidden,index:n}}):[]}},onClick:function(t,e){var i,n,a,o=e.index,r=this.chart;for(i=0,n=(r.data.datasets||[]).length;i=Math.PI?-1:g<-Math.PI?1:0))+f,m=Math.cos(g),v=Math.sin(g),b=Math.cos(p),x=Math.sin(p),y=g<=0&&p>=0||g<=2*Math.PI&&2*Math.PI<=p,k=g<=.5*Math.PI&&.5*Math.PI<=p||g<=2.5*Math.PI&&2.5*Math.PI<=p,M=g<=-Math.PI&&-Math.PI<=p||g<=Math.PI&&Math.PI<=p,w=g<=.5*-Math.PI&&.5*-Math.PI<=p||g<=1.5*Math.PI&&1.5*Math.PI<=p,S=h/100,C=M?-1:Math.min(m*(m<0?1:S),b*(b<0?1:S)),_=w?-1:Math.min(v*(v<0?1:S),x*(x<0?1:S)),D=y?1:Math.max(m*(m>0?1:S),b*(b>0?1:S)),I=k?1:Math.max(v*(v>0?1:S),x*(x>0?1:S)),P=.5*(D-C),A=.5*(I-_);u=Math.min(s/P,l/A),d={x:-.5*(D+C),y:-.5*(I+_)}}i.borderWidth=e.getMaxBorderWidth(c.data),i.outerRadius=Math.max((u-i.borderWidth)/2,0),i.innerRadius=Math.max(h?i.outerRadius/100*h:0,0),i.radiusLength=(i.outerRadius-i.innerRadius)/i.getVisibleDatasetCount(),i.offsetX=d.x*i.outerRadius,i.offsetY=d.y*i.outerRadius,c.total=e.calculateTotal(),e.outerRadius=i.outerRadius-i.radiusLength*e.getRingIndex(e.index),e.innerRadius=Math.max(e.outerRadius-i.radiusLength,0),o.each(c.data,function(i,n){e.updateElement(i,n,t)})},updateElement:function(t,e,i){var n=this,a=n.chart,r=a.chartArea,s=a.options,l=s.animation,u=(r.left+r.right)/2,d=(r.top+r.bottom)/2,c=s.rotation,h=s.rotation,f=n.getDataset(),g=i&&l.animateRotate?0:t.hidden?0:n.calculateCircumference(f.data[e])*(s.circumference/(2*Math.PI)),p=i&&l.animateScale?0:n.innerRadius,m=i&&l.animateScale?0:n.outerRadius,v=o.valueAtIndexOrDefault;o.extend(t,{_datasetIndex:n.index,_index:e,_model:{x:u+a.offsetX,y:d+a.offsetY,startAngle:c,endAngle:h,circumference:g,outerRadius:m,innerRadius:p,label:v(f.label,e,a.data.labels[e])}});var b=t._model;this.removeHoverStyle(t),i&&l.animateRotate||(b.startAngle=0===e?s.rotation:n.getMeta().data[e-1]._model.endAngle,b.endAngle=b.startAngle+b.circumference),t.pivot()},removeHoverStyle:function(e){t.DatasetController.prototype.removeHoverStyle.call(this,e,this.chart.options.elements.arc)},calculateTotal:function(){var t,e=this.getDataset(),i=this.getMeta(),n=0;return o.each(i.data,function(i,a){t=e.data[a],isNaN(t)||i.hidden||(n+=Math.abs(t))}),n},calculateCircumference:function(t){var e=this.getMeta().total;return e>0&&!isNaN(t)?2*Math.PI*(Math.abs(t)/e):0},getMaxBorderWidth:function(t){for(var e,i,n=0,a=this.index,o=t.length,r=0;r(n=e>n?e:n)?i:n;return n}})}},{25:25,40:40,45:45}],18:[function(t,e,i){"use strict";var n=t(25),a=t(40),o=t(45);n._set("line",{showLines:!0,spanGaps:!1,hover:{mode:"label"},scales:{xAxes:[{type:"category",id:"x-axis-0"}],yAxes:[{type:"linear",id:"y-axis-0"}]}}),e.exports=function(t){function e(t,e){return o.valueOrDefault(t.showLine,e.showLines)}t.controllers.line=t.DatasetController.extend({datasetElementType:a.Line,dataElementType:a.Point,update:function(t){var i,n,a,r=this,s=r.getMeta(),l=s.dataset,u=s.data||[],d=r.chart.options,c=d.elements.line,h=r.getScaleForId(s.yAxisID),f=r.getDataset(),g=e(f,d);for(g&&(a=l.custom||{},void 0!==f.tension&&void 0===f.lineTension&&(f.lineTension=f.tension),l._scale=h,l._datasetIndex=r.index,l._children=u,l._model={spanGaps:f.spanGaps?f.spanGaps:d.spanGaps,tension:a.tension?a.tension:o.valueOrDefault(f.lineTension,c.tension),backgroundColor:a.backgroundColor?a.backgroundColor:f.backgroundColor||c.backgroundColor,borderWidth:a.borderWidth?a.borderWidth:f.borderWidth||c.borderWidth,borderColor:a.borderColor?a.borderColor:f.borderColor||c.borderColor,borderCapStyle:a.borderCapStyle?a.borderCapStyle:f.borderCapStyle||c.borderCapStyle,borderDash:a.borderDash?a.borderDash:f.borderDash||c.borderDash,borderDashOffset:a.borderDashOffset?a.borderDashOffset:f.borderDashOffset||c.borderDashOffset,borderJoinStyle:a.borderJoinStyle?a.borderJoinStyle:f.borderJoinStyle||c.borderJoinStyle,fill:a.fill?a.fill:void 0!==f.fill?f.fill:c.fill,steppedLine:a.steppedLine?a.steppedLine:o.valueOrDefault(f.steppedLine,c.stepped),cubicInterpolationMode:a.cubicInterpolationMode?a.cubicInterpolationMode:o.valueOrDefault(f.cubicInterpolationMode,c.cubicInterpolationMode)},l.pivot()),i=0,n=u.length;i');var i=t.data,n=i.datasets,a=i.labels;if(n.length)for(var o=0;o'),a[o]&&e.push(a[o]),e.push("");return e.push(""),e.join("")},legend:{labels:{generateLabels:function(t){var e=t.data;return e.labels.length&&e.datasets.length?e.labels.map(function(i,n){var a=t.getDatasetMeta(0),r=e.datasets[0],s=a.data[n].custom||{},l=o.valueAtIndexOrDefault,u=t.options.elements.arc;return{text:i,fillStyle:s.backgroundColor?s.backgroundColor:l(r.backgroundColor,n,u.backgroundColor),strokeStyle:s.borderColor?s.borderColor:l(r.borderColor,n,u.borderColor),lineWidth:s.borderWidth?s.borderWidth:l(r.borderWidth,n,u.borderWidth),hidden:isNaN(r.data[n])||a.data[n].hidden,index:n}}):[]}},onClick:function(t,e){var i,n,a,o=e.index,r=this.chart;for(i=0,n=(r.data.datasets||[]).length;i0&&!isNaN(t)?2*Math.PI/e:0}})}},{25:25,40:40,45:45}],20:[function(t,e,i){"use strict";var n=t(25),a=t(40),o=t(45);n._set("radar",{scale:{type:"radialLinear"},elements:{line:{tension:0}}}),e.exports=function(t){t.controllers.radar=t.DatasetController.extend({datasetElementType:a.Line,dataElementType:a.Point,linkScales:o.noop,update:function(t){var e=this,i=e.getMeta(),n=i.dataset,a=i.data,r=n.custom||{},s=e.getDataset(),l=e.chart.options.elements.line,u=e.chart.scale;void 0!==s.tension&&void 0===s.lineTension&&(s.lineTension=s.tension),o.extend(i.dataset,{_datasetIndex:e.index,_scale:u,_children:a,_loop:!0,_model:{tension:r.tension?r.tension:o.valueOrDefault(s.lineTension,l.tension),backgroundColor:r.backgroundColor?r.backgroundColor:s.backgroundColor||l.backgroundColor,borderWidth:r.borderWidth?r.borderWidth:s.borderWidth||l.borderWidth,borderColor:r.borderColor?r.borderColor:s.borderColor||l.borderColor,fill:r.fill?r.fill:void 0!==s.fill?s.fill:l.fill,borderCapStyle:r.borderCapStyle?r.borderCapStyle:s.borderCapStyle||l.borderCapStyle,borderDash:r.borderDash?r.borderDash:s.borderDash||l.borderDash,borderDashOffset:r.borderDashOffset?r.borderDashOffset:s.borderDashOffset||l.borderDashOffset,borderJoinStyle:r.borderJoinStyle?r.borderJoinStyle:s.borderJoinStyle||l.borderJoinStyle}}),i.dataset.pivot(),o.each(a,function(i,n){e.updateElement(i,n,t)},e),e.updateBezierControlPoints()},updateElement:function(t,e,i){var n=this,a=t.custom||{},r=n.getDataset(),s=n.chart.scale,l=n.chart.options.elements.point,u=s.getPointPositionForValue(e,r.data[e]);void 0!==r.radius&&void 0===r.pointRadius&&(r.pointRadius=r.radius),void 0!==r.hitRadius&&void 0===r.pointHitRadius&&(r.pointHitRadius=r.hitRadius),o.extend(t,{_datasetIndex:n.index,_index:e,_scale:s,_model:{x:i?s.xCenter:u.x,y:i?s.yCenter:u.y,tension:a.tension?a.tension:o.valueOrDefault(r.lineTension,n.chart.options.elements.line.tension),radius:a.radius?a.radius:o.valueAtIndexOrDefault(r.pointRadius,e,l.radius),backgroundColor:a.backgroundColor?a.backgroundColor:o.valueAtIndexOrDefault(r.pointBackgroundColor,e,l.backgroundColor),borderColor:a.borderColor?a.borderColor:o.valueAtIndexOrDefault(r.pointBorderColor,e,l.borderColor),borderWidth:a.borderWidth?a.borderWidth:o.valueAtIndexOrDefault(r.pointBorderWidth,e,l.borderWidth),pointStyle:a.pointStyle?a.pointStyle:o.valueAtIndexOrDefault(r.pointStyle,e,l.pointStyle),hitRadius:a.hitRadius?a.hitRadius:o.valueAtIndexOrDefault(r.pointHitRadius,e,l.hitRadius)}}),t._model.skip=a.skip?a.skip:isNaN(t._model.x)||isNaN(t._model.y)},updateBezierControlPoints:function(){var t=this.chart.chartArea,e=this.getMeta();o.each(e.data,function(i,n){var a=i._model,r=o.splineCurve(o.previousItem(e.data,n,!0)._model,a,o.nextItem(e.data,n,!0)._model,a.tension);a.controlPointPreviousX=Math.max(Math.min(r.previous.x,t.right),t.left),a.controlPointPreviousY=Math.max(Math.min(r.previous.y,t.bottom),t.top),a.controlPointNextX=Math.max(Math.min(r.next.x,t.right),t.left),a.controlPointNextY=Math.max(Math.min(r.next.y,t.bottom),t.top),i.pivot()})},setHoverStyle:function(t){var e=this.chart.data.datasets[t._datasetIndex],i=t.custom||{},n=t._index,a=t._model;a.radius=i.hoverRadius?i.hoverRadius:o.valueAtIndexOrDefault(e.pointHoverRadius,n,this.chart.options.elements.point.hoverRadius),a.backgroundColor=i.hoverBackgroundColor?i.hoverBackgroundColor:o.valueAtIndexOrDefault(e.pointHoverBackgroundColor,n,o.getHoverColor(a.backgroundColor)),a.borderColor=i.hoverBorderColor?i.hoverBorderColor:o.valueAtIndexOrDefault(e.pointHoverBorderColor,n,o.getHoverColor(a.borderColor)),a.borderWidth=i.hoverBorderWidth?i.hoverBorderWidth:o.valueAtIndexOrDefault(e.pointHoverBorderWidth,n,a.borderWidth)},removeHoverStyle:function(t){var e=this.chart.data.datasets[t._datasetIndex],i=t.custom||{},n=t._index,a=t._model,r=this.chart.options.elements.point;a.radius=i.radius?i.radius:o.valueAtIndexOrDefault(e.pointRadius,n,r.radius),a.backgroundColor=i.backgroundColor?i.backgroundColor:o.valueAtIndexOrDefault(e.pointBackgroundColor,n,r.backgroundColor),a.borderColor=i.borderColor?i.borderColor:o.valueAtIndexOrDefault(e.pointBorderColor,n,r.borderColor),a.borderWidth=i.borderWidth?i.borderWidth:o.valueAtIndexOrDefault(e.pointBorderWidth,n,r.borderWidth)}})}},{25:25,40:40,45:45}],21:[function(t,e,i){"use strict";t(25)._set("scatter",{hover:{mode:"single"},scales:{xAxes:[{id:"x-axis-1",type:"linear",position:"bottom"}],yAxes:[{id:"y-axis-1",type:"linear",position:"left"}]},showLines:!1,tooltips:{callbacks:{title:function(){return""},label:function(t){return"("+t.xLabel+", "+t.yLabel+")"}}}}),e.exports=function(t){t.controllers.scatter=t.controllers.line}},{25:25}],22:[function(t,e,i){"use strict";var n=t(25),a=t(26),o=t(45);n._set("global",{animation:{duration:1e3,easing:"easeOutQuart",onProgress:o.noop,onComplete:o.noop}}),e.exports=function(t){t.Animation=a.extend({chart:null,currentStep:0,numSteps:60,easing:"",render:null,onAnimationProgress:null,onAnimationComplete:null}),t.animationService={frameDuration:17,animations:[],dropFrames:0,request:null,addAnimation:function(t,e,i,n){var a,o,r=this.animations;for(e.chart=t,n||(t.animating=!0),a=0,o=r.length;a1&&(i=Math.floor(t.dropFrames),t.dropFrames=t.dropFrames%1),t.advance(1+i);var n=Date.now();t.dropFrames+=(n-e)/t.frameDuration,t.animations.length>0&&t.requestAnimationFrame()},advance:function(t){for(var e,i,n=this.animations,a=0;a=e.numSteps?(o.callback(e.onAnimationComplete,[e],i),i.animating=!1,n.splice(a,1)):++a}},Object.defineProperty(t.Animation.prototype,"animationObject",{get:function(){return this}}),Object.defineProperty(t.Animation.prototype,"chartInstance",{get:function(){return this.chart},set:function(t){this.chart=t}})}},{25:25,26:26,45:45}],23:[function(t,e,i){"use strict";var n=t(25),a=t(45),o=t(28),r=t(30),s=t(48),l=t(31);e.exports=function(t){function e(t){return"top"===t||"bottom"===t}t.types={},t.instances={},t.controllers={},a.extend(t.prototype,{construct:function(e,i){var o,r,l=this;(r=(o=(o=i)||{}).data=o.data||{}).datasets=r.datasets||[],r.labels=r.labels||[],o.options=a.configMerge(n.global,n[o.type],o.options||{}),i=o;var u=s.acquireContext(e,i),d=u&&u.canvas,c=d&&d.height,h=d&&d.width;l.id=a.uid(),l.ctx=u,l.canvas=d,l.config=i,l.width=h,l.height=c,l.aspectRatio=c?h/c:null,l.options=i.options,l._bufferedRender=!1,l.chart=l,l.controller=l,t.instances[l.id]=l,Object.defineProperty(l,"data",{get:function(){return l.config.data},set:function(t){l.config.data=t}}),u&&d?(l.initialize(),l.update()):console.error("Failed to create chart: can't acquire context from the given item")},initialize:function(){var t=this;return l.notify(t,"beforeInit"),a.retinaScale(t,t.options.devicePixelRatio),t.bindEvents(),t.options.responsive&&t.resize(!0),t.ensureScalesHaveIDs(),t.buildOrUpdateScales(),t.initToolTip(),l.notify(t,"afterInit"),t},clear:function(){return a.canvas.clear(this),this},stop:function(){return t.animationService.cancelAnimation(this),this},resize:function(t){var e=this,i=e.options,n=e.canvas,o=i.maintainAspectRatio&&e.aspectRatio||null,r=Math.max(0,Math.floor(a.getMaximumWidth(n))),s=Math.max(0,Math.floor(o?r/o:a.getMaximumHeight(n)));if((e.width!==r||e.height!==s)&&(n.width=e.width=r,n.height=e.height=s,n.style.width=r+"px",n.style.height=s+"px",a.retinaScale(e,i.devicePixelRatio),!t)){var u={width:r,height:s};l.notify(e,"resize",[u]),e.options.onResize&&e.options.onResize(e,u),e.stop(),e.update(e.options.responsiveAnimationDuration)}},ensureScalesHaveIDs:function(){var t=this.options,e=t.scales||{},i=t.scale;a.each(e.xAxes,function(t,e){t.id=t.id||"x-axis-"+e}),a.each(e.yAxes,function(t,e){t.id=t.id||"y-axis-"+e}),i&&(i.id=i.id||"scale")},buildOrUpdateScales:function(){var i=this,n=i.options,o=i.scales||{},r=[],s=Object.keys(o).reduce(function(t,e){return t[e]=!1,t},{});n.scales&&(r=r.concat((n.scales.xAxes||[]).map(function(t){return{options:t,dtype:"category",dposition:"bottom"}}),(n.scales.yAxes||[]).map(function(t){return{options:t,dtype:"linear",dposition:"left"}}))),n.scale&&r.push({options:n.scale,dtype:"radialLinear",isDefault:!0,dposition:"chartArea"}),a.each(r,function(n){var r=n.options,l=r.id,u=a.valueOrDefault(r.type,n.dtype);e(r.position)!==e(n.dposition)&&(r.position=n.dposition),s[l]=!0;var d=null;if(l in o&&o[l].type===u)(d=o[l]).options=r,d.ctx=i.ctx,d.chart=i;else{var c=t.scaleService.getScaleConstructor(u);if(!c)return;d=new c({id:l,type:u,options:r,ctx:i.ctx,chart:i}),o[d.id]=d}d.mergeTicksOptions(),n.isDefault&&(i.scale=d)}),a.each(s,function(t,e){t||delete o[e]}),i.scales=o,t.scaleService.addScalesToLayout(this)},buildOrUpdateControllers:function(){var e=this,i=[],n=[];return a.each(e.data.datasets,function(a,o){var r=e.getDatasetMeta(o),s=a.type||e.config.type;if(r.type&&r.type!==s&&(e.destroyDatasetMeta(o),r=e.getDatasetMeta(o)),r.type=s,i.push(r.type),r.controller)r.controller.updateIndex(o),r.controller.linkScales();else{var l=t.controllers[r.type];if(void 0===l)throw new Error('"'+r.type+'" is not a chart type.');r.controller=new l(e,o),n.push(r.controller)}},e),n},resetElements:function(){var t=this;a.each(t.data.datasets,function(e,i){t.getDatasetMeta(i).controller.reset()},t)},reset:function(){this.resetElements(),this.tooltip.initialize()},update:function(e){var i,n,o=this;if(e&&"object"==typeof e||(e={duration:e,lazy:arguments[1]}),n=(i=o).options,a.each(i.scales,function(t){r.removeBox(i,t)}),n=a.configMerge(t.defaults.global,t.defaults[i.config.type],n),i.options=i.config.options=n,i.ensureScalesHaveIDs(),i.buildOrUpdateScales(),i.tooltip._options=n.tooltips,i.tooltip.initialize(),l._invalidate(o),!1!==l.notify(o,"beforeUpdate")){o.tooltip._data=o.data;var s=o.buildOrUpdateControllers();a.each(o.data.datasets,function(t,e){o.getDatasetMeta(e).controller.buildOrUpdateElements()},o),o.updateLayout(),o.options.animation&&o.options.animation.duration&&a.each(s,function(t){t.reset()}),o.updateDatasets(),o.tooltip.initialize(),o.lastActive=[],l.notify(o,"afterUpdate"),o._bufferedRender?o._bufferedRequest={duration:e.duration,easing:e.easing,lazy:e.lazy}:o.render(e)}},updateLayout:function(){!1!==l.notify(this,"beforeLayout")&&(r.update(this,this.width,this.height),l.notify(this,"afterScaleUpdate"),l.notify(this,"afterLayout"))},updateDatasets:function(){if(!1!==l.notify(this,"beforeDatasetsUpdate")){for(var t=0,e=this.data.datasets.length;t=0;--i)e.isDatasetVisible(i)&&e.drawDataset(i,t);l.notify(e,"afterDatasetsDraw",[t])}},drawDataset:function(t,e){var i=this.getDatasetMeta(t),n={meta:i,index:t,easingValue:e};!1!==l.notify(this,"beforeDatasetDraw",[n])&&(i.controller.draw(e),l.notify(this,"afterDatasetDraw",[n]))},_drawTooltip:function(t){var e=this.tooltip,i={tooltip:e,easingValue:t};!1!==l.notify(this,"beforeTooltipDraw",[i])&&(e.draw(),l.notify(this,"afterTooltipDraw",[i]))},getElementAtEvent:function(t){return o.modes.single(this,t)},getElementsAtEvent:function(t){return o.modes.label(this,t,{intersect:!0})},getElementsAtXAxis:function(t){return o.modes["x-axis"](this,t,{intersect:!0})},getElementsAtEventForMode:function(t,e,i){var n=o.modes[e];return"function"==typeof n?n(this,t,i):[]},getDatasetAtEvent:function(t){return o.modes.dataset(this,t,{intersect:!0})},getDatasetMeta:function(t){var e=this.data.datasets[t];e._meta||(e._meta={});var i=e._meta[this.id];return i||(i=e._meta[this.id]={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null}),i},getVisibleDatasetCount:function(){for(var t=0,e=0,i=this.data.datasets.length;e0||(e.forEach(function(e){delete t[e]}),delete t._chartjs)}}t.DatasetController=function(t,e){this.initialize(t,e)},n.extend(t.DatasetController.prototype,{datasetElementType:null,dataElementType:null,initialize:function(t,e){this.chart=t,this.index=e,this.linkScales(),this.addElements()},updateIndex:function(t){this.index=t},linkScales:function(){var t=this,e=t.getMeta(),i=t.getDataset();null!==e.xAxisID&&e.xAxisID in t.chart.scales||(e.xAxisID=i.xAxisID||t.chart.options.scales.xAxes[0].id),null!==e.yAxisID&&e.yAxisID in t.chart.scales||(e.yAxisID=i.yAxisID||t.chart.options.scales.yAxes[0].id)},getDataset:function(){return this.chart.data.datasets[this.index]},getMeta:function(){return this.chart.getDatasetMeta(this.index)},getScaleForId:function(t){return this.chart.scales[t]},reset:function(){this.update(!0)},destroy:function(){this._data&&i(this._data,this)},createMetaDataset:function(){var t=this.datasetElementType;return t&&new t({_chart:this.chart,_datasetIndex:this.index})},createMetaData:function(t){var e=this.dataElementType;return e&&new e({_chart:this.chart,_datasetIndex:this.index,_index:t})},addElements:function(){var t,e,i=this.getMeta(),n=this.getDataset().data||[],a=i.data;for(t=0,e=n.length;ti&&this.insertElements(i,n-i)},insertElements:function(t,e){for(var i=0;i=i[e].length&&i[e].push({}),!i[e][r].type||l.type&&l.type!==i[e][r].type?o.merge(i[e][r],[t.scaleService.getScaleDefaults(s),l]):o.merge(i[e][r],l)}else o._merger(e,i,n,a)}})},o.where=function(t,e){if(o.isArray(t)&&Array.prototype.filter)return t.filter(e);var i=[];return o.each(t,function(t){e(t)&&i.push(t)}),i},o.findIndex=Array.prototype.findIndex?function(t,e,i){return t.findIndex(e,i)}:function(t,e,i){i=void 0===i?t:i;for(var n=0,a=t.length;n=0;n--){var a=t[n];if(e(a))return a}},o.isNumber=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},o.almostEquals=function(t,e,i){return Math.abs(t-e)t},o.max=function(t){return t.reduce(function(t,e){return isNaN(e)?t:Math.max(t,e)},Number.NEGATIVE_INFINITY)},o.min=function(t){return t.reduce(function(t,e){return isNaN(e)?t:Math.min(t,e)},Number.POSITIVE_INFINITY)},o.sign=Math.sign?function(t){return Math.sign(t)}:function(t){return 0===(t=+t)||isNaN(t)?t:t>0?1:-1},o.log10=Math.log10?function(t){return Math.log10(t)}:function(t){var e=Math.log(t)*Math.LOG10E,i=Math.round(e);return t===Math.pow(10,i)?i:e},o.toRadians=function(t){return t*(Math.PI/180)},o.toDegrees=function(t){return t*(180/Math.PI)},o.getAngleFromPoint=function(t,e){var i=e.x-t.x,n=e.y-t.y,a=Math.sqrt(i*i+n*n),o=Math.atan2(n,i);return o<-.5*Math.PI&&(o+=2*Math.PI),{angle:o,distance:a}},o.distanceBetweenPoints=function(t,e){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))},o.aliasPixel=function(t){return t%2==0?0:.5},o.splineCurve=function(t,e,i,n){var a=t.skip?e:t,o=e,r=i.skip?e:i,s=Math.sqrt(Math.pow(o.x-a.x,2)+Math.pow(o.y-a.y,2)),l=Math.sqrt(Math.pow(r.x-o.x,2)+Math.pow(r.y-o.y,2)),u=s/(s+l),d=l/(s+l),c=n*(u=isNaN(u)?0:u),h=n*(d=isNaN(d)?0:d);return{previous:{x:o.x-c*(r.x-a.x),y:o.y-c*(r.y-a.y)},next:{x:o.x+h*(r.x-a.x),y:o.y+h*(r.y-a.y)}}},o.EPSILON=Number.EPSILON||1e-14,o.splineCurveMonotone=function(t){var e,i,n,a,r,s,l,u,d,c=(t||[]).map(function(t){return{model:t._model,deltaK:0,mK:0}}),h=c.length;for(e=0;e0?c[e-1]:null,(a=e0?c[e-1]:null,a=e=t.length-1?t[0]:t[e+1]:e>=t.length-1?t[t.length-1]:t[e+1]},o.previousItem=function(t,e,i){return i?e<=0?t[t.length-1]:t[e-1]:e<=0?t[0]:t[e-1]},o.niceNum=function(t,e){var i=Math.floor(o.log10(t)),n=t/Math.pow(10,i);return(e?n<1.5?1:n<3?2:n<7?5:10:n<=1?1:n<=2?2:n<=5?5:10)*Math.pow(10,i)},o.requestAnimFrame="undefined"==typeof window?function(t){t()}:window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){return window.setTimeout(t,1e3/60)},o.getRelativePosition=function(t,e){var i,n,a=t.originalEvent||t,r=t.currentTarget||t.srcElement,s=r.getBoundingClientRect(),l=a.touches;l&&l.length>0?(i=l[0].clientX,n=l[0].clientY):(i=a.clientX,n=a.clientY);var u=parseFloat(o.getStyle(r,"padding-left")),d=parseFloat(o.getStyle(r,"padding-top")),c=parseFloat(o.getStyle(r,"padding-right")),h=parseFloat(o.getStyle(r,"padding-bottom")),f=s.right-s.left-u-c,g=s.bottom-s.top-d-h;return{x:i=Math.round((i-s.left-u)/f*r.width/e.currentDevicePixelRatio),y:n=Math.round((n-s.top-d)/g*r.height/e.currentDevicePixelRatio)}},o.getConstraintWidth=function(t){return r(t,"max-width","clientWidth")},o.getConstraintHeight=function(t){return r(t,"max-height","clientHeight")},o.getMaximumWidth=function(t){var e=t.parentNode;if(!e)return t.clientWidth;var i=parseInt(o.getStyle(e,"padding-left"),10),n=parseInt(o.getStyle(e,"padding-right"),10),a=e.clientWidth-i-n,r=o.getConstraintWidth(t);return isNaN(r)?a:Math.min(a,r)},o.getMaximumHeight=function(t){var e=t.parentNode;if(!e)return t.clientHeight;var i=parseInt(o.getStyle(e,"padding-top"),10),n=parseInt(o.getStyle(e,"padding-bottom"),10),a=e.clientHeight-i-n,r=o.getConstraintHeight(t);return isNaN(r)?a:Math.min(a,r)},o.getStyle=function(t,e){return t.currentStyle?t.currentStyle[e]:document.defaultView.getComputedStyle(t,null).getPropertyValue(e)},o.retinaScale=function(t,e){var i=t.currentDevicePixelRatio=e||window.devicePixelRatio||1;if(1!==i){var n=t.canvas,a=t.height,o=t.width;n.height=a*i,n.width=o*i,t.ctx.scale(i,i),n.style.height||n.style.width||(n.style.height=a+"px",n.style.width=o+"px")}},o.fontString=function(t,e,i){return e+" "+t+"px "+i},o.longestText=function(t,e,i,n){var a=(n=n||{}).data=n.data||{},r=n.garbageCollect=n.garbageCollect||[];n.font!==e&&(a=n.data={},r=n.garbageCollect=[],n.font=e),t.font=e;var s=0;o.each(i,function(e){null!=e&&!0!==o.isArray(e)?s=o.measureText(t,a,r,s,e):o.isArray(e)&&o.each(e,function(e){null==e||o.isArray(e)||(s=o.measureText(t,a,r,s,e))})});var l=r.length/2;if(l>i.length){for(var u=0;un&&(n=o),n},o.numberOfLabelLines=function(t){var e=1;return o.each(t,function(t){o.isArray(t)&&t.length>e&&(e=t.length)}),e},o.color=n?function(t){return t instanceof CanvasGradient&&(t=a.global.defaultColor),n(t)}:function(t){return console.error("Color.js not found!"),t},o.getHoverColor=function(t){return t instanceof CanvasPattern?t:o.color(t).saturate(.5).darken(.1).rgbString()}}},{25:25,3:3,45:45}],28:[function(t,e,i){"use strict";var n=t(45);function a(t,e){return t.native?{x:t.x,y:t.y}:n.getRelativePosition(t,e)}function o(t,e){var i,n,a,o,r;for(n=0,o=t.data.datasets.length;n0&&(u=t.getDatasetMeta(u[0]._datasetIndex).data),u},"x-axis":function(t,e){return u(t,e,{intersect:!1})},point:function(t,e){return r(t,a(e,t))},nearest:function(t,e,i){var n=a(e,t);i.axis=i.axis||"xy";var o=l(i.axis),r=s(t,n,i.intersect,o);return r.length>1&&r.sort(function(t,e){var i=t.getArea()-e.getArea();return 0===i&&(i=t._datasetIndex-e._datasetIndex),i}),r.slice(0,1)},x:function(t,e,i){var n=a(e,t),r=[],s=!1;return o(t,function(t){t.inXRange(n.x)&&r.push(t),t.inRange(n.x,n.y)&&(s=!0)}),i.intersect&&!s&&(r=[]),r},y:function(t,e,i){var n=a(e,t),r=[],s=!1;return o(t,function(t){t.inYRange(n.y)&&r.push(t),t.inRange(n.x,n.y)&&(s=!0)}),i.intersect&&!s&&(r=[]),r}}}},{45:45}],29:[function(t,e,i){"use strict";t(25)._set("global",{responsive:!0,responsiveAnimationDuration:0,maintainAspectRatio:!0,events:["mousemove","mouseout","click","touchstart","touchmove"],hover:{onHover:null,mode:"nearest",intersect:!0,animationDuration:400},onClick:null,defaultColor:"rgba(0,0,0,0.1)",defaultFontColor:"#666",defaultFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",defaultFontSize:12,defaultFontStyle:"normal",showLines:!0,elements:{},layout:{padding:{top:0,right:0,bottom:0,left:0}}}),e.exports=function(){var t=function(t,e){return this.construct(t,e),this};return t.Chart=t,t}},{25:25}],30:[function(t,e,i){"use strict";var n=t(45);function a(t,e){return n.where(t,function(t){return t.position===e})}function o(t,e){t.forEach(function(t,e){return t._tmpIndex_=e,t}),t.sort(function(t,i){var n=e?i:t,a=e?t:i;return n.weight===a.weight?n._tmpIndex_-a._tmpIndex_:n.weight-a.weight}),t.forEach(function(t){delete t._tmpIndex_})}e.exports={defaults:{},addBox:function(t,e){t.boxes||(t.boxes=[]),e.fullWidth=e.fullWidth||!1,e.position=e.position||"top",e.weight=e.weight||0,t.boxes.push(e)},removeBox:function(t,e){var i=t.boxes?t.boxes.indexOf(e):-1;-1!==i&&t.boxes.splice(i,1)},configure:function(t,e,i){for(var n,a=["fullWidth","position","weight"],o=a.length,r=0;rh&&lt.maxHeight){l--;break}l++,c=u*d}t.labelRotation=l},afterCalculateTickRotation:function(){o.callback(this.options.afterCalculateTickRotation,[this])},beforeFit:function(){o.callback(this.options.beforeFit,[this])},fit:function(){var t=this,n=t.minSize={width:0,height:0},a=s(t._ticks),l=t.options,u=l.ticks,d=l.scaleLabel,c=l.gridLines,h=l.display,f=t.isHorizontal(),g=i(u),p=l.gridLines.tickMarkLength;if(n.width=f?t.isFullWidth()?t.maxWidth-t.margins.left-t.margins.right:t.maxWidth:h&&c.drawTicks?p:0,n.height=f?h&&c.drawTicks?p:0:t.maxHeight,d.display&&h){var m=r(d)+o.options.toPadding(d.padding).height;f?n.height+=m:n.width+=m}if(u.display&&h){var v=o.longestText(t.ctx,g.font,a,t.longestTextCache),b=o.numberOfLabelLines(a),x=.5*g.size,y=t.options.ticks.padding;if(f){t.longestLabelWidth=v;var k=o.toRadians(t.labelRotation),M=Math.cos(k),w=Math.sin(k)*v+g.size*b+x*(b-1)+x;n.height=Math.min(t.maxHeight,n.height+w+y),t.ctx.font=g.font;var S=e(t.ctx,a[0],g.font),C=e(t.ctx,a[a.length-1],g.font);0!==t.labelRotation?(t.paddingLeft="bottom"===l.position?M*S+3:M*x+3,t.paddingRight="bottom"===l.position?M*x+3:M*C+3):(t.paddingLeft=S/2+3,t.paddingRight=C/2+3)}else u.mirror?v=0:v+=y+x,n.width=Math.min(t.maxWidth,n.width+v),t.paddingTop=g.size/2,t.paddingBottom=g.size/2}t.handleMargins(),t.width=n.width,t.height=n.height},handleMargins:function(){var t=this;t.margins&&(t.paddingLeft=Math.max(t.paddingLeft-t.margins.left,0),t.paddingTop=Math.max(t.paddingTop-t.margins.top,0),t.paddingRight=Math.max(t.paddingRight-t.margins.right,0),t.paddingBottom=Math.max(t.paddingBottom-t.margins.bottom,0))},afterFit:function(){o.callback(this.options.afterFit,[this])},isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},isFullWidth:function(){return this.options.fullWidth},getRightValue:function(t){if(o.isNullOrUndef(t))return NaN;if("number"==typeof t&&!isFinite(t))return NaN;if(t)if(this.isHorizontal()){if(void 0!==t.x)return this.getRightValue(t.x)}else if(void 0!==t.y)return this.getRightValue(t.y);return t},getLabelForIndex:o.noop,getPixelForValue:o.noop,getValueForPixel:o.noop,getPixelForTick:function(t){var e=this,i=e.options.offset;if(e.isHorizontal()){var n=(e.width-(e.paddingLeft+e.paddingRight))/Math.max(e._ticks.length-(i?0:1),1),a=n*t+e.paddingLeft;i&&(a+=n/2);var o=e.left+Math.round(a);return o+=e.isFullWidth()?e.margins.left:0}var r=e.height-(e.paddingTop+e.paddingBottom);return e.top+t*(r/(e._ticks.length-1))},getPixelForDecimal:function(t){var e=this;if(e.isHorizontal()){var i=(e.width-(e.paddingLeft+e.paddingRight))*t+e.paddingLeft,n=e.left+Math.round(i);return n+=e.isFullWidth()?e.margins.left:0}return e.top+t*e.height},getBasePixel:function(){return this.getPixelForValue(this.getBaseValue())},getBaseValue:function(){var t=this.min,e=this.max;return this.beginAtZero?0:t<0&&e<0?e:t>0&&e>0?t:0},_autoSkip:function(t){var e,i,n,a,r=this,s=r.isHorizontal(),l=r.options.ticks.minor,u=t.length,d=o.toRadians(r.labelRotation),c=Math.cos(d),h=r.longestLabelWidth*c,f=[];for(l.maxTicksLimit&&(a=l.maxTicksLimit),s&&(e=!1,(h+l.autoSkipPadding)*u>r.width-(r.paddingLeft+r.paddingRight)&&(e=1+Math.floor((h+l.autoSkipPadding)*u/(r.width-(r.paddingLeft+r.paddingRight)))),a&&u>a&&(e=Math.max(e,Math.floor(u/a)))),i=0;i1&&i%e>0||i%e==0&&i+e>=u)&&i!==u-1&&delete n.label,f.push(n);return f},draw:function(t){var e=this,a=e.options;if(a.display){var s=e.ctx,u=n.global,d=a.ticks.minor,c=a.ticks.major||d,h=a.gridLines,f=a.scaleLabel,g=0!==e.labelRotation,p=e.isHorizontal(),m=d.autoSkip?e._autoSkip(e.getTicks()):e.getTicks(),v=o.valueOrDefault(d.fontColor,u.defaultFontColor),b=i(d),x=o.valueOrDefault(c.fontColor,u.defaultFontColor),y=i(c),k=h.drawTicks?h.tickMarkLength:0,M=o.valueOrDefault(f.fontColor,u.defaultFontColor),w=i(f),S=o.options.toPadding(f.padding),C=o.toRadians(e.labelRotation),_=[],D=e.options.gridLines.lineWidth,I="right"===a.position?e.right:e.right-D-k,P="right"===a.position?e.right+k:e.right,A="bottom"===a.position?e.top+D:e.bottom-k-D,T="bottom"===a.position?e.top+D+k:e.bottom+D;if(o.each(m,function(i,n){if(!o.isNullOrUndef(i.label)){var r,s,c,f,v,b,x,y,M,w,S,F,O,R,L=i.label;n===e.zeroLineIndex&&a.offset===h.offsetGridLines?(r=h.zeroLineWidth,s=h.zeroLineColor,c=h.zeroLineBorderDash,f=h.zeroLineBorderDashOffset):(r=o.valueAtIndexOrDefault(h.lineWidth,n),s=o.valueAtIndexOrDefault(h.color,n),c=o.valueOrDefault(h.borderDash,u.borderDash),f=o.valueOrDefault(h.borderDashOffset,u.borderDashOffset));var z="middle",B="middle",W=d.padding;if(p){var N=k+W;"bottom"===a.position?(B=g?"middle":"top",z=g?"right":"center",R=e.top+N):(B=g?"middle":"bottom",z=g?"left":"center",R=e.bottom-N);var V=l(e,n,h.offsetGridLines&&m.length>1);V1);j3?i[2]-i[1]:i[1]-i[0];Math.abs(a)>1&&t!==Math.floor(t)&&(a=t-Math.floor(t));var o=n.log10(Math.abs(a)),r="";if(0!==t){var s=-1*Math.floor(o);s=Math.max(Math.min(s,20),0),r=t.toFixed(s)}else r="0";return r},logarithmic:function(t,e,i){var a=t/Math.pow(10,Math.floor(n.log10(t)));return 0===t?"0":1===a||2===a||5===a||0===e||e===i.length-1?t.toExponential():""}}}},{45:45}],35:[function(t,e,i){"use strict";var n=t(25),a=t(26),o=t(45);n._set("global",{tooltips:{enabled:!0,custom:null,mode:"nearest",position:"average",intersect:!0,backgroundColor:"rgba(0,0,0,0.8)",titleFontStyle:"bold",titleSpacing:2,titleMarginBottom:6,titleFontColor:"#fff",titleAlign:"left",bodySpacing:2,bodyFontColor:"#fff",bodyAlign:"left",footerFontStyle:"bold",footerSpacing:2,footerMarginTop:6,footerFontColor:"#fff",footerAlign:"left",yPadding:6,xPadding:6,caretPadding:2,caretSize:5,cornerRadius:6,multiKeyBackground:"#fff",displayColors:!0,borderColor:"rgba(0,0,0,0)",borderWidth:0,callbacks:{beforeTitle:o.noop,title:function(t,e){var i="",n=e.labels,a=n?n.length:0;if(t.length>0){var o=t[0];o.xLabel?i=o.xLabel:a>0&&o.indexl.height-e.height&&(c="bottom");var h=(u.left+u.right)/2,f=(u.top+u.bottom)/2;"center"===c?(i=function(t){return t<=h},n=function(t){return t>h}):(i=function(t){return t<=e.width/2},n=function(t){return t>=l.width-e.width/2}),a=function(t){return t+e.width+s.caretSize+s.caretPadding>l.width},o=function(t){return t-e.width-s.caretSize-s.caretPadding<0},r=function(t){return t<=f?"top":"bottom"},i(s.x)?(d="left",a(s.x)&&(d="center",c=r(s.y))):n(s.x)&&(d="right",o(s.x)&&(d="center",c=r(s.y)));var g=t._options;return{xAlign:g.xAlign?g.xAlign:d,yAlign:g.yAlign?g.yAlign:c}}(this,F=function(t,e){var i=t._chart.ctx,n=2*e.yPadding,a=0,r=e.body,s=r.reduce(function(t,e){return t+e.before.length+e.lines.length+e.after.length},0);s+=e.beforeBody.length+e.afterBody.length;var l=e.title.length,u=e.footer.length,d=e.titleFontSize,c=e.bodyFontSize,h=e.footerFontSize;n+=l*d,n+=l?(l-1)*e.titleSpacing:0,n+=l?e.titleMarginBottom:0,n+=s*c,n+=s?(s-1)*e.bodySpacing:0,n+=u?e.footerMarginTop:0,n+=u*h,n+=u?(u-1)*e.footerSpacing:0;var f=0,g=function(t){a=Math.max(a,i.measureText(t).width+f)};return i.font=o.fontString(d,e._titleFontStyle,e._titleFontFamily),o.each(e.title,g),i.font=o.fontString(c,e._bodyFontStyle,e._bodyFontFamily),o.each(e.beforeBody.concat(e.afterBody),g),f=e.displayColors?c+2:0,o.each(r,function(t){o.each(t.before,g),o.each(t.lines,g),o.each(t.after,g)}),f=0,i.font=o.fontString(h,e._footerFontStyle,e._footerFontFamily),o.each(e.footer,g),{width:a+=2*e.xPadding,height:n}}(this,D)),a=D,s=F,l=A,u=S._chart,d=a.x,c=a.y,h=a.caretSize,f=a.caretPadding,g=a.cornerRadius,p=l.xAlign,m=l.yAlign,v=h+f,b=g+f,"right"===p?d-=s.width:"center"===p&&((d-=s.width/2)+s.width>u.width&&(d=u.width-s.width),d<0&&(d=0)),"top"===m?c+=v:c-="bottom"===m?s.height+v:s.height/2,"center"===m?"left"===p?d+=v:"right"===p&&(d-=v):"left"===p?d-=b:"right"===p&&(d+=b),T={x:d,y:c}}else D.opacity=0;return D.xAlign=A.xAlign,D.yAlign=A.yAlign,D.x=T.x,D.y=T.y,D.width=F.width,D.height=F.height,D.caretX=O.x,D.caretY=O.y,S._model=D,e&&C.custom&&C.custom.call(S,D),S},drawCaret:function(t,e){var i=this._chart.ctx,n=this._view,a=this.getCaretPosition(t,e,n);i.lineTo(a.x1,a.y1),i.lineTo(a.x2,a.y2),i.lineTo(a.x3,a.y3)},getCaretPosition:function(t,e,i){var n,a,o,r,s,l,u=i.caretSize,d=i.cornerRadius,c=i.xAlign,h=i.yAlign,f=t.x,g=t.y,p=e.width,m=e.height;if("center"===h)s=g+m/2,"left"===c?(a=(n=f)-u,o=n,r=s+u,l=s-u):(a=(n=f+p)+u,o=n,r=s-u,l=s+u);else if("left"===c?(n=(a=f+d+u)-u,o=a+u):"right"===c?(n=(a=f+p-d-u)-u,o=a+u):(n=(a=i.caretX)-u,o=a+u),"top"===h)s=(r=g)-u,l=r;else{s=(r=g+m)+u,l=r;var v=o;o=n,n=v}return{x1:n,x2:a,x3:o,y1:r,y2:s,y3:l}},drawTitle:function(t,i,n,a){var r=i.title;if(r.length){n.textAlign=i._titleAlign,n.textBaseline="top";var s,l,u=i.titleFontSize,d=i.titleSpacing;for(n.fillStyle=e(i.titleFontColor,a),n.font=o.fontString(u,i._titleFontStyle,i._titleFontFamily),s=0,l=r.length;s0&&n.stroke()},draw:function(){var t=this._chart.ctx,e=this._view;if(0!==e.opacity){var i={width:e.width,height:e.height},n={x:e.x,y:e.y},a=Math.abs(e.opacity<.001)?0:e.opacity,o=e.title.length||e.beforeBody.length||e.body.length||e.afterBody.length||e.footer.length;this._options.enabled&&o&&(this.drawBackground(n,e,t,i,a),n.x+=e.xPadding,n.y+=e.yPadding,this.drawTitle(n,e,t,a),this.drawBody(n,e,t,a),this.drawFooter(n,e,t,a))}},handleEvent:function(t){var e,i=this,n=i._options;return i._lastActive=i._lastActive||[],"mouseout"===t.type?i._active=[]:i._active=i._chart.getElementsAtEventForMode(t,n.mode,n),(e=!o.arrayEquals(i._active,i._lastActive))&&(i._lastActive=i._active,(n.enabled||n.custom)&&(i._eventPosition={x:t.x,y:t.y},i.update(!0),i.pivot())),e}}),t.Tooltip.positioners={average:function(t){if(!t.length)return!1;var e,i,n=0,a=0,o=0;for(e=0,i=t.length;el;)a-=2*Math.PI;for(;a=s&&a<=l,d=r>=i.innerRadius&&r<=i.outerRadius;return u&&d}return!1},getCenterPoint:function(){var t=this._view,e=(t.startAngle+t.endAngle)/2,i=(t.innerRadius+t.outerRadius)/2;return{x:t.x+Math.cos(e)*i,y:t.y+Math.sin(e)*i}},getArea:function(){var t=this._view;return Math.PI*((t.endAngle-t.startAngle)/(2*Math.PI))*(Math.pow(t.outerRadius,2)-Math.pow(t.innerRadius,2))},tooltipPosition:function(){var t=this._view,e=t.startAngle+(t.endAngle-t.startAngle)/2,i=(t.outerRadius-t.innerRadius)/2+t.innerRadius;return{x:t.x+Math.cos(e)*i,y:t.y+Math.sin(e)*i}},draw:function(){var t=this._chart.ctx,e=this._view,i=e.startAngle,n=e.endAngle;t.beginPath(),t.arc(e.x,e.y,e.outerRadius,i,n),t.arc(e.x,e.y,e.innerRadius,n,i,!0),t.closePath(),t.strokeStyle=e.borderColor,t.lineWidth=e.borderWidth,t.fillStyle=e.backgroundColor,t.fill(),t.lineJoin="bevel",e.borderWidth&&t.stroke()}})},{25:25,26:26,45:45}],37:[function(t,e,i){"use strict";var n=t(25),a=t(26),o=t(45),r=n.global;n._set("global",{elements:{line:{tension:.4,backgroundColor:r.defaultColor,borderWidth:3,borderColor:r.defaultColor,borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",capBezierPoints:!0,fill:!0}}}),e.exports=a.extend({draw:function(){var t,e,i,n,a=this._view,s=this._chart.ctx,l=a.spanGaps,u=this._children.slice(),d=r.elements.line,c=-1;for(this._loop&&u.length&&u.push(u[0]),s.save(),s.lineCap=a.borderCapStyle||d.borderCapStyle,s.setLineDash&&s.setLineDash(a.borderDash||d.borderDash),s.lineDashOffset=a.borderDashOffset||d.borderDashOffset,s.lineJoin=a.borderJoinStyle||d.borderJoinStyle,s.lineWidth=a.borderWidth||d.borderWidth,s.strokeStyle=a.borderColor||r.defaultColor,s.beginPath(),c=-1,t=0;tt?1:-1,o=1,r=l.borderSkipped||"left"):(t=l.x-l.width/2,e=l.x+l.width/2,i=l.y,a=1,o=(n=l.base)>i?1:-1,r=l.borderSkipped||"bottom"),u){var d=Math.min(Math.abs(t-e),Math.abs(i-n)),c=(u=u>d?d:u)/2,h=t+("left"!==r?c*a:0),f=e+("right"!==r?-c*a:0),g=i+("top"!==r?c*o:0),p=n+("bottom"!==r?-c*o:0);h!==f&&(i=g,n=p),g!==p&&(t=h,e=f)}s.beginPath(),s.fillStyle=l.backgroundColor,s.strokeStyle=l.borderColor,s.lineWidth=u;var m=[[t,n],[t,i],[e,i],[e,n]],v=["bottom","left","top","right"].indexOf(r,0);function b(t){return m[(v+t)%4]}-1===v&&(v=0);var x=b(0);s.moveTo(x[0],x[1]);for(var y=1;y<4;y++)x=b(y),s.lineTo(x[0],x[1]);s.fill(),u&&s.stroke()},height:function(){var t=this._view;return t.base-t.y},inRange:function(t,e){var i=!1;if(this._view){var n=r(this);i=t>=n.left&&t<=n.right&&e>=n.top&&e<=n.bottom}return i},inLabelRange:function(t,e){if(!this._view)return!1;var i=r(this);return o(this)?t>=i.left&&t<=i.right:e>=i.top&&e<=i.bottom},inXRange:function(t){var e=r(this);return t>=e.left&&t<=e.right},inYRange:function(t){var e=r(this);return t>=e.top&&t<=e.bottom},getCenterPoint:function(){var t,e,i=this._view;return o(this)?(t=i.x,e=(i.y+i.base)/2):(t=(i.x+i.base)/2,e=i.y),{x:t,y:e}},getArea:function(){var t=this._view;return t.width*Math.abs(t.y-t.base)},tooltipPosition:function(){var t=this._view;return{x:t.x,y:t.y}}})},{25:25,26:26}],40:[function(t,e,i){"use strict";e.exports={},e.exports.Arc=t(36),e.exports.Line=t(37),e.exports.Point=t(38),e.exports.Rectangle=t(39)},{36:36,37:37,38:38,39:39}],41:[function(t,e,i){"use strict";var n=t(42);i=e.exports={clear:function(t){t.ctx.clearRect(0,0,t.width,t.height)},roundedRect:function(t,e,i,n,a,o){if(o){var r=Math.min(o,n/2),s=Math.min(o,a/2);t.moveTo(e+r,i),t.lineTo(e+n-r,i),t.quadraticCurveTo(e+n,i,e+n,i+s),t.lineTo(e+n,i+a-s),t.quadraticCurveTo(e+n,i+a,e+n-r,i+a),t.lineTo(e+r,i+a),t.quadraticCurveTo(e,i+a,e,i+a-s),t.lineTo(e,i+s),t.quadraticCurveTo(e,i,e+r,i)}else t.rect(e,i,n,a)},drawPoint:function(t,e,i,n,a){var o,r,s,l,u,d;if(!e||"object"!=typeof e||"[object HTMLImageElement]"!==(o=e.toString())&&"[object HTMLCanvasElement]"!==o){if(!(isNaN(i)||i<=0)){switch(e){default:t.beginPath(),t.arc(n,a,i,0,2*Math.PI),t.closePath(),t.fill();break;case"triangle":t.beginPath(),u=(r=3*i/Math.sqrt(3))*Math.sqrt(3)/2,t.moveTo(n-r/2,a+u/3),t.lineTo(n+r/2,a+u/3),t.lineTo(n,a-2*u/3),t.closePath(),t.fill();break;case"rect":d=1/Math.SQRT2*i,t.beginPath(),t.fillRect(n-d,a-d,2*d,2*d),t.strokeRect(n-d,a-d,2*d,2*d);break;case"rectRounded":var c=i/Math.SQRT2,h=n-c,f=a-c,g=Math.SQRT2*i;t.beginPath(),this.roundedRect(t,h,f,g,g,i/2),t.closePath(),t.fill();break;case"rectRot":d=1/Math.SQRT2*i,t.beginPath(),t.moveTo(n-d,a),t.lineTo(n,a+d),t.lineTo(n+d,a),t.lineTo(n,a-d),t.closePath(),t.fill();break;case"cross":t.beginPath(),t.moveTo(n,a+i),t.lineTo(n,a-i),t.moveTo(n-i,a),t.lineTo(n+i,a),t.closePath();break;case"crossRot":t.beginPath(),s=Math.cos(Math.PI/4)*i,l=Math.sin(Math.PI/4)*i,t.moveTo(n-s,a-l),t.lineTo(n+s,a+l),t.moveTo(n-s,a+l),t.lineTo(n+s,a-l),t.closePath();break;case"star":t.beginPath(),t.moveTo(n,a+i),t.lineTo(n,a-i),t.moveTo(n-i,a),t.lineTo(n+i,a),s=Math.cos(Math.PI/4)*i,l=Math.sin(Math.PI/4)*i,t.moveTo(n-s,a-l),t.lineTo(n+s,a+l),t.moveTo(n-s,a+l),t.lineTo(n+s,a-l),t.closePath();break;case"line":t.beginPath(),t.moveTo(n-i,a),t.lineTo(n+i,a),t.closePath();break;case"dash":t.beginPath(),t.moveTo(n,a),t.lineTo(n+i,a),t.closePath()}t.stroke()}}else t.drawImage(e,n-e.width/2,a-e.height/2,e.width,e.height)},clipArea:function(t,e){t.save(),t.beginPath(),t.rect(e.left,e.top,e.right-e.left,e.bottom-e.top),t.clip()},unclipArea:function(t){t.restore()},lineTo:function(t,e,i,n){if(i.steppedLine)return"after"===i.steppedLine&&!n||"after"!==i.steppedLine&&n?t.lineTo(e.x,i.y):t.lineTo(i.x,e.y),void t.lineTo(i.x,i.y);i.tension?t.bezierCurveTo(n?e.controlPointPreviousX:e.controlPointNextX,n?e.controlPointPreviousY:e.controlPointNextY,n?i.controlPointNextX:i.controlPointPreviousX,n?i.controlPointNextY:i.controlPointPreviousY,i.x,i.y):t.lineTo(i.x,i.y)}};n.clear=i.clear,n.drawRoundedRectangle=function(t){t.beginPath(),i.roundedRect.apply(i,arguments),t.closePath()}},{42:42}],42:[function(t,e,i){"use strict";var n,a={noop:function(){},uid:(n=0,function(){return n++}),isNullOrUndef:function(t){return null==t},isArray:Array.isArray?Array.isArray:function(t){return"[object Array]"===Object.prototype.toString.call(t)},isObject:function(t){return null!==t&&"[object Object]"===Object.prototype.toString.call(t)},valueOrDefault:function(t,e){return void 0===t?e:t},valueAtIndexOrDefault:function(t,e,i){return a.valueOrDefault(a.isArray(t)?t[e]:t,i)},callback:function(t,e,i){if(t&&"function"==typeof t.call)return t.apply(i,e)},each:function(t,e,i,n){var o,r,s;if(a.isArray(t))if(r=t.length,n)for(o=r-1;o>=0;o--)e.call(i,t[o],o);else for(o=0;o=1?t:-(Math.sqrt(1-t*t)-1)},easeOutCirc:function(t){return Math.sqrt(1-(t-=1)*t)},easeInOutCirc:function(t){return(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInElastic:function(t){var e=1.70158,i=0,n=1;return 0===t?0:1===t?1:(i||(i=.3),n<1?(n=1,e=i/4):e=i/(2*Math.PI)*Math.asin(1/n),-n*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/i))},easeOutElastic:function(t){var e=1.70158,i=0,n=1;return 0===t?0:1===t?1:(i||(i=.3),n<1?(n=1,e=i/4):e=i/(2*Math.PI)*Math.asin(1/n),n*Math.pow(2,-10*t)*Math.sin((t-e)*(2*Math.PI)/i)+1)},easeInOutElastic:function(t){var e=1.70158,i=0,n=1;return 0===t?0:2==(t/=.5)?1:(i||(i=.45),n<1?(n=1,e=i/4):e=i/(2*Math.PI)*Math.asin(1/n),t<1?n*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/i)*-.5:n*Math.pow(2,-10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/i)*.5+1)},easeInBack:function(t){return t*t*(2.70158*t-1.70158)},easeOutBack:function(t){return(t-=1)*t*(2.70158*t+1.70158)+1},easeInOutBack:function(t){var e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},easeInBounce:function(t){return 1-a.easeOutBounce(1-t)},easeOutBounce:function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},easeInOutBounce:function(t){return t<.5?.5*a.easeInBounce(2*t):.5*a.easeOutBounce(2*t-1)+.5}};e.exports={effects:a},n.easingEffects=a},{42:42}],44:[function(t,e,i){"use strict";var n=t(42);e.exports={toLineHeight:function(t,e){var i=(""+t).match(/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/);if(!i||"normal"===i[1])return 1.2*e;switch(t=+i[2],i[3]){case"px":return t;case"%":t/=100}return e*t},toPadding:function(t){var e,i,a,o;return n.isObject(t)?(e=+t.top||0,i=+t.right||0,a=+t.bottom||0,o=+t.left||0):e=i=a=o=+t||0,{top:e,right:i,bottom:a,left:o,height:e+a,width:o+i}},resolve:function(t,e,i){var a,o,r;for(a=0,o=t.length;a
';var a=e.childNodes[0],r=e.childNodes[1];e._reset=function(){a.scrollLeft=1e6,a.scrollTop=1e6,r.scrollLeft=1e6,r.scrollTop=1e6};var s=function(){e._reset(),t()};return h(a,"scroll",s.bind(a,"expand")),h(r,"scroll",s.bind(r,"shrink")),e}((u=function(){if(x.resizer)return e(g("resize",i))},c=!1,f=[],function(){f=Array.prototype.slice.call(arguments),d=d||this,c||(c=!0,n.requestAnimFrame.call(window,function(){c=!1,u.apply(d,f)}))}));m=function(){if(x.resizer){var e=t.parentNode;e&&e!==y.parentNode&&e.insertBefore(y,e.firstChild),y._reset()}},v=(p=t)[a]||(p[a]={}),b=v.renderProxy=function(t){t.animationName===s&&m()},n.each(l,function(t){h(p,t,b)}),v.reflow=!!p.offsetParent,p.classList.add(r)}function m(t){var e,i,o,s=t[a]||{},u=s.resizer;delete s.resizer,i=(e=t)[a]||{},(o=i.renderProxy)&&(n.each(l,function(t){f(e,t,o)}),delete i.renderProxy),e.classList.remove(r),u&&u.parentNode&&u.parentNode.removeChild(u)}e.exports={_enabled:"undefined"!=typeof window&&"undefined"!=typeof document,initialize:function(){var t,e,i,n="from{opacity:0.99}to{opacity:1}";e="@-webkit-keyframes "+s+"{"+n+"}@keyframes "+s+"{"+n+"}."+r+"{-webkit-animation:"+s+" 0.001s;animation:"+s+" 0.001s;}",i=(t=this)._style||document.createElement("style"),t._style||(t._style=i,e="/* Chart.js */\n"+e,i.setAttribute("type","text/css"),document.getElementsByTagName("head")[0].appendChild(i)),i.appendChild(document.createTextNode(e))},acquireContext:function(t,e){"string"==typeof t?t=document.getElementById(t):t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas);var i=t&&t.getContext&&t.getContext("2d");return i&&i.canvas===t?(function(t,e){var i=t.style,n=t.getAttribute("height"),o=t.getAttribute("width");if(t[a]={initial:{height:n,width:o,style:{display:i.display,height:i.height,width:i.width}}},i.display=i.display||"block",null===o||""===o){var r=d(t,"width");void 0!==r&&(t.width=r)}if(null===n||""===n)if(""===t.style.height)t.height=t.width/(e.options.aspectRatio||2);else{var s=d(t,"height");void 0!==r&&(t.height=s)}}(t,e),i):null},releaseContext:function(t){var e=t.canvas;if(e[a]){var i=e[a].initial;["height","width"].forEach(function(t){var a=i[t];n.isNullOrUndef(a)?e.removeAttribute(t):e.setAttribute(t,a)}),n.each(i.style||{},function(t,i){e.style[i]=t}),e.width=e.width,delete e[a]}},addEventListener:function(t,e,i){var o=t.canvas;if("resize"!==e){var r=i[a]||(i[a]={});h(o,e,(r.proxies||(r.proxies={}))[t.id+"_"+e]=function(e){var a,o,r,s;i((o=t,r=u[(a=e).type]||a.type,s=n.getRelativePosition(a,o),g(r,o,s.x,s.y,a)))})}else p(o,i,t)},removeEventListener:function(t,e,i){var n=t.canvas;if("resize"!==e){var o=((i[a]||{}).proxies||{})[t.id+"_"+e];o&&f(n,e,o)}else m(n)}},n.addEvent=h,n.removeEvent=f},{45:45}],48:[function(t,e,i){"use strict";var n=t(45),a=t(46),o=t(47),r=o._enabled?o:a;e.exports=n.extend({initialize:function(){},acquireContext:function(){},releaseContext:function(){},addEventListener:function(){},removeEventListener:function(){}},r)},{45:45,46:46,47:47}],49:[function(t,e,i){"use strict";e.exports={},e.exports.filler=t(50),e.exports.legend=t(51),e.exports.title=t(52)},{50:50,51:51,52:52}],50:[function(t,e,i){"use strict";var n=t(25),a=t(40),o=t(45);n._set("global",{plugins:{filler:{propagate:!0}}});var r={dataset:function(t){var e=t.fill,i=t.chart,n=i.getDatasetMeta(e),a=n&&i.isDatasetVisible(e)&&n.dataset._children||[],o=a.length||0;return o?function(t,e){return e=i)&&n;switch(o){case"bottom":return"start";case"top":return"end";case"zero":return"origin";case"origin":case"start":case"end":return o;default:return!1}}function l(t){var e,i=t.el._model||{},n=t.el._scale||{},a=t.fill,o=null;if(isFinite(a))return null;if("start"===a?o=void 0===i.scaleBottom?n.bottom:i.scaleBottom:"end"===a?o=void 0===i.scaleTop?n.top:i.scaleTop:void 0!==i.scaleZero?o=i.scaleZero:n.getBasePosition?o=n.getBasePosition():n.getBasePixel&&(o=n.getBasePixel()),null!=o){if(void 0!==o.x&&void 0!==o.y)return o;if("number"==typeof o&&isFinite(o))return{x:(e=n.isHorizontal())?o:null,y:e?null:o}}return null}function u(t,e,i){var n,a=t[e].fill,o=[e];if(!i)return a;for(;!1!==a&&-1===o.indexOf(a);){if(!isFinite(a))return a;if(!(n=t[a]))return!1;if(n.visible)return a;o.push(a),a=n.fill}return!1}function d(t){return t&&!t.skip}function c(t,e,i,n,a){var r;if(n&&a){for(t.moveTo(e[0].x,e[0].y),r=1;r0;--r)o.canvas.lineTo(t,i[r],i[r-1],!0)}}e.exports={id:"filler",afterDatasetsUpdate:function(t,e){var i,n,o,d,c,h,f,g=(t.data.datasets||[]).length,p=e.propagate,m=[];for(n=0;n');for(var i=0;i'),t.data.datasets[i].label&&e.push(t.data.datasets[i].label),e.push("");return e.push(""),e.join("")}});var u=a.extend({initialize:function(t){o.extend(this,t),this.legendHitBoxes=[],this.doughnutMode=!1},beforeUpdate:s,update:function(t,e,i){var n=this;return n.beforeUpdate(),n.maxWidth=t,n.maxHeight=e,n.margins=i,n.beforeSetDimensions(),n.setDimensions(),n.afterSetDimensions(),n.beforeBuildLabels(),n.buildLabels(),n.afterBuildLabels(),n.beforeFit(),n.fit(),n.afterFit(),n.afterUpdate(),n.minSize},afterUpdate:s,beforeSetDimensions:s,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:s,beforeBuildLabels:s,buildLabels:function(){var t=this,e=t.options.labels||{},i=o.callback(e.generateLabels,[t.chart],t)||[];e.filter&&(i=i.filter(function(i){return e.filter(i,t.chart.data)})),t.options.reverse&&i.reverse(),t.legendItems=i},afterBuildLabels:s,beforeFit:s,fit:function(){var t=this,e=t.options,i=e.labels,a=e.display,r=t.ctx,s=n.global,u=o.valueOrDefault,d=u(i.fontSize,s.defaultFontSize),c=u(i.fontStyle,s.defaultFontStyle),h=u(i.fontFamily,s.defaultFontFamily),f=o.fontString(d,c,h),g=t.legendHitBoxes=[],p=t.minSize,m=t.isHorizontal();if(m?(p.width=t.maxWidth,p.height=a?10:0):(p.width=a?10:0,p.height=t.maxHeight),a)if(r.font=f,m){var v=t.lineWidths=[0],b=t.legendItems.length?d+i.padding:0;r.textAlign="left",r.textBaseline="top",o.each(t.legendItems,function(e,n){var a=l(i,d)+d/2+r.measureText(e.text).width;v[v.length-1]+a+i.padding>=t.width&&(b+=d+i.padding,v[v.length]=t.left),g[n]={left:0,top:0,width:a,height:d},v[v.length-1]+=a+i.padding}),p.height+=b}else{var x=i.padding,y=t.columnWidths=[],k=i.padding,M=0,w=0,S=d+x;o.each(t.legendItems,function(t,e){var n=l(i,d)+d/2+r.measureText(t.text).width;w+S>p.height&&(k+=M+i.padding,y.push(M),M=0,w=0),M=Math.max(M,n),w+=S,g[e]={left:0,top:0,width:n,height:d}}),k+=M,y.push(M),p.width+=k}t.width=p.width,t.height=p.height},afterFit:s,isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},draw:function(){var t=this,e=t.options,i=e.labels,a=n.global,r=a.elements.line,s=t.width,u=t.lineWidths;if(e.display){var d,c=t.ctx,h=o.valueOrDefault,f=h(i.fontColor,a.defaultFontColor),g=h(i.fontSize,a.defaultFontSize),p=h(i.fontStyle,a.defaultFontStyle),m=h(i.fontFamily,a.defaultFontFamily),v=o.fontString(g,p,m);c.textAlign="left",c.textBaseline="middle",c.lineWidth=.5,c.strokeStyle=f,c.fillStyle=f,c.font=v;var b=l(i,g),x=t.legendHitBoxes,y=t.isHorizontal();d=y?{x:t.left+(s-u[0])/2,y:t.top+i.padding,line:0}:{x:t.left+i.padding,y:t.top+i.padding,line:0};var k=g+i.padding;o.each(t.legendItems,function(n,l){var f,p,m,v,M,w=c.measureText(n.text).width,S=b+g/2+w,C=d.x,_=d.y;y?C+S>=s&&(_=d.y+=k,d.line++,C=d.x=t.left+(s-u[d.line])/2):_+k>t.bottom&&(C=d.x=C+t.columnWidths[d.line]+i.padding,_=d.y=t.top+i.padding,d.line++),function(t,i,n){if(!(isNaN(b)||b<=0)){c.save(),c.fillStyle=h(n.fillStyle,a.defaultColor),c.lineCap=h(n.lineCap,r.borderCapStyle),c.lineDashOffset=h(n.lineDashOffset,r.borderDashOffset),c.lineJoin=h(n.lineJoin,r.borderJoinStyle),c.lineWidth=h(n.lineWidth,r.borderWidth),c.strokeStyle=h(n.strokeStyle,a.defaultColor);var s=0===h(n.lineWidth,r.borderWidth);if(c.setLineDash&&c.setLineDash(h(n.lineDash,r.borderDash)),e.labels&&e.labels.usePointStyle){var l=g*Math.SQRT2/2,u=l/Math.SQRT2,d=t+u,f=i+u;o.canvas.drawPoint(c,n.pointStyle,l,d,f)}else s||c.strokeRect(t,i,b,g),c.fillRect(t,i,b,g);c.restore()}}(C,_,n),x[l].left=C,x[l].top=_,f=n,p=w,v=b+(m=g/2)+C,M=_+m,c.fillText(f.text,v,M),f.hidden&&(c.beginPath(),c.lineWidth=2,c.moveTo(v,M),c.lineTo(v+p,M),c.stroke()),y?d.x+=S+i.padding:d.y+=k})}},handleEvent:function(t){var e=this,i=e.options,n="mouseup"===t.type?"click":t.type,a=!1;if("mousemove"===n){if(!i.onHover)return}else{if("click"!==n)return;if(!i.onClick)return}var o=t.x,r=t.y;if(o>=e.left&&o<=e.right&&r>=e.top&&r<=e.bottom)for(var s=e.legendHitBoxes,l=0;l=u.left&&o<=u.left+u.width&&r>=u.top&&r<=u.top+u.height){if("click"===n){i.onClick.call(e,t.native,e.legendItems[l]),a=!0;break}if("mousemove"===n){i.onHover.call(e,t.native,e.legendItems[l]),a=!0;break}}}return a}});function d(t,e){var i=new u({ctx:t.ctx,options:e,chart:t});r.configure(t,i,e),r.addBox(t,i),t.legend=i}e.exports={id:"legend",_element:u,beforeInit:function(t){var e=t.options.legend;e&&d(t,e)},beforeUpdate:function(t){var e=t.options.legend,i=t.legend;e?(o.mergeIf(e,n.global.legend),i?(r.configure(t,i,e),i.options=e):d(t,e)):i&&(r.removeBox(t,i),delete t.legend)},afterEvent:function(t,e){var i=t.legend;i&&i.handleEvent(e)}}},{25:25,26:26,30:30,45:45}],52:[function(t,e,i){"use strict";var n=t(25),a=t(26),o=t(45),r=t(30),s=o.noop;n._set("global",{title:{display:!1,fontStyle:"bold",fullWidth:!0,lineHeight:1.2,padding:10,position:"top",text:"",weight:2e3}});var l=a.extend({initialize:function(t){o.extend(this,t),this.legendHitBoxes=[]},beforeUpdate:s,update:function(t,e,i){var n=this;return n.beforeUpdate(),n.maxWidth=t,n.maxHeight=e,n.margins=i,n.beforeSetDimensions(),n.setDimensions(),n.afterSetDimensions(),n.beforeBuildLabels(),n.buildLabels(),n.afterBuildLabels(),n.beforeFit(),n.fit(),n.afterFit(),n.afterUpdate(),n.minSize},afterUpdate:s,beforeSetDimensions:s,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:s,beforeBuildLabels:s,buildLabels:s,afterBuildLabels:s,beforeFit:s,fit:function(){var t=this,e=o.valueOrDefault,i=t.options,a=i.display,r=e(i.fontSize,n.global.defaultFontSize),s=t.minSize,l=o.isArray(i.text)?i.text.length:1,u=o.options.toLineHeight(i.lineHeight,r),d=a?l*u+2*i.padding:0;t.isHorizontal()?(s.width=t.maxWidth,s.height=d):(s.width=d,s.height=t.maxHeight),t.width=s.width,t.height=s.height},afterFit:s,isHorizontal:function(){var t=this.options.position;return"top"===t||"bottom"===t},draw:function(){var t=this,e=t.ctx,i=o.valueOrDefault,a=t.options,r=n.global;if(a.display){var s,l,u,d=i(a.fontSize,r.defaultFontSize),c=i(a.fontStyle,r.defaultFontStyle),h=i(a.fontFamily,r.defaultFontFamily),f=o.fontString(d,c,h),g=o.options.toLineHeight(a.lineHeight,d),p=g/2+a.padding,m=0,v=t.top,b=t.left,x=t.bottom,y=t.right;e.fillStyle=i(a.fontColor,r.defaultFontColor),e.font=f,t.isHorizontal()?(l=b+(y-b)/2,u=v+p,s=y-b):(l="left"===a.position?b+p:y-p,u=v+(x-v)/2,s=x-v,m=Math.PI*("left"===a.position?-.5:.5)),e.save(),e.translate(l,u),e.rotate(m),e.textAlign="center",e.textBaseline="middle";var k=a.text;if(o.isArray(k))for(var M=0,w=0;wt.max&&(t.max=n))})});t.min=isFinite(t.min)&&!isNaN(t.min)?t.min:0,t.max=isFinite(t.max)&&!isNaN(t.max)?t.max:1,this.handleTickRangeOptions()},getTickLimit:function(){var t,e=this.options.ticks;if(this.isHorizontal())t=Math.min(e.maxTicksLimit?e.maxTicksLimit:11,Math.ceil(this.width/50));else{var i=a.valueOrDefault(e.fontSize,n.global.defaultFontSize);t=Math.min(e.maxTicksLimit?e.maxTicksLimit:11,Math.ceil(this.height/(2*i)))}return t},handleDirectionalChanges:function(){this.isHorizontal()||this.ticks.reverse()},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},getPixelForValue:function(t){var e=this,i=e.start,n=+e.getRightValue(t),a=e.end-i;return e.isHorizontal()?e.left+e.width/a*(n-i):e.bottom-e.height/a*(n-i)},getValueForPixel:function(t){var e=this,i=e.isHorizontal(),n=i?e.width:e.height,a=(i?t-e.left:e.bottom-t)/n;return e.start+(e.end-e.start)*a},getPixelForTick:function(t){return this.getPixelForValue(this.ticksAsNumbers[t])}});t.scaleService.registerScaleType("linear",i,e)}},{25:25,34:34,45:45}],55:[function(t,e,i){"use strict";var n=t(45);e.exports=function(t){var e=n.noop;t.LinearScaleBase=t.Scale.extend({getRightValue:function(e){return"string"==typeof e?+e:t.Scale.prototype.getRightValue.call(this,e)},handleTickRangeOptions:function(){var t=this,e=t.options.ticks;if(e.beginAtZero){var i=n.sign(t.min),a=n.sign(t.max);i<0&&a<0?t.max=0:i>0&&a>0&&(t.min=0)}var o=void 0!==e.min||void 0!==e.suggestedMin,r=void 0!==e.max||void 0!==e.suggestedMax;void 0!==e.min?t.min=e.min:void 0!==e.suggestedMin&&(null===t.min?t.min=e.suggestedMin:t.min=Math.min(t.min,e.suggestedMin)),void 0!==e.max?t.max=e.max:void 0!==e.suggestedMax&&(null===t.max?t.max=e.suggestedMax:t.max=Math.max(t.max,e.suggestedMax)),o!==r&&t.min>=t.max&&(o?t.max=t.min+1:t.min=t.max-1),t.min===t.max&&(t.max++,e.beginAtZero||t.min--)},getTickLimit:e,handleDirectionalChanges:e,buildTicks:function(){var t=this,e=t.options.ticks,i=t.getTickLimit(),a={maxTicks:i=Math.max(2,i),min:e.min,max:e.max,stepSize:n.valueOrDefault(e.fixedStepSize,e.stepSize)},o=t.ticks=function(t,e){var i,a=[];if(t.stepSize&&t.stepSize>0)i=t.stepSize;else{var o=n.niceNum(e.max-e.min,!1);i=n.niceNum(o/(t.maxTicks-1),!0)}var r=Math.floor(e.min/i)*i,s=Math.ceil(e.max/i)*i;t.min&&t.max&&t.stepSize&&n.almostWhole((t.max-t.min)/t.stepSize,i/1e3)&&(r=t.min,s=t.max);var l=(s-r)/i;l=n.almostEquals(l,Math.round(l),i/1e3)?Math.round(l):Math.ceil(l);var u=1;i<1&&(u=Math.pow(10,i.toString().length-2),r=Math.round(r*u)/u,s=Math.round(s*u)/u),a.push(void 0!==t.min?t.min:r);for(var d=1;d0){var i=n.min(e),a=n.max(e);t.min=null===t.min?i:Math.min(t.min,i),t.max=null===t.max?a:Math.max(t.max,a)}})}else n.each(a,function(e,a){var o=i.getDatasetMeta(a);i.isDatasetVisible(a)&&r(o)&&n.each(e.data,function(e,i){var n=+t.getRightValue(e);isNaN(n)||o.data[i].hidden||n<0||(null===t.min?t.min=n:nt.max&&(t.max=n),0!==n&&(null===t.minNotZero||n0?t.minNotZero=t.min:t.max<1?t.minNotZero=Math.pow(10,Math.floor(n.log10(t.max))):t.minNotZero=1)},buildTicks:function(){var t=this,e=t.options.ticks,i=!t.isHorizontal(),a={min:e.min,max:e.max},o=t.ticks=function(t,e){var i,a,o=[],r=n.valueOrDefault,s=r(t.min,Math.pow(10,Math.floor(n.log10(e.min)))),l=Math.floor(n.log10(e.max)),u=Math.ceil(e.max/Math.pow(10,l));0===s?(i=Math.floor(n.log10(e.minNotZero)),a=Math.floor(e.minNotZero/Math.pow(10,i)),o.push(s),s=a*Math.pow(10,i)):(i=Math.floor(n.log10(s)),a=Math.floor(s/Math.pow(10,i)));for(var d=i<0?Math.pow(10,Math.abs(i)):1;o.push(s),10==++a&&(a=1,d=++i>=0?1:d),s=Math.round(a*Math.pow(10,i)*d)/d,ia?{start:e-i-5,end:e}:{start:e,end:e+i+5}}function u(t,e,i,n){if(a.isArray(e))for(var o=i.y,r=1.5*n,s=0;sd.r&&(d.r=b.end,c.r=m),x.startd.b&&(d.b=x.end,c.b=m)}t.setReductions(u,d,c)}(this):(t=this,e=Math.min(t.height/2,t.width/2),t.drawingArea=Math.round(e),t.setCenterPoint(0,0,0,0))},setReductions:function(t,e,i){var n=e.l/Math.sin(i.l),a=Math.max(e.r-this.width,0)/Math.sin(i.r),o=-e.t/Math.cos(i.t),r=-Math.max(e.b-this.height,0)/Math.cos(i.b);n=d(n),a=d(a),o=d(o),r=d(r),this.drawingArea=Math.min(Math.round(t-(n+a)/2),Math.round(t-(o+r)/2)),this.setCenterPoint(n,a,o,r)},setCenterPoint:function(t,e,i,n){var a=this,o=a.width-e-a.drawingArea,r=t+a.drawingArea,s=i+a.drawingArea,l=a.height-n-a.drawingArea;a.xCenter=Math.round((r+o)/2+a.left),a.yCenter=Math.round((s+l)/2+a.top)},getIndexAngle:function(t){return t*(2*Math.PI/r(this))+(this.chart.options&&this.chart.options.startAngle?this.chart.options.startAngle:0)*Math.PI*2/360},getDistanceFromCenterForValue:function(t){var e=this;if(null===t)return 0;var i=e.drawingArea/(e.max-e.min);return e.options.ticks.reverse?(e.max-t)*i:(t-e.min)*i},getPointPosition:function(t,e){var i=this.getIndexAngle(t)-Math.PI/2;return{x:Math.round(Math.cos(i)*e)+this.xCenter,y:Math.round(Math.sin(i)*e)+this.yCenter}},getPointPositionForValue:function(t,e){return this.getPointPosition(t,this.getDistanceFromCenterForValue(e))},getBasePosition:function(){var t=this.min,e=this.max;return this.getPointPositionForValue(0,this.beginAtZero?0:t<0&&e<0?e:t>0&&e>0?t:0)},draw:function(){var t=this,i=t.options,n=i.gridLines,o=i.ticks,l=a.valueOrDefault;if(i.display){var d=t.ctx,c=this.getIndexAngle(0),h=l(o.fontSize,e.defaultFontSize),f=l(o.fontStyle,e.defaultFontStyle),g=l(o.fontFamily,e.defaultFontFamily),p=a.fontString(h,f,g);a.each(t.ticks,function(i,s){if(s>0||o.reverse){var u=t.getDistanceFromCenterForValue(t.ticksAsNumbers[s]);if(n.display&&0!==s&&function(t,e,i,n){var o=t.ctx;if(o.strokeStyle=a.valueAtIndexOrDefault(e.color,n-1),o.lineWidth=a.valueAtIndexOrDefault(e.lineWidth,n-1),t.options.gridLines.circular)o.beginPath(),o.arc(t.xCenter,t.yCenter,i,0,2*Math.PI),o.closePath(),o.stroke();else{var s=r(t);if(0===s)return;o.beginPath();var l=t.getPointPosition(0,i);o.moveTo(l.x,l.y);for(var u=1;u=0;m--){if(o.display){var v=t.getPointPosition(m,g);i.beginPath(),i.moveTo(t.xCenter,t.yCenter),i.lineTo(v.x,v.y),i.stroke(),i.closePath()}if(l.display){var b=t.getPointPosition(m,g+5),x=a.valueAtIndexOrDefault(l.fontColor,m,e.defaultFontColor);i.font=p.font,i.fillStyle=x;var y=t.getIndexAngle(m),k=a.toDegrees(y);i.textAlign=0===(f=k)||180===f?"center":f<180?"left":"right",d=k,c=t._pointLabelSizes[m],h=b,90===d||270===d?h.y-=c.h/2:(d>270||d<90)&&(h.y-=c.h),u(i,t.pointLabels[m]||"",b,p.size)}}}(t)}}});t.scaleService.registerScaleType("radialLinear",c,i)}},{25:25,34:34,45:45}],58:[function(t,e,i){"use strict";var n=t(1);n="function"==typeof n?n:window.moment;var a=t(25),o=t(45),r=Number.MIN_SAFE_INTEGER||-9007199254740991,s=Number.MAX_SAFE_INTEGER||9007199254740991,l={millisecond:{common:!0,size:1,steps:[1,2,5,10,20,50,100,250,500]},second:{common:!0,size:1e3,steps:[1,2,5,10,30]},minute:{common:!0,size:6e4,steps:[1,2,5,10,30]},hour:{common:!0,size:36e5,steps:[1,2,3,6,12]},day:{common:!0,size:864e5,steps:[1,2,5]},week:{common:!1,size:6048e5,steps:[1,2,3,4]},month:{common:!0,size:2628e6,steps:[1,2,3]},quarter:{common:!1,size:7884e6,steps:[1,2,3,4]},year:{common:!0,size:3154e7}},u=Object.keys(l);function d(t,e){return t-e}function c(t){var e,i,n,a={},o=[];for(e=0,i=t.length;e=0&&r<=s;){if(a=t[(n=r+s>>1)-1]||null,o=t[n],!a)return{lo:null,hi:o};if(o[e]i))return{lo:a,hi:o};s=n-1}}return{lo:o,hi:null}}(t,e,i),o=a.lo?a.hi?a.lo:t[t.length-2]:t[0],r=a.lo?a.hi?a.hi:t[t.length-1]:t[1],s=r[e]-o[e],l=s?(i-o[e])/s:0,u=(r[n]-o[n])*l;return o[n]+u}function f(t,e){var i=e.parser,a=e.parser||e.format;return"function"==typeof i?i(t):"string"==typeof t&&"string"==typeof a?n(t,a):(t instanceof n||(t=n(t)),t.isValid()?t:"function"==typeof a?a(t):t)}function g(t,e){if(o.isNullOrUndef(t))return null;var i=e.options.time,n=f(e.getRightValue(t),i);return n.isValid()?(i.round&&n.startOf(i.round),n.valueOf()):null}function p(t){for(var e=u.indexOf(t)+1,i=u.length;e=k&&i<=M&&_.push(i);return y.min=k,y.max=M,y._unit=S.unit||function(t,e,i,a){var o,r,s=n.duration(n(a).diff(n(i)));for(o=u.length-1;o>=u.indexOf(e);o--)if(r=u[o],l[r].common&&s.as(r)>=t.length)return r;return u[e?u.indexOf(e):0]}(_,S.minUnit,y.min,y.max),y._majorUnit=p(y._unit),y._table=function(t,e,i,n){if("linear"===n||!t.length)return[{time:e,pos:0},{time:i,pos:1}];var a,o,r,s,l,u=[],d=[e];for(a=0,o=t.length;ae&&s1?o[1]:s,v=o[0],b=(h(a,"time",c,"pos")-h(a,"time",v,"pos"))/2),d.time.max||(c=o[o.length-1],v=o.length>1?o[o.length-2]:r,x=(h(a,"time",c,"pos")-h(a,"time",v,"pos"))/2)),{left:b,right:x}),y._labelFormat=function(t,e){var i,n,a,o=t.length;for(i=0;i=0&&t0?s:1}});t.scaleService.registerScaleType("time",e,{position:"bottom",distribution:"linear",bounds:"data",time:{parser:!1,format:!1,unit:!1,round:!1,displayFormat:!1,isoWeekday:!1,minUnit:"millisecond",displayFormats:{millisecond:"h:mm:ss.SSS a",second:"h:mm:ss a",minute:"h:mm a",hour:"hA",day:"MMM D",week:"ll",month:"MMM YYYY",quarter:"[Q]Q - YYYY",year:"YYYY"}},ticks:{autoSkip:!1,source:"auto",major:{enabled:!1}}})}},{1:1,25:25,45:45}]},{},[7])(7)});prewikka-5.1.1/prewikka/renderer/chartjs/timeline/0000775000175000017500000000000013555143705023636 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/renderer/chartjs/timeline/__init__.py0000664000175000017500000000621613555143652025755 0ustar tandrejatandreja00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2018-2019 CS-SI. All Rights Reserved. # Author: Sélim Menouar # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. """ ChartJS line plugin (multiple line) """ from .. import ChartJSRenderer from prewikka.renderer import RendererUtils, RendererNoDataException from prewikka import version class ChartJSTimePlugin(ChartJSRenderer): plugin_author = version.__author__ plugin_license = version.__license__ plugin_version = version.__version__ plugin_copyright = version.__copyright__ def render(self, data, query=None, xlegend=[], **kwargs): """ Return the HTML for this chart Keyword arguments: data -- List containing the data for this chart xlegend -- List containing the xAxis legend """ link_mapping = {} options = {"labels": xlegend, "datasets": []} opts = {} if kwargs.get("stacked"): opts["scales"] = { "xAxes": [{"stacked": True}], "yAxes": [{"stacked": True}] } rutils = RendererUtils(kwargs) for index, item in enumerate(data): label = rutils.get_label(item.labels) color = rutils.get_color(item.labels) options["datasets"].append({ "label": label, "fill": ("-1" if index else "origin") if kwargs.get("stacked") else False, "backgroundColor": self._rgba(color, 1 if self._chart_type == "bar" else 0.2), "borderColor": self._rgba(color, 1), "pointBackgroundColor": self._rgba(color, 1), "pointBorderColor": "#fff", "pointHoverBackgroundColor": "#fff", "pointHoverBorderColor": self._rgba(color, 1), "data": item.values }) link_mapping[label] = {} for i, link in enumerate(item.links): link_mapping[label][xlegend[i]] = link if not options["datasets"]: raise RendererNoDataException return self.generate_html(kwargs, options, opts, self._chart_type, link_mapping, True) class ChartJSTimebarPlugin(ChartJSTimePlugin): """ ChartJS timebar plugin """ renderer_type = "timebar" _chart_type = "bar" plugin_name = "ChartJS : Timebar" plugin_description = N_("ChartJS Timebar renderer type") def render(self, data, **kwargs): return ChartJSTimePlugin.render(self, data, stacked=True, **kwargs) prewikka-5.1.1/prewikka/renderer/chartjs/__init__.py0000664000175000017500000000715413555143652024151 0ustar tandrejatandreja00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2018-2019 CS-SI. All Rights Reserved. # Author: Sélim Menouar # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. """ ChartJS renderer plugin """ import pkg_resources from prewikka import pluginmanager, version from prewikka.renderer import RendererBackend from prewikka.utils import json class ChartJSRenderer(RendererBackend): """ ChartJS renderer plugin """ renderer_backend = "chartjs" _chartjs_filename = "chartjs/js/Chart.min.js" def _rgba(self, color, alpha=1): return "rgba(%s, %s, %s, %s)" % ( int(color[0:2], 16), int(color[2:4], 16), int(color[4:6], 16), alpha) def generate_html(self, kwargs, data, options, chart_type, mapping=None, multiple=False): """ Generate HTML used in all ChartJS charts Keyword arguments: kwargs -- kwargs options -- Specific options for the chart element_type -- Type of ChartJS element (Point, Segment, ...) mapping -- Array use for onclick event (default None) """ html = """
""" % {"cssid": kwargs["cssid"]} script = """ $LAB.script("%(chartjs_js)s").wait(function() { var size = prewikka_getRenderSize("#%(cssid)s", %(kwargs)s); var ctx = $("#canvas-%(cssid)s") var dom = $("#chartjs-%(cssid)s"); Chart.defaults.global.maintainAspectRatio = false; dom.css("width", size[0]); dom.css("height", size[1]); $("#%(cssid)s").attr('resizeable', true); var myChart = new Chart(ctx, {type: '%(chart_type)s', data: %(data)s, options: %(options)s}); $("#%(cssid)s").on('resize', function() { myChart.resize(); }); var mapping = %(mapping)s; if ( ! mapping ) return; $("#canvas-%(cssid)s").click(function(evt) { var activePoint = myChart.getElementAtEvent(evt)[0]; var value = %(multiple)s ? mapping[activePoint._view.datasetLabel][activePoint._view.label] : mapping[activePoint._view.label]; if ( activePoint ) prewikka_ajax({url: value}); }); });""" % {"cssid": kwargs["cssid"], "chartjs_js": self._chartjs_filename, "chart_type": chart_type, "kwargs": json.dumps(kwargs), "data": json.dumps(data), "options": json.dumps(options), "mapping": json.dumps(mapping), "multiple": json.dumps(multiple)} return {"html": html, "script": script} class ChartJSPlugin(pluginmanager.PluginPreload): """ ChartJS plugin informations""" plugin_name = "ChartJS renderer" plugin_author = version.__author__ plugin_license = version.__license__ plugin_version = version.__version__ plugin_copyright = version.__copyright__ plugin_description = _("ChartJS renderer backend") plugin_htdocs = (("chartjs", pkg_resources.resource_filename(__name__, 'htdocs')),) prewikka-5.1.1/prewikka/renderer/__init__.py0000664000175000017500000001377313555143652022517 0ustar tandrejatandreja00000000000000# Copyright (C) 2014-2019 CS-SI. All Rights Reserved. # Author: Yoann Vandoorselaere # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from __future__ import absolute_import, division, print_function, unicode_literals import uuid from prewikka import error, pluginmanager, resource from prewikka.utils import cache RED_STD = "E78D90" ORANGE_STD = "F5B365" YELLOW_STD = "D4C608" GREEN_STD = "B1E55D" BLUE_STD = "93B9DD" GRAY_STD = "5C5C5C" COLORS = (BLUE_STD, GREEN_STD, YELLOW_STD, ORANGE_STD, RED_STD, "C6A0CF", "5256D3", "A7DE65", "F2A97B", "F6818A", "B087C6", "66DC92") class RendererException(Exception): pass class RendererNoDataException(RendererException): def __str__(self): return _("No data to display.") class RendererItem(object): __slots__ = ["values", "labels", "links", "_tuple"] def __init__(self, values=0, labels=None, links=None): self._tuple = values, labels, links self.values = values self.labels = labels self.links = links def __getitem__(self, i): return self._tuple[i] class RendererUtils(object): _nexist_color = (_("n/a"), GRAY_STD) def __init__(self, options): self._color_map_idx = 0 self._color_map = options.get("names_and_colors") def get_label(self, label): if self._color_map: return _(self._color_map.get(label, self._nexist_color)[0]) return label @cache.request_memoize("renderer_color") def get_color(self, label, onecolor=False): if self._color_map: color = self._color_map.get(label, self._nexist_color)[1] if color: return color color = COLORS[self._color_map_idx % len(COLORS)] if not onecolor: self._color_map_idx += 1 return color class RendererBackend(pluginmanager.PluginBase): pass class RendererPluginManager(pluginmanager.PluginManager): _default_backends = {} def __init__(self, autoupdate=False): self._backends = pluginmanager.PluginManager("prewikka.renderer.backend", autoupdate=autoupdate) pluginmanager.PluginManager.__init__(self, "prewikka.renderer.type", autoupdate=autoupdate) for typ, backend in env.config.renderer_defaults.items(): self._default_backends[typ] = backend self._renderer = {} for i in self: try: p = self.initialize_plugin(i) except Exception: continue self._renderer.setdefault(i.renderer_backend, {})[i.renderer_type] = p if i.renderer_type not in self._default_backends: self._default_backends[i.renderer_type] = i.renderer_backend def get_types(self): return self._default_backends.keys() def has_backend(self, wanted_backend, wanted_type=None): if wanted_backend not in self._renderer: return False if wanted_type is None: return True return set(wanted_type).issubset(self._renderer[wanted_backend]) def get_backends(self, wanted_type): for backend, typedict in self._renderer.items(): if wanted_type in typedict: yield backend def get_backends_instances(self, wanted_type): for backend in self.get_backends(wanted_type): yield self._renderer[backend][wanted_type] def get_default_backend(self, wanted_type): return self._default_backends.get(wanted_type) def _setup_renderer(self, type, renderer): renderer = renderer or self.get_default_backend(type) if renderer is None: raise error.PrewikkaUserError(N_("Renderer error"), N_("No backend supporting render type '%s'", type)) if renderer not in self._renderer: raise error.PrewikkaUserError(N_("Renderer error"), N_("No backend named '%s'", renderer)) if type not in self._renderer[renderer]: raise error.PrewikkaUserError(N_("Renderer error"), N_("Backend '%(backend)s' does not support render type '%(type)s'", {'backend': renderer, 'type': type})) return renderer def update(self, type, data, renderer=None, **kwargs): renderer = self._setup_renderer(type, renderer) return self._renderer[renderer][type].update(data, **kwargs) def render(self, type, data, renderer=None, **kwargs): renderer = self._setup_renderer(type, renderer) classname = kwargs["class"] = "-".join((renderer, type)) cssid = kwargs["cssid"] = "-".join((classname, text_type(uuid.uuid4()))) try: data = self._renderer[renderer][type].render(data, **kwargs) htmls = resource.HTMLSource('
%s
' % (cssid, classname, data.get("html", ""))) return {"html": htmls, "script": resource.HTMLSource(data.get("script", ""))} except RendererException as e: htmls = resource.HTMLSource('
%s
' % (cssid, classname, text_type(e))) return {"html": htmls, "script": None} prewikka-5.1.1/prewikka/session/0000775000175000017500000000000013555143705020247 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/session/anonymous/0000775000175000017500000000000013555143705022277 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/session/anonymous/__init__.py0000664000175000017500000000023113555143652024405 0ustar tandrejatandreja00000000000000from __future__ import absolute_import, division, print_function, unicode_literals from .anonymous import AnonymousSession # noqa: imported but unused prewikka-5.1.1/prewikka/session/anonymous/anonymous.py0000664000175000017500000000372613555143652024712 0ustar tandrejatandreja00000000000000# Copyright (C) 2007-2019 CS-SI. All Rights Reserved. # Author: Yoann Vandoorselaere # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from __future__ import absolute_import, division, print_function, unicode_literals from prewikka import auth, session, usergroup, version class AnonymousSession(auth.Auth, session.Session): plugin_name = "Anonymous authentication" plugin_author = version.__author__ plugin_license = version.__license__ plugin_version = version.__version__ plugin_copyright = version.__copyright__ plugin_description = N_("Anonymous authentication") autologin = True def __init__(self, config): auth.Auth.__init__(self, config) session.Session.__init__(self, config) def get_user_permissions(self, user, ignore_group=False): return usergroup.ALL_PERMISSIONS def get_user_info(self, request): return session.SessionUserInfo("anonymous", None) def get_user_list(self, search=None): return [usergroup.User("anonymous")] def get_user_by_id(self, id_): return usergroup.User("anonymous") def has_user(self, other): return usergroup.User("anonymous") def authenticate(self, login, password="", no_password_check=False): return usergroup.User("anonymous") prewikka-5.1.1/prewikka/session/__init__.py0000664000175000017500000000027713555143652022367 0ustar tandrejatandreja00000000000000from __future__ import absolute_import, division, print_function, unicode_literals from .session import Session, SessionExpired, SessionInvalid, SessionUserInfo # noqa: imported but unused prewikka-5.1.1/prewikka/session/session.py0000664000175000017500000001572313555143652022315 0ustar tandrejatandreja00000000000000# Copyright (C) 2004-2019 CS-SI. All Rights Reserved. # Author: Yoann Vandoorselaere # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from __future__ import absolute_import, division, print_function, unicode_literals import binascii import os import struct import time from prewikka import database, hookmanager, log, pluginmanager, usergroup, utils from prewikka.error import PrewikkaUserError, RedirectionError class _SessionError(PrewikkaUserError): code = 401 def __init__(self, login=None, **kwargs): PrewikkaUserError.__init__(self, log_user=login, **kwargs) class SessionInvalid(_SessionError): name = N_("Invalid session") message = N_("The session cookie carried by your browser is invalid") class SessionExpired(_SessionError): name = N_("Session expired") message = N_("Your session has expired: please sign in again to continue using Prelude") class SessionUserInfo(object): def __init__(self, login, password=None): self.login = login self.password = password class SessionDatabase(database.DatabaseHelper): def create_session(self, sessionid, user, time): self.query("INSERT INTO Prewikka_Session (sessionid, userid, login, time) VALUES(%s, %s, %s, %s)", sessionid, user.id, user.name, self.datetime(time)) def update_session(self, sessionid, time): self.query("UPDATE Prewikka_Session SET time=%s WHERE sessionid=%s", self.datetime(time), sessionid) def get_session(self, sessionid): rows = self.query("SELECT login, time FROM Prewikka_Session WHERE sessionid = %s", sessionid) if not rows: raise login, t = rows[0] return login, utils.timeutil.get_timestamp_from_string(t) def delete_session(self, sessionid=None, user=None): assert not (sessionid and user) if sessionid: self.query("DELETE FROM Prewikka_Session WHERE sessionid = %s", sessionid) elif user: self.query("DELETE FROM Prewikka_Session WHERE userid = %s", user.id) def delete_expired_sessions(self, time): self.query("DELETE FROM Prewikka_Session WHERE time < %s", self.datetime(time)) class Session(pluginmanager.PluginBase): template = None autologin = False plugin_mandatory = True def __init__(self, config): pluginmanager.PluginBase.__init__(self) self._db = SessionDatabase() self._expiration = config.get_int('expiration', 60) * 60 hookmanager.register("HOOK_USER_DELETE", lambda user: self._db.delete_session(user=user)) def __set_session(self, request, sessionid): request.add_cookie("sessionid", sessionid, expires=self._expiration * 3, httponly=True) def __check_session(self, request): sessionid = request.input_cookie.get("sessionid") if not sessionid: # No session cookie sent by the browser if request.is_xhr: # In case of an AJAX request, we consider that # the session cookie expired and was not sent. raise SessionExpired(login=None, template=self.template) else: # Otherwise, we consider that the session cookie did not exist, # and we don't display any message on the login page. raise SessionInvalid(message="", template=self.template, log_priority=log.INFO) sessionid = sessionid.value try: login, t = self._db.get_session(sessionid) except: request.delete_cookie("sessionid") raise SessionInvalid(template=self.template) # Check that the session is still alive... now = int(time.time()) if now - t > self._expiration: self.__delete_session(request) raise SessionExpired(login, template=self.template) # And that the user it carry still exist in the current authentication # backend (which might have changed) user = usergroup.User(login) if not env.auth.has_user(user): self.__delete_session(request) raise SessionInvalid(login, template=self.template) if (now - t) / 60 >= 5: self._db.update_session(sessionid, now) list(hookmanager.trigger("HOOK_SESSION_UPDATE", user)) self.__set_session(request, sessionid) return login def __create_session(self, request, user): t = time.time() self._db.delete_expired_sessions(t - self._expiration) sessionid = binascii.hexlify(os.urandom(16) + struct.pack(b">d", t)).decode("utf8") self._db.create_session(sessionid, user, int(t)) self.__set_session(request, sessionid) def __delete_session(self, request): self._db.delete_session(sessionid=request.input_cookie["sessionid"].value) request.delete_cookie("sessionid") def get_user(self, request): info = self.get_user_info(request) if not(info) or not(info.login) or self.autologin: try: login = self.__check_session(request) return usergroup.User(login) except (SessionInvalid, SessionExpired): if not self.autologin: raise user = self.authenticate(request, info) self.__create_session(request, user) list(hookmanager.trigger("HOOK_SESSION_CREATE", user)) is_admin = set(user.permissions) == usergroup.ALL_PERMISSIONS env.log.info("User login with profile '%s'" % ("admin" if is_admin else "default")) raise RedirectionError(env.request.web.get_raw_uri(True), 303) def authenticate(self, request, info): return env.auth.authenticate(info.login, info.password) def logout(self, request): login = self.__check_session(request) self.__delete_session(request) list(hookmanager.trigger("HOOK_SESSION_DELETE", usergroup.User(login))) env.log.info("Logged out") raise SessionInvalid(message=N_("Logged out"), login=login, log_priority=log.INFO, template=self.template) def can_logout(self): return "logout" in self.__class__.__dict__ def get_user_info(self, request): pass def get_default_auth(self): pass def init(self, config): pass prewikka-5.1.1/prewikka/sql/0000775000175000017500000000000013555143705017363 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/sql/__init__.py0000664000175000017500000000000013555143652021463 0ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/sql/install.py0000664000175000017500000000355113555143652021410 0ustar tandrejatandreja00000000000000from __future__ import absolute_import, division, print_function, unicode_literals from prewikka import version from prewikka.database import SQLScript class SQLUpdate(SQLScript): type = "install" branch = version.__branch__ version = "0" def run(self): self.query(""" DROP TABLE IF EXISTS Prewikka_Module_Changed; CREATE TABLE Prewikka_Module_Changed ( time DATETIME NOT NULL ) ENGINE=InnoDB; INSERT INTO Prewikka_Module_Changed (time) VALUES(current_timestamp); DROP TABLE IF EXISTS Prewikka_Module_Registry; CREATE TABLE Prewikka_Module_Registry ( module VARCHAR(255) NOT NULL PRIMARY KEY, enabled TINYINT DEFAULT 1, branch VARCHAR(16) NULL, version VARCHAR(16) NULL ) ENGINE=InnoDB; DROP TABLE IF EXISTS Prewikka_Session; CREATE TABLE Prewikka_Session ( sessionid VARCHAR(48) NOT NULL PRIMARY KEY, userid VARCHAR(32) NOT NULL, login VARCHAR(255) NOT NULL, time DATETIME NOT NULL ) ENGINE=InnoDB; DROP TABLE IF EXISTS Prewikka_User_Configuration; CREATE TABLE Prewikka_User_Configuration ( userid VARCHAR(255) NOT NULL, config TEXT NULL, PRIMARY KEY(userid) ) ENGINE=InnoDB; DROP TABLE IF EXISTS Prewikka_Crontab; CREATE TABLE Prewikka_Crontab ( id BIGINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255) NOT NULL, userid VARCHAR(32) NULL, schedule VARCHAR(32) NULL, ext_type VARCHAR(255) NULL, ext_id INTEGER NULL, base DATETIME NOT NULL, enabled TINYINT DEFAULT 1, runcnt INTEGER DEFAULT 0, error TEXT NULL ) ENGINE=InnoDB; DROP TABLE IF EXISTS Prewikka_History_Query; CREATE TABLE Prewikka_History_Query ( userid VARCHAR(32) NOT NULL, formid VARCHAR(255) NOT NULL, query TEXT NOT NULL, query_hash VARCHAR(32) NOT NULL, timestamp DATETIME NOT NULL, PRIMARY KEY(userid, formid, query_hash) ) ENGINE=InnoDB; """) prewikka-5.1.1/prewikka/templates/0000775000175000017500000000000013555143705020562 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/templates/baseview.mak0000664000175000017500000002445513555143652023074 0ustar tandrejatandreja00000000000000<%inherit file="/prewikka/templates/toplayout.mak" /> <%block name="toplayout_content">
<% sections = {} if env.menumanager: sections = env.menumanager.get_sections() %> % for section in sections: % endfor
<%block name="toplayout_menu"> <% menus = {} if env.menumanager: menus = env.menumanager.get_menus() sections = env.menumanager.get_sections() declared_sections = env.menumanager.get_declared_sections() def _merge_tabs(section): if section["name"] not in sections: return section["tabs"] ret = [] tabs = section["tabs"] + [tab for tab in sections[section["name"]] if tab not in section["tabs"]] for tab in tabs: if tab not in sections[section["name"]]: ret.append(tab) continue endpoint, kwargs = sections[section["name"]][tab] view = env.viewmanager.get_view(endpoint=endpoint) if view.check_permissions(env.request.user, view_kwargs=kwargs): ret.append(tab) return ret def _get_view_url(section, tabs): if section not in sections: return for tab in tabs: if tab not in sections[section]: continue endpoint, kwargs = sections[section][tab] return url_for(endpoint, **kwargs) %> <%def name="write_menu(obj, section, tabs)"> <% url = _get_view_url(section, tabs) %> % if url:
  • % else:
  • % endif % if "icon" in obj: % endif ${ _(obj["name"]) }
  • <%def name="write_menu_expand(obj, sections)"> <%def name="write_section(section, tabs=None)"> <% tabs = tabs or _merge_tabs(section) %> % if tabs: % if not section.get("expand"): ${write_menu(section, section["name"], tabs)} % else: ${write_menu_expand(section, [(section["name"], [tab], tab) for tab in tabs])} % endif % endif <%def name="write_category(category)"> <% sections = [] %> % for section in category["sections"]: <% tabs = _merge_tabs(section) %> % if tabs: <% sections.append((section["name"], tabs, section["name"])) %> % endif % endfor % if sections: ${write_menu_expand(category, sections)} % endif % if env.request.user: % endif <%block name="main_content">
    <%block name="content">
    prewikka-5.1.1/prewikka/templates/error.mak0000664000175000017500000001523313555143652022412 0ustar tandrejatandreja00000000000000<%! from traceback import format_exception from prewikka import utils from prewikka.utils import html from mako.exceptions import RichTraceback try: from mako.exceptions import syntax_highlight, pygments_html_formatter except: pygments_html_formatter = None def syntax_highlight(filename='', language=None): return html.escape def inherit(context): if not context.get('is_ajax_error'): return "/prewikka/templates/baseview.mak" else: return None %> <%def name="tracebackf()"> <% tback = RichTraceback(error=traceback[1], traceback=traceback[2]) src = tback.source line = tback.lineno if src: if isinstance(src, bytes): src = src.decode() lines = src.split("\n") else: lines = None %>

    ${ _("Detail") }

    % if lines:
    % for index in range(max(0, line - 2), min(len(lines), line + 2)): <% if pygments_html_formatter: pygments_html_formatter.linenostart = index + 1 if index + 1 == line: old_cssclass = pygments_html_formatter.cssclass pygments_html_formatter.cssclass = 'error ' + old_cssclass %> ${ lines[index] | syntax_highlight(), n } <% if index + 1 == line and pygments_html_formatter: pygments_html_formatter.cssclass = old_cssclass %> % endfor
    % endif
    % for (filename, lineno, function, line) in tback.reverse_traceback:
    ${filename}, line ${lineno}:
    <% if pygments_html_formatter: pygments_html_formatter.linenostart = lineno %>
    ${ line | syntax_highlight(filename),n }
    % endfor
    <%inherit file="${inherit(context)}" /> <%block name="content"> prewikka-5.1.1/prewikka/templates/htmldocument.mak0000664000175000017500000000223613555143652023763 0ustar tandrejatandreja00000000000000 ${ env.config.interface.get("browser_title", "Prelude") } ## EventSource polyfill for IE/Edge % for resource in document.head_content: ${resource} % endfor <%block name="head_extra_content"> % for resource in document.body_content: ${resource} % endfor ${next.body()} prewikka-5.1.1/prewikka/templates/mainmenu.mak0000664000175000017500000001413413555143652023071 0ustar tandrejatandreja00000000000000<% root_id = 'main_menu_ng' if inline else 'main_menu_ng_block' %> %if not update:
    %endifprewikka-5.1.1/prewikka/templates/toplayout.mak0000664000175000017500000001003113555143652023310 0ustar tandrejatandreja00000000000000<%inherit file="/prewikka/templates/htmldocument.mak" /> <%! from prewikka import utils, env software = env.config.interface.get("software", "Prelude") %>
    <%block name="toplayout_content" />
    <%block name="main_content" />
    prewikka-5.1.1/prewikka/utils/0000775000175000017500000000000013555143705017724 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/utils/html/0000775000175000017500000000000013555143705020670 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/utils/html/__init__.py0000664000175000017500000000022013555143652022774 0ustar tandrejatandreja00000000000000from __future__ import absolute_import, division, print_function, unicode_literals # flake8: noqa from .escape import Markup, escape, escapejs prewikka-5.1.1/prewikka/utils/html/escape.py0000664000175000017500000000262113555143652022504 0ustar tandrejatandreja00000000000000# Copyright (C) 2016-2019 CS-SI. All Rights Reserved. # Author: Yoann Vandoorselaere # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from __future__ import absolute_import, division, print_function, unicode_literals import markupsafe from prewikka.utils import json class Markup(markupsafe.Markup): __slots__ = () @classmethod def escape(cls, value): if value is None: return Markup() return markupsafe.escape(value) def escape(value): return Markup.escape(value) def escapejs(value): value = json.dumps(value, cls=json.PrewikkaHTMLJSONEncoder) if "__prewikka_class__" in value: value = "_prewikka_revive(%s)" % value return Markup(value) prewikka-5.1.1/prewikka/utils/html/helpers.py0000664000175000017500000000362113555143652022707 0ustar tandrejatandreja00000000000000# Copyright (C) 2016-2019 CS-SI. All Rights Reserved. # Author: Yoann Vandoorselaere # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from __future__ import absolute_import, division, print_function, unicode_literals from prewikka import csrf, resource def csrftoken(): return resource.HTMLSource('' % (csrf.CSRF_POST_KEY, csrf.get_token(env.request.web))) def selected(condition): return "selected" if condition else "" def checked(condition): return "checked" if condition else "" def disabled(condition): return "disabled" if condition else "" class HTMLProgressBar(resource.HTMLNode): def __init__(self, color, progress, text): txtspan = resource.HTMLNode('span', text) pgdiv = resource.HTMLNode('div', txtspan, **{ 'class': "progress-bar progress-bar-%s progress-bar-striped" % color, 'aria-valuenow': progress, 'aria-valuemin': 0, 'aria-valuemax': 100, 'style': "width: %s%%" % progress }) resource.HTMLNode.__init__(self, 'div', pgdiv, _class='progress') def __jsonobj__(self): return {"__prewikka_class__": ("HTMLNode", self.__json__())} prewikka-5.1.1/prewikka/utils/__init__.py0000664000175000017500000000100413555143652022031 0ustar tandrejatandreja00000000000000from __future__ import absolute_import, division, print_function, unicode_literals # flake8: noqa from . import html from . import timeutil from .cache import memoize, memoize_property, request_memoize, request_memoize_property from .misc import ( AttrObj, get_analyzer_status_from_latest_heartbeat, protocol_number_to_name, path_sort_key, find_unescaped_characters, split_unescaped_characters, soundex, hexdump, deprecated, get_file_size, CachingIterator ) from .url import mkdownload, iri2uri, urlencode prewikka-5.1.1/prewikka/utils/cache.py0000664000175000017500000001460213555143652021345 0ustar tandrejatandreja00000000000000# Copyright (C) 2016-2019 CS-SI. All Rights Reserved. # Author: Yoann Vandoorselaere # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from __future__ import absolute_import, division, print_function, unicode_literals import collections import functools _CacheInfo = collections.namedtuple("CacheInfo", ["hits", "misses", "size"]) class _Cache(object): _missing = object() def __init__(self, func): self._cache = {} self._cached_func = func self._hits = self._misses = 0 def _set(self, args, value): self._cache[args] = value return value def _get(self, *args): try: value = self._cache.get(args, self._missing) if value is not self._missing: self._hits = self._hits + 1 return value self._misses = self._misses + 1 return self._set(args, self._cached_func(*args)) except TypeError as e: # uncachable -- for instance, passing a list as an argument. # Better to not cache than to blow up entirely. env.log.critical("request not cachable: %s(%s): %s" % (self._cached_func.__name__, repr(args), e)) return self._cached_func(*args) def clear(self): self._cache.clear() def infos(self): return _CacheInfo(self._hits, self._misses, len(self._cache)) class _memoize(object): def __init__(self, func, name): self.func = func self.cache_objname = name def __call__(self, obj, *args): return self._setup_cache(obj)._get(obj, *args) def _setup_cache(self, obj): cache = getattr(obj, self.cache_objname, None) if not cache: cache = _Cache(self.func) setattr(obj, self.cache_objname, cache) return cache def __get__(self, obj, objtype): return functools.partial(self.__call__, obj) class _memoize_property(_memoize): def __init__(self, func, name): self._set_func = None _memoize.__init__(self, func, name) def setter(self, func): self._set_func = func return self def __set__(self, obj, value): if not self._set_func: return self._set_func(obj, value) self._setup_cache(obj)._set((obj,), value) def __get__(self, obj, objtype): return _memoize.__get__(self, obj, objtype)() class _request_memoize(_memoize): def _setup_cache(self, obj): return _memoize._setup_cache(self, env.request.cache) class _request_memoize_property(_request_memoize, _memoize_property): pass class memoize(object): """ Decorator that will cache the decorated function result value. The cache is stored into the instance of the object providing the method. Note that calling the cached function with different arguments result in different cache entry. Usage : @memoize("expensive_cache") def get_expensive_stuff(self, arg1, argN): ... time consuming stuff ... The created cache object provide the following API: - Cache hits/misses/size statistics: self.expensive_cache.infos() - Clearing the cache: self.expensive_cache.clear() """ def __init__(self, name): self.name = name def __call__(self, func): return _memoize(func, self.name) class memoize_property(object): """ Property decorator that cache the method result value. The method is accessible as a Python @property, and the cache is stored into the instance of the object providing the method. Usage : @memoize_property("my_property_cache") def my_property(self): ... time consuming stuff ... The created cache object provide the following API: - Cache hits/misses/size statistics: self.my_property_cache.infos() - Clearing the cache: self.my_property_cache.clear() """ def __init__(self, name): self.name = name def __call__(self, func): return _memoize_property(func, self.name) class request_memoize(object): """ Decorator that will cache the decorated function result value only in the context of the current request. The cache will be stored into the env.request.cache object. Note that calling the cached function with different arguments result in different cache entry. Usage : @request_memoize("expensive_cache") def get_expensive_stuff(self, arg1, arg2): ... time consuming things ... The created caching object provide the following API: - Cache hits/misses/size statistics: env.request.cache.expensive_cache.infos() - Clearing the cache: env.request.cache.expensive_cache.clear() """ def __init__(self, name): self.name = name def __call__(self, func): return _request_memoize(func, self.name) class request_memoize_property(object): """ Property decorator that cache the method result value only in the context of the current request. The method is accessible like a Python @property, and the cache is stored into the env.request.cache object. Usage : @request_memoize_property("my_property_cache") def my_property(self): pass The created caching object provide the following API: - Cache hits/misses/size statistics: env.request.cache.my_property_cache.infos() - Clearing the cache: env.request.cache.my_property_cache.clear() """ def __init__(self, name): self.name = name def __call__(self, func): return _request_memoize_property(func, self.name) prewikka-5.1.1/prewikka/utils/crypto.py0000664000175000017500000000615513555143652021626 0ustar tandrejatandreja00000000000000# Copyright (c) Django Software Foundation and individual contributors. # All rights reserved. # # Redistribution and use in source and binary forms, with or without modification, # are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # 3. Neither the name of Django nor the names of its contributors may be used # to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON # ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import binascii import hashlib import hmac import os import random import time # Use the system PRNG if possible try: random = random.SystemRandom() using_sysrandom = True except NotImplementedError: import warnings warnings.warn('A secure pseudo-random number generator is not available ' 'on your system. Falling back to Mersenne Twister.') using_sysrandom = False PREWIKKA_SECRET = binascii.hexlify(os.urandom(24)) def get_random_string(length=12, allowed_chars='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'): """ Return a securely generated random string. The default length of 12 with the a-z, A-Z, 0-9 character set returns a 71-bit value. log_2((26+26+10)^12) =~ 71 bits """ if not using_sysrandom: # This is ugly, and a hack, but it makes things better than # the alternative of predictability. This re-seeds the PRNG # using a value that is hard for an attacker to predict, every # time a random string is required. This may change the # properties of the chosen random sequence slightly, but this # is better than absolute predictability. random.seed( hashlib.sha256( ('%s%s%s' % (random.getstate(), time.time(), PREWIKKA_SECRET)).encode() ).digest() ) return ''.join(random.choice(allowed_chars) for i in range(length)) def constant_time_compare(val1, val2): """Return True if the two strings are equal, False otherwise.""" return hmac.compare_digest(val1, val2) prewikka-5.1.1/prewikka/utils/json.py0000664000175000017500000000706413555143652021257 0ustar tandrejatandreja00000000000000# Copyright (C) 2016-2019 CS-SI. All Rights Reserved. # Author: Yoann Vandoorselaere # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from __future__ import absolute_import, division, print_function, unicode_literals import collections import datetime import json from prewikka.compat import with_metaclass _TYPES = {} class _JSONMetaClass(type): def __new__(cls, clsname, bases, attrs): nclass = super(_JSONMetaClass, cls).__new__(cls, clsname, bases, attrs) _TYPES[nclass.__name__] = nclass return nclass class _JSONObject(object): @classmethod def from_json(cls, data): return cls(**data) def __jsonobj__(self): return {"__prewikka_class__": (self.__class__.__name__, self.__json__())} class JSONObject(with_metaclass(_JSONMetaClass, _JSONObject)): pass class PrewikkaJSONEncoder(json.JSONEncoder): def default(self, obj): if hasattr(obj, "__jsonobj__"): return obj.__jsonobj__() elif hasattr(obj, "__json__"): return obj.__json__() elif isinstance(obj, datetime.datetime): return text_type(obj) elif isinstance(obj, collections.Iterable): return list(obj) return json.JSONEncoder.default(self, obj) # The following class has been adapted from simplejson # class PrewikkaHTMLJSONEncoder(PrewikkaJSONEncoder): """An encoder that produces JSON safe to embed in HTML. To embed JSON content in, say, a script tag on a web page, the characters &, < and > should be escaped. They cannot be escaped with the usual entities (e.g. &) because they are not expanded within
    % if len(maintenance) > 0:
    ${ _("Plugin Maintenance") }
    ${ _("The following apps need to be updated before they can be loaded into the system") }
    % for name, list in sorted(maintenance.items()):
    ${ _(name) } % for mod, fv, uplist in sorted(list, key=lambda x: x[0].plugin_name or x[0].full_module_name): % endfor
    ${ _("Name") } ${ _("Description") } ${ _("Version") } ${ _("Current database version") } ${ _("Required database update") }
    ${ mod.plugin_name or mod.full_module_name } ${ _(mod.plugin_description) } ${ mod.plugin_version } ${ fv or '-' } ${ ", ".join([text_type(i) for i in uplist]) }
    % endfor
    % endif
    ${ _("Installed Apps") }
    % for name, list in sorted(installed.items()):
    ${ _(name) } % for mod, enabled in sorted(list, key=lambda x: x[0].plugin_name or x[0].full_module_name): % endfor
    ${ _("Name") } ${ _("Description") } ${ _("Version") } ${ _("Database version") } ${ _("Active") }
    ${ mod.plugin_name or mod.full_module_name } ${ _(mod.plugin_description) } ${ mod.plugin_version } ${ mod.plugin_database_version or '-' } % if mod.error and enabled: % endif
    % endfor
    prewikka-5.1.1/prewikka/views/aboutplugin/__init__.py0000664000175000017500000001433313555143652024370 0ustar tandrejatandreja00000000000000# Copyright (C) 2014-2019 CS-SI. All Rights Reserved. # Author: Yoann Vandoorselaere # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from __future__ import absolute_import, division, print_function, unicode_literals import itertools import json import pkg_resources from prewikka import cli, database, error, response, template, utils, version, view from prewikka.utils import html class AboutPlugin(view.View): plugin_name = "Plugin management" plugin_author = version.__author__ plugin_license = version.__license__ plugin_version = version.__version__ plugin_copyright = version.__copyright__ plugin_description = N_("Plugin installation and activation management page") plugin_mandatory = True plugin_htdocs = (("aboutplugin", pkg_resources.resource_filename(__name__, 'htdocs')),) view_permissions = [N_("USER_MANAGEMENT")] _all_plugins = ((N_("Apps: View"), "prewikka.views"), (N_("Apps: API"), "prewikka.plugins"), (N_("Apps: Dataprovider backend"), "prewikka.dataprovider.backend"), (N_("Apps: Dataprovider type"), "prewikka.dataprovider.type"), (N_("Apps: Authentication"), "prewikka.auth"), (N_("Apps: Identification"), "prewikka.session"), (N_("Apps: Renderer backend"), "prewikka.renderer.backend"), (N_("Apps: Renderer type"), "prewikka.renderer.type")) def _add_plugin_info(self, data, catname, mod): dbup = database.DatabaseUpdateHelper(mod.full_module_name, mod.plugin_database_version, mod.plugin_database_branch) curversion = dbup.get_schema_version() try: upinfo = dbup.list() if upinfo: data.maintenance_total += len(upinfo) data.maintenance.setdefault(catname, []).append((mod, curversion, upinfo)) else: data.installed.setdefault(catname, []).append((mod, env.db.is_plugin_active(mod))) except error.PrewikkaUserError as e: data.maintenance.setdefault(catname, []).append((mod, curversion, [e])) def _iter_plugin(self): for catname, entrypoint in self._all_plugins: for plugin in env.all_plugins[entrypoint].values(): yield catname, plugin def _get_plugin_infos(self): # FIXME: for some reason, the cache gets desynchronized at initialization. # This is a temporary fix. env.db.modinfos_cache.clear() data = utils.AttrObj(installed={}, maintenance={}, maintenance_total=0) for catname, plugin in self._iter_plugin(): self._add_plugin_info(data, catname, plugin) return data @cli.register("list", "plugin", help=N_("list plugin: list installed plugins")) def _list_plugins(self): ret = [] for plugins in self._get_plugin_infos().installed.values(): for mod, active in plugins: ret.append(mod.full_module_name) return sorted(ret) @view.route("/settings/apps", methods=["GET"], menu=(N_("Apps"), N_("Apps")), help="#apps") def render_get(self): dset = template.PrewikkaTemplate(__name__, "templates/aboutplugin.mak").dataset() data = self._get_plugin_infos() dset["installed"] = data.installed dset["maintenance"] = data.maintenance dset["maintenance_total"] = data.maintenance_total return dset.render() @view.route("/settings/apps/enable", methods=["POST"]) def enable(self): upsrt = [] for catname, plugin in self._iter_plugin(): enabled = plugin.plugin_mandatory or plugin.full_module_name in env.request.parameters["enable_plugin"] upsrt.append((plugin.full_module_name, enabled)) if upsrt: env.db.upsert("Prewikka_Module_Registry", ["module", "enabled"], upsrt, pkey=["module"]) env.db.trigger_plugin_change() return response.PrewikkaResponse({"type": "reload", "target": "window"}) @view.route("/settings/apps/update", methods=["GET"]) def update(self): self._update(env.request.web.send_stream) @cli.register("sync", "plugin", help=N_("sync plugin: initialize the plugin database schemas")) def _update_plugins(self): self._update(lambda *args, **kwargs: None) def _update(self, send_stream): data = self._get_plugin_infos() send_stream(json.dumps({"total": data.maintenance_total}), event="begin", sync=True) for mod, fromversion, uplist in itertools.chain.from_iterable(data.maintenance.values()): for upscript in uplist: if isinstance(upscript, Exception): continue label = _("Applying %(module)s %(script)s...") % {'module': mod.full_module_name, 'script': text_type(upscript)} send_stream(json.dumps({"label": html.escape(label), 'module': html.escape(mod.full_module_name), 'script': html.escape(text_type(upscript))}), sync=True) try: upscript.apply() except Exception as e: send_stream(json.dumps({"logs": "\n".join(html.escape(x) for x in upscript.query_logs), "error": html.escape(text_type(e))}), sync=True) else: send_stream(json.dumps({"logs": "\n".join(html.escape(x) for x in upscript.query_logs), "success": True}), sync=True) send_stream(data=json.dumps({"label": _("All updates applied")}), event="finish", sync=True) send_stream("close", event="close") env.db.trigger_plugin_change() prewikka-5.1.1/prewikka/views/agents/0000775000175000017500000000000013555143705021202 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/views/agents/htdocs/0000775000175000017500000000000013555143705022466 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/views/agents/htdocs/css/0000775000175000017500000000000013555143705023256 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/views/agents/htdocs/css/agents.css0000664000175000017500000000071613555143652025256 0ustar tandrejatandreja00000000000000.heartbeat_analyzer_event_start, .heartbeat_analyzer_event_normal_stop, .heartbeat_analyzer_event_no_anomaly { color: green; } .heartbeat_analyzer_event_unexpected_restart, .heartbeat_analyzer_event_abnormal_heartbeat_interval { color: rgb(255,165,0); } .heartbeat_analyzer_event_down { color: red; } .heartbeat_analyze { color: white; text-align: center; } .heartbeat_analyze_sensor_info { font-weight: bold; border-top: 10px; } prewikka-5.1.1/prewikka/views/agents/templates/0000775000175000017500000000000013555143705023200 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/views/agents/templates/agents.mak0000664000175000017500000000775413555143652025171 0ustar tandrejatandreja00000000000000<%! from prewikka.utils import html, json %>
    prewikka-5.1.1/prewikka/views/agents/templates/heartbeatanalyze.mak0000664000175000017500000000505013555143652027216 0ustar tandrejatandreja00000000000000<% status_classes = {"online": "success", "offline": "default", "unknown": "warning", "missing": "danger"} %>
    prewikka-5.1.1/prewikka/views/agents/__init__.py0000664000175000017500000000076013555143652023317 0ustar tandrejatandreja00000000000000from __future__ import absolute_import, division, print_function, unicode_literals from prewikka import pluginmanager, version from .agents import Agents class AgentPlugin(pluginmanager.PluginPreload): plugin_name = "Agents status" plugin_author = version.__author__ plugin_license = version.__license__ plugin_version = version.__version__ plugin_copyright = version.__copyright__ plugin_description = N_("Agents status information page") plugin_classes = [Agents] prewikka-5.1.1/prewikka/views/agents/agents.py0000664000175000017500000002460713555143652023047 0ustar tandrejatandreja00000000000000# Copyright (C) 2004-2019 CS-SI. All Rights Reserved. # Author: Yoann Vandoorselaere # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from __future__ import absolute_import, division, print_function, unicode_literals import pkg_resources from prewikka import hookmanager, localization, mainmenu, resource, template, utils, view, response from prewikka.dataprovider import Criterion from prewikka.utils.viewhelpers import GridParameters class Agents(view.View): view_datatype = "heartbeat" plugin_htdocs = (("agents", pkg_resources.resource_filename(__name__, 'htdocs')),) @hookmanager.register("HOOK_SUMMARYWIDGET_DATA", _order=0) def _set_agents_summary(self): results = env.dataprovider.query(["max(heartbeat.create_time)", "heartbeat.analyzer(-1).analyzerid/group_by"]) if not results: return c = Criterion() for create_time, analyzerid in results: c |= Criterion("heartbeat.create_time", "==", create_time) & Criterion("heartbeat.analyzer(-1).analyzerid", "==", analyzerid) agents = { "up": utils.AttrObj(count=0, title=_("Online"), label="label-success", status=["online"]), "down": utils.AttrObj(count=0, title=_("Offline"), label="label-danger", status=["offline", "missing", "unknown"]) } heartbeat_error_margin = env.config.general.get_int("heartbeat_error_margin", 3) for heartbeat in env.dataprovider.get(c): heartbeat = heartbeat["heartbeat"] analyzer = heartbeat["analyzer"][-1] analyzer.status = utils.get_analyzer_status_from_latest_heartbeat(heartbeat, heartbeat_error_margin)[0] for key, values in agents.items(): if analyzer.status in values.status: values.count += 1 parameters = env.request.menu_parameters val = agents["down"] if agents["down"].count else agents["up"] data = resource.HTMLNode("a", localization.format_number(val.count), title=val.title, _class="label " + val.label, href=url_for("Agents.agents", status=val.status, **parameters)) return utils.AttrObj( name="agents", title=resource.HTMLNode("a", _("Agents"), href=url_for("Agents.agents", **parameters)), data=[data] ) def __init__(self): env.dataprovider.check_datatype("heartbeat") view.View.__init__(self) self._heartbeat_count = env.config.general.get_int("heartbeat_count", 30) self._heartbeat_error_margin = env.config.general.get_int("heartbeat_error_margin", 3) def _get_analyzer(self, analyzerid): res = env.dataprovider.get(Criterion("heartbeat.analyzer(-1).analyzerid", "=", analyzerid), limit=1) heartbeat = res[0]["heartbeat"] analyzer = heartbeat["analyzer"][-1] return analyzer, heartbeat def _get_analyzers(self, reqstatus): # Do not take the control menu into account. # The expected behavior is yet to be determined. results = env.dataprovider.query(["max(heartbeat.create_time)", "heartbeat.analyzer(-1).analyzerid/group_by"]) if not results: return c = Criterion() for create_time, analyzerid in results: c |= Criterion("heartbeat.create_time", "==", create_time) & Criterion("heartbeat.analyzer(-1).analyzerid", "==", analyzerid) for heartbeat in env.dataprovider.get(c): heartbeat = heartbeat["heartbeat"] status, status_text = utils.get_analyzer_status_from_latest_heartbeat( heartbeat, self._heartbeat_error_margin ) if reqstatus and status not in reqstatus: continue delta = heartbeat.get("create_time") - utils.timeutil.now() analyzerid = heartbeat["analyzer(-1).analyzerid"] heartbeat_listing = url_for("HeartbeatDataSearch.forensic", criteria=Criterion("heartbeat.analyzer(-1).analyzerid", "==", analyzerid), _default=None) alert_listing = url_for("AlertDataSearch.forensic", criteria=Criterion("alert.analyzer.analyzerid", "==", analyzerid), _default=None) heartbeat_analyze = url_for(".analyze", analyzerid=analyzerid) analyzer = heartbeat["analyzer(-1)"] node_name = analyzer["node.name"] or _("Node name n/a") osversion = analyzer["osversion"] or _("OS version n/a") ostype = analyzer["ostype"] or _("OS type n/a") yield { "id": analyzerid, "label": "%s - %s %s" % (node_name, ostype, osversion), "location": analyzer["node.location"] or _("Node location n/a"), "node": node_name, "name": analyzer["name"], "model": analyzer["model"], "class": analyzer["class"], "version": analyzer["version"], "latest_heartbeat": localization.format_timedelta(delta, add_direction=True), "status": status, "status_text": status_text, "links": [ resource.HTMLNode("a", _("Alert listing"), href=alert_listing), resource.HTMLNode("a", _("Heartbeat listing"), href=heartbeat_listing), resource.HTMLNode("a", _("Heartbeat analysis"), href=heartbeat_analyze) ] } @view.route("/agents/agents", methods=["GET", "POST"], permissions=[N_("IDMEF_VIEW")], help="#agents", menu=(N_("Monitoring"), N_("Agents")), parameters=GridParameters("agents")) def agents(self): analyzer_data = list(self._get_analyzers(env.request.parameters.getlist("status"))) list(hookmanager.trigger("HOOK_AGENTS_EXTRA_CONTENT", analyzer_data)) extra_columns = filter(None, hookmanager.trigger("HOOK_AGENTS_EXTRA_COLUMN")) return view.ViewResponse(template.PrewikkaTemplate(__name__, "templates/agents.mak").render(data=analyzer_data, extra_columns=extra_columns), menu=mainmenu.HTMLMainMenu()) @view.route("/agents/delete", methods=["POST"], permissions=[N_("IDMEF_ALTER")]) def delete(self): for i in env.request.parameters.getlist("types"): if i not in ("alert", "heartbeat"): continue c = Criterion() for analyzerid in env.request.parameters.getlist("id"): c |= Criterion("%s.analyzer.analyzerid" % i, "=", analyzerid) env.dataprovider.delete(c) return response.PrewikkaRedirectResponse(url_for(".agents")) @view.route("/agents/analyze/", permissions=[N_("IDMEF_VIEW")], help="#heartbeatanalyze") def analyze(self, analyzerid): analyzer, heartbeat = self._get_analyzer(analyzerid) delta = heartbeat["create_time"] - utils.timeutil.now() analyzer.last_heartbeat_time = localization.format_timedelta(delta, add_direction=True) analyzer.status = None analyzer.events = [] res = env.dataprovider.get(Criterion("heartbeat.analyzer(-1).analyzerid", "=", analyzerid), limit=self._heartbeat_count) prev = None total_interval = 0 # Iterate from oldest heartbeat to newest for obj in reversed(res): cur = HeartbeatObject(obj["heartbeat"]) if not (prev and cur.status and cur.interval): prev = cur continue total_interval += cur.interval event = None if cur.status == "starting": if prev.status == "exiting": event = utils.AttrObj(time=cur.time_str, value=_("Normal sensor start"), type="start") else: event = utils.AttrObj(time=cur.time_str, value=_("Unexpected sensor restart"), type="unexpected_restart") elif cur.status == "running": delta = cur.time - prev.time if abs(delta.total_seconds() - cur.interval) > self._heartbeat_error_margin: delta = localization.format_timedelta(delta, granularity="second") event = utils.AttrObj(time=cur.time_str, value=_("Unexpected heartbeat interval: %(delta)s") % {'delta': delta}, type="abnormal_heartbeat_interval") elif cur.status == "exiting": event = utils.AttrObj(time=cur.time_str, value=_("Normal sensor stop"), type="normal_stop") if event: analyzer.events.append(event) prev = cur if prev: analyzer.status, analyzer.status_meaning = \ utils.get_analyzer_status_from_latest_heartbeat(obj["heartbeat"], self._heartbeat_error_margin) if analyzer.status == "missing": delta = utils.timeutil.now() - prev.time analyzer.events.append(utils.AttrObj(time=prev.time_str, value=_("Sensor is down since %s") % localization.format_timedelta(delta), type="down")) if not analyzer.status: analyzer.status, analyzer.status_meaning = "unknown", _("Unknown") if not analyzer.events: delta = localization.format_timedelta(total_interval / self._heartbeat_count) analyzer.events.append(utils.AttrObj( time="", value=_("No anomaly in the last %(count)d heartbeats (one heartbeat every %(delta)s average)") % {'count': self._heartbeat_count, 'delta': delta}, type="no_anomaly" )) return template.PrewikkaTemplate(__name__, "templates/heartbeatanalyze.mak").render(analyzer=analyzer) class HeartbeatObject(object): def __init__(self, heartbeat): self.status = heartbeat.get("additional_data('Analyzer status').data")[0] self.interval = heartbeat["heartbeat_interval"] self.time = heartbeat["create_time"] self.time_str = localization.format_datetime(self.time) prewikka-5.1.1/prewikka/views/crontab/0000775000175000017500000000000013555143705021351 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/views/crontab/templates/0000775000175000017500000000000013555143705023347 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/views/crontab/templates/cronjob.mak0000664000175000017500000001203613555143652025500 0ustar tandrejatandreja00000000000000<%! from prewikka import crontab DEFAULT_OPTION = "0 * * * *" %> <%def name="crontab_settings(enabled=True)"> <% is_custom = False custom_val = [ "", "", "", "", "" ] default_schedule_value = getattr(job, "schedule", DEFAULT_OPTION) default_schedule_label = crontab.DEFAULT_SCHEDULE.get(default_schedule_value) if not default_schedule_label: is_custom = True custom_val = default_schedule_value.split(" ") default_schedule_label = crontab.DEFAULT_SCHEDULE["custom"] if not getattr(job, "enabled", enabled): is_custom = False default_schedule_value = "disabled" default_schedule_label = crontab.DEFAULT_SCHEDULE.get(default_schedule_value) %> % if job: % endif
    prewikka-5.1.1/prewikka/views/crontab/templates/crontab.mak0000664000175000017500000000433213555143652025474 0ustar tandrejatandreja00000000000000<%! from prewikka.utils import html %>
    prewikka-5.1.1/prewikka/views/crontab/__init__.py0000664000175000017500000001100313555143652023456 0ustar tandrejatandreja00000000000000# Copyright (C) 2017-2019 CS-SI. All Rights Reserved. # Author: Yoann Vandoorselaere # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from __future__ import absolute_import, division, print_function, unicode_literals import datetime import pkg_resources from prewikka import crontab, localization, resource, response, template, utils, version, view from prewikka.utils.viewhelpers import GridAjaxResponse, GridParameters class CrontabView(view.View): plugin_name = N_("Scheduling management") plugin_author = version.__author__ plugin_license = version.__license__ plugin_version = version.__version__ plugin_copyright = version.__copyright__ plugin_description = N_("Scheduled jobs management page") plugin_htdocs = (("crontab", pkg_resources.resource_filename(__name__, 'htdocs')),) view_permissions = [N_("USER_MANAGEMENT")] @view.route("/settings/scheduler/disable", methods=["POST"]) def disable(self): crontab.update(env.request.parameters.getlist("id", type=int), enabled=False) return response.PrewikkaResponse({"type": "reload", "target": "view"}) @view.route("/settings/scheduler/enable", methods=["POST"]) def enable(self): crontab.update(env.request.parameters.getlist("id", type=int), enabled=True) return response.PrewikkaResponse({"type": "reload", "target": "view"}) @view.route("/settings/scheduler//save", methods=["POST"]) def save(self, id=None): crontab.update_from_parameters(id, env.request.parameters) return response.PrewikkaResponse({"type": "reload", "target": "view"}) @view.route("/settings/scheduler//edit") def edit(self, id=None): dataset = template.PrewikkaTemplate(__name__, "templates/cronjob.mak").dataset() dataset["job"] = crontab.get(id) return dataset.render() @view.route("/settings/scheduler", menu=(N_("Configuration"), N_("Scheduling")), help="#scheduling", parameters=GridParameters("cronjobs")) def list(self): dataset = template.PrewikkaTemplate(__name__, "templates/crontab.mak").dataset() return dataset.render() @view.route("/settings/scheduler/ajax_listing") def ajax_listing(self): now = utils.timeutil.utcnow() sort_index = env.request.parameters.get("sort_index", "name") sort_order = env.request.parameters.get("sort_order", "asc") sort_func = { "name": lambda x: _(x.name).lower(), "user": lambda x: text_type(x.user) if x.user else _("SYSTEM"), "last": lambda x: x.base, "next": lambda x: x.next_schedule - now if x.enabled else datetime.timedelta.max, } sort_key = sort_func.get(sort_index, sort_func["name"]) rows = [] for i in sorted(crontab.list(), key=sort_key, reverse=(sort_order == "desc")): if not i.enabled: next = _("Disabled") else: next = i.next_schedule - now if next.total_seconds() < 0: next = _("Pending") else: next = localization.format_timedelta(next, granularity="minute") if i.runcnt > 0: last = localization.format_timedelta(i.base - now, add_direction=True) else: last = _("n/a") if i.error: last = resource.HTMLNode("a", _("Error"), _class="cronjob-error") rows.append({ "id": i.id, "name": resource.HTMLNode("a", _(i.name), href=url_for(".edit", id=i.id)), "schedule": crontab.format_schedule(i.schedule), "user": text_type(i.user) if i.user else _("SYSTEM"), "last": last, "next": next, "error": i.error }) return GridAjaxResponse(rows, len(rows)) prewikka-5.1.1/prewikka/views/datasearch/0000775000175000017500000000000013555143705022020 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/views/datasearch/htdocs/0000775000175000017500000000000013555143705023304 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/views/datasearch/htdocs/css/0000775000175000017500000000000013555143705024074 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/views/datasearch/htdocs/css/datasearch.css0000664000175000017500000001267313555143652026717 0ustar tandrejatandreja00000000000000/* Timeline widget */ #datasearch .panel { margin-bottom: 5px; } #datasearch .panel .panel-heading { padding: 5px 5px; } #datasearch .panel .panel-heading .panel-title { font-size: 13px; } #datasearch #timeline_results { display: inline-block; height: 200px; width: 100%; } /* Search bar */ #datasearch .row .form-group { margin-bottom: 5px; } #datasearch #datasearch_search_bar .label-xs { font-size: 80%; } .ui-autocomplete { max-height: 200px; overflow-x: hidden; overflow-y: auto; position: fixed; } .ui-autocomplete-category { color: #999; font-weight: bold; line-height: 1.42857; margin: 0; padding: 5px 6px; } .ui-autocomplete > li.datasearch-field { color: #333; line-height: 1.42857; padding: 3px 20px; } .ui-autocomplete > li.datasearch-field:hover { background-color: #428BCA; color: #FFF; } .ui-autocomplete > .history-query-delete { border: none; color: #d9534f; /* Bootstrap red */ float: left; font-size: 1.1em; line-height: 1.42857; padding-left: 10px; padding-right: 10px; } #datasearch #datasearch_search_bar { margin-bottom: 5px; padding-right: 10px; padding-top: 0; position: relative; z-index: 1; } @media (max-width: 768px) { #datasearch #datasearch_search_bar { position: static; } } /* Results table */ #datasearch .hl { background-color: #A8F2FD; color: #333; } #datasearch .selected, #datasearch .selected .hl { background-color: #FDE9A8; color: #333; } #datasearch table img { margin: 0 2px; } #datasearch #datasearch_table.table-nowrap tr.jqgrow > td { white-space: nowrap; } /* Subgrid details */ #datasearch .tablediv { line-height: 0; } #datasearch .subgrid-data table.subgrid { background: none; margin-bottom: 0; table-layout: auto; } #datasearch #datasearch_table .ui-jqgrid .ui-subgrid > td { white-space: normal; } #datasearch table.subgrid td.field, #datasearch table.subgrid td.filter { white-space: nowrap; width: 1%; } #datasearch table.subgrid td.field i { opacity: .4; } #datasearch table.subgrid td.filter i { cursor: pointer; } /* * IDMEF OBJECT */ #datasearch table ul:hover .dp-1000 { display: block; visibility: visible; } #datasearch table ul .dp-1000 { display: none; visibility: hidden; } #datasearch table ul { margin-bottom: 0; padding-left: 0; } #datasearch table ul li { display: inline; } /* * No label on the first ul */ #datasearch table td > ul:first-child:not(:last-child):after { content: " "; } #datasearch table li:not(:last-child):after { content: " "; } #datasearch table ul:not(:first-child):before { content: " ("; } #datasearch table ul:not(:first-child):after { content: ")"; } #datasearch table label { margin-bottom: 0; } #datasearch table ul > li.text > label { display: none; } #datasearch table label.assessment, #datasearch table label.impact { display: none; } #datasearch table ul.impact:before, #datasearch table ul.impact:after { content: ""; } #datasearch table ul.list > ul.object > label, #datasearch ul.user_id > label { display: none; } #datasearch table ul { display: inline; } #datasearch table ul.source + ul.source, #datasearch table ul.target + ul.target { border-top: 1px dashed gray; display: block; } #datasearch table ul.source:first-child, #datasearch table ul.target:first-child { border-top: 0; } #datasearch table td > ul > label { display: none; } /* One click action */ #datasearch #PopoverOption { display: none; position: fixed; word-wrap: break-word; } #datasearch #PopoverOption .popover { display: block; font-size: small; } #datasearch #PopoverOption .popover .top > .arrow { border-bottom-width: 1px; } #datasearch #PopoverOption .popover .bottom > .arrow { border-top-width: 11px; } #datasearch .dropdown-submenu { width: 100%; } #datasearch .dropdown-submenu > .dropdown-menu { font-size: small; margin-left: -1px; margin-top: -6px; max-width: inherit; top: 0; } #datasearch .dropdown-submenu.disabled:hover > .dropdown-menu { display: none; } #datasearch .popover.left .dropdown-submenu > a:before { border-color: transparent; border-right-color: #ccc; border-style: solid; border-width: 5px 5px 5px 0; content: " "; display: block; float: left; height: 0; margin-right: -10px; margin-top: 5px; width: 0; } #datasearch .popover.left .dropdown-submenu > a:after { all: unset; } #datasearch .popover.left .dropdown-submenu > a { text-align: right; } /* Informations div content */ #datasearch .oca-infos > .dropdown-menu { width: fit-content; } #datasearch .oca-infos .ajax-spinner { transform: translate(-50%, 0); } #datasearch .oca-infos .panel-heading { padding: 5px 15px; text-align: center; } #datasearch .oca-infos .panel-body { padding: 0; } #datasearch .oca-infos .tab-content { max-height: 300px; overflow-x: hidden; overflow-y: auto; padding: 5px; } #datasearch .oca-infos .tab-content .panel { margin: 0; padding: 0; } #datasearch .oca-infos .tab-content table { margin-bottom: 0; } #datasearch .oca-infos .tab-content table td { line-height: inherit; vertical-align: middle; } #datasearch .oca-infos .tab-content table ul li { display: block; } #datasearch .oca-infos .nav > li > a { padding: 5px 15px; } prewikka-5.1.1/prewikka/views/datasearch/htdocs/js/0000775000175000017500000000000013555143705023720 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/views/datasearch/htdocs/js/datasearch.js0000664000175000017500000007351513555143652026371 0ustar tandrejatandreja00000000000000"use strict"; function DataSearchPage(backend, criterion_config, criterion_config_default, separators, timeline_url, common_paths) { var page = {}; var escapeRegex = $.ui.autocomplete.escapeRegex; /* Check if a word needs quotes */ function lucene_need_quotes(value) { /* * We add "/"" to the lucene escape characters as ELK interpret them as a regexp */ return /[/\s+\-!(){}[\]^"~*?\:\\]|&&|\|\|/g.test(value); } function idmef_need_quotes(value) { return /[\s()&|]/g.test(value); } function need_quotes(value) { var ret; if ( criterion_config_default == "criterion" ) ret = idmef_need_quotes(value); else ret = lucene_need_quotes(value); return ret; } function quote(value) { if ( need_quotes(value) ) return '"' + value.replace(/(["\\])/g, '\\$1') + '"'; return value; } function _criterion(path, operator, value) { if ( value == undefined ) value = ""; operator = criterion_config[criterion_config_default].operators[operator]; return eval(criterion_config[criterion_config_default].format); } function lucene_criterion(path, operator, value) { // We can't mix wildcards and quotes in Lucene return _criterion(path, operator, (operator == "substr" && ! need_quotes(value)) ? value + "*" : quote(value)); } function idmef_criterion(path, operator, value) { return _criterion(path, operator, quote(value)); } function criterion(path, operator, value) { var ret; if ( criterion_config_default == "criterion" ) ret = idmef_criterion(path, operator, value); else ret = lucene_criterion(path, operator, value); return ret; } function lucene_criterion_regex(path, operator, value) { var ret; var opstr = criterion_config[criterion_config_default].operators[operator]; if ( value == undefined ) value = ""; ret = escapeRegex(opstr + path + ":" + value); if ( operator == "equal" || operator == "substr" ) ret = "[^-]" + ret; return ret; } function idmef_criterion_regex(path, operator, value) { if ( value == undefined ) value = ""; if ( operator ) operator = criterion_config[criterion_config_default].operators[operator]; else operator = "\\s*[=<>]+\\s*"; return escapeRegex(path) + operator + escapeRegex(value.toString()); } function criterion_regex(path, operator, value) { var ret; if ( criterion_config_default == "criterion" ) ret = idmef_criterion_regex(path, operator, value); else ret = lucene_criterion_regex(path, operator, value); return ret.replace(/\s+/g, "\s*"); } /* Remove value, or field from the search bar */ function sub_from_search(field, operator, value, positive, search) { var regex, ffield, opregex; ffield = criterion_regex(field, operator, value); search = search === undefined? $("#input_search").val() : search; opregex = criterion_config[criterion_config_default].operators["AND"].concat(criterion_config[criterion_config_default].operators["OR"]); opregex = opregex.map(escapeRegex).join("|"); opregex = "(" + opregex + "|\\s+|^)\\s*"; regex = opregex + ffield; regex += ((value) ? /(\s+|$)/ : /(".+?"|\S+)/).source; search = search.replace(RegExp(regex, "ig"), ""); /* * Remove any empty parenthesis, or leftover && / || */ search = search.replace(RegExp(/(^\s*&&\s*)|(\s*&&\s*$)|(\(\s*\))/, "ig"), ""); return $.trim(search); } function _add_to_input(field, operator, value, positive) { value = String(value); var search; if ( positive ) { search = sub_from_search(field, operator, null, false); search = sub_from_search(field, "notequal", value, positive, search); } else { search = sub_from_search(field, operator, value, false); } if ( search ) { search += " " + criterion_config[criterion_config_default].operators["AND"][0] + " "; search = search.replace(/(\s\s+)$/g, " "); } $("#input_search").val(search + criterion(field, operator, value)); } function render_timeline(force) { var shown = $("#timeline").hasClass("collapse in"); if ( ! shown ) return; if ( $("#timeline_results").children().length > 0 && !force ) return; prewikka_resource_destroy($('#timeline_results')) $.ajax({ url: timeline_url, data: $("#form_search").serializeArray() }).done(function(data, textStatus, xhr) { $("#timeline_results").html(data); }); } /* Reset the search bar */ function reset_search() { $("#input_search").val(""); } function update_datasearch() { set_postdata(); $("#datasearch_table").trigger("reloadGrid"); render_timeline(true); } /* Create the "Informations" content */ function _create_dom_infos(category, infos, is_first) { var li = $('
  • ', { class: is_first ? "active" : "" }); var pill = $('', { text: infos.label, class: 'ajax-bypass', href: '.' + category, role: 'tab', 'data-toggle': 'pill' }); pill.appendTo(li); li.appendTo($(".oca-infos .nav")); var div_infos = $('
    ', { role: "tabpanel", class: "tab-pane fade in " + category + (is_first ? " active" : "") }); div_infos.append(infos.info.toHTML ? infos.info.toHTML() : infos.info); div_infos.appendTo($(".oca-infos .tab-content")); } /* Delete the "Informations" content and show the spinner */ function _clean_dom_infos() { $(".oca-infos .nav > li, .oca-infos .tab-content > div").remove(); $(".oca-infos").find('.ajax-spinner, .processed-content').toggleClass("hidden"); } function get_range_info(e) { var range; var textNode; var offset; var startNode; if ( document.caretPositionFromPoint ) { range = document.caretPositionFromPoint(e.clientX, e.clientY); textNode = range.offsetNode; offset = range.offset; range = document.createRange(); range.setStart(textNode, offset); range.setEnd(textNode, offset); } else if ( document.caretRangeFromPoint ) { range = document.caretRangeFromPoint(e.clientX, e.clientY); textNode = range.startContainer; offset = range.startOffset; } else if ( document.body.createTextRange ) { range = document.body.createTextRange(); range.moveToPoint(event.clientX, event.clientY); textNode = range.parentElement(); startNode = document.body.createTextRange(); startNode.moveToElementText(textNode); range.setEndPoint("StartToStart", startNode); offset = range.text.length; textNode = textNode.firstChild; } return [range, offset, textNode]; } function update_selection(e) { var range; var textNode; var offset; var startNode; var startPos; var endNode; var endPos; var textLen; // Do not change the selection when the popover is shown var visible = $("#PopoverOption").is(':visible'); if ( visible ) return; [range, offset, textNode] = get_range_info(e); // If the current node is not a text node, do nothing if ( textNode === null || textNode.nodeType != 3 ) return; // When the mouse is hovering over the start of a paragraph, // or when it's hovering over a word separator, do nothing. if ( offset === 0 || separators.word.indexOf(textNode[offset]) > -1 ) return; textNode.parentNode.focus(); startNode = textNode; startPos = offset; endNode = textNode; endPos = offset; // Find the word's starting position find_start: while ( true ) { for ( ; startPos > 0; startPos-- ) { if ( separators.word.indexOf(startNode.textContent[startPos - 1]) > -1 ) { break find_start; } } if ( startNode.parentNode.previousSibling !== null ) { startNode = startNode.parentNode.previousSibling.firstChild; startPos = startNode.textContent.length; } else { break find_start; } } // Find the word's ending position find_end: while ( true ) { for ( textLen = endNode.length; endPos < textLen; endPos++ ) { if ( separators.word.indexOf(endNode.textContent[endPos]) > -1 || separators.term.indexOf(endNode.textContent[endPos]) > -1 ) { break find_end; } } if ( endNode.parentNode.nextSibling !== null ) { endNode = endNode.parentNode.nextSibling.firstChild; endPos = 0; } else { break find_end; } } // Apply the new selection range = document.createRange(); range.setStart(startNode, startPos); range.setEnd(endNode, endPos); var selection = window.getSelection(); selection.removeAllRanges(); selection.addRange(range); } function remove_selection(e) { // Do not change the selection when the popover is shown var visible = $("#PopoverOption").is(':visible'); if ( visible ) return; var selection = window.getSelection(); selection.removeAllRanges(); } function hide_popover(e) { $("#PopoverOption").hide(); $("span.selected").each(function() { var parent = $(this).parent(); $(this).contents().unwrap(); // Merge text nodes parent.html(function(i, html) { return html; }); }); } function prepare_popover(e) { if ( e.which != 1 ) return; var selection = window.getSelection(); if ( selection === null || selection.anchorNode === null || !selection.rangeCount ) return; var range = selection.getRangeAt(0); var range2 = get_range_info(e)[0]; if ( range !== null && range2 !== null && range.compareBoundaryPoints(Range.START_TO_START, range2) > 0 || range.compareBoundaryPoints(Range.END_TO_END, range2) < 0 ) { hide_popover(e); return; } e.stopImmediatePropagation(); e.preventDefault(); var selected_value = selection.toString(); var contents = range.extractContents(); var div = $("", {class: "selected"}); div[0].appendChild(contents); range.insertNode(div[0]); div.closest(".selectable").find("span:empty").remove(); if ( ! $("#PopoverOption").is(':visible') ) { display_popover(div, selected_value); selection.removeAllRanges(); } } /* Popover on click on selection */ function display_popover(node, selvalue) { var offset = node.offset(); var rowid = node.closest("tr").attr("id"); var td = node.closest("td").first(); var selected_field = node.closest("[data-field]"); var selected_value = node.closest("[data-value]"); var next_char = node[0].nextSibling.nodeValue[0]; var selected_operator = separators.term.indexOf(next_char) === -1 ? "equal" : "substr"; selected_value = selected_value.length > 0 ? selected_value.data("value") : selvalue; selected_field = selected_field.data("field"); $("#PopoverOption a:not(.addon_search)") .data("field", selected_field) .data("operator", selected_operator) .data("value", selected_value).show(); $("#PopoverOption .dropdown-submenu:not(.oca-infos)").each(function() { $(this).find('.addon_search').each(function() { var d = $(this).data(); var href = d.link; if ( ! href ) { href = $(this).attr("href"); $(this).data("link", href); } var value = selected_value; if ( d.field ) value = $('#datasearch_table').jqGrid('getCell', rowid, d.field); $(this).attr("href", href.replace(/%24value/g, encodeURIComponent(value))); if ( d.path ) $(this).toggleClass('hidden', d.path !== backend + "." + selected_field.replace(/\(\d+\)/g, "")); }); $(this).toggleClass('disabled', $(this).find('li a:not(.hidden)').length == 0); }); $("#PopoverOption a.groupby_search").attr("href", prewikka_location().href + "?groupby[]=" + selected_field); $("#PopoverOption .groupby_search span").text(common_paths[selected_field] || selected_field); $("#PopoverOption").show(); var oca_position = "bottom"; var popover = $("#PopoverOption .popover"); var top = offset.top + node.height(); var left = offset.left - popover.width() / 2 + node.width() / 2; popover.find(".dropdown-submenu").removeClass("pull-left"); if ( offset.left + node.width() / 2 + popover.width() > window.innerWidth ) { top -= popover.height() / 2 + node.height() / 2; left = offset.left - popover.width(); oca_position = "left"; popover.find(".dropdown-submenu").addClass("pull-left"); } else if ( offset.left - node.width() / 2 - popover.width() / 2 < 0 ) { top -= popover.height() / 2 + node.height() / 2; left = offset.left + node.width(); oca_position = "right"; } else if ( offset.top + node.height() + popover.height() > window.innerHeight ) { top = offset.top - (node.height() / 2 + popover.height()); oca_position = "top"; } popover.removeClass("bottom top right left").addClass(oca_position); $("#PopoverOption").css({"top": top, "left": left}); /* Modify the "informations" content if empty */ var divinfos = $(".oca-infos"); if ( divinfos.find('.panel-heading').text() === selected_value ) return false; else _clean_dom_infos(); var elem = { field: selected_field, value: selected_value, query: criterion(selected_field, selected_operator, selected_value), query_mode: criterion_config_default }; var orig = $("#datasearch_table").jqGrid('getGridParam', 'userData')[rowid].cell; if ( orig._criteria ) elem["_criteria"] = JSON.stringify(orig._criteria); $.ajax({ url: prewikka_location().pathname + "/ajax_infos", data: elem, prewikka: {spinner: false, error: false}, success: function(data) { divinfos.find('.panel-heading').text(selected_value); var is_first = true; $.each(data.infos, function(k, v) { _create_dom_infos(k, v, is_first); is_first = false; }); }, error: function(xhr, status, error) { var m; if ( ! xhr.responseText ) m = {message: error}; else m = JSON.parse(xhr.responseText); divinfos.find(".tab-content").html(m.content); }, complete: function() { divinfos.find('.ajax-spinner, .processed-content').toggleClass("hidden"); } }); } function set_postdata() { var pdata = $("#datasearch_table").getGridParam("postData") || {}; $.each($("#form_search :input").serializeArray(), function(i, input) { // Exclude groupby field since the goal is to reload the table if ( input.name != "groupby[]" ) pdata[input.name] = input.value; }); return pdata; } page.listing = function(elem, columns, url, jqgrid_params) { CommonListing(elem, {}, { datatype: "json", url: url, postData: set_postdata(), colNames: columns.names, colModel: columns.model, rowattr: function(row, data, id) { if ( data._classes ) return { "class": data._classes }; }, subGrid: true, useSearchbar: true, beforeProcessing: function(data) { _destroy_components(elem); data.userdata = data.rows; $("#datasearch input[name='datasearch_criteria']").val(JSON.stringify(data.criteria)); }, loadComplete: function() { _resizeGrid($(elem)); _initialize_components(elem); $("span.selectable", elem).on("mousemove", "span", update_selection) .on("mouseleave", "span", remove_selection) .on("mousedown", "span", prepare_popover); }, subGridRowExpanded: function(subgridDivId, rowId) { var subgrid = $("#" + $.jgrid.jqID(subgridDivId)); /* Delete the first empty td when the checkboxes are not present */ if (! $("#view-config-editable").prop("checked")) { subgrid.parent().siblings().first().remove(); } subgrid.html("
    "); var elem = {}; var orig = $(this).jqGrid('getGridParam', 'userData')[rowId].cell; for ( var i in orig ) { elem[i] = (orig[i] && orig[i].toValue) ? orig[i].toValue() : orig[i]; } if ( orig._criteria ) elem["_criteria"] = JSON.stringify(orig._criteria); $.ajax({ url: prewikka_location().pathname + "/ajax_details", data: elem, prewikka: {spinner: false}, success: function(result) { subgrid.html(result); _initialize_components(subgrid); }, error: function(result) { subgrid.html(result.responseJSON.content); } }); } }, jqgrid_params); }; /* Custom event to update datasearch */ $("#main").on("datasearch:update", function() { prewikka_save_parameters($("#form_search").serializeArray()); update_datasearch(); }); /* Event on link to add a complex filter in the searchbar */ $("#main").on("click", "td a.add_search", function() { var criteria = $(this).data("criteria"); criteria.forEach(function(criterion) { _add_to_input(criterion["field"], criterion["operator"], criterion["value"], true); }); hide_popover(); update_datasearch(); }); /* Event on popover link */ $("#main").on("click", "#PopoverOption .new_search, #PopoverOption .add_search, .subgrid i.add_search", function() { if ( $(this).hasClass("new_search") ) reset_search(); _add_to_input($(this).data("field"), $(this).data("operator") || "equal", $(this).data("value"), true); hide_popover(); update_datasearch(); }); $("#main").on("click", "#PopoverOption .del_search, .subgrid i.del_search", function() { var search = sub_from_search($(this).data("field"), null, quote($(this).data("value")), false); $("#input_search").val(search); _add_to_input($(this).data("field"), "not" + ($(this).data("operator") || "equal"), $(this).data("value"), false); hide_popover(); update_datasearch(); }); $("#view-config-editable").change(function() { $("#datasearch_table").jqGrid($(this).prop("checked") ? 'showCol' : 'hideCol', 'cb'); $("#main .footer-buttons").collapse($(this).prop("checked") ? 'show' : 'hide'); $("#datasearch_table").find("td.sgexpanded").click(); $("#form_search :input[name=editable]").val($(this).prop("checked") ? 1 : 0); }).change(); $("#view-config-condensed").change(function() { $("#datasearch_table").toggleClass("table-nowrap", $(this).prop("checked")); $("#form_search :input[name=condensed]").val($(this).prop("checked") ? 1 : 0); }).change(); $("#datasearch_table").parents(".row").change("change", function () { $("#main .footer-buttons .btn.needone").prop("disabled", $("#datasearch_table input.cbox:checked").length == 0); }).change(); $("#prewikka-view-config-datasearch :input").on("change", function() { prewikka_update_parameters($("#form_search :input:not(.mainmenu)").serializeArray()); }); $("#form_search").on("submit", function(event) { if ( $("select[name='groupby[]'] :selected").length > 0 ) return; event.preventDefault(); update_datasearch(); /* * Since we override the default form submit behavior, * we need to manually update the parameters so that the mainmenu is saved. */ prewikka_save_parameters( $("#form_search").serializeArray(), prewikka_location().href, { "complete": function() { $("#form_search").trigger("submit-complete"); } } ); }); $("#timeline").on('show.bs.collapse', function() { $("#_main").css("overflow", "hidden"); }); $("#timeline").on('shown.bs.collapse hidden.bs.collapse', function() { var shown = $("#timeline").hasClass("collapse in"); $("#timeline input").attr("value", (shown) ? "1" : "0"); prewikka_update_parameters($("#form_search :input:not(.mainmenu)").serializeArray()); render_timeline(); resizeGrid(); $("#_main").css("overflow", "auto"); }); $("#main .footer-buttons").on({'shown.bs.collapse': resizeGrid, 'hidden.bs.collapse': resizeGrid}); $("#main").on("reload", function() { update_datasearch(); return false; }); $("#main").on("mousedown", function(event) { // Hide the popover if clicked outside var in_popover = $(event.target).parents("#PopoverOption", ".processed-content").length > 0; if ( ! in_popover ) hide_popover(); }); $("#PopoverOption .dropdown-submenu").hover(function handlerIn() { if ( $(this).offset().top + 500 > window.innerHeight ) $(this).find(".dropdown-menu").css({"top": "unset", "bottom": 0}); }, function handlerOut() { $(this).find(".dropdown-menu").css({"top": "", "bottom": ""}); }); var window_width = $(window).width(); $("#main").on("resize", function() { if ( $(window).width() != window_width ) { window_width = $(window).width(); var chart = $("[class^=renderer-elem]"); chart.find("div").first().css("width", "100%"); chart.trigger("resize"); } }); $('#datasearch_table').on('mouseover mouseout', ".l", function(e) { $(this).toggleClass('hover', e.type == 'mouseover'); e.stopPropagation(); }); $("#form_search .datasearch-mode").on("click", function() { criterion_config_default = (criterion_config_default == "lucene") ? "criterion" : "lucene"; $(this).text(criterion_config_default.capitalize()); $("#form_search input[name=query_mode]").val(criterion_config_default); prewikka_update_parameters($("#form_search").serializeArray()); reset_search(); }); /* Refresh the search bar when click on refresh button */ $("#form_search .datasearch-refresh").on("click", reset_search); $("#datasearch_grid_form").on("submit-prepare", function(event, form, data) { var idlist = []; var grid = $("#datasearch_table").getGridParam("userData"); $.each($("#datasearch_table").getGridParam("selarrrow"), function(_, value) { data.push({name: "criteria[]", value: JSON.stringify(grid[value].cell._criteria)}); }); return data; }); $("#datasearch_export_form").on("submit-prepare", function(event, form, data) { var grid = $("#datasearch_table").getRowData(); var selected_rows = []; $.each($("#datasearch_table").getGridParam("selarrrow"), function(_, value) { selected_rows.push(grid[value]); }); data.push({"name": "datasearch_grid", "value": JSON.stringify(selected_rows)}); }); if ( $("#main #timeline").hasClass("in") ) render_timeline(); return page; } function datasearch_autocomplete_init(availabledata, history, labels) { var escapeRegex = $.ui.autocomplete.escapeRegex; var data = {fields: [], history: []}; function split(val) { return val.split( /(\s+-?)/ ); } /* Extract the last term to autocomplete */ function extractLast(term) { return split(term).pop(); } /* Delete specific query in history */ function delete_query(item) { prewikka_ajax({ type: 'POST', url: $(item).data('url'), data: {query: $(item).data('query')}, prewikka: {spinner: false} }); } availabledata.forEach(function(item) { data.fields.push({'category': labels['Fields'], 'value': item}); }); if ( history.content !== null ) history.content.forEach(function(item) { data.history.push({'category': labels['Query history'], 'value': item, 'url': history.url['delete']}); }); /* Redesign the select (without overwriting autocomplete) */ $.widget("datasearch.myautocomplete", $.ui.autocomplete, { _create: function() { this._super(); this.widget().menu( "option", "items", "> :not(.ui-autocomplete-category)" ); }, _renderMenu: function(ul, items) { var that = this, currentcategory = ""; $.each(items, function(index, item) { if ( item.category != currentcategory ) { ul.append($("
  • ", {"class": "ui-autocomplete-category", "text": item.category})); currentcategory = item.category; } that._renderItemData(ul, item); }); }, _renderItem: function(ul, item) { var li = $("
  • ") .attr("class", "datasearch-field") .append(item.value); // The class ui-menu-item is mandatory // otherwise, the element is processed as a menu separator if ( item.url ) { li = $("", {"class": "fa fa-trash history-query-delete ui-menu-item", "data-url": item.url, "data-query": item.value}) .add(li); } li.appendTo(ul); return li; }, _close: function (event) { if ( event != undefined && event.keepOpen === true ) { this.search(null, event); return true; } return this._super(event); } }); $("#form_search").on("submit", function() { var query = $("#input_search").val(); if ( ! query || data.history.indexOf(query) === -1 ) return; data.history.unshift({'category': labels['Query history'], 'value': query, 'url': history.url['delete']}); }); /* Autocomplete on search bar */ $("#input_search").on("keydown", function(event) { if ( event.which === $.ui.keyCode.TAB && $(this).myautocomplete("instance").menu.active ) { event.preventDefault(); } }).myautocomplete({ appendTo: "#datasearch", minLength: 0, delay: 700, source: function(request, response) { var matcher = new RegExp("^-?" + escapeRegex(extractLast(request.term)), "i"); var entries = {}; $.each(data, function(key, value) { entries[key] = $.grep(value, function(item) { return matcher.test(item.value); }); }); // Display only 5 history entries response(entries.fields.concat(entries.history.slice(0, 5))); }, focus: function() { return false; }, select: function( event, ui ) { var target = event.originalEvent.originalEvent.target; if ( target.localName == "i" ) { // Delete the entry remotely delete_query(target); // Delete the entry locally data.history = $.grep(data.history, function(e) { return e.value != ui.item.value; }); $.extend(event.originalEvent, {keepOpen: true}); return false; } // Replace the last term with the selection var terms = this.value.split(/\s+/); terms.pop(); terms.push(ui.item.value); this.value = terms.join(" "); return false; } }).focus(function() { $(this).myautocomplete("search"); }); } prewikka-5.1.1/prewikka/views/datasearch/templates/0000775000175000017500000000000013555143705024016 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/views/datasearch/templates/details.mak0000664000175000017500000000242313555143652026137 0ustar tandrejatandreja00000000000000<%! import datetime from prewikka import view %> % for field in fields_info: <% try: value = fields_value[field] except view.MissingParameterError: continue icon_type = "paragraph" if isinstance(value, (int, float)): icon_type = "hashtag" elif isinstance(value, datetime.datetime): icon_type = "clock-o" elif isinstance(value, bytes): value = "\\x" + value.encode("hex") %> % endfor
    ${ field } ${value}
    prewikka-5.1.1/prewikka/views/datasearch/templates/forensic.mak0000664000175000017500000002245013555143652026324 0ustar tandrejatandreja00000000000000<%namespace file="/prewikka/views/datasearch/templates/table.mak" import="GroupbyTable"/> <%! import itertools from prewikka import hookmanager, utils %> <% labels = dict((label, _(label)) for label in ( N_("Fields"), N_("Query history") )) %> % for resource in extra_resources: ${resource} % endfor
    % if not search.groupby:
    % endif
    prewikka-5.1.1/prewikka/views/datasearch/templates/infos.mak0000664000175000017500000000060713555143652025632 0ustar tandrejatandreja00000000000000 % for idx, (value, occur) in enumerate(selected_occur): % if idx == 0: % endif % endfor
    ${ _("Field") } ${ selected_field }
    ${ _("Occurrence") }${ occur } ${ value }
    prewikka-5.1.1/prewikka/views/datasearch/templates/table.mak0000664000175000017500000000164213555143652025603 0ustar tandrejatandreja00000000000000<%! import datetime %> <%def name="GroupbyTable(search)"> % for group in search.groupby: % endfor <% step = search.get_step() %> % for result in search.get_result(): % for idx, group in enumerate(search.groupby): <% label = result[idx + 1] if isinstance(label, datetime.datetime): label = label.strftime(step.unit_format) %> % endfor % endfor
    ${ group }${ _("Count") }
    ${ label } ${ result[0] }
    prewikka-5.1.1/prewikka/views/datasearch/__init__.py0000664000175000017500000000000013555143652024120 0ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/views/datasearch/alert.py0000664000175000017500000001304113555143652023501 0ustar tandrejatandreja00000000000000# coding: utf-8 # Copyright (C) 2017-2019 CS-SI. All Rights Reserved. # Author: Yoann Vandoorselaere # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. """DataSearch alert view.""" from __future__ import absolute_import, division, print_function, unicode_literals import collections import prelude from prewikka import resource, utils, version from . import idmef class AlertFormatter(idmef.IDMEFFormatter): def __init__(self, data_type): idmef.IDMEFFormatter.__init__(self, data_type) self._objects = {"alert.create_time": self._format_time, "alert.classification": self._format_classification} def _format_classification(self, root, obj, finfo): severity = root.get("alert.assessment.impact.severity") severity = "impact_severity_%s" % severity if severity else "" r = resource.HTMLNode("ul", self._format_value( root.get("alert.classification"), prelude.IDMEFClass("alert.classification.text"), _class=severity, tooltip=root.get("alert.assessment.impact.description") )) for i in ("alert.assessment", "alert.correlation_alert", "alert.tool_alert", "alert.overflow_alert"): obj = root.get(i) if obj: r += self._format_object(root, obj, prelude.IDMEFClass(i)) return r class AlertQueryParser(idmef.IDMEFQueryParser): _sort_order = ["alert.create_time/order_desc"] def add_order(self, field, order="asc"): self._sort_order = ["alert.%s/order_%s" % (field, order)] class AlertDataSearch(idmef.IDMEFDataSearch): plugin_name = "DataSearch: Alerts" plugin_author = version.__author__ plugin_license = version.__license__ plugin_version = version.__version__ plugin_copyright = version.__copyright__ plugin_description = N_("Alert listing page") type = "alert" name = "alerts" section = N_("Alerts") tabs = (N_("Alerts"), N_("Aggregated alerts")) formatter = AlertFormatter query_parser = AlertQueryParser criterion_config_default = "criterion" sort_path_default = "create_time" groupby_default = ["source(0).node.address(0).address"] path_translate = {"classification": (("alert.classification.text", "alert.correlation_alert.name"), None), "source": (("alert.source(*).node.name", "alert.source(*).node.address(*).address"), None), "target": (("alert.target(*).node.name", "alert.target(*).node.address(*).address"), None), "analyzer(-1)": (("alert.analyzer(-1).node.name", "alert.analyzer(-1).node.location", "alert.analyzer(-1).node.address(*).address"), None)} default_columns = collections.OrderedDict([ ("alert.create_time", N_("Date")), ("alert.classification", N_("Classification")), ("alert.source", N_("Source")), ("alert.target", N_("Target")), ("alert.analyzer(-1)", N_("Analyzer")) ]) lucene_search_fields = ["classification", "source", "target", "analyzer(-1)"] _delete_confirm = N_("Delete the selected alerts?") def _get_default_cells(self, obj): cells = idmef.IDMEFDataSearch._get_default_cells(self, obj) severity = obj.get("alert.assessment.impact.severity") if severity: cells["_classes"] = "assessment_impact_severity_%s" % severity return cells def _build_table(self, idmefd): rows = [] for key, value in sorted(idmefd.items()): colkey = resource.HTMLNode("td", key) colval = resource.HTMLNode("td", ", ".join(value) if isinstance(value, list) else value) rows.append(resource.HTMLNode("tr", colkey, colval)) return resource.HTMLNode("table", *rows, _class="table table-condensed") def _build_classification(self, alert): idmef = {} self._recurse_idmef(idmef, alert["classification"]) self._recurse_idmef(idmef, alert["assessment"]) return self._build_table(idmef) def _generic_builder(self, alert, path): idmef = {} self._recurse_idmef(idmef, alert[path]) return self._build_table(idmef) def _get_extra_infos(self): builders = { "classification": self._build_classification, "assessment": self._build_classification } field = env.request.parameters["field"] parent_field = field.split('.', 1)[0] criteria = utils.json.loads(env.request.parameters["_criteria"]) alert = env.dataprovider.get(criteria)[0]["alert"] builder = next((v for k, v in builders.items() if k in field), None) if builder: html = builder(alert) else: try: html = self._generic_builder(alert, parent_field) except RuntimeError: return [] return [("idmef", utils.AttrObj(label=_("IDMEF"), info=html))] prewikka-5.1.1/prewikka/views/datasearch/datasearch.py0000664000175000017500000006053713555143652024505 0ustar tandrejatandreja00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2015-2019 CS-SI. All Rights Reserved. # Author: Sélim Menouar # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. """ DataSearch view """ from __future__ import absolute_import, division, print_function, unicode_literals import collections import copy import csv import datetime import functools import itertools import operator import pkg_resources import re from prewikka.utils import json from prewikka import error, history, hookmanager, mainmenu, resource, response, template, utils, view from prewikka.dataprovider import Criterion, ResultObject from prewikka.dataprovider.parsers import criteria, lucene from prewikka.localization import format_datetime from prewikka.renderer import RendererItem from prewikka.statistics import ChronologyChart, DiagramChart, Query COLUMN_PROPERTIES = functools.partial(utils.AttrObj, hidden=False, align="center", cellattr="default_cellattr") _DEFAULT_CHART_TYPES = {"chronology": "timebar", "diagram": "bar"} _DATETIME_FMT = "%Y-%m-%d %H:%M:%S" _TEMPORAL_VALUES = [N_("minute"), N_("hour"), N_("day"), N_("month"), N_("year")] _MAX_RECURSION_DEPTH = 100 class MaximumDepthExceeded(Exception): pass class DataSearchParameters(view.Parameters): def register(self): self.optional("limit", int, default=30, save=True) self.optional("chart_type", text_type, save=True) self.optional("timeline", int, default=1, save=True) self.optional("query_mode", text_type, save=True) self.optional("editable", int, save=True) self.optional("condensed", int, save=True) self.optional("jqgrid_params_datasearch_table", json.loads, default={}, persist=True) class HighLighter(object): """ Create an HTML representation of a phrase """ _word_separators = [' ', '[', ']', '=', '(', ')', '"', "'", '<', '>', '\r', '\n', '\t'] _term_separators = ['-', '/', '\\', ',', '.', ':', '?', '@', '_'] def __init__(self, phrase): self.value = self.get_clean_value(phrase) parsed_phrase = [self.word_prepare(word) for word in self.split_phrase(phrase)] self.html = resource.HTMLNode("span", *parsed_phrase, _class="selectable") @classmethod def get_separators(cls): return { "word": cls._word_separators, "term": cls._term_separators } @staticmethod def get_clean_value(value): return value @classmethod def split_phrase(cls, phrase): return [phrase] @classmethod def word_prepare(cls, word): return resource.HTMLNode("span", word) class Formatter(object): highlighter = HighLighter ignore_fields = frozenset() _converters = { datetime.datetime: lambda f, r, o: resource.HTMLNode("span", format_datetime(o), **{"data-field": f.field}) } def __init__(self, data_type): self._enrich_data_cb = [elem[1] for elem in sorted(hookmanager.trigger("HOOK_DATASEARCH_FORMATTER_ENRICH_CALLBACK"))] self.type = data_type def _format_nonstring(self, field, value): if isinstance(value, list): value = ", ".join(value) return resource.HTMLNode("span", resource.HTMLNode("span", value), _class="selectable", **{"data-field": field}) def format_value(self, field, value): if not isinstance(value, text_type): return self._format_nonstring(field, value) hl = self.highlighter(value or "n/a") node, value = hl.html, hl.value node.attrs["data-field"] = field for i in self._enrich_data_cb: node = i(node, value, self.type) return node def format(self, finfo, root, obj): if finfo.type in self._converters: return self._converters[finfo.type](finfo, root, obj) if finfo.field in self.ignore_fields: return obj return self.format_value(finfo.field, obj) class QueryParser(object): path_prefix = "{backend}." def _prepare_groupby_query(self, groupby): self._path = ["count(1)"] groupby = set(groupby) ogroup = list(groupby - set(_TEMPORAL_VALUES)) tgroup = list(groupby & set(_TEMPORAL_VALUES)) self.groupby = ogroup + tgroup for field in ogroup: if field not in self._parent.path_translate: self._path.append('%s%s/group_by' % (self.path_prefix, field)) else: for i in self._parent.path_translate[field][0]: self._path.append('%s/group_by' % (i)) if not tgroup: self._path[0] = "count(1)/order_desc" return if len(tgroup) > 1: raise error.PrewikkaUserError(N_("Time group error"), N_("Only one time unit can be specified in a groupby query")) self._time_group = tgroup[0] self._date_selection_index = len(self._path) self._path += self._time_selection(self._time_group) def __init__(self, query, parent, groupby=[], offset=0, limit=50): self.type = parent.type self.query = query self.offset = offset self.limit = limit self.groupby = [] self._time_group = None self._path = [] self._result = None self._parent = parent self._date_selection_index = None self.criteria = self.get_criteria(query) self.all_criteria = self.criteria + env.request.menu.get_criteria() if groupby: self._prepare_groupby_query(groupby) else: self._path = ['%s%s' % (self.path_prefix, field) for field in self._parent.all_fields] def get_result(self): if self._result: return self._result if self.groupby: res = self._groupby_query() else: res = self._query() if self._date_selection_index: res = ResultDatetimeIterator(res, self._date_selection_index) self._result = res return res @classmethod def _lucene_escape(cls, value): if re.search(r'[/\s+\-!(){}[\]^"~*?\:\\]|&&|\|\|', value): return '"%s"' % re.sub(r'(["\\])', r'\\\1', value) return value @classmethod def format_criterion(cls, path, value, mode): if mode == "lucene": if isinstance(value, (int, float, datetime.datetime)): return "%s:%s" % (path, value) if not value: return "-%s:[* TO *]" % path return "%s:%s" % (path, cls._lucene_escape(value)) return text_type(Criterion(path, "==", value)) def get_groupby_link(self, groups, values, step, cview): url_param = env.request.menu.get_parameters() query_mode = env.request.parameters.get("query_mode", self._parent.criterion_config_default) query = [] if self.query: query.append(self.query) for group, value in zip(groups, values): if group not in _TEMPORAL_VALUES: query.append(self.format_criterion(group, value, query_mode)) else: precision = mainmenu.TimeUnit(step.unit) + 1 url_param["timeline_mode"] = "custom" url_param["timeline_start"] = mainmenu.TimePeriod.mktime_param(value, precision) url_param["timeline_end"] = mainmenu.TimePeriod.mktime_param((value + step.timedelta), precision) - 1 url_param.update({ "limit": env.request.parameters["limit"] }) query_str = (" %s " % self._parent.criterion_config[query_mode]["operators"]["AND"][0]).replace(" ", " ").join(query) return url_for(cview, query=query_str, query_mode=query_mode, **url_param) def get_step(self): if self._time_group: step = mainmenu.MainMenuStep(self._time_group, 1) else: step = env.request.menu.get_step(100) return step def diagram(self, cview, step=None, **kwargs): if not self.groupby: return None if step is None: step = self.get_step() chart_type = env.request.parameters.get("chart_type", _DEFAULT_CHART_TYPES["diagram"]) try: return env.renderer.render(chart_type, [list(self._diagram_data(cview, step))], **kwargs) except error.PrewikkaUserError: return {"html": None, "script": None} def chronology(self, **kwargs): paths = ["{backend}.%s" % path for path in self.groupby] query = Query(path=paths, aggregate="count(1)", criteria=self.criteria, limit=self.limit, offset=self.offset, datatype=self._parent.type) label = _(env.dataprovider.get_label(self._parent.type)) linkview = env.viewmanager.get_view(endpoint=".forensic") linkparams = {"query": env.request.parameters.get("query"), "query_mode": env.request.parameters.get("query_mode", self._parent.criterion_config_default)} return ChronologyChart(env.request.parameters.get("chart_type", _DEFAULT_CHART_TYPES["chronology"]), label, [query], linkview=linkview, linkparams=linkparams, **kwargs).render() def _fix_operator(self, left, op): if op in env.dataprovider.get_path_info(left).operators: return op return "=" if op[0] != "!" else "!=" def _criterion_compile(self, left, op, right): if left not in self._parent.path_translate: left = "%s.%s" % (self.type, left) return Criterion(left, self._fix_operator(left, op), right) paths, valuefunc = self._parent.path_translate[left] if valuefunc: right = valuefunc(right) # Translation (for source [A, B]): # source : (A != None || B != None) # !source : !(A != None || B != None) => !(A || B) # source != test: (A != test && B != test) # source == test: (A == test || B == test) if op[0] == "!" and right is not None: f = operator.and_ else: f = operator.or_ return functools.reduce(lambda x, y: f(x, y), (Criterion(i, self._fix_operator(i, op), right) for i in paths)) def get_criteria(self, query): if not query: return Criterion() qmode = env.request.parameters.get("query_mode", self._parent.criterion_config_default) if qmode == "criterion": return criteria.parse(query, transformer=criteria.CriteriaTransformer(compile=self._criterion_compile)) elif qmode == "lucene": if self._parent.criterion_config_default != "lucene": tr = lucene.CriteriaTransformer(compile=self._criterion_compile, default_paths=self._parent.lucene_search_fields) return lucene.parse(query, transformer=tr) else: return Criterion("{backend}._raw_query", "==", query) def _time_selection(self, time_unit): selection = [] for unit in range(int(mainmenu.TimeUnit(time_unit) + 1)): selection += ["timezone({backend}.{time_field}, '%s'):%s/order_asc,group_by" % (env.request.user.timezone, mainmenu.TimeUnit(unit).dbunit)] return selection def add_order(self, field, order="asc"): if order not in ("asc, desc"): return try: idx = self._path.index("{backend}.%s" % field) except ValueError: self._path.append("{backend}.%s/order_%s" % (field, order)) else: self._path[idx] += "/order_%s" % order def _diagram_data(self, cview, step): """Generator for the diagram chart""" for result in self.get_result(): value = result[0] labels = result[1:] link = self.get_groupby_link(self.groupby, labels, step, cview=cview) if self._date_selection_index: labels[-1] = labels[-1].strftime(step.unit_format) yield RendererItem(value or "", ", ".join((text_type(x) for x in labels)), link) def _query(self): return env.dataprovider.query(self._path, self.all_criteria, limit=self.limit, offset=self.offset, type=self.type) def _groupby_query(self): return self._query() class DataSearch(view.View): view_parameters = DataSearchParameters plugin_htdocs = (("datasearch", pkg_resources.resource_filename(__name__, 'htdocs')),) type = None section = None formatter = Formatter query_parser = QueryParser groupby_default = [] sort_path_default = "timestamp" criterion_config = {} criterion_config_default = "lucene" path_translate = {} default_columns = {} lucene_search_fields = [] _extra_resources = [] criterion_config["lucene"] = { "format": 'operator + path + ":" + value', "operators": { "equal": "", "notequal": "-", "substr": "", "notsubstr": "-", "AND": ["", "AND"], "OR": ["OR"] } } criterion_config["criterion"] = { "format": 'path + " " + operator + " " + value', "operators": { "equal": "=", "notequal": "!=", "substr": "<>", "notsubstr": "!<>", "AND": ["&&"], "OR": ["||"] } } def _get_fields(self): return env.dataprovider.get_paths(self.type) def _get_column_property(self, field, pi): pass def _default_order(self, value): try: return self._main_fields.index(value) except ValueError: return 100 def _prepare_fields(self): for field in sorted(self._get_fields(), key=self._default_order): field = field.split(".", 1)[1] self.all_fields.append(field) self.fields_info[field] = pi = env.dataprovider.get_path_info("%s.%s" % (self.type, field)) pi.filterable = pi.type is not datetime.datetime pi.groupable = pi.type is not object pi.column_index = self._column_index self._column_index += 1 cprop = self._get_column_property(field, pi) if cprop: self.columns_properties[field] = cprop def __init__(self): env.dataprovider.check_datatype(self.type) self._formatter = self.formatter(self.type) self._column_index = 0 self.all_fields = [] self._main_fields = list(self.default_columns.keys()) self.fields_info = collections.OrderedDict() self.columns_properties = collections.OrderedDict() self._prepare_fields() view.View.__init__(self) hookmanager.register("HOOK_LOAD_HEAD_CONTENT", [resource.CSSLink("datasearch/css/datasearch.css")]) section = self.section or env.dataprovider.get_label(self.type) tabs = self.tabs or (N_("Forensic"), N_("Dashboard")) view.route("/%s/forensic/ajax_timeline" % self.name, self.ajax_timeline) view.route("/%s/forensic/ajax_table" % self.name, self.ajax_table) view.route("/%s/forensic/ajax_details" % self.name, self.ajax_details) view.route("/%s/forensic/ajax_infos" % self.name, self.ajax_infos) view.route("/%s/forensic/csv_download" % self.name, self.csv_download, methods=["POST"]) view.route("/%s/forensic" % self.name, self.forensic, menu=(section, tabs[0]), keywords=["listing", "inheritable"], datatype=self.type, priority=1, help="#%sforensic" % self.type, methods=["POST", "GET"]) view.route("/%s/dashboard" % self.name, self.dashboard, menu=(section, tabs[1]), datatype=self.type, help="#%sdashboard" % self.type, methods=["POST", "GET"]) def _set_common(self, dataset): view.View.render(self) dataset["backend"] = self.type dataset["limit"] = env.request.parameters["limit"] # Deepcopy is necessary because the forensic template updates the object values dataset["columns_properties"] = colsprop = copy.deepcopy(self.columns_properties) for prop, finfo, func in filter(None, self._trigger_datasearch_hook("EXTRA_COLUMN")): colsprop[prop.label] = COLUMN_PROPERTIES(**dict(prop)) dataset["separators"] = self._formatter.highlighter.get_separators() dataset["criterion_config"] = self.criterion_config dataset["criterion_config_default"] = env.request.parameters.get("query_mode", self.criterion_config_default) query = env.request.parameters.get("query") if query: history.save(env.request.user, "%s_form_search" % self.type, query) dataset["history"] = history.create(env.request.user, "%s_form_search" % self.type) def _criteria_to_urlparams(self, criteria): # Link creation from other pages (e.g. statistics) return { "query": criteria.to_string(noroot=True), # remove the prefixed type "query_mode": "criterion" } def _trigger_datasearch_hook(self, name, *args): return itertools.chain(hookmanager.trigger("HOOK_DATASEARCH_%s" % name, *args), hookmanager.trigger("HOOK_DATASEARCH_%s_%s" % (self.type.upper(), name), *args)) def get_forensic_actions(self): return [resource.HTMLNode("button", _("CSV export"), formaction=url_for(".csv_download"), type="submit", form="datasearch_export_form", _class="btn btn-default needone", _sortkey="download", _icon="fa-file-excel-o")] def dashboard(self, groupby=[]): return self.forensic(groupby, is_dashboard=True) def _get_dataset(self): return template.PrewikkaTemplate(__name__, "templates/forensic.mak").dataset() def forensic(self, groupby=[], is_dashboard=False): groupby = env.request.parameters.getlist("groupby") or groupby query = env.request.parameters.get("query") mode = env.request.parameters.get("query_mode", self.criterion_config_default) if groupby and not(is_dashboard): raise error.RedirectionError(url_for(".dashboard", query=query, groupby=groupby, query_mode=mode), 302) if not groupby and is_dashboard: groupby = self.groupby_default dataset = self._get_dataset() self._set_common(dataset) dataset["available_types"] = filter(lambda x: list(env.renderer.get_backends(x)) and x != "table", DiagramChart.TYPES if groupby else ChronologyChart.TYPES) dataset["chart_type"] = env.request.parameters.get("chart_type", _DEFAULT_CHART_TYPES["diagram" if groupby else "chronology"]) dataset["groupby_tempo"] = _TEMPORAL_VALUES dataset["fields_info"] = self.fields_info dataset["actions"] = itertools.chain(self.get_forensic_actions(), self._trigger_datasearch_hook("ACTION")) dataset["search"] = self.query_parser(query, groupby=groupby, limit=env.request.parameters["limit"], parent=self) dataset["extra_resources"] = self._extra_resources dataset["common_paths"] = {path.split(".", 1)[-1]: _(label).lower() for label, path in env.dataprovider.get_common_paths(self.type, index=True)} return view.ViewResponse(dataset) def _prepare(self, page=1, limit=-1): query = env.request.parameters.get("query") if query: history.save(env.request.user, "%s_form_search" % self.type, query) search = self.query_parser(query, groupby=env.request.parameters.get("groupby"), offset=(page - 1) * limit, limit=limit, parent=self) field = env.request.parameters.get("sort_index") order = env.request.parameters.get("sort_order") if field in self.all_fields: search.add_order(field, order) elif field in self.path_translate: search.add_order(self.path_translate[field][0][0].split(".", 1)[-1], order) else: search.add_order(self.sort_path_default, "desc") return search def csv_download(self): grid = utils.json.loads(env.request.parameters["datasearch_grid"], object_pairs_hook=collections.OrderedDict) with utils.mkdownload("table.csv") as dl: w = csv.writer(dl) if grid: w.writerow(grid[0].keys()) for row in grid: w.writerow(map(lambda x: x.encode("utf8"), row.values())) return dl def ajax_timeline(self): query = self.query_parser(env.request.parameters.get("query"), parent=self) data = query.chronology(height=200) return response.PrewikkaResponse(resource.HTMLSource(""" %s """ % (data["html"], data["script"] or ""))) def _get_default_cells(self, obj): r = {} for fname, cprop in self.columns_properties.items(): finfo = self.fields_info[fname] r[fname] = self._formatter.format(finfo, obj, obj[finfo.column_index]) return r def ajax_table(self): search = self._prepare(int(env.request.parameters.get("page", 1)), int(env.request.parameters.get("rows", 30))) results = search.get_result() resrows = [] extradata = list(self._trigger_datasearch_hook("EXTRA_DATA", results)) extracol = list(filter(None, self._trigger_datasearch_hook("EXTRA_COLUMN"))) for i, obj in enumerate(results): cells = self._get_default_cells(obj) for prop, finfo, func in extracol: if isinstance(obj, ResultObject): ret = func(obj, extradata) else: ret = func({"%s.%s" % (self.type, f): v for f, v in zip(self.all_fields, obj)}, extradata) if finfo: cells[prop.name] = self._formatter.format(finfo, obj, ret) else: cells[prop.name] = ret resrows.append({"id": text_type(i), "cell": cells}) return utils.viewhelpers.GridAjaxResponse(resrows, results.total, criteria=search.all_criteria).add_html_content(mainmenu.HTMLMainMenu(update=True)) def ajax_details(self): tmpl = template.PrewikkaTemplate(__name__, "templates/details.mak") return response.PrewikkaResponse(tmpl.dataset(fields_info=self.fields_info, fields_value=env.request.parameters)) def _get_common_infos(self): tmpl = template.PrewikkaTemplate(__name__, "templates/infos.mak") query = self.query_parser(env.request.parameters["query"], groupby=[env.request.parameters["field"]], limit=5, parent=self) occurrences = [(value, count) for count, value in query.get_result()] return tmpl.dataset(selected_field=env.request.parameters["field"], selected_occur=occurrences).render() def _get_extra_infos(self): return [] def ajax_infos(self): infos = collections.OrderedDict() infos["general"] = utils.AttrObj(label=_("General"), info=self._get_common_infos()) extra_infos = filter(None, hookmanager.trigger("HOOK_DATASEARCH_INFO", env.request.parameters)) for category, data in itertools.chain(extra_infos, self._get_extra_infos()): infos[category] = data return response.PrewikkaResponse({"infos": infos}) class ResultDatetimeIterator(object): def __init__(self, results, date_selection_index): self._results = results self._date_selection_index = date_selection_index def __getattr__(self, x): return self.__dict__.get(x, getattr(self._results, x)) def __iter__(self): for i in self._results: tval = [int(x) for x in i[self._date_selection_index:]] tval += [1] * (3 - min(3, len(tval))) # Minimum length for datetime. tval = datetime.datetime(*tval).replace(tzinfo=env.request.user.timezone) yield i[:self._date_selection_index] + [tval] prewikka-5.1.1/prewikka/views/datasearch/heartbeat.py0000664000175000017500000000476013555143652024341 0ustar tandrejatandreja00000000000000# coding: utf-8 # Copyright (C) 2018-2019 CS-SI. All Rights Reserved. # Author: Antoine Luong # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. """DataSearch heartbeat view.""" from __future__ import absolute_import, division, print_function, unicode_literals import collections from prewikka import version from . import idmef class HeartbeatFormatter(idmef.IDMEFFormatter): def __init__(self, data_type): idmef.IDMEFFormatter.__init__(self, data_type) self._objects = {"heartbeat.create_time": self._format_time} class HeartbeatQueryParser(idmef.IDMEFQueryParser): _sort_order = ["heartbeat.create_time/order_desc"] def add_order(self, field, order="asc"): self._sort_order = ["heartbeat.%s/order_%s" % (field, order)] class HeartbeatDataSearch(idmef.IDMEFDataSearch): plugin_name = "DataSearch: Heartbeats" plugin_author = version.__author__ plugin_license = version.__license__ plugin_version = version.__version__ plugin_copyright = version.__copyright__ plugin_description = N_("Heartbeat listing page") type = "heartbeat" name = "heartbeats" section = N_("Monitoring") tabs = (N_("Heartbeats"), N_("Aggregated heartbeats")) formatter = HeartbeatFormatter query_parser = HeartbeatQueryParser criterion_config_default = "criterion" sort_path_default = "create_time" groupby_default = ["analyzer(-1).name"] default_columns = collections.OrderedDict([ ("heartbeat.create_time", N_("Date")), ("heartbeat.analyzer(-1).name", N_("Agent")), ("heartbeat.analyzer(-1).node.address(*).address", N_("Node address")), ("heartbeat.analyzer(-1).node.name", N_("Node name")), ("heartbeat.analyzer(-1).model", N_("Model")) ]) _delete_confirm = N_("Delete the selected heartbeats?") prewikka-5.1.1/prewikka/views/datasearch/idmef.py0000664000175000017500000002152113555143652023460 0ustar tandrejatandreja00000000000000# coding: utf-8 # Copyright (C) 2017-2019 CS-SI. All Rights Reserved. # Author: Yoann Vandoorselaere # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. """DataSearch IDMEF view.""" from __future__ import absolute_import, division, print_function, unicode_literals from prewikka import dataprovider, resource, response, template, utils, view from prewikka.localization import format_datetime from . import datasearch import collections import prelude class IDMEFHighLighter(datasearch.HighLighter): _word_separators = ["\n"] class IDMEFFormatter(datasearch.Formatter): highlighter = IDMEFHighLighter def _format_time(self, root, obj, finfo): href = None if root["%s.messageid" % self.type]: href = url_for("%ssummary.render" % self.type, messageid=root["%s.messageid" % self.type], _default=None) return resource.HTMLNode("a", format_datetime(obj), href=href, title=_("See IDMEF details"), **{"data-toggle": "tooltip", "data-container": "#main"}) def _format_value(self, obj, iclass, default="", label=True, _class="", tooltip=None): key = text_type(iclass) if not obj: return default value = obj.get(key) if not value: return default if label: label = resource.HTMLNode("label", key, ":") else: label = "" field = ".".join([obj.path.split(".", 1)[-1], key]) kwargs = {} if tooltip: kwargs = { "title": tooltip, "data-toggle": "tooltip", "data-placement": "top", "data-container": "#main" } return resource.HTMLNode("li", label, self.format_value(field, value), _class="%s %s dp-%d" % (_class, key, self._get_priority(iclass)), **kwargs) @staticmethod def _get_priority(obj): return int(obj.getAttributes().get("priority", 100)) def _format_object(self, root, child, iclass): out2 = [] key = text_type(iclass) child = child if isinstance(child, collections.Iterable) else [child] for j in filter(None, map(lambda x: self._format_generic(root, x), child)): out2.append(resource.HTMLNode("ul", *j, _class="object %s dp-%d" % (key, self._get_priority(iclass)))) if out2: if iclass.isList(): return resource.HTMLNode("ul", *[resource.HTMLNode("li", o) for o in out2], _class="list %s dp-%d" % (key, self._get_priority(iclass))) else: return resource.HTMLNode("", resource.HTMLNode("label", key, _class=key), out2[0]) def _format_generic(self, root, obj): out = [] for iclass in sorted(self.get_childs(obj), key=self._get_priority): child = obj.get(text_type(iclass)) if child is None: continue if self._get_priority(iclass) != 0: continue vtype = iclass.getValueType() if vtype == prelude.IDMEFValue.TYPE_CLASS: o = self._format_object(root, child, iclass) ret = resource.HTMLNode("li", o) if o else None else: ret = self._format_value(obj, iclass) if ret: out.append(ret) return out def format(self, finfo, root, obj): if finfo.path in self._objects: return self._objects[finfo.path](root, obj, finfo.path) try: cl = prelude.IDMEFClass(finfo.path) if cl.getValueType() == prelude.IDMEFValue.TYPE_CLASS: return self._format_object(root, obj, cl) except Exception: pass return datasearch.Formatter.format(self, finfo, root, obj) def get_childs(self, obj): i = 0 cl = prelude.IDMEFClass(obj.getId()) while True: try: child = cl.get(i) except Exception: break i += 1 yield child def __contains__(self, k): return k in self._objects class IDMEFQueryParser(datasearch.QueryParser): def _groupby_query(self): return env.dataprovider.query(self._path, self.all_criteria, limit=self.limit, offset=self.offset, type=self.type) def _query(self): # FIXME: we could avoid performing two queries if libpreludedb supported CURSOR. ret = env.dataprovider.get(self.all_criteria, limit=self.limit, offset=self.offset, type=self.type, order_by=self._sort_order) ret.total = env.dataprovider.query(["count(1)"], self.all_criteria, type=self.type)[0][0] return ret class IDMEFDataSearch(datasearch.DataSearch): view_permissions = [N_("IDMEF_VIEW")] def _get_default_cells(self, obj): cells = datasearch.DataSearch._get_default_cells(self, obj) cells["_criteria"] = dataprovider.Criterion("%s.messageid" % self.type, "=", obj["%s.messageid" % self.type]) return cells def _get_fields(self): return set(env.dataprovider.get_paths(self.type)) | set(self._main_fields) | set(self._extra_table_fields) def _get_column_property(self, field, pi): pi.column_index = pi.path hidden = pi.path not in self._main_fields if hidden and pi.path not in self._extra_table_fields: return None label = self.default_columns.get("%s.%s" % (self.type, field), field.capitalize()) sortable = prelude.IDMEFPath(pi.path).getValueType() != prelude.IDMEFValue.TYPE_CLASS return datasearch.COLUMN_PROPERTIES(label=label, name=field, index=field, hidden=hidden, sortable=sortable) def __init__(self, *args, **kwargs): self._extra_table_fields = [] config = env.config.datasearch.get_instance_by_name(self.type) if config: self._extra_table_fields = [x.strip() for x in config.get("extra_fields").split(",")] datasearch.DataSearch.__init__(self, *args, **kwargs) view.route("/%s/delete" % self.type, method=self.delete, methods=["POST"], permissions=["IDMEF_ALTER"]) self.columns_properties["create_time"].width = 110 def get_forensic_actions(self): ret = [] if env.request.user.has("IDMEF_ALTER"): ret = [resource.HTMLNode("button", _("Delete"), **{ "form": "datasearch_grid_form", "type": "submit", "formaction": url_for(".delete"), "formmethod": "POST", "class": "btn btn-danger needone", "data-confirm": _(self._delete_confirm), })] return datasearch.DataSearch.get_forensic_actions(self) + ret def delete(self): criteria = dataprovider.Criterion() for i in env.request.parameters.getlist("criteria", type=utils.json.loads): criteria |= i if criteria: env.dataprovider.delete(criteria) return response.PrewikkaResponse({"type": "reload", "target": ".commonlisting", "options": {"current": False}}) def _recurse_idmef(self, output, obj): for i in self._formatter.get_childs(obj): vtype = i.getValueType() child = obj.get(i.getName()) if child is None: continue if vtype == prelude.IDMEFValue.TYPE_CLASS: if isinstance(child, collections.Iterable): for j in child: self._recurse_idmef(output, j) else: self._recurse_idmef(output, child) else: if isinstance(child, utils.CachingIterator): for idx, j in enumerate(child): path = obj.path + "." + i.getName() + "(%d)" % idx output[path.split(".", 1)[-1]] = j else: path = obj.path + "." + i.getName() output[path.split(".", 1)[-1]] = child def ajax_details(self): obj = env.dataprovider.get(utils.json.loads(env.request.parameters["_criteria"]))[0] out = {} self._recurse_idmef(out, obj) return response.PrewikkaResponse(template.PrewikkaTemplate(__name__, "templates/details.mak").dataset(fields_info=sorted(out.keys(), key=utils.path_sort_key), fields_value=out)) prewikka-5.1.1/prewikka/views/datasearch/threat.py0000664000175000017500000000724713555143652023674 0ustar tandrejatandreja00000000000000# coding: utf-8 # Copyright (C) 2018-2019 CS-SI. All Rights Reserved. # Author: Camille Gardet # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. """DataSearch threat view.""" from __future__ import absolute_import, division, print_function, unicode_literals import collections import prelude from prewikka import dataprovider, resource, version from . import alert, datasearch class ThreatFormatter(alert.AlertFormatter): def __init__(self, data_type): alert.AlertFormatter.__init__(self, data_type) self._objects["alert.classification.text"] = self._format_classification def _format_classification(self, root, obj, finfo): return resource.HTMLNode("ul", self._format_value( root.get("alert.classification"), prelude.IDMEFClass("alert.classification.text"), label=False, tooltip=root.get("alert.assessment.impact.description") )) class ThreatQueryParser(alert.AlertQueryParser): def __init__(self, query, parent, groupby=[], offset=0, limit=50): alert.AlertQueryParser.__init__(self, query, parent, groupby, offset, limit) threat_criterion = dataprovider.Criterion("alert.assessment.impact.severity", "=", "high") | ( dataprovider.Criterion("alert.assessment.impact.severity", ">=", "medium") & dataprovider.Criterion("alert.correlation_alert.name", "!=", None) ) self.criteria += threat_criterion self.all_criteria = self.criteria + env.request.menu.get_criteria() class ThreatDataSearch(alert.AlertDataSearch): plugin_name = "DataSearch: Threats" plugin_author = version.__author__ plugin_license = version.__license__ plugin_version = version.__version__ plugin_copyright = version.__copyright__ plugin_description = N_("Threat listing page") name = "threats" section = N_("Threats") tabs = (N_("Threats"), N_("Aggregated threats")) formatter = ThreatFormatter query_parser = ThreatQueryParser default_columns = collections.OrderedDict([ ("alert.create_time", N_("Date")), ("alert.classification.text", N_("Classification")), ("alert.source(0).node.address(0).address", N_("Source")), ("alert.target(0).node.address(0).address", N_("Target")), ("alert.analyzer(-1).name", N_("Program")) ]) def _get_column_property(self, field, pi): pi.column_index = pi.path hidden = pi.path not in self._main_fields if hidden and pi.path not in self._extra_table_fields: return None return datasearch.COLUMN_PROPERTIES(label=self.default_columns.get('alert.%s' % field, field.capitalize()), name=field, index=field, hidden=hidden, sortable=True, align="left" if pi.path == "alert.classification.text" else "center") prewikka-5.1.1/prewikka/views/filter/0000775000175000017500000000000013555143705021206 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/views/filter/htdocs/0000775000175000017500000000000013555143705022472 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/views/filter/htdocs/css/0000775000175000017500000000000013555143705023262 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/views/filter/htdocs/css/filter.css0000664000175000017500000000316213555143652025264 0ustar tandrejatandreja00000000000000div.panel-disabled { display: none; } .type-checkbox { display: none; } .section-checkbox:checked + label a:after { content: "\2714"; } .panel-theme .panel-heading .type-checkbox:checked + label > span { background-color: #5CB85C; } .type-checkbox:checked + label a:after { content: "\2714"; } .panel-theme .panel-heading .type-checkbox + label > span { background-color: #D9534F; } .type-checkbox + label a:after { content: "\2717"; } span.badge > a { color: white; text-decoration: none; } div.filter-edition { background: rgba(250, 240, 210, 0.5); border: 1px solid #dcc896; border-radius: 5px; padding: 5px; } ul.filter-list { list-style: outside none none; } ul.filter-list > *::before { border-width: 0 0 2px 0; border-style: solid; border-color: #ccc; content: ""; position: absolute; width: 10px; left: -10px; height: 1px !important; top: 13px !important; } ul.filter-list li:first-child::before { top: 0; height: 50%; } ul.filter-list li { position: relative; margin-bottom: 2px; } ul.filter-list { position: relative; } ul.filter-list::before { border-width: 0 0 0 2px; border-style: solid; border-color: #ccc; content: ""; position: absolute; left: 30px; height: calc(100% - 12px); top: -3px; } div.filter-group > button { margin-top: 3px; margin-bottom: 3px; } div.filter-group > span:first-child { margin-right: 50px; } div.operator { padding: 0; min-width: 30px; cursor: pointer; } div.operator > div[data-toggle=dropdown] { line-height: 28px; } prewikka-5.1.1/prewikka/views/filter/htdocs/js/0000775000175000017500000000000013555143705023106 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/views/filter/htdocs/js/filter.js0000664000175000017500000001064113555143652024734 0ustar tandrejatandreja00000000000000function get_criterion(selector) { var selector = $(selector); if ( selector.hasClass("filter-group") ) return _get_group_criterion(selector); else return _get_condition_criterion(selector); } function _get_group_criterion(selector) { var ret = null; var operator = selector.children("span.dropdown").children(":input.input-value").val(); $.each(selector.children(".filter-list").children("li").children(), function() { if ( ret == null ) ret = get_criterion(this); else ret = Criterion(ret, operator, get_criterion(this)); }); return ret; } function _get_condition_criterion(selector) { var values = $.map(selector.find(":input.input-value"), function(input) { return $(input).val(); }); return Criterion(values[0], values[1], values[2] || null); } function FilterEdition(selector, default_paths, all_paths, operators, enums, tooltips) { var that = this; this.init = function() { $(selector).find(".data-paths").each(function() { that.init_condition($(this)); }); } this.init_condition = function(select) { select.select2_container({ width: "300px" }); that.init_operators(select); that.init_autocomplete(select); } this.init_operators = function(select) { var type = select.closest(".filter-edition").data("type"); var ul = select.parent().siblings(".operator").children("ul").empty(); var opdiv = $(ul).siblings("div[data-toggle=dropdown]"); var oplist = operators[type][select.val()]; $.each(oplist, function(index, operator) { $("
  • ").append($("", { "data-value": operator, "title": tooltips[operator] }).text(operator)).appendTo(ul); }); if ( oplist.indexOf(opdiv.text()) == -1 ) { opdiv.children("span").first().text(oplist[0]); } } this.init_autocomplete = function(select) { var path = select.val(); var type = select.closest(".filter-edition").data("type"); var input = select.parent().siblings(".data-value"); if ( enums[type][path] == null ) { if ( input.hasClass("ui-autocomplete-input") ) input.autocomplete("destroy"); return; } input.autocomplete({ minLength: 0, source: enums[type][path] }) .focus(function() { $(this).autocomplete("search"); }); } $(selector).on("click", ".newgroup", function() { var li = $("
  • ").append($("div#example-group").clone().children()); $(this).siblings("ul").append(li); }); $(selector).on("click", ".newcond", function() { var li = $("
  • ").append($("div#example-condition").clone().children()); var select = li.find(".data-paths"); var type = $(this).closest(".filter-edition").data("type"); $.each(default_paths[type], function(label, path) { select.find("optgroup:first-child").append($(" prewikka-5.1.1/prewikka/views/filter/templates/filterlisting.mak0000664000175000017500000000330113555143652026553 0ustar tandrejatandreja00000000000000
    prewikka-5.1.1/prewikka/views/filter/templates/menu.mak0000664000175000017500000000444213555143652024647 0ustar tandrejatandreja00000000000000<% root_id = 'main_menu_ng' if inline else 'main_menu_ng_block' %>
    prewikka-5.1.1/prewikka/views/filter/templates/widget.mak0000664000175000017500000000766213555143652025175 0ustar tandrejatandreja00000000000000<%! from prewikka.dataprovider import CriterionOperator %> <%def name="condition(field='', operator=CriterionOperator.EQUAL, value='', **kwargs)">
    <%def name="group(operator=CriterionOperator.AND, operands=None, root=False, **kwargs)"> <% OPERATORS = {"&&": _("AND"), "||": _("OR")} %>
    % if not root: % endif
      % if operands is not None: % for operand in operands:
    • ${init(operand, **kwargs)}
    • % endfor % else:
    • ${condition(**kwargs)}
    • % endif
    <%def name="init(criterion, root=False, **kwargs)"> % if not criterion: ${group(root=root, **kwargs)} % elif criterion.operator.is_boolean: ${group(criterion.operator, criterion.operands, root, **kwargs)} % else: ${condition(criterion.left, criterion.operator, criterion.right, **kwargs)} % endif prewikka-5.1.1/prewikka/views/filter/__init__.py0000664000175000017500000000074413555143652023325 0ustar tandrejatandreja00000000000000from __future__ import absolute_import, division, print_function, unicode_literals from prewikka import version class FilterPlugin(object): plugin_name = "Filters management" plugin_author = version.__author__ plugin_license = version.__license__ plugin_version = version.__version__ plugin_copyright = version.__copyright__ plugin_description = N_("Filters management page") plugin_database_branch = version.__branch__ plugin_database_version = "0" prewikka-5.1.1/prewikka/views/filter/filter.py0000664000175000017500000002362613555143652023057 0ustar tandrejatandreja00000000000000# Copyright (C) 2004-2019 CS-SI. All Rights Reserved. # Author: Yoann Vandoorselaere # Author: Nicolas Delon # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from __future__ import absolute_import, division, print_function, unicode_literals import pkg_resources from prewikka import database, error, hookmanager, resource, response, template, view from prewikka.dataprovider import CriterionOperator from prewikka.utils import AttrObj, json from prewikka.utils.viewhelpers import GridParameters from . import FilterPlugin class Filter(object): def __init__(self, id_, name, category, description, criteria): self.id_ = id_ self.name = name self.category = category self.description = description self.criteria = criteria def flatten_criteria(self): ret = {} for typ, criterion in self.criteria.items(): crit = criterion.flatten() if not crit.operator.is_boolean: crit = AttrObj(operator=CriterionOperator.AND, operands=[crit]) ret[typ] = crit return ret class FilterDatabase(database.DatabaseHelper): def get_filters(self, user, ftype=None): l = self.query("SELECT id, name, category, description, value FROM Prewikka_Filter " "WHERE userid = %s ORDER BY name", user.id) l = next(hookmanager.trigger("HOOK_FILTER_LISTING", l), l) for id_, name, category, description, value in l: criteria = json.loads(value) if not ftype or ftype in criteria: yield Filter(id_, name, category, description, criteria) def get_filter(self, user, name=None, id_=None): query = "SELECT id, name, category, description, value FROM Prewikka_Filter WHERE userid = %(user)s" if name: query += " AND name = %(name)s" if id_: query += " AND id = %(id)s" rows = self.query(query, user=user.id, name=name, id=id_) if not rows: return None id_, name, category, description, value = rows[0] return Filter(id_, name, category, description, json.loads(value)) def upsert_filter(self, user, filter_): values = (user.id, filter_.id_, filter_.name, filter_.category, filter_.description, json.dumps(filter_.criteria)) self.upsert("Prewikka_Filter", ("userid", "id", "name", "category", "description", "value"), [values], pkey=("id",)) def delete_filter(self, user, name=None, id_=None): query = "SELECT id, name FROM Prewikka_Filter WHERE userid = %(user)s" if name: query += " AND name = %(name)s" if id_: query += " AND id = %(id)s" rows = self.query(query, user=user.id, name=name, id=id_) if rows: self.query("DELETE FROM Prewikka_Filter WHERE id IN %s", (row[0] for row in rows)) return rows def get_categories(self, user): query = "SELECT category FROM Prewikka_Filter WHERE userid = %(user)s AND category IS NOT NULL GROUP BY category ORDER BY category" return [row[0] for row in self.query(query, user=user.id)] class FilterView(FilterPlugin, view.View): plugin_htdocs = (("filter", pkg_resources.resource_filename(__name__, 'htdocs')),) _filter_menu_tmpl = template.PrewikkaTemplate(__name__, "templates/menu.mak") def __init__(self): view.View.__init__(self) self._db = FilterDatabase() def _get_types(self): for typ in sorted(env.dataprovider.get_types(public=True)): yield typ, _(env.dataprovider.get_label(typ)) @view.route("/settings/filters", menu=(N_("Preferences"), N_("Filters")), help="#filters", parameters=GridParameters("filters")) def listing(self): dataset = {} data = [] for fltr in self._db.get_filters(env.request.user): elem = { "id": fltr.id_, "name": resource.HTMLNode( "a", fltr.name, href=url_for(".edit", name=fltr.name), title=_("Filter %s") % fltr.name ), "category": fltr.category, "description": fltr.description } for typ in fltr.criteria: elem[typ] = True data.append(elem) dataset["data"] = data dataset["columns"] = self._get_types() return template.PrewikkaTemplate(__name__, "templates/filterlisting.mak").render(**dataset) @hookmanager.register("HOOK_USER_DELETE") def _user_delete(self, user): self._filter_delete(user) def _filter_delete(self, user, name=None, id_=None): for fid, fname in self._db.delete_filter(user, name, id_): list(hookmanager.trigger("HOOK_FILTER_DELETE", user, fname, fid)) @hookmanager.register("HOOK_MAINMENU_PARAMETERS_REGISTER") def _filter_parameters_register(self, view): view.optional("filter", text_type, save=True) return ["filter"] @hookmanager.register("HOOK_DATAPROVIDER_CRITERIA_PREPARE") def _filter_get_criteria(self, ctype): if not env.request.has_menu: return fname = env.request.menu_parameters.get("filter") if not fname: return return self._filter_get_criteria_by_name(fname, ctype) @hookmanager.register("HOOK_FILTER_GET_CRITERIA") def _filter_get_criteria_by_name(self, fname, ctype, user=None): f = self._db.get_filter(user or env.request.user, fname) if not f: return return f.criteria.get(ctype) @hookmanager.register("HOOK_MAINMENU_EXTRA_CONTENT") def _filter_html_menu(self, ctype, parameters, **kwargs): filters = list(self._db.get_filters(env.request.user, ctype)) current_filter = parameters.get("filter") if current_filter not in [x.name for x in filters]: current_filter = None filter_categories = {} for fltr in filters: filter_categories.setdefault(fltr.category, []).append(fltr) dset = self._filter_menu_tmpl.dataset( current_filter=current_filter, filter_categories=filter_categories, **kwargs ) return resource.HTMLSource(dset.render()) @hookmanager.register("HOOK_CHART_PREPARE") def _chart_prepare(self, query, options): filter_name = options.get("filter") if not filter_name: return c = self._filter_get_criteria_by_name(filter_name, query.datatype, options.get("owner")) if not c: raise error.PrewikkaUserError(N_("Filter error"), N_("Filter '%s' does not exist", filter_name)) query.criteria &= c @view.route("/settings/filters/new", help="#filteredition") @view.route("/settings/filters//edit", help="#filteredition") def edit(self, name=None): id_ = env.request.parameters.get("duplicate", type=int) dataset = { "fltr": AttrObj(id_="", name="", category="", description="", criteria={}), "categories": self._db.get_categories(env.request.user), "types": list(self._get_types()) } if name or id_: dataset["fltr"] = self._db.get_filter(env.request.user, name, id_) dataset["fltr"].criteria = dataset["fltr"].flatten_criteria() if "duplicate" in env.request.parameters: dataset["fltr"].name = None return template.PrewikkaTemplate(__name__, "templates/filteredition.mak").render(**dataset) @view.route("/settings/filters/delete", methods=["POST"]) def delete(self): for id_ in env.request.parameters.getlist("id", type=int): self._filter_delete(env.request.user, id_=id_) @view.route("/settings/filters/save", methods=["POST"]) def save(self): name = env.request.parameters.get("filter_name") old_name = env.request.parameters.get("filter_old_name") category = env.request.parameters.get("filter_category") description = env.request.parameters.get("filter_description") if not name: raise error.PrewikkaUserError(N_("Could not save filter"), N_("No name for this filter was provided")) criteria = dict(zip( env.request.parameters.getlist("filter_types"), (json.loads(c) for c in env.request.parameters.getlist("filter_criteria")) )) filter_ = self._db.get_filter(env.request.user, old_name) if old_name else None filter_id = filter_.id_ if filter_ else None # Ensure the filter name is not already used by this user if name != old_name and self._db.get_filter(env.request.user, name): raise error.PrewikkaUserError(N_("Could not save filter"), N_("The filter name is already used by another filter")) # Do not erase filter components if the dataprovider failed to load if filter_: new_criteria = filter_.criteria new_criteria.update(criteria) criteria = new_criteria criteria = dict((k, v) for k, v in criteria.items() if v is not None) self._db.upsert_filter(env.request.user, Filter(filter_id, name, category, description, criteria)) return response.PrewikkaResponse({"type": "reload", "target": "#main_menu_ng", "options": {"filter": name}}) prewikka-5.1.1/prewikka/views/idmefnav/0000775000175000017500000000000013555143705021512 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/views/idmefnav/htdocs/0000775000175000017500000000000013555143705022776 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/views/idmefnav/htdocs/css/0000775000175000017500000000000013555143705023566 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/views/idmefnav/htdocs/css/idmefnav.css0000664000175000017500000000016313555143652026072 0ustar tandrejatandreja00000000000000.idmefnav-svg svg { max-width: 100%; height: 100%; } .idmefnav-svg svg g.node text { fill: #000000; } prewikka-5.1.1/prewikka/views/idmefnav/htdocs/graph/0000775000175000017500000000000013555143705024077 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/views/idmefnav/htdocs/graph/Action.svg0000664000175000017500000000277613555143652026052 0ustar tandrejatandreja00000000000000 Action Action Action [ENUM] category (None) prewikka-5.1.1/prewikka/views/idmefnav/htdocs/graph/AdditionalData.svg0000664000175000017500000000430213555143652027462 0ustar tandrejatandreja00000000000000 AdditionalData AdditionalData AdditionalData [STRING] meaning (Optional) prewikka-5.1.1/prewikka/views/idmefnav/htdocs/graph/Address.svg0000664000175000017500000000742213555143652026213 0ustar tandrejatandreja00000000000000 Address Address Address [STRING] netmask (0..1) [STRING] address (1) [ENUM] category (Optional) [STRING] vlan-name (Optional) [INTEGER] vlan-num (Optional) [STRING] ident (Optional) prewikka-5.1.1/prewikka/views/idmefnav/htdocs/graph/Alert.svg0000664000175000017500000026320613555143652025701 0ustar tandrejatandreja00000000000000 Alert OverflowAlert OverflowAlert [BYTE[]] buffer (0..1) [STRING] program (1) [INTEGER] size (0..1) Alert Alert [STRING] messageid (Optional) Alert->OverflowAlert CorrelationAlert CorrelationAlert [STRING] alertident (1..*) [STRING] name (1) Alert->CorrelationAlert ToolAlert ToolAlert [STRING] alertident (1..*) [STRING] command (0..1) [STRING] name (1) Alert->ToolAlert DetectTime DetectTime Alert->DetectTime 0..1 AdditionalData AdditionalData [STRING] meaning (Optional) Alert->AdditionalData 0..* Target Target [STRING] interface (Optional) [ENUM] decoy (Optional) [STRING] ident (Optional) Alert->Target 0..* Classification Classification [STRING] text (Required) [STRING] ident (Optional) Alert->Classification 1 Analyzer Analyzer [STRING] name (Optional) [STRING] version (Optional) [STRING] ostype (Optional) [STRING] model (Optional) [STRING] osversion (Optional) [STRING] class (Optional) [STRING] manufacturer (Optional) [STRING] analyzerid (Optional) Alert->Analyzer 1 AnalyzerTime AnalyzerTime Alert->AnalyzerTime 0..1 Source Source [STRING] interface (Optional) [STRING] ident (Optional) [ENUM] spoofed (Optional) Alert->Source 0..* Assessment Assessment Alert->Assessment 0..1 CreateTime CreateTime Alert->CreateTime 1 Address Address [STRING] netmask (0..1) [STRING] address (1) [ENUM] category (Optional) [STRING] vlan-name (Optional) [INTEGER] vlan-num (Optional) [STRING] ident (Optional) Node Node [STRING] location (0..1) [STRING] name (0..1) [ENUM] category (Optional) [STRING] ident (Optional) Node->Address 0..* Target->Node 0..1 Process Process [STRING] path (0..1) [INTEGER] pid (0..1) [STRING] name (1) [STRING] env (0..*) [STRING] arg (0..*) [STRING] ident (Optional) Target->Process 0..1 Service Service [PORTLIST] portlist (0..1) [STRING] protocol (0..1) [STRING] name (0..1) [INTEGER] port (0..1) [INTEGER] ip_version (Optional) [STRING] iana_protocol_name (Optional) [STRING] ident (Optional) [INTEGER] iana_protocol_number (Optional) Target->Service 0..1 User User [ENUM] category (Optional) [STRING] ident (Optional) Target->User 0..1 File File [ENUM] category (0..1) [INTEGER] disk-size (0..1) [STRING] ident (0..1) [STRING] name (1) [INTEGER] data-size (0..1) [DATETIME] create-time (0..1) [DATETIME] access-time (0..1) [STRING] path (1) [STRING] file-type (0..1) [DATETIME] modify-time (0..1) Target->File 0..* SNMPService SNMPService [INTEGER] securityLevel (0..1) [STRING] contextName (0..1) [STRING] contextEngineID (0..1) [STRING] oid (0..1) [INTEGER] messageProcessingModel (0..1) [STRING] command (0..1) [STRING] securityName (0..1) [INTEGER] securityModel (0..1) Service->SNMPService WebService WebService [STRING] url (1) [STRING] cgi (0..1) [STRING] http-method (0..1) [STRING] arg (0..*) Service->WebService UserId UserId [STRING] name (0..1) [INTEGER] number (0..1) [STRING] tty (Optional) [STRING] ident (Optional) [ENUM] type (Optional) User->UserId 1..* Checksum Checksum [STRING] value (1) [STRING] key (0..1) [ENUM] algorithm (Required) File->Checksum 0..* FileAccess FileAccess [ENUM] Permission (1..*) File->FileAccess 0..* Inode Inode [INTEGER] c-minor-device (0..1) [DATETIME] change-time (0..1) [INTEGER] minor-device (0..1) [INTEGER] major-device (0..1) [INTEGER] c-major-device (0..1) [INTEGER] number (0..1) File->Inode 0..1 Linkage Linkage [STRING] path (1) [STRING] name (1) [ENUM] category (Optional) File->Linkage 0..* FileAccess->UserId 1 Linkage->File 1 Reference Reference [STRING] url (1) [STRING] name (1) [ENUM] origin (Required) [STRING] meaning (Optional) Classification->Reference 0..* Analyzer->Node 0..1 Analyzer->Process 0..1 Analyzer->Analyzer 0..1 Source->Node 0..1 Source->Process 0..1 Source->User 0..1 Source->Service 0..1 Impact Impact [ENUM] completion (Optional) [ENUM] type (Optional) [ENUM] severity (Optional) Assessment->Impact 0..1 Action Action [ENUM] category (None) Assessment->Action 0..* Confidence Confidence [ENUM] rating (None) Assessment->Confidence 0..1 prewikka-5.1.1/prewikka/views/idmefnav/htdocs/graph/Analyzer.svg0000664000175000017500000004067113555143652026416 0ustar tandrejatandreja00000000000000 Analyzer Address Address [STRING] netmask (0..1) [STRING] address (1) [ENUM] category (Optional) [STRING] vlan-name (Optional) [INTEGER] vlan-num (Optional) [STRING] ident (Optional) Node Node [STRING] location (0..1) [STRING] name (0..1) [ENUM] category (Optional) [STRING] ident (Optional) Node->Address 0..* Analyzer Analyzer [STRING] name (Optional) [STRING] version (Optional) [STRING] ostype (Optional) [STRING] model (Optional) [STRING] osversion (Optional) [STRING] class (Optional) [STRING] manufacturer (Optional) [STRING] analyzerid (Optional) Analyzer->Node 0..1 Process Process [STRING] path (0..1) [INTEGER] pid (0..1) [STRING] name (1) [STRING] env (0..*) [STRING] arg (0..*) [STRING] ident (Optional) Analyzer->Process 0..1 Analyzer->Analyzer 0..1 prewikka-5.1.1/prewikka/views/idmefnav/htdocs/graph/AnalyzerTime.svg0000664000175000017500000000230613555143652027226 0ustar tandrejatandreja00000000000000 AnalyzerTime AnalyzerTime AnalyzerTime prewikka-5.1.1/prewikka/views/idmefnav/htdocs/graph/Assessment.svg0000664000175000017500000001440613555143652026753 0ustar tandrejatandreja00000000000000 Assessment Impact Impact [ENUM] completion (Optional) [ENUM] type (Optional) [ENUM] severity (Optional) Assessment Assessment Assessment->Impact 0..1 Action Action [ENUM] category (None) Assessment->Action 0..* Confidence Confidence [ENUM] rating (None) Assessment->Confidence 0..1 prewikka-5.1.1/prewikka/views/idmefnav/htdocs/graph/Checksum.svg0000664000175000017500000000450213555143652026364 0ustar tandrejatandreja00000000000000 Checksum Checksum Checksum [STRING] value (1) [STRING] key (0..1) [ENUM] algorithm (Required) prewikka-5.1.1/prewikka/views/idmefnav/htdocs/graph/Classification.svg0000664000175000017500000001246413555143652027563 0ustar tandrejatandreja00000000000000 Classification Reference Reference [STRING] url (1) [STRING] name (1) [ENUM] origin (Required) [STRING] meaning (Optional) Classification Classification [STRING] text (Required) [STRING] ident (Optional) Classification->Reference 0..* prewikka-5.1.1/prewikka/views/idmefnav/htdocs/graph/Confidence.svg0000664000175000017500000000276213555143652026665 0ustar tandrejatandreja00000000000000 Confidence Confidence Confidence [ENUM] rating (None) prewikka-5.1.1/prewikka/views/idmefnav/htdocs/graph/CorrelationAlert.svg0000664000175000017500000000476413555143652030105 0ustar tandrejatandreja00000000000000 CorrelationAlert CorrelationAlert CorrelationAlert [STRING] alertident (1..*) [STRING] name (1) prewikka-5.1.1/prewikka/views/idmefnav/htdocs/graph/CreateTime.svg0000664000175000017500000000205313555143652026643 0ustar tandrejatandreja00000000000000 CreateTime CreateTime CreateTime prewikka-5.1.1/prewikka/views/idmefnav/htdocs/graph/DetectTime.svg0000664000175000017500000000243013555143652026647 0ustar tandrejatandreja00000000000000 DetectTime DetectTime DetectTime prewikka-5.1.1/prewikka/views/idmefnav/htdocs/graph/File.svg0000664000175000017500000005102413555143652025502 0ustar tandrejatandreja00000000000000 File Checksum Checksum [STRING] value (1) [STRING] key (0..1) [ENUM] algorithm (Required) File File [ENUM] category (0..1) [INTEGER] disk-size (0..1) [STRING] ident (0..1) [STRING] name (1) [INTEGER] data-size (0..1) [DATETIME] create-time (0..1) [DATETIME] access-time (0..1) [STRING] path (1) [STRING] file-type (0..1) [DATETIME] modify-time (0..1) File->Checksum 0..* FileAccess FileAccess [ENUM] Permission (1..*) File->FileAccess 0..* Inode Inode [INTEGER] c-minor-device (0..1) [DATETIME] change-time (0..1) [INTEGER] minor-device (0..1) [INTEGER] major-device (0..1) [INTEGER] c-major-device (0..1) [INTEGER] number (0..1) File->Inode 0..1 Linkage Linkage [STRING] path (1) [STRING] name (1) [ENUM] category (Optional) File->Linkage 0..* UserId UserId [STRING] name (0..1) [INTEGER] number (0..1) [STRING] tty (Optional) [STRING] ident (Optional) [ENUM] type (Optional) FileAccess->UserId 1 Linkage->File 1 prewikka-5.1.1/prewikka/views/idmefnav/htdocs/graph/FileAccess.svg0000664000175000017500000001165513555143652026632 0ustar tandrejatandreja00000000000000 FileAccess UserId UserId [STRING] name (0..1) [INTEGER] number (0..1) [STRING] tty (Optional) [STRING] ident (Optional) [ENUM] type (Optional) FileAccess FileAccess [ENUM] Permission (1..*) FileAccess->UserId 1 prewikka-5.1.1/prewikka/views/idmefnav/htdocs/graph/Heartbeat.svg0000664000175000017500000005631213555143652026527 0ustar tandrejatandreja00000000000000 Heartbeat AdditionalData AdditionalData [STRING] meaning (Optional) Heartbeat Heartbeat [INTEGER] HeartbeatInterval (0..1) [STRING] messageid (Optional) Heartbeat->AdditionalData 0..* CreateTime CreateTime Heartbeat->CreateTime 1 Analyzer Analyzer [STRING] name (Optional) [STRING] version (Optional) [STRING] ostype (Optional) [STRING] model (Optional) [STRING] osversion (Optional) [STRING] class (Optional) [STRING] manufacturer (Optional) [STRING] analyzerid (Optional) Heartbeat->Analyzer 1 AnalyzerTime AnalyzerTime Heartbeat->AnalyzerTime 0..1 Address Address [STRING] netmask (0..1) [STRING] address (1) [ENUM] category (Optional) [STRING] vlan-name (Optional) [INTEGER] vlan-num (Optional) [STRING] ident (Optional) Node Node [STRING] location (0..1) [STRING] name (0..1) [ENUM] category (Optional) [STRING] ident (Optional) Node->Address 0..* Analyzer->Node 0..1 Process Process [STRING] path (0..1) [INTEGER] pid (0..1) [STRING] name (1) [STRING] env (0..*) [STRING] arg (0..*) [STRING] ident (Optional) Analyzer->Process 0..1 Analyzer->Analyzer 0..1 prewikka-5.1.1/prewikka/views/idmefnav/htdocs/graph/IDMEF-Message.svg0000664000175000017500000027531013555143652027037 0ustar tandrejatandreja00000000000000 IDMEF-Message AdditionalData AdditionalData [STRING] meaning (Optional) Heartbeat Heartbeat [INTEGER] HeartbeatInterval (0..1) [STRING] messageid (Optional) Heartbeat->AdditionalData 0..* CreateTime CreateTime Heartbeat->CreateTime 1 Analyzer Analyzer [STRING] name (Optional) [STRING] version (Optional) [STRING] ostype (Optional) [STRING] model (Optional) [STRING] osversion (Optional) [STRING] class (Optional) [STRING] manufacturer (Optional) [STRING] analyzerid (Optional) Heartbeat->Analyzer 1 AnalyzerTime AnalyzerTime Heartbeat->AnalyzerTime 0..1 Address Address [STRING] netmask (0..1) [STRING] address (1) [ENUM] category (Optional) [STRING] vlan-name (Optional) [INTEGER] vlan-num (Optional) [STRING] ident (Optional) Node Node [STRING] location (0..1) [STRING] name (0..1) [ENUM] category (Optional) [STRING] ident (Optional) Node->Address 0..* Analyzer->Node 0..1 Process Process [STRING] path (0..1) [INTEGER] pid (0..1) [STRING] name (1) [STRING] env (0..*) [STRING] arg (0..*) [STRING] ident (Optional) Analyzer->Process 0..1 Analyzer->Analyzer 0..1 IDMEF-Message IDMEF-Message IDMEF-Message->Heartbeat Alert Alert [STRING] messageid (Optional) IDMEF-Message->Alert OverflowAlert OverflowAlert [BYTE[]] buffer (0..1) [STRING] program (1) [INTEGER] size (0..1) Alert->OverflowAlert CorrelationAlert CorrelationAlert [STRING] alertident (1..*) [STRING] name (1) Alert->CorrelationAlert ToolAlert ToolAlert [STRING] alertident (1..*) [STRING] command (0..1) [STRING] name (1) Alert->ToolAlert DetectTime DetectTime Alert->DetectTime 0..1 Alert->AdditionalData 0..* Target Target [STRING] interface (Optional) [ENUM] decoy (Optional) [STRING] ident (Optional) Alert->Target 0..* Classification Classification [STRING] text (Required) [STRING] ident (Optional) Alert->Classification 1 Alert->Analyzer 1 Alert->AnalyzerTime 0..1 Source Source [STRING] interface (Optional) [STRING] ident (Optional) [ENUM] spoofed (Optional) Alert->Source 0..* Assessment Assessment Alert->Assessment 0..1 Alert->CreateTime 1 Target->Node 0..1 Target->Process 0..1 Service Service [PORTLIST] portlist (0..1) [STRING] protocol (0..1) [STRING] name (0..1) [INTEGER] port (0..1) [INTEGER] ip_version (Optional) [STRING] iana_protocol_name (Optional) [STRING] ident (Optional) [INTEGER] iana_protocol_number (Optional) Target->Service 0..1 User User [ENUM] category (Optional) [STRING] ident (Optional) Target->User 0..1 File File [ENUM] category (0..1) [INTEGER] disk-size (0..1) [STRING] ident (0..1) [STRING] name (1) [INTEGER] data-size (0..1) [DATETIME] create-time (0..1) [DATETIME] access-time (0..1) [STRING] path (1) [STRING] file-type (0..1) [DATETIME] modify-time (0..1) Target->File 0..* SNMPService SNMPService [INTEGER] securityLevel (0..1) [STRING] contextName (0..1) [STRING] contextEngineID (0..1) [STRING] oid (0..1) [INTEGER] messageProcessingModel (0..1) [STRING] command (0..1) [STRING] securityName (0..1) [INTEGER] securityModel (0..1) Service->SNMPService WebService WebService [STRING] url (1) [STRING] cgi (0..1) [STRING] http-method (0..1) [STRING] arg (0..*) Service->WebService UserId UserId [STRING] name (0..1) [INTEGER] number (0..1) [STRING] tty (Optional) [STRING] ident (Optional) [ENUM] type (Optional) User->UserId 1..* Checksum Checksum [STRING] value (1) [STRING] key (0..1) [ENUM] algorithm (Required) File->Checksum 0..* FileAccess FileAccess [ENUM] Permission (1..*) File->FileAccess 0..* Inode Inode [INTEGER] c-minor-device (0..1) [DATETIME] change-time (0..1) [INTEGER] minor-device (0..1) [INTEGER] major-device (0..1) [INTEGER] c-major-device (0..1) [INTEGER] number (0..1) File->Inode 0..1 Linkage Linkage [STRING] path (1) [STRING] name (1) [ENUM] category (Optional) File->Linkage 0..* FileAccess->UserId 1 Linkage->File 1 Reference Reference [STRING] url (1) [STRING] name (1) [ENUM] origin (Required) [STRING] meaning (Optional) Classification->Reference 0..* Source->Node 0..1 Source->Process 0..1 Source->User 0..1 Source->Service 0..1 Impact Impact [ENUM] completion (Optional) [ENUM] type (Optional) [ENUM] severity (Optional) Assessment->Impact 0..1 Action Action [ENUM] category (None) Assessment->Action 0..* Confidence Confidence [ENUM] rating (None) Assessment->Confidence 0..1 prewikka-5.1.1/prewikka/views/idmefnav/htdocs/graph/Impact.svg0000664000175000017500000000443613555143652026045 0ustar tandrejatandreja00000000000000 Impact Impact Impact [ENUM] completion (Optional) [ENUM] type (Optional) [ENUM] severity (Optional) prewikka-5.1.1/prewikka/views/idmefnav/htdocs/graph/Inode.svg0000664000175000017500000000730313555143652025662 0ustar tandrejatandreja00000000000000 Inode Inode Inode [INTEGER] c-minor-device (0..1) [DATETIME] change-time (0..1) [INTEGER] minor-device (0..1) [INTEGER] major-device (0..1) [INTEGER] c-major-device (0..1) [INTEGER] number (0..1) prewikka-5.1.1/prewikka/views/idmefnav/htdocs/graph/Linkage.svg0000664000175000017500000005103113555143652026173 0ustar tandrejatandreja00000000000000 Linkage Checksum Checksum [STRING] value (1) [STRING] key (0..1) [ENUM] algorithm (Required) File File [ENUM] category (0..1) [INTEGER] disk-size (0..1) [STRING] ident (0..1) [STRING] name (1) [INTEGER] data-size (0..1) [DATETIME] create-time (0..1) [DATETIME] access-time (0..1) [STRING] path (1) [STRING] file-type (0..1) [DATETIME] modify-time (0..1) File->Checksum 0..* FileAccess FileAccess [ENUM] Permission (1..*) File->FileAccess 0..* Inode Inode [INTEGER] c-minor-device (0..1) [DATETIME] change-time (0..1) [INTEGER] minor-device (0..1) [INTEGER] major-device (0..1) [INTEGER] c-major-device (0..1) [INTEGER] number (0..1) File->Inode 0..1 Linkage Linkage [STRING] path (1) [STRING] name (1) [ENUM] category (Optional) File->Linkage 0..* UserId UserId [STRING] name (0..1) [INTEGER] number (0..1) [STRING] tty (Optional) [STRING] ident (Optional) [ENUM] type (Optional) FileAccess->UserId 1 Linkage->File 1 prewikka-5.1.1/prewikka/views/idmefnav/htdocs/graph/Node.svg0000664000175000017500000001526613555143652025520 0ustar tandrejatandreja00000000000000 Node Address Address [STRING] netmask (0..1) [STRING] address (1) [ENUM] category (Optional) [STRING] vlan-name (Optional) [INTEGER] vlan-num (Optional) [STRING] ident (Optional) Node Node [STRING] location (0..1) [STRING] name (0..1) [ENUM] category (Optional) [STRING] ident (Optional) Node->Address 0..* prewikka-5.1.1/prewikka/views/idmefnav/htdocs/graph/OverflowAlert.svg0000664000175000017500000000504513555143652027420 0ustar tandrejatandreja00000000000000 OverflowAlert OverflowAlert OverflowAlert [BYTE[]] buffer (0..1) [STRING] program (1) [INTEGER] size (0..1) prewikka-5.1.1/prewikka/views/idmefnav/htdocs/graph/Process.svg0000664000175000017500000000756413555143652026253 0ustar tandrejatandreja00000000000000 Process Process Process [STRING] path (0..1) [INTEGER] pid (0..1) [STRING] name (1) [STRING] env (0..*) [STRING] arg (0..*) [STRING] ident (Optional) prewikka-5.1.1/prewikka/views/idmefnav/htdocs/graph/Reference.svg0000664000175000017500000000646213555143652026527 0ustar tandrejatandreja00000000000000 Reference Reference Reference [STRING] url (1) [STRING] name (1) [ENUM] origin (Required) [STRING] meaning (Optional) prewikka-5.1.1/prewikka/views/idmefnav/htdocs/graph/SNMPService.svg0000664000175000017500000001164513555143652026726 0ustar tandrejatandreja00000000000000 SNMPService SNMPService SNMPService [INTEGER] securityLevel (0..1) [STRING] contextName (0..1) [STRING] contextEngineID (0..1) [STRING] oid (0..1) [INTEGER] messageProcessingModel (0..1) [STRING] command (0..1) [STRING] securityName (0..1) [INTEGER] securityModel (0..1) prewikka-5.1.1/prewikka/views/idmefnav/htdocs/graph/Service.svg0000664000175000017500000003214113555143652026222 0ustar tandrejatandreja00000000000000 Service SNMPService SNMPService [INTEGER] securityLevel (0..1) [STRING] contextName (0..1) [STRING] contextEngineID (0..1) [STRING] oid (0..1) [INTEGER] messageProcessingModel (0..1) [STRING] command (0..1) [STRING] securityName (0..1) [INTEGER] securityModel (0..1) Service Service [PORTLIST] portlist (0..1) [STRING] protocol (0..1) [STRING] name (0..1) [INTEGER] port (0..1) [INTEGER] ip_version (Optional) [STRING] iana_protocol_name (Optional) [STRING] ident (Optional) [INTEGER] iana_protocol_number (Optional) Service->SNMPService WebService WebService [STRING] url (1) [STRING] cgi (0..1) [STRING] http-method (0..1) [STRING] arg (0..*) Service->WebService prewikka-5.1.1/prewikka/views/idmefnav/htdocs/graph/Source.svg0000664000175000017500000010010113555143652026052 0ustar tandrejatandreja00000000000000 Source Address Address [STRING] netmask (0..1) [STRING] address (1) [ENUM] category (Optional) [STRING] vlan-name (Optional) [INTEGER] vlan-num (Optional) [STRING] ident (Optional) Node Node [STRING] location (0..1) [STRING] name (0..1) [ENUM] category (Optional) [STRING] ident (Optional) Node->Address 0..* Source Source [STRING] interface (Optional) [STRING] ident (Optional) [ENUM] spoofed (Optional) Source->Node 0..1 Process Process [STRING] path (0..1) [INTEGER] pid (0..1) [STRING] name (1) [STRING] env (0..*) [STRING] arg (0..*) [STRING] ident (Optional) Source->Process 0..1 User User [ENUM] category (Optional) [STRING] ident (Optional) Source->User 0..1 Service Service [PORTLIST] portlist (0..1) [STRING] protocol (0..1) [STRING] name (0..1) [INTEGER] port (0..1) [INTEGER] ip_version (Optional) [STRING] iana_protocol_name (Optional) [STRING] ident (Optional) [INTEGER] iana_protocol_number (Optional) Source->Service 0..1 UserId UserId [STRING] name (0..1) [INTEGER] number (0..1) [STRING] tty (Optional) [STRING] ident (Optional) [ENUM] type (Optional) User->UserId 1..* SNMPService SNMPService [INTEGER] securityLevel (0..1) [STRING] contextName (0..1) [STRING] contextEngineID (0..1) [STRING] oid (0..1) [INTEGER] messageProcessingModel (0..1) [STRING] command (0..1) [STRING] securityName (0..1) [INTEGER] securityModel (0..1) Service->SNMPService WebService WebService [STRING] url (1) [STRING] cgi (0..1) [STRING] http-method (0..1) [STRING] arg (0..*) Service->WebService prewikka-5.1.1/prewikka/views/idmefnav/htdocs/graph/Target.svg0000664000175000017500000014400313555143652026051 0ustar tandrejatandreja00000000000000 Target Address Address [STRING] netmask (0..1) [STRING] address (1) [ENUM] category (Optional) [STRING] vlan-name (Optional) [INTEGER] vlan-num (Optional) [STRING] ident (Optional) Node Node [STRING] location (0..1) [STRING] name (0..1) [ENUM] category (Optional) [STRING] ident (Optional) Node->Address 0..* Target Target [STRING] interface (Optional) [ENUM] decoy (Optional) [STRING] ident (Optional) Target->Node 0..1 Process Process [STRING] path (0..1) [INTEGER] pid (0..1) [STRING] name (1) [STRING] env (0..*) [STRING] arg (0..*) [STRING] ident (Optional) Target->Process 0..1 Service Service [PORTLIST] portlist (0..1) [STRING] protocol (0..1) [STRING] name (0..1) [INTEGER] port (0..1) [INTEGER] ip_version (Optional) [STRING] iana_protocol_name (Optional) [STRING] ident (Optional) [INTEGER] iana_protocol_number (Optional) Target->Service 0..1 User User [ENUM] category (Optional) [STRING] ident (Optional) Target->User 0..1 File File [ENUM] category (0..1) [INTEGER] disk-size (0..1) [STRING] ident (0..1) [STRING] name (1) [INTEGER] data-size (0..1) [DATETIME] create-time (0..1) [DATETIME] access-time (0..1) [STRING] path (1) [STRING] file-type (0..1) [DATETIME] modify-time (0..1) Target->File 0..* SNMPService SNMPService [INTEGER] securityLevel (0..1) [STRING] contextName (0..1) [STRING] contextEngineID (0..1) [STRING] oid (0..1) [INTEGER] messageProcessingModel (0..1) [STRING] command (0..1) [STRING] securityName (0..1) [INTEGER] securityModel (0..1) Service->SNMPService WebService WebService [STRING] url (1) [STRING] cgi (0..1) [STRING] http-method (0..1) [STRING] arg (0..*) Service->WebService UserId UserId [STRING] name (0..1) [INTEGER] number (0..1) [STRING] tty (Optional) [STRING] ident (Optional) [ENUM] type (Optional) User->UserId 1..* Checksum Checksum [STRING] value (1) [STRING] key (0..1) [ENUM] algorithm (Required) File->Checksum 0..* FileAccess FileAccess [ENUM] Permission (1..*) File->FileAccess 0..* Inode Inode [INTEGER] c-minor-device (0..1) [DATETIME] change-time (0..1) [INTEGER] minor-device (0..1) [INTEGER] major-device (0..1) [INTEGER] c-major-device (0..1) [INTEGER] number (0..1) File->Inode 0..1 Linkage Linkage [STRING] path (1) [STRING] name (1) [ENUM] category (Optional) File->Linkage 0..* FileAccess->UserId 1 Linkage->File 1 prewikka-5.1.1/prewikka/views/idmefnav/htdocs/graph/ToolAlert.svg0000664000175000017500000000602113555143652026525 0ustar tandrejatandreja00000000000000 ToolAlert ToolAlert ToolAlert [STRING] alertident (1..*) [STRING] command (0..1) [STRING] name (1) prewikka-5.1.1/prewikka/views/idmefnav/htdocs/graph/User.svg0000664000175000017500000001254213555143652025543 0ustar tandrejatandreja00000000000000 User UserId UserId [STRING] name (0..1) [INTEGER] number (0..1) [STRING] tty (Optional) [STRING] ident (Optional) [ENUM] type (Optional) User User [ENUM] category (Optional) [STRING] ident (Optional) User->UserId 1..* prewikka-5.1.1/prewikka/views/idmefnav/htdocs/graph/UserId.svg0000664000175000017500000000656213555143652026025 0ustar tandrejatandreja00000000000000 UserId UserId UserId [STRING] name (0..1) [INTEGER] number (0..1) [STRING] tty (Optional) [STRING] ident (Optional) [ENUM] type (Optional) prewikka-5.1.1/prewikka/views/idmefnav/htdocs/graph/WebService.svg0000664000175000017500000000525213555143652026663 0ustar tandrejatandreja00000000000000 WebService WebService WebService [STRING] url (1) [STRING] cgi (0..1) [STRING] http-method (0..1) [STRING] arg (0..*) prewikka-5.1.1/prewikka/views/idmefnav/htdocs/yaml/0000775000175000017500000000000013555143705023740 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/views/idmefnav/htdocs/yaml/Action.yml0000664000175000017500000000213113555143652025676 0ustar tandrejatandreja00000000000000--- name: Action description: 'The Action class is used to describe any actions taken by the analyzer in response to the event. Is is represented in the IDMEF DTD as follows: ' color: "#FF5024" aggregates: {} attributes: category: name: category multiplicity: type: ENUM description: The default value is "other". (See also Section 10.) values: - rank: '0' keyword: block-installed description: A block of some sort was installed to prevent an attack from reaching its destination. The block could be a port block, address block, etc., or disabling a user account. - rank: '1' keyword: notification-sent description: A notification message of some sort was sent out-of-band (via pager, e-mail, etc.). Does not include the transmission of this alert. - rank: '2' keyword: taken-offline description: A system, computer, or user was taken offline, as when the computer is shut down or a user is logged off. - rank: '3' keyword: other description: Anything not in one of the above categories. prewikka-5.1.1/prewikka/views/idmefnav/htdocs/yaml/AdditionalData.yml0000664000175000017500000000204413555143652027326 0ustar tandrejatandreja00000000000000--- name: AdditionalData description: 'The AdditionalData class is used to provide information that cannot be represented by the data model. AdditionalData can be used to provide atomic data (integers, strings, etc.) in cases where only small amounts of additional information need to be sent; it can also be used to extend the data model and the DTD to support the transmission of complex data (such as packet headers). Detailed instructions for extending the data model and the DTD are provided in Section 5. ' color: "#7030A0" aggregates: {} attributes: meaning: name: meaning multiplicity: Optional type: STRING description: A string describing the meaning of the element content. These values will be vendor/implementation dependent; the method for ensuring that managers understand the strings sent by analyzers is outside the scope of this specification. A list of acceptable meaning keywords is not within the scope of the document, although later versions may undertake to establish such a list. prewikka-5.1.1/prewikka/views/idmefnav/htdocs/yaml/Address.yml0000664000175000017500000000532313555143652026054 0ustar tandrejatandreja00000000000000--- name: Address description: 'The Address class is used to represent network, hardware, and application addresses. ' color: "#00CC00" aggregates: address: name: address multiplicity: '1' type: STRING description: The address information. The format of this data is governed by the category attribute. netmask: name: netmask multiplicity: 0..1 type: STRING description: The network mask for the address, if appropriate. attributes: ident: name: ident multiplicity: Optional type: STRING description: A unique identifier for the address; see Section 3.2.9. category: name: category multiplicity: Optional type: ENUM description: The type of address represented. The permitted values for this attribute are shown below. The default value is "unknown". (See also Section 10.) values: - rank: '0' keyword: unknown description: Address type unknown - rank: '1' keyword: atm description: Asynchronous Transfer Mode network address - rank: '2' keyword: e-mail description: Electronic mail address (RFC 822) - rank: '3' keyword: lotus-notes description: Lotus Notes e-mail address - rank: '4' keyword: mac description: Media Access Control (MAC) address - rank: '5' keyword: sna description: IBM Shared Network Architecture (SNA) address - rank: '6' keyword: vm description: IBM VM ("PROFS") e-mail address - rank: '7' keyword: ipv4-addr description: IPv4 host address in dotted-decimal notation (a.b.c.d) - rank: '8' keyword: ipv4-addr-hex description: IPv4 host address in hexadecimal notation - rank: '9' keyword: ipv4-net description: IPv4 network address in dotted-decimal notation, slash, significant bits (a.b.c.d/nn) - rank: '10' keyword: ipv4-net-mask description: IPv4 network address in dotted-decimal notation, slash, network mask in dotted-decimal notation (a.b.c.d/w.x.y.z) - rank: '11' keyword: ipv6-addr description: IPv6 host address - rank: '12' keyword: ipv6-addr-hex description: IPv6 host address in hexadecimal notation - rank: '13' keyword: ipv6-net description: IPv6 network address, slash, significant bits - rank: '14' keyword: ipv6-net-mask description: IPv6 network address, slash, network mask vlan-name: name: vlan-name multiplicity: Optional type: STRING description: The name of the Virtual LAN to which the address belongs. vlan-num: name: vlan-num multiplicity: Optional type: INTEGER description: The number of the Virtual LAN to which the address belongs. prewikka-5.1.1/prewikka/views/idmefnav/htdocs/yaml/Alert.yml0000664000175000017500000000464713555143652025546 0ustar tandrejatandreja00000000000000--- name: Alert description: 'Generally, every time an analyzer detects an event that it has been configured to look for, it sends an Alert message to its manager(s). Depending on the analyzer, an Alert message may correspond to a single detected event or multiple detected events. Alerts occur asynchronously in response to outside events. ' color: "#94C600" childs: OverflowAlert: name: OverflowAlert ToolAlert: name: ToolAlert CorrelationAlert: name: CorrelationAlert aggregates: Analyzer: name: Analyzer multiplicity: '1' type: description: Identification information for the analyzer that originated the alert. CreateTime: name: CreateTime multiplicity: '1' type: description: The time the alert was created. Of the three times that may be provided with an Alert, this is the only one that is required. Classification: name: Classification multiplicity: '1' type: description: The "name" of the alert, or other information allowing the manager to determine what it is. DetectTime: name: DetectTime multiplicity: 0..1 type: description: The time the event(s) leading up to the alert was detected. In the case of more than one event, the time the first event was detected. In some circumstances, this may not be the same value as CreateTime. AnalyzerTime: name: AnalyzerTime multiplicity: 0..1 type: description: The current time on the analyzer (see Section 6.3). Source: name: Source multiplicity: 0..* type: description: The source(s) of the event(s) leading up to the alert. Target: name: Target multiplicity: 0..* type: description: The target(s) of the event(s) leading up to the alert. Assessment: name: Assessment multiplicity: 0..1 type: description: Information about the impact of the event, actions taken by the analyzer in response to it, and the analyzer's confidence in its evaluation. AdditionalData: name: AdditionalData multiplicity: 0..* type: description: Information included by the analyzer that does not fit into the data model. This may be an atomic piece of data, or a large amount of data provided through an extension to the IDMEF (see Section 5). attributes: messageid: name: messageid multiplicity: Optional type: STRING description: A unique identifier for the alert; see Section 3.2.9. prewikka-5.1.1/prewikka/views/idmefnav/htdocs/yaml/Analyzer.yml0000664000175000017500000000537313555143652026261 0ustar tandrejatandreja00000000000000--- name: Analyzer description: 'The Analyzer class identifies the analyzer from which the Alert or Heartbeat message originates. Only one analyzer may be encoded for each alert or heartbeat, and that MUST be the analyzer at which the alert or heartbeat originated. Although the IDMEF data model does not prevent the use of hierarchical intrusion detection systems (where alerts get relayed up the tree), it does not provide any way to record the identity of the "relay" analyzers along the path from the originating analyzer to the manager that ultimately receives the alert. ' color: "#FFFF66" aggregates: Node: name: Node multiplicity: 0..1 type: description: Information about the host or device on which the analyzer resides (network address, network name, etc.). Process: name: Process multiplicity: 0..1 type: description: Information about the process in which the analyzer is executing. Analyzer: name: Analyzer multiplicity: 0..1 type: description: Information about the analyzer from which the message may have gone through. The idea behind this mechanism is that when a manager receives an alert and wants to forward it to another analyzer, it needs to substitute the original analyzer attributes: analyzerid: name: analyzerid multiplicity: Optional type: STRING description: "(but see below). A unique identifier for the analyzer; see Section 3.2.9." name: name: name multiplicity: Optional type: STRING description: An explicit name for the analyzer that may be easier to understand than the analyzerid. manufacturer: name: manufacturer multiplicity: Optional type: STRING description: The manufacturer of the analyzer software and/or hardware. model: name: model multiplicity: Optional type: STRING description: The model name/number of the analyzer software and/or hardware. version: name: version multiplicity: Optional type: STRING description: The version number of the analyzer software and/or hardware. class: name: class multiplicity: Optional type: STRING description: The class of analyzer software and/or hardware. ostype: name: ostype multiplicity: Optional type: STRING description: Operating system name. On POSIX 1003.1 compliant systems, this is the value returned in utsname.sysname by the uname() system call, or the output of the "uname -s" command. osversion: name: osversion multiplicity: Optional type: STRING description: Operating system version. On POSIX 1003.1 compliant systems, this is the value returned in utsname.release by the uname() system call, or the output of the "uname -r" command. prewikka-5.1.1/prewikka/views/idmefnav/htdocs/yaml/AnalyzerTime.yml0000664000175000017500000000050713555143652027072 0ustar tandrejatandreja00000000000000--- name: AnalyzerTime description: 'The AnalyzerTime class is used to indicate the current date and time on the analyzer. Its values should be filled in as late as possible in the message transmission process, ideally immediately before placing the message "on the wire". ' color: "#9999FF" aggregates: {} attributes: {} prewikka-5.1.1/prewikka/views/idmefnav/htdocs/yaml/Assessment.yml0000664000175000017500000000124713555143652026615 0ustar tandrejatandreja00000000000000--- name: Assessment description: 'The Assessment class is used to provide the analyzer''s assessment of an event -- its impact, actions taken in response, and confidence. ' color: "#FF5024" aggregates: Impact: name: Impact multiplicity: 0..1 type: description: The analyzer's assessment of the impact of the event on the target(s). Action: name: Action multiplicity: 0..* type: description: The action(s) taken by the analyzer in response to the event. Confidence: name: Confidence multiplicity: 0..1 type: description: A measurement of the confidence the analyzer has in its evaluation of the event. attributes: {} prewikka-5.1.1/prewikka/views/idmefnav/htdocs/yaml/Checksum.yml0000664000175000017500000000266213555143652026234 0ustar tandrejatandreja00000000000000--- name: Checksum description: 'The Checksum class represents checksum information associated with the file. This checksum information can be provided by file integrity checkers, among others. ' color: "#FFCC00" aggregates: value: name: value multiplicity: '1' type: STRING description: The value of the checksum. key: name: key multiplicity: 0..1 type: STRING description: The key to the checksum, if appropriate. attributes: algorithm: name: algorithm multiplicity: Required type: ENUM description: default value. (See also Section 10.) values: - rank: '0' keyword: MD4 description: The MD4 algorithm. - rank: '1' keyword: MD5 description: The MD5 algorithm. - rank: '2' keyword: SHA1 description: The SHA1 algorithm. - rank: '3' keyword: SHA2-256 description: The SHA2 algorithm with 256 bits length. - rank: '4' keyword: SHA2-384 description: The SHA2 algorithm with 384 bits length. - rank: '5' keyword: SHA2-512 description: The SHA2 algorithm with 512 bits length. - rank: '6' keyword: CRC-32 description: The CRC algorithm with 32 bits length. - rank: '7' keyword: Haval description: The Haval algorithm. - rank: '8' keyword: Tiger description: The Tiger algorithm. - rank: '9' keyword: Gost description: The Gost algorithm. prewikka-5.1.1/prewikka/views/idmefnav/htdocs/yaml/Classification.yml0000664000175000017500000000137513555143652027425 0ustar tandrejatandreja00000000000000--- name: Classification description: 'The Classification class provides the "name" of an alert, or other information allowing the manager to determine what it is. This name is chosen by the alert provider. ' color: "#996633" aggregates: Reference: name: Reference multiplicity: 0..* type: description: Information about the message, pointing to external documentation sites, that will provide background information about the alert. attributes: ident: name: ident multiplicity: Optional type: STRING description: A unique identifier for this classification; see Section 3.2.9. text: name: text multiplicity: Required type: STRING description: A vendor-provided string identifying the Alert message. prewikka-5.1.1/prewikka/views/idmefnav/htdocs/yaml/Confidence.yml0000664000175000017500000000147113555143652026524 0ustar tandrejatandreja00000000000000--- name: Confidence description: 'The Confidence class is used to represent the analyzer''s best estimate of the validity of its analysis. It is represented in the IDMEF DTD as follows: ' color: "#FF5024" aggregates: {} attributes: rating: name: rating multiplicity: type: ENUM description: also Section 10.) values: - rank: '0' keyword: low description: The analyzer has little confidence in its validity - rank: '1' keyword: medium description: The analyzer has average confidence in its validity - rank: '2' keyword: high description: The analyzer has high confidence in its validity - rank: '3' keyword: numeric description: The analyzer has provided a posterior probability value indicating its confidence in its validity prewikka-5.1.1/prewikka/views/idmefnav/htdocs/yaml/CorrelationAlert.yml0000664000175000017500000000176713555143652027750 0ustar tandrejatandreja00000000000000--- name: CorrelationAlert description: 'The CorrelationAlert class carries additional information related to the correlation of alert information. It is intended to group one or more previously-sent alerts together, to say "these alerts are all related". ' color: "#BFBFBF" aggregates: name: name: name multiplicity: '1' type: STRING description: The reason for grouping the alerts together, for example, a particular correlation method. alertident: name: alertident multiplicity: 1..* type: STRING description: The list of alert identifiers that are related to this alert. Because alert identifiers are only unique across the alerts sent by a single analyzer, the optional "analyzerid" attribute of "alertident" should be used to identify the analyzer that a particular alert came from. If the "analyzerid" is not provided, the alert is assumed to have come from the same analyzer that is sending the CorrelationAlert. attributes: {} prewikka-5.1.1/prewikka/views/idmefnav/htdocs/yaml/CreateTime.yml0000664000175000017500000000030513555143652026504 0ustar tandrejatandreja00000000000000--- name: CreateTime description: 'The CreateTime class is used to indicate the date and time the alert or heartbeat was created by the analyzer. ' color: "#9999FF" aggregates: {} attributes: {} prewikka-5.1.1/prewikka/views/idmefnav/htdocs/yaml/DetectTime.yml0000664000175000017500000000065613555143652026522 0ustar tandrejatandreja00000000000000--- name: DetectTime description: 'The DetectTime class is used to indicate the date and time that the event(s) producing an alert was detected by the analyzer. In the case of more than one event, it is the time that the first event was detected. (This may or may not be the same time as CreateTime; analyzers are not required to send alerts immediately upon detection). ' color: "#9999FF" aggregates: {} attributes: {} prewikka-5.1.1/prewikka/views/idmefnav/htdocs/yaml/File.yml0000664000175000017500000000624213555143652025347 0ustar tandrejatandreja00000000000000--- name: File description: 'The File class provides specific information about a file or other file-like object that has been created, deleted, or modified on the target. The description can provide either the file settings prior to the event or the file settings at the time of the event, as specified using the "category" attribute. ' color: "#FFCC00" aggregates: name: name: name multiplicity: '1' type: STRING description: The name of the file to which the alert applies, not including the path to the file. path: name: path multiplicity: '1' type: STRING description: The full path to the file, including the name. The path name should be represented in as "universal" a manner as possible, to facilitate processing of the alert. create-time: name: create-time multiplicity: 0..1 type: DATETIME description: Time the file was created. Note that this is *not* the Unix "st_ctime" file attribute (which is not file creation time). The Unix "st_ctime" attribute is contained in the "Inode" class. modify-time: name: modify-time multiplicity: 0..1 type: DATETIME description: Time the file was last modified. access-time: name: access-time multiplicity: 0..1 type: DATETIME description: Time the file was last accessed. data-size: name: data-size multiplicity: 0..1 type: INTEGER description: The size of the data, in bytes. Typically what is meant when referring to file size. On Unix UFS file systems, this value corresponds to stat.st_size. On Windows NTFS, this value corresponds to Valid Data Length (VDL). disk-size: name: disk-size multiplicity: 0..1 type: INTEGER description: The physical space on disk consumed by the file, in bytes. On Unix UFS file systems, this value corresponds to 512 * stat.st_blocks. On Windows NTFS, this value corresponds to End of File (EOF). FileAccess: name: FileAccess multiplicity: 0..* type: description: Access permissions on the file. Linkage: name: Linkage multiplicity: 0..* type: description: File system objects to which this file is linked (other references for the file). Inode: name: Inode multiplicity: 0..1 type: description: Inode information for this file (relevant to Unix). Checksum: name: Checksum multiplicity: 0..* type: description: Checksum information for this file. ident: name: ident multiplicity: 0..1 type: STRING description: A unique identifier for this file; see Section 3.2.9. category: name: category multiplicity: 0..1 type: ENUM description: The type of file system the file resides on. This attribute governs how path names and other attributes are interpreted. values: - rank: '0' keyword: current description: The file information is from after the reported change - rank: '1' keyword: original description: The file information is from before the reported change file-type: name: file-type multiplicity: 0..1 type: STRING description: The type of file, as a mime-type. attributes: {} prewikka-5.1.1/prewikka/views/idmefnav/htdocs/yaml/FileAccess.yml0000664000175000017500000000341513555143652026470 0ustar tandrejatandreja00000000000000--- name: FileAccess description: 'The FileAccess class represents the access permissions on a file. The representation is intended to be useful across operating systems. ' color: "#FFCC00" aggregates: UserId: name: UserId multiplicity: '1' type: description: The user (or group) to which these permissions apply. The value of the "type" attribute must be "user-privs", "group-privs", or "other-privs" as appropriate. Other values for "type" MUST NOT be used in this context. Permission: name: Permission multiplicity: 1..* type: ENUM description: Level of access allowed. The permitted values are shown below. There is no default value. (See also Section 10.) values: - rank: '0' keyword: noAccess description: No access at all is allowed for this user - rank: '1' keyword: read description: This user has read access to the file - rank: '2' keyword: write description: This user has write access to the file - rank: '3' keyword: execute description: This user has the ability to execute the file - rank: '4' keyword: search description: This user has the ability to search this file (applies to "execute" permission on directories in Unix) - rank: '5' keyword: delete description: This user has the ability to delete this file - rank: '6' keyword: executeAs description: This user has the ability to execute this file as another user - rank: '7' keyword: changePermissions description: This user has the ability to change the access permissions on this file - rank: '8' keyword: takeOwnership description: This user has the ability to take ownership of this file attributes: {} prewikka-5.1.1/prewikka/views/idmefnav/htdocs/yaml/Heartbeat.yml0000664000175000017500000000305413555143652026365 0ustar tandrejatandreja00000000000000--- name: Heartbeat description: 'Analyzers use Heartbeat messages to indicate their current status to managers. Heartbeats are intended to be sent in a regular period, say, every ten minutes or every hour. The receipt of a Heartbeat message from an analyzer indicates to the manager that the analyzer is up and running; lack of a Heartbeat message (or more likely, lack of some number of consecutive Heartbeat messages) indicates that the analyzer or its network connection has failed. ' color: "#94C600" aggregates: Analyzer: name: Analyzer multiplicity: '1' type: description: Identification information for the analyzer that originated the heartbeat. CreateTime: name: CreateTime multiplicity: '1' type: description: The time the heartbeat was created. HeartbeatInterval: name: HeartbeatInterval multiplicity: 0..1 type: INTEGER description: The interval in seconds at which heartbeats are generated. AnalyzerTime: name: AnalyzerTime multiplicity: 0..1 type: description: The current time on the analyzer (see Section 6.3). AdditionalData: name: AdditionalData multiplicity: 0..* type: description: Information included by the analyzer that does not fit into the data model. This may be an atomic piece of data or a large amount of data provided through an extension to the IDMEF (see Section 5). attributes: messageid: name: messageid multiplicity: Optional type: STRING description: A unique identifier for the heartbeat; see Section 3.2.9. prewikka-5.1.1/prewikka/views/idmefnav/htdocs/yaml/IDMEF-Message.yml0000664000175000017500000000057213555143652026676 0ustar tandrejatandreja00000000000000--- name: IDMEF-Message description: 'All IDMEF messages are instances of the IDMEF-Message class; it is the top-level class of the IDMEF data model, as well as the IDMEF DTD. There are currently two types (subclasses) of IDMEF-Message: Alert and Heartbeat. ' color: "#94C600" childs: Heartbeat: name: Heartbeat Alert: name: Alert aggregates: {} attributes: {} prewikka-5.1.1/prewikka/views/idmefnav/htdocs/yaml/Impact.yml0000664000175000017500000000325313555143652025704 0ustar tandrejatandreja00000000000000--- name: Impact description: 'The Impact class is used to provide the analyzer''s assessment of the impact of the event on the target(s). It is represented in the IDMEF DTD as follows: ' color: "#FF5024" aggregates: {} attributes: severity: name: severity multiplicity: Optional type: ENUM description: Section 10.) values: - rank: '0' keyword: info description: 'Alert represents informational activity ' - rank: '1' keyword: low description: 'Low severity ' - rank: '2' keyword: medium description: 'Medium severity ' - rank: '3' keyword: high description: High severity completion: name: completion multiplicity: Optional type: ENUM description: Section 10.) values: - rank: '0' keyword: failed description: The attempt was not successful - rank: '1' keyword: succeeded description: The attempt succeeded type: name: type multiplicity: Optional type: ENUM description: value is "other". (See also Section 10.) values: - rank: '0' keyword: admin description: Administrative privileges were attempted or obtained - rank: '1' keyword: dos description: A denial of service was attempted or completed - rank: '2' keyword: file description: An action on a file was attempted or completed - rank: '3' keyword: recon description: A reconnaissance probe was attempted or completed - rank: '4' keyword: user description: User privileges were attempted or obtained - rank: '5' keyword: other description: Anything not in one of the above categories prewikka-5.1.1/prewikka/views/idmefnav/htdocs/yaml/Inode.yml0000664000175000017500000000217013555143652025522 0ustar tandrejatandreja00000000000000--- name: Inode description: 'The Inode class is used to represent the additional information contained in a Unix file system i-node. ' color: "#FFCC00" aggregates: change-time: name: change-time multiplicity: 0..1 type: DATETIME description: The time of the last inode change, given by the st_ctime element of "struct stat". number: name: number multiplicity: 0..1 type: INTEGER description: The inode number. major-device: name: major-device multiplicity: 0..1 type: INTEGER description: The major device number of the device the file resides on. minor-device: name: minor-device multiplicity: 0..1 type: INTEGER description: The minor device number of the device the file resides on. c-major-device: name: c-major-device multiplicity: 0..1 type: INTEGER description: The major device of the file itself, if it is a character special device. c-minor-device: name: c-minor-device multiplicity: 0..1 type: INTEGER description: The minor device of the file itself, if it is a character special device. attributes: {} prewikka-5.1.1/prewikka/views/idmefnav/htdocs/yaml/Linkage.yml0000664000175000017500000000450113555143652026036 0ustar tandrejatandreja00000000000000--- name: Linkage description: 'The Linkage class represents file system connections between the file described in the element and other objects in the file system. For example, if the element is a symbolic link or shortcut, then the element should contain the name of the object the link points to. Further information can be provided about the object in the element with another element, if appropriate. ' color: "#FFCC00" aggregates: name: name: name multiplicity: '1' type: STRING description: The name of the file system object, not including the path. path: name: path multiplicity: '1' type: STRING description: The full path to the file system object, including the name. The path name should be represented in as "universal" a manner as possible, to facilitate processing of the alert. File: name: File multiplicity: '1' type: description: A element may be used in place of the and elements if additional information about the file is to be included. attributes: category: name: category multiplicity: Optional type: ENUM description: Section 10.) values: - rank: '0' keyword: hard-link description: The element represents another name for this file. This information may be more easily obtainable on NTFS file systems than others. - rank: '1' keyword: mount-point description: An alias for the directory specified by the parent's and elements. - rank: '2' keyword: reparse-point description: Applies only to Windows; excludes symbolic links and mount points, which are specific types of reparse points. - rank: '3' keyword: shortcut description: The file represented by a Windows "shortcut". A shortcut is distinguished from a symbolic link because of the difference in their contents, which may be of importance to the manager. - rank: '4' keyword: stream description: An Alternate Data Stream (ADS) in Windows; a fork on MacOS. Separate file system entity that is considered an extension of the main . - rank: '5' keyword: symbolic-link description: The element represents the file to which the link points. prewikka-5.1.1/prewikka/views/idmefnav/htdocs/yaml/Node.yml0000664000175000017500000000427313555143652025357 0ustar tandrejatandreja00000000000000--- name: Node description: 'The Node class is used to identify hosts and other network devices (routers, switches, etc.). ' color: "#00CC00" aggregates: location: name: location multiplicity: 0..1 type: STRING description: The location of the equipment. name: name: name multiplicity: 0..1 type: STRING description: The name of the equipment. This information MUST be provided if no Address information is given. Address: name: Address multiplicity: 0..* type: description: The network or hardware address of the equipment. Unless a name (above) is provided, at least one address must be specified. attributes: ident: name: ident multiplicity: Optional type: STRING description: A unique identifier for the node; see Section 3.2.9. category: name: category multiplicity: Optional type: ENUM description: The "domain" from which the name information was obtained, if relevant. The permitted values for this attribute are shown in the table below. The default value is "unknown". (See also Section 10 for extensions to the table.) values: - rank: '0' keyword: unknown description: Domain unknown or not relevant - rank: '1' keyword: ads description: Windows 2000 Advanced Directory Services - rank: '2' keyword: afs description: Andrew File System (Transarc) - rank: '3' keyword: coda description: Coda Distributed File System - rank: '4' keyword: dfs description: Distributed File System (IBM) - rank: '5' keyword: dns description: Domain Name System - rank: '6' keyword: hosts description: Local hosts file - rank: '7' keyword: kerberos description: Kerberos realm - rank: '8' keyword: nds description: Novell Directory Services - rank: '9' keyword: nis description: Network Information Services (Sun) - rank: '10' keyword: nisplus description: Network Information Services Plus (Sun) - rank: '11' keyword: nt description: Windows NT domain - rank: '12' keyword: wfw description: Windows for Workgroups prewikka-5.1.1/prewikka/views/idmefnav/htdocs/yaml/OverflowAlert.yml0000664000175000017500000000145513555143652027264 0ustar tandrejatandreja00000000000000--- name: OverflowAlert description: 'The OverflowAlert carries additional information related to buffer overflow attacks. It is intended to enable an analyzer to provide the details of the overflow attack itself. ' color: "#BFBFBF" aggregates: program: name: program multiplicity: '1' type: STRING description: 'The program that the overflow attack attempted to run (NOTE: this is not the program that was attacked).' size: name: size multiplicity: 0..1 type: INTEGER description: The size, in bytes, of the overflow (i.e., the number of bytes the attacker sent). buffer: name: buffer multiplicity: 0..1 type: BYTE[] description: Some or all of the overflow data itself (dependent on how much the analyzer can capture). attributes: {} prewikka-5.1.1/prewikka/views/idmefnav/htdocs/yaml/Process.yml0000664000175000017500000000240413555143652026102 0ustar tandrejatandreja00000000000000--- name: Process description: 'The Process class is used to describe processes being executed on sources, targets, and analyzers. ' color: "#FFCC66" aggregates: name: name: name multiplicity: '1' type: STRING description: The name of the program being executed. This is a short name; path and argument information are provided elsewhere. pid: name: pid multiplicity: 0..1 type: INTEGER description: The process identifier of the process. path: name: path multiplicity: 0..1 type: STRING description: The full path of the program being executed. arg: name: arg multiplicity: 0..* type: STRING description: A command-line argument to the program. Multiple arguments may be specified (they are assumed to have occurred in the same order they are provided) with multiple uses of arg. env: name: env multiplicity: 0..* type: STRING description: An environment string associated with the process; generally of the format "VARIABLE=value". Multiple environment strings may be specified with multiple uses of env. attributes: ident: name: ident multiplicity: Optional type: STRING description: A unique identifier for the process; see Section 3.2.9. prewikka-5.1.1/prewikka/views/idmefnav/htdocs/yaml/Reference.yml0000664000175000017500000000412113555143652026360 0ustar tandrejatandreja00000000000000--- name: Reference description: 'The Reference class provides the "name" of an alert, or other information allowing the manager to determine what it is. ' color: "#996633" aggregates: name: name: name multiplicity: '1' type: STRING description: The name of the alert, from one of the origins listed below. url: name: url multiplicity: '1' type: STRING description: A URL at which the manager (or the human operator of the manager) can find additional information about the alert. The document pointed to by the URL may include an in-depth description of the attack, appropriate countermeasures, or other information deemed relevant by the vendor. attributes: origin: name: origin multiplicity: Required type: ENUM description: The source from which the name of the alert originates. The permitted values for this attribute are shown below. The default value is "unknown". (See also Section 10.) values: - rank: '0' keyword: unknown description: Origin of the name is not known - rank: '1' keyword: vendor-specific description: A vendor-specific name (and hence, URL); this can be used to provide product-specific information - rank: '2' keyword: user-specific description: A user-specific name (and hence, URL); this can be used to provide installation-specific information - rank: '3' keyword: bugtraqid description: The SecurityFocus ("Bugtraq") vulnerability database identifier (http://www.securityfocus.com/bid) - rank: '4' keyword: cve description: The Common Vulnerabilities and Exposures (CVE) name (http://cve.mitre.org/) - rank: '5' keyword: osvdb description: The Open Source Vulnerability Database (http://www.osvdb.org) meaning: name: meaning multiplicity: Optional type: STRING description: The meaning of the reference, as understood by the alert provider. This field is only valid if the value of the attribute is set to "vendor-specific" or "user-specific". prewikka-5.1.1/prewikka/views/idmefnav/htdocs/yaml/SNMPService.yml0000664000175000017500000000333613555143652026567 0ustar tandrejatandreja00000000000000--- name: SNMPService description: 'The SNMPService class carries additional information related to SNMP traffic. The aggregate classes composing SNMPService must be interpreted as described in RFC 3411 [15] and RFC 3584 [16]. ' color: "#FFCCCC" aggregates: oid: name: oid multiplicity: 0..1 type: STRING description: The object identifier in the request. messageProcessingModel: name: messageProcessingModel multiplicity: 0..1 type: INTEGER description: The SNMP version, typically 0 for SNMPv1, 1 for SNMPv2c, 2 for SNMPv2u and SNMPv2*, and 3 for SNMPv3; see RFC 3411 [15] Section 5 for appropriate values. securityModel: name: securityModel multiplicity: 0..1 type: INTEGER description: The identification of the security model in use, typically 0 for any, 1 for SNMPv1, 2 for SNMPv2c, and 3 for USM; see RFC 3411 [15] Section 5 for appropriate values. securityName: name: securityName multiplicity: 0..1 type: STRING description: The object's security name; see RFC 3411 [15] Section 3.2.2. securityLevel: name: securityLevel multiplicity: 0..1 type: INTEGER description: The security level of the SNMP request; see RFC 3411 [15] Section 3.4.3. contextName: name: contextName multiplicity: 0..1 type: STRING description: The object's context name; see RFC 3411 [15] Section 3.3.3. contextEngineID: name: contextEngineID multiplicity: 0..1 type: STRING description: The object's context engine identifier; see RFC 3411 [15] Section 3.3.2. command: name: command multiplicity: 0..1 type: STRING description: The command sent to the SNMP server (GET, SET, etc.). attributes: {} prewikka-5.1.1/prewikka/views/idmefnav/htdocs/yaml/Service.yml0000664000175000017500000000477513555143652026101 0ustar tandrejatandreja00000000000000--- name: Service description: 'The Service class describes network services on sources and targets. It can identify services by name, port, and protocol. When Service occurs as an aggregate class of Source, it is understood that the service is one from which activity of interest is originating; and that the service is "attached" to the Node, Process, and User information also contained in Source. Likewise, when Service occurs as an aggregate class of Target, it is understood that the service is one to which activity of interest is being directed; and that the service is "attached" to the Node, Process, and User information also contained in Target. If Service occurs in both Source and Target, then information in both locations should be the same. If information is the same in both locations and implementers wish to carry it in only one location, they should specify it as an aggregate of the Target class. ' color: "#FFCCCC" childs: WebService: name: WebService SNMPService: name: SNMPService aggregates: name: name: name multiplicity: 0..1 type: STRING description: The name of the service. Whenever possible, the name from the IANA list of well-known ports SHOULD be used. port: name: port multiplicity: 0..1 type: INTEGER description: The port number being used. portlist: name: portlist multiplicity: 0..1 type: PORTLIST description: A list of port numbers being used; see Section 3.2.8 for formatting rules. If a portlist is given, the iana_protocol_number and iana_protocol_name MUST apply to all the elements of the list. protocol: name: protocol multiplicity: 0..1 type: STRING description: Additional information about the protocol being used. The intent of the protocol field is to carry additional information related to the protocol being used when the attributes iana_protocol_number or/and iana_protocol_name are filed. attributes: ident: name: ident multiplicity: Optional type: STRING description: A unique identifier for the service; see Section 3.2.9. ip_version: name: ip_version multiplicity: Optional type: INTEGER description: The IP version number. iana_protocol_number: name: iana_protocol_number multiplicity: Optional type: INTEGER description: The IANA protocol number. iana_protocol_name: name: iana_protocol_name multiplicity: Optional type: STRING description: The IANA protocol name. prewikka-5.1.1/prewikka/views/idmefnav/htdocs/yaml/Source.yml0000664000175000017500000000357113555143652025732 0ustar tandrejatandreja00000000000000--- name: Source description: 'The Source class contains information about the possible source(s) of the event(s) that generated an alert. An event may have more than one source (e.g., in a distributed denial-of-service attack). ' color: "#284F9F" aggregates: Node: name: Node multiplicity: 0..1 type: description: Information about the host or device that appears to be causing the events (network address, network name, etc.). User: name: User multiplicity: 0..1 type: description: Information about the user that appears to be causing the event(s). Process: name: Process multiplicity: 0..1 type: description: Information about the process that appears to be causing the event(s). Service: name: Service multiplicity: 0..1 type: description: Information about the network service involved in the event(s). attributes: ident: name: ident multiplicity: Optional type: STRING description: A unique identifier for this source; see Section 3.2.9. spoofed: name: spoofed multiplicity: Optional type: ENUM description: An indication of whether the source is, as far as the analyzer can determine, a spoofed address used for hiding the real origin of the attack. The permitted values for this attribute are shown below. The default value is "unknown". (See also Section 10.) values: - rank: '0' keyword: unknown description: Accuracy of source information unknown - rank: '1' keyword: 'yes' description: Source is believed to be a decoy - rank: '2' keyword: 'no' description: Source is believed to be "real" interface: name: interface multiplicity: Optional type: STRING description: May be used by a network-based analyzer with multiple interfaces to indicate which interface this source was seen on. prewikka-5.1.1/prewikka/views/idmefnav/htdocs/yaml/Target.yml0000664000175000017500000000365013555143652025716 0ustar tandrejatandreja00000000000000--- name: Target description: 'The Target class contains information about the possible target(s) of the event(s) that generated an alert. An event may have more than one target (e.g., in the case of a port sweep). ' color: "#284F9F" aggregates: Node: name: Node multiplicity: 0..1 type: description: Information about the host or device at which the event(s) (network address, network name, etc.) is being directed. User: name: User multiplicity: 0..1 type: description: Information about the user at which the event(s) is being directed. Process: name: Process multiplicity: 0..1 type: description: Information about the process at which the event(s) is being directed. Service: name: Service multiplicity: 0..1 type: description: Information about the network service involved in the event(s). File: name: File multiplicity: 0..* type: description: Information about file(s) involved in the event(s). attributes: ident: name: ident multiplicity: Optional type: STRING description: A unique identifier for this target, see Section 3.2.9. decoy: name: decoy multiplicity: Optional type: ENUM description: An indication of whether the target is, as far as the analyzer can determine, a decoy. The permitted values for this attribute are shown below. The default value is "unknown". (See also Section 10.) values: - rank: '0' keyword: unknown description: Accuracy of target information unknown - rank: '1' keyword: 'yes' description: Target is believed to be a decoy - rank: '2' keyword: 'no' description: Target is believed to be "real" interface: name: interface multiplicity: Optional type: STRING description: May be used by a network-based analyzer with multiple interfaces to indicate which interface this target was seen on. prewikka-5.1.1/prewikka/views/idmefnav/htdocs/yaml/ToolAlert.yml0000664000175000017500000000244513555143652026376 0ustar tandrejatandreja00000000000000--- name: ToolAlert description: 'The ToolAlert class carries additional information related to the use of attack tools or malevolent programs such as Trojan horses and can be used by the analyzer when it is able to identify these tools. It is intended to group one or more previously-sent alerts together, to say "these alerts were all the result of someone using this tool". ' color: "#BFBFBF" aggregates: name: name: name multiplicity: '1' type: STRING description: The reason for grouping the alerts together, for example, the name of a particular tool. command: name: command multiplicity: 0..1 type: STRING description: The command or operation that the tool was asked to perform, for example, a BackOrifice ping. alertident: name: alertident multiplicity: 1..* type: STRING description: The list of alert identifiers that are related to this alert. Because alert identifiers are only unique across the alerts sent by a single analyzer, the optional "analyzerid" attribute of "alertident" should be used to identify the analyzer that a particular alert came from. If the "analyzerid" is not provided, the alert is assumed to have come from the same analyzer that is sending the ToolAlert. attributes: {} prewikka-5.1.1/prewikka/views/idmefnav/htdocs/yaml/User.yml0000664000175000017500000000200513555143652025377 0ustar tandrejatandreja00000000000000--- name: User description: 'The User class is used to describe users. It is primarily used as a "container" class for the UserId aggregate class, as shown in Figure 16. ' color: "#66CCFF" aggregates: UserId: name: UserId multiplicity: 1..* type: description: Identification of a user, as indicated by its type attribute (see Section 4.2.7.3.1). attributes: ident: name: ident multiplicity: Optional type: STRING description: A unique identifier for the user; see Section 3.2.9. category: name: category multiplicity: Optional type: ENUM description: The type of user represented. The permitted values for this attribute are shown below. The default value is "unknown". (See also Section 10.) values: - rank: '0' keyword: unknown description: User type unknown - rank: '1' keyword: application description: An application user - rank: '2' keyword: os-device description: An operating system or device user prewikka-5.1.1/prewikka/views/idmefnav/htdocs/yaml/UserId.yml0000664000175000017500000000642213555143652025663 0ustar tandrejatandreja00000000000000--- name: UserId description: 'The UserId class provides specific information about a user. More than one UserId can be used within the User class to indicate attempts to transition from one user to another, or to provide complete information about a user''s (or process'') privileges. ' color: "#66CCFF" aggregates: name: name: name multiplicity: 0..1 type: STRING description: A user or group name. number: name: number multiplicity: 0..1 type: INTEGER description: A user or group number. attributes: ident: name: ident multiplicity: Optional type: STRING description: A unique identifier for the user id, see Section 3.2.9. type: name: type multiplicity: Optional type: ENUM description: The type of user information represented. The permitted values for this attribute are shown below. The default value is "original-user". (See also Section 10.) values: - rank: '0' keyword: current-user description: The current user id being used by the user or process. On Unix systems, this would be the "real" user id, in general. - rank: '1' keyword: original-user description: The actual identity of the user or process being reported on. On those systems that (a) do some type of auditing and (b) support extracting a user id from the "audit id" token, that value should be used. On those systems that do not support this, and where the user has logged into the system, the "login id" should be used. - rank: '2' keyword: target-user description: The user id the user or process is attempting to become. This would apply, on Unix systems for example, when the user attempts to use "su", "rlogin", "telnet", etc. - rank: '3' keyword: user-privs description: Another user id the user or process has the ability to use, or a user id associated with a file permission. On Unix systems, this would be the "effective" user id in a user or process context, and the owner permissions in a file context. Multiple UserId elements of this type may be used to specify a list of privileges. - rank: '4' keyword: current-group description: The current group id (if applicable) being used by the user or process. On Unix systems, this would be the "real" group id, in general. - rank: '5' keyword: group-privs description: Another group id the group or process has the ability to use, or a group id associated with a file permission. On Unix systems, this would be the "effective" group id in a group or process context, and the group permissions in a file context. On BSD-derived Unix systems, multiple UserId elements of this type would be used to include all the group ids on the "group list". - rank: '6' keyword: other-privs description: Not used in a user, group, or process context, only used in the file context. The file permissions assigned to users who do not match either the user or group permissions on the file. On Unix systems, this would be the "world" permissions. tty: name: tty multiplicity: Optional type: STRING description: The tty the user is using. prewikka-5.1.1/prewikka/views/idmefnav/htdocs/yaml/WebService.yml0000664000175000017500000000117713555143652026530 0ustar tandrejatandreja00000000000000--- name: WebService description: 'The WebService class carries additional information related to web traffic. ' color: "#FFCCCC" aggregates: url: name: url multiplicity: '1' type: STRING description: The URL in the request. cgi: name: cgi multiplicity: 0..1 type: STRING description: The CGI script in the request, without arguments. http-method: name: http-method multiplicity: 0..1 type: STRING description: The HTTP method (PUT, GET) used in the request. arg: name: arg multiplicity: 0..* type: STRING description: The arguments to the CGI script. attributes: {} prewikka-5.1.1/prewikka/views/idmefnav/templates/0000775000175000017500000000000013555143705023510 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/views/idmefnav/templates/idmefnav.mak0000664000175000017500000000401213555143652025771 0ustar tandrejatandreja00000000000000

    ${ schema["name"] }

    ${ schema["description"] }

    ${ schema['svg'] | n }

    % if schema.get("childs"):

    ${ _("Children") }

    % for child in schema["childs"].keys():

    ${ child }

    % endfor % endif % if schema.get("aggregates"):

    ${ _("Aggregates") }

    % for name, aggregate in schema["aggregates"].items():

    % if name in full_schema: ${ name } (${ aggregate.get("multiplicity") }) % else: ${ name } (${ aggregate.get("multiplicity") }) % endif

    ${ aggregate["description"] }
    % endfor % endif % if schema.get("attributes"):

    ${ _("Attributes") }

    % for name, attribute in schema["attributes"].items():

    % if name in full_schema: ${ name } (${ attribute.get("multiplicity") }) % else: ${ name } (${ attribute.get("multiplicity") }) % endif

    ${ attribute["description"] } % if attribute.get("values"): % for value in attribute.get("values"): % endfor
    ${ _("Rank") } ${ _("Keyword") } ${ _("Description") }
    ${ value.get("rank") } ${ value.get("keyword") } ${ value.get("description") }
    % endif
    % endfor % endif
    prewikka-5.1.1/prewikka/views/idmefnav/__init__.py0000664000175000017500000000423213555143652023625 0ustar tandrejatandreja00000000000000# Copyright (C) 2016-2019 CS-SI. All Rights Reserved. # Author: Sélim Menouar # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from __future__ import absolute_import, division, print_function, unicode_literals import pkg_resources from prewikka import template, version, view from . import graph_generator class IDMEFNav(view.View): _HTDOCS_DIR = pkg_resources.resource_filename(__name__, 'htdocs') plugin_name = "IDMEFNav" plugin_author = version.__author__ plugin_license = version.__license__ plugin_version = version.__version__ plugin_copyright = version.__copyright__ plugin_description = N_("IDMEF navigator") plugin_htdocs = (("idmefnav", _HTDOCS_DIR),) def __init__(self): view.View.__init__(self) self.schema = graph_generator.Schema(self._HTDOCS_DIR) self.schema.image_load() @view.route("/help/idmefnav", methods=['GET'], menu=(N_("Help"), N_("IDMEF"))) def render(self): idmef_class = env.request.parameters.get("idmef_class", "IDMEF-Message") if idmef_class not in self.schema: raise view.InvalidParameterValueError("idmef_class", idmef_class) dset = template.PrewikkaTemplate(__name__, "templates/idmefnav.mak").dataset() dset["schema"] = self.schema[idmef_class] dset["schema"]['svg'] = dset["schema"]['svg'].replace(graph_generator._LINK_TAG, url_for('idmefnav.render')) dset["full_schema"] = self.schema return dset.render() prewikka-5.1.1/prewikka/views/idmefnav/graph_generator.py0000664000175000017500000001244313555143652025240 0ustar tandrejatandreja00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2016-2019 CS-SI. All Rights Reserved. # Author: Sélim Menouar # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from __future__ import absolute_import, division, print_function, unicode_literals import cgi import glob import io import sys import yaml try: import pydot WITH_PYDOT = True except ImportError: WITH_PYDOT = False _LINK_TAG = 'IDMEF_NAV_LINK_TAG' class Schema(dict): def __init__(self, folder): self.folder = folder def image_load(self): self.data_load() for struct in self._data_load(): with io.open("%s/graph/%s.svg" % (self.folder, struct["name"]), 'r', encoding="utf8") as stream: self[struct["name"]]["svg"] = stream.read() def data_load(self): for struct in self._data_load(): self[struct["name"]] = struct def _data_load(self): for f in glob.glob("%s/yaml/*.yml" % self.folder): with io.open(f, 'r', encoding='utf-8') as stream: yield yaml.safe_load(stream) @staticmethod def quote_val(val): return '"%s"' % val def graphviz(self, idmef_class, direction='LR', link_format=None, format='svg'): dot = pydot.Dot(graph_name=self.quote_val(idmef_class), format=format, bgcolor='transparent') dot.set_graph_defaults(rankdir=direction) dot.set_node_defaults(shape='plaintext') self.add_node(dot, idmef_class, link_format) return dot def gen_all(self, direction='LR', link_format=None): for name in self: self.graphviz(name, direction, link_format, 'svg').write("%s/graph/%s.svg" % (self.folder, name), format='svg') def add_node(self, dot, node_name, link_format=None, nodes=None): if node_name not in self: return if not nodes: nodes = {} nodes[node_name] = True color = self[node_name].get("color", "#FFFFFF") link = link_format % node_name if link_format else "#" label = """< """.format( color=self.darken_color(color), link=link, title=cgi.escape(self[node_name].get("description"), quote=True), name=node_name ) for key, value in self[node_name].get("childs", {}).items(): if key not in self: continue if key not in nodes: self.add_node(dot, key, link_format, nodes) args = {'dir': 'back', 'arrowtail': 'invempty'} if value.get("multiplicity"): args['label'] = value.get("multiplicity") dot.add_edge(pydot.Edge(self.quote_val(node_name), self.quote_val(key), **args)) for key, value in self[node_name].get("aggregates", {}).items(): if key in self: if key not in nodes: self.add_node(dot, key, link_format, nodes) args = {'dir': 'forward'} if value.get("multiplicity"): args['label'] = value.get("multiplicity") dot.add_edge(pydot.Edge(self.quote_val(node_name), self.quote_val(key), **args)) continue label += self.graph_attr(key, value, color, link) for key, value in self[node_name].get("attributes", {}).items(): label += self.graph_attr(key, value, color, link) label += "
    {name}
    >" dot.add_node(pydot.Node(self.quote_val(node_name), label=label)) @staticmethod def darken_color(hex_color, amount=0.6): hex_color = hex_color.replace('#', '') rgb = [] rgb.append(int(hex_color[0:2], 16) * amount) rgb.append(int(hex_color[2:4], 16) * amount) rgb.append(int(hex_color[4:6], 16) * amount) return "#" + ''.join(["{0:02x}".format(int(c)) for c in rgb]) @staticmethod def graph_attr(name, value, color, link): return """[{type}] {name} ({mult})""".format( color=color, link=link, title=cgi.escape(value.get("description"), quote=True), name=name, mult=value.get("multiplicity"), type=value.get("type"), ) if __name__ == "__main__": if not WITH_PYDOT: print('You need pydot to update graphs.') sys.exit(1) schema = Schema('htdocs') schema.data_load() schema.gen_all(link_format="%s?idmef_class=%%s" % _LINK_TAG) prewikka-5.1.1/prewikka/views/messagesummary/0000775000175000017500000000000013555143705022763 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/views/messagesummary/templates/0000775000175000017500000000000013555143705024761 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/views/messagesummary/templates/messagesummary.mak0000664000175000017500000000601713555143652030522 0ustar tandrejatandreja00000000000000<%! from datetime import datetime from prewikka.localization import format_datetime entry_value_classes = ("section_alert_entry_value_normal", "section_alert_entry_value_emphasis") %> <%def name="display_table(section, depth)"> % for table in section["tables"]: % if depth == 0 and loop.index > 0 and table["style"].find("inline") == -1:
    % endif % for row in table["rows"]: % for col in row: % if col["header"]: % elif col["tables"]: % else: % endif % endfor % endfor
    ${col["name"]}${ display_table(col, depth + 1) }${col["name"]}
    % endfor <%def name="display_node(sections)"> % for section in sections:
    ${ display_table(section, 0) } % if section["entries"]: % for entry in section["entries"]: % if entry["name"]: % endif <% if isinstance(entry.value, datetime): entry.value = format_datetime(entry.value) %> % endfor
    ${entry["name"]}${entry["value"]}
    % endif % if section["sections"]: ${ display_node(section["sections"]) } % endif
    % endfor
    prewikka-5.1.1/prewikka/views/messagesummary/__init__.py0000664000175000017500000000107613555143652025101 0ustar tandrejatandreja00000000000000from __future__ import absolute_import, division, print_function, unicode_literals from prewikka import pluginmanager, version from .messagesummary import AlertSummary, HeartbeatSummary class MessageSummary(pluginmanager.PluginPreload): plugin_name = "Detailed alert and heartbeat" plugin_author = version.__author__ plugin_license = version.__license__ plugin_version = version.__version__ plugin_copyright = version.__copyright__ plugin_description = N_("Detailed alert and heartbeat page") plugin_classes = [AlertSummary, HeartbeatSummary] prewikka-5.1.1/prewikka/views/messagesummary/messagesummary.py0000664000175000017500000011545013555143652026406 0ustar tandrejatandreja00000000000000# Copyright (C) 2004-2019 CS-SI. All Rights Reserved. # Author: Yoann Vandoorselaere # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from __future__ import absolute_import, division, print_function, unicode_literals import hashlib import itertools import re import string import struct import urllib import pkg_resources from prewikka import hookmanager, localization, resolve, resource, template, utils, view from prewikka.dataprovider import Criterion from prewikka.utils import html def getUriCriteria(ptype, analyzerid, messageid): criteria = Criterion() if analyzerid: criteria += Criterion("%s.analyzer.analyzerid" % ptype, "=", analyzerid) return criteria + Criterion("%s.messageid" % ptype, "=", messageid) class Table(object): def __init__(self): self._current_table = None self._current_section = None def getCurrentSection(self): return self._current_section def beginSection(self, title, display="block"): _current_section = {} _current_section["title"] = title _current_section["entries"] = [] _current_section["tables"] = [] _current_section["display"] = display _current_section["sections"] = [] _current_section["parent"] = self._current_section self._current_section = _current_section def endSection(self): parent = self._current_section["parent"] if len(self._current_section["tables"]) == 0 and \ len(self._current_section["sections"]) == 0 and \ len(self._current_section["entries"]) == 0: self._current_section = parent return if not parent: env.request.dataset["sections"].append(self._current_section) self._current_section = None else: parent["sections"].append(self._current_section) self._current_section = parent def newSectionEntry(self, name, value, emphase=False): if value is None or value == "": return self._current_section["entries"].append({"name": name, "value": value, "emphase": emphase}) def beginTable(self, cl="table-striped table-bordered", style="", odd_even=False): table = {} table["rows"] = [] table["odd_even"] = odd_even table["class"] = "table " + cl table["style"] = style table["parent"] = self._current_table or self._current_section self._current_table = table def endTable(self): parent = self._current_table["parent"] if len(self._current_table["rows"]) <= 1: if not parent or "rows" not in parent: self._current_table = None else: self._current_table = parent return if not parent: self._current_section["tables"].append(self._current_table) self._current_table = None else: if "rows" in parent: col = {"name": None, "header": None, "emphase": None, "tables": [self._current_table]} if len(parent["rows"]): parent["rows"][-1] += [col] else: parent["rows"].append([col]) self._current_table = parent else: parent["tables"].append(self._current_table) self._current_table = None def newTableRow(self): if len(self._current_table["rows"]) and self._current_table["rows"][-1] != []: self._current_table["rows"].append([]) return len(self._current_table["rows"]) def newTableCol(self, row_index, name, cl="", header=False, emphase=None): col = {"name": name, "header": header, "class": cl, "tables": [], "emphase": None} if row_index == -1: self._current_table["rows"].append([col]) elif len(self._current_table["rows"]) <= row_index: self._current_table["rows"].insert(row_index, [col]) else: self._current_table["rows"][row_index] += [col] def newTableEntry(self, name, value, cl="", emphase=False): if value is None: return self.newTableCol(0, name, cl=cl, header=True) self.newTableCol(1, value, cl=cl, header=False, emphase=emphase) class HeaderTable(Table): def __init__(self): self.field_list = [] def register_static(self, name, static): self.field_list.append((None, name, static, None, None)) def register(self, name, field, func=None, arguments=()): self.field_list.append((field, name, None, func, arguments)) def render_table(self, section, name, dataset): self._current_section = section._current_section self._current_table = section._current_table from_dataset = False self.newTableRow() self.newTableCol(-1, name, header=True) self.beginTable() for field in self.field_list: if not field[0] in dataset and not field[2]: continue if field[2]: # static s = field[2] else: value = dataset[field[0]] if field[3]: # use func s = field[3](value, *field[4]) else: from_dataset = True s = value self.newTableEntry(field[1], s) if not from_dataset: section._current_table["rows"].pop() self._current_table = section._current_table else: self.endTable() class TcpIpOptions(Table): def _isFlagSet(self, bits, flag, shift=0): if (bits & flag) >> shift: return "X" else: return resource.HTMLSource(" ") def _decodeOption8(self, data): return text_type(struct.unpack(b">B", data)[0]) def _decodeOption16(self, data): return text_type(struct.unpack(b">H", data)[0]) def _decodeOption32(self, data): return text_type(struct.unpack(b">L", data)[0]) def _decodeOptionTimestamp(self, data): x = struct.unpack(b">LL", data) return resource.HTMLSource("TS Value (%d)
    TS Echo Reply (%d)") % (x[0], x[1]) def _decodeOptionSack(self, data): x = struct.unpack(b">" + "L" * (len(data) / 4), data) return resource.HTMLSource("
    ").join(text_type(i) for i in x) def _decodeOptionMd5(self, data): md = hashlib.md5(struct.unpack(b">B" * 16, data)[0]) return md.hexdigest() def _decodeOptionPartialOrderProfile(self, data): return "Start_Flags=%d End_Flags=%d" % (data & 0x80, data & 0x40) def _decodeOptionTcpAltChecksumRequest(self, data): x = struct.unpack(b">B", data) if x == 0: return "TCP checksum" elif x == 1: return "8-bit Fletcher's algorithm" elif x == 2: return "16-bit Fletcher's algorithm" else: return "%d (Invalid)" % x def _tcpOptionToName(self, opt): h = {} h[0] = ("End of Option List", 0) h[1] = ("No-Option", 0) h[2] = ("Maximum Segment Size", 2, self._decodeOption16) h[3] = ("Window Scaling", 1, self._decodeOption8) h[4] = ("Sack Permitted", 0) h[5] = ("Sack", -1, self._decodeOptionSack) h[6] = ("Echo", 4, self._decodeOption32) h[7] = ("Echo Reply", 4, self._decodeOption32) h[8] = ("Timestamp", 8, self._decodeOptionTimestamp) h[9] = ("Partial Order Permitted", 0) h[10] = ("Partial Order Profile", 1, self._decodeOptionPartialOrderProfile) h[11] = ("Connection Count", 4, self._decodeOption32) h[12] = ("Connection Count New", 4, self._decodeOption32) h[13] = ("Connection Count Echo", 4, self._decodeOption32) h[14] = ("TCP Alternate Checksum Request", 1, self._decodeOptionTcpAltChecksumRequest) h[15] = ("TCP Alternate Checksum",) h[16] = ("Skeeter",) h[17] = ("Bubba",) h[18] = ("Trailer Checksum",) h[19] = ("MD5 Signature", 16, self._decodeOptionMd5) h[20] = ("Capabilities",) h[21] = ("Selective Negative Acknowledgements",) h[22] = ("Record Boundaries",) h[23] = ("Corruption experienced",) h[24] = ("Snap",) h[25] = ("Unassigned",) h[26] = ("TCP Compression Filter",) return h.get(opt, ("Unknown",)) def _ipOptionToName(self, opt): h = {} h[0] = ("End of Option List", 0) h[1] = ("No-Option", 0) h[7] = ("RR",) h[20] = ("RTRALT",) h[68] = ("Timestamp",) h[130] = ("Security", ) h[131] = ("LSRR", 0) h[132] = ("LSRR_E", 0) h[136] = ("SATID", 0) h[137] = ("SSRR", 0) return h.get(opt, ("Unknown",)) def _optionRender(self, options, to_name_func): self.beginTable() self.newTableCol(0, _("Name"), header=True) self.newTableCol(0, _("Code"), header=True) self.newTableCol(0, _("Data length"), header=True) self.newTableCol(0, _("Data"), header=True) for option in options: dec = to_name_func(option[0]) idx = self.newTableRow() self.newTableCol(idx, dec[0]) self.newTableCol(idx, option[0]) if len(dec) == 2 and dec[1] != -1 and dec[1] != option[1]: self.newTableCol(idx, resource.HTMLSource("%d (expected %d)" % (option[1], dec[1]))) else: self.newTableCol(idx, "%d" % option[1]) if len(dec) == 3 and (dec[1] == -1 or dec[1] == option[1]): self.newTableCol(idx, "%s" % dec[2](option[2])) else: self.newTableCol(idx, resource.HTMLSource(" ")) self.endTable() def ipOptionRender(self, ip_options): if not ip_options: return self.newTableRow() self.newTableCol(-1, "IP options", header=True) self._optionRender(ip_options, self._ipOptionToName) def tcpOptionRender(self, tcp_options): if not tcp_options: return self.newTableRow() self.newTableCol(-1, "TCP options", header=True) self._optionRender(tcp_options, self._tcpOptionToName) class MessageSummary(Table, view.View): view_permissions = [N_("IDMEF_VIEW")] view_template = template.PrewikkaTemplate(__name__, 'templates/messagesummary.mak') plugin_htdocs = (("messagesummary", pkg_resources.resource_filename(__name__, 'htdocs')),) def __init__(self, *args, **kwargs): Table.__init__(self) view.View.__init__(self, *args, **kwargs) def getUrlLink(self, name, url=None): if not name: return None if not url: if name.find("http://") != -1: url = name elif re.compile("\.[^\s]+\.[^\s+]").search(name): url = "http://" + name else: return name return resource.HTMLSource('%s' % (env.external_link_target, html.escape(url), html.escape(name))) def getTime(self, dt): if not dt: return None agent_time = dt user_time = dt.astimezone(env.request.user.timezone) s = localization.format_datetime(user_time, format="medium") if agent_time.tzinfo.utcoffset(agent_time) != user_time.tzinfo.utcoffset(user_time): s = " ".join((s, _("(agent local time: %s)") % localization.format_datetime(agent_time, tzinfo=agent_time.tzinfo, format="medium"))) return s def buildTime(self, msg): self.beginTable() self.newTableEntry(_("Create time"), self.getTime(msg["create_time"])) try: self.newTableEntry(_("Detect time"), self.getTime(msg["detect_time"]), cl="section_alert_entry_value_emphasis") except: pass if msg["analyzer_time"]: self.newTableEntry(_("Analyzer time"), self.getTime(msg["analyzer_time"])) self.endTable() def buildProcess(self, process): self.beginTable() self.newTableEntry(_("Process"), process["name"]) self.newTableEntry(_("Process Path"), process["path"]) self.newTableEntry(_("Process PID"), process["pid"]) self.endTable() def buildNode(self, node): if not node: return self.newTableEntry(_("Node location"), node["location"]) addr_list = [] node_name = None for addr in node["address"]: address = addr["address"] if not address: continue node_name = resolve.AddressResolve(address) if addr["category"] in ("ipv4-addr", "ipv6-addr", "ipv4-net", "ipv6-net") and env.enable_details: addr_list.append(self.getUrlLink(address, "%s?host=%s" % (env.host_details_url, address))) else: addr_list.append(address) if node["name"]: self.newTableEntry(_("Node name"), node["name"]) elif node_name is not None and node_name.resolve_succeed(): self.newTableEntry(_("Node name (resolved)"), node_name) if addr_list: self.newTableEntry(_("Node address"), resource.HTMLSource("
    ").join(addr_list)) def buildAnalyzer(self, analyzer): self.beginTable(cl="table-borderless") self.beginTable() self.newTableEntry(_("Model"), analyzer["model"], cl="section_alert_entry_value_emphasis") self.newTableEntry(_("Name"), analyzer["name"], cl="section_alert_entry_value_emphasis") self.newTableEntry(_("Analyzerid"), analyzer["analyzerid"]) self.newTableEntry(_("Version"), analyzer["version"]) self.newTableEntry(_("Class"), analyzer["class"]) self.newTableEntry(_("Manufacturer"), self.getUrlLink(analyzer["manufacturer"])) self.endTable() self.newTableRow() self.beginTable() self.buildNode(analyzer["node"]) if analyzer["ostype"] or analyzer["osversion"]: self.newTableEntry(_("Operating System"), "%s %s" % (analyzer["ostype"] or "", analyzer["osversion"] or "")) self.endTable() self.newTableRow() if analyzer["process"]: self.buildProcess(analyzer["process"]) self.newTableRow() self.endTable() def buildAnalyzerList(self, msg): l = [] for analyzer in msg["analyzer"]: l.insert(0, analyzer) l.pop(0) self.beginSection(_("Analyzer Path (%d not shown)") % len(l), display="none") self.beginTable(cl="table-borderless") i = 1 index = len(l) - 1 for analyzer in l: self.newTableCol(i - 1, _("Analyzer #%d") % index, None, header=True) self.buildAnalyzer(analyzer) self.newTableRow() i += 1 index -= 1 self.endTable() self.endSection() def buildAdditionalData(self, msg, ptype, ignore=[], ignored={}, ip_options=[], tcp_options=[]): self.beginSection(_("Additional data")) self.beginTable() self.newTableCol(0, _("Meaning"), header=True) self.newTableCol(0, _("Value"), header=True) index = 1 for ad in msg["additional_data"]: value = None meaning = ad["meaning"] if meaning == "ip_option_code": ip_options.append((ad["data"], 0, None)) ignored[meaning] = "" if meaning == "ip_option_data": data = ad["data"] ip_options[-1] = (ip_options[-1][0], len(data), data) ignored[meaning] = "" if meaning == "tcp_option_code": tcp_options.append((ad["data"], 0, None)) ignored[meaning] = "" if meaning == "tcp_option_data": data = ad["data"] tcp_options[-1] = (tcp_options[-1][0], len(data), data) ignored[meaning] = "" if ad["data"] is not None: value = ad["data"] if ad["type"] == "byte-string" and meaning != "payload": value = html.escape(utils.hexdump(value)).replace(" ", resource.HTMLSource(" ")) value = resource.HTMLSource("%s" % value) for field in ignore: if meaning is not None and meaning == field[0]: ignored[meaning] = value break links = resource.HTMLSource() for obj in filter(None, hookmanager.trigger("HOOK_%sSUMMARY_MEANING_LINK" % ptype.upper(), msg, meaning, value)): links += obj if links: meaning = resource.HTMLSource("%s%s") % (meaning, links) if meaning not in ignored: self.newTableCol(index, resource.HTMLSource(meaning or "Data content")) self.newTableCol(index, html.escape(value) if value is not None else None) index += 1 self.endTable() self.endSection() def buildIpHeaderTable(self, alert): ip = HeaderTable() ip.register(_("Version"), "ip_ver") ip.register(_("Header length"), "ip_hlen") ip.register(_("TOS"), "ip_tos") ip.register(_("Length"), "ip_len") ip.register(_("Id"), "ip_id") ip.register(resource.HTMLSource("R
    F"), "ip_off", self._isFlagSet, (0x8000, 15)) ip.register(resource.HTMLSource("D
    F"), "ip_off", self._isFlagSet, (0x4000, 14)) ip.register(resource.HTMLSource("M
    F"), "ip_off", self._isFlagSet, (0x2000, 13)) ip.register(_("Ip offset"), "ip_off", (lambda x: x & 0x1fff)) ip.register(_("TTL"), "ip_ttl") ip.register(_("Protocol"), "ip_proto") ip.register(_("Checksum"), "ip_sum") ip.register_static(_("Source address"), alert["source(0).node.address(0).address"]) ip.register_static(_("Target address"), alert["target(0).node.address(0).address"]) return ip def buildTcpHeaderTable(self, alert): tcp = HeaderTable() tcp.register_static(_("Source port"), alert["source(0).service.port"]) tcp.register_static(_("Target port"), alert["target(0).service.port"]) tcp.register("Seq #", "tcp_seq") tcp.register("Ack #", "tcp_ack") tcp.register(_("Header length"), "tcp_off") tcp.register(_("Reserved"), "tcp_res") tcp.register(resource.HTMLSource("R
    1"), "tcp_flags", self._isFlagSet, (0x80,)) tcp.register(resource.HTMLSource("R
    2"), "tcp_flags", self._isFlagSet, (0x40,)) tcp.register(resource.HTMLSource("U
    R
    G"), "tcp_flags", self._isFlagSet, (0x20,)) tcp.register(resource.HTMLSource("A
    C
    K"), "tcp_flags", self._isFlagSet, (0x10,)) tcp.register(resource.HTMLSource("P
    S
    H"), "tcp_flags", self._isFlagSet, (0x08,)) tcp.register(resource.HTMLSource("R
    S
    T"), "tcp_flags", self._isFlagSet, (0x04,)) tcp.register(resource.HTMLSource("S
    Y
    N"), "tcp_flags", self._isFlagSet, (0x02,)) tcp.register(resource.HTMLSource("F
    I
    N"), "tcp_flags", self._isFlagSet, (0x01,)) tcp.register(_("Window"), "tcp_win") tcp.register(_("Checksum"), "tcp_sum") tcp.register(_("URP"), "tcp_urp") return tcp def buildUdpHeaderTable(self, alert): udp = HeaderTable() udp.register_static(_("Source port"), alert["source(0).service.port"]) udp.register_static(_("Target port"), alert["target(0).service.port"]) udp.register(_("Length"), "udp_len") udp.register(_("Checksum"), "udp_sum") return udp def buildIcmpHeaderTable(self, alert): icmp = HeaderTable() icmp.register(_("Type"), "icmp_type") icmp.register(_("Code"), "icmp_code") icmp.register(_("Checksum"), "icmp_sum") icmp.register(_("Id"), "icmp_id") icmp.register(_("Seq #"), "icmp_seq") icmp.register(_("Mask"), "icmp_mask") icmp.register(_("Gateway Address"), "icmp_gwaddr") icmp.register(_("Num address"), "icmp_num_addrs") icmp.register(_("Wpa"), "icmp_wpa") icmp.register(_("Lifetime"), "icmp_lifetime") icmp.register(_("Otime"), "icmp_otime") icmp.register(_("Rtime"), "icmp_rtime") icmp.register(_("Ttime"), "icmp_ttime") return icmp def buildPayloadTable(self, alert): data = HeaderTable() data.register(_("Payload"), "payload") # data.register("ASCII Payload", "payload", html.escape) return data def render(self): self._current_table = None self._current_section = None class AlertSummary(TcpIpOptions, MessageSummary): def __init__(self): MessageSummary.__init__(self) @staticmethod def _get_alert_ident_criterion(analyzerid, ident): return Criterion("alert.analyzer.analyzerid", "=", analyzerid) & Criterion("alert.messageid", "=", ident) def buildAlertIdent(self, alert, parent): calist = {} for alertident in parent["alertident"]: # IDMEF draft 14 page 27 # If the "analyzerid" is not provided, the alert is assumed to have come # from the same analyzer that is sending the Alert. analyzerid = alertident["analyzerid"] if not analyzerid: for a in alert["analyzer"]: if a["analyzerid"]: analyzerid = a["analyzerid"] break calist.setdefault(analyzerid, []).append(alertident["alertident"]) for idx, (analyzerid, idents) in enumerate(calist.items()): content = "" results = [] total = 0 step = 50 limit = min(len(idents), 500) for i in range(0, limit, step): # FIXME #3250, #3251 # We execute several queries to avoid recursion errors criteria = Criterion() for ident in idents[i:i+step]: criteria |= self._get_alert_ident_criterion(analyzerid, ident) results.append(env.dataprovider.query(["alert.messageid", "alert.classification.text"], criteria)) for ident, classif in itertools.chain(*results): link = url_for(".render", analyzerid=analyzerid, messageid=ident) content += '
  • %s
  • ' % (_("Alert details"), link, html.escape(classif)) total += 1 missing = limit - total if missing > 0: content += "
  • " + (_("%d linked alerts missing (probably deleted)") % missing) + "
  • " omitted = len(idents) - limit if omitted > 0: content += "
  • " + (_("%d linked alerts omitted") % omitted) + "
  • " self.newTableCol(idx + 1, resource.HTMLSource("
      %s
    " % content)) linked_alerts = env.dataprovider.get(self._get_alert_ident_criterion(analyzerid, idents[0])) if linked_alerts: self.buildAnalyzer(linked_alerts[0]["alert.analyzer(-1)"]) else: self.newTableCol(1, None) self.newTableRow() def buildCorrelationAlert(self, alert): ca = alert.get("correlation_alert") if not ca: return self.beginSection(_("Correlation Alert")) self.beginTable() self.newTableEntry(_("Name"), ca["name"]) self.endTable() self.beginTable() self.newTableCol(0, _("Correlated Alerts"), header=True) self.newTableCol(0, _("Source Analyzer"), header=True) self.buildAlertIdent(alert, ca) self.endTable() self.endSection() def buildToolAlert(self, alert): ta = alert.get("tool_alert") if not ta: return self.beginSection(_("Tool Alert")) self.beginTable() self.newTableEntry(_("Name"), ta["name"]) self.endTable() self.beginTable() self.newTableCol(0, _("Linked Alerts"), header=True) self.newTableCol(0, _("Source Analyzer"), header=True) self.buildAlertIdent(alert, ta) self.endTable() self.endSection() def buildClassification(self, alert): if not alert["classification.text"]: return self.newTableEntry(_("Text"), alert["classification.text"], cl="section_alert_entry_value_emphasis impact_severity_%s" % alert["assessment.impact.severity"]) self.newTableEntry(_("Ident"), alert["classification.ident"]) def buildReference(self, alert): self.beginTable() self.newTableCol(0, _("Origin"), header=True) self.newTableCol(0, _("Name"), header=True) self.newTableCol(0, _("Meaning"), header=True) index = 1 for reference in alert["classification.reference"]: self.newTableCol(index, reference["origin"]) if env.enable_details: if reference["origin"] in ("user-specific", "vendor-specific"): urlstr = "&url=" + urllib.quote(reference["url"], safe="") else: urlstr = "" url = "%s?origin=%s&name=%s%s" % (env.reference_details_url, urllib.quote(reference["origin"]), urllib.quote(reference["name"]), urlstr) self.newTableCol(index, self.getUrlLink(reference["name"], url)) else: self.newTableCol(index, reference["name"]) self.newTableCol(index, reference["meaning"]) index += 1 self.endTable() def buildImpact(self, alert): self.newTableEntry(_("Severity"), alert["assessment.impact.severity"], cl="impact_severity_%s" % alert["assessment.impact.severity"]) self.newTableEntry(_("Completion"), alert["assessment.impact.completion"], cl="impact_completion_%s" % alert["assessment.impact.completion"]) self.newTableEntry(_("Type"), alert["assessment.impact.type"]) self.newTableEntry(_("Description"), alert["assessment.impact.description"]) def buildAction(self, action): self.beginTable() self.newTableEntry(_("Category"), action["category"]) self.newTableEntry(_("Description"), action["description"]) self.endTable() def buildChecksum(self, checksum): self.newTableEntry(checksum["algorithm"], checksum["value"]) self.newTableEntry("%s key" % checksum["algorithm"], checksum["key"]) def _joinUserInfos(self, user, number, tty=None): user_str = user or "" if user is not None and number is not None: user_str += "(%d)" % number elif number: user_str = text_type(number) if tty: user_str += " on tty " + tty return user_str def buildUser(self, user): self.beginTable() self.newTableEntry(_("User category"), user["category"]) self.beginTable() self.newTableCol(0, _("Type"), header=True) self.newTableCol(0, _("Name"), header=True) self.newTableCol(0, _("Number"), header=True) self.newTableCol(0, _("Tty"), header=True) index = 1 for user_id in user["user_id"]: # user_str = self._joinUserInfos(user_id["name"], user_id["number"], user_id["tty"]) self.newTableCol(index, user_id["type"]) self.newTableCol(index, user_id["name"]) self.newTableCol(index, user_id["number"]) self.newTableCol(index, user_id["tty"]) index += 1 self.endTable() self.endTable() def buildFileAccess(self, file): self.beginTable() self.newTableCol(0, _("Type"), header=True) self.newTableCol(0, _("Name"), header=True) self.newTableCol(0, _("Number"), header=True) self.newTableCol(0, _("Permission"), header=True) index = 1 for fa in file["file_access"]: pstr = "" for perm in fa["permission"]: if pstr: pstr += ", " pstr += perm self.newTableCol(index, fa["user_id.type"]) self.newTableCol(index, fa["user_id.name"]) self.newTableCol(index, fa["user_id.number"]) self.newTableCol(index, pstr) index += 1 self.endTable() def buildInode(self, inode): self.beginTable() self.newTableEntry(_("Change time"), self.getTime(inode["change_time"])) self.newTableEntry(_("Inode Number"), inode["number"]) self.newTableEntry(_("Major device"), inode["major_device"]) self.newTableEntry(_("Minor device"), inode["minor_device"]) self.newTableEntry(_("C Major device"), inode["c_major_device"]) self.newTableEntry(_("C Minor device"), inode["c_minor_device"]) self.endTable() def buildFile(self, file): self.beginSection(_("Target file %s") % _(file["category"])) self.beginTable() self.newTableEntry(_("Name"), file["name"]) self.newTableEntry(_("Path"), file["path"]) self.newTableEntry(_("Create time"), self.getTime(file["create_time"])) self.newTableEntry(_("Modify time"), self.getTime(file["modify_time"])) self.newTableEntry(_("Access time"), self.getTime(file["access_time"])) self.newTableEntry(_("Data size"), file["data_size"]) self.newTableEntry(_("Disk size"), file["disk_size"]) self.endTable() self.beginTable() for checksum in file["checksum"]: self.buildChecksum(checksum) self.endTable() self.buildFileAccess(file) if file["inode"]: self.buildInode(file["inode"]) self.endSection() def buildWebService(self, webservice): if not webservice: return self.beginSection(_("Web Service")) self.beginTable() self.newTableEntry(_("Url"), webservice["url"]) self.newTableEntry(_("Cgi"), webservice["cgi"]) self.newTableEntry(_("Http Method"), webservice["http_method"]) for arg in webservice["arg"]: self.newTableEntry(_("CGI Argument"), arg) self.endTable() self.endSection() def buildSnmpService(self, service): if not service: return self.beginSection(_("SNMP Service")) self.beginTable() self.newTableEntry(_("oid"), service["oid"]) self.newTableEntry(_("messageProcessingModel"), service["message_processing_model"]) self.newTableEntry(_("securityModel"), service["security_model"]) self.newTableEntry(_("securityName"), service["security_name"]) self.newTableEntry(_("securityLevel"), service["security_level"]) self.newTableEntry(_("contextName"), service["context_name"]) self.newTableEntry(_("contextEngineID"), service["context_engine_id"]) self.newTableEntry(_("command"), service["command"]) self.endTable() self.endSection() def buildService(self, service): if not service: return if service["port"]: port = text_type(service["port"]) if env.enable_details: self.newTableEntry(_("Port"), self.getUrlLink(port, "%s?port=%s" % (env.port_details_url, port))) else: self.newTableEntry(_("Port"), port) portlist = service["portlist"] if portlist: out = "" for port in portlist.replace(" ", "").split(","): if len(out) > 0: out += ", " if env.enable_details: if port.find("-") != -1: left, right = port.split("-") out += self.getUrlLink(left, "%s?port=%s" % (left, env.port_details_url)) out += " - " out += self.getUrlLink(right, "%s?port=%s" % (right, env.port_details_url)) else: out += self.getUrlLink(port, "%s?port=%s" % (port, env.port_details_url)) else: out += port self.newTableEntry(_("PortList"), out) if service["ip_version"]: self.newTableEntry(_("ip_version"), service["ip_version"]) ipn = service["iana_protocol_number"] if ipn and utils.protocol_number_to_name(ipn) is not None: self.newTableEntry(_("Protocol"), utils.protocol_number_to_name(ipn)) elif service["iana_protocol_name"]: self.newTableEntry(_("Protocol"), service["iana_protocol_name"]) elif service["protocol"]: self.newTableEntry(_("Protocol"), service["protocol"]) def buildDirection(self, direction): self.beginTable() self.buildNode(direction["node"]) self.buildService(direction["service"]) self.endTable() user = direction["user"] if user: self.buildUser(user) process = direction["process"] if process: self.buildProcess(process) self.buildWebService(direction["service.web_service"]) self.buildSnmpService(direction["service.snmp_service"]) def buildSource(self, alert): i = 0 if len(alert["source"]) > 1: self.beginSection("Sources") for source in alert["source"]: self.beginSection(_("Source(%d)") % i) self.buildDirection(source) self.endSection() i += 1 if i > 1: self.endSection() def buildTarget(self, alert): i = 0 if len(alert["target"]) > 1: self.beginSection("Targets") for target in alert["target"]: self.beginSection(_("Target(%d)") % i) self.buildDirection(target) for f in target["file"]: self.buildFile(f) self.endSection() i += 1 if i > 1: self.endSection() def buildSourceTarget(self, alert): self.buildSource(alert) self.buildTarget(alert) def getSectionName(self, alert): if alert.get("correlation_alert"): section = _("Correlation Alert") elif alert.get("tool_alert"): section = _("Tool Alert") elif alert.get("overflow_alert"): section = _("Overflow Alert") else: section = _("Alert") return section @view.route("/alerts/summary/:") @view.route("/alerts/summary/") def render(self, analyzerid=None, messageid=None): MessageSummary.render(self) alert = env.dataprovider.get(getUriCriteria("alert", analyzerid, messageid))[0]["alert"] env.request.dataset["sections"] = [] self.beginSection(self.getSectionName(alert)) self.buildTime(alert) self.beginTable() self.newTableEntry(_("MessageID"), alert["messageid"]) self.endTable() self.beginTable() self.buildClassification(alert) self.buildImpact(alert) self.endTable() self.beginSection(_("Actions")) for action in alert["assessment.action"]: self.buildAction(action) self.endSection() self.buildCorrelationAlert(alert) self.buildToolAlert(alert) self.buildReference(alert) self.beginSection(_("Analyzer #%d") % (len(alert["analyzer"]) - 1)) self.buildAnalyzer(alert["analyzer(-1)"]) self.buildAnalyzerList(alert) self.endSection() self.endSection() self.buildSourceTarget(alert) ip = self.buildIpHeaderTable(alert) tcp = self.buildTcpHeaderTable(alert) udp = self.buildUdpHeaderTable(alert) icmp = self.buildIcmpHeaderTable(alert) data = self.buildPayloadTable(alert) ignored_value = {} ip_options = [] tcp_options = [] group = ip.field_list + tcp.field_list + udp.field_list + icmp.field_list + data.field_list self.buildAdditionalData(alert, "alert", ignore=group, ignored=ignored_value, ip_options=ip_options, tcp_options=tcp_options) if len(ignored_value.keys()) > 0: def blah(b): if b >= 32 and b < 127: return chr(b) else: return "." self.beginSection(_("Network centric information")) self.beginTable(cl="table-borderless") ip.render_table(self, "IP", ignored_value) self.ipOptionRender(ip_options) tcp.render_table(self, "TCP", ignored_value) self.tcpOptionRender(tcp_options) udp.render_table(self, "UDP", ignored_value) icmp.render_table(self, "ICMP", ignored_value) if "payload" in ignored_value: val = {} payload = html.escape(utils.hexdump(ignored_value["payload"])).replace(" ", resource.HTMLSource(" ")) val["payload"] = resource.HTMLSource("%s" % payload) data.render_table(self, _("Payload"), val) pset = set(string.printable) payload = ''.join((i if i in pset else '.' for i in ignored_value["payload"])) val["payload"] = resource.HTMLSource("
    %s
    " % html.escape(payload).replace("\n", resource.HTMLSource("
    "))) data.render_table(self, _("ASCII Payload"), val) self.endTable() self.endSection() class HeartbeatSummary(MessageSummary): @view.route("/heartbeats/summary/:") @view.route("/heartbeats/summary/") def render(self, analyzerid=None, messageid=None): MessageSummary.render(self) heartbeat = env.dataprovider.get(getUriCriteria("heartbeat", analyzerid, messageid))[0]["heartbeat"] env.request.dataset["sections"] = [] self.beginSection(_("Heartbeat")) self.buildTime(heartbeat) self.beginSection(_("Analyzer #%d") % (len(heartbeat["analyzer"]) - 1)) self.buildAnalyzer(heartbeat["analyzer(-1)"]) self.buildAnalyzerList(heartbeat) self.endSection() self.endSection() self.buildAdditionalData(heartbeat, "heartbeat") prewikka-5.1.1/prewikka/views/usermanagement/0000775000175000017500000000000013555143705022734 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/views/usermanagement/templates/0000775000175000017500000000000013555143705024732 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/views/usermanagement/templates/usersettings.mak0000664000175000017500000000545413555143652030174 0ustar tandrejatandreja00000000000000
    prewikka-5.1.1/prewikka/views/usermanagement/__init__.py0000664000175000017500000000100213555143652025037 0ustar tandrejatandreja00000000000000from __future__ import absolute_import, division, print_function, unicode_literals from prewikka import pluginmanager, version from . import usermanagement class UserManagement(pluginmanager.PluginPreload): plugin_name = "User management" plugin_author = version.__author__ plugin_license = version.__license__ plugin_version = version.__version__ plugin_copyright = version.__copyright__ plugin_description = N_("User settings page") plugin_classes = [usermanagement.UserSettings] prewikka-5.1.1/prewikka/views/usermanagement/usermanagement.py0000664000175000017500000000634713555143652026334 0ustar tandrejatandreja00000000000000# Copyright (C) 2004-2019 CS-SI. All Rights Reserved. # Author: Yoann Vandoorselaere from __future__ import absolute_import, division, print_function, unicode_literals import pkg_resources from enum import IntEnum from prewikka import error, hookmanager, localization, log, response, template, theme, usergroup, view ReloadEnum = IntEnum("ReloadEnum", "none view window") class UserSettings(view.View): plugin_htdocs = (("usermanagement", pkg_resources.resource_filename(__name__, 'htdocs')),) @view.route("/settings/my_account", menu=(N_("Preferences"), N_("My account")), help="#myaccount") def display(self): self._object = env.request.user if not env.auth.has_user(self._object): raise error.PrewikkaUserError(N_("Invalid User"), N_("Requested user '%s' does not exist", self._object)) dataset = {} dataset["object"] = self._object dataset["fullname"] = self._object.get_property("fullname") dataset["email"] = self._object.get_property("email") dataset["available_timezones"] = localization.get_timezones() dataset["timezone"] = self._object.get_property("timezone", default=env.config.general.default_timezone) dataset["available_languages"] = localization.get_languages() dataset["language"] = self._object.get_property("language", default=env.config.general.default_locale) dataset["available_themes"] = theme.get_themes() dataset["selected_theme"] = self._object.get_property("theme", default=env.config.general.default_theme) return template.PrewikkaTemplate(__name__, 'templates/usersettings.mak').render(**dataset) @view.route("/settings/my_account", methods=["POST"]) def modify(self): self._object = user = usergroup.User(env.request.parameters.get("name", env.request.user.name)) if not env.request.parameters["language"] in localization.get_languages(): raise error.PrewikkaUserError(N_("Invalid Language"), N_("Specified language does not exist"), log_priority=log.WARNING) list(hookmanager.trigger("HOOK_USERMANAGEMENT_USER_MODIFY", user)) if not env.request.parameters["timezone"] in localization.get_timezones(): raise error.PrewikkaUserError(N_("Invalid Timezone"), N_("Specified timezone does not exist"), log_priority=log.WARNING) reload_type = ReloadEnum["none"] for param, reload in (("fullname", "none"), ("email", "none"), ("timezone", "view"), ("theme", "window"), ("language", "window")): value = env.request.parameters.get(param) if value != user.get_property(param): if value: user.set_property(param, value) else: user.del_property(param) reload_type = max(reload_type, ReloadEnum[reload]) if user == env.request.user: user.set_locale() user.sync_properties() # Make sure nothing is returned (reset the default dataset) env.request.dataset = None if reload_type > ReloadEnum["none"]: return response.PrewikkaResponse({"type": "reload", "target": reload_type.name}) return response.PrewikkaRedirectResponse(url_for(".display"), 303) prewikka-5.1.1/prewikka/views/__init__.py0000664000175000017500000000000013555143652022021 0ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/web/0000775000175000017500000000000013555143705017341 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/web/__init__.py0000664000175000017500000000000013555143652021441 0ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka/web/request.py0000664000175000017500000001142313555143652021405 0ustar tandrejatandreja00000000000000# Copyright (C) 2004-2019 CS-SI. All Rights Reserved. # Author: Nicolas Delon # Author: Yoann Vandoorselaere # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from __future__ import absolute_import, division, print_function import abc import cgi import sys from prewikka import error if sys.version_info >= (3, 0): from http import cookies else: import Cookie as cookies class BufferedWriter(object): def __init__(self, wcb, buffersize=8192): self._wcb = wcb self._dlist = [] self._len = 0 self._buffersize = buffersize def flush(self): self._wcb(b''.join(self._dlist)) self._dlist = [] self._len = 0 def write(self, data): self._dlist.append(data) self._len += len(data) if self._len >= self._buffersize: self.flush() class Request(object): def __init__(self, path): self.path = path self.is_xhr = False self.is_stream = False self.body = None self.arguments = {} self._buffer = None self._output_cookie = None self.path_elements = path.strip('/').split("/") cookie = cookies.SimpleCookie(self.get_cookie()) self.input_cookie = dict(cookie.items()) def _handle_multipart(self, **kwargs): arguments = [] fs = cgi.FieldStorage(**kwargs) for key in fs.keys(): value = fs[key] for i, f in enumerate(value if isinstance(value, list) else [value]): arguments.append((key, f if f.filename else f.value)) return arguments def add_cookie(self, param, value, expires=None, path="/", httponly=False): if not self._output_cookie: self._output_cookie = cookies.SimpleCookie() if sys.version_info < (3, 0): param = param.encode("ascii") value = value.encode("utf8") self._output_cookie[param] = value if expires: self._output_cookie[param]["expires"] = expires if path: self._output_cookie[param]["path"] = path if httponly: self._output_cookie[param]["httpOnly"] = httponly def delete_cookie(self, param): self.add_cookie(param, "deleted", 0) def send_stream(self, data, event=None, evid=None, retry=None, sync=False): if self._buffer is None: self.is_stream = True self._buffer = BufferedWriter(self.write) self.write = self._buffer.write self.send_headers([("Content-Type", "text/event-stream")]) if retry: self._buffer.write(b"retry: %d\n" % retry) # Join is used in place of concatenation / formatting, because we # prefer performance over readability in this place if event: self._buffer.write(b"".join([b"event: ", event.encode("utf8"), b"\n"])) if data: self._buffer.write(b"".join([b"data: ", data.encode("utf8"), b"\n\n"])) if sync: self._buffer.flush() def send_response(self, response): """Send a PrewikkaResponse response.""" if self.is_stream: if isinstance(response.data, error.PrewikkaError): self.send_stream(response.content(), event="error") return self._buffer.flush() try: response.write(self) except Exception as err: if self.headers_sent: raise # No way we can do it again error.make(err).respond().write(self) @abc.abstractmethod def headers_sent(self): pass @abc.abstractmethod def send_headers(self, headers=[], code=200, status_text=None): pass @abc.abstractmethod def get_baseurl(self): pass @abc.abstractmethod def get_raw_uri(self, include_qs=False): pass @abc.abstractmethod def get_remote_addr(self): pass @abc.abstractmethod def get_remote_port(self): pass @abc.abstractmethod def get_cookie(self): pass @abc.abstractmethod def write(self, data): pass prewikka-5.1.1/prewikka/web/wsgi.py0000664000175000017500000001345513555143652020675 0ustar tandrejatandreja00000000000000# Copyright (C) 2015-2019 CS-SI. All Rights Reserved. # Author: Yoann Vandoorselaere # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from __future__ import absolute_import, division, print_function import sys import werkzeug.wsgi import wsgiref.headers import wsgiref.util from prewikka import main, utils from prewikka.web import request from prewikka.compat.jquery_unparam import jquery_unparam if sys.version_info >= (3, 0): Py3 = True else: Py3 = False defined_status = { 200: 'Ok', 302: 'Found', 303: 'See Other', 304: 'Not Modified', 400: 'Bad Request', 401: 'Unauthorized', 403: 'Forbidden', 404: 'Not Found', 405: 'Method Not Allowed', 500: 'Internal Server Error', } class WSGIRequest(request.Request): def _wsgi_get_bytes(self, key, default=None): value = self._environ.get(key, default) # Under Python 3, non-ASCII values in the WSGI environ are arbitrarily # decoded with ISO-8859-1. This is wrong for Prewikka where UTF-8 is the # default. Re-encode to recover the original bytestring. if value is not None: return value.encode("ISO-8859-1") if Py3 else value def _wsgi_get_unicode(self, key, default=None): value = self._wsgi_get_bytes(key, default) if value is not None: return value.decode("utf8") def _wsgi_get_str(self, key, default=None): value = self._wsgi_get_bytes(key, default) if value is not None: return value.decode("utf8") if Py3 else value def __init__(self, environ, start_response): self._write = None self._environ = environ self._headers = None self._start_response = start_response self.method = environ['REQUEST_METHOD'] request.Request.__init__(self, self._wsgi_get_unicode("PATH_INFO")) self.arguments = jquery_unparam(self._wsgi_get_str("QUERY_STRING")) if self.method in ('POST', 'PUT', 'PATCH'): multipart = environ.get('CONTENT_TYPE', "").startswith('multipart/form-data') if multipart: arg = self._handle_multipart(fp=environ['wsgi.input'], environ=environ) else: arg = environ['wsgi.input'].read(int(environ['CONTENT_LENGTH'])) self.body = arg = arg.decode("utf8") if Py3 else arg self.arguments.update(jquery_unparam(arg, multipart=multipart)) if self._environ.get("HTTP_X_REQUESTED_WITH", "") == "XMLHttpRequest": self.is_xhr = True # Force request type when client wait explicitly for "text/event-stream" if self._environ.get("HTTP_ACCEPT", "text/html") == "text/event-stream": self.is_stream = True def get_target_origin(self): return "%s://%s" % (self._environ.get("wsgi.url_scheme"), werkzeug.wsgi.get_host(self._environ)) def get_origin(self): ret = self._wsgi_get_unicode("HTTP_ORIGIN") if ret: return ret ret = self._wsgi_get_unicode("HTTP_REFERER") if not ret: return None scheme, netloc, path, query, frag = utils.url.urlsplit(ret) return "%s://%s" % (scheme, netloc) def write(self, data): self._write(data) @property def headers_sent(self): return bool(self._write) def send_headers(self, headers=[], code=200, status_text=None): headers = list(headers) + [("X-responseURL", utils.iri2uri(self.get_uri()))] if sys.version_info[0] < 3: headers = [(k.encode("ISO-8859-1"), v.encode("ISO-8859-1")) for k, v in headers] if self._output_cookie: headers += [("Set-Cookie", c.OutputString()) for c in self._output_cookie.values()] if not status_text: status_text = defined_status.get(code, "Unknown") self._write = self._start_response("%d %s" % (code, status_text.encode("ISO-8859-1")), headers) def get_cookie(self): return self._wsgi_get_str('HTTP_COOKIE', '') def get_remote_addr(self): return self._wsgi_get_unicode('REMOTE_ADDR') def get_remote_port(self): return int(self._environ.get('REMOTE_PORT', 0)) def get_query_string(self): return self._wsgi_get_unicode('QUERY_STRING') def get_script_name(self): return self._wsgi_get_unicode("SCRIPT_NAME") def get_baseurl(self): return (env.config.general.reverse_path or self.get_script_name()) + "/" def get_uri(self): return self.get_script_name() + self.path def get_raw_uri(self, include_qs=False): return wsgiref.util.request_uri(self._environ, include_query=include_qs) @property def headers(self): if self._headers is not None: return self._headers self._headers = {} for key, value in self._environ.items(): if key.find("HTTP_") == -1: continue self._headers[key[5:].replace("_", "-").lower()] = value return self._headers def application(environ, start_response): core = main.Core.from_config(environ.get("PREWIKKA_CONFIG", None)) core.process(WSGIRequest(environ, start_response)) return [] prewikka-5.1.1/prewikka/__init__.py0000664000175000017500000000507513555143652020705 0ustar tandrejatandreja00000000000000from __future__ import absolute_import, division, print_function, unicode_literals import errno import os import stat import sys import prelude import preludedb if sys.version_info >= (3, 0): import builtins builtins.text_type = str else: import __builtin__ as builtins builtins.text_type = unicode prelude.python2_return_unicode(True) preludedb.python2_return_unicode(True) try: from threading import local except ImportError: from dummy_threading import local # Set default umask and create temporary directory os.umask(0o027) from prewikka import mainmenu, siteconfig, utils, view try: os.mkdir(siteconfig.tmp_dir, 0o700) except OSError as e: if e.errno != errno.EEXIST: raise if not os.access(siteconfig.tmp_dir, os.R_OK | os.W_OK | os.X_OK): raise Exception("Prewikka temporary directory '%s' lack u+rwx permissions" % siteconfig.tmp_dir) if stat.S_IMODE(os.stat(siteconfig.tmp_dir).st_mode) & stat.S_IRWXO: raise Exception("Prewikka temporary directory '%s' is world accessible" % siteconfig.tmp_dir) class _cache(object): pass class Request(local): def _init(self, request): self.web = request self.user = None self.view = None self.has_menu = False self.dataset = None self.parameters = None self.cache = _cache() self.view_kwargs = {} self._cleanup_list = [] def register_cleanup(self, callable): self._cleanup_list.append(callable) def cleanup(self): for i in self._cleanup_list: i() @utils.request_memoize_property("menu") def menu(self): self.has_menu = True return mainmenu.TimePeriod(self.menu_parameters) @utils.request_memoize_property("menu_parameters") def menu_parameters(self): return view.GeneralParameters(self.view, self.web.arguments) def init(self, request): self._init(request) def __init__(self): local.__init__(self) self._init(None) class FakeRequest(Request): def _init(self, request): Request._init(self, request) self.parameters = view.Parameters(None) self._menu_parameters = FakeParameters(None) @property def menu_parameters(self): return self._menu_parameters class FakeParameters(view.Parameters): def register(self): mainmenu._register_parameters(self) class Env(object): htdocs_mapping = {} request = Request() env = Env() builtins.env = env # import after env creation from . import localization # noqa: imported but unused prewikka-5.1.1/prewikka/baseview.py0000664000175000017500000001650713555143652020755 0ustar tandrejatandreja00000000000000# Copyright (C) 2004-2019 CS-SI. All Rights Reserved. # Author: Yoann Vandoorselaere # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from __future__ import absolute_import, division, print_function, unicode_literals import base64 import collections import string from prewikka import error, history, hookmanager, mainmenu, resource, response, template, utils, view CSS_FILES = ( "prewikka/css/jquery-ui.min.css", "prewikka/css/bootstrap.min.css", "prewikka/css/select2.min.css", "prewikka/css/select2-bootstrap.min.css", "prewikka/css/jquery-ui-timepicker-addon.min.css", "prewikka/css/font-awesome.min.css", "prewikka/css/ui.jqgrid.min.css", "prewikka/css/ui.multiselect.min.css" ) JS_FILES = ( "prewikka/js/json.js", "prewikka/js/jquery.js", "prewikka/js/jquery-ui.min.js", "prewikka/js/bootstrap.min.js", "prewikka/js/select2.full.min.js", "prewikka/js/functions.js", "prewikka/js/ajax.js", "prewikka/js/underscore-min.js", "prewikka/js/jquery-ui-timepicker-addon.min.js", "prewikka/js/ui.multiselect.js", "prewikka/js/jquery.jqgrid.min.js", "prewikka/js/commonlisting.js" ) _BASEVIEW_TEMPLATE = template.PrewikkaTemplate(__name__, 'templates/baseview.mak') class BaseView(view._View): view_endpoint = "baseview.render" view_layout = None @view.route("//ajax_parameters_update", methods=["PUT", "PATCH"]) def ajax_parameters_update(self, path): viewobj, vkw = env.viewmanager.get_view_by_path(path) viewobj.process_parameters() if viewobj.view_menu: view.GeneralParameters(viewobj, env.request.web.arguments) return response.PrewikkaResponse(code=204) @view.route("/download//") @view.route("/download///inline", defaults={"inline": True}) @view.route("/download///") @view.route("/download////inline", defaults={"inline": True}) def download(self, user=None, id=None, filename=None, inline=False): if user and user != env.request.user.name: raise error.PrewikkaUserError(_("Permission Denied"), message=_("Missing permission to access the specified file"), code=403) fd = open(utils.mkdownload.get_filename(id, filename, user), "rb") filename = base64.urlsafe_b64decode(filename.encode("utf8")).decode("utf8") return response.PrewikkaDownloadResponse(fd, filename=filename, inline=inline) @view.route("/mainmenu") @view.route("/mainmenu/") def mainmenu(self, datatype=None): kwargs = {} if datatype: kwargs["criteria_type"] = datatype return response.PrewikkaResponse({"type": "content", "target": "#main_menu_ng", "content": mainmenu.HTMLMainMenu(**kwargs)}) @staticmethod def _get_help_language(lang, default=None): for i in ("en", "fr"): if i in lang.lower(): return i return default @staticmethod def _get_server(): url = utils.url.urlparse(env.config.general.get("help_location")) if not url.netloc and not url.scheme and not url.path.startswith('/'): # relative url return '/' + url.geturl() return url.geturl() @view.route("/help/") def help(self, path=None): server = string.Template(self._get_server()) lang = None if env.request.user: userl = env.request.user.get_property("language") if userl: lang = self._get_help_language(userl) if not lang: lang = self._get_help_language(env.config.general.default_locale, "en") return response.PrewikkaRedirectResponse(server.safe_substitute(lang=lang, path=path)) @view.route("/logout") def logout(self): try: env.session.logout(env.request.web) except: # logout always generate an exception to render the logout template pass return response.PrewikkaRedirectResponse(env.request.parameters.get("redirect", env.request.web.get_baseurl())) @view.route("/history/
    /save", methods=["POST"]) def history_save(self, form): if "query" in env.request.parameters: history.save(env.request.user, form, env.request.parameters["query"]) return response.PrewikkaResponse() @view.route("/history//get", methods=["POST"]) def history_get(self, form): queries = history.get(env.request.user, form) return response.PrewikkaResponse(queries) @view.route("/history//delete", methods=["POST"]) def history_delete(self, form): query = env.request.parameters["query"] if "query" in env.request.parameters else None history.delete(env.request.user, form, query) return response.PrewikkaResponse() def _prepare(self, dataset): # FIXME: move theme management to a plugin ! if env.request.user: theme = env.request.user.get_property("theme", default=env.config.general.default_theme) lang = env.request.user.get_property("language", default=env.config.general.default_locale) else: theme = env.config.general.default_theme lang = env.config.general.default_locale _HEAD = collections.OrderedDict((resource.CSSLink(link), True) for link in CSS_FILES) _HEAD[resource.CSSLink("prewikka/css/themes/%s.css" % theme)] = True _HEAD.update((resource.JSLink(link), True) for link in JS_FILES) # The jqgrid locale files use only two characters for identifying the language (e.g. pt_BR -> pt) _HEAD[resource.JSLink("prewikka/js/locales/jqgrid/grid.locale-%s.js" % lang[:2])] = True _HEAD[resource.JSLink("prewikka/js/locales/select2/%s.js" % lang[:2])] = True for contents in filter(None, hookmanager.trigger("HOOK_LOAD_HEAD_CONTENT")): _HEAD.update((i, True) for i in contents) _BODY = collections.OrderedDict() for contents in filter(None, hookmanager.trigger("HOOK_LOAD_BODY_CONTENT")): _BODY.update((i, True) for i in contents) if not dataset: # In case of error, we use the exception dataset dataset = _BASEVIEW_TEMPLATE.dataset() self._setup_dataset_default(dataset) dataset["document"].head_content = _HEAD dataset["document"].body_content = _BODY dataset["document"].lang = lang[:2] dataset["toplayout_extra_content"] = filter(None, hookmanager.trigger("HOOK_TOPLAYOUT_EXTRA_CONTENT")) return dataset.render() def respond(self, dataset=None, code=None): return response.PrewikkaResponse(self._prepare(dataset), code=code) prewikka-5.1.1/prewikka/cli.py0000664000175000017500000000410313555143652017704 0ustar tandrejatandreja00000000000000# Copyright (C) 2019 CS-SI. All Rights Reserved. # Author: Antoine Luong # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from __future__ import absolute_import, division, print_function, unicode_literals from prewikka import registrar, usergroup class CLIManager(object): def __init__(self): self._commands = {} def _register(self, command, category, method, permissions, help): d = self._commands.setdefault(command, {}) if category not in d: # Avoid replacing methods by the ones from children classes d[category] = (method, permissions, help) def register(self, command, category, method=None, permissions=[], help=None): usergroup.ALL_PERMISSIONS.declare(permissions) if method: self._register(command, category, method, permissions, help) else: return registrar.DelayedRegistrar.make_decorator("cli", self._register, command, category, permissions=permissions, help=help) def unregister(self, command=None, category=None): if command and category: self._commands[command].pop(category) elif command: self._commands.pop(command) else: self._commands = {} def get(self, command): return self._commands.get(command, {}) cli = CLIManager() get = cli.get register = cli.register unregister = cli.unregister prewikka-5.1.1/prewikka/config.py0000664000175000017500000002033413555143652020406 0ustar tandrejatandreja00000000000000# Copyright (C) 2016-2019 CS-SI. All Rights Reserved. # Author: Yoann Vandoorselaere # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from __future__ import absolute_import, division, print_function, unicode_literals import collections import io import glob import os import re from prewikka import error, siteconfig _sentinel = object() class ConfigError(error.PrewikkaUserError): def __init__(self, message): error.PrewikkaUserError.__init__(self, N_("Configuration error"), message) class ConfigParseError(ConfigError): def __init__(self, filename, lineno, line): ConfigError.__init__(self, N_("Parse error in \"%(txt)s\" at %(file)s line %(line)d", {'txt': line.rstrip(), 'file': filename, 'line': lineno})) class ConfigValueError(ConfigError): def __init__(self, value, key): ConfigError.__init__(self, N_("Invalid value '%(value)s' for parameter '%(name)s'", {'value': value, 'name': key})) class ConfigMissingError(ConfigError, AttributeError): def __init__(self, key): ConfigError.__init__(self, N_("Missing value for parameter '%(name)s'", {'name': key})) class ConfigSection(collections.Mapping): def __init__(self, name): object.__setattr__(self, "_instance_name", name) object.__setattr__(self, "_od", collections.OrderedDict()) def __repr__(self): return "ConfigSection<%s,%s>" % (self._instance_name, self._od.items()) def __len__(self): return self._od.__len__() def __setitem__(self, key, value): return self._od.__setitem__(key, value) def __getitem__(self, key): return self._od.__getitem__(key) def __setattr__(self, key, value): self._od[key] = value def __getattr__(self, key): ret = self._od.get(key, None) if ret is None: raise ConfigMissingError(key) return ret def __contains__(self, key): return self._od.__contains__(key) def __iter__(self): return self._od.__iter__() def get_instance_name(self): return self._instance_name def get(self, name, default=None): return self._od.get(name, default) def get_int(self, name, default=0): assert isinstance(default, int) value = self.get(name) if value is None: return default try: return int(value) except (TypeError, ValueError): raise ConfigValueError(value, name) def get_float(self, name, default=0.): assert isinstance(default, float) value = self.get(name) if value is None: return default try: return float(value) except (TypeError, ValueError): raise ConfigValueError(value, name) def get_bool(self, name, default=False): assert isinstance(default, bool) value = self.get(name, _sentinel) if value is _sentinel: return default if value is None or value.lower() in ['true', 'yes']: return True elif value.lower() in ['false', 'no']: return False raise ConfigValueError(value, name) def get_size(self, name, default=0): assert isinstance(default, int) value = self.get(name) if value is None: return default match = re.match(r'(\d+(?:\.\d+)?)([kMGT]?)B', value) if not match: raise ConfigValueError(value, name) prefixes = ["", "k", "M", "G", "T"] return int(float(match.group(1)) * 1024 ** prefixes.index(match.group(2))) def keys(self): return self._od.keys() def items(self): return self._od.items() def values(self): return self._od.values() def setdefault(self, key, default): return self._od.setdefault(key, default) class SectionRoot(list): def __contains__(self, key): return self and self[0].__contains__(key) def __getitem__(self, key): if isinstance(key, int): return list.__getitem__(self, key) else: return self[0][key] def __getattr__(self, attr): if not self: self.append(ConfigSection("")) return getattr(self[0], attr) def get_instance_by_name(self, name): for section in self: if section.get_instance_name() == name: return section return None class MyConfigParser(object): """ A config parser class ala ConfigParser.ConfigParser (only read operations are (will be) supported). ConfigParser.ConfigParser did not feed all our needs: - we need the '= value' part of option to be optional - we need to support special characters (like ':') in option name (for urls) - we need to keep the right order of options in sections (this is done via the OrderedDict class that subclass dict) """ EMPTY_LINE_REGEXP = re.compile("^\s*(\#.*)?$") SECTION_REGEXP = re.compile("^\s*\[\s*(?P[^\s]+)\s*(?P.+)?]\s*$") OPTION_REGEXP = re.compile("^\s*(?P[^:=]+)([:=]\s*(?P.+))?$") def __init__(self): self._sections = collections.OrderedDict() def _create_section(self, name, instance): if instance: instance = instance.strip() if name not in self._sections: self._sections[name] = SectionRoot() for section in self._sections[name]: if section.get_instance_name() == instance: return section self._sections[name].append(ConfigSection(instance)) return self._sections[name][-1] def read_string(self, string): """Read and parse a string.""" self._read(string.splitlines()) def readfp(self, fp): """Like read() but the argument must be a file-like object.""" self._read(fp.readlines()) def read(self, filename): """Read and parse a filename.""" with io.open(filename, 'r', encoding="utf8") as f: self.readfp(f) def _read(self, iterable): cursection = None for lineno, line in enumerate(iterable): result = self.EMPTY_LINE_REGEXP.match(line) if result: continue result = self.SECTION_REGEXP.match(line) if result: cursection = self._create_section(*result.group("name", "instance")) continue result = self.OPTION_REGEXP.match(line) if not result: raise ConfigParseError(file.name, lineno + 1, line) if cursection is None: continue name, value = result.group("name").strip(), result.group("value") cursection[name] = value.strip() if value else None def get(self, name, default): return self._sections.get(name, default) def __getattr__(self, key): return self._sections.setdefault(key, SectionRoot()) def __len__(self): return len(self._sections) class Config(MyConfigParser): def __init__(self, filename=None): MyConfigParser.__init__(self) conf_filename = filename or siteconfig.conf_dir + "/prewikka.conf" self.read(conf_filename) self.basedir = os.path.dirname(conf_filename) for fpattern in self.include.keys(): if not os.path.isabs(fpattern): fpattern = os.path.join(self.basedir, fpattern) # Files are loaded in alphabetical order for fname in sorted(glob.glob(fpattern)): self.read(fname) prewikka-5.1.1/prewikka/crontab.py0000664000175000017500000002644213555143652020577 0ustar tandrejatandreja00000000000000# Copyright (C) 2017-2019 CS-SI. All Rights Reserved. # Author: Yoann Vandoorselaere # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from __future__ import absolute_import, division, print_function, unicode_literals import collections import croniter import datetime import gevent from prewikka.compat.gevent import fix_ssl from prewikka.utils import timeutil from prewikka import database, error, hookmanager, log, registrar, usergroup, utils fix_ssl() logger = log.get_logger(__name__) DEFAULT_SCHEDULE = collections.OrderedDict((("0 * * * *", N_("Hourly")), ("0 0 * * *", N_("Daily")), ("0 0 * * 1", N_("Weekly")), ("0 0 1 * *", N_("Monthly")), ("0 0 1 1 *", N_("Yearly")), ("custom", N_("Custom")), ("disabled", N_("Disabled")))) _SCHEDULE_PARAMS = dict((("0 * * * *", "hour"), ("0 0 * * *", "day"), ("0 0 * * 1", "week"), ("0 0 1 * *", "month"), ("0 0 1 1 *", "year"))) class CronJob(object): def __hash__(self): return self.id def __eq__(self, other): return self.id == other.id def __init__(self, id, name, schedule, func, base, runcnt, ext_type=None, ext_id=None, user=None, error=None, enabled=True): self.id = id self.name = name self.user = user self.schedule = schedule self.callback = func self.error = error self.ext_type = ext_type self.ext_id = ext_id self.enabled = enabled self.base = base self.runcnt = runcnt self._running = False self.set_schedule(schedule) def set_schedule(self, schedule): # Interpret the cronjob configuration as local time self._cron = croniter.croniter(schedule, datetime.datetime.now(utils.timeutil.tzlocal())) # If the job was not executed at the previous scheduled time, # make sure to schedule it back self._cron.get_next() if self.base and self._cron.get_prev(datetime.datetime).replace(microsecond=0) <= self.base: # replace() needed for croniter < 0.3.8 self._cron.get_next() self.next_schedule = self._cron.get_current(datetime.datetime) def update(self, job): # Update the current job data (following a modified schedule or a plugin reinitialization) self.callback = job.callback if job.schedule != self.schedule: self.set_schedule(job.schedule) def _run(self): self._running = True # setup the environment env.request.init(None) env.request.user = self.user if self.user: self.user.set_locale() err = None try: if self.callback: self.callback(self) else: raise self.error except Exception as err: logger.exception("[%d/%s]: cronjob failed: %s", self.id, self.name, err) err = utils.json.dumps(error.PrewikkaError(err, N_("Scheduled job execution failed"))) self.runcnt += 1 self._running = False self.base = timeutil.utcnow() self.next_schedule = self._cron.get_next(datetime.datetime) env.db.query("UPDATE Prewikka_Crontab SET base=%s, runcnt=runcnt+1, error=%s WHERE id=%d", self.base, err, self.id) def run(self, now): if now < self.next_schedule or self._running: return env.log.info("[%d/%s]: RUNNING JOB schedule=%s callback=%s" % (self.id, self.name, self.schedule, self.callback)) gevent.spawn(self._run) class Crontab(object): _REFRESH = datetime.timedelta(minutes=1) def _reinit(self): self._plugin_callback = {} def __init__(self): self._reinit() self._joblist = set() hookmanager.register("HOOK_PLUGINS_RELOAD", self._reinit) hookmanager.register("HOOK_USER_DELETE", lambda user: self.delete(user=user)) def _make_job(self, res): err = func = None id, name, userid, schedule, ext_type, ext_id, base, runcnt, enabled, error_s = res func = self._plugin_callback.get(ext_type) if not func: err = error.PrewikkaUserError(N_("Invalid job extension"), N_("Scheduled job with invalid extension type '%s'") % (ext_type)) if error_s and not(err): err = utils.json.loads(error_s) if ext_id: ext_id = int(ext_id) if base: base = env.db.parse_datetime(base) user = None if userid: user = usergroup.User(userid=userid) return CronJob(int(id), name, schedule, func, base, int(runcnt), ext_type=ext_type, ext_id=ext_id, user=user, error=err, enabled=bool(int(enabled))) @database.use_lock("Prewikka_Crontab") def _init_system_job(self, ext_type, name, schedule, enabled, method): self._plugin_callback[ext_type] = method res = env.db.query("SELECT 1 FROM Prewikka_Crontab WHERE ext_type=%s AND userid IS NULL", ext_type) if not res: self.add(name, schedule, ext_type=ext_type, enabled=enabled) def _update_joblist(self): # Update jobs instead of re-creating them because some of them may be currently running mainlist = set(self.list(enabled=True)) # Suppress jobs that were removed from the main list self._joblist -= self._joblist.difference(mainlist) # Add jobs that were added to the main list self._joblist |= mainlist.difference(self._joblist) # Take schedule changes into account for job in self._joblist: for j in mainlist: if j == job: job.update(j) break return self._joblist def _run_jobs(self): first = now = timeutil.utcnow() for job in self._update_joblist(): job.run(now) now = timeutil.utcnow() return (self._REFRESH - (now - first)).total_seconds() def run(self, core): while True: next = self._run_jobs() if next > 0: gevent.sleep(next) core.reload_plugin_if_needed() def list(self, **kwargs): qs = env.db.kwargs2query(kwargs, prefix=" WHERE ") for res in env.db.query("SELECT id, name, userid, schedule, ext_type, ext_id, base, runcnt, enabled, error FROM Prewikka_Crontab%s" % qs): yield self._make_job(res) def get(self, id): res = env.db.query("SELECT id, name, userid, schedule, ext_type, ext_id, base, runcnt, enabled, error FROM Prewikka_Crontab WHERE id=%d", id) if not res: raise error.PrewikkaError(N_('Invalid CronJob'), N_('CronJob with id=%d cannot be found in database', id)) return self._make_job(res[0]) def delete(self, **kwargs): user = kwargs.pop("user", None) if user: kwargs["userid"] = getattr(user, "id", user) # Can be None / NotNone qs = env.db.kwargs2query(kwargs, " WHERE ") env.db.query("DELETE FROM Prewikka_Crontab%s" % qs) def update(self, id, **kwargs): accept = { "user": lambda x: ("userid", getattr(x, "id", None)) } cols = [] data = [] for field, value in kwargs.items(): dec = accept.get(field) if dec: field, value = dec(value) if id: data.append("%s = %s" % (field, env.db.escape(value))) else: cols.append(field) data.append(value) if not id: env.db.query("INSERT INTO Prewikka_Crontab (%s) VALUES %%s" % (", ".join(cols + ["base"])), data + [timeutil.utcnow()]) return env.db.get_last_insert_ident() else: env.db.query("UPDATE Prewikka_Crontab SET %s WHERE id IN %%s" % (", ".join(data)), env.db._mklist(id)) return id # FIXME: there is an issue with upsert() when using PostgreSQL CTE (serial problem + cast problem) # id = int(env.db.upsert("Prewikka_Crontab", cols, [data], pkey=("id",), returning=["id"])[0]) # return id def add(self, name, schedule, user=None, ext_type=None, ext_id=None, enabled=True): return self.update(None, name=name, schedule=schedule, user=user, ext_type=ext_type, ext_id=ext_id, enabled=enabled) def update_from_parameters(self, id, parameters=None, delete_disabled=False, **kwargs): if parameters is None: parameters = env.request.parameters schedule = parameters.get("quick-schedule") if schedule != "disabled": kwargs["schedule"] = schedule try: croniter.croniter(schedule) except Exception: raise error.PrewikkaUserError(N_("Invalid schedule"), N_("The specified job schedule is invalid")) elif delete_disabled: return crontab.delete(id=id, **kwargs) crontab.update(id, name=parameters["name"], enabled=int(schedule != "disabled"), **kwargs) def schedule(self, ext_type, name, schedule, _regfunc=None, enabled=True): if _regfunc: self._init_system_job(ext_type, name, schedule, enabled, _regfunc) else: return registrar.DelayedRegistrar.make_decorator("crontab", self.schedule, ext_type, name, schedule, enabled=enabled) def setup(self, ext_type, _regfunc=None): if _regfunc: assert not(ext_type in self._plugin_callback) self._plugin_callback[ext_type] = _regfunc else: return registrar.DelayedRegistrar.make_decorator("crontab", self.setup, ext_type) def format_schedule(x): val = DEFAULT_SCHEDULE.get(x) if val: return _(val) else: return _("Custom (%s)") % x def schedule_to_menuparams(x): params = {} val = _SCHEDULE_PARAMS.get(x) if val: params["timeline_mode"] = "relative" params["timeline_value"] = 1 params["timeline_unit"] = val else: now = timeutil.now() params["timeline_mode"] = "custom" params["timeline_start"] = timeutil.get_timestamp_from_datetime(croniter.croniter(x, now).get_prev(datetime.datetime)) params["timeline_end"] = timeutil.get_timestamp_from_datetime(now) return params crontab = Crontab() list = crontab.list run = crontab.run get = crontab.get add = crontab.add update = crontab.update delete = crontab.delete schedule = crontab.schedule setup = crontab.setup update_from_parameters = crontab.update_from_parameters prewikka-5.1.1/prewikka/csrf.py0000664000175000017500000001156413555143652020103 0ustar tandrejatandreja00000000000000# Copyright (C) 2018-2019 CS-SI. All Rights Reserved. # Author: Yoann Vandoorselaere # # The following code is derived from Django CSRF middleware. # # Copyright (c) Django Software Foundation and individual contributors. # All rights reserved. # # Redistribution and use in source and binary forms, with or without modification, # are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # 3. Neither the name of Django nor the names of its contributors may be used # to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON # ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import operator import string from prewikka import hookmanager from prewikka.utils import crypto CSRF_SECRET_LENGTH = 32 CSRF_TOKEN_LENGTH = 2 * CSRF_SECRET_LENGTH CSRF_ALLOWED_CHARS = string.ascii_letters + string.digits CSRF_POST_KEY = "_csrftoken" def _hash_token(token, salt, op): chars = CSRF_ALLOWED_CHARS pairs = zip((chars.index(x) for x in token), (chars.index(x) for x in salt)) cipher = ''.join(chars[op(x, y) % len(chars)] for x, y in pairs) return cipher def _salt_cipher_secret(secret): """ Given a secret (assumed to be a string of CSRF_ALLOWED_CHARS), generate a token by adding a salt and using it to encrypt the secret. """ salt = _get_new_csrf_string() return salt + _hash_token(secret, salt, operator.add) def _unsalt_cipher_token(token): """ Given a token (assumed to be a string of CSRF_ALLOWED_CHARS, of length CSRF_TOKEN_LENGTH, and that its first half is a salt), use it to decrypt the second half to produce the original secret. """ salt, token = token[:CSRF_SECRET_LENGTH], token[CSRF_SECRET_LENGTH:] return _hash_token(token, salt, operator.sub) def _get_new_csrf_string(): return crypto.get_random_string(CSRF_SECRET_LENGTH, allowed_chars=CSRF_ALLOWED_CHARS) def _get_new_csrf_token(): return _salt_cipher_secret(_get_new_csrf_string()) def get_token(request): """ Return the CSRF token required for a POST form. The token is an alphanumeric value. A new token is created if one is not already set. """ csrf_cookie = request.input_cookie.get('CSRF_COOKIE') if csrf_cookie: request._csrf_cookie = csrf_cookie.value csrf_secret = _unsalt_cipher_token(request._csrf_cookie) else: request._csrf_cookie = None csrf_secret = _get_new_csrf_string() return _salt_cipher_secret(csrf_secret) def _compare_salted_tokens(request_csrf_token, csrf_token): return crypto.constant_time_compare(_unsalt_cipher_token(request_csrf_token), _unsalt_cipher_token(csrf_token)) def process(request): # Update the cookie token on each request, previous token issued with the same # CSRF string will still match. request.add_cookie("CSRF_COOKIE", get_token(request)) if request.method in ('GET', 'HEAD', 'OPTIONS', 'TRACE'): return if request.get_origin() != request.get_target_origin(): raise Exception("Origin check failed") if request._csrf_cookie is None: raise Exception("CSRF cookie not set") # Check non-cookie token for match. request_csrf_token = request.arguments.get(CSRF_POST_KEY) if not request_csrf_token: # Fall back to X-CSRFToken, to make things easier for AJAX, # and possible for PUT/DELETE. request_csrf_token = request.headers.get("x-csrftoken", '') if not request_csrf_token: raise Exception("CSRF token has not been provided") if not _compare_salted_tokens(request_csrf_token, request._csrf_cookie): raise Exception("CSRF token is invalid") def _rotate_token(user): env.request.web.add_cookie("CSRF_COOKIE", _get_new_csrf_token()) hookmanager.register("HOOK_SESSION_CREATE", _rotate_token) prewikka-5.1.1/prewikka/database.py0000664000175000017500000007621513555143652020716 0ustar tandrejatandreja00000000000000# Copyright (C) 2004-2019 CS-SI. All Rights Reserved. # Author: Yoann Vandoorselaere # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from __future__ import absolute_import, division, print_function, unicode_literals import abc import collections import fcntl import functools import operator import pkgutil import re import time from datetime import datetime import pkg_resources import preludedb from prewikka import compat, error, log, utils, version from prewikka.utils import cache NotNone = object ModuleInfo = collections.namedtuple("ModuleInfo", ["branch", "version", "enabled"]) class DatabaseError(error.PrewikkaUserError): name = N_("Database error") def __init__(self, message, **kwargs): error.PrewikkaUserError.__init__(self, message=message, **kwargs) class DatabaseSchemaError(DatabaseError): name = N_("Database schema error") # Internal workaround since SWIG generated exception use class RuntimeError def _fix_exception(func): def inner(self, *args, **kwargs): try: ret = func(self, *args, **kwargs) except RuntimeError as e: raise DatabaseError(message=text_type(e)) return ret return inner def _use_flock(func): def inner(self, *args, **kwargs): fd = open(__file__, 'r') fcntl.flock(fd, fcntl.LOCK_EX) try: ret = func(self, *args, **kwargs) finally: fcntl.flock(fd, fcntl.LOCK_UN) return ret return inner def use_transaction(func): @functools.wraps(func) def inner(self, *args, **kwargs): db = getattr(self, "__db", env.db) if db._transaction_state: return func(self, *args, **kwargs) db.transaction_start() try: ret = func(self, *args, **kwargs) except: db.transaction_abort() raise db.transaction_end() return ret return inner def use_lock(table): def real_decorator(func): @use_transaction def inner(self, *args, **kwargs): db = getattr(self, "__db", env.db) db._lock_table(table) try: ret = func(self, *args, **kwargs) except: db._unlock_table(table) raise db._unlock_table(table) return ret return inner return real_decorator class SQLScript(object): """This is the main class describing an SQL script (install / update / branch migration) ::type:: Describe the kind of database script : "branch", "update", "install" ::version:: Version the database is going to use after successful insertion of the script ::branch:: Optional name of the branch this script apply to ::from_branch:: Optional, the script only apply if the current (branch, version) is the one specified type = "branch" from_branch=("branch", "version") branch="B" version="target" type = "update" version="target" optional=[branch] type = "install" version="target" optional=[branch] """ __metaclass__ = abc.ABCMeta __all__ = ["type", "branch", "version", "from_branch"] type = "update" branch = None version = None from_branch = None def __init__(self, dbup): self.db = dbup self.query_logs = [] self._module_name = dbup._module_name self._full_module_name = dbup._full_module_name self._query_filter = {"sqlite3": self._mysql2sqlite, "pgsql": self._mysql2pgsql, "mysql": self._mysqlhandler}[self.db.get_type()] if self.type in ("install", "update"): if not self.version: raise Exception("SQL %s script require 'version' attribute" % self.type) elif self.type == "branch": if not all(getattr(self, i) for i in ("from_branch", "branch", "version")): raise Exception("SQL branch script require 'from_branch', 'branch', and 'version' attribute") @staticmethod def _sub(_stbl, input): for i in _stbl: input = re.sub(i[0], i[1], input) return input def _mysql2pgsql(self, input): _stbl = [ ("#.*", ""), (" INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT", " SERIAL PRIMARY KEY"), ("BIGINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT", "BIGSERIAL PRIMARY KEY"), ("BLOB", "BYTEA"), (" TINYINT UNSIGNED ", " INT4 "), (" TINYINT ", " INT2 "), (" SMALLINT UNSIGNED ", " INT8 "), (" SMALLINT ", " INT4 "), (" BIGINT UNSIGNED ", " INT8 "), (" BIGINT ", " INT8 "), (" INT(EGER)? UNSIGNED ", " INT8 "), (" INT(EGER)? ", " INT4 "), ("DATETIME", "TIMESTAMP"), ("ENGINE=InnoDB", ""), ("\"([^\"]*)\"", "'\\1'"), ("\"\([^\"]*\)\"", "'\1'"), ("(\S*) ENUM\((.*)\)", "\\1 TEXT CHECK (\\1 IN (\\2))"), ("VARCHAR[ ]*[^)]+\)", "TEXT"), ("(DROP INDEX [^ ]*) ON [^;]*", "\\1") ] return self._sub(_stbl, input) def _mysql2sqlite(self, input): _stbl = [ ("#.*", ""), ("[a-zA-Z]*INT ", "INTEGER "), ("UNSIGNED ", ""), ("ENUM[ ]*[^)]+\)", "TEXT"), ("VARCHAR[ ]*[^)]+\)", "TEXT"), ("AUTO_INCREMENT", "AUTOINCREMENT"), ("ENGINE=InnoDB", ""), ("ALTER TABLE [^ ]* DROP.*", ""), ("(DROP INDEX [^ ]*) ON [^;]*", "\\1") ] return self._sub(_stbl, input) def _mysqlhandler(self, input): return input def query(self, input): for q in self._query_filter(input).split(";"): q = q.strip() if q: self.query_logs.append(q) self.db.query(q) @abc.abstractmethod def run(self): pass @use_transaction def apply(self): log.get_logger().info("%s: please standby while %s is applied", self._full_module_name, text_type(self)) self.run() if self.type == "install": self.db.upsert( "Prewikka_Module_Registry", ("module", "branch", "version"), ((self._full_module_name, self.branch, self.version),), pkey=("module",) ) elif self.type == "update": self.db.query("UPDATE Prewikka_Module_Registry SET version=%s WHERE module=%s%s" % (self.db.escape(self.version), self.db.escape(self._full_module_name), self.db._chknull("branch", self.branch))) elif self.type == "branch": self.db.query("UPDATE Prewikka_Module_Registry SET branch=%s, version=%s, enabled=1 WHERE module=%s", self.branch, self.version, self._full_module_name) self.db._update_state(self.version, self.branch) def get_version_string(self): if not self.branch: return self.version else: return "%s[%s]" % (self.branch, self.version) def __str__(self): return "%s:%s" % (self.type, self.get_version_string()) def __eq__(self, other): return all(getattr(self, i) == getattr(other, i) for i in self.__all__) class DatabaseHelper(object): def __getattr__(self, x): return self.__dict__.get(x, getattr(env.db, x)) class DatabaseUpdateHelper(DatabaseHelper): def _init_version_attr(self): if self._initialized: return module = env.db.modinfos.get(self._full_module_name, self._default_modinfo) self._from_branch = module.branch self._from_version = module.version self._need_enable = not(module.enabled) self._initialized = True def __init__(self, module_name, reqversion, reqbranch=None, enabled=True): self._reqbranch = reqbranch self._reqversion = reqversion self._module_name = module_name.split(":")[0] self._full_module_name = module_name self._default_modinfo = ModuleInfo(None, None, enabled) self._initialized = False def check(self): self._init_version_attr() if not self._from_version and self._reqversion: raise DatabaseSchemaError(N_("database installation required")) if self._need_enable: raise DatabaseSchemaError(N_("database activation required")) if self._reqbranch and self._from_branch != self._reqbranch: raise DatabaseSchemaError(N_("database schema branch %(required)s required (found %(current)s)", {'required': self._reqbranch, 'current': self._from_branch})) if self._reqversion and self._from_version != self._reqversion: raise DatabaseSchemaError(N_("database schema version %(required)s required (found %(current)s)", {'required': self._get_version_string(self._reqbranch, self._reqversion), 'current': self._get_version_string(self._from_branch, self._from_version)})) def _update_state(self, version, branch): self._from_branch = branch self._from_version = version def _get_update_directories(self): for i in pkg_resources.iter_entry_points("prewikka.updatedb", self._module_name): try: yield i.load().__path__[0] except Exception as e: log.get_logger().exception("[%s]: error loading SQL updates: %s", self._full_module_name, e) def _get_schema_list(self, **kwargs): from_version = to_version = None if "from_version" in kwargs: from_version = pkg_resources.parse_version(kwargs.pop("from_version")) if "to_version" in kwargs: to_version = pkg_resources.parse_version(kwargs.pop("to_version")) dirnames = self._get_update_directories() for importer, package_name, _ in pkgutil.iter_modules(dirnames): try: mod = importer.find_module(package_name).load_module(package_name).SQLUpdate(self) except Exception as e: log.get_logger().exception("[%s]: error loading SQL update '%s' : %s" % (self._full_module_name, package_name, e)) continue if any(kwargs[k] != getattr(mod, k) for k in kwargs.keys()): continue version = pkg_resources.parse_version(mod.version) if (not from_version or (version > from_version)) and (not to_version or (version <= to_version)): yield mod def _resolve_branch_switch(self, curbranch, curversion, outstack=[]): for upd in self._list(from_branch=(curbranch, curversion), type="branch"): if upd.branch == self._reqbranch and pkg_resources.parse_version(upd.version) <= pkg_resources.parse_version(self._reqversion): return outstack + [upd] elif upd in outstack: log.get_logger().warning("cyclic branch dependencies detected: %s", " -> ".join(text_type(i) for i in outstack + [upd])) continue else: ret = self._resolve_branch_switch(upd.branch, upd.version, outstack=outstack[:] + [upd]) if ret: return ret for upd in self._list(from_version=curversion, branch=curbranch, type="update"): ret = self._resolve_branch_switch(upd.branch, upd.version, outstack=outstack[:] + [upd]) if ret: return ret return [] def _list(self, *args, **kwargs): fv = self._get_schema_list(*args, **kwargs) return sorted(fv, key=operator.attrgetter("version")) def _get_install_schema(self): ret = self._list(to_version=self._reqversion, branch=self._reqbranch, type="install") if not ret: raise error.PrewikkaUserError(N_("Database installation error"), N_("No database installation script found for module %(module)s, version %(version)s", {'module': self._full_module_name, 'version': self._get_version_string(self._reqbranch, self._reqversion)})) return ret[-1] def _get_branch_update(self): prev = self._resolve_branch_switch(self._from_branch, self._from_version) if not prev: raise error.PrewikkaUserError( N_("Database migration error"), N_("No database branch migration script found for module %(module)s, branch transition %(current)s -> %(required)s", {'module': self._full_module_name, 'current': self._get_version_string(self._from_branch, self._from_version), 'required': self._get_version_string(self._reqbranch, "<=" + self._reqversion)}) ) return prev @staticmethod def _get_version_string(branch, version): if not branch: return version else: return "%s[%s]" % (branch, version) def list(self): if not self._reqversion: return [] self._init_version_attr() from_version, prev = self._from_version, [] if not from_version: prev = [self._get_install_schema()] elif self._from_branch != self._reqbranch: prev = self._get_branch_update() if prev: from_version = prev[-1].version if from_version == self._reqversion: return prev ret = self._list(from_version=from_version, to_version=self._reqversion, branch=self._reqbranch, type="update") if not(ret) or ret[-1].version != self._reqversion: raise error.PrewikkaUserError( N_("Database migration error"), N_("No linear migration script found for module %(module)s %(version1)s -> %(version2)s", {'module': self._full_module_name, 'version1': self._get_version_string(self._from_branch, self._from_version), 'version2': self._get_version_string(self._reqbranch, self._reqversion)}) ) return prev + ret @use_transaction def _apply(self): [update.apply() for update in self.list()] self.check() @_use_flock def apply(self): # We call _init_version_attr() outside the transaction because it fails # when the tables do not exist (eg. during database initialization) # and we don't want the whole transaction to be rolled back. self._init_version_attr() self._apply() def get_schema_version(self): self._init_version_attr() return self._from_version class DatabaseCommon(object): required_branch = version.__branch__ required_version = "0" NotNone = NotNone __sentinel = object() __TRANSACTION_STATE_NONE = 0 __TRANSACTION_STATE_BEGIN = 1 __TRANSACTION_STATE_QUERY = 2 def _get_prefilter(self, v): if not(isinstance(v, (text_type, bytes))) and isinstance(v, collections.Iterable): return self.__ESCAPE_PREFILTER["iterable"] else: return self.__ESCAPE_PREFILTER.get(type(v)) def _prefilter_iterate(self, l): tmp = [] for v in l: tmp.append(text_type(self.escape(v))) if self._get_prefilter(v) == self._prefilter_iterate: fmt = '%s' else: fmt = '(%s)' return fmt % ', '.join(tmp) @_fix_exception def __init__(self, settings): self.__ESCAPE_PREFILTER = { bool: int, datetime: lambda dt: self.escape(self.datetime(dt)), "iterable": self._prefilter_iterate, } self._transaction_state = self.__TRANSACTION_STATE_NONE stpl = tuple((k, v) for k, v in settings.items()) self._db = preludedb.SQL(settings) self._version = self._db.getServerVersion() self._dbhash = hash(stpl) self._dbtype = settings["type"] @staticmethod def parse_datetime(date): if "." in date: fmt = "%Y-%m-%d %H:%M:%S.%f" else: fmt = "%Y-%m-%d %H:%M:%S" return datetime.strptime(date, fmt).replace(tzinfo=utils.timeutil.timezone("UTC")) @staticmethod def datetime(t): if t is None: return None if isinstance(t, datetime): # Only timezone-aware datetimes are accepted return t.astimezone(utils.timeutil.timezone("UTC")).strftime("%Y-%m-%d %H:%M:%S.%f") else: return time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(t)) def kwargs2query(self, kwargs, prefix=""): if not kwargs: return "" qs = [] for field, val in kwargs.items(): if not val: qs.append("%s IS NULL" % (field)) elif val is NotNone: qs.append("%s IS NOT NULL" % (field)) else: op = "=" if isinstance(val, (list, tuple)): op = "IN" elif isinstance(val, bool): val = int(val) qs.append("%s %s %s" % (field, op, self.escape(val))) return prefix + " AND ".join(qs) def query(self, sql, *args, **kwargs): if self._transaction_state == self.__TRANSACTION_STATE_BEGIN: self._db.transactionStart() self._transaction_state = self.__TRANSACTION_STATE_QUERY if args: sql = sql % tuple(self.escape(value) for value in args) elif kwargs: sql = sql % dict((key, self.escape(value)) for key, value in kwargs.items()) return self._db.query(sql) def _chk(self, key, value, join="AND"): if value is not None: return " %s %s = %s" % (join, key, self.escape(value)) return "" def _chknull(self, key, value, join="AND"): if value is None: return " %s %s IS NULL" % (join, key) else: return self._chk(key, value, join=join) @staticmethod def _mklist(value): if isinstance(value, (list, tuple)): return value else: return (value,) def get_type(self): return self._dbtype def escape(self, data): prefilter = self._get_prefilter(data) if prefilter: return prefilter(data) if not isinstance(data, compat.STRING_TYPES): return data if data is not None else "NULL" return self._db.escape(data) def escape_binary(self, data): return self._db.escapeBinary(data) def unescape_binary(self, data): return self._db.unescapeBinary(data) def get_last_insert_ident(self): return self._db.getLastInsertIdent() def _get_merge_value(self, merged, field, rownum): value = merged[field] if not isinstance(value, (tuple, list)): return value if rownum >= len(value): raise Exception("merge value should be unique, or list with the same number of rows") return value[rownum] def _upsert_prepare_row(self, table, fields, row): return text_type(self.escape(row)) def _upsert_prepare(self, table, pkey, fields, values_rows, returning=[], merge={}, func=None): up = [] if func: up = ["%s=%s" % (f, func(f)) for f in fields] merged = {} if isinstance(merge, int) else merge vl = [] delq = [] for idx, row in enumerate(values_rows): vl.append(self._upsert_prepare_row(table, fields, row)) if not merge: continue tmpl1 = [] tmpl2 = [] for field, value in zip(fields, row): if field in merged: tmpl1.append("%s = %s" % (field, self.escape(self._get_merge_value(merged, field, idx)))) elif field in pkey: tmpl2.append("%s = %s" % (field, self.escape(value))) delq.append(" AND ".join([" AND ".join(tmpl1), "NOT(" + " AND ".join(tmpl2) + ")"])) if not vl: delq.append(" AND ".join("%s = %s" % (f, self.escape(v)) for f, v in merged.items())) return ", ".join(fields), ", ".join(vl), ", ".join(up), ", ".join(returning), " AND ".join(delq) def _unlock_table(self, table): pass def transaction_start(self): # The actual transaction will be started on the first query self._transaction_state = self.__TRANSACTION_STATE_BEGIN def transaction_end(self): if self._transaction_state == self.__TRANSACTION_STATE_QUERY: self._db.transactionEnd() self._transaction_state = self.__TRANSACTION_STATE_NONE def transaction_abort(self): if self._transaction_state == self.__TRANSACTION_STATE_QUERY: self._db.transactionAbort() self._transaction_state = self.__TRANSACTION_STATE_NONE def __hash__(self): return self._dbhash class MySQLDatabase(DatabaseCommon): def _lock_table(self, table): self.query("LOCK TABLES %s" % ", ".join(t + " WRITE" for t in self._mklist(table))) def _unlock_table(self, table): self.query("UNLOCK TABLES;") def _mysql_upsert(self, table, pkey, fields, values_rows, returning=[], merge={}): if returning: values_rows = list(values_rows) fieldfmt, vlfmt, upfmt, retfmt, delfmt = self._upsert_prepare(table, pkey, fields, values_rows, returning, merge, lambda x: "VALUES(%s)" % x) if vlfmt: self.query("INSERT INTO %s (%s) VALUES %s ON DUPLICATE KEY UPDATE %s" % (table, fieldfmt, vlfmt, upfmt)) if delfmt: self.query("DELETE FROM %s WHERE %s" % (table, delfmt)) if retfmt: wh = [] for row in values_rows: vl = " AND ".join(["%s = %s" % (field, self.escape(row[i])) for i, field in enumerate(pkey)]) wh.append("(%s)" % vl) return self.query("SELECT %s FROM %s WHERE %s" % (retfmt, table, " OR ".join(wh))) @use_transaction def upsert(self, table, fields, values_rows, pkey=[], returning=[], merge={}): if not pkey: pkey = fields return self._mysql_upsert(table, pkey, fields, values_rows, returning, merge) class PgSQLDatabase(DatabaseCommon): def _lock_table(self, table): self.query("LOCK TABLE %s IN EXCLUSIVE MODE" % ", ".join(self._mklist(table))) @cache.memoize("table_info") def _get_table_info(self, table): out = {} typemap = {"bigint": "integer", "smallint": "integer", "character varying": "text"} for field, _type, defval in self.query("SELECT column_name, data_type, column_default FROM information_schema.columns WHERE table_name = %s", table.lower()): out[field] = utils.AttrObj(type=_type, generic_type=typemap.get(_type, _type), default=defval, auto_increment="nextval" in (defval or "")) return out def _upsert_prepare_row(self, table, fields, row): out = [] dtype = self._get_table_info(table) for f, v in zip(fields, row): cast = "" if self._version >= 90500 and dtype[f].auto_increment and v is None: v = "DEFAULT" else: if dtype[f].generic_type != "text": cast = "::%s" % dtype[f].type v = text_type(self.escape(v)) + cast out.append(v) return "(" + text_type(", ".join(out)) + ")" def _pgsql_upsert_cte_query(self, table, pkey, upfmt, fields, fieldfmt, vlfmt, retfmt): up_pkfmt = [] in_pkfmt = [] for v in pkey: up_pkfmt.append("%s.%s = nv.%s" % (table, v, v)) in_pkfmt.append("updated.%s = nv.%s" % (v, v)) dtype = self._get_table_info(table) insfmt = ", ".join(filter(lambda x: not(dtype[x].auto_increment), fields)) update = "UPDATE %s SET %s FROM nv WHERE %s RETURNING %s.*" % (table, upfmt, " AND ".join(up_pkfmt), table) insert = "INSERT INTO %s (%s) SELECT %s FROM nv WHERE NOT EXISTS (SELECT 1 FROM updated WHERE %s)" % (table, insfmt, insfmt, " AND ".join(in_pkfmt)) if retfmt: insert = "%s RETURNING %s" % (insert, retfmt) query = "WITH nv (%s) AS (VALUES %s), updated AS (%s)" % (fieldfmt, vlfmt, update) if retfmt: query = "%s, inserted AS (%s) SELECT %s FROM inserted UNION ALL SELECT %s FROM updated" % (query, insert, retfmt, retfmt) else: query = " ".join((query, insert)) return self.query(query) def _pgsql_upsert_cte(self, table, pkey, fields, values_rows, returning=[], merge={}): fieldfmt, vlfmt, upfmt, retfmt, delfmt = self._upsert_prepare(table, pkey, fields, values_rows, returning, merge, lambda x: "nv.%s" % x) self._lock_table(table) try: if vlfmt: ret = self._pgsql_upsert_cte_query(table, pkey, upfmt, fields, fieldfmt, vlfmt, retfmt) if delfmt: self.query("DELETE FROM %s WHERE %s" % (table, delfmt)) finally: self._unlock_table(table) if vlfmt and retfmt: return ret def _pgsql_upsert(self, table, pkey, fields, values_rows, returning=[], merge={}): fieldfmt, vlfmt, upfmt, retfmt, delfmt = self._upsert_prepare(table, pkey, fields, values_rows, returning, merge, lambda x: "EXCLUDED.%s" % (x)) if vlfmt: if retfmt: retfmt = " RETURNING %s" % retfmt ret = self.query("INSERT INTO %s (%s) VALUES %s ON CONFLICT (%s) DO UPDATE SET %s%s" % (table, fieldfmt, vlfmt, ",".join(pkey), upfmt, retfmt)) if delfmt: self.query("DELETE FROM %s WHERE %s" % (table, delfmt)) if vlfmt and retfmt: return ret def _pgsql_upsert_emulate_single(self, table, pkey, fields, row, fieldfmt, retfmt): up_fmt = [] wh_fmt = [] vl_fmt = [] for i, v in enumerate(fields): if v in pkey: wh_fmt.append("%s = %s" % (v, self.escape(row[i]))) up_fmt.append("%s = %s" % (v, self.escape(row[i]))) vl_fmt.append(text_type(self.escape(row[i]))) ret = self.query("UPDATE %s SET %s WHERE %s%s" % (table, ", ".join(up_fmt), " AND ".join(wh_fmt), retfmt)) if ret: return ret return self.query("INSERT INTO %s (%s) SELECT %s WHERE NOT EXISTS (SELECT 1 FROM %s WHERE %s)%s" % (table, fieldfmt, ", ".join(vl_fmt), table, " AND ".join(wh_fmt), retfmt)) def _pgsql_upsert_emulate(self, table, pkey, fields, values_rows, returning=[], merge={}): values_rows = list(values_rows) fieldfmt, _, _, retfmt, delfmt = self._upsert_prepare(table, pkey, fields, values_rows, returning, merge) if retfmt: retfmt = " RETURNING %s" % retfmt returning = [] self._lock_table(table) try: for row in values_rows: ret = self._pgsql_upsert_emulate_single(table, pkey, fields, row, fieldfmt, retfmt) if ret and retfmt: returning.append(ret[0]) if delfmt: self.query("DELETE FROM %s WHERE %s" % (table, delfmt)) finally: self._unlock_table(table) return returning @use_transaction def upsert(self, table, fields, values_rows, pkey=[], returning=[], merge={}): if not pkey: pkey = fields if self._version >= 90500: ret = self._pgsql_upsert(table, pkey, fields, values_rows, returning, merge) elif self._version >= 90100: ret = self._pgsql_upsert_cte(table, pkey, fields, values_rows, returning, merge) else: ret = self._pgsql_upsert_emulate(table, pkey, fields, values_rows, returning, merge) return ret class NoDatabase(DatabaseCommon): def query(self, *args, **kwargs): raise error.PrewikkaUserError(N_("Database configuration error"), N_("Only MySQL and PostgreSQL databases are supported at the moment")) class Database(object): def __new__(cls, settings): type = settings.get("type") if type == "pgsql": return PgSQLDatabase(settings) elif type == "mysql": return MySQLDatabase(settings) else: return NoDatabase(settings) class PrewikkaDatabase(object): def __new__(cls, config): settings = {"host": "localhost", "name": "prewikka", "user": "prewikka", "type": "mysql"} settings.update(config.items()) type = settings["type"] if type == "pgsql": return PrewikkaPgSQLDatabase(settings) elif type == "mysql": return PrewikkaMySQLDatabase(settings) else: return PrewikkaNoDatabase(settings) class PrewikkaDatabaseCommon(DatabaseCommon): def __init__(self): env.db = self dh = DatabaseUpdateHelper("prewikka", self.required_version, self.required_branch) dh.apply() self._last_plugin_activation_change = self._get_last_plugin_changed() @cache.memoize_property("modinfos_cache") def modinfos(self): try: rows = self.query("SELECT module, branch, version, enabled FROM Prewikka_Module_Registry") except: return {} return dict((i[0], ModuleInfo(i[1], i[2], int(i[3]))) for i in rows) def is_plugin_active(self, plugin): module = self.modinfos.get(plugin.full_module_name) if module: return module.enabled == 1 return plugin.plugin_enabled def _get_last_plugin_changed(self): rows = self.query("SELECT time FROM Prewikka_Module_Changed")[0][0] return utils.timeutil.get_timestamp_from_string(rows) def has_plugin_changed(self): last = self._get_last_plugin_changed() if last <= self._last_plugin_activation_change: return False self._last_plugin_activation_change = last self.modinfos_cache.clear() return True def trigger_plugin_change(self): self.query("UPDATE Prewikka_Module_Changed SET time=current_timestamp") class PrewikkaPgSQLDatabase(PgSQLDatabase, PrewikkaDatabaseCommon): def __init__(self, settings): PgSQLDatabase.__init__(self, settings) PrewikkaDatabaseCommon.__init__(self) class PrewikkaMySQLDatabase(MySQLDatabase, PrewikkaDatabaseCommon): def __init__(self, settings): MySQLDatabase.__init__(self, settings) PrewikkaDatabaseCommon.__init__(self) class PrewikkaNoDatabase(NoDatabase, PrewikkaDatabaseCommon): def __init__(self, settings): NoDatabase.__init__(self, settings) PrewikkaDatabaseCommon.__init__(self) prewikka-5.1.1/prewikka/error.py0000664000175000017500000001127513555143652020276 0ustar tandrejatandreja00000000000000# Copyright (C) 2004-2019 CS-SI. All Rights Reserved. # Author: Yoann Vandoorselaere # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from __future__ import absolute_import, division, print_function, unicode_literals import abc import sys from prewikka import log, response, template, utils from prewikka.localization import _DeferredGettext class PrewikkaException(Exception): __metaclass__ = abc.ABCMeta @abc.abstractmethod def respond(self): pass class RedirectionError(PrewikkaException): def __init__(self, location, code): self.location = location self.code = code def respond(self): return response.PrewikkaRedirectResponse(self.location, code=self.code) class PrewikkaError(PrewikkaException): template = template.PrewikkaTemplate(__name__, 'templates/error.mak') name = N_("An unexpected condition happened") message = "" details = "" output = "" code = 500 log_priority = log.ERROR display_traceback = True errno = None def __init__(self, message, name=None, details=None, log_priority=None, log_user=None, template=None, code=None, output=None): if name is not None: self.name = name if message is not None: self.message = message if details is not None: self.details = details if template: self.template = template if code: self.code = code if log_priority: self.log_priority = log_priority if output: self.output = output self.traceback = self._get_traceback() self.log_user = log_user def _setup_template(self, template, ajax_error): dataset = template.dataset() for i in ("name", "message", "details", "code", "traceback", "errno", "output"): dataset[i] = getattr(self, i) dataset["is_ajax_error"] = ajax_error dataset["is_error_template"] = True return dataset def _html_respond(self): return env.viewmanager.get_baseview().respond(self._setup_template(self.template, False), self.code) def _get_traceback(self): if self.display_traceback and env.config.general.get_bool("enable_error_traceback", True): return sys.exc_info() def respond(self): if self.message: env.log.log(self.log_priority, self) if not self.traceback: self.traceback = self._get_traceback() if not (env.request.web.is_stream or env.request.web.is_xhr): # This case should only occur in case of auth error (and viewmgr might not exist at this time) return self._html_respond() return response.PrewikkaResponse(self, code=self.code) @staticmethod def _format_error(message, details): if details: return "%s: %s" % (message, details) # message might be an exception class return text_type(message) def __str__(self): return self._format_error(self.message, self.details) def __json__(self): dset = self._setup_template(PrewikkaError.template, True) return {"content": dset.render(), "error": True} class PrewikkaUserError(PrewikkaError): display_traceback = False def __init__(self, name=None, message=None, **kwargs): PrewikkaError.__init__(self, message, name=name, **kwargs) self.errno = self._get_errno(name, message) def _get_errno(self, name, message): msg = [] for s in (name, message): if isinstance(s, _DeferredGettext): s = s.origin msg.extend(text_type(s).split()) return hash("".join(utils.soundex(x) for x in msg)) & 65535 class NotImplementedError(PrewikkaError): name = N_("Not implemented") def __init__(self, message=N_("Backend does not implement this operation")): PrewikkaError.__init__(self, message, log_priority=log.ERROR) def make(exc): if not isinstance(exc, PrewikkaError): return PrewikkaError(exc) return exc prewikka-5.1.1/prewikka/history.py0000664000175000017500000001017313555143652020642 0ustar tandrejatandreja00000000000000# Copyright (C) 2017-2019 CS-SI. All Rights Reserved. # Author: Camille Gardet # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from __future__ import absolute_import, division, print_function, unicode_literals from hashlib import md5 from prewikka import crontab, database, log, utils, hookmanager logger = log.get_logger(__name__) class HistoryDatabase(database.DatabaseHelper): def init(self): # This should not be executed if env.db fails to initialize crontab.schedule("search_history", N_("Search history deletion"), "0 * * * *", _regfunc=history._history_cron, enabled=True) def create(self, user, form): return utils.AttrObj( content=self.get_queries(user, form), url={ "save": url_for('BaseView.history_save', form=form), "delete": url_for('BaseView.history_delete', form=form), "get": url_for('BaseView.history_get', form=form) } ) def _where(self, user=True, form=True, query_hash=True): where = [] if user: where.append("userid = %(user)s") if form: where.append("formid = %(form)s") if query_hash: where.append("query_hash = %(query_hash)s") return "" if not where else " WHERE %s" % " AND ".join(where) def get_queries(self, user, form): query = ("SELECT query FROM Prewikka_History_Query %s ORDER BY timestamp DESC" % self._where(query_hash=False)) return [row[0] for row in self.query(query, user=user.id, form=form)] def save(self, user, form, query): query_hash = md5(query.encode("utf8")).hexdigest() rows = [(user.id, form, query, query_hash, utils.timeutil.utcnow())] self.upsert("Prewikka_History_Query", ("userid", "formid", "query", "query_hash", "timestamp"), rows, pkey=("userid", "formid", "query_hash")) logger.info("Query saved: %s by %s on form %s", query, user.name, form) def delete(self, user, form, query=False): query_hash = md5(query.encode("utf8")).hexdigest() if query else False self.query("DELETE FROM Prewikka_History_Query" + self._where(query_hash=query_hash), user=user.id, query_hash=query_hash, form=form) logger.info("Query deleted: %s by %s on form %s", query or "all queries", user.name, form) @hookmanager.register("HOOK_USER_DELETE") def _clear_on_delete(self, user): self.query("DELETE FROM Prewikka_History_Query " + self._where(query_hash=False, form=False), user=user.id) def _history_cron(self, job): config = env.config.cron.get_instance_by_name("search_history") if config is None: return size = int(config.get("size", 10)) query = "SELECT userid, formid, COUNT(query) FROM Prewikka_History_Query GROUP BY userid, formid" for userid, formid, count in self.query(query): if int(count) <= size: continue rows = self.query("SELECT query FROM Prewikka_History_Query WHERE userid = %s AND formid = %s " "ORDER BY timestamp DESC LIMIT %s", userid, formid, size) self.query("DELETE FROM Prewikka_History_Query WHERE userid = %s AND formid = %s AND query NOT IN %s", userid, formid, [row[0] for row in rows]) history = HistoryDatabase() init = history.init create = history.create delete = history.delete get = history.get_queries save = history.save prewikka-5.1.1/prewikka/hookmanager.py0000664000175000017500000000517513555143652021442 0ustar tandrejatandreja00000000000000# Copyright (C) 2016-2019 CS-SI. All Rights Reserved. # Author: Yoann Vandoorselaere # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from __future__ import absolute_import, division, print_function, unicode_literals import operator from prewikka import registrar _sentinel = object() class HookManager(object): def __init__(self): self._hooks = {} def __contains__(self, hook): return hook in self._hooks def unregister(self, hook=None, method=None, exclude=[]): if hook and method: self._hooks[hook] = [(order, func) for order, func in self._hooks[hook] if func != method] elif hook: self._hooks[hook] = [] else: for i in set(self._hooks) - set(exclude): self._hooks[i] = [] def register(self, hook, _regfunc=_sentinel, _order=2**16): if _regfunc is not _sentinel: self._hooks.setdefault(hook, []).append((_order, _regfunc)) else: return registrar.DelayedRegistrar.make_decorator("hook", self.register, hook, _order=_order) def trigger(self, hook, *args, **kwargs): wtype = kwargs.pop("type", None) _except = kwargs.pop("_except", None) for order, cb in sorted(self._hooks.setdefault(hook, []), key=operator.itemgetter(0)): if not callable(cb): result = cb else: try: result = cb(*args, **kwargs) except Exception as e: if _except: _except(e) continue else: raise if result and wtype and not isinstance(result, wtype): raise TypeError("Hook '%s' expect return type of '%s' but got '%s'" % (hook, wtype, type(result))) yield result hookmgr = HookManager() trigger = hookmgr.trigger register = hookmgr.register unregister = hookmgr.unregister prewikka-5.1.1/prewikka/idmefdatabase.py0000664000175000017500000000206613555143652021714 0ustar tandrejatandreja00000000000000# Copyright (C) 2004-2019 CS-SI. All Rights Reserved. # Author: Yoann Vandoorselaere # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from __future__ import absolute_import, division, print_function, unicode_literals import preludedb class IDMEFDatabase(preludedb.DB): def __init__(self, config): preludedb.DB.__init__(self, preludedb.SQL(dict(config))) prewikka-5.1.1/prewikka/link.py0000664000175000017500000000474313555143652020104 0ustar tandrejatandreja00000000000000# Copyright (C) 2018-2019 CS-SI. All Rights Reserved. # Author: Yoann Vandoorselaere # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from __future__ import absolute_import, division, print_function, unicode_literals import re from prewikka import resource, utils _SENTINEL = object() class LinkManager(object): """Contextual link manager""" def __init__(self): self._links = {} for i in env.config.url: self._init_url(i.get_instance_name() or "other", i) def add_link(self, label, paths, urlgencb): self._register_link(paths, label, urlgencb) def _register_link(self, paths, label, url): for path in paths: self._links.setdefault(path, []).append((label, url)) def _init_url(self, type, config): for option, value in config.items(): if not self._check_option(option, value): continue paths = filter(None, re.split('\s|,', config.get("paths", ""))) self._register_link(list(paths) + [type], option, value) def _check_option(self, option, value): return option != "paths" def get_links(self, path=None, arg=None): if arg is None: raise ValueError("Parameter 'arg' cannot be None") d = {path: self._links.get(path, [])} if path else self._links for path, links in d.items(): for label, url in links: yield self._get_link(label, url, arg, path=path) def _get_link(self, label, value, arg, path=None): d = {"data-path": path} if path else {} if callable(value): value = value(arg) else: value = value.replace("$value", utils.url.quote_plus(arg.encode("utf-8"))) return resource.HTMLNode("a", _(label.capitalize()), href=value, **d) prewikka-5.1.1/prewikka/localization.py0000664000175000017500000002166213555143652021636 0ustar tandrejatandreja00000000000000# coding=UTF-8 # Copyright (C) 2007-2019 CS-SI. All Rights Reserved. # Author: Yoann Vandoorselaere # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from __future__ import absolute_import, division, print_function, unicode_literals import collections import datetime import gettext import sys from threading import Lock, local import babel.core # Babel functions import babel.dates import babel.numbers import pkg_resources import prelude from prewikka import log, utils if sys.version_info >= (3, 0): import builtins else: import __builtin__ as builtins try: # Needs babel >= 1.0 from babel.dates import format_timedelta as _format_timedelta except ImportError: from prewikka.compat.babelcompat import format_timedelta as _format_timedelta logger = log.get_logger(__name__) class TranslationProxy(object): def __init__(self): self._data = local() self._catalogs = {} self._catalogs_lock = Lock() self._domains_lock = Lock() self._domains = collections.OrderedDict([("prewikka", pkg_resources.resource_filename(__name__, "locale"))]) def add_domain(self, domain, locale_dir): with self._domains_lock: self._domains[domain] = locale_dir def _get_catalog(self, domain, lang): with self._catalogs_lock: if domain not in self._catalogs: self._catalogs[domain] = {} if lang not in self._catalogs[domain]: logger.info("loading '%s' translation for domain '%s'", lang, domain) self._catalogs[domain][lang] = gettext.translation(domain, self._domains[domain], languages=[lang]) return self._catalogs[domain][lang] def get_charset(self): try: return self._data.catalog.charset() except: return env.config.general.encoding def get_locale(self): try: return self._data.lang except: return env.config.general.default_locale def set_locale(self, lang): first = None for domain, locale_dir in self._domains.items(): t = self._get_catalog(domain, lang) if not first: first = t else: first._catalog.update(t._catalog) self._data.lang = lang self._data.catalog = first def gettext(self, s): if sys.version_info < (3, 0): return self._data.catalog.ugettext(s) if hasattr(self._data, "catalog") else s else: return self._data.catalog.gettext(s) if hasattr(self._data, "catalog") else s def ngettext(self, singular, plural, num): if not hasattr(self._data, "catalog"): return singular if num <= 1 else plural if sys.version_info < (3, 0): return self._data.catalog.ungettext(singular, plural, num) else: return self._data.catalog.ngettext(singular, plural, num) translation = TranslationProxy() class _DeferredGettext(text_type): def __new__(cls, text, arguments=None): message = text % arguments if arguments else text o = text_type.__new__(cls, message) o.origin = text o._arguments = arguments return o def translate(self): s = translation.gettext(self.origin) return s % self._arguments if self._arguments else s def _translate(s): if isinstance(s, _DeferredGettext): return s.translate() else: return translation.gettext(s) builtins._ = _translate builtins.N_ = _DeferredGettext builtins.ngettext = translation.ngettext DATE_YM_FMT = N_("%m/%Y") DATE_YMD_FMT = N_("%m/%d/%Y") DATE_YMDH_FMT = N_("%m/%d/%Y %Hh") DATE_YMDHM_FMT = N_("%m/%d/%Y %H:%M") DATE_YMDHMS_FMT = N_("%m/%d/%Y %H:%M:%S") TIME_HM_FMT = N_("%H:%M") TIME_HMS_FMT = N_("%H:%M:%S") _LANGUAGES = { "de_DE": "Deutsch", "es_ES": "Español", "en_GB": "English", "fr_FR": "Français", "it_IT": "Italiano", "pl_PL": "Polski", "pt_BR": "Português (Brasileiro)", "ru_RU": "Русский" } def set_locale(lang): if not lang: lang = env.config.general.default_locale translation.set_locale("%s.%s" % (lang, env.config.general.encoding)) def get_languages(): return _LANGUAGES def get_current_charset(): return translation.get_charset() def format_date(date=None, tzinfo=None, **kwargs): if isinstance(date, (float, int)): date = datetime.datetime.utcfromtimestamp(date).replace(tzinfo=utils.timeutil.tzutc()) # Babel format_date() miss tzinfo convertion if date: date = date.astimezone(tzinfo or env.request.user.timezone) return babel.dates.format_date(date, locale=translation.get_locale(), **kwargs) def format_time(dt=None, tzinfo=None, **kwargs): if isinstance(dt, (float, int, prelude.IDMEFTime)): dt = datetime.datetime.fromtimestamp(dt, utils.timeutil.tzutc()) if not tzinfo: tzinfo = env.request.user.timezone return babel.dates.format_time(dt, tzinfo=tzinfo, locale=translation.get_locale(), **kwargs) def format_datetime(dt=None, tzinfo=None, **kwargs): if isinstance(dt, (float, int, prelude.IDMEFTime)): dt = datetime.datetime.fromtimestamp(dt, utils.timeutil.tzutc()) if not tzinfo: tzinfo = env.request.user.timezone return babel.dates.format_datetime(datetime=dt, tzinfo=tzinfo, locale=translation.get_locale(), **kwargs) def format_timedelta(*args, **kwargs): return _format_timedelta(*args, locale=translation.get_locale(), **kwargs) def _abbreviate_number(number, binary=False): thousand = 1024 if binary else 1000 for unit in ['', 'K', 'M', 'G', 'T', 'P']: if abs(number) < thousand or unit == 'P': format_ = None if isinstance(number, int) else "@@@" # three significant digits return "%s%s" % (format_number(number, format=format_), unit) number /= thousand def format_number(number, short=False, binary=False, **kwargs): if short: return _abbreviate_number(number, binary) return babel.numbers.format_decimal(number, locale=translation.get_locale(), **kwargs) def format_value(value): if value is None: return _("n/a") elif isinstance(value, (int, float)): return format_number(value) elif isinstance(value, datetime.datetime): return format_datetime(value) elif isinstance(value, datetime.timedelta): # format_timedelta does not provide this granularity (days/hours/minutes) hours, minutes = divmod(value.seconds / 60, 60) return _("%(days)dd %(hours)dh %(minutes)d'") % { "days": value.days, "hours": hours, "minutes": minutes } else: return text_type(value) or _("n/a") def get_period_names(*args, **kwargs): return babel.dates.get_period_names(*args, locale=translation.get_locale(), **kwargs) def get_day_names(*args, **kwargs): return babel.dates.get_day_names(*args, locale=translation.get_locale(), **kwargs) def get_month_names(*args, **kwargs): return babel.dates.get_month_names(*args, locale=translation.get_locale(), **kwargs) def get_quarter_names(*args, **kwargs): return babel.dates.get_quarter_names(*args, locale=translation.get_locale(), **kwargs) def get_era_names(*args, **kwargs): return babel.dates.get_era_names(*args, locale=translation.get_locale(), **kwargs) def get_calendar_format(): """ Return a date format for use by jquery's datetime picker """ calendar_format = babel.dates.get_date_format( 'short', translation.get_locale()).pattern # babel uses 'MM' for month, and jquery uses 'mm' # 4-digits year: "yyyy" in Babel, "yy" in jQuery. # 2-digits year: "yy" in Babel, "y" in jQuery. return calendar_format.replace("yy", "y").replace("MM", "mm") def get_timezones(): return sorted(zone for zone in list(babel.core.get_global('zone_territories').keys()) + ["UTC"] if not zone.startswith('Etc/')) def get_system_timezone(): try: # Needs babel >= 1.0 return babel.dates.LOCALTZ.zone except: return "UTC" def get_first_week_day(): """ Get the first day of the week based on locale. :return: first day of week, from 0 (monday) to 6 (sunday) :rtype: int """ return babel.Locale.parse(translation.get_locale()).first_week_day prewikka-5.1.1/prewikka/log.py0000664000175000017500000001167413555143652017731 0ustar tandrejatandreja00000000000000# Copyright (C) 2004-2019 CS-SI. All Rights Reserved. # Author: Yoann Vandoorselaere # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from __future__ import absolute_import, division, print_function, unicode_literals import logging import logging.handlers import os import stat import sys DEBUG = logging.DEBUG INFO = logging.INFO ERROR = logging.ERROR WARNING = logging.WARNING CRITICAL = logging.CRITICAL class Log(object): def __init__(self, conf): self._logger = None for instance in conf: self._logger = logging.getLogger() self._logger.setLevel(logging.NOTSET) self._logger.addHandler(self._get_handler(instance)) def _get_syslog_handler_address(self): for f in ("/dev/log", "/var/run/log", "/var/run/syslog"): try: if stat.S_ISSOCK(os.stat(f).st_mode): return str(f) except: pass return "localhost", 514 def _get_handler(self, config): logtype = (config.get_instance_name() or "syslog").lower() level = config.get("level", "") if logtype == 'file': hdlr = logging.FileHandler(config.file) elif logtype == 'nteventlog': hdlr = logging.handlers.NTEventLogHandler("Prewikka", logtype='Application') elif logtype in ('syslog', 'unix'): hdlr = logging.handlers.SysLogHandler(self._get_syslog_handler_address(), facility=logging.handlers.SysLogHandler.LOG_DAEMON) elif logtype == 'smtp': hdlr = logging.handlers.SMTPHandler(config.host, getattr(config, "from"), config.to.split(", "), config.subject) elif logtype == 'stderr': hdlr = logging.StreamHandler(sys.stderr) else: raise ValueError("Unknown logtype specified: '%s'" % logtype) format = 'prewikka (pid:%(process)d) %(name)s %(levelname)s: %(message)s' if logtype in ['file', 'stderr']: format = '%(asctime)s ' + format datefmt = '' if logtype == 'stderr': datefmt = '%X' level = level.upper() if level in ['DEBUG', 'ALL']: hdlr.setLevel(logging.DEBUG) elif level == 'INFO': hdlr.setLevel(logging.INFO) elif level == 'ERROR': hdlr.setLevel(logging.ERROR) elif level == 'CRITICAL': hdlr.setLevel(logging.CRITICAL) else: hdlr.setLevel(logging.WARNING) formatter = logging.Formatter(format, datefmt) hdlr.setFormatter(formatter) return hdlr def _format_header(self): if not env.request.web: return "" hdr = "".join(("[", env.request.web.get_remote_addr())) port = env.request.web.get_remote_port() if port: hdr = ":".join((hdr, text_type(port))) hdr = " ".join((hdr, "%s@" % (env.request.user) if env.request.user else "")) flags = "" if env.request.web.is_xhr: flags = " (xhr)" elif env.request.web.is_stream: flags = " (sse)" return "".join((hdr, env.request.web.path, flags, "]")) def _get_log(self, details): hdr = self._format_header() hdr = [hdr] if hdr else [] if isinstance(details, Exception): details = " ".join([text_type(getattr(details, "code", 500)), text_type(details)]) return " ".join(hdr + [text_type(details)]) def debug(self, message): if self._logger: self._logger.debug(self._get_log(message)) def info(self, message): if self._logger: self._logger.info(self._get_log(message)) def warning(self, message): if self._logger: self._logger.warning(self._get_log(message)) def error(self, message): if self._logger: self._logger.error(self._get_log(message)) def critical(self, message): if self._logger: self._logger.critical(self._get_log(message)) def log(self, priority, message): return { DEBUG: self.debug, INFO: self.info, WARNING: self.warning, ERROR: self.error, CRITICAL: self.critical }[priority](message) def get_logger(name=__name__): return logging.getLogger(name) prewikka-5.1.1/prewikka/main.py0000664000175000017500000003016513555143652020070 0ustar tandrejatandreja00000000000000# Copyright (C) 2004-2019 CS-SI. All Rights Reserved. # Author: Yoann Vandoorselaere # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from __future__ import absolute_import, division, print_function, unicode_literals import errno import gc import os import socket import pkg_resources import prelude import preludedb from prewikka import (auth, cli, config, database, dataprovider, error, history, hookmanager, link, localization, log, menu, pluginmanager, renderer, resolve, response, siteconfig, usergroup, version, view) try: from threading import Lock except ImportError: from dummy_threading import Lock _core_cache = {} _core_cache_lock = Lock() class Core(object): def _check_version(self): error_type = _("Version Requirement error") if not prelude.checkVersion(siteconfig.libprelude_required_version): raise error.PrewikkaUserError(error_type, N_("Prewikka %(vPre)s requires libprelude %(vLib)s or higher", {'vPre': version.__version__, 'vLib': siteconfig.libprelude_required_version})) elif not preludedb.checkVersion(siteconfig.libpreludedb_required_version): raise error.PrewikkaUserError(error_type, N_("Prewikka %(vPre)s requires libpreludedb %(vLib)s or higher", {'vPre': version.__version__, 'vLib': siteconfig.libpreludedb_required_version})) @staticmethod def from_config(path=None, threaded=False, autoupdate=False): global _core_cache global _core_cache_lock if not path: path = siteconfig.conf_dir + "/prewikka.conf" with _core_cache_lock: if path not in _core_cache: _core_cache[path] = Core(path, autoupdate) return _core_cache[path] def __init__(self, filename=None, autoupdate=False): self.autoupdate = autoupdate env.auth = None # In case of database error env.config = config.Config(filename) env.config.general.setdefault("default_theme", "cs") env.config.general.setdefault("default_locale", "en_GB") env.config.general.setdefault("encoding", "UTF-8") env.config.general.setdefault("default_timezone", localization.get_system_timezone()) env.config.general.reverse_path = env.config.general.get("reverse_path", "").rstrip("/") env.log = log.Log(env.config.log) env.log.info("Starting Prewikka") env.dns_max_delay = env.config.general.get_float("dns_max_delay", 0.) if env.config.general.get_bool("external_link_new_window", True): env.external_link_target = "_blank" else: env.external_link_target = "_self" env.enable_details = env.config.general.get_bool("enable_details", False) env.host_details_url = env.config.general.get("host_details_url", "https://www.prelude-siem.com/host_details.php") env.port_details_url = env.config.general.get("port_details_url", "https://www.prelude-siem.com/port_details.php") env.reference_details_url = env.config.general.get("reference_details_url", "https://www.prelude-siem.com/reference_details.php") resolve.init() env.menumanager = None env.viewmanager = view.ViewManager() env.htdocs_mapping.update((("prewikka", pkg_resources.resource_filename(__name__, 'htdocs')),)) try: self._prewikka_initialized = False self._prewikka_init_if_needed() except: pass def _load_custom_theme(self): custom_theme = env.config.interface.get("custom_theme") if custom_theme is None: return if os.path.isdir("%s%s" % (os.path.sep, custom_theme)): env.htdocs_mapping.update((("custom", custom_theme),)) else: try: env.htdocs_mapping.update((("custom", pkg_resources.resource_filename(custom_theme, 'htdocs')),)) except ImportError: raise config.ConfigValueError(custom_theme, "custom_theme") def _prewikka_init_if_needed(self): if self._prewikka_initialized is True: return self.reload_plugin_if_needed() try: self._load_custom_theme() self._check_version() env.db = database.PrewikkaDatabase(env.config.database) history.init() self._load_plugins() self._prewikka_initialized = True except error.PrewikkaError as e: self._prewikka_initialized = e except Exception as e: self._prewikka_initialized = error.PrewikkaError(e, name=_("Initialization error")) finally: # Needed for Database object gc.collect() if isinstance(self._prewikka_initialized, Exception): env.log.log(self._prewikka_initialized.log_priority, text_type(self._prewikka_initialized)) self._unregister_plugin_data() raise self._prewikka_initialized def _load_auth_or_session(self, typename, plugins, name, config=config.SectionRoot()): if name not in plugins: raise error.PrewikkaUserError( N_("Initialization error"), N_("Cannot use %(type)s mode '%(name)s', please contact your local administrator.", {'type': typename, 'name': name}) ) obj = plugins[name](config) setattr(env, typename, obj) obj.init(config) def _unregister_plugin_data(self): list(hookmanager.trigger("HOOK_PLUGINS_RELOAD")) hookmanager.unregister(exclude=["HOOK_PLUGINS_RELOAD"]) cli.unregister() usergroup.ACTIVE_PERMISSIONS = usergroup.Permissions() def _load_plugins(self): env.all_plugins = {} env.menumanager = menu.MenuManager() env.dataprovider = dataprovider.DataProviderManager(autoupdate=self.autoupdate) env.dataprovider.load(autoupdate=self.autoupdate) env.linkmanager = link.LinkManager() env.plugins = {} for i in pluginmanager.PluginManager("prewikka.plugins", autoupdate=self.autoupdate): try: env.plugins[i.__name__] = pluginmanager.PluginManager.initialize_plugin(i) except error.PrewikkaUserError: pass # Load views before auth/session to find all permissions env.viewmanager.load_views(autoupdate=self.autoupdate) _AUTH_PLUGINS = pluginmanager.PluginManager("prewikka.auth", autoupdate=True) _SESSION_PLUGINS = pluginmanager.PluginManager("prewikka.session", autoupdate=True) cfg = env.config if cfg.session: self._load_auth_or_session("session", _SESSION_PLUGINS, cfg.session.get_instance_name(), cfg.session) if isinstance(env.session, auth.Auth): # If the session module is also an auth module, no need to load an auth module env.auth = env.session if cfg.auth: env.log.error(_("Session '%s' does not accept any authentication module" % cfg.session.get_instance_name())) else: # If no authentification module defined, we use the session's default auth module auth_name = cfg.auth.get_instance_name() if cfg.auth else env.session.get_default_auth() self._load_auth_or_session("auth", _AUTH_PLUGINS, auth_name, cfg.auth) elif cfg.auth: # No session module defined, we load the auth module first self._load_auth_or_session("auth", _AUTH_PLUGINS, cfg.auth.get_instance_name(), cfg.auth) self._load_auth_or_session("session", _SESSION_PLUGINS, env.auth.get_default_session()) else: # Nothing defined, we use the anonymous module self._load_auth_or_session("session", _SESSION_PLUGINS, "anonymous") env.auth = env.session env.renderer = renderer.RendererPluginManager(autoupdate=self.autoupdate) list(hookmanager.trigger("HOOK_PLUGINS_LOAD")) def reload_plugin_if_needed(self): if not env.db.has_plugin_changed(): return # Some changes happened, and every process has to reload the plugin configuration env.log.warning("plugins were activated: triggering reload") self._unregister_plugin_data() try: self._load_plugins() finally: # Needed for Database object gc.collect() def _redirect_default(self, request): if env.menumanager.default_endpoint: url = url_for(env.menumanager.default_endpoint) else: # The configured view does not exist. Fall back to "settings/my_account" # which does not require any specific permission. url = request.get_baseurl() + "settings/my_account" return response.PrewikkaRedirectResponse(url) def _process_static(self, webreq): pathkey = webreq.path_elements[0] endpath = webreq.path[len(pathkey) + 2:] mapping = env.htdocs_mapping.get(pathkey, None) if not (mapping and endpath and endpath.find(".") != -1): # There is no mapping, or no path beyond the mapped portion was provided. # FIXME: .ext check is not clean: proper way to handle this would be to map statics # files to a /static base directory return path = os.path.abspath(os.path.join(mapping, endpath)) if not path.startswith(mapping): return response.PrewikkaResponse(code=403, status_text="Request Forbidden") try: return response.PrewikkaFileResponse(path) except OSError: return response.PrewikkaResponse(code=404, status_text="File not found") def _process_dynamic(self, webreq): self._prewikka_init_if_needed() # Some newly loaded plugin from another request may have modified globally loadeds # JS/CSS scripts. We thus need to call _process_static() again after _prewikka_init_if_needed() response = self._process_static(webreq) if response: return response autherr = None try: env.request.user = env.session.get_user(webreq) env.request.user.set_locale() except error.PrewikkaError as e: autherr = e pass if webreq.path == "/": return self._redirect_default(webreq) try: view_object = env.viewmanager.load_view(webreq, env.request.user) except Exception as err: raise autherr or err if view_object.view_require_session and autherr: view_object = autherr resolve.process(env.dns_max_delay) ret = view_object.respond() if env.request.user: env.request.user.sync_properties() return ret def process(self, webreq): env.request.init(webreq) try: response = self._process_static(webreq) or self._process_dynamic(webreq) except error.PrewikkaException as err: response = err.respond() except Exception as err: response = error.PrewikkaError( N_("An unexpected condition happened while trying to load %s", webreq.path), details=err ).respond() try: webreq.send_response(response) except socket.error as e: if e.errno != errno.EPIPE: raise finally: env.request.cleanup() prewikka-5.1.1/prewikka/mainmenu.py0000664000175000017500000003107213555143652020753 0ustar tandrejatandreja00000000000000# Copyright (C) 2015-2019 CS-SI. All Rights Reserved. # Author: Yoann Vandoorselaere # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from __future__ import absolute_import, division, print_function, unicode_literals import calendar import collections import datetime from dateutil.relativedelta import relativedelta from prewikka import hookmanager, localization, resource, template, utils from prewikka.dataprovider import Criterion _SENTINEL = object() _MAINMENU_TEMPLATE = template.PrewikkaTemplate(__name__, "templates/mainmenu.mak") _MAINMENU_PARAMETERS = ["timeline_value", "timeline_unit", "timeline_end", "timeline_start", "timeline_mode", "timeline_offset", "auto_apply_value"] def _register_parameters(view_parameters): view_parameters.optional("timeline_mode", text_type, default="relative", save=True, general=True) view_parameters.optional("timeline_value", int, default=1, save=True, general=True) view_parameters.optional("timeline_unit", text_type, default="month", save=True, general=True) view_parameters.optional("timeline_offset", int, default=0, save=True, general=True) view_parameters.optional("timeline_end", int, save=True, general=True) view_parameters.optional("timeline_start", int, save=True, general=True) view_parameters.optional("auto_apply_value", int, default=0, save=True, general=True) view_parameters.MAINMENU_PARAMETERS = _MAINMENU_PARAMETERS[:] for i in hookmanager.trigger("HOOK_MAINMENU_PARAMETERS_REGISTER", view_parameters): view_parameters.MAINMENU_PARAMETERS.extend(i) class TimeUnit(object): _unit = ("year", "month", "day", "hour", "minute", "second", "millisecond", "microsecond") _dbunit = {"year": "year", "month": "month", "day": "mday", "hour": "hour", "minute": "min", "second": "sec", "millisecond": "msec", "microsecond": "usec"} @property def dbunit(self): return self._dbunit[text_type(self)] def __init__(self, unit): if isinstance(unit, int): assert 0 <= unit < len(self._unit) self._idx = unit else: assert unit in self._unit self._idx = self._unit.index(unit) def __add__(self, x): return TimeUnit(self._idx + x) def __sub__(self, x): return TimeUnit(self._idx - x) def __lt__(self, x): if isinstance(x, TimeUnit): return int(self) > int(x) else: return int(self) < x def __gt__(self, x): if isinstance(x, TimeUnit): return int(self) < int(x) else: return int(self) > x def __ge__(self, x): if isinstance(x, TimeUnit): return int(self) <= int(x) else: return int(self) >= x def __le__(self, x): if isinstance(x, TimeUnit): return int(self) >= int(x) else: return int(self) <= x def __eq__(self, x): return int(self) == int(x) def __int__(self): return self._idx def __str__(self): return self._unit[self._idx] class MainMenuStep(object): def __init__(self, unit, value): d = { "year": (relativedelta(years=value), "%Y", "year"), "month": (relativedelta(months=value), _(localization.DATE_YM_FMT), "month"), "day": (relativedelta(days=value), _(localization.DATE_YMD_FMT), "mday"), "hour": (relativedelta(hours=value), _(localization.DATE_YMDH_FMT), "hour"), "minute": (relativedelta(minutes=value), _(localization.TIME_HM_FMT), "min"), "second": (relativedelta(seconds=value), _(localization.TIME_HMS_FMT), "sec"), "millisecond": (relativedelta(microseconds=value * 1000), _("%S.%.6f"), "msec"), "microsecond": (relativedelta(microseconds=value), _("%S.%.3f"), "usec") } self.unit = text_type(unit) self.timedelta, self.unit_format, self.dbunit = d[self.unit] class TimePeriod(object): def __init__(self, parameters): self._parameters = parameters self._setup_timeline_range() def _get_unit(self): delta = self.end - self.start totsec = delta.seconds + (delta.days * 24 * 60 * 60) if self._timeunit != "unlimited" and self._timevalue > 1: unit = TimeUnit(self._timeunit) if int(unit) > 0: unit = unit - 1 elif totsec > 365 * 24 * 60 * 60: unit = TimeUnit("year") elif totsec > 30 * 24 * 60 * 60: unit = TimeUnit("month") # step = month elif totsec > 24 * 60 * 60: unit = TimeUnit("day") # step = days elif totsec > 60 * 60: unit = TimeUnit("hour") # step = hours elif totsec > 60: unit = TimeUnit("minute") # step = minutes else: unit = TimeUnit("second") return unit def _get_nearest_unit(self, stepno): delta = self.end - self.start totsec = delta.seconds + (delta.days * 24 * 60 * 60) if totsec < 60: return TimeUnit("minute") gtable = { 365 * 24 * 60 * 60: "year", 31 * 24 * 60 * 60: "month", 24 * 60 * 60: "day", 60 * 60: "hour", 60: "minute" } nearest = min(gtable, key=lambda x: abs((totsec / x) - stepno)) return TimeUnit(gtable[nearest]) def _setup_timeline_range(self): self.start = self.end = None mode = self._parameters["timeline_mode"] if mode == "custom": # datetime specified through the mainmenu are precise to the second, we thus increase # end time by 999999 microseconds to account for us/ms. if "timeline_start" in self._parameters: self.start = env.request.user.timezone.localize(datetime.datetime.utcfromtimestamp(self._parameters["timeline_start"])) if "timeline_end" in self._parameters: self.end = env.request.user.timezone.localize(datetime.datetime.utcfromtimestamp(self._parameters["timeline_end"])) + datetime.timedelta(microseconds=999999) else: self.end = datetime.datetime.now(env.request.user.timezone).replace(microsecond=999999) else: tunit = self._parameters["timeline_unit"] if tunit == "unlimited": tunit = "year" delta = relativedelta(**{tunit + "s": self._parameters["timeline_value"]}) self.start = self.end = datetime.datetime.now(env.request.user.timezone).replace(microsecond=0) if mode == "relative": # relative self.start = self.end - delta self.end = self.end.replace(microsecond=999999) else: # absolute self.end = utils.timeutil.truncate(self.end, tunit) + relativedelta(**{tunit + "s": self._parameters["timeline_offset"] + 1}) if self._parameters["timeline_unit"] == "unlimited": self.start = datetime.datetime.fromtimestamp(0).replace(tzinfo=env.request.user.timezone) else: self.start = self.end - delta self.end -= relativedelta(microseconds=1) @staticmethod def mktime_param(dt, precision=None): tpl = list(dt.timetuple()) if precision is not None: assert(precision > 0) for i in range(precision, len(tpl)): # month/day must at least be 1 tpl[i] = 1 if i <= 2 else 0 return int(calendar.timegm(tpl)) def get_criteria(self): criteria = Criterion() if self.start: start = self.start.astimezone(utils.timeutil.timezone("UTC")) criteria += Criterion("{backend}.{end_time_field}", ">=", start) if self.end: end = self.end.astimezone(utils.timeutil.timezone("UTC")) criteria += Criterion("{backend}.{start_time_field}", "<=", end) return criteria def get_step(self, stepno=None): if stepno: x = self._get_nearest_unit(stepno) else: x = self._get_unit() return MainMenuStep(x, 1) def get_parameters(self): return dict(((key, value) for key, value in self._parameters.items() if key in env.request.menu_parameters.MAINMENU_PARAMETERS)) class _MainMenu(TimePeriod): def __init__(self, criteria_type=_SENTINEL, parameters=None, **kwargs): if criteria_type is not _SENTINEL: self._criteria_type = criteria_type else: self._criteria_type = env.request.view.view_datatype self._parameters = parameters or env.request.menu_parameters self.dataset = _MAINMENU_TEMPLATE.dataset(inline=True, period=True, refresh=True, period_optional=False, label_width=2, input_size="sm", update=False) self.dataset.update(kwargs) self.dataset["timeline"] = utils.AttrObj() self.dataset["timeline"].quick = collections.OrderedDict(( ((1, "day", True, 0), _("Today")), ((1, "day", True, -1), _("Yesterday")), ((1, "week", True, 0), _("This week")), ((1, "week", True, -1), _("Last week")), ((1, "month", True, 0), _("This month")), ((1, "month", True, -1), _("Last month")), ((1, "hour", False, 0), ngettext("%d hour", "%d hours", 1) % 1), ((2, "hour", False, 0), ngettext("%d hour", "%d hours", 2) % 2), ((1, "day", False, 0), ngettext("%d day", "%d days", 1) % 1), ((2, "day", False, 0), ngettext("%d day", "%d days", 2) % 2), ((1, "week", False, 0), ngettext("%d week", "%d weeks", 1) % 1), ((1, "month", False, 0), ngettext("%d month", "%d months", 1) % 1), ((3, "month", False, 0), ngettext("%d month", "%d months", 3) % 3), ((1, "year", False, 0), ngettext("%d year", "%d years", 1) % 1) )) self.dataset["timeline"].refresh = collections.OrderedDict(( (30, ngettext("%d second", "%d seconds", 30) % 30), (60, ngettext("%d minute", "%d minutes", 1) % 1), (60 * 5, ngettext("%d minute", "%d minutes", 5) % 5), (60 * 10, ngettext("%d minute", "%d minutes", 10) % 10) )) self._render() def _set_timeline(self, start, end): if not start and not end: return self.dataset["timeline"].start = start.replace(tzinfo=None, microsecond=0).isoformat() self.dataset["timeline"].end = end.replace(tzinfo=None, microsecond=0).isoformat() def _render(self): mode = self.dataset["timeline"].mode = self._parameters["timeline_mode"] self.dataset["auto_apply_value"] = self._parameters["auto_apply_value"] self.dataset["timeline"].value = self._parameters["timeline_value"] self.dataset["timeline"].unit = self._parameters["timeline_unit"] self.dataset["timeline"].offset = self._parameters["timeline_offset"] self.dataset["timeline"].time_format = localization.get_calendar_format() self.dataset["timeline"].refresh_selected = self.dataset["timeline"].refresh.get(self._parameters["auto_apply_value"], _("Inactive")) if mode == "custom": self.dataset["timeline"].quick_selected = _("Custom") else: wanted = (self._parameters["timeline_value"], self._parameters["timeline_unit"], mode == "absolute", self._parameters["timeline_offset"]) self.dataset["timeline"].quick_selected = self.dataset["timeline"].quick.get(wanted, _("None")) self._setup_timeline_range() self._set_timeline(self.start, self.end) self.dataset["mainmenu_url"] = url_for("BaseView.mainmenu", datatype=self._criteria_type) self.dataset["menu_extra"] = filter(None, hookmanager.trigger("HOOK_MAINMENU_EXTRA_CONTENT", self._criteria_type, parameters=self._parameters, **self.dataset)) def render(self): return resource.HTMLSource(self.dataset.render()) def HTMLMainMenu(**kwargs): return resource.HTMLSource(_MainMenu(**kwargs).dataset.render()) prewikka-5.1.1/prewikka/menu.py0000664000175000017500000001072513555143652020110 0ustar tandrejatandreja00000000000000# Copyright (C) 2016-2019 CS-SI. All Rights Reserved. # Author: Antoine Luong # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from __future__ import absolute_import, division, print_function, unicode_literals import collections import copy import itertools import os import voluptuous import yaml from prewikka import error, hookmanager from prewikka.utils import cache _SCHEMA = voluptuous.Schema([{ "name": str, "icon": str, "default": bool, voluptuous.Required("categories", default=[]): [{ "name": str, "icon": str, voluptuous.Required("sections", default=[]): [{ voluptuous.Required("name"): str, "icon": str, voluptuous.Required("tabs", default=[]): [str], "default_tab": str, "expand": bool }] }] }]) class MenuManager(object): default_endpoint = None """ Handle section placement in the menus. """ def __init__(self): self._declared_sections = {} self._loaded_sections = {} self._default_view = None filename = env.config.interface.get("menu_order", "menu.yml") if not os.path.isabs(filename): filename = os.path.join(env.config.basedir, filename) try: with open(filename, "r") as f: self._menus = _SCHEMA(yaml.safe_load(f)) except (IOError, yaml.error.YAMLError, voluptuous.Invalid) as e: raise error.PrewikkaUserError(N_("Menu error"), N_("The provided YAML menu is invalid"), details=e) if not self._menus: raise error.PrewikkaUserError(N_("Menu error"), N_("Empty menu")) default_menu = False for menu in self._menus: if "name" not in menu and "icon" not in menu: raise error.PrewikkaUserError(N_("Menu error"), N_("Menu without a name in %s", filename)) if menu.get("default"): if default_menu: raise error.PrewikkaUserError(N_("Menu error"), N_("Multiple default menus")) default_menu = True for category in menu["categories"]: for section in category["sections"]: if "default_tab" in section: if self._default_view: raise error.PrewikkaUserError(N_("Menu error"), N_("Multiple default views")) self._default_view = (section["name"], section["default_tab"]) self._declared_sections[section["name"]] = collections.OrderedDict((v, idx) for idx, v in enumerate(section["tabs"])) if not default_menu: self._menus[-1]["default"] = True @cache.request_memoize("get_sections") def get_sections(self): ret = {} _loaded_sections = copy.deepcopy(self._loaded_sections) for section, tab, endpoint in itertools.chain.from_iterable(hookmanager.trigger("HOOK_MENU_LOAD")): _loaded_sections.setdefault(section, collections.OrderedDict())[tab] = endpoint for section, tabs in _loaded_sections.items(): if section not in self._declared_sections: ret[section] = tabs else: ret[section] = collections.OrderedDict() for name in sorted(tabs.keys(), key=lambda tab: self._declared_sections[section].get(tab, 100)): ret[section][name] = tabs[name] return ret def get_menus(self): return self._menus def get_declared_sections(self): return self._declared_sections def add_section_info(self, section, tab, endpoint, **kwargs): self._loaded_sections.setdefault(section, collections.OrderedDict())[tab] = (endpoint, kwargs) if (section, tab) == self._default_view: self.default_endpoint = endpoint prewikka-5.1.1/prewikka/pluginmanager.py0000664000175000017500000001624613555143652022001 0ustar tandrejatandreja00000000000000# Copyright (C) 2015-2019 CS-SI. All Rights Reserved. # Author: Yoann Vandoorselaere # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from __future__ import absolute_import, division, print_function, unicode_literals import pkg_resources from prewikka import database, error, log, registrar from prewikka.localization import translation logger = log.get_logger(__name__) class PluginBase(registrar.DelayedRegistrar): plugin_name = None plugin_version = None plugin_author = None plugin_license = None plugin_copyright = None plugin_description = None plugin_database_branch = None plugin_database_version = None plugin_database_autoupdate = False plugin_htdocs = None plugin_locale = None plugin_after = [] plugin_require = [] plugin_deprecate = [] plugin_mandatory = False plugin_enabled = True @classmethod def _handle_attributes(cls, autoupdate): if cls.plugin_htdocs: env.htdocs_mapping.update(cls.plugin_htdocs) if cls.plugin_locale: translation.add_domain(*cls.plugin_locale) dh = database.DatabaseUpdateHelper(cls.full_module_name, cls.plugin_database_version, cls.plugin_database_branch, cls.plugin_enabled) if autoupdate or cls.plugin_database_autoupdate: dh.apply() else: dh.check() class PluginPreload(PluginBase): plugin_classes = [] class PluginManager(object): def _add_plugin(self, plugin_class, autoupdate, name=None): plugin_class._handle_attributes(autoupdate) self[name or plugin_class.__name__] = plugin_class @staticmethod def initialize_plugin(plugin_class): try: return plugin_class() except error.PrewikkaUserError as e: plugin_class.error = e logger.warning("%s: plugin loading failed: %s", plugin_class.__name__, e) raise except Exception as e: plugin_class.error = e logger.exception("%s: plugin loading failed: %s", plugin_class.__name__, e) raise @staticmethod def iter_plugins(entrypoint): plist = {} ignore = {} module_map = {} for i in pkg_resources.iter_entry_points(entrypoint): if i.module_name in ignore: continue logger.debug("loading plugin '%s'" % i.name) try: plugin_class = i.load() except Exception as e: logger.exception("%s: %s", i.module_name, e) continue plugin_class.error = None plugin_class._assigned_name = i.name plugin_class.full_module_name = ":".join((plugin_class.__module__, i.attrs[0])) if plugin_class.full_module_name in ignore: continue plist[plugin_class.full_module_name] = plugin_class module_map.setdefault(plugin_class.__module__, {})[plugin_class.full_module_name] = True for j in plugin_class.plugin_deprecate: ignore[j] = True ret = plist.pop(j, None) if ret: continue for mod in module_map.get(j, []): plist.pop(mod) return plist def _handle_preload(self, plugin_class, autoupdate): plugin_class._handle_attributes(autoupdate) for i in plugin_class().plugin_classes: i.full_module_name = ":".join((i.__module__, i.__name__)) self._add_plugin(i, autoupdate) def _load_single(self, plugin_class, autoupdate): try: if issubclass(plugin_class, PluginPreload): self._handle_preload(plugin_class, autoupdate) else: self._add_plugin(plugin_class, autoupdate, name=plugin_class._assigned_name) except error.PrewikkaUserError as e: plugin_class.error = e logger.warning("%s: plugin loading failed: %s", plugin_class.full_module_name, e) return False except Exception as e: plugin_class.error = e logger.exception("%s: plugin loading failed: %s", plugin_class.full_module_name, e) return False return True def _load_plugin_with_dependencies(self, mname, pmap, autoupdate, loaded, deplist): if mname in loaded: return loaded[mname] plugin_class = pmap.get(mname) if not plugin_class: return False if mname in deplist: plugin_class.error = N_("Circular dependencies detected: %s", " -> ".join(deplist + [mname])) logger.warning("%s: plugin loading failed, circular dependencies detected: %s" % (mname, " -> ".join(deplist + [mname]))) return False plist = [(p, True) for p in plugin_class.plugin_require] + [(p, False) for p in plugin_class.plugin_after] ret = self._load_plugin_list(plist, pmap, autoupdate, loaded, deplist + [mname]) if ret is not True: if not plugin_class.error: plugin_class.error = N_("Missing dependency: %s", ret) logger.warning("%s: plugin loading failed: missing dependency '%s'" % (mname, ret)) return False ret = self._load_single(plugin_class, autoupdate) if not ret: return False return True def _load_plugin_list(self, plist, pmap, autoupdate, loaded, deplist): for mname, needed in plist: ret = self._load_plugin_with_dependencies(mname, pmap, autoupdate, loaded, deplist) loaded[mname] = ret if not ret and needed: return mname return True def __init__(self, entrypoint, autoupdate=False): self.__instances = [] self.__dinstances = {} loaded = {} for value in env.all_plugins.values(): for name, plugin in value.items(): loaded[name] = not(plugin.error) plugins = self.iter_plugins(entrypoint) plist = [(p, False) for p in plugins] self._load_plugin_list(plist, plugins, autoupdate, loaded, []) env.all_plugins[entrypoint] = plugins def keys(self): return self.__dinstances.keys() def __iter__(self): return iter(self.__instances) def __setitem__(self, key, value): self.__instances.append(value) self.__dinstances[key.lower()] = value def __getitem__(self, key): return self.__dinstances[key.lower()] def __contains__(self, item): return item in self.__dinstances prewikka-5.1.1/prewikka/registrar.py0000664000175000017500000000311313555143652021137 0ustar tandrejatandreja00000000000000# Copyright (C) 2017-2019 CS-SI. All Rights Reserved. # Author: Yoann Vandoorselaere # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import functools _ATTRIBUTE = "__delayreg__" class DelayedRegistrar(object): @staticmethod def make_decorator(type, regfunc, *args, **kwargs): def indecorator(func): d = getattr(func, _ATTRIBUTE, {}) if not d: setattr(func, _ATTRIBUTE, d) d.setdefault(type, []).append(functools.partial(regfunc, *args, **kwargs)) return func return indecorator def __init__(self, *args, **kwargs): for name in dir(self): if isinstance(getattr(type(self), name, None), property): continue ref = getattr(self, name) for flist in getattr(ref, _ATTRIBUTE, {}).values(): for i in flist: i(ref) prewikka-5.1.1/prewikka/resolve.py0000664000175000017500000001061413555143652020620 0ustar tandrejatandreja00000000000000# Copyright (C) 2008-2019 CS-SI. All Rights Reserved. # Author: Yoann Vandoorselaere # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from __future__ import absolute_import, division, print_function, unicode_literals import socket import time from prewikka import compat resolver = None import_fail = None try: from twisted.internet import reactor from twisted.names import client, dns, cache, resolve except Exception as err: import_fail = err try: from threading import Lock except ImportError: from dummy_threading import Lock class DNSResolver(object): def __init__(self): self._query = 0 self._lock = Lock() self._cache = cache.CacheResolver() rlist = [self._cache, client.Resolver('/etc/resolv.conf')] self._resolve = resolve.ResolverChain(rlist) def _error_cb(self, failure): self._query -= 1 if failure.check(dns.DomainError, dns.AuthoritativeDomainError): return def _resolve_cb(self, tpl, ptr, resolve_cb): ans, auth, add = tpl self._query -= 1 name = str(ans[0].payload.name) resolve_cb(name) q = dns.Query(name, ans[0].type, ans[0].cls) self._cache.cacheResult(q, (ans, auth, add)) def _ip_reverse(self, addr): try: parts = list(socket.inet_pton(socket.AF_INET6, addr).encode('hex_codec')) origin = ".ip6.arpa" except: parts = ["%d" % ord(byte) for byte in socket.inet_aton(addr)] origin = ".in-addr.arpa" parts.reverse() return '.'.join(parts) + origin def process(self, timeout=0): end = now = time.time() final = now + timeout while True: self._lock.acquire() if self._query == 0: self._lock.release() break reactor.runUntilCurrent() reactor.doIteration(timeout) self._lock.release() end = time.time() if end >= final: break # print "max=%f elapsed:%f" % (timeout, end-now) def do_query(self, addr, resolve_cb): self._lock.acquire() self._query += 1 self._resolve.lookupPointer(addr).addCallback(self._resolve_cb, addr, resolve_cb).addErrback(self._error_cb) self._lock.release() self.process() def resolve(self, addr, resolve_cb): try: addr = self._ip_reverse(addr) except: return self.do_query(addr, resolve_cb) self.process() class AddressResolve(object): def _resolve_cb(self, value): if self._formater: value = self._formater(self._addr, value) self._name = value def __init__(self, addr, format=None): global resolver if not isinstance(addr, compat.STRING_TYPES): raise TypeError('AddressResolve expects a valid IP address to resolve') self._addr = addr self._name = None self._formater = format if resolver: resolver.resolve(addr, self._resolve_cb) def __len__(self): return len(str(self)) def resolve_succeed(self): if self._name: return True else: return False def __str__(self): if resolver: resolver.process() return self._name or self._addr def process(timeout=0): global resolver if resolver: resolver.process(timeout) def init(): global resolver if env.dns_max_delay == -1: return if import_fail: env.log.warning(_("Asynchronous DNS resolution disabled: twisted.names and twisted.internet required: %s") % import_fail) return resolver = DNSResolver() prewikka-5.1.1/prewikka/resource.py0000664000175000017500000001107713555143652020774 0ustar tandrejatandreja00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2016-2019 CS-SI. All Rights Reserved. # Author: Antoine Luong # # Inspired by the tw2.core package of ToscaWidgets2 which is Copyright (c) # 2006-2013, Paul Johnston, Christopher Perkins, Alberto Valverde González # and contributors. # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from __future__ import absolute_import, division, print_function, unicode_literals import functools from prewikka.utils import html, json class Link(html.Markup): """ A link to an external resource, like a JS or CSS file. """ pass class CSSLink(Link): """ A link to an external CSS file. """ def __new__(cls, link): return Link.__new__(cls, html.Markup('') % link) class JSLink(Link): """ A link to an external JS file. """ def __new__(cls, link): return Link.__new__(cls, html.Markup('') % link) class HTMLSource(html.Markup): pass class CSSSource(HTMLSource): """ An inlined chunk of CSS source code. """ def __new__(cls, src): return HTMLSource.__new__(cls, html.Markup('' % src)) class JSSource(HTMLSource): """ An inlined chunk of JS source code. """ def __new__(cls, src): return HTMLSource.__new__(cls, html.Markup('' % src)) @functools.total_ordering class HTMLNode(json.JSONObject): _HTML5_VOID_TAGS = frozenset(["area", "base", "br", "col", "embed", "hr", "img", "input", "keygen", "link", "meta", "param", "source", "track", "wbr"]) def __init__(self, tag, *childs, **attrs): self.tag = tag self.childs = childs icon = attrs.pop("_icon", None) if icon: self.childs = (HTMLNode("i", _class="fa %s" % icon), " ") + self.childs self._sortkey = attrs.pop("_sortkey", "") self._extra = attrs.pop("_extra", None) tmp = attrs.pop("_class", None) if tmp: attrs["class"] = tmp self.attrs = attrs def to_string(self, _class=""): attr_s = HTMLSource() for k, v in self.attrs.items(): if k == "class": _class += " %s" % v continue if v is True: attr_s += HTMLSource(" %s" % k) elif v not in (False, None): attr_s += HTMLSource(" %s=\"%s\"") % (k, v) if _class: attr_s = HTMLSource(" class=\"%s\"") % (_class) + attr_s childs = HTMLSource() for x in self.childs: childs += text_type(x) if not self.tag: return HTMLSource("%s" % childs) if self.tag in self._HTML5_VOID_TAGS: if self.childs: raise Exception("HTMLNode with void tag '%s' contains children" % self.tag) return HTMLSource("<%s%s />" % (self.tag, attr_s)) return HTMLSource("<%s%s>%s" % (self.tag, attr_s, childs, self.tag)) def join(self, l): ret = HTMLNode("") for i, elem in enumerate(l): if i > 0: ret += self ret += elem return ret def format(self, *args, **kwargs): return self.to_string().format(*args, **kwargs) def __json__(self): return {"tag": self.tag, "childs": self.childs, "attrs": self.attrs, "extra": self._extra} def __html__(self): return self.to_string() def __str__(self): return self.to_string() def __mod__(self, other): return self.to_string() % other def __add__(self, other): return HTMLNode(None, self, other) def __eq__(self, other): return (self._sortkey, self.childs) == (other._sortkey, other.childs) def __lt__(self, other): return (self._sortkey, self.childs) < (other._sortkey, other.childs) prewikka-5.1.1/prewikka/response.py0000664000175000017500000002024413555143652020777 0ustar tandrejatandreja00000000000000# Copyright (C) 2004-2019 CS-SI. All Rights Reserved. # Author: Nicolas Delon # Author: Yoann Vandoorselaere # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from __future__ import absolute_import, division, print_function import collections import mimetypes import os import time import datetime import dateutil.parser import stat import string import unicodedata from prewikka import compat, utils from prewikka.utils import json _sentinel = object() _ADDITIONAL_MIME_TYPES = [("application/vnd.oasis.opendocument.formula-template", ".otf"), ("application/vnd.ms-fontobject", ".eot"), ("image/vnd.microsoft.icon", ".ico"), ("application/font-woff", ".woff"), ("application/font-sfnt", ".ttf"), ("application/json", ".map"), ("font/woff2", ".woff2")] for mtype, extension in _ADDITIONAL_MIME_TYPES: mimetypes.add_type(mtype, extension) class PrewikkaResponse(object): """ HTML response Use this class to render HTML in your view. :param data: Data of the response :param int code: HTTP response code :param str status_text: HTTP response status text If the type of data is a dict, it will be cast in a JSON string """ def __init__(self, data=None, headers=_sentinel, code=None, status_text=None): self.data = data self.code = code self.status_text = status_text self.ext_content = {} if headers is not _sentinel: self.headers = headers else: self.headers = collections.OrderedDict( ( ("Content-Type", "text/html"), ("Last-Modified", time.strftime("%a, %d %b %Y %H:%M:%S GMT", time.gmtime())), ("Expires", "Fri, 01 Jan 1999 00:00:00 GMT"), ("Cache-control", "no-store, no-cache, must-revalidate"), ("Cache-control", "post-check=0, pre-check=0"), ("Pragma", "no-cache"), ) ) def add_ext_content(self, key, value): """Add an extra content to the response (add in XHR request).""" self.ext_content[key] = value return self def add_html_content(self, elem, target=None): self.ext_content.setdefault("html_content", []).append({"target": target, "html": elem}) return self def add_notification(self, message, classname="success", name=None, icon=None, duration=None): """Add notification to the return value.""" self.ext_content.setdefault("notifications", []).append({ "message": message, "classname": classname, "name": name, "icon": icon, "duration": duration }) return self def content(self): if self.data is None: if not self.ext_content: return None self.data = {} if isinstance(self.data, compat.STRING_TYPES): return self.data self.headers["Content-Type"] = "application/json" if isinstance(self.data, dict): self.data["_extensions"] = self.ext_content return json.dumps(self.data) def _encode_response(self, res): return res.encode(env.config.general.get("encoding", "utf8"), "xmlcharrefreplace") def write(self, request): content = self.content() if content is None and self.code is None: self.code = 204 request.send_headers(self.headers.items(), self.code or 200, self.status_text) if content is not None: request.write(self._encode_response(content)) class PrewikkaDownloadResponse(PrewikkaResponse): """ File Download Response Use this class for download response (pdf, csv, ...). :param str data: The inner content of the file, or a file object :param str filename: Name for the file to be downloaded :param str type: Type of the file as mime type (will try to guess if None) :param int size: Size of the data (will be computed automatically if None) :param bool inline: Whether to display the downloaded file inline """ @staticmethod def _filename_to_ascii(filename): filename = unicodedata.normalize('NFKC', filename) return ''.join((i if i in string.printable else '-' for i in filename)) def __init__(self, data, filename=None, type=None, size=None, inline=False): PrewikkaResponse.__init__(self, data) if filename and not type: type = mimetypes.guess_type(filename)[0] if not type: type = "application/octet-stream" disposition = "inline" if inline else "attachment" if filename: # As specified in RFC 6266 disposition += "; filename=\"%s\"; filename*=utf-8''%s" % ( self._filename_to_ascii(filename), utils.url.quote(filename.encode("utf8")) ) self._is_file = not(isinstance(self.data, text_type)) if not size: if self._is_file: size = os.fstat(self.data.fileno()).st_size else: size = len(data) self.headers.update(( ("Content-Type", type), ("Content-Length", str(size)), ("Content-Disposition", disposition), ("Pragma", "public"), ("Cache-Control", "max-age=0") )) def write(self, request): request.send_headers(self.headers.items(), self.code or 200, self.status_text) if not self._is_file: request.write(self.data) else: for i in iter(lambda: self.data.read(8192), b''): request.write(i) class PrewikkaFileResponse(PrewikkaResponse): """ Static File response """ def __init__(self, path): PrewikkaResponse.__init__(self) self._path = path fst = os.stat(path) if not stat.S_ISREG(fst.st_mode): raise Exception("Attempt to send an invalid file") content_type = mimetypes.guess_type(path)[0] or "application/octet-stream" mtime = datetime.datetime.utcfromtimestamp(fst.st_mtime).replace(tzinfo=utils.timeutil.tzutc()) ims = env.request.web.headers.get("if-modified-since") if ims is not None: ims = dateutil.parser.parse(ims.split(";")[0]) # Edge includes the length in this header if mtime <= ims: self.code = 304 self.headers = collections.OrderedDict((('Content-Type', content_type),)) if self.code != 304: self.headers["Content-Length"] = str(fst.st_size) self.headers["Expires"] = (mtime + datetime.timedelta(days=30)).strftime("%a, %d %b %Y %H:%M:%S GMT") self.headers["Last-Modified"] = mtime.strftime("%a, %d %b %Y %H:%M:%S GMT") def write(self, request): request.send_headers(self.headers.items(), self.code or 200, self.status_text) if self.code == 304: return with open(self._path, 'rb') as fd: for i in iter(lambda: fd.read(8192), b''): request.write(i) class PrewikkaRedirectResponse(PrewikkaResponse): """ Redirect response """ def __init__(self, location, code=302, status_text=None): PrewikkaResponse.__init__(self, code=code, status_text=status_text) self.headers = collections.OrderedDict((('Location', location),)) prewikka-5.1.1/prewikka/statistics.py0000664000175000017500000002465713555143652021347 0ustar tandrejatandreja00000000000000# Copyright (C) 2015-2019 CS-SI. All Rights Reserved. # Author: Yoann Vandoorselaere # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from __future__ import absolute_import, division, print_function, unicode_literals import collections import functools from prewikka import dataprovider, hookmanager, localization, mainmenu, usergroup, utils from prewikka.dataprovider import Criterion from prewikka.renderer import RendererItem class Query(object): def __init__(self, **kwargs): keys = ["datatype", "path", "aggregate", "limit", "order", "criteria"] datatype, path, aggregate, limit, order, criteria = [kwargs.get(i) for i in keys] if isinstance(path, list): self.paths = path else: self.paths = [path] if path else [] self.datatype = datatype self.aggregation = aggregate self.limit = int(limit or env.request.parameters["limit"]) self.order = order or "desc" self.criteria = criteria or Criterion() class GenericChart(object): default_aggregation = None default_link_mode = "immediate" def __init__(self, chart_type, title, query, **options): self.chart_type = chart_type self.title = title self.query = query self.options = options self._set_menu() self._link_mode = options.pop("linkmode", self.default_link_mode) self._link_view = options.pop("linkview", None) self._link_params = options.pop("linkparams", {}) def _make_link(self, force_default=False, **params): if self._link_mode is None: return None elif self._link_mode == "immediate": linkview = self._link_view or self._default_view elif self._link_mode == "zoom": linkview = (self._link_view or env.request.view) if not(force_default) else self._default_view if not linkview: return None if self._link_view and self._link_params: params.pop("criteria") # Since the calling view provides its own parameters, we should not pass criteria params.update(self._link_params) return linkview.make_url(**params) def _set_menu(self): period = self.options.get("period") if not period: self._menu = env.request.menu else: parameters = { "mode": "relative", "value": 1, "unit": "month" } parameters.update(period) self._menu = mainmenu.TimePeriod(dict(("timeline_%s" % k, v) for k, v in parameters.items())) def _prepare_query(self, query): query.aggregation = query.aggregation or self.default_aggregation if query.aggregation: all_paths = ["%s/order_%s" % (query.aggregation, query.order)] all_paths += ["%s/group_by" % path for path in query.paths] else: all_paths = ["{backend}.{start_time_field}/order_%s" % query.order] + query.paths if not query.datatype: query.datatype = env.dataprovider.guess_datatype(all_paths, query.criteria, default=None) self._default_view = env.viewmanager.get(datatype=query.datatype, keywords=["listing"]) if self._default_view: self._default_view = self._default_view[-1] list(hookmanager.trigger("HOOK_CHART_PREPARE", query, self.options)) all_criteria = self._menu.get_criteria() & query.criteria return all_paths, all_criteria def _query(self, paths, criteria, **kwargs): try: return env.dataprovider.query(paths, criteria, **kwargs) except (usergroup.PermissionDeniedError, dataprovider.NoBackendError): return [] def get_data(self): pass def render(self): self.data = self.get_data() self.options.pop("owner", None) return env.renderer.render(self.chart_type, self.data, query=self.query, **self.options) class DiagramChart(GenericChart): TYPES = ["pie", "bar", "horizontal-bar", "radar", "polar", "doughnut", "line", "table"] default_aggregation = "count(1)" def _get_series(self, query): for value, label, crit in self._get_categories(query): link = self._make_link(criteria=crit & query.criteria, **self._menu.get_parameters()) yield RendererItem(value, label, link) def _get_categories(self, query): all_paths, all_criteria = self._prepare_query(query) for row in self._query(all_paths, all_criteria, limit=query.limit, type=query.datatype): value = row[0] labels = [localization.format_value(i) for i in row[1:]] label = labels if self.chart_type == "table" else ", ".join(labels) crit = functools.reduce(lambda x, y: x & y, (Criterion(path, '=', row[i + 1]) for i, path in enumerate(query.paths))) yield value, label, crit def get_data(self): if len(self.query) == 1: return [list(self._get_series(self.query[0]))] data = [] subquery = self.query[1] base_criteria = subquery.criteria self.options["subtitle"] = [] for value, label, crit in self._get_categories(self.query[0]): subquery.criteria = crit & base_criteria subchart = DiagramChart(self.chart_type, label, [subquery], period=self.options.get("period")) data.append(subchart.get_data()[0]) self.options["subtitle"].append(label) return data class ChronologyChart(GenericChart): TYPES = ["timeline", "timearea", "timebar"] default_aggregation = "count(1)" default_link_mode = "zoom" _number_of_points = 100 def _get_series(self, query, selection, date_precision): selection_index = len(query.paths) + 1 all_paths, all_criteria = self._prepare_query(query) crit = Criterion() if query.limit > 0 and query.paths: for values in self._query(all_paths, all_criteria, limit=query.limit, type=query.datatype): crit |= functools.reduce(lambda x, y: x & y, (Criterion(query.paths[i], "=", value) for i, value in enumerate(values[1:]))) res = [] if query.limit != 0: res = self._query(all_paths + selection, all_criteria + crit, type=query.datatype) out = {} for i in res: label = ", ".join((localization.format_value(j) for j in i[1:selection_index])) or self.title tval = tuple((int(x) for x in i[selection_index:])) out.setdefault(label, {})[tval[:date_precision]] = i[0] return out def _ctime_as_timezone(self): if env.request.user.timezone.zone == "UTC": return "{backend}.{time_field}" else: return "timezone({backend}.{time_field}, '%s')" % (env.request.user.timezone.zone) def _gen_selection(self, time_unit): selection = [] for idx, unit in enumerate(range(int(mainmenu.TimeUnit(time_unit) + 1))): selection += ["%s:%s/order_desc,group_by" % (self._ctime_as_timezone(), mainmenu.TimeUnit(unit).dbunit)] return idx + 1, selection @staticmethod def _get_default_value(datatype): return None if env.dataprovider.is_continuous(datatype) else 0 def get_data(self): data, date_precision, base_parameters = self._prepare_timeline() step = self._menu.get_step(self._number_of_points) can_zoom = mainmenu.TimeUnit(step.unit) > mainmenu.TimeUnit("minute") out = collections.OrderedDict() links = [] legends = [] if len(self.query) == 1: default = self._get_default_value(self.query[0].datatype) default_values = {key: default for key in data} else: default_values = {key: self._get_default_value(self.query[i].datatype) for i, key in enumerate(data)} start = self._menu.start while start < self._menu.end: next = utils.timeutil.truncate(start + step.timedelta, step.unit) next = min(next, self._menu.end) if base_parameters: base_parameters["timeline_start"] = self._menu.mktime_param(start) base_parameters["timeline_end"] = self._menu.mktime_param(next) if next != self._menu.end: base_parameters["timeline_end"] -= 1 ret = self._make_link(force_default=not(can_zoom), criteria=self.query[0].criteria, **base_parameters) if ret: links.append(ret) key = start.timetuple()[:date_precision] for i in data.keys(): out.setdefault(i, []).append(data[i].get(key, default_values[i])) legends.append(start.strftime(step.unit_format)) start = next self.options["xlegend"] = legends return [RendererItem(labels=name, values=value, links=links) for name, value in out.items()] def _prepare_timeline(self): step = self._menu.get_step(self._number_of_points) date_precision, selection = self._gen_selection(step.unit) if len(self.query) == 1: data = self._get_series(self.query[0], selection, date_precision) else: data = collections.OrderedDict() for query in self.query: series = self._get_series(query, selection, date_precision).get(self.title, {}) legend = query.aggregation.replace("(1)", "(%s)" % query.datatype) data[legend] = series if self.options.get("period"): # Do not allow zooming when the time period is defined base_parameters = None else: base_parameters = self._menu.get_parameters() base_parameters["timeline_mode"] = "custom" return (data, date_precision, base_parameters) prewikka-5.1.1/prewikka/template.py0000664000175000017500000000701613555143652020756 0ustar tandrejatandreja00000000000000# Copyright (C) 2014-2019 CS-SI. All Rights Reserved. # Author: Yoann Vandoorselaere # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from __future__ import absolute_import, division, print_function, unicode_literals import collections import os.path import mako.exceptions import mako.lookup import mako.template import pkg_resources from prewikka import siteconfig from prewikka.utils import cache _MAKO_FILTERS = ["html.escape"] _MAKO_GENERIC_ARGS = { "default_filters": _MAKO_FILTERS, "buffer_filters": _MAKO_FILTERS, "input_encoding": 'utf8', "imports": [ 'from prewikka.utils import html, json', 'from prewikka.utils.html.helpers import checked, disabled, selected, csrftoken' ], "future_imports": ["unicode_literals"], "module_directory": os.path.join(siteconfig.tmp_dir, "mako") } _MODULE_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir)) _MAKO_TEMPLATE_LOOKUP = mako.lookup.TemplateLookup(directories=[_MODULE_PATH], **_MAKO_GENERIC_ARGS) # We cannot inherit dict directly because it's __json__() method would never be called. Simplejson # only call the user provided encoding callback when the object is not known to be serializable. class _Dataset(collections.MutableMapping): def __init__(self, template, *args, **kwargs): self._d = dict(*args, **kwargs) self._template = template def render(self): return self._template.render(**self._d) def __json__(self): return self.render() def __len__(self): return self._d.__len__() def __setitem__(self, key, value): return self._d.__setitem__(key, value) def __getitem__(self, key): return self._d.__getitem__(key) def __delitem__(self, key): return self._d.__delitem__(key) def __iter__(self): return self._d.__iter__() class _PrewikkaTemplate(object): def dataset(self, *args, **kwargs): return _Dataset(self, *args, **kwargs) def __init__(self, *args): if len(args) == 2: self._name = pkg_resources.resource_filename(*args) else: self._name = args[0] self._error = None try: self._template = mako.template.Template(filename=self._name, lookup=_MAKO_TEMPLATE_LOOKUP, **_MAKO_GENERIC_ARGS) except Exception as e: self._error = e def __json__(self): return self._template.render() def render(self, **kwargs): if self._error: raise self._error return self._template.render(**kwargs) class _PrewikkaTemplateProxy(object): @cache.memoize("cache") def __call__(self, *args): return _PrewikkaTemplate(*args) @classmethod def __instancecheck__(cls, instance): return isinstance(instance, (_PrewikkaTemplate, _Dataset)) PrewikkaTemplate = _PrewikkaTemplateProxy() prewikka-5.1.1/prewikka/theme.py0000664000175000017500000000231713555143652020244 0ustar tandrejatandreja00000000000000# Copyright (C) 2014-2019 CS-SI. All Rights Reserved. # Author: Antoine Luong # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from __future__ import absolute_import, division, print_function, unicode_literals import glob import os import pkg_resources def get_themes(): theme_list = [] css_files = glob.glob(pkg_resources.resource_filename(__name__, "htdocs/css/themes/*.css")) for css in css_files: theme_list.append(os.path.basename(css)[:-4]) theme_list.sort() return theme_list prewikka-5.1.1/prewikka/usergroup.py0000664000175000017500000002057013555143652021176 0ustar tandrejatandreja00000000000000# Copyright (C) 2004-2019 CS-SI. All Rights Reserved. # Author: Yoann Vandoorselaere # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from __future__ import absolute_import, division, print_function, unicode_literals import abc import copy import hashlib from prewikka import compat, error, hookmanager, localization, log, utils from prewikka.utils import cache, json ADMIN_LOGIN = "admin" _NAMEID_TBL = {} class UnknownNameIDError(KeyError): pass class PermissionDeniedError(error.PrewikkaUserError): def __init__(self, permissions, view=None): if isinstance(permissions, compat.STRING_TYPES): permissions = [permissions] if view and permissions: msg = N_("Access to view '%(view)s' forbidden. Required permissions: %(permissions)s", {"view": view, "permissions": ", ".join(permissions)}) elif view: msg = N_("Access to view '%s' forbidden", view) else: msg = N_("Required permissions: %s", ", ".join(permissions)) error.PrewikkaUserError.__init__(self, N_("Permission Denied"), msg, log_priority=log.WARNING) def permissions_required(permissions): ALL_PERMISSIONS.declare(permissions) def has_permissions(func): def wrapper(*args, **kwargs): if env.request.user: env.request.user.check(permissions) return func(*args, **kwargs) return wrapper return has_permissions class Permissions(set): """ List of all the permissions available """ def declare(self, permission): """Add the permission to the set if it is not already declared""" if isinstance(permission, compat.STRING_TYPES): self.add(permission) else: self.update(permission) ALL_PERMISSIONS = Permissions() ACTIVE_PERMISSIONS = Permissions() class NameID(object): __metaclass__ = abc.ABCMeta def __init__(self, name=None, nameid=None): assert(name or nameid) self._id = nameid self._name = name @property def id(self): if self._id is None: self._id = self._name2id(self._name) return self._id @property def name(self): if self._name is None: self._name = self._id2name(self._id) return self._name @abc.abstractmethod def _id2name(self, id): pass def _name2id(self, name): md5 = _NAMEID_TBL.get(name) if md5: return md5 md5 = _NAMEID_TBL[name] = hashlib.md5(name.encode("utf8")).hexdigest() return md5 def __eq__(self, other): if not other: return False return self.id == other.id def __ne__(self, other): return not (self == other) def __hash__(self): return int(self.id, 16) def __str__(self): return self.name def __repr__(self): try: name = self.name except UnknownNameIDError: return "%s(id=%s)" % (self.__class__.__name__, self.id) return "%s(name=%s, id=%s)" % (self.__class__.__name__, name, self.id) class Group(NameID): def __init__(self, name=None, groupid=None): NameID.__init__(self, name, groupid) def _id2name(self, id): group = env.auth.get_group_by_id(id) if not group: raise UnknownNameIDError(id) return group.name def create(self): env.auth.create_group(self) list(hookmanager.trigger("HOOK_GROUP_CREATE", self)) def delete(self): list(hookmanager.trigger("HOOK_GROUP_DELETE", self)) env.auth.delete_group(self) class User(NameID): __sentinel = object() def __init__(self, login=None, userid=None): self._orig_configuration = None NameID.__init__(self, login, userid) def _id2name(self, id): user = env.auth.get_user_by_id(id) if not user: raise UnknownNameIDError(id) return user.name @cache.request_memoize_property("user_permissions") def permissions(self): return set(env.auth.get_user_permissions(self)) @permissions.setter def permissions(self, permissions): env.auth.set_user_permissions(self, permissions) def _permissions(self, permissions): self.permissions # make sure the cache has been created env.request.cache.user_permissions._set((self,), set(permissions)) # Support access to _permissions to modify object permission without backend modification. _permissions = property(permissions, _permissions) @property def configuration(self): ret = self._configuration() if self._orig_configuration is None: self._orig_configuration = copy.deepcopy(ret) return ret @cache.request_memoize("user_configuration") def _configuration(self): rows = env.db.query("SELECT config FROM Prewikka_User_Configuration WHERE userid = %s", self.id) if rows: return json.loads(rows[0][0]) else: return {} @configuration.setter def configuration(self, conf): env.request.cache.user_configuration._set((self,), conf) @cache.request_memoize_property("user_timezone") def timezone(self): return utils.timeutil.timezone(self.get_property("timezone", default=env.config.general.default_timezone)) def set_locale(self): lang = self.get_property("language", default=env.config.general.default_locale) if lang: localization.set_locale(lang) def del_property(self, key, view=None): view = view or "" if not key: self.configuration.pop(view, None) else: self.configuration.get(view, {}).pop(key, None) def del_properties(self, view): self.configuration.pop(view, None) def del_property_match(self, key, view=None): view = view or "" viewlist = [view] if view else self.configuration.keys() for v in viewlist: if v not in self.configuration: continue for k in self.configuration[v].keys(): if k.find(key) != -1: self.del_property(k, view=v) def get_property_fail(self, key, view=None, default=__sentinel): view = self.configuration.get(view or "", {}) if default is not self.__sentinel: return view.get(key, default) return view[key] def has_property(self, key, view=None): return key in self.configuration.get(view or "", {}) def get_property(self, key, view=None, default=None): return self.get_property_fail(key, view or "", default) def set_property(self, key, value, view=None): self.configuration.setdefault(view or "", {})[key] = value def sync_properties(self): if self._orig_configuration is not None and self._orig_configuration != self.configuration: self._orig_configuration = copy.deepcopy(self.configuration) env.db.upsert("Prewikka_User_Configuration", ["userid", "config"], [[self.id, json.dumps(self.configuration)]], pkey=("userid",)) if env.request.user == self: env.request.user = self def has(self, perm): if type(perm) in (list, tuple, set): return self.permissions.issuperset(perm) return perm in self.permissions def check(self, perm, view=None): if not self.has(perm): raise PermissionDeniedError(perm, view) def create(self): env.auth.create_user(self) list(hookmanager.trigger("HOOK_USER_CREATE", self)) def delete(self): list(hookmanager.trigger("HOOK_USER_DELETE", self)) env.db.query("DELETE FROM Prewikka_User_Configuration WHERE userid = %s", self.id) env.auth.delete_user(self) prewikka-5.1.1/prewikka/version.py0000664000175000017500000000045613555143652020631 0ustar tandrejatandreja00000000000000from __future__ import absolute_import, division, print_function, unicode_literals import pkg_resources __version__ = pkg_resources.get_distribution("prewikka").version __version_info__ = __version__.split(".") __branch__ = "5.1" __author__ = "Prelude Team" __license__ = "GPL" __copyright__ = "CSSI" prewikka-5.1.1/prewikka/view.py0000664000175000017500000005407213555143652020121 0ustar tandrejatandreja00000000000000# Copyright (C) 2004-2019 CS-SI. All Rights Reserved. # Author: Nicolas Delon # Author: Yoann Vandoorselaere # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from __future__ import absolute_import, division, print_function, unicode_literals import sys from copy import copy from prewikka import compat, csrf, error, hookmanager, log, mainmenu, pluginmanager, registrar, response, template, usergroup, utils import werkzeug.exceptions from werkzeug.routing import Map, Rule, BaseConverter if sys.version_info >= (3, 0): import builtins else: import __builtin__ as builtins _SENTINEL = object() _URL_ADAPTER_CACHE = {} _ROUTE_OVERRIDE_TYPE = ("make_url", "make_parameters", "check_permissions") logger = log.get_logger(__name__) def check_permissions(user, users=([], []), groups=([], []), others=[]): if user: if user in users[0]: return user.has(users[1]) if groups[0] and set(env.auth.get_member_of(user)) & set(groups[0]): return user.has(groups[1]) if others: return user.has(others) # If there is no users / groups / others permission defined, then it is considered public and we return True # Otherwise, if any kind of permission is defined and there was no match, return False. return not(users[0] or groups[0] or others) def route_override(endpoint, type): assert(type in _ROUTE_OVERRIDE_TYPE) def decorator(func): env.viewmanager._route_override.setdefault(type, {})[endpoint] = func return decorator class ParameterError(Exception): pass class InvalidParameterError(error.PrewikkaUserError): def __init__(self, name): error.PrewikkaUserError.__init__(self, N_("Parameters Normalization failed"), N_("Parameter '%s' is not valid", name), log_priority=log.WARNING) class InvalidParameterValueError(error.PrewikkaUserError): def __init__(self, name, value): error.PrewikkaUserError.__init__(self, N_("Parameters Normalization failed"), N_("Invalid value '%(value)s' for parameter '%(name)s'", {'value': value, 'name': name}), log_priority=log.WARNING) class MissingParameterError(error.PrewikkaUserError): def __init__(self, name): error.PrewikkaUserError.__init__(self, N_("Parameters Normalization failed"), N_("Required parameter '%s' is missing", name), log_priority=log.WARNING) class InvalidMethodError(error.PrewikkaUserError): def __init__(self, message, log_priority=None, **kwargs): error.PrewikkaUserError.__init__(self, N_("Invalid method"), message, log_priority=log.ERROR, **kwargs) class InvalidViewError(error.PrewikkaUserError): code = 404 def __init__(self, message, log_priority=None, **kwargs): error.PrewikkaUserError.__init__(self, N_("Invalid view"), message, log_priority=log.ERROR, **kwargs) class ListConverter(BaseConverter): def to_python(self, value): return value.split(',') def to_url(self, values): return ','.join(BaseConverter.to_url(self, value) for value in values) class ParameterDesc(object): """ Describe a HTTP parameter """ def __init__(self, name, type, mandatory=False, default=None, save=False, general=False, persist=False): """ Args : name : Name of the parameter type : Type of the parameter (int, str, list, ...) mandatory : True if the parameter is mandatory default : Specify a default value save : True if the parameter is store in BDD to when set general : True if the parameter is available for all the view """ self.name = name self.save = save or persist self.persist = persist self.general = general self.default = default self.mandatory = mandatory if type is list: self.type = [text_type] else: self.type = type def has_default(self): """ Return True if this parameter has a default value """ return self.default is not None def _mklist(self, value): """ Return the value as a list """ if not isinstance(value, list): return [value] return value def parse(self, value): """ Return the value according to the parameter's type """ try: if isinstance(self.type, list): value = [self.type[0](i) for i in self._mklist(value)] else: value = self.type(value) except (ValueError, TypeError): raise InvalidParameterValueError(self.name, value) return value class Parameters(dict): allow_extra_parameters = True def __init__(self, view, _save=True, **kwargs): dict.__init__(self, **kwargs) self.view = view self._save = _save self._hard_default = {} self._default = {} self._parameters = {} self.register() def register(self): pass def mandatory(self, name, type): self._parameters[name] = ParameterDesc(name, type, mandatory=True, save=True) def optional(self, name, type, default=None, save=False, general=False, persist=False): if default is not None: self._default[name] = self._hard_default[name] = default self._parameters[name] = ParameterDesc(name, type, mandatory=False, default=default, save=save, general=general, persist=persist) def normalize(self): do_update = self._save and env.request.web.method == "PATCH" do_save = self._save and env.request.web.method in ("POST", "PUT", "PATCH") for name, value in self.items(): param = self._parameters.get(name) if not param: if not(self.allow_extra_parameters): raise InvalidParameterError(name) continue value = param.parse(value) if env.request.user and param.save and do_save: env.request.user.set_property(name, value, self.view.view_endpoint if not(param.general) else None) self[name] = value # Go through unset parameters. # - Error out on mandatory parameters, # - Load default value for optional parameters that got one. # - Load last user value for parameter. for name in set(self._parameters.keys()) - set(self.keys()): param = self._parameters[name] if param.mandatory: raise MissingParameterError(name) elif param.has_default(): self[name] = param.default if not param.save or not env.request.user: continue if param.general: save_view = "" else: save_view = self.view.view_endpoint if do_save and not(param.persist) and not do_update: env.request.user.del_property(name, view=save_view) if name not in env.request.user.configuration.get(save_view, {}): continue value = env.request.user.get_property(name, view=save_view) self._default[name] = value self[name] = value # In case the view was dynamically added through HOOK_VIEW_LOAD, the hook isn't available list(hookmanager.trigger("HOOK_%s_PARAMETERS_NORMALIZE" % self.view.view_endpoint.upper(), self)) def __getitem__(self, key): try: return dict.__getitem__(self, key) except KeyError: raise MissingParameterError(key) def __add__(self, src): dst = copy(self) dst.update(src) return dst def __sub__(self, keys): new = copy(self) for key in keys: try: del new[key] except KeyError: pass return new def copy(self): new = self.__class__() new.update(self) return new def get(self, key, default=None, type=lambda x: x): ret = dict.get(self, key, default) if ret is None: return ret try: if isinstance(ret, list): return [type(i) for i in ret] else: return type(ret) except ValueError: raise InvalidParameterValueError(key, ret) def getlist(self, key, type=lambda x: x): ret = self.get(key, default=[], type=type) if not isinstance(ret, list): raise InvalidParameterValueError(key, ret) return ret def pop(self, key, default=None, type=lambda x: x): ret = self.get(key, default, type) dict.pop(self, key, None) return ret class GeneralParameters(Parameters): def register(self): Parameters.register(self) mainmenu._register_parameters(self) def __init__(self, vobj, kw): # Only allow parameters saving if the view is a primary route (has a view_menu entry) Parameters.__init__(self, vobj, _save=bool(vobj.view_menu), **kw) self.normalize() class ViewResponse(response.PrewikkaResponse): def __init__(self, data, **kwargs): response.PrewikkaResponse.__init__(self, {"type": "content", "content": data}) menu = kwargs.get("menu", mainmenu.HTMLMainMenu() if env.request.has_menu else None) if menu: self.add_ext_content("menu", menu) view_help = env.request.view.view_help if view_help: if view_help.startswith(("http://", "https://")): self.add_ext_content("help", view_help) elif env.config.general.get("help_location"): self.add_ext_content("help", url_for("baseview.help", path=view_help)) class _ViewDescriptor(object): view_parameters = Parameters view_template = None view_require_session = True view_layout = "BaseView.render" view_endpoint = None view_datatype = None view_priority = 0 view_keywords = set() view_help = None view_menu = [] view_label = None view_permissions = [] view_users = [] view_users_permissions = [] view_groups = [] view_groups_permissions = [] view_csrf_exempt = False @property def view_others_permissions(self): return self.view_permissions @view_others_permissions.setter def view_others_permissions(self, permissions): self.view_permissions = permissions @classmethod def _handle_attributes(cls, *args): for permission in cls.view_permissions: usergroup.ALL_PERMISSIONS.declare(permission) pluginmanager.PluginBase._handle_attributes.__func__(cls, *args) def __init__(self, baseview=None): if baseview: self.view_base = baseview self.view_id = baseview.view_id self.view_template = baseview.view_template self.view_users = baseview.view_users self.view_groups = baseview.view_groups self.view_layout = baseview.view_layout self.view_require_session = baseview.view_require_session self.view_help = baseview.view_help self.view_permissions = baseview.view_permissions self.view_parameters = baseview.view_parameters self._criteria_to_urlparams = baseview._criteria_to_urlparams self.view_users = set(self.view_users) self.view_groups = set(self.view_groups) self.view_permissions = set(self.view_permissions) def _setup_dataset_default(self, dataset): dataset["document"] = utils.AttrObj() dataset["document"].base_url = utils.iri2uri(env.request.web.get_baseurl()) dataset["document"].href = utils.iri2uri(env.request.web.get_uri()) def _render(self): self.process_parameters() if self.view_template: env.request.dataset = self.view_template.dataset() if env.request.dataset is not None: self._setup_dataset_default(env.request.dataset) return self.render(**env.request.view_kwargs) or env.request.dataset def process_parameters(self): if self.view_parameters: env.request.parameters = self.view_parameters(self, **env.request.web.arguments) env.request.parameters.normalize() def respond(self): env.log.info("Loading view %s, endpoint %s" % (self.__class__.__name__, self.view_endpoint)) resp = self._render() if isinstance(resp, (template._Dataset, compat.STRING_TYPES)): resp = ViewResponse(resp) elif not(resp) or not issubclass(resp.__class__, response.PrewikkaResponse): # Any other type (eg: dict) resp = response.PrewikkaResponse(resp) if self.view_endpoint: list(hookmanager.trigger("HOOK_VIEW_%s_RESPONSE" % self.view_endpoint.upper(), resp)) if resp.data: resp.add_ext_content("_source", self.view_endpoint) return resp def _criteria_to_urlparams(self, criteria): return {} def _call_override(self, _type, *args, **kwargs): f = env.viewmanager._route_override[_type].get(self.view_endpoint) if f: return f(self.view_base, *args, **kwargs) return getattr(self.view_base, _type)(*args, _view_descriptor=self, **kwargs) def make_parameters(self, **kwargs): return self._call_override("make_parameters", **kwargs) def make_url(self, **kwargs): return self._call_override("make_url", **kwargs) def check_permissions(self, userl, fail=False, view_kwargs={}): ret = self._call_override("check_permissions", userl, view_kwargs=view_kwargs) if fail and not ret: raise usergroup.PermissionDeniedError(None, env.request.web.path) return ret def __repr__(self): return "_ViewDescriptor(%s)" % self.view_endpoint class _View(_ViewDescriptor, registrar.DelayedRegistrar): view_id = None def render(self): pass def __init__(self): if not self.view_id: self.view_id = self.__class__.__name__.lower() # Avoid initializing DelayedRegistrar twice in case we're a View. if not isinstance(self, View): registrar.DelayedRegistrar.__init__(self) _ViewDescriptor.__init__(self) def make_parameters(self, _view_descriptor=None, criteria=None, **kwargs): values = {} view = _view_descriptor or self if criteria: kwargs.update(view._criteria_to_urlparams(criteria)) for k, v in kwargs.items(): key = "%s[]" % k if isinstance(v, list) else k values[key] = v return values def make_url(self, _view_descriptor=None, **kwargs): view = _view_descriptor or self return env.viewmanager.url_adapter.build(view.view_endpoint, values=self.make_parameters(**kwargs)) def check_permissions(self, user, _view_descriptor=None, fail=False, view_kwargs={}): view = _view_descriptor or self ret = check_permissions(user, (view.view_users, view.view_users_permissions), (view.view_groups, view.view_groups_permissions), view.view_permissions) if fail and not ret: raise usergroup.PermissionDeniedError(None, env.request.web.path) return ret class View(_View, pluginmanager.PluginBase): def __init__(self): _View.__init__(self) pluginmanager.PluginBase.__init__(self) def route(path, method=_SENTINEL, methods=["GET"], permissions=[], menu=None, label=None, defaults={}, endpoint=None, datatype=None, priority=0, keywords=set(), help=None, parameters=_SENTINEL): usergroup.ALL_PERMISSIONS.declare(permissions) if method is not _SENTINEL: ret = env.viewmanager._add_route(path, method, methods=methods, permissions=permissions, menu=menu, label=label, defaults=defaults, endpoint=endpoint, datatype=datatype, priority=priority, keywords=keywords, help=help, parameters=parameters) else: ret = registrar.DelayedRegistrar.make_decorator("route", env.viewmanager._add_route, path, methods=methods, permissions=permissions, menu=menu, label=label, defaults=defaults, endpoint=endpoint, datatype=datatype, keywords=keywords, priority=priority, help=help, parameters=parameters) return ret class ViewManager(registrar.DelayedRegistrar): def get(self, datatype=None, keywords=None): views = self._references.get(datatype, []) if datatype else self._views_endpoints.values() return sorted(filter(lambda x: set(keywords or []).issubset(x.view_keywords), views), key=lambda x: x.view_priority) def get_view(self, endpoint, default=None): endpoint = endpoint.lower() if endpoint[0] == "." and env.request.view: endpoint = "%s%s" % (env.request.view.view_id, endpoint) return self._views_endpoints.get(endpoint, default) def get_view_by_path(self, path, method=None, check_permissions=True): try: rule, view_kwargs = self.url_adapter.match(path, method=method, return_rule=True) except werkzeug.exceptions.MethodNotAllowed: raise InvalidMethodError(N_("Method '%(method)s' is not allowed for view '%(view)s'", {"method": method, "view": path})) except werkzeug.exceptions.NotFound: raise InvalidViewError(N_("View '%s' does not exist", path)) if check_permissions and not rule._prewikka_view.check_permissions(env.request.user, view_kwargs=view_kwargs): raise usergroup.PermissionDeniedError(rule._prewikka_view.view_permissions, path) return rule._prewikka_view, view_kwargs def get_baseview(self): # Import here, because of cyclic dependency from prewikka import baseview bview = self.get_view("baseview.render") if not bview: bview = baseview.BaseView() self._generic_add_view(bview, "/views/baseview") return bview def load_view(self, request, userl): view_layout = None view, view_kwargs = self.get_view_by_path(request.path, method=request.method) if view: view_layout = view.view_layout if not (request.is_xhr or request.is_stream) and view_layout: view = self.get_view(view_layout) elif view_kwargs: env.request.view_kwargs = view_kwargs if not view.view_csrf_exempt: csrf.process(request) env.request.view = view return view def _generic_add_view(self, view, path, methods=None, defaults=None): for permission in view.view_permissions: usergroup.ACTIVE_PERMISSIONS.declare(permission) rule = Rule(path, endpoint=view.view_endpoint, methods=methods, defaults=defaults) rule._prewikka_view = view self._views_endpoints[view.view_endpoint] = view self._rule_map.add(rule) def _add_route(self, path, method=None, methods=["GET"], permissions=[], menu=None, label=None, defaults={}, endpoint=None, datatype=None, priority=0, keywords=set(), help=None, parameters=None): v = _ViewDescriptor(baseview=method.__self__) v.render = method v.view_menu = menu v.view_label = label v.view_permissions |= set(permissions) v.view_endpoint = "%s.%s" % (v.view_id, endpoint or method.__name__) v.view_datatype = datatype v.view_priority = priority v.view_keywords = set(keywords) if help: v.view_help = help if menu: env.menumanager.add_section_info(menu[0], menu[1], v.view_endpoint) if parameters is not _SENTINEL: v.view_parameters = parameters if datatype: self._references.setdefault(datatype, []).append(v) self._generic_add_view(v, path, methods=methods, defaults=defaults) def load_views(self, autoupdate=False): self._init() self.get_baseview() for view_class in pluginmanager.PluginManager("prewikka.views", autoupdate): try: pluginmanager.PluginManager.initialize_plugin(view_class) except Exception: continue @property def url_adapter(self): scname = None if env.request.web: scname = env.request.web.get_script_name() ad = _URL_ADAPTER_CACHE.get(scname) if not ad: ad = _URL_ADAPTER_CACHE[scname] = self._rule_map.bind("", scname) return ad def _init(self): _URL_ADAPTER_CACHE.clear() self._references = {} self._views_endpoints = {} self._route_override = {} for i in _ROUTE_OVERRIDE_TYPE: self._route_override[i] = {} self._rule_map = Map(converters={'list': ListConverter}) def __init__(self): registrar.DelayedRegistrar.__init__(self) self._init() builtins.url_for = self.url_for def url_for(self, endpoint, _default=_SENTINEL, **kwargs): view = self.get_view(endpoint=endpoint) if not view: if _default is not _SENTINEL: return _default raise InvalidViewError(N_("View '%s' does not exist", endpoint)) try: return view.make_url(**kwargs) except Exception as exc: if _default is not _SENTINEL: return _default raise exc prewikka-5.1.1/prewikka.egg-info/0000775000175000017500000000000013555143705020256 5ustar tandrejatandreja00000000000000prewikka-5.1.1/prewikka.egg-info/PKG-INFO0000664000175000017500000000033613555143703021353 0ustar tandrejatandreja00000000000000Metadata-Version: 1.0 Name: prewikka Version: 5.1.1 Summary: UNKNOWN Home-page: http://www.prelude-siem.com Author: Prelude Team Author-email: support.prelude@c-s.fr License: UNKNOWN Description: UNKNOWN Platform: UNKNOWN prewikka-5.1.1/prewikka.egg-info/SOURCES.txt0000664000175000017500000002725413555143705022154 0ustar tandrejatandreja00000000000000AUTHORS COPYING COPYING.chartjs COPYING.fontawesome COPYING.freejqgrid COPYING.jquery COPYING.jquery-unparam COPYING.select2 COPYING.underscore HACKING.README INSTALL MANIFEST.in NEWS README prewikka.pot setup.cfg setup.py conf/menu.yml conf/prewikka.conf prewikka/__init__.py prewikka/baseview.py prewikka/cli.py prewikka/config.py prewikka/crontab.py prewikka/csrf.py prewikka/database.py prewikka/error.py prewikka/history.py prewikka/hookmanager.py prewikka/idmefdatabase.py prewikka/link.py prewikka/localization.py prewikka/log.py prewikka/main.py prewikka/mainmenu.py prewikka/menu.py prewikka/pluginmanager.py prewikka/registrar.py prewikka/resolve.py prewikka/resource.py prewikka/response.py prewikka/statistics.py prewikka/template.py prewikka/theme.py prewikka/usergroup.py prewikka/version.py prewikka/view.py prewikka.egg-info/PKG-INFO prewikka.egg-info/SOURCES.txt prewikka.egg-info/dependency_links.txt prewikka.egg-info/entry_points.txt prewikka.egg-info/top_level.txt prewikka/auth/__init__.py prewikka/auth/auth.py prewikka/compat/__init__.py prewikka/compat/babelcompat.py prewikka/compat/gevent.py prewikka/compat/jquery_unparam.py prewikka/dataprovider/__init__.py prewikka/dataprovider/idmef.py prewikka/dataprovider/parsers/__init__.py prewikka/dataprovider/parsers/criteria/__init__.py prewikka/dataprovider/parsers/criteria/grammar.py prewikka/dataprovider/parsers/lucene/__init__.py prewikka/dataprovider/parsers/lucene/grammar.py prewikka/dataprovider/plugins/__init__.py prewikka/dataprovider/plugins/idmef/__init__.py prewikka/htdocs/css/32px.png prewikka/htdocs/css/bootstrap.min.css prewikka/htdocs/css/font-awesome.min.css prewikka/htdocs/css/jquery-ui-timepicker-addon.min.css prewikka/htdocs/css/jquery-ui.min.css prewikka/htdocs/css/select2-bootstrap.min.css prewikka/htdocs/css/select2.min.css prewikka/htdocs/css/style.less prewikka/htdocs/css/throbber.gif prewikka/htdocs/css/ui.jqgrid.min.css prewikka/htdocs/css/ui.jqgrid.min.css.map prewikka/htdocs/css/ui.multiselect.min.css prewikka/htdocs/css/ui.multiselect.min.css.map prewikka/htdocs/css/images/ui-bg_glass_55_fbf9ee_1x400.png prewikka/htdocs/css/images/ui-bg_glass_65_ffffff_1x400.png prewikka/htdocs/css/images/ui-bg_glass_75_dadada_1x400.png prewikka/htdocs/css/images/ui-bg_glass_75_e6e6e6_1x400.png prewikka/htdocs/css/images/ui-bg_glass_95_fef1ec_1x400.png prewikka/htdocs/css/images/ui-bg_highlight-soft_75_cccccc_1x100.png prewikka/htdocs/css/images/ui-icons_222222_256x240.png prewikka/htdocs/css/images/ui-icons_2e83ff_256x240.png prewikka/htdocs/css/images/ui-icons_454545_256x240.png prewikka/htdocs/css/images/ui-icons_888888_256x240.png prewikka/htdocs/css/images/ui-icons_cd0a0a_256x240.png prewikka/htdocs/fonts/FontAwesome.otf prewikka/htdocs/fonts/fontawesome-webfont.eot prewikka/htdocs/fonts/fontawesome-webfont.svg prewikka/htdocs/fonts/fontawesome-webfont.ttf prewikka/htdocs/fonts/fontawesome-webfont.woff prewikka/htdocs/fonts/fontawesome-webfont.woff2 prewikka/htdocs/images/add.png prewikka/htdocs/images/del.png prewikka/htdocs/images/favicon.png prewikka/htdocs/images/prelude-logo.png prewikka/htdocs/js/EventSource.js prewikka/htdocs/js/LAB.min.js prewikka/htdocs/js/ajax.js prewikka/htdocs/js/bootstrap.min.js prewikka/htdocs/js/commonlisting.js prewikka/htdocs/js/functions.js prewikka/htdocs/js/jquery-ui-timepicker-addon.min.js prewikka/htdocs/js/jquery-ui.min.js prewikka/htdocs/js/jquery.jeditable.js prewikka/htdocs/js/jquery.jqgrid.min.js prewikka/htdocs/js/jquery.jqgrid.min.js.map prewikka/htdocs/js/jquery.js prewikka/htdocs/js/json.js prewikka/htdocs/js/mainmenu.js prewikka/htdocs/js/moment.min.js prewikka/htdocs/js/select2.full.min.js prewikka/htdocs/js/ui.multiselect.js prewikka/htdocs/js/ui.multiselect.js.map prewikka/htdocs/js/underscore-min.js prewikka/htdocs/js/underscore-min.map prewikka/htdocs/js/locales/jqgrid/grid.locale-de.js prewikka/htdocs/js/locales/jqgrid/grid.locale-de.js.map prewikka/htdocs/js/locales/jqgrid/grid.locale-en.js prewikka/htdocs/js/locales/jqgrid/grid.locale-en.js.map prewikka/htdocs/js/locales/jqgrid/grid.locale-es.js prewikka/htdocs/js/locales/jqgrid/grid.locale-es.js.map prewikka/htdocs/js/locales/jqgrid/grid.locale-fr.js prewikka/htdocs/js/locales/jqgrid/grid.locale-fr.js.map prewikka/htdocs/js/locales/jqgrid/grid.locale-it.js prewikka/htdocs/js/locales/jqgrid/grid.locale-it.js.map prewikka/htdocs/js/locales/jqgrid/grid.locale-pl.js prewikka/htdocs/js/locales/jqgrid/grid.locale-pl.js.map prewikka/htdocs/js/locales/jqgrid/grid.locale-pt.js prewikka/htdocs/js/locales/jqgrid/grid.locale-pt.js.map prewikka/htdocs/js/locales/jqgrid/grid.locale-ru.js prewikka/htdocs/js/locales/jqgrid/grid.locale-ru.js.map prewikka/htdocs/js/locales/select2/de.js prewikka/htdocs/js/locales/select2/en.js prewikka/htdocs/js/locales/select2/es.js prewikka/htdocs/js/locales/select2/fr.js prewikka/htdocs/js/locales/select2/it.js prewikka/htdocs/js/locales/select2/pl.js prewikka/htdocs/js/locales/select2/pt.js prewikka/htdocs/js/locales/select2/ru.js prewikka/locale/de/LC_MESSAGES/prewikka.po prewikka/locale/en/LC_MESSAGES/prewikka.po prewikka/locale/es/LC_MESSAGES/prewikka.po prewikka/locale/fr/LC_MESSAGES/prewikka.po prewikka/locale/it/LC_MESSAGES/prewikka.po prewikka/locale/pl/LC_MESSAGES/prewikka.po prewikka/locale/pt_BR/LC_MESSAGES/prewikka.po prewikka/locale/ru/LC_MESSAGES/prewikka.po prewikka/plugins/__init__.py prewikka/plugins/warning/__init__.py prewikka/plugins/warning/templates/warning.mak prewikka/renderer/__init__.py prewikka/renderer/chartjs/__init__.py prewikka/renderer/chartjs/bar/__init__.py prewikka/renderer/chartjs/htdocs/js/Chart.min.js prewikka/renderer/chartjs/timeline/__init__.py prewikka/session/__init__.py prewikka/session/session.py prewikka/session/anonymous/__init__.py prewikka/session/anonymous/anonymous.py prewikka/sql/__init__.py prewikka/sql/install.py prewikka/templates/baseview.mak prewikka/templates/error.mak prewikka/templates/htmldocument.mak prewikka/templates/mainmenu.mak prewikka/templates/toplayout.mak prewikka/utils/__init__.py prewikka/utils/cache.py prewikka/utils/crypto.py prewikka/utils/json.py prewikka/utils/misc.py prewikka/utils/timeutil.py prewikka/utils/url.py prewikka/utils/viewhelpers.py prewikka/utils/html/__init__.py prewikka/utils/html/escape.py prewikka/utils/html/helpers.py prewikka/views/__init__.py prewikka/views/about/__init__.py prewikka/views/about/htdocs/css/about.css prewikka/views/about/htdocs/images/prelude-logo-400.png prewikka/views/about/htdocs/images/vigilo-logo-400.png prewikka/views/about/templates/about.mak prewikka/views/aboutplugin/__init__.py prewikka/views/aboutplugin/htdocs/css/aboutplugin.css prewikka/views/aboutplugin/templates/aboutplugin.mak prewikka/views/agents/__init__.py prewikka/views/agents/agents.py prewikka/views/agents/htdocs/css/agents.css prewikka/views/agents/templates/agents.mak prewikka/views/agents/templates/heartbeatanalyze.mak prewikka/views/crontab/__init__.py prewikka/views/crontab/templates/cronjob.mak prewikka/views/crontab/templates/crontab.mak prewikka/views/datasearch/__init__.py prewikka/views/datasearch/alert.py prewikka/views/datasearch/datasearch.py prewikka/views/datasearch/heartbeat.py prewikka/views/datasearch/idmef.py prewikka/views/datasearch/threat.py prewikka/views/datasearch/htdocs/css/datasearch.css prewikka/views/datasearch/htdocs/js/datasearch.js prewikka/views/datasearch/templates/details.mak prewikka/views/datasearch/templates/forensic.mak prewikka/views/datasearch/templates/infos.mak prewikka/views/datasearch/templates/table.mak prewikka/views/filter/__init__.py prewikka/views/filter/filter.py prewikka/views/filter/htdocs/css/filter.css prewikka/views/filter/htdocs/js/filter.js prewikka/views/filter/sql/__init__.py prewikka/views/filter/sql/install.py prewikka/views/filter/templates/filteredition.mak prewikka/views/filter/templates/filterlisting.mak prewikka/views/filter/templates/menu.mak prewikka/views/filter/templates/widget.mak prewikka/views/idmefnav/__init__.py prewikka/views/idmefnav/graph_generator.py prewikka/views/idmefnav/htdocs/css/idmefnav.css prewikka/views/idmefnav/htdocs/graph/Action.svg prewikka/views/idmefnav/htdocs/graph/AdditionalData.svg prewikka/views/idmefnav/htdocs/graph/Address.svg prewikka/views/idmefnav/htdocs/graph/Alert.svg prewikka/views/idmefnav/htdocs/graph/Analyzer.svg prewikka/views/idmefnav/htdocs/graph/AnalyzerTime.svg prewikka/views/idmefnav/htdocs/graph/Assessment.svg prewikka/views/idmefnav/htdocs/graph/Checksum.svg prewikka/views/idmefnav/htdocs/graph/Classification.svg prewikka/views/idmefnav/htdocs/graph/Confidence.svg prewikka/views/idmefnav/htdocs/graph/CorrelationAlert.svg prewikka/views/idmefnav/htdocs/graph/CreateTime.svg prewikka/views/idmefnav/htdocs/graph/DetectTime.svg prewikka/views/idmefnav/htdocs/graph/File.svg prewikka/views/idmefnav/htdocs/graph/FileAccess.svg prewikka/views/idmefnav/htdocs/graph/Heartbeat.svg prewikka/views/idmefnav/htdocs/graph/IDMEF-Message.svg prewikka/views/idmefnav/htdocs/graph/Impact.svg prewikka/views/idmefnav/htdocs/graph/Inode.svg prewikka/views/idmefnav/htdocs/graph/Linkage.svg prewikka/views/idmefnav/htdocs/graph/Node.svg prewikka/views/idmefnav/htdocs/graph/OverflowAlert.svg prewikka/views/idmefnav/htdocs/graph/Process.svg prewikka/views/idmefnav/htdocs/graph/Reference.svg prewikka/views/idmefnav/htdocs/graph/SNMPService.svg prewikka/views/idmefnav/htdocs/graph/Service.svg prewikka/views/idmefnav/htdocs/graph/Source.svg prewikka/views/idmefnav/htdocs/graph/Target.svg prewikka/views/idmefnav/htdocs/graph/ToolAlert.svg prewikka/views/idmefnav/htdocs/graph/User.svg prewikka/views/idmefnav/htdocs/graph/UserId.svg prewikka/views/idmefnav/htdocs/graph/WebService.svg prewikka/views/idmefnav/htdocs/yaml/Action.yml prewikka/views/idmefnav/htdocs/yaml/AdditionalData.yml prewikka/views/idmefnav/htdocs/yaml/Address.yml prewikka/views/idmefnav/htdocs/yaml/Alert.yml prewikka/views/idmefnav/htdocs/yaml/Analyzer.yml prewikka/views/idmefnav/htdocs/yaml/AnalyzerTime.yml prewikka/views/idmefnav/htdocs/yaml/Assessment.yml prewikka/views/idmefnav/htdocs/yaml/Checksum.yml prewikka/views/idmefnav/htdocs/yaml/Classification.yml prewikka/views/idmefnav/htdocs/yaml/Confidence.yml prewikka/views/idmefnav/htdocs/yaml/CorrelationAlert.yml prewikka/views/idmefnav/htdocs/yaml/CreateTime.yml prewikka/views/idmefnav/htdocs/yaml/DetectTime.yml prewikka/views/idmefnav/htdocs/yaml/File.yml prewikka/views/idmefnav/htdocs/yaml/FileAccess.yml prewikka/views/idmefnav/htdocs/yaml/Heartbeat.yml prewikka/views/idmefnav/htdocs/yaml/IDMEF-Message.yml prewikka/views/idmefnav/htdocs/yaml/Impact.yml prewikka/views/idmefnav/htdocs/yaml/Inode.yml prewikka/views/idmefnav/htdocs/yaml/Linkage.yml prewikka/views/idmefnav/htdocs/yaml/Node.yml prewikka/views/idmefnav/htdocs/yaml/OverflowAlert.yml prewikka/views/idmefnav/htdocs/yaml/Process.yml prewikka/views/idmefnav/htdocs/yaml/Reference.yml prewikka/views/idmefnav/htdocs/yaml/SNMPService.yml prewikka/views/idmefnav/htdocs/yaml/Service.yml prewikka/views/idmefnav/htdocs/yaml/Source.yml prewikka/views/idmefnav/htdocs/yaml/Target.yml prewikka/views/idmefnav/htdocs/yaml/ToolAlert.yml prewikka/views/idmefnav/htdocs/yaml/User.yml prewikka/views/idmefnav/htdocs/yaml/UserId.yml prewikka/views/idmefnav/htdocs/yaml/WebService.yml prewikka/views/idmefnav/templates/idmefnav.mak prewikka/views/messagesummary/__init__.py prewikka/views/messagesummary/messagesummary.py prewikka/views/messagesummary/templates/messagesummary.mak prewikka/views/usermanagement/__init__.py prewikka/views/usermanagement/usermanagement.py prewikka/views/usermanagement/templates/usersettings.mak prewikka/web/__init__.py prewikka/web/request.py prewikka/web/wsgi.py scripts/prewikka-cli scripts/prewikka-crontab scripts/prewikka-httpd scripts/prewikka.wsgi themes/blue.less themes/bright.less themes/classic.less themes/cs.less themes/dark.less themes/green.less themes/yellow.lessprewikka-5.1.1/prewikka.egg-info/dependency_links.txt0000664000175000017500000000000113555143703024322 0ustar tandrejatandreja00000000000000 prewikka-5.1.1/prewikka.egg-info/entry_points.txt0000664000175000017500000000266013555143703023556 0ustar tandrejatandreja00000000000000[prewikka.session] Anonymous = prewikka.session.anonymous:AnonymousSession [prewikka.views] About = prewikka.views.about:About AlertDataSearch = prewikka.views.datasearch.alert:AlertDataSearch Warning = prewikka.plugins.warning:Warning ThreatDataSearch = prewikka.views.datasearch.threat:ThreatDataSearch HeartbeatDataSearch = prewikka.views.datasearch.heartbeat:HeartbeatDataSearch CrontabView = prewikka.views.crontab:CrontabView FilterView = prewikka.views.filter.filter:FilterView IDMEFnav = prewikka.views.idmefnav:IDMEFNav AboutPlugin = prewikka.views.aboutplugin:AboutPlugin UserManagement = prewikka.views.usermanagement:UserManagement AgentPlugin = prewikka.views.agents:AgentPlugin MessageSummary = prewikka.views.messagesummary:MessageSummary [prewikka.updatedb] prewikka.views.filter.filter = prewikka.views.filter.sql prewikka = prewikka.sql [prewikka.renderer.type] ChartJSBar = prewikka.renderer.chartjs.bar:ChartJSBarPlugin ChartJSTimebar = prewikka.renderer.chartjs.timeline:ChartJSTimebarPlugin [prewikka.plugins] [prewikka.dataprovider.type] heartbeat = prewikka.dataprovider.idmef:IDMEFHeartbeatProvider alert = prewikka.dataprovider.idmef:IDMEFAlertProvider [prewikka.dataprovider.backend] IDMEFHeartbeat = prewikka.dataprovider.plugins.idmef:IDMEFHeartbeatPlugin IDMEFAlert = prewikka.dataprovider.plugins.idmef:IDMEFAlertPlugin [prewikka.auth] [prewikka.renderer.backend] ChartJS = prewikka.renderer.chartjs:ChartJSPlugin prewikka-5.1.1/prewikka.egg-info/top_level.txt0000664000175000017500000000001113555143703022776 0ustar tandrejatandreja00000000000000prewikka prewikka-5.1.1/scripts/0000775000175000017500000000000013555143705016436 5ustar tandrejatandreja00000000000000prewikka-5.1.1/scripts/prewikka-cli0000664000175000017500000001773413555143652020760 0ustar tandrejatandreja00000000000000#!/usr/bin/env python # Copyright (C) 2019 CS-SI. All Rights Reserved. # Author: Antoine Luong # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from __future__ import absolute_import, division, print_function, unicode_literals import argparse import cmd import getpass import glob import io import locale import logging import os import re import sys from prewikka import cli, localization, log, main, siteconfig, usergroup, utils, version from prewikka import FakeRequest COMMAND_ERROR = 1 PARSE_ERROR = 2 SYSTEM_ERROR = 3 UNEXPECTED_ERROR = 10 class PrewikkaCLI(cmd.Cmd): prompt = "(prewikka-cli) " _interactive = False def _complete_command(self, command, line): if len(line.split(" ")) != 2: return last_term = line.split(" ")[-1] return [category for category in cli.get(command) if category.startswith(last_term)] def _do_command(self, command, category, *args, **kwargs): c = cli.get(command).get(category) if not c: print("*** %s" % _("Unknown command")) return COMMAND_ERROR method, permissions, help = c env.request.user.check(permissions) try: result = method(*args, **kwargs) except Exception as e: print("*** %s" % _("An unexpected error occurred: %s") % e) return UNEXPECTED_ERROR if command == "list": for elem in result: print(elem) return 0 def _help_command(self, command, description): additional_help = [] for category, (method, permissions, help) in sorted(cli.get(command).items()): if help: additional_help.append(_(help)) print("\n".join(description + [" - %s" % h for h in additional_help])) def complete_create(self, text, line, begidx, endidx): return self._complete_command("create", line) def complete_delete(self, text, line, begidx, endidx): return self._complete_command("delete", line) def complete_import(self, text, line, begidx, endidx): if len(line.split(" ")) < 3: return self._complete_command("import", line) path = line.split(" ")[-1] offset = len(path) - len(text) return [f[offset:] + (os.sep if os.path.isdir(f) else "") for f in glob.glob(path + "*")] def complete_list(self, text, line, begidx, endidx): return self._complete_command("list", line) def complete_sync(self, text, line, begidx, endidx): return self._complete_command("sync", line) def do_create(self, arg): try: category, name, data = re.findall("^(\S+) (\S+)(?: ({.*}))?$", arg)[0] data = utils.json.loads(data) if data else {} except (IndexError, ValueError): print("*** %s" % _("Could not parse input")) return PARSE_ERROR return self._do_command("create", category, name=name, data=data) def do_delete(self, arg): try: category, name = arg.split() except ValueError: print("*** %s" % _("Could not parse input")) return PARSE_ERROR return self._do_command("delete", category, name=name) def do_import(self, arg): args = arg.split() try: category = args[0] filenames = args[1:] except IndexError: print("*** %s" % _("Could not parse input")) return PARSE_ERROR files = [] for pattern in filenames: for path in glob.glob(pattern): with io.open(path) as f: files.append({ "name": os.path.basename(f.name), "data": f.read() }) return self._do_command("import", category, files=files) def do_list(self, arg): return self._do_command("list", arg) def do_sync(self, arg): return self._do_command("sync", arg) def do_update(self, arg): return self._do_command("update", arg) def help_create(self): return self._help_command("create", ["create ", _("Create an object of the specified type")]) def help_delete(self): return self._help_command("delete", ["delete ", _("Delete an object of the specified type")]) def help_import(self): return self._help_command("import", ["import ", _("Import objects of the specified type from files")]) def help_list(self): return self._help_command("list", ["list ", _("List objects of the specified type")]) def help_sync(self): return self._help_command("sync", ["sync ", _("Synchronize objects of the specified type")]) def help_update(self): return self._help_command("update", ["update ", _("Update objects of the specified type")]) def do_EOF(self, line): return True def get_names(self): # Hide not implemented actions from the list of commands return [name for name in cmd.Cmd.get_names(self) if not name.startswith(("do_", "help_")) or name.endswith("help") or cli.get(name.split("_")[-1])] def emptyline(self): pass def preloop(self): self._interactive = True def postcmd(self, stop, line): if line and line.strip() not in ("help", "?"): print() if self._interactive and not isinstance(stop, bool): # Do not exit on error in interactive mode return False return stop def set_locale(lang): if lang[0] not in localization.get_languages(): lang = "en_GB.utf8" else: lang = ".".join(lang) localization.translation.set_locale(lang) if __name__ == "__main__": set_locale(locale.getdefaultlocale()) parser = argparse.ArgumentParser(description=_("Prewikka command-line tool")) parser.add_argument("-u", "--user", default="admin", help=_("name of the user")) parser.add_argument("-c", "--config", default="%s/prewikka.conf" % siteconfig.conf_dir, help=_("configuration file to use (default: %(default)s)")) parser.add_argument("-C", "--command", help=_("command to execute")) parser.add_argument("-D", "--debug", action="store_true", help=_("enable debugging output")) args = parser.parse_args() interpreter = PrewikkaCLI() env.request = FakeRequest() if getpass.getuser() != "prewikka": print("*** %s" % _("prewikka-cli must be executed as the prewikka user")) sys.exit(SYSTEM_ERROR) main.Core.from_config(args.config) env.request.user = env.auth.authenticate(args.user, no_password_check=True) env.request.user.set_locale() if args.debug: formatter = logging.Formatter('%(asctime)s prewikka-cli (pid:%(process)d) %(levelname)s: %(message)s', '%X') handler = logging.StreamHandler() handler.setLevel(logging.DEBUG) handler.setFormatter(formatter) env.log._logger.addHandler(handler) if args.command: ret = 0 for command in args.command.split(";"): r = interpreter.onecmd(command) if r > ret: ret = r sys.exit(ret) else: interpreter.cmdloop("\n".join([ _("Prewikka command-line tool (%s)") % version.__version__, _("Type \"help\" or \"?\" to list commands"), "" ])) prewikka-5.1.1/scripts/prewikka-crontab0000664000175000017500000000630613555143652021632 0ustar tandrejatandreja00000000000000#!/usr/bin/env python # Copyright (C) 2017-2019 CS-SI. All Rights Reserved. # Author: Yoann Vandoorselaere # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from __future__ import absolute_import, division, print_function, unicode_literals import gevent.monkey gevent.monkey.patch_all() import argparse import base64 import fcntl import locale import os import signal import sys from prewikka import crontab, localization, main, siteconfig, version from prewikka import FakeRequest _LOCKFD = None _LOCKFILE = None def _get_lock_filename(options): return "/tmp/prewikka-crontab-%s.lock" % base64.urlsafe_b64encode(options.config) def _handle_signal(signum, frame): env.log.info("received signal %d: terminating" % (signum)) if _LOCKFILE: os.unlink(_LOCKFILE) sys.exit(0) def _daemonize(options): global _LOCKFD, _LOCKFILE _LOCKFILE = _get_lock_filename(options) _LOCKFD = open(_LOCKFILE, 'w') try: fcntl.flock(_LOCKFD, fcntl.LOCK_EX | fcntl.LOCK_NB) except Exception: env.log.error("%s is already locked, is prewikka-crontab already running ?" % _LOCKFILE) raise ret = os.fork() if ret != 0: sys.exit(0) os.setsid() nd = open(os.devnull, 'rw') for i in ("stdin", "stdout", "stderr"): getattr(sys, i).close() setattr(sys, i, nd) os.umask(0o27) os.chdir('/') _LOCKFD.write('%s\n' % (os.getpid())) def set_locale(lang): if lang[0] not in localization.get_languages(): lang = "en_GB.utf8" else: lang = ".".join(lang) localization.translation.set_locale(lang) if __name__ == "__main__": set_locale(locale.getdefaultlocale()) parser = argparse.ArgumentParser(add_help=False) parser.add_argument("-c", "--config", default="%s/prewikka.conf" % siteconfig.conf_dir, help=_("configuration file to use (default: %(default)s)")) parser.add_argument("-d", "--daemon", action="store_true", help=_("run as a system daemon")) parser.add_argument("-h", "--help", action="help", help=_("show this help message and exit")) parser.add_argument("-v", "--version", action="version", version=version.__version__, help=_("show program's version number and exit")) options = parser.parse_args() if options.daemon: _daemonize(options) signal.signal(signal.SIGINT, _handle_signal) signal.signal(signal.SIGTERM, _handle_signal) # Setup the environment core = main.Core.from_config(options.config) env.request = FakeRequest() crontab.run(core) prewikka-5.1.1/scripts/prewikka-httpd0000664000175000017500000001021513555143652021317 0ustar tandrejatandreja00000000000000#!/usr/bin/env python # Copyright (C) 2004-2019 CS-SI. All Rights Reserved. # Author: Nicolas Delon # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import argparse import locale import multiprocessing import socket import ssl import sys from wsgiref.simple_server import WSGIRequestHandler, WSGIServer, make_server from prewikka import localization, main, siteconfig, version from prewikka.web import wsgi global options class WSGIRequest(WSGIRequestHandler): def log_message(self, format, *args): pass class MyWSGIServer(WSGIServer): def handle_error(self, request, client_address): exc_type, exc_value = sys.exc_info()[:2] if issubclass(exc_type, socket.error) and exc_value.args[0] == 32: # EPIPE return WSGIServer.handle_error(self, request, client_address) def serve_forever(self): # Preload Prewikka server main.Core.from_config(options.config) try: WSGIServer.serve_forever(self) except KeyboardInterrupt: pass def application(environ, start_response): environ["PREWIKKA_CONFIG"] = options.config if options.root: if not environ['PATH_INFO'].startswith(options.root): start_response('301 Redirect', [('Location', options.root), ]) return [] environ['SCRIPT_NAME'] = options.root[:-1] environ['PATH_INFO'] = environ['PATH_INFO'][len(options.root) - 1:] return wsgi.application(environ, start_response) def set_locale(lang): if lang[0] not in localization.get_languages(): lang = "en_GB.utf8" else: lang = ".".join(lang) localization.translation.set_locale(lang) if __name__ == "__main__": set_locale(locale.getdefaultlocale()) parser = argparse.ArgumentParser(add_help=False) parser.add_argument("-r", "--root", help=_("root where the server is accessible")) parser.add_argument("-a", "--address", default="0.0.0.0", help=_("IP to bind to (default: %(default)s)")) parser.add_argument("-p", "--port", type=int, default=8000, help=_("port number to use (default: %(default)d)")) parser.add_argument("--key", help=_("SSL private key to use (default: no SSL)")) parser.add_argument("--cert", help=_("SSL certificate to use (default: no SSL)")) parser.add_argument("-c", "--config", default="%s/prewikka.conf" % siteconfig.conf_dir, help=_("configuration file to use (default: %(default)s)")) parser.add_argument("-m", "--multiprocess", type=int, default=multiprocessing.cpu_count(), help=_("number of processes to use. Default value matches the number of available CPUs (i.e. %d)") % multiprocessing.cpu_count()) parser.add_argument("-h", "--help", action="help", help=_("show this help message and exit")) parser.add_argument("-v", "--version", action="version", version=version.__version__, help=_("show program's version number and exit")) options = parser.parse_args() if options.root: options.root = "/%s/" % (options.root.strip("/")) server = make_server(options.address, options.port, application, server_class=MyWSGIServer, handler_class=WSGIRequest) if options.key and options.cert: server.socket = ssl.wrap_socket(server.socket, keyfile=options.key, certfile=options.cert, server_side=True) for i in range(options.multiprocess - 1): p = multiprocessing.Process(target=server.serve_forever) p.daemon = True p.start() server.serve_forever() prewikka-5.1.1/scripts/prewikka.wsgi0000664000175000017500000000007413555143652021150 0ustar tandrejatandreja00000000000000from prewikka.web import wsgi application = wsgi.applicationprewikka-5.1.1/themes/0000775000175000017500000000000013555143705016234 5ustar tandrejatandreja00000000000000prewikka-5.1.1/themes/blue.less0000664000175000017500000000116313555143652020055 0ustar tandrejatandreja00000000000000@ambiance: #fafaff; @primary-background-color: #011e62; @primary-color: #fff; @active-text: @ambiance - #bbb; @active-background: @ambiance; @inactive-text: @ambiance + #111; @inactive-menu-background: @ambiance - #555555; @inactive-top-background: #333388; @menu-delimiter: black; @table-header: @ambiance - #121212; @table-row-even: @ambiance + #111; @table-row-odd: @ambiance; @table-background: @table-row-even; @fieldset-background: white; @timeline: @ambiance - #121212; @border: @ambiance + #111; @border-top: #d2312a; @chart-background: #fff; @link: #6865a6; @tooltip-background: #545454; @tooltip-text: #ececec; prewikka-5.1.1/themes/bright.less0000664000175000017500000000100113555143652020374 0ustar tandrejatandreja00000000000000@active-text: gray; @active-background: white; @inactive-text: white; @inactive-menu-background: #ddd; @inactive-top-background: #aaa; @menu-delimiter: #888; @primary-color: #fff; @primary-background-color: #aaa; @table-header: #eee; @table-row-even: white; @table-row-odd: #f3f3f3; @table-background: @table-row-even; @fieldset-background: white; @timeline: @table-header; @border: white; @border-top: #666; @chart-background: #F5F5F5; @link: #6865a6; @tooltip-background: #545454; @tooltip-text: #ececec; prewikka-5.1.1/themes/classic.less0000664000175000017500000000100413555143652020541 0ustar tandrejatandreja00000000000000@active-text: #333; @active-background: #eee; @inactive-text: white; @inactive-menu-background: #999; @inactive-top-background: #4d535c; @menu-delimiter: black; @primary-background-color: #4d535c; @primary-color: #fff; @table-header: #dcdcdc; @table-row-even: white; @table-row-odd: #eee; @table-background: @table-row-even; @fieldset-background: white; @timeline: #dcdcdc; @border: white; @border-top: #d2312a; @chart-background: #fcfcfc; @link: #6865a6; @tooltip-background: #545454; @tooltip-text: #ececec; prewikka-5.1.1/themes/cs.less0000664000175000017500000000115113555143652017530 0ustar tandrejatandreja00000000000000@ambiance: #FAFAFF; @primary-color: #fff; @primary-background-color: #009999; @active-text: @ambiance - #bbb; @active-background: @ambiance; @inactive-text: @ambiance + #111; @inactive-menu-background: #71adad; @inactive-top-background: #009999; @menu-delimiter: #0a4141; @table-header: @ambiance - #121212; @table-row-even: @ambiance + #111; @table-row-odd: @ambiance; @table-background: @table-row-even; @fieldset-background: white; @timeline: @ambiance - #121212; @border: @ambiance + #111; @border-top: #d2312a; @chart-background: #FFF; @link: #6865a6; @tooltip-background: #545454; @tooltip-text: #ececec; prewikka-5.1.1/themes/dark.less0000664000175000017500000000100713555143652020044 0ustar tandrejatandreja00000000000000@active-text: #ccc; @active-background: #242424; @inactive-text: white; @inactive-menu-background: #666; @inactive-top-background: #4d535c; @menu-delimiter: black; @primary-color: #ccc; @primary-background-color: black; @table-header: #343434; @table-row-even: black; @table-row-odd: #111; @table-background: @table-row-even; @fieldset-background: #111; @timeline: @table-header; @border: black; @border-top: #d2312a; @chart-background: #111; @link: #6865a6; @tooltip-background: #545454; @tooltip-text: #ececec; prewikka-5.1.1/themes/green.less0000664000175000017500000000116213555143652020225 0ustar tandrejatandreja00000000000000@ambiance: #FAFAFF; @primary-background-color: #318727; @primary-color: #fff; @active-text: @ambiance - #bbb; @active-background: @ambiance; @inactive-text: @ambiance + #111; @inactive-menu-background: @ambiance - #555555; @inactive-top-background: #318727; @menu-delimiter: black; @table-header: @ambiance - #121212; @table-row-even: @ambiance + #111; @table-row-odd: @ambiance; @table-background: @table-row-even; @fieldset-background: white; @timeline: @ambiance - #121212; @border: @ambiance + #111; @border-top: #d2312a; @chart-background: #FFF; @link: #6865a6; @tooltip-background: #545454; @tooltip-text: #ececec; prewikka-5.1.1/themes/yellow.less0000664000175000017500000000120013555143652020431 0ustar tandrejatandreja00000000000000@ambiance: #f8ffc7; @primary-background-color: #7b8216; @primary-color: #fff; @active-text: @ambiance - #bbb; @active-background: @ambiance; @inactive-text: @ambiance + #111; @inactive-menu-background: @ambiance - #555555; @inactive-top-background: #7b8216; @menu-delimiter: black; @table-header: @ambiance - #121212; @table-row-even: @ambiance + #111; @table-row-odd: @ambiance; @table-background: @table-row-even; @fieldset-background: white; @timeline: @ambiance - #121212; @border: @ambiance + #111; @border-top: #d2312a; @chart-background: @ambiance - #111; @link: #6865a6; @tooltip-background: #545454; @tooltip-text: #ececec; prewikka-5.1.1/AUTHORS0000664000175000017500000000035513555143652016023 0ustar tandrejatandreja00000000000000Prewikka is brought to you by CS-SI (http://www.prelude-siem.com), - Written by Yoann Vandoorselaere - Written by Nicolas Delon - Originally written by Markus Alkio and Miika Keskinen. prewikka-5.1.1/COPYING0000664000175000017500000004325413555143652016013 0ustar tandrejatandreja00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. prewikka-5.1.1/COPYING.chartjs0000664000175000017500000000210113555143652017432 0ustar tandrejatandreja00000000000000The MIT License (MIT) Copyright (c) 2018 Chart.js Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. prewikka-5.1.1/COPYING.fontawesome0000664000175000017500000000210713555143652020331 0ustar tandrejatandreja00000000000000The MIT License Copyright (c) Dave Gandy, Inc. http://fontawesome.io/ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. prewikka-5.1.1/COPYING.freejqgrid0000664000175000017500000004005313555143652020126 0ustar tandrejatandreja00000000000000The MIT License (MIT) Copyright (c) 2014-2016 Oleg Kiriljuk Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ------------------------------------------------------------------------------ [GNU GENERAL PUBLIC LICENSE](http://www.gnu.org/licenses/gpl-2.0.html) Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONSprewikka-5.1.1/COPYING.jquery0000664000175000017500000000211313555143652017316 0ustar tandrejatandreja00000000000000Copyright 2013 jQuery Foundation and other contributors http://jquery.com/ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. prewikka-5.1.1/COPYING.jquery-unparam0000664000175000017500000000242613555143652020766 0ustar tandrejatandreja00000000000000Copyright (c) 2013, Konstantine Rybnikov All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. prewikka-5.1.1/COPYING.select20000664000175000017500000000214413555143652017344 0ustar tandrejatandreja00000000000000The MIT License (MIT) Copyright (c) 2012-2017 Kevin Brown, Igor Vaynberg, and Select2 contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. prewikka-5.1.1/COPYING.underscore0000664000175000017500000000213513555143652020154 0ustar tandrejatandreja00000000000000Copyright (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. prewikka-5.1.1/HACKING.README0000664000175000017500000000133013555143652016670 0ustar tandrejatandreja00000000000000This directory and its children contain the Prewikka software. Changes: if you wish to contribute a change which is a significant one in terms of the amount of code changes, please be aware that CS-SI wishes to retain copyright of the Prewikka software. Therefore you will have to sign over copyright ownership of your code to CS-SI before we can include your changes in the main source tree. Before you start modifying anything for real, you should probably join the prelude-devel mailing list and send a mail describing what you want to do and how you want to do it so you don't waste time working on something we can't integrate. This also allows us to keep track of what's being worked on so efforts aren't duplicated. prewikka-5.1.1/INSTALL0000664000175000017500000000270513555143652016005 0ustar tandrejatandreja00000000000000Installation Instructions ************************* Copyright (C) 1994-1996, 1999-2002, 2004-2013 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. This file is offered as-is, without warranty of any kind. Dependencies ============ Build requires: - python >= 2.7 (not python 3.x) - python-babel - python-lesscpy - python-setuptools Run requires: - python >= 2.7 (not python 3.x) - python-babel - python-croniter >= 0.3.6 - python-dateutil - python-enum34 - python-gevent - python-lark-parser - python-mako >= 0.8.1 - python-tz / pytz - python-voluptuous - python-werkzeug - python-yaml / PyYAML - libprelude with python bindings - libpreludedb with python bindings Lint uses: - python-flake8 Testing requires: - All run requires - python-pytest / pytest >= 2.7.0 - python-coverage (optional) Basic Installation ================== Briefly, the shell commands `python setup.py install' should configure, build, and install this package. See the `README' file for instructions specific to this package. Some packages provide this `INSTALL' file but do not implement all of the features documented below. The lack of an optional feature in a given package is not necessarily a bug. Go to https://www.prelude-siem.org/projects/prelude/wiki/InstallingPreludePrewikka for more installation instructions. prewikka-5.1.1/MANIFEST.in0000664000175000017500000000037313555143652016511 0ustar tandrejatandreja00000000000000include AUTHORS include COPYING* include HACKING.README include NEWS include README include INSTALL include prewikka.pot include conf/prewikka.conf include conf/menu.yml include themes/*.less include scripts/prewikka.wsgi recursive-include prewikka * prewikka-5.1.1/NEWS0000664000175000017500000016620013555143652015454 0ustar tandrejatandreja00000000000000* 2019-10-08, prewikka-5.1.1: Author: Antoine Luong - Use the correct hook in heartbeat detail - Fix grouping errors with datasearch:update - Reload plugins if needed in prewikka-crontab * 2019-09-13, prewikka-5.1.0: Author: Antoine Luong - Tweak the 'create' CLI command * 2019-09-04, prewikka-5.1.0rc1: Author: Antoine Luong - Add an option to format numbers as bits - Support file sizes in configuration - Fix resetting user properties - Add __repr__ method for users/groups - Fix auto-reload of the Scheduling page - Ignore return value for non-list CLI commands Author: Camille Gardet - Negative duration makes notifications persistent * 2019-08-16, prewikka-5.1.0beta3: Author: Antoine Luong - Handle integer-indexed elements in parameters - Rename the 'init' CLI command to 'sync' - Separate dataprovider backend and instance - Fix DataSearch exporting entries with chevrons - Fix mainmenu auto-refresh - Implement support for time-spanning data - Add past periods to the control menu - Add utilities for file inputs Author: Camille Gardet - Improve readability of errors - Use select2 for user timezone selection - Trigger the submit-complete event in Datasearch * 2019-07-23, prewikka-5.1.0beta2: Author: Antoine Luong - Fix parameters in crontab request - Implement an administration command-line tool - Use the filter ID in the listing - Fix modal autofocus * 2019-07-17, prewikka-5.1.0beta1: Author: Camille Gardet - Add EventSource pool - Support the upload of binary files Author: Antoine Luong - Evolutions - Add an option for reloading grids periodically - Support autofocus fields - Stop passing the whole DataSearch row to ajax_infos - Allow linking charts to user - JS libraries upgrade - Make the 'distinct' parameter a boolean in dataprovider - Bugfixes - Avoid error with wrong help configuration - Hide menus in case of missing permission - Correctly handle dates/bytes in Datasearch details - Restrict the operators for IDMEF byte data - Remove IDMEF_VIEW requirement for filters - Force datatype in aggregation pages - Fix recursion of ResultObject subclasses - Correctly handle timedeltas in criteria - Use YAML safe_load() instead of load() Author: Francois Poirotte - YAML menu relative to main config file Author: Yoann Vandoorselaere - Implement usergroup.ACTIVE_PERMISSIONS * 2019-05-17, prewikka-5.1.0alpha6: Author: Antoine Luong - Propagate option classes to select2 items * 2019-05-10, prewikka-5.1.0alpha5: Author: Thomas Andrejak - Be able to hide options in select2 * 2019-04-24, prewikka-5.1.0alpha4: Author: Antoine Luong - Add a categorization for filters - Improve the 'Group by' label in DataSearch - Escape backslashes in Lucene search - Add localization.format_value() - Support the timedelta type in dataprovider - Use select2 in prewikka_autocomplete - Make the IDMEF substring operator consistent Author: Yoann Vandoorselaere - Deprecate the old view render system * 2019-03-26, prewikka-5.1.0alpha2: Author: Antoine Luong - Fix DataSearch grouping by time fields - Add comparison operators for additional data * 2019-03-15, prewikka-5.1.0alpha1: Author: Yoann Vandoorselaere - Evolutions around paths and criteria - Make sure path supports the operator - Proper rewriting of ambiguous path using the (*) notation - Parse path using the (*) notation - Better Lucene coverage - Criteria NOT, fix operator precedence - Criterion now uses an enumeration as the operator storage - Other - Python3 compatibility fixes - Dataprovider get_types() rework - Summary rework - Improve hookmanager API Author: Antoine Luong - Evolutions - Make the Database class generic - Various improvements in the chart API - Remove special case for Enter key in modals - DataSearch improvements - Automatically convert booleans for SQL queries - Allow more complex branch migrations - Bugfixes - Handle clipboard copying with multiple tracebacks - Fix various issues in DataSearch - Fix display of falsy additional data - Fix Edge incompatibility - Handle incomplete log config sections - Fix PostgreSQL database cleanup in tests - Fix cronjob scheduling - Remove double ampersand encoding Author: Augustin Laville - Add 'This week' period in control menu Author: Thomas Andrejak - Update prelude-siem.com URLs - Fix HTTP status texts Author: Camille Gardet - Remove the search icon when the view uses a searchbar * 2018-09-07, prewikka-5.0.0: Author: Yoann Vandoorselaere - Better Lucene coverage Author: Antoine Luong - Fix possible error in correlation alert detail - Handle only-path criteria in parser - Do not use the compile callback with boolean criteria - Avoid issues with ID conflicts * 2018-08-30, prewikka-5.0.0rc2: Author: Yoann Vandoorselaere - Remove useless calls to use_transaction() - Implement Lucene and Criteria Lark parsers Author: Antoine Luong - Fix dropdown appearance for dark theme - Allow plugins to be disabled by default - More DataSearch fixes - Use a workaround for gevent compatibility with Python 2.7.5 - Allow absolute URL for view help Author: Thomas Andrejak - Update menu organization - Import IDMEF Navigator - Fix custom_theme with invalid python module - Add HOOK_SESSION_DELETE Author: Augustin Laville - Addition of unit tests * 2018-08-17, prewikka-5.0.0rc1: Author: Antoine Luong - Evolutions - Replace Chosen by Select2 - Save and restore the grid limit - Remove globally accessible env.idmef_db - Verify the schema of the YAML menu - Make filter creation accessible from the control menu - Bugfixes - Various DataSearch fixes - Unregister plugin data in case of initialization error - Avoid SQL connection leaks - Destroy active tooltips when reloading grid content - Correctly merge menu sections - Do not open a modal when reloading #main - Interpret cronjobs configuration as local time, not UTC Author: Francois Poirotte - Handle DataSearch selections in the browser Author: Thomas Andrejak - Keep the url fragment in browser history - Fix correlated alerts classification display on alert board - Move alerts and heartbeats cronjob to dataprovider Author: Yoann Vandoorselaere - IDMEF Criterion parser fixes - Use gevent in Crontab - Implement origin check and CSRF tokens - Python 3 compatibility work Author: Camille Gardet - Allow complex criteria in DataSearch cells - Give the data type to the formatter instance * 2018-06-08, prewikka-5.0.0beta4: Author: Camille Gardet - Fix the display of byte-string data in an IDMEF message - Fix actions in the datasearch subgrids Author: Antoine Luong - Move filter-specific code to the dedicated plugin - Keep the search query when using DataSearch aggregation - Add missing escaping in Lucene mode - Reduce flickering when loading DataSearch pages Author: Yoann Vandoorselaere - Improve invalid cronjob exception * 2018-05-22, prewikka-5.0.0beta3: Author: Antoine Luong - Fix DataSearch highlighting - Simplify styling of renderer errors - Make tooltip AJAX requests asynchronous - Raise a proper exception when view is not found in url_for - Stop using ez_setup.py Author: Camille Gardet - Fix redirection to the helper pages - Add "httponly" options to cookies * 2018-05-04, prewikka-5.0.0beta2: Author: Camille Gardet - Evolutions - New one-click action menu - Bugfixes - Save parameters when updating the datasearch table - Fix IDMEF dataprovider value adjustment - Request for deleting a query should be "POST" Author: Antoine Luong - Bugfixes - Fix issue when there are no heartbeats in database - Make the dropdown-header-custom CSS declaration global - Add a tooltip for the IDMEF detail in DataSearch - Raise the correct error when the cronjob callback is missing - Keep the order of timeline series * 2018-04-13, prewikka-5.0.0beta1: Author: Yoann Vandoorselaere - Evolutions - Implement a DataSearch framework and new alert/heartbeat views, with: - a zoomable timeline - a search bar - a configurable grid - Slower, but failsafe synchronisation of user configuration - Prewikka menu rework - AJAX request will now always be processed through the prewikka framework - Bugfixes - Notifications fixes and reload handling - Prevent duplicate error dialog Author: Sélim Menouar - New renderer type: ChartJS Author: Camille Gardet - Evolutions - Add a Threats view based on the DataSearch framework - Create statistics helpers - Add an "update" method to the renderer - Translate scripts Author: Antoine Luong - Evolutions - Add a Lucene parser - Improve dark theme - Drop the ConfigParserOption class - Add the plugin_after attribute to load plugins in order - Handle the AJAX tooltips globally - Greatly improve the performance of the Agents view Author: Thomas Andrejak - Python3 compatibility work * 2018-02-09, prewikka-4.2.0rc1: Author: Yoann Vandoorselaere - Evolutions - Implement a system of plugin dependencies - Javascript resources loading/unloading framework - Finer grained reload mechanism - Parameters handling overhaul - Proper jQuery parameters handling - Provide a way to update/save parameters with AJAX - MainMenu improvements - Replace timeline_absolute parameter by timeline_mode - Use POST in place of GET - Provide microsecond precision - Rework criteria - Rework PrewikkaResponse code - Class can now provide their own JSON deserialization function - Rework user configuration storage - Bugfixes - Redirection fixes - Fix exception with history query containing unicode - Properly add wildcard on not substring operator Author: Antoine Luong - Evolutions - Port the contextual links to a dedicated plugin - Raise normalization errors when parameters are incorrect - Save and reload grid preferences - Better support for multiple control menus - Add get_int, get_float and get_bool methods to ConfigParserSection - Bugfixes - Fix various Prewikka initialization errors - IE11 and Chrome compatibility work - Automatically add indexes when needed in IDMEF paths - Fix creation of filters with undefined fields - Do not duplicate filter when renaming it - Correctly build criteria for aggregating alerts - Fix SQL migration sequence - Fix Criterion JSON construction Author: Camille Gardet - Delete tasks linked to a removed user - Fix the SQL mapping of the queries history * 2017-07-24, prewikka-4.1.0: Author: Thomas Andrejak - Change default max_aggregated_* for better display - Update mailing list archives link in README - Crontab: Active button is a success button Author: Yoann Vandoorselaere - Rework mainmenu start/end time handling - Proper datetime truncate function - Invalid timeline link generated Author: Antoine Luong - Implement a custom JSON conversion - Add automatic deletion cron tasks - Add a method to get named config sections * 2017-07-13, prewikka-4.1.0rc2: Author: Yoann Vandoorselaere - Handle deferred errors - Spinner option for prewikka_ajax(), disable spinner on tooltip / hostinfos - Add type attribute to returned PathInfo object - Make IDMEF dataprovider.query() work without path or criterion - Dataprovider is now able to pass backend specific options - Make sure we escape non HTMLNode element - Fix invalid return for sensor with "exiting" status - Set default umask, and create temporary directory on initialization Author: Antoine Luong - Minor graphical changes - Allow empty value in HOOK_MESSAGE_EXTRA_LINK - Fix potential IndexError in CorrelationAlert detail Author: Camille Gardet - Add query history - Fix color rotation when a color map exists - Change wrong HTML tag in the alert table header - Ajax call does not always return a value * 2017-06-30, prewikka-4.1.0rc1: Author: Antoine Luong - Fix wrong diagnostic in HeartbeatAnalyze - Make mainmenu more customizable in non-inline mode - Better handle return key in modals - Fix post_load multiple calls Author: Yoann Vandoorselaere - Fix rule -> view mapping - Fix exception when database object is unavailable - Implement HOOK_PLUGINS_RELOAD * 2017-06-23, prewikka-4.1.0beta2: Author: Yoann Vandoorselaere - Implement Prewikka help framework - Fix Prewikka OSS warning Author: Antoine Luong - Improve link generation, add datatype argument to @route - Fix typo with AlertListing expand link * 2017-06-16, prewikka-4.1.0beta1: Author: Camille Gardet - Various fixes - Resizing fixes in commonlisting.js - Fix FontAwesome link in menu.yml - Add HTML tooltips Author: Yoann Vandoorselaere - Core evolutions - CommonListing API improvement - Dataprovider API improvement - Route API improvements - Prewikka AJAX framework improvement, new download system - Implement a Crontab system - Implement a generic delayed registration system - Implement resource.HTMLNode helper class - MainMenu is now embeddable in configuration forms - Bugfixes - HTTP reason should be encoded as ISO-8859-1 - Updated values in AttrObj() were not available in the generated json - Minor upsert fixes - Properly handle datetime with milliseconds - JSON object serialization fixes - Normalize data before soundex() Author: Antoine Luong - Bugfixes - Various timezone-related bugfixes - MessageSummary optimization and fixes - Split delete queries in agents - Other - Drop Python 2.6 support - Add DatetimePicker function - Allow communication between multiple modals - Reload grids after deleting rows - Wrap grid content instead of truncating it Author: Thomas Andrejak - Bugfixes - Fix prewikka_autocomplete and empty input - Fix main_menu using id instead of class - Add "eq" operator for AttrObj * 2017-02-16, prewikka-4.0.0: Author: Antoine Luong - Fix input order in Heartbeats - Fix menu for MyAccount page - Refresh the page after saving a filter - Format paths for use in QueryResultsRow - Menu update - Add new methods for dataproviders - Normalize None values at link creation Author: Yoann Vandoorselaere - Resolve data in dataprovider write operations - Fix upsert (CTE version) with empty values rows Author: Camille Gardet - @use_transaction uses the name of the original function Author: Thomas Andrejak - Add mainmenu to messagesummary - Update INSTALL file * 2017-02-12, prewikka-4.0.0rc3: Author: Camille Gardet - Update favicon - Fix MessageListing pagination - Fix columns ordering in jqGrid tables - Minor display fixes Author: Antoine Luong - CSS tweaks in Apps and MessageSummary - Use the Bootstrap/FontAwesome theme for free-jqGrid - Improve error messages when loading views Author: Yoann Vandoorselaere - Correctly escape document.(base_url|href) - Prevent soundex() algorithm error with unicode Author: Thomas Andrejak - Fix browser title to display section * 2017-02-03, prewikka-4.0.0rc2: Author: Song Tran - Add INSTALL file to MANIFEST.in Author: Antoine Luong - Add the "enum" and "text" types in dataprovider - Do not modify the passed criteria in dataprovider - Fix JS condition causing the tabs to disappear - Fix incorrect dropdown display in filter edition - Make it possible to create private views Author: Yoann Vandoorselaere - Normalize --root parameter - Properly map ConfigParserSection - Fix encoding problem with external script - Filter out invalid characters in ASCII payload dump * 2017-01-27, prewikka-4.0.0rc1: Author: Yoann Vandoorselaere - View membership / permissions rework UNIX-like permissions for views: a given view can now be owned by a list of users (view_users), or/and a list of groups (view_groups). - url_for() now has a _default argument - Improve widget creation mechanisms - Fix upsert with empty generator - Fix possible tab activation issue on initial load Author: Antoine Luong - Include the control menu in the agent view - CSS and theme fixes - Fix control menu's unexpected behavior - Correctly translate errors - Improvements and fixes in filter views - Implement copying traceback to clipboard - Menu improvements - Implement an ajax-reload response type Author: Thomas Andrejak - Update messagesummary to Bootstrap * 2017-01-12, prewikka-4.0.0beta2: Author: Antoine Luong - Filter view overhaul - Add path-related functions to the dataprovider API - Menu rework, use a YAML configuration file Author: Yoann Vandoorselaere - Route API fixes - Use view_id as the view basepoint - Implement HOOK_URL_FOR to workaround viewmanagement - Fix view_extensions with new @route API - Prevent invalid method error in case of authentication failure - Correctly check in auth whether the method is not the base implementation - Initialize dataprovider backend before type - Fix upsert with empty data Author: Thomas Andrejak - Add error code for user errors - Fix mainmenu initialization Author: Camille Gardet - Translate error name when it is needed * 2016-12-23, prewikka-4.0.0beta1: Author: Yoann Vandoorselaere - Core evolutions - Implementation of @view.route() - Move dataset, menu and parameters to env.request - Python3 compatibility - Mako templating engine, drop Cheetah - Implement Criterion(), and generalize dataprovider usage - Implement our own JSON layer - Implement generic upsert framework - Unify error handling - Implement generic cache system - Use full module name, plugin loader rework - Bugfixes - Fix WSGI redirect - Do not pass the request to Prewikka core on invalid static files - Do not silently fail when a backend does not support a given operation - Prevent query burst upon start - Handle index create/drop for PostgreSQL/SQLite - use_flock() database loading regression Author: Thomas Andrejak - Enable translation for label in URL links - Fix prewikka-httpd get_raw_uri and querystring - Fix WSGI self.body not filled - Fix alertlisting classification alert.type filter Author: Antoine Luong - Bugfixes - Auth and user fixes - Allow hook registration of an empty object - Fix recursion problem when printing errors - New prewikka_autocomplete function - Add a method for checking user permissions - Set the process name to 'prewikka' in logs - CommonListing API tweaks - Support additional operations in dataproviders - Drop IE9 support Author: Camille Gardet - Log more actions Author: Sélim Menouar - Add HOOK_LINK for messageid and ident in messagelisting - Automatically escape different types in SQL query * 2016-09-14, prewikka-3.1.0: Author: Antoine Luong - Language fix in Babel polyfill - Add missing import detected by pylint - Fix endless reloading loop in Apps - Fix undefined variable for NTEventLog Author: Yoann Vandoorselaere - Implement use_lock() decorator, use_transaction() improvement * 2016-09-01, prewikka-3.1.0rc3: Author: Antoine Luong - Translate error messages in interface, but not in logs - Fix a bug with the '%' character in IDMEF criteria - Control menu display fixes - Fix hook in agents returning None - Add a Cheetah filter for JSON Author: Sélim Menouar - Avoid double iteration in CachingIterator - Use response for ajax host url - Display CorrelationAlert children in widget Author: Yoann Vandoorselaere - Logout / session expiration fixes - logout redirect to Prewikka baseurl or to optional redirect argument - Prevent location.reload() on session expire to avoid POST warning - Normalize parameters only when using view.respond() * 2016-08-19, prewikka-3.1.0rc2: Author: Thomas Andrejak - Fix WSGI headers to be a standard dict - Fix behavior of get_users_by_properties function Author: Sélim Menouar - Add option to disable error traceback - Add readfp and read_string methods in ConfigParser Author: Yoann Vandoorselaere - PrewikkaResponse() allow empty headers argument - Correctly propagate error code in case of HTML error response - Support view that does not require authentication - Headers can now be specified in PrewikkaResponse - sendStream fixes, "close" event is not part of the protocol - PrewikkaTemplate now provides __json__ * 2016-08-05, prewikka-3.1.0rc1: Author: Thomas Andrejak - Fix prewikka.wsgi permissions - New authentication : by token Author: Sélim Menouar - Add a JSON type in view parameters - Prewikka notification handling - Add a PrewikkaResponse object Author: Francois Poirotte - UPSERT for custom filters - Support multiple extra mainmenu entry - Allow spaces in sub-section names Author: Antoine Luong - Use of free-jqGrid for agent listing - Automatic query escaping for Prewikka database - Fix the condition for an agent to be considered offline Author: Abdel Elmili - QueryResults rework - Add return type in dataproviders Author: Yoann Vandoorselaere - Configuration handling overhaul - Implement a deprecated() decorator - Rework hookmanager API - Standardize user/request access * 2016-04-22, prewikka-3.0.0: Author: Sélim Menouar - Prevent button's text in MainMenu to overflow - Update buttons state on rows suppression - Check dataprovider type before loading dataprovider backend Author: Francois Poirotte - Traceback on timelines when start == end - Hide irrelevant filters - Fix CSS class for node header in sensors - Avoid tracebacks in prewikka.utils.misc - Fix navigation bar display on IE 9 Author: Antoine Luong - Fix a parenthesis problem when applying filters - Preserve the grid width when adding/removing columns - Reinitialize env.threadlocal.menu - Correct behavior of severity checkboxes - Fix KeyError when no host URL are configured * 2016-04-15, prewikka-3.0.0rc4: Author: Sélim Menouar - Hook to dynamically add link in alert's popup menu Author: Antoine Luong - Rework the loading mechanism of head content - Use Cheetah comments in IE conditional comments - Global translation work - Fix UserSettings template Author: Yoann Vandoorselaere - Localize custom mainmenu date format Author: Francois Poirotte - Improve the help message about filters * 2016-04-08, prewikka-1.3.0rc3: Author: Yoann Vandoorselaere - Implement the parse_datetime() method Author: Antoine Luong - Handle parameters without filename in multipart - Re-add missing fields in AlertListing search Author: Francois Poirotte - Skip AJAX request for the logout link - Get rid of browser sniffing Author: Sélim Menouar - Prevent an empty column from appearing in AlertListing - Fix simple filter in AlertListing - Gray out the mainmenu's inputs when they are disabled Author: Camille Gardet - Fix Chosen select order - HTML and JS are now separated in Renderer Author: Louis-David Gabet - Control buttons with jqGrid * 2016-04-01, prewikka-1.3.0rc2: Author: Yoann Vandoorselaere - Navigation fixes, helper method for time argument generation Author: Antoine Luong - Fix a jQuery UI / Bootstrap compatibility problem - Prevent users from disabling certain plugins - Remove enumeration fields from AlertListing basic search Author: Francois Poirotte - Return timeline_absolute in get_parameters - Prevent filters from being applied twice - Add support for reverse proxies Add the "reverse_path" configuration option in prewikka.conf which can be used to override the base path to prewikka. Author: Camille Gardet - Don't save invalid parameters in alert view - Fix columns titles in users/groups listing * 2016-03-25, prewikka-1.3.0rc1: Author: Thomas Andrejak - Hack to change on the fly alert.analyzer(0) to alert.analyzer(-1) - Remove completion in alertlisting query - Fix error management permission Author: Sélim Menouar - AlertListing fixes - Don't add column if the HOOK returns None - Add node.name in simple search - Fix time_asc sorting - Force the mainmenu end date to be greater than the start date - Add section to the menumanager when adding a view - Check uniqueness of filter name - Move the hook declaration to FilterDatabase Author: Louis-David Gabet - Fix placeholder on Filter's view - Add hasUserName function - Fix missing boolean value in configuration file Author: Camille Gardet - Fix Update button in Apps view - Fix enable_details URLs Author: Yoann Vandoorselaere - Correct handling of absolute time * 2016-03-18, prewikka-1.3.0beta2: Author: Yoann Vandoorselaere - get_criteria() now only return generic criteria (dataprovider compatibility) - Improve timezone support - The sensor_localtime option has been removed since it is not efficient, and have a number of problem. - User can now select the timezone to be used in his profile. - The default is now to format timezone in the user selected timezone, not the frontend timezone. - in-transaction initialisation for version attribute - Remove deprecated Author: Louis-David Gabet - Fix wrong filter in alert listing - Show details during plugin updates - Fix filter's popup behavior - Increase font size - Change 'Prewikka' labels to 'Prelude' Author: Francois Poirotte - Support generic paths in selection - Fallback for the default view Author: Sélim Menouar - Handle permissions in dataprovider - Correctly delete events on confirm button - Add a footer-buttons css class - Change buttons' colors and icons Author: Antoine Luong - Fix wrong computation of number of pages in grid - Scroll to top when loading a page via AJAX - Correctly delete rows from jqGrid - Load views before auth/session modules * 2016-03-01, prewikka-1.3.0beta1: Author: Sélim Menouar - Look-and-feel: - Add tooltip for host and classification - Reponsive element for extra small device (<= 768px) - Ask for confirmation when performing a dangerous action - Always open a popup menu when filtering on alert listing - Change the ajax spinner - Automatically close the filter menu when we click outside - MainMenu fixes - Change the permissions' mechanism - Deprecate "place" option in the configuration file Author: Camille Gardet - Pretty output for prewikka-httpd help - Document the multiprocess option in prewikka-httpd - Add missing MIME types - Add index to IDMEF paths of Source/Target port Author: François Poirotte - Fix a plugin update failure - Fix several issues in AddressResolve - Default view after a successful login Author: Antoine Luong - Support for prewikka-updatedb entry point - Various theme-related tweaks - Better handling of sections in the menubar - Bugfixes - Filters were not applied when deleting alerts - Prevent empty message when the session cookie expires - Catch errors when database scripts are missing - Fix normalization problems in Agents and Heartbeats views - Avoid MessageSummary NoneType exception - Take timezone into account in message summary Author: Thomas Andrejak - Add method in renderer to check if a backend is loaded Author: Abdel Elmili - API to query different data sources Author: Yoann Vandoorselaere - Fix duplicated parameters exception - Disable multithreading support since it is known to cause deadlock * 2016-01-13, prewikka-1.3.0alpha1: Author: Sélim Menouar - Major look-and-feel overhaul - Bootstrap migration - MainMenu reworking - Add jquery-ui-datetimepicker for calendars - Temporarily remove timezone selection - No more "Save" button, the settings are always saved - Add an option for parameters which need to be shared between views - Add FontAwesome icons in navbar - Change prewikka's logo - Change the popup_menu - Update filter menu in alert listing - Allow multiple plugins in the same file - Add a default mimetype to the WSGI script - Preserve configuration section ordering on merge Author: Antoine Luong - Prewikka dialog adjustments - Standardize grid library usage with free-jqGrid - Remove the ToolAlertListing view - Display hearbeat details in a widget - Bugfixes - Fix issue with jEditable input fields' dimensions - Fix possible injection in error dialog - Fix inconsistency in the handling of substring operators - Operator tooltips were not displayed in AlertListing filters - Do not create a topmenu tab for section delimiters Author: Yoann Vandoorselaere - prewikka-httpd server now supports multiprocessing - Add missing path type for criteria to url mapping - Multiple time navigation fixes - Fix exception when using sensor localtime mode Author: Camille Gardet - Bugfixes - Fix order in jquery-chosen-sortable.js - Fix renderer-elem height - Fix view extra settings Remove excessive containers, causing data duplication Add a z-index to prewikka-view-config to display it above graphics present in the page. - Add parameters to chosen encapsulation The new parameters are used to tweak the rendering of the or not - Update underscore.js to 1.8.3 - Keep the order of "Data paths" in the view settings Author: Abdel Elmili - Remove unused parameter in RendererPluginManager Author: Louis-David Gabet - Load conf files in alphabetical order * 2015-08-06, prewikka-1.2.6: Author: Yoann Vandoorselaere - Core evolutions - Plugin infrastructure New API for session, auth, and view module, as well as generic plugin. - Hookmanager implementation The plugin hookmanager allows different parts of the system to communicate transparently. - Tabs are now AJAX loaded - Prewikka pages are now accessible through URL path instead of parameters - Avoid updating session on every request (improve Prewikka response time) - Redirects are now supported and used when required - Initial support for prewikka widget - [#521,#561] Automatic SQL installation and update for plugins - Keep track of each installed plugin schema version - for Prewikka main schema: automatic installation at initialisation time - for plugins: disabled until interactive installation - Ability for the user to enable / disable a plugin. - [#679] Use Python scripts instead of SQL scripts for more flexibility - install : responsible for initial schema installation - update : responsible for updating an already installed schema - branch : responsible for migrating from one branch to another - Improvements - Factorize code for control menu Time handling within the menu is now done with the help of dateutil. - Standardized date and time formatting Use babel for date/time formatting, character set detection bug fixes - [#610,#ext597] Add more fields to classification filtering - [#rel697] Pluggable configuration file - Bugfixes - [#477] Fix sensor-localtime - AlertListing bug fixes - Fix various WSGI issues - Translation multithreading fixes - [#598] Fix ViewManagement exception on dynamic view access Author: Antoine Luong - Improvements - Factorize help dialog/button, and make it available to each view - [#505] UserSettings template cleanup Define a common plugin_htdocs attribute for plugins, views and renderers. - [#697] Support multiple domains for translation Each plugin can now define its own localization domain, via the plugin_locale attribute. - [#559] Simplify AlertListing view - Global translation update - Bugfixes - [#453] Groupby selection problem in alert listing - [#445] Sensor node name/location ignored in agent listing - Fix wrong display of analyzer heartbeats - [#463,#ext572] Fix error displaying summary of Snort alerts - [#589] Fix various JavaScript possible injections - Fix numerous problems with IE9 Author: Camille Gardet - [#538] Put view parameters inside the control menu - Fix bad closure in eventstream Author: Thomas Andrejak - Fix sending configuration to auth and session plugins - IE fixes * 2014-10-27, prewikka-1.2.6rc4: Author: Antoine Luong - Update to latest libpreludedb changes - Sort files passed as arguments to xgettext command * 2014-09-23, prewikka-1.2.6rc2: Author: Yoann Vandoorselaere - Update to fit libprelude(db) bindings API changes High level bindings in libprelude(db) are now the standard, so old level bindings got renamed to "preludeold" and "preludedbold". Update to fit the new naming scheme. * 2014-09-16, prewikka-1.2.6rc1: Author: Antoine Luong - Syslog logging fallback to UDP localhost if no socket is found * 2014-07-07, prewikka-1.2.5: - Better fix for #495 : Request-URI Too Large IDs of linked alerts are no longer sent as parameters when filtering - Correctly displays database schema error - Support (un)folding Source and Target, when there is more than one - Removed rhel6 packaging - Fix problem of character encoding in field classification.reference(x).name * 2013-09-19, prewikka-1.1.0: - Raise DatabaseSchemaError only if schema version does not match - More XHTML compliant : - Fixed some missing closing tags - Fixed & encoding in URL - Fixed empty options in aggregated filters, - Fixed bad forms in users listing - Added a popup for filtering by analyzer model - Allowed filtering in sensors listing view - Added the host_url feature - Added missing _set_host_commands function - Added a hideall/showall button in sensor listing - Fixed non-display of popup menu with Internet Explorer - SensorListing : fixed a malformed style attribute - Sensors and Heartbeat listing : Fixed a bug leading to the page top when clicking on a popup menu link - Fixed a display problem of url-related links : When the address category is unknown, two values are possible : None or "unknown". - Fixed prewikka layout : replace fixed positions by floats - Fixed #468 : Division by zero in stats - Fixed #495 : Request-URI Too Large - Set INNODB engine for MySQL - Fixed no css bug when adding a final slash to url - Config : - Removed useless path to prewikka.conf - Changed locales encoding to support non-latin characters in the top date - CGI module : removed useless imports - ModPythonHandler : Copy HTTP headers in Request.input_headers to share headers between modpython and internal http server - Packaging : - RHEL6 : Added missing dependency to pycairo - Added Makefile - Fixed #519 : Deprecation warnings in the apache log - Updated Free Software Foundation headers- * 2012-06-04, prewikka-1.0.1: - Updated french, german and italian translations - Added missing translations msgid - The login page uses now the default language defined in prewikka.conf - Added packaging for rhel6 - Changed copyrights - Updated About and SensorListing views - CSS enhancements, texts more readable - New parameters (#471) : enable_details, host_details_url, port_details_url, reference_details_url - Fixed #482 : TypeError in alertlisting view - Fixed UnicodeDecodeError in prepareError - Fixed #469 : Heartbeat analyser failed - Fixed #475 : Filtering on sensors status hides all sensors - Fixed #381 : exception with CGI authentication - Python 2.5 is now required * 2010-03-16, prewikka-1.0.0: - Fix logout link from the Statistics view. - Fix inline filtering problem for events name with start/ending space. - Fix possible inline filter null reset button. - Other, minor fixes. * 2010-02-12, prewikka-1.0.0rc3: - Make sure we always use a replacement ("n/a") when we get a nil value from the database. Fix exception since the underlying chart backend didn't support nil value (#370). - If the requested timeline range is lower or equal 1 minute, use a 1 second step. Fix an exception using the Cairoplot backend, and allow to get meaningful by minute statistics (#370). * 2010-02-10, prewikka-1.0.0rc2: - The link to the logged-in user settings, when accessed through the Statistics subpages, contained an invalid parameters which triggered an exception. - An exception could be raised in case we were generating a distribution Chart containing empty values. This close #369. - Upgrade old database fields values to fit latest Prewikka changes. Fix a possible exception in the Events listing. - Fix possible exception with username/charts name containing unicode. - Correctly handle the setup.py installation 'root' argument. * 2010-01-21, prewikka-1.0.0rc1: - OpenSource Graphical Statistics implementation: implement a set of basic statistics for Prewikka, based on the (provided) Cairoplot rendering engine. This initial implementation provides Categorizations, Sources, Targets, Analyzers, and Timeline statistics. - Only use analyzerid/messageid pair when linking to a set of correlated alerts. This fixes a problem where clicking on the link to expand the CorrelatedAlert list would bring an empty alert view, since previous filters where preserved. - The link used to expand a list of sources/target was always broken. It now point to the detailed view for CorrelationAlert, or the detailed event for alert. - Allow filtering empty value, by providing a new "Is Null" operator. - Improve non aggregated delete, by providing a precise deletion scheme. - Correctly provide the analyzer_time information. - Various bug fixes. * 2009-09-07, prewikka-0.9.17.1: - Fix possible encoding error in the message summary view (#360). * 2009-07-07, prewikka-0.9.17: - Do not provide an exhaustive list of unreachable linked alert, rather, tell the user how many linked alert are not reachable any more. - String encoding fixes, do not mix unicode and bytestring, and more generally, use unicode for internal string storage. This fixes a lot of possible exception with particular specific user input, or with localization enabled. - Inline filter didn't work as expected when viewing events starting with a specific offset, because the offset keyword wasn't removed from the generated link. - Error handling improvement (back / retry button weren't always working as expected). - Fix exception when no protocol was available. - Improve navigation button link (make the link cover the whole button). * 2009-06-30, prewikka-0.9.16: - Multiples advanced filter within the same column wouldn't display correctly. - Correctly restore input field when switching between advanced/simple filter mode. - Fix multiple bug that would results in inconsistant filtered "state" and reset button. - Using the classification simple filter now also trigger a search on impact.completion. - Fix multiple alert deletion checkbox, (#357). - Various bug fixes. * 2009-06-08, prewikka-0.9.15: - Make it obvious when a column is filtered by replacing the old sober star with a big "[filtered]" red marker. If the column filter is saved, then the marker color will go from red to black. - Once the user filtered a given field by clicking on it, deny further click so that it is clear that the filter is currently active. - Re-write the inline filter implementation using Cheetah + Jquery, in place of generating an enormous amount of javascript code. This drastically reduce the size of the events listing HTML page, and will allow for much easier modification of the inline-filters. - Only propose filter operator relevant to the selected path. - Inline filter now present a single input field (with no path and operator selection). Using this field, the user can filter on what is seen in the associated column. For example, in the classification column, the filter will trigger a search on classification.text, classification.reference.name and classification.reference.origin. There is also an [advanced] button allowing the user to specify both the path and the operator. - Implement a reset button in each inline filter column, that allow to switch between different version of the filter: last saved filters, default filters, or current filters. - The user can now click an alert completion to set an inline filter on the completion value. - Clicking on a port / protocol now trigger a CSS menu allowing to filter on the port and protocol information, or to get information concerning this port / protocol. - Clicking on a classification reference now trigger a CSS menu which allow to filter on the reference, or to get more information concerning it. - Clicking on classification now add a filter on the selected classification (previously, it would have unfolded aggregated alerts for the selected entry, which is now done clicking the alert count). - Until now, the default user that was automatically created by Prewikka if there was no administrative user was "admin". As of now you can define the initial administrative username and password from the configuration file. (fix #289). - Fix escaping for reference details URI parameters. - Fix ModPython content-type handling. - Invalid variable name, fix #339. - Update to JQuery 1.3.2, and fit small JQuery API change. - If the installed libprelude or libpreludedb version is too old, Prewikka will require the user to upgrade. Currently, Prewikka depend on libpreludedb 0.9.12, and libprelude 0.9.23. - Fix IDMEFDatabase exception on empty criteria string (fixes #346). - Analyzer retrieval fixes and speedup (fixes #350). * 2008-03-27, prewikka-0.9.14: - Let the user choose the type of sorting (default to time descending, available: time asc/desc, count asc/desc). - Implement Prewikka Asynchronous DNS resolution in alert view as well as message summary (require twisted.names and twisted.internet), see the additional dns_max_delay settings parameters in prewikka.conf. - In the alert summary view, handle portlist and ip_version service fields, and show alert messageid. - Fix exception when rendering ToolAlert. - Fix double classification escaping (could result in non working link for alert with classification containing escaped character). - Improvement to heartbeat retrieval (heartbeat view speedup). - Correct typo (fix #275), thanks Scott Olihovki for pointing this out. - Polish translation, by Konrad Kosmowski . - Update to pt_BR translation, by Edelberto Franco Silva - Various bug fixes and cleanup. * 2007-10-18, prewikka-0.9.13: - Only perform additional database request when using Sensor localtime: this bring a performance improvement of about 36% on aggregated query, when using either frontend localtime (the default), or UTC time. - JQuery support: Port most of the javascript code to make use of JQuery. Add show/hide effect to CSS popup. More filtering functionality in the SensorListing view. - Cleanup the Authentication class, so that uper Prewikka layer can act depending whether the backend support user creation / deletion. Anonymous authentication is nowa plugin. - Better integration of CGI authentication allowing user listing and deletion. - Report template exception directly to the user. - Fix exception if an alert analyzer name is empty. - Fix problem when adding new Prewikka users (#262). - Fix exception when user has no permission set. - When changing password, we didn't try to match an empty 'current password' (which is a minor issue since the user is already authenticated). Thanks to Helmut Azbest for the fix. - Fix a typo making mod_python use the parent method (patch from Helmut Azbest ). - In the configuration file, recognize section even if there are whitespace at the beginning of the line. - Localization fixes, by Sebastien Tricaud , and Bjoern Weiland. * 2007-08-02, prewikka-0.9.12.1: - Fix a template compilation problem with certain version of Cheetah (Giandomenico De Tullio ) * 2007-08-01, prewikka-0.9.12: - Implement an Auto-Refresh system (fix #231). (including code from Paul Robert Marino ). - Ability to filter on missing/offline/online/unknown agents. Make more easier to read each agent status in collapsed mode. - Fix filter load/save/delete issue with translation. - New 'My account' tabs, under the Settings section (fix #241). - New messageid and analyzerid parameters, allowing link to a Prewikka alert from an external tool (previously required a database query in order to retrieve the database event id). - Don't redirect to user listing once an user preference are recorded. Fix changing of another user language by an user with PERM_USER_MANAGEMENT. Display target user language rather than current user language. - Improve the timeline control table layout. - Fix translation of string possibly using plural. * 2007-06-11, prewikka-0.9.11.4: - Fix PostgreSQL user deletion error. * 2007-05-29, prewikka-0.9.11.3: - Fix database schema version. * 2007-05-26, prewikka-0.9.11.2: - In case a database schema upgrade is required, or the Prewikka database does not exist, make the error available from the Prewikka console, rather than exiting badly (which previously required the user to parse its web server log in order to find out the problem). * 2007-05-25, prewikka-0.9.11.1: - Fix Apache CGI authentication. (Robin Gruyters) - Fix incorrect locale switch when accessing certain pages. * 2007-05-21, prewikka-0.9.11: - Prewikka has been internationalized: user might choose the language used in their settings tabs. Additionally, you might specify a default locale using the "default_locale" configuration keyword. - Brazilian Portuguese translation, by Edelberto Franco Silva. - French translation, by Sebastien Tricaud . - German translation, by Bjoern Weiland . - Russian translation, by Valentin Bogdanov . - Spanish translation, by Carlo G. Añez M. . - New powerfull and scalable agent view, grouping agent together by Location and Node. - In the Alert/Heartbeat summary view, number analyzers backward so that it reflect the ordering in the analyzer list. - Improved support for resizing menu. - Fix a konqueror rendering bug with the inline filter. - Various bug fixes. * 2007-04-05, prewikka-0.9.10: - Don't show all source and target when they reach a predefined limit, instead provide an expansion link. - Add two new view in the Events section: CorrelationAlert and ToolAlert. - Ability to filter and aggregate on all IDMEF path. If the filtered path is an enumeration, automatically provide the list of possible value. - Add a combo box for the user to choose which criteria operator to use. - Provide an enumeration filter for the type of alert (Alert, CorrelationAlert, ToolAlert, OverflowAlert). - Prewikka can now aggregate by analyzer. - When a session expire and the user login, the user is redirected to the page he attempted to access when the session expired. - When an error occur, the default Prewikka layout is now preserved. - Correct handling of empty value for hash key generation. Fix #204. - Use new libpreludedb function that return the results as well as the number of results. This avoid using COUNT() in some places (namely, this speedup non aggregated view by ~50%). - Avoid iterating the list of database result more than needed. - Support IDMEF Action, SNMPService, and WebService class. - Improved support for small screen resolution. * 2007-02-06, prewikka-0.9.9: - Improve database performance by reducing the number of query. (Paul Robert Marino) - Activate CleanOutput filtering (lot of escaping fixes). - More action logging. - Bug fixes with the error pages Back/Retry buttons. - Fix error on group by user (#191). - Fix template compilation error with Cheetah version 2 (#184). * 2006-11-23, prewikka-0.9.8: - Save/load user configuration when using CGI authentication mode (#181). - Show Prewikka version in the About page (#177). - Use Python logging facility (available backend: stderr, file, smtp, syslog), multiple simultaneous handler supported (#113). - Fix anonymous authentication. - Fix external process going into zombie state (#178). - Fix sqlite schema (#180). - Display correct alertident for invalid CorrelationAlert analyzerid/messageid pair. - prewikka-httpd should now log the source address. - Thread safety fixes. * 2006-08-18, prewikka-0.9.7.1: - Fix filter interface bug introduced in 0.9.7. - Improved error reporting on filter creation. - Rename command configuration section to host_commands. * 2006-08-16, prewikka-0.9.7: - Use preludedb_delete_(alert|heartbeat)_from_list(). Require libpreludedb 0.9.9. Provide a deletion performance improvement of around 3000%. - Handle multiple listed source/target properly. Separate source/target in the message listing. - Make host command/Information link available from the Sensor listing. - Always take care of the "external_link_new_window" configuration parameter. - Make external command handling more generic. Allow to specify command line arguments. - Allow to define unlimited number of external commands rather than only a defined subset (fix #134). - Avoid toggling several popup at once in the HeartbeatListing. - Only provide lookup capability for known network address type (fix #76). - New address and node name lookup provided through prelude-ids.com service. - Link to new prelude-ids.com port lookup instead of broken portsdb database (fix #162). - Various bug fixes. * 2006-07-27, prewikka-0.9.6: - CGI authentication module, from Tilman Baumann . - Correct libpreludedb runtime version check. - Show multiple source/target in message listing/summary. - Fix invalid use of socket.inet_ntoa() to read ICMP Gateway Address, which is stored as string (#156). - Fix aggregation on IDMEF-Path that are not string. - Fix setup.py --root option (#166). * 2006-05-04, prewikka-0.9.5: - Fix 'Filter on Target' link (fix #148). - Fix alert summary exception with alert including file permission (fix #149). - Fix creation of an empty __init__.py file in lib/site-packages (#147). - Print currently installed version on libpreludedb requirement error. - Make sure /usr/bin/env is expanded. * 2006-04-13, prewikka-0.9.4: - Intelligent display for CorrelationAlert. Include correlated alert information in the alert listing. - Intelligent printing of Network centric information. - Fix Cheetah compilation for the heartbeat page. - Correct handling of AdditionalData containing an integer 0. - Handle ignore_atomic_event AdditionalData key (used by CorrelationAlert to hide linked-in alert). - Fix aggregation when done simultaneously on multiple fields. - Aggregation on fields other than "address" was not working well. * 2005-01-10, prewikka-0.9.3: - Distribute SQLite schema. - Fix exception in the heartbeat analysis view when the heartbeat_count or heartbeat_error_margin settings are explicitly set (#124). - Fix Cheetah 1.0 heartbeat listing exception (#119). - Open external link in new windows by default. Add a configuration option to disable opening external link in new window (#61). - Provide the ability to specify the configuration file that Prewikka use (#117). - Sanitize the limit parameter in case the input value is not correct instead of triggering an exception (#118). - Handle the preludeDB "file" setting (for use with SQLite like database). - Fix filter saving issue in the heartbeat listing. - Fix unlimited timeline option in heartbeat listing. - Various bug fixes. * 2005-12-07, prewikka-0.9.2: - Correct Analyzer path when unwiding aggregated alert. - Add an "Unlimited" timeline option. - Fix classification escaping problem that could lead to empty listing when unwiding alert with classification text containing backslash. - Don't print un-necessary separator when the protocol field is empty in the alert listing. - Improve Correlation Alert display. Allow focus both on the Correlation Alert summary and on the correlated alert listing. - Don't propagate the "save" parameter, so that the user don't end up saving settings without knowing about it. * 2005-11-30, prewikka-0.9.1: - Resolve the protocol number from the message summary view. - Separate port and protocol value, so that we don't end up linking the protocol to portdb if there is no port. - Ability to setup IDMEF filter using iana_protocol_name and iana_protocol_number. - Sanitize timeline years value on system which does not support time exceeding 2^31-1. Fix #104. - Mark CorrelationAlert explicitly in the AlertListing. - Make inline filter mark more visible. - Ability for the user to save settings for the current view. - New --address and --port option to prewikka-httpd. - Fix a bug where clicking the IP address popup would cause Firefox to go back to the top of the page. Fix #112. - Don't hardcode path to /usr/bin/python, but resort to /usr/bin/env to find it. * 2005-09-20, prewikka-0.9.0: - 0.9.0 final. - Minor rendering fix. - Handle service.iana_protocol_name / service.iana_protocol_number as well as service.protocol. * 2005-09-05, prewikka-0.9.0-rc12: - Correct Konqueror rendering. - Minor bugfix with timeline selection. - Minor UI tweak. * 2005-08-25, prewikka-0.9.0-rc11: - The Summary view now support showing CorrelationAlert. - Avoid mangling URL query string on form input. - Handle possibly null AdditionalData properly. - Don't default to 'low' severity. - Allow the user to set analyzerID inline filter. - Make sure we keep aggregation in per analyzer view. - Keep inline filter object sorted, and merge them if there are duplicate. - When the same object is specified more than once, OR both. - Various cleanup, bugfix. * 2005-08-17, prewikka-0.9.0-rc10: - Allow configuration entry without space after the ':' separator. - More operator (case insensitive operator, regex operator). - Show target file in the message listing. - Much more information in the alert summary view. Especially useful for users of integrity checker. * 2005-08-02, prewikka-0.9.0-rc9: - New experimental mod_python handler. - Use the same template for user creation as for user modification. The interface is much cleaner, and more consistant. - Fix Invalid parameters exception on 'delete all'. - Print all analyzer, whether they have an analyzerID or not. This provide more analyzer information. - Show Analyzer Node location, Classification Ident, and Process path in the MessageSummary view. - Correct SNMP/Web Service, and some other Process/File filter path. - Allow for correct '\' escaping when creating filters. - Internet Explorer rendering tweak. - Various bugfix. * 2005-06-17, prewikka-0.9.0-rc8: - Use relative path everywhere. - Some escaping fixes. - Fix Filter formula check. - Ability to filter on alert.classification.ident. - Fix aggregated classification link in expanded list entry. - Various bugfix, English typo. * 2005-06-16, prewikka-0.9.0-rc7: - Prewikka now work and render perfectly with IE 6.0. - XHTML conformance in most of the code. - Fix possible exception with filtered classification text. - Allow filtering on heartbeat.analyzer.name. * 2005-06-01, prewikka-0.9.0-rc6: - Implement alert/heartbeat select all for deletion. - Fix handling of alert without classification. - Fix HTML code problem. Try to make the W3C validator happy. Fix Javascript warnings. Correct URL escaping. Make it work better in Apple's Safari browser. - More error checking when saving custom filter. Error out in case a filter reference non existing criteria. Add the substr operator. - Fix bug in the whole alert/heartbeat navigation system, simplify and cleanup the code, always report the current filtered field 'action' to the user. - Make the mouse pointer behave like it does for javascript links on Alert listing table head. - Fix alert mixup when expanding an aggregated classification with different severity. - Fix low/mid/high/none severity filtering. - Fix a bug where agents with multiple address would disappear. - Avoid Authentication Failed message when the user didn't try to authenticate (the session does not exist). - UI tweak for the detailed alert/heartbeat view. - Link source and destination port to portdb. - Add an heartbeat_error_margin configuration keyword. - Saving modification to an existing filter now work. - Make prewikka.cgi catch exceptions that are raised during the prewikka initialization step and display an error screen to the user instead of a server internal error. - Don't display message checkbox and delete button if the user don't have the PERM_IDMEF_ALTER permission - Fix module importation on MacOSX. - Various bugfix. * 2005-04-17, prewikka-0.9.0-rc5: - Fix classification filters in the alert listing. - Let the user provide the path to external command (whois, traceroute). - Fix prewikka exception on 'info' severity. - Fix broken installation permission. - Fix bad template variable initialization resulting in an exception with Cheetah 0.9.16. - Fix alert deletion in un-agreggated mode. - Fix GMT offset calculation. - Fix a problem when appending more filters in the alert list view. - Update Auth cookie expiration time. - Fix escaping issue. * 2005-04-05, prewikka-0.9.0-rc4: - Minor UI tweak. - Fix a problem when changing password. - Remove trailling space from config entry. - Display all analyzer address in agent listing. - Fix some bug in the authentication system, that would refuse login for no appearent reasons. - Set default session expiration time to 60 minutes. * 2005-03-31, prewikka-0.9.0-rc3: - Installation cleanup / bugfix. - Fix database authentication failure. - Fix error page. * 2005-03-31, prewikka-0.9.0-rc2 - Fix a loading problem when the database is not created. * 2005-03-29, prewikka-0.9.0-rc1: - Initial release prewikka-5.1.1/README0000664000175000017500000000255113555143652015633 0ustar tandrejatandreja00000000000000Prewikka: The Prelude-SIEM console. Prewikka is brought to you by CS-SI (http://www.prelude-siem.com). Prewikka Overview ================= Originally written by Markus Alkio and Miika Keskinen, re-written and maintained by Nicolas Delon with the help of Yoann Vandoorselaere and Audrey Girard, on behalf of PreludeIDS Technologies, it was rapidly adopted as the new Prelude frontend. Prewikka is a professional looking application providing advanced features like contextual filtering, aggregation, etc. Get Support =========== Prelude-user forums can be accessed at: https://www.prelude-siem.org/projects/prelude/boards Commercial Support is available through the CS-SI company: http://www.prelude-siem.com, contact.prelude@c-s.fr Help development ================ 1. SUBMITTING PATCHES The Prelude source is constantly changing. If you want to submit a patch, please do so from the most recent GIT source tree, subscribe to the prelude-devel mailing list and post your patch with a description of functionality. You can also attach patches to bugs on https://www.prelude-siem.org 2. BUGS If you find any bugs, please report them to: https://www.prelude-siem.org Please make sure that what you're reporting is actually a BUG and not a problem on your side. 3. SUGGESTIONS Subscribe to prelude-devel and give us your suggestions. prewikka-5.1.1/prewikka.pot0000664000175000017500000015201113555143652017311 0ustar tandrejatandreja00000000000000# Translations template for prewikka. # Copyright (C) 2019 ORGANIZATION # This file is distributed under the same license as the prewikka project. # FIRST AUTHOR , 2019. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: prewikka 5.1.1\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2019-09-04 19:03+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 0.9.6\n" #: prewikka/baseview.py:79 prewikka/usergroup.py:52 msgid "Permission Denied" msgstr "" #: prewikka/baseview.py:79 msgid "Missing permission to access the specified file" msgstr "" #: prewikka/config.py:37 prewikka/dataprovider/__init__.py:645 msgid "Configuration error" msgstr "" #: prewikka/config.py:43 #, python-format msgid "Parse error in \"%(txt)s\" at %(file)s line %(line)d" msgstr "" #: prewikka/config.py:48 prewikka/view.py:82 #, python-format msgid "Invalid value '%(value)s' for parameter '%(name)s'" msgstr "" #: prewikka/config.py:54 #, python-format msgid "Missing value for parameter '%(name)s'" msgstr "" #: prewikka/crontab.py:37 msgid "Hourly" msgstr "" #: prewikka/crontab.py:38 msgid "Daily" msgstr "" #: prewikka/crontab.py:39 msgid "Weekly" msgstr "" #: prewikka/crontab.py:40 msgid "Monthly" msgstr "" #: prewikka/crontab.py:41 msgid "Yearly" msgstr "" #: prewikka/crontab.py:42 prewikka/mainmenu.py:302 #: prewikka/templates/mainmenu.mak:92 msgid "Custom" msgstr "" #: prewikka/crontab.py:43 prewikka/views/crontab/__init__.py:84 msgid "Disabled" msgstr "" #: prewikka/crontab.py:105 msgid "Scheduled job execution failed" msgstr "" #: prewikka/crontab.py:139 msgid "Invalid job extension" msgstr "" #: prewikka/crontab.py:139 #, python-format msgid "Scheduled job with invalid extension type '%s'" msgstr "" #: prewikka/crontab.py:206 msgid "Invalid CronJob" msgstr "" #: prewikka/crontab.py:206 #, python-format msgid "CronJob with id=%d cannot be found in database" msgstr "" #: prewikka/crontab.py:260 msgid "Invalid schedule" msgstr "" #: prewikka/crontab.py:260 msgid "The specified job schedule is invalid" msgstr "" #: prewikka/crontab.py:286 #, python-format msgid "Custom (%s)" msgstr "" #: prewikka/database.py:43 msgid "Database error" msgstr "" #: prewikka/database.py:50 msgid "Database schema error" msgstr "" #: prewikka/database.py:293 msgid "database installation required" msgstr "" #: prewikka/database.py:296 msgid "database activation required" msgstr "" #: prewikka/database.py:299 #, python-format msgid "database schema branch %(required)s required (found %(current)s)" msgstr "" #: prewikka/database.py:305 #, python-format msgid "database schema version %(required)s required (found %(current)s)" msgstr "" #: prewikka/database.py:372 msgid "Database installation error" msgstr "" #: prewikka/database.py:374 #, python-format msgid "" "No database installation script found for module %(module)s, version " "%(version)s" msgstr "" #: prewikka/database.py:382 prewikka/database.py:420 msgid "Database migration error" msgstr "" #: prewikka/database.py:386 #, python-format msgid "" "No database branch migration script found for module %(module)s, branch " "transition %(current)s -> %(required)s" msgstr "" #: prewikka/database.py:424 #, python-format msgid "" "No linear migration script found for module %(module)s %(version1)s -> " "%(version2)s" msgstr "" #: prewikka/database.py:841 msgid "Database configuration error" msgstr "" #: prewikka/database.py:841 msgid "Only MySQL and PostgreSQL databases are supported at the moment" msgstr "" #: prewikka/error.py:48 prewikka/templates/error.mak:139 msgid "An unexpected condition happened" msgstr "" #: prewikka/error.py:148 msgid "Not implemented" msgstr "" #: prewikka/error.py:150 msgid "Backend does not implement this operation" msgstr "" #: prewikka/history.py:32 msgid "Search history deletion" msgstr "" #: prewikka/localization.py:143 msgid "%m/%Y" msgstr "" #: prewikka/localization.py:144 #, python-format msgid "%m/%d/%Y" msgstr "" #: prewikka/localization.py:145 #, python-format msgid "%m/%d/%Y %Hh" msgstr "" #: prewikka/localization.py:146 #, python-format msgid "%m/%d/%Y %H:%M" msgstr "" #: prewikka/localization.py:147 #, python-format msgid "%m/%d/%Y %H:%M:%S" msgstr "" #: prewikka/localization.py:149 msgid "%H:%M" msgstr "" #: prewikka/localization.py:150 msgid "%H:%M:%S" msgstr "" #: prewikka/localization.py:235 prewikka/localization.py:253 #: prewikka/renderer/__init__.py:62 prewikka/views/crontab/__init__.py:95 msgid "n/a" msgstr "" #: prewikka/localization.py:246 #, python-format msgid "%(days)dd %(hours)dh %(minutes)d'" msgstr "" #: prewikka/main.py:45 msgid "Version Requirement error" msgstr "" #: prewikka/main.py:48 #, python-format msgid "Prewikka %(vPre)s requires libprelude %(vLib)s or higher" msgstr "" #: prewikka/main.py:53 #, python-format msgid "Prewikka %(vPre)s requires libpreludedb %(vLib)s or higher" msgstr "" #: prewikka/main.py:136 prewikka/main.py:149 #: prewikka/dataprovider/plugins/idmef/__init__.py:57 msgid "Initialization error" msgstr "" #: prewikka/main.py:150 #, python-format msgid "" "Cannot use %(type)s mode '%(name)s', please contact your local " "administrator." msgstr "" #: prewikka/main.py:192 #, python-format msgid "Session '%s' does not accept any authentication module" msgstr "" #: prewikka/main.py:298 #, python-format msgid "An unexpected condition happened while trying to load %s" msgstr "" #: prewikka/mainmenu.py:114 #, python-format msgid "%S.%.6f" msgstr "" #: prewikka/mainmenu.py:115 #, python-format msgid "%S.%.3f" msgstr "" #: prewikka/mainmenu.py:260 msgid "Today" msgstr "" #: prewikka/mainmenu.py:261 msgid "Yesterday" msgstr "" #: prewikka/mainmenu.py:262 msgid "This week" msgstr "" #: prewikka/mainmenu.py:263 msgid "Last week" msgstr "" #: prewikka/mainmenu.py:264 msgid "This month" msgstr "" #: prewikka/mainmenu.py:265 msgid "Last month" msgstr "" #: prewikka/mainmenu.py:266 prewikka/mainmenu.py:267 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "" msgstr[1] "" #: prewikka/mainmenu.py:268 prewikka/mainmenu.py:269 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "" msgstr[1] "" #: prewikka/mainmenu.py:270 #, python-format msgid "%d week" msgid_plural "%d weeks" msgstr[0] "" msgstr[1] "" #: prewikka/mainmenu.py:271 prewikka/mainmenu.py:272 #, python-format msgid "%d month" msgid_plural "%d months" msgstr[0] "" msgstr[1] "" #: prewikka/mainmenu.py:273 #, python-format msgid "%d year" msgid_plural "%d years" msgstr[0] "" msgstr[1] "" #: prewikka/mainmenu.py:277 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "" msgstr[1] "" #: prewikka/mainmenu.py:278 prewikka/mainmenu.py:279 prewikka/mainmenu.py:280 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "" msgstr[1] "" #: prewikka/mainmenu.py:299 prewikka/templates/mainmenu.mak:61 msgid "Inactive" msgstr "" #: prewikka/mainmenu.py:305 prewikka/templates/mainmenu.mak:89 msgid "None" msgstr "" #: prewikka/menu.py:70 prewikka/menu.py:73 prewikka/menu.py:79 #: prewikka/menu.py:83 prewikka/menu.py:91 msgid "Menu error" msgstr "" #: prewikka/menu.py:70 msgid "The provided YAML menu is invalid" msgstr "" #: prewikka/menu.py:73 msgid "Empty menu" msgstr "" #: prewikka/menu.py:79 #, python-format msgid "Menu without a name in %s" msgstr "" #: prewikka/menu.py:83 msgid "Multiple default menus" msgstr "" #: prewikka/menu.py:91 msgid "Multiple default views" msgstr "" #: prewikka/pluginmanager.py:163 #, python-format msgid "Circular dependencies detected: %s" msgstr "" #: prewikka/pluginmanager.py:171 #, python-format msgid "Missing dependency: %s" msgstr "" #: prewikka/resolve.py:170 #, python-format msgid "" "Asynchronous DNS resolution disabled: twisted.names and twisted.internet " "required: %s" msgstr "" #: prewikka/usergroup.py:44 #, python-format msgid "Access to view '%(view)s' forbidden. Required permissions: %(permissions)s" msgstr "" #: prewikka/usergroup.py:47 #, python-format msgid "Access to view '%s' forbidden" msgstr "" #: prewikka/usergroup.py:50 #, python-format msgid "Required permissions: %s" msgstr "" #: prewikka/view.py:74 prewikka/view.py:81 prewikka/view.py:88 msgid "Parameters Normalization failed" msgstr "" #: prewikka/view.py:75 #, python-format msgid "Parameter '%s' is not valid" msgstr "" #: prewikka/view.py:89 #, python-format msgid "Required parameter '%s' is missing" msgstr "" #: prewikka/view.py:95 msgid "Invalid method" msgstr "" #: prewikka/view.py:102 msgid "Invalid view" msgstr "" #: prewikka/view.py:528 #, python-format msgid "Method '%(method)s' is not allowed for view '%(view)s'" msgstr "" #: prewikka/view.py:532 prewikka/view.py:651 #, python-format msgid "View '%s' does not exist" msgstr "" #: prewikka/auth/auth.py:30 msgid "Authentication failed" msgstr "" #: prewikka/dataprovider/__init__.py:35 msgid "Equal" msgstr "" #: prewikka/dataprovider/__init__.py:36 msgid "Equal (case-insensitive)" msgstr "" #: prewikka/dataprovider/__init__.py:37 msgid "Not equal" msgstr "" #: prewikka/dataprovider/__init__.py:38 msgid "Not equal (case-insensitive)" msgstr "" #: prewikka/dataprovider/__init__.py:39 msgid "Regular expression" msgstr "" #: prewikka/dataprovider/__init__.py:40 msgid "Regular expression (case-insensitive)" msgstr "" #: prewikka/dataprovider/__init__.py:41 msgid "Not regular expression" msgstr "" #: prewikka/dataprovider/__init__.py:42 msgid "Not regular expression (case-insensitive)" msgstr "" #: prewikka/dataprovider/__init__.py:43 msgid "Lesser than" msgstr "" #: prewikka/dataprovider/__init__.py:44 msgid "Lesser or equal" msgstr "" #: prewikka/dataprovider/__init__.py:45 msgid "Greater than" msgstr "" #: prewikka/dataprovider/__init__.py:46 msgid "Greater or equal" msgstr "" #: prewikka/dataprovider/__init__.py:47 msgid "Substring" msgstr "" #: prewikka/dataprovider/__init__.py:48 msgid "Substring (case-insensitive)" msgstr "" #: prewikka/dataprovider/__init__.py:49 msgid "Not substring" msgstr "" #: prewikka/dataprovider/__init__.py:50 msgid "Not substring (case-insensitive)" msgstr "" #: prewikka/dataprovider/__init__.py:92 prewikka/dataprovider/__init__.py:158 msgid "Conversion error" msgstr "" #: prewikka/dataprovider/__init__.py:93 prewikka/dataprovider/__init__.py:159 #, python-format msgid "Value %(value)r cannot be converted to %(type)s" msgstr "" #: prewikka/dataprovider/__init__.py:109 msgid "Backend error" msgstr "" #: prewikka/dataprovider/__init__.py:109 #, python-format msgid "No backend available for '%s' datatype" msgstr "" #: prewikka/dataprovider/__init__.py:116 prewikka/dataprovider/__init__.py:123 msgid "Syntax error" msgstr "" #: prewikka/dataprovider/__init__.py:116 #, python-format msgid "Unknown path: %s" msgstr "" #: prewikka/dataprovider/__init__.py:123 scripts/prewikka-cli:109 #: scripts/prewikka-cli:118 scripts/prewikka-cli:129 msgid "Could not parse input" msgstr "" #: prewikka/dataprovider/__init__.py:635 #, python-format msgid "No handler configured for '%s' datatype" msgstr "" #: prewikka/dataprovider/__init__.py:646 #, python-format msgid "Only one manager should be configured for '%s' backend" msgstr "" #: prewikka/dataprovider/idmef.py:128 msgid "High" msgstr "" #: prewikka/dataprovider/idmef.py:129 msgid "Medium" msgstr "" #: prewikka/dataprovider/idmef.py:130 msgid "Low" msgstr "" #: prewikka/dataprovider/idmef.py:131 msgid "Informational" msgstr "" #: prewikka/dataprovider/idmef.py:141 msgid "Provides an API to fetch IDMEF alerts" msgstr "" #: prewikka/dataprovider/idmef.py:142 #: prewikka/views/agents/templates/agents.mak:83 #: prewikka/views/datasearch/alert.py:75 prewikka/views/datasearch/alert.py:76 msgid "Alerts" msgstr "" #: prewikka/dataprovider/idmef.py:149 prewikka/views/datasearch/alert.py:88 #: prewikka/views/datasearch/threat.py:75 msgid "Classification" msgstr "" #: prewikka/dataprovider/idmef.py:150 msgid "Source IP" msgstr "" #: prewikka/dataprovider/idmef.py:151 #: prewikka/views/messagesummary/messagesummary.py:548 #: prewikka/views/messagesummary/messagesummary.py:569 msgid "Source port" msgstr "" #: prewikka/dataprovider/idmef.py:152 msgid "Target IP" msgstr "" #: prewikka/dataprovider/idmef.py:153 #: prewikka/views/messagesummary/messagesummary.py:549 #: prewikka/views/messagesummary/messagesummary.py:570 msgid "Target port" msgstr "" #: prewikka/dataprovider/idmef.py:154 msgid "Analyzer name" msgstr "" #: prewikka/dataprovider/idmef.py:157 msgid "Alert deletion" msgstr "" #: prewikka/dataprovider/idmef.py:182 msgid "Provides an API to fetch IDMEF heartbeats" msgstr "" #: prewikka/dataprovider/idmef.py:183 #: prewikka/views/agents/templates/agents.mak:87 #: prewikka/views/datasearch/heartbeat.py:56 msgid "Heartbeats" msgstr "" #: prewikka/dataprovider/idmef.py:188 msgid "Heartbeat deletion" msgstr "" #: prewikka/dataprovider/parsers/lucene/__init__.py:52 msgid "Lucene emulation error" msgstr "" #: prewikka/dataprovider/parsers/lucene/__init__.py:53 msgid "" "This Lucene expression cannot be emulated properly using the Criterion " "backend" msgstr "" #: prewikka/dataprovider/plugins/idmef/__init__.py:97 msgid "Plugin for fetching IDMEF alerts from the Prelude database" msgstr "" #: prewikka/dataprovider/plugins/idmef/__init__.py:111 msgid "Plugin for fetching IDMEF heartbeats from the Prelude database" msgstr "" #: prewikka/plugins/warning/__init__.py:33 msgid "Prelude Warning message" msgstr "" #: prewikka/plugins/warning/templates/warning.mak:14 msgid "WARNING" msgstr "" #: prewikka/plugins/warning/templates/warning.mak:17 msgid "Prelude OSS is the open-source version of the Prelude SIEM" msgstr "" #: prewikka/plugins/warning/templates/warning.mak:21 #, python-format msgid "" "This OSS version has lower " "performance and less features than the Pro/Enterprise versions." msgstr "" #: prewikka/plugins/warning/templates/warning.mak:22 msgid "" "It is intended for tests and small environments, and should not be used " "in critical environments." msgstr "" #: prewikka/plugins/warning/templates/warning.mak:26 #, python-format msgid "Prelude OSS is distributed under the %s." msgstr "" #: prewikka/plugins/warning/templates/warning.mak:27 msgid "" "Products derivated from Prelude OSS modules are therefore subject to the " "terms of the GPLv2." msgstr "" #: prewikka/plugins/warning/templates/warning.mak:30 #: prewikka/templates/error.mak:171 prewikka/templates/toplayout.mak:62 #: prewikka/templates/toplayout.mak:77 prewikka/templates/toplayout.mak:94 #: prewikka/views/aboutplugin/templates/aboutplugin.mak:44 msgid "OK" msgstr "" #: prewikka/renderer/__init__.py:44 msgid "No data to display." msgstr "" #: prewikka/renderer/__init__.py:143 prewikka/renderer/__init__.py:147 #: prewikka/renderer/__init__.py:151 msgid "Renderer error" msgstr "" #: prewikka/renderer/__init__.py:144 #, python-format msgid "No backend supporting render type '%s'" msgstr "" #: prewikka/renderer/__init__.py:148 #, python-format msgid "No backend named '%s'" msgstr "" #: prewikka/renderer/__init__.py:152 #, python-format msgid "Backend '%(backend)s' does not support render type '%(type)s'" msgstr "" #: prewikka/renderer/chartjs/__init__.py:104 msgid "ChartJS renderer backend" msgstr "" #: prewikka/renderer/chartjs/bar/__init__.py:38 msgid "ChartJS Bar renderer type" msgstr "" #: prewikka/renderer/chartjs/timeline/__init__.py:85 msgid "ChartJS Timebar renderer type" msgstr "" #: prewikka/session/session.py:39 msgid "Invalid session" msgstr "" #: prewikka/session/session.py:40 msgid "The session cookie carried by your browser is invalid" msgstr "" #: prewikka/session/session.py:44 msgid "Session expired" msgstr "" #: prewikka/session/session.py:45 msgid "Your session has expired: please sign in again to continue using Prelude" msgstr "" #: prewikka/session/session.py:181 msgid "Logged out" msgstr "" #: prewikka/session/anonymous/anonymous.py:31 msgid "Anonymous authentication" msgstr "" #: prewikka/templates/baseview.mak:148 msgid "View options" msgstr "" #: prewikka/templates/baseview.mak:151 msgid "View help" msgstr "" #: prewikka/templates/baseview.mak:205 msgid "This app has been disabled or failed to load." msgstr "" #: prewikka/templates/baseview.mak:211 prewikka/templates/baseview.mak:222 msgid "name" msgstr "" #: prewikka/templates/baseview.mak:287 msgid "About" msgstr "" #: prewikka/templates/baseview.mak:290 msgid "Are you sure you want to log out?" msgstr "" #: prewikka/templates/baseview.mak:290 msgid "Logout" msgstr "" #: prewikka/templates/error.mak:66 msgid "Detail" msgstr "" #: prewikka/templates/error.mak:67 msgid "Copy to clipboard" msgstr "" #: prewikka/templates/error.mak:137 prewikka/templates/error.mak:145 msgid "Error: {0}" msgstr "" #: prewikka/templates/error.mak:155 msgid "This may be due to one or more of the following reasons:" msgstr "" #: prewikka/templates/error.mak:157 msgid "You don't have the required permissions." msgstr "" #: prewikka/templates/error.mak:158 #, python-format msgid "Required apps are disabled. See the %s page for more details." msgstr "" #: prewikka/templates/error.mak:176 prewikka/templates/toplayout.mak:61 #: prewikka/views/crontab/templates/cronjob.mak:122 #: prewikka/views/filter/templates/filteredition.mak:122 msgid "Cancel" msgstr "" #: prewikka/templates/error.mak:177 msgid "Sign in" msgstr "" #: prewikka/templates/error.mak:181 msgid "Back" msgstr "" #: prewikka/templates/error.mak:184 msgid "Retry" msgstr "" #: prewikka/templates/error.mak:186 msgid "Redirect to main page" msgstr "" #: prewikka/templates/mainmenu.mak:44 msgid "Refresh:" msgstr "" #: prewikka/templates/mainmenu.mak:49 msgid "Update frequency of the current page" msgstr "" #: prewikka/templates/mainmenu.mak:76 msgid "Period:" msgstr "" #: prewikka/templates/mainmenu.mak:81 msgid "Period to visualize" msgstr "" #: prewikka/templates/mainmenu.mak:111 msgid "Start:" msgstr "" #: prewikka/templates/mainmenu.mak:117 msgid "start" msgstr "" #: prewikka/templates/mainmenu.mak:117 msgid "Start date" msgstr "" #: prewikka/templates/mainmenu.mak:123 msgid "End:" msgstr "" #: prewikka/templates/mainmenu.mak:130 msgid "end" msgstr "" #: prewikka/templates/mainmenu.mak:130 msgid "End date" msgstr "" #: prewikka/templates/toplayout.mak:57 msgid "Please Confirm" msgstr "" #: prewikka/templates/toplayout.mak:73 msgid "Prelude Dialog" msgstr "" #: prewikka/templates/toplayout.mak:88 msgid "Connection error" msgstr "" #: prewikka/templates/toplayout.mak:91 msgid "" "Connection failed, the server may be down or you may be experiencing " "network issues." msgstr "" #: prewikka/utils/misc.py:72 prewikka/views/agents/agents.py:45 msgid "Offline" msgstr "" #: prewikka/utils/misc.py:75 prewikka/views/agents/agents.py:210 msgid "Unknown" msgstr "" #: prewikka/utils/misc.py:78 msgid "Missing" msgstr "" #: prewikka/utils/misc.py:80 prewikka/views/agents/agents.py:44 msgid "Online" msgstr "" #: prewikka/views/about/__init__.py:13 msgid "Prelude About page" msgstr "" #: prewikka/views/about/templates/about.mak:11 #, python-format msgid "Prelude version %s" msgstr "" #: prewikka/views/about/templates/about.mak:15 msgid "Prelude is a SIEM (Security Information and Event Management)" msgstr "" #: prewikka/views/about/templates/about.mak:21 msgid "" "{prelude} is a security management solution that collects, filters, " "normalizes, correlates, stores and archives data from various sources of " "your information system. Based on all this information Prelude can " "provide a global vision of your system's security level and thus prevent " "attacks, intrusions as well as viral infections." msgstr "" #: prewikka/views/about/templates/about.mak:24 msgid "Prelude Team:" msgstr "" #: prewikka/views/about/templates/about.mak:25 msgid "" "Prelude OSS is an open-source project originally created by Yoann " "Vandoorselaere in 1998." msgstr "" #: prewikka/views/about/templates/about.mak:27 msgid "Vigilo is a NMS (Network Management System)" msgstr "" #: prewikka/views/about/templates/about.mak:33 msgid "" "{vigilo} is a complete monitoring and performance management solution " "capable of handling medium and large-scale systems (network - servers - " "applications) due to its distributed and modular architecture. Vigilo " "offers all the features required for performance supervision: states and " "alarms management, metrology, cartography, event correlation and " "reporting." msgstr "" #: prewikka/views/about/templates/about.mak:39 #, python-format msgid "" "Prelude SIEM and Vigilo NMS are being developed by the %s company, " "designer, integrator and operator of mission critical systems." msgstr "" #: prewikka/views/about/templates/about.mak:44 msgid "Contact" msgstr "" #: prewikka/views/about/templates/about.mak:46 msgid "Phone:" msgstr "" #: prewikka/views/about/templates/about.mak:47 msgid "Fax:" msgstr "" #: prewikka/views/about/templates/about.mak:50 msgid "Office" msgstr "" #: prewikka/views/about/templates/about.mak:56 msgid "Websites" msgstr "" #: prewikka/views/about/templates/about.mak:67 #: prewikka/views/aboutplugin/templates/aboutplugin.mak:132 #: prewikka/views/agents/templates/heartbeatanalyze.mak:71 #: prewikka/views/messagesummary/templates/messagesummary.mak:93 msgid "Close" msgstr "" #: prewikka/views/aboutplugin/__init__.py:36 msgid "Plugin installation and activation management page" msgstr "" #: prewikka/views/aboutplugin/__init__.py:40 #: prewikka/views/crontab/__init__.py:37 msgid "USER_MANAGEMENT" msgstr "" #: prewikka/views/aboutplugin/__init__.py:42 msgid "Apps: View" msgstr "" #: prewikka/views/aboutplugin/__init__.py:43 msgid "Apps: API" msgstr "" #: prewikka/views/aboutplugin/__init__.py:44 msgid "Apps: Dataprovider backend" msgstr "" #: prewikka/views/aboutplugin/__init__.py:45 msgid "Apps: Dataprovider type" msgstr "" #: prewikka/views/aboutplugin/__init__.py:46 msgid "Apps: Authentication" msgstr "" #: prewikka/views/aboutplugin/__init__.py:47 msgid "Apps: Identification" msgstr "" #: prewikka/views/aboutplugin/__init__.py:48 msgid "Apps: Renderer backend" msgstr "" #: prewikka/views/aboutplugin/__init__.py:49 msgid "Apps: Renderer type" msgstr "" #: prewikka/views/aboutplugin/__init__.py:82 msgid "list plugin: list installed plugins" msgstr "" #: prewikka/views/aboutplugin/__init__.py:91 msgid "Apps" msgstr "" #: prewikka/views/aboutplugin/__init__.py:120 msgid "sync plugin: initialize the plugin database schemas" msgstr "" #: prewikka/views/aboutplugin/__init__.py:134 #, python-format msgid "Applying %(module)s %(script)s..." msgstr "" #: prewikka/views/aboutplugin/__init__.py:144 msgid "All updates applied" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:44 msgid "ERROR" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:48 msgid "Update failed" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:111 msgid "Update Dialog" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:121 msgid "Plugin" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:122 msgid "Script" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:123 msgid "Result" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:144 msgid "Plugin Maintenance" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:147 msgid "" "The following apps need to be updated before they can be loaded into the " "system" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:154 #: prewikka/views/aboutplugin/templates/aboutplugin.mak:190 #: prewikka/views/agents/templates/agents.mak:29 #: prewikka/views/agents/templates/heartbeatanalyze.mak:19 #: prewikka/views/crontab/templates/cronjob.mak:114 #: prewikka/views/crontab/templates/crontab.mak:17 #: prewikka/views/filter/templates/filterlisting.mak:23 #: prewikka/views/messagesummary/messagesummary.py:288 #: prewikka/views/messagesummary/messagesummary.py:425 #: prewikka/views/messagesummary/messagesummary.py:676 #: prewikka/views/messagesummary/messagesummary.py:693 #: prewikka/views/messagesummary/messagesummary.py:716 #: prewikka/views/messagesummary/messagesummary.py:778 #: prewikka/views/messagesummary/messagesummary.py:797 #: prewikka/views/messagesummary/messagesummary.py:833 #: prewikka/views/usermanagement/templates/usersettings.mak:15 msgid "Name" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:155 #: prewikka/views/aboutplugin/templates/aboutplugin.mak:191 #: prewikka/views/filter/templates/filterlisting.mak:28 #: prewikka/views/idmefnav/templates/idmefnav.mak:56 #: prewikka/views/messagesummary/messagesummary.py:745 #: prewikka/views/messagesummary/messagesummary.py:751 msgid "Description" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:156 #: prewikka/views/aboutplugin/templates/aboutplugin.mak:192 #: prewikka/views/agents/templates/agents.mak:33 #: prewikka/views/messagesummary/messagesummary.py:427 #: prewikka/views/messagesummary/messagesummary.py:530 msgid "Version" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:157 msgid "Current database version" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:158 msgid "Required database update" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:174 msgid "Install update" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:182 msgid "Installed Apps" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:193 msgid "Database version" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:194 msgid "Active" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:215 msgid "Update the selected apps?" msgstr "" #: prewikka/views/aboutplugin/templates/aboutplugin.mak:215 msgid "Update" msgstr "" #: prewikka/views/agents/__init__.py:12 msgid "Agents status information page" msgstr "" #: prewikka/views/agents/agents.py:64 prewikka/views/agents/agents.py:133 msgid "Agents" msgstr "" #: prewikka/views/agents/agents.py:110 msgid "Node name n/a" msgstr "" #: prewikka/views/agents/agents.py:111 msgid "OS version n/a" msgstr "" #: prewikka/views/agents/agents.py:112 msgid "OS type n/a" msgstr "" #: prewikka/views/agents/agents.py:117 msgid "Node location n/a" msgstr "" #: prewikka/views/agents/agents.py:127 msgid "Alert listing" msgstr "" #: prewikka/views/agents/agents.py:128 msgid "Heartbeat listing" msgstr "" #: prewikka/views/agents/agents.py:129 #: prewikka/views/agents/templates/heartbeatanalyze.mak:12 msgid "Heartbeat analysis" msgstr "" #: prewikka/views/agents/agents.py:133 prewikka/views/agents/agents.py:157 #: prewikka/views/datasearch/idmef.py:158 #: prewikka/views/messagesummary/messagesummary.py:332 msgid "IDMEF_VIEW" msgstr "" #: prewikka/views/agents/agents.py:133 #: prewikka/views/datasearch/heartbeat.py:55 msgid "Monitoring" msgstr "" #: prewikka/views/agents/agents.py:142 msgid "IDMEF_ALTER" msgstr "" #: prewikka/views/agents/agents.py:184 msgid "Normal sensor start" msgstr "" #: prewikka/views/agents/agents.py:186 msgid "Unexpected sensor restart" msgstr "" #: prewikka/views/agents/agents.py:192 #, python-format msgid "Unexpected heartbeat interval: %(delta)s" msgstr "" #: prewikka/views/agents/agents.py:195 msgid "Normal sensor stop" msgstr "" #: prewikka/views/agents/agents.py:207 #, python-format msgid "Sensor is down since %s" msgstr "" #: prewikka/views/agents/agents.py:216 #, python-format msgid "" "No anomaly in the last %(count)d heartbeats (one heartbeat every " "%(delta)s average)" msgstr "" #: prewikka/views/agents/templates/agents.mak:24 msgid "Show/Hide all" msgstr "" #: prewikka/views/agents/templates/agents.mak:24 msgid "Search:" msgstr "" #: prewikka/views/agents/templates/agents.mak:30 msgid "Location" msgstr "" #: prewikka/views/agents/templates/agents.mak:31 msgid "Node" msgstr "" #: prewikka/views/agents/templates/agents.mak:32 #: prewikka/views/agents/templates/heartbeatanalyze.mak:20 #: prewikka/views/datasearch/heartbeat.py:67 #: prewikka/views/messagesummary/messagesummary.py:424 msgid "Model" msgstr "" #: prewikka/views/agents/templates/agents.mak:34 #: prewikka/views/messagesummary/messagesummary.py:428 msgid "Class" msgstr "" #: prewikka/views/agents/templates/agents.mak:38 #: prewikka/views/agents/templates/heartbeatanalyze.mak:25 msgid "Latest heartbeat" msgstr "" #: prewikka/views/agents/templates/agents.mak:39 msgid "Status" msgstr "" #: prewikka/views/agents/templates/agents.mak:83 msgid "Delete the alerts of the selected agent(s)" msgstr "" #: prewikka/views/agents/templates/agents.mak:87 msgid "Delete the heartbeats of the selected agent(s)" msgstr "" #: prewikka/views/agents/templates/agents.mak:89 msgid "Delete the selected IDMEF messages?" msgstr "" #: prewikka/views/agents/templates/agents.mak:89 #: prewikka/views/datasearch/idmef.py:195 #: prewikka/views/filter/templates/filterlisting.mak:42 msgid "Delete" msgstr "" #: prewikka/views/agents/templates/heartbeatanalyze.mak:21 msgid "OS" msgstr "" #: prewikka/views/agents/templates/heartbeatanalyze.mak:22 #: prewikka/views/datasearch/heartbeat.py:66 #: prewikka/views/messagesummary/messagesummary.py:412 msgid "Node name" msgstr "" #: prewikka/views/agents/templates/heartbeatanalyze.mak:23 #: prewikka/views/messagesummary/messagesummary.py:395 msgid "Node location" msgstr "" #: prewikka/views/agents/templates/heartbeatanalyze.mak:24 #: prewikka/views/datasearch/heartbeat.py:65 #: prewikka/views/messagesummary/messagesummary.py:418 msgid "Node address" msgstr "" #: prewikka/views/agents/templates/heartbeatanalyze.mak:26 msgid "Current status" msgstr "" #: prewikka/views/agents/templates/heartbeatanalyze.mak:56 msgid "Events" msgstr "" #: prewikka/views/crontab/__init__.py:30 msgid "Scheduling management" msgstr "" #: prewikka/views/crontab/__init__.py:35 msgid "Scheduled jobs management page" msgstr "" #: prewikka/views/crontab/__init__.py:62 msgid "Configuration" msgstr "" #: prewikka/views/crontab/__init__.py:62 msgid "Scheduling" msgstr "" #: prewikka/views/crontab/__init__.py:75 prewikka/views/crontab/__init__.py:104 msgid "SYSTEM" msgstr "" #: prewikka/views/crontab/__init__.py:88 msgid "Pending" msgstr "" #: prewikka/views/crontab/__init__.py:98 msgid "Error" msgstr "" #: prewikka/views/crontab/templates/cronjob.mak:54 msgid "Schedule:" msgstr "" #: prewikka/views/crontab/templates/cronjob.mak:69 msgid "custom" msgstr "" #: prewikka/views/crontab/templates/cronjob.mak:70 msgid "disabled" msgstr "" #: prewikka/views/crontab/templates/cronjob.mak:79 msgid "Minute:" msgstr "" #: prewikka/views/crontab/templates/cronjob.mak:83 msgid "Hour:" msgstr "" #: prewikka/views/crontab/templates/cronjob.mak:87 msgid "Day:" msgstr "" #: prewikka/views/crontab/templates/cronjob.mak:91 msgid "Month:" msgstr "" #: prewikka/views/crontab/templates/cronjob.mak:95 msgid "Weekday:" msgstr "" #: prewikka/views/crontab/templates/cronjob.mak:107 msgid "Edit Job" msgstr "" #: prewikka/views/crontab/templates/cronjob.mak:112 #: prewikka/views/filter/templates/filteredition.mak:73 #: prewikka/views/usermanagement/templates/usersettings.mak:13 msgid "Name:" msgstr "" #: prewikka/views/crontab/templates/cronjob.mak:123 #: prewikka/views/filter/templates/filteredition.mak:123 #: prewikka/views/usermanagement/templates/usersettings.mak:61 msgid "Save" msgstr "" #: prewikka/views/crontab/templates/crontab.mak:15 msgid "Scheduled Jobs" msgstr "" #: prewikka/views/crontab/templates/crontab.mak:18 msgid "Schedule" msgstr "" #: prewikka/views/crontab/templates/crontab.mak:19 msgid "User" msgstr "" #: prewikka/views/crontab/templates/crontab.mak:20 msgid "Last execution" msgstr "" #: prewikka/views/crontab/templates/crontab.mak:21 msgid "Next execution" msgstr "" #: prewikka/views/crontab/templates/crontab.mak:69 msgid "Disable" msgstr "" #: prewikka/views/crontab/templates/crontab.mak:70 msgid "Enable" msgstr "" #: prewikka/views/datasearch/alert.py:71 msgid "Alert listing page" msgstr "" #: prewikka/views/datasearch/alert.py:76 msgid "Aggregated alerts" msgstr "" #: prewikka/views/datasearch/alert.py:87 #: prewikka/views/datasearch/heartbeat.py:63 #: prewikka/views/datasearch/threat.py:74 msgid "Date" msgstr "" #: prewikka/views/datasearch/alert.py:89 prewikka/views/datasearch/threat.py:76 msgid "Source" msgstr "" #: prewikka/views/datasearch/alert.py:90 prewikka/views/datasearch/threat.py:77 msgid "Target" msgstr "" #: prewikka/views/datasearch/alert.py:91 msgid "Analyzer" msgstr "" #: prewikka/views/datasearch/alert.py:94 msgid "Delete the selected alerts?" msgstr "" #: prewikka/views/datasearch/alert.py:148 #: prewikka/views/idmefnav/__init__.py:44 msgid "IDMEF" msgstr "" #: prewikka/views/datasearch/datasearch.py:48 msgid "minute" msgstr "" #: prewikka/views/datasearch/datasearch.py:48 msgid "hour" msgstr "" #: prewikka/views/datasearch/datasearch.py:48 msgid "day" msgstr "" #: prewikka/views/datasearch/datasearch.py:48 msgid "month" msgstr "" #: prewikka/views/datasearch/datasearch.py:48 msgid "year" msgstr "" #: prewikka/views/datasearch/datasearch.py:161 msgid "Time group error" msgstr "" #: prewikka/views/datasearch/datasearch.py:161 msgid "Only one time unit can be specified in a groupby query" msgstr "" #: prewikka/views/datasearch/datasearch.py:446 msgid "Forensic" msgstr "" #: prewikka/views/datasearch/datasearch.py:446 msgid "Dashboard" msgstr "" #: prewikka/views/datasearch/datasearch.py:490 msgid "CSV export" msgstr "" #: prewikka/views/datasearch/datasearch.py:622 msgid "General" msgstr "" #: prewikka/views/datasearch/heartbeat.py:51 msgid "Heartbeat listing page" msgstr "" #: prewikka/views/datasearch/heartbeat.py:56 msgid "Aggregated heartbeats" msgstr "" #: prewikka/views/datasearch/heartbeat.py:64 msgid "Agent" msgstr "" #: prewikka/views/datasearch/heartbeat.py:69 msgid "Delete the selected heartbeats?" msgstr "" #: prewikka/views/datasearch/idmef.py:46 msgid "See IDMEF details" msgstr "" #: prewikka/views/datasearch/threat.py:66 msgid "Threat listing page" msgstr "" #: prewikka/views/datasearch/threat.py:69 #: prewikka/views/datasearch/threat.py:70 msgid "Threats" msgstr "" #: prewikka/views/datasearch/threat.py:70 msgid "Aggregated threats" msgstr "" #: prewikka/views/datasearch/threat.py:78 msgid "Program" msgstr "" #: prewikka/views/datasearch/templates/details.mak:26 #, python-format msgid "Group by %s" msgstr "" #: prewikka/views/datasearch/templates/details.mak:30 #: prewikka/views/datasearch/templates/forensic.mak:219 msgid "Add to search" msgstr "" #: prewikka/views/datasearch/templates/details.mak:31 #: prewikka/views/datasearch/templates/forensic.mak:220 msgid "Exclude from search" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:9 msgid "Fields" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:10 msgid "Query history" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:63 msgid "Chart type" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:73 msgid "Limit" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:89 msgid "Expert mode" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:96 msgid "Condensed mode" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:108 msgid "Search mode" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:112 #: prewikka/views/datasearch/templates/forensic.mak:217 msgid "Search" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:114 msgid "Reset search" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:124 #: prewikka/views/datasearch/templates/forensic.mak:222 msgid "Group by" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:125 msgid "Select your field" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:126 msgid "Time values" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:131 #, python-format msgid "%s fields" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:167 msgid "Timeline" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:221 msgid "New search" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:231 #: prewikka/views/messagesummary/messagesummary.py:1026 msgid "Actions" msgstr "" #: prewikka/views/datasearch/templates/forensic.mak:244 msgid "Informations" msgstr "" #: prewikka/views/datasearch/templates/infos.mak:3 msgid "Field" msgstr "" #: prewikka/views/datasearch/templates/infos.mak:9 msgid "Occurrence" msgstr "" #: prewikka/views/datasearch/templates/table.mak:12 msgid "Count" msgstr "" #: prewikka/views/filter/__init__.py:11 msgid "Filters management page" msgstr "" #: prewikka/views/filter/filter.py:113 #: prewikka/views/usermanagement/usermanagement.py:18 msgid "Preferences" msgstr "" #: prewikka/views/filter/filter.py:113 #: prewikka/views/filter/templates/filterlisting.mak:17 msgid "Filters" msgstr "" #: prewikka/views/filter/filter.py:124 #: prewikka/views/filter/templates/filteredition.mak:66 #, python-format msgid "Filter %s" msgstr "" #: prewikka/views/filter/filter.py:199 msgid "Filter error" msgstr "" #: prewikka/views/filter/filter.py:199 #, python-format msgid "Filter '%s' does not exist" msgstr "" #: prewikka/views/filter/filter.py:236 prewikka/views/filter/filter.py:248 msgid "Could not save filter" msgstr "" #: prewikka/views/filter/filter.py:236 msgid "No name for this filter was provided" msgstr "" #: prewikka/views/filter/filter.py:248 msgid "The filter name is already used by another filter" msgstr "" #: prewikka/views/filter/templates/filteredition.mak:66 #: prewikka/views/filter/templates/filterlisting.mak:17 #: prewikka/views/filter/templates/menu.mak:48 msgid "New filter" msgstr "" #: prewikka/views/filter/templates/filteredition.mak:75 msgid "Filter name" msgstr "" #: prewikka/views/filter/templates/filteredition.mak:80 msgid "Category:" msgstr "" #: prewikka/views/filter/templates/filteredition.mak:92 msgid "Description:" msgstr "" #: prewikka/views/filter/templates/filterlisting.mak:24 #: prewikka/views/messagesummary/messagesummary.py:750 msgid "Category" msgstr "" #: prewikka/views/filter/templates/filterlisting.mak:40 msgid "Create" msgstr "" #: prewikka/views/filter/templates/filterlisting.mak:41 msgid "Duplicate" msgstr "" #: prewikka/views/filter/templates/filterlisting.mak:42 msgid "Delete the selected filters?" msgstr "" #: prewikka/views/filter/templates/menu.mak:4 msgid "Filter:" msgstr "" #: prewikka/views/filter/templates/menu.mak:38 msgid "Available filters" msgstr "" #: prewikka/views/filter/templates/menu.mak:46 msgid "No filter" msgstr "" #: prewikka/views/filter/templates/menu.mak:51 msgid "No category" msgstr "" #: prewikka/views/filter/templates/widget.mak:7 msgid "Select a path..." msgstr "" #: prewikka/views/filter/templates/widget.mak:9 msgid "Default paths" msgstr "" #: prewikka/views/filter/templates/widget.mak:15 msgid "All paths" msgstr "" #: prewikka/views/filter/templates/widget.mak:25 #: prewikka/views/filter/templates/widget.mak:46 msgid "Change operator" msgstr "" #: prewikka/views/filter/templates/widget.mak:32 msgid "value" msgstr "" #: prewikka/views/filter/templates/widget.mak:34 msgid "Delete condition" msgstr "" #: prewikka/views/filter/templates/widget.mak:42 msgid "AND" msgstr "" #: prewikka/views/filter/templates/widget.mak:42 msgid "OR" msgstr "" #: prewikka/views/filter/templates/widget.mak:56 msgid "Add condition" msgstr "" #: prewikka/views/filter/templates/widget.mak:57 msgid "Add group" msgstr "" #: prewikka/views/filter/templates/widget.mak:59 msgid "Delete group" msgstr "" #: prewikka/views/idmefnav/__init__.py:36 msgid "IDMEF navigator" msgstr "" #: prewikka/views/idmefnav/__init__.py:44 msgid "Help" msgstr "" #: prewikka/views/idmefnav/templates/idmefnav.mak:12 msgid "Children" msgstr "" #: prewikka/views/idmefnav/templates/idmefnav.mak:20 msgid "Aggregates" msgstr "" #: prewikka/views/idmefnav/templates/idmefnav.mak:36 msgid "Attributes" msgstr "" #: prewikka/views/idmefnav/templates/idmefnav.mak:54 msgid "Rank" msgstr "" #: prewikka/views/idmefnav/templates/idmefnav.mak:55 msgid "Keyword" msgstr "" #: prewikka/views/messagesummary/__init__.py:13 msgid "Detailed alert and heartbeat page" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:289 #: prewikka/views/messagesummary/messagesummary.py:578 msgid "Code" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:290 msgid "Data length" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:291 msgid "Data" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:365 #, python-format msgid "(agent local time: %s)" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:372 #: prewikka/views/messagesummary/messagesummary.py:835 msgid "Create time" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:375 msgid "Detect time" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:380 msgid "Analyzer time" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:386 msgid "Process" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:387 msgid "Process Path" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:388 msgid "Process PID" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:415 msgid "Node name (resolved)" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:426 msgid "Analyzerid" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:430 msgid "Manufacturer" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:438 msgid "Operating System" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:456 #, python-format msgid "Analyzer Path (%d not shown)" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:463 #: prewikka/views/messagesummary/messagesummary.py:1035 #: prewikka/views/messagesummary/messagesummary.py:1106 #, python-format msgid "Analyzer #%d" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:473 msgid "Additional data" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:476 #: prewikka/views/messagesummary/messagesummary.py:717 msgid "Meaning" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:477 msgid "Value" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:531 #: prewikka/views/messagesummary/messagesummary.py:552 msgid "Header length" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:532 msgid "TOS" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:533 #: prewikka/views/messagesummary/messagesummary.py:571 msgid "Length" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:534 #: prewikka/views/messagesummary/messagesummary.py:580 msgid "Id" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:538 msgid "Ip offset" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:539 msgid "TTL" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:540 #: prewikka/views/messagesummary/messagesummary.py:926 #: prewikka/views/messagesummary/messagesummary.py:929 #: prewikka/views/messagesummary/messagesummary.py:932 msgid "Protocol" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:541 #: prewikka/views/messagesummary/messagesummary.py:563 #: prewikka/views/messagesummary/messagesummary.py:572 #: prewikka/views/messagesummary/messagesummary.py:579 msgid "Checksum" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:542 msgid "Source address" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:543 msgid "Target address" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:553 msgid "Reserved" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:562 msgid "Window" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:564 msgid "URP" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:577 #: prewikka/views/messagesummary/messagesummary.py:744 #: prewikka/views/messagesummary/messagesummary.py:777 #: prewikka/views/messagesummary/messagesummary.py:796 msgid "Type" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:581 msgid "Seq #" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:582 msgid "Mask" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:583 msgid "Gateway Address" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:584 msgid "Num address" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:585 msgid "Wpa" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:586 msgid "Lifetime" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:587 msgid "Otime" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:588 msgid "Rtime" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:589 msgid "Ttime" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:595 #: prewikka/views/messagesummary/messagesummary.py:1082 msgid "Payload" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:648 msgid "Alert details" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:653 #, python-format msgid "%d linked alerts missing (probably deleted)" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:657 #, python-format msgid "%d linked alerts omitted" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:674 #: prewikka/views/messagesummary/messagesummary.py:991 msgid "Correlation Alert" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:680 msgid "Correlated Alerts" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:681 #: prewikka/views/messagesummary/messagesummary.py:698 msgid "Source Analyzer" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:691 #: prewikka/views/messagesummary/messagesummary.py:994 msgid "Tool Alert" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:697 msgid "Linked Alerts" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:708 msgid "Text" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:710 msgid "Ident" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:715 msgid "Origin" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:738 msgid "Severity" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:741 msgid "Completion" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:774 msgid "User category" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:779 #: prewikka/views/messagesummary/messagesummary.py:798 msgid "Number" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:780 msgid "Tty" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:799 msgid "Permission" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:821 msgid "Change time" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:822 msgid "Inode Number" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:823 msgid "Major device" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:824 msgid "Minor device" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:825 msgid "C Major device" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:826 msgid "C Minor device" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:830 #, python-format msgid "Target file %s" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:830 msgid "category" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:834 msgid "Path" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:836 msgid "Modify time" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:837 msgid "Access time" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:838 msgid "Data size" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:839 msgid "Disk size" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:858 msgid "Web Service" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:861 msgid "Url" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:862 msgid "Cgi" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:863 msgid "Http Method" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:866 msgid "CGI Argument" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:875 msgid "SNMP Service" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:878 msgid "oid" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:879 msgid "messageProcessingModel" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:880 msgid "securityModel" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:881 msgid "securityName" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:882 msgid "securityLevel" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:883 msgid "contextName" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:884 msgid "contextEngineID" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:885 msgid "command" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:897 #: prewikka/views/messagesummary/messagesummary.py:899 msgid "Port" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:919 msgid "PortList" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:922 msgid "ip_version" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:958 #, python-format msgid "Source(%d)" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:973 #, python-format msgid "Target(%d)" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:997 msgid "Overflow Alert" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:1000 msgid "Alert" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:1018 msgid "MessageID" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:1065 msgid "Network centric information" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:1087 msgid "ASCII Payload" msgstr "" #: prewikka/views/messagesummary/messagesummary.py:1103 msgid "Heartbeat" msgstr "" #: prewikka/views/messagesummary/templates/messagesummary.mak:85 msgid "Summary" msgstr "" #: prewikka/views/usermanagement/__init__.py:14 msgid "User settings page" msgstr "" #: prewikka/views/usermanagement/usermanagement.py:18 msgid "My account" msgstr "" #: prewikka/views/usermanagement/usermanagement.py:23 msgid "Invalid User" msgstr "" #: prewikka/views/usermanagement/usermanagement.py:23 #, python-format msgid "Requested user '%s' does not exist" msgstr "" #: prewikka/views/usermanagement/usermanagement.py:43 msgid "Invalid Language" msgstr "" #: prewikka/views/usermanagement/usermanagement.py:43 msgid "Specified language does not exist" msgstr "" #: prewikka/views/usermanagement/usermanagement.py:47 msgid "Invalid Timezone" msgstr "" #: prewikka/views/usermanagement/usermanagement.py:47 msgid "Specified timezone does not exist" msgstr "" #: prewikka/views/usermanagement/templates/usersettings.mak:6 msgid "Login:" msgstr "" #: prewikka/views/usermanagement/templates/usersettings.mak:20 msgid "Email:" msgstr "" #: prewikka/views/usermanagement/templates/usersettings.mak:22 msgid "Email" msgstr "" #: prewikka/views/usermanagement/templates/usersettings.mak:27 msgid "Language:" msgstr "" #: prewikka/views/usermanagement/templates/usersettings.mak:39 msgid "Theme:" msgstr "" #: prewikka/views/usermanagement/templates/usersettings.mak:50 msgid "Timezone:" msgstr "" #: scripts/prewikka-cli:59 msgid "Unknown command" msgstr "" #: scripts/prewikka-cli:67 #, python-format msgid "An unexpected error occurred: %s" msgstr "" #: scripts/prewikka-cli:154 msgid "Create an object of the specified type" msgstr "" #: scripts/prewikka-cli:157 msgid "Delete an object of the specified type" msgstr "" #: scripts/prewikka-cli:160 msgid "Import objects of the specified type from files" msgstr "" #: scripts/prewikka-cli:163 msgid "List objects of the specified type" msgstr "" #: scripts/prewikka-cli:166 msgid "Synchronize objects of the specified type" msgstr "" #: scripts/prewikka-cli:169 msgid "Update objects of the specified type" msgstr "" #: scripts/prewikka-cli:207 msgid "Prewikka command-line tool" msgstr "" #: scripts/prewikka-cli:208 msgid "name of the user" msgstr "" #: scripts/prewikka-cli:209 scripts/prewikka-crontab:99 #: scripts/prewikka-httpd:93 #, python-format msgid "configuration file to use (default: %(default)s)" msgstr "" #: scripts/prewikka-cli:210 msgid "command to execute" msgstr "" #: scripts/prewikka-cli:211 msgid "enable debugging output" msgstr "" #: scripts/prewikka-cli:218 msgid "prewikka-cli must be executed as the prewikka user" msgstr "" #: scripts/prewikka-cli:243 #, python-format msgid "Prewikka command-line tool (%s)" msgstr "" #: scripts/prewikka-cli:244 msgid "Type \"help\" or \"?\" to list commands" msgstr "" #: scripts/prewikka-crontab:100 msgid "run as a system daemon" msgstr "" #: scripts/prewikka-crontab:101 scripts/prewikka-httpd:96 msgid "show this help message and exit" msgstr "" #: scripts/prewikka-crontab:102 scripts/prewikka-httpd:97 msgid "show program's version number and exit" msgstr "" #: scripts/prewikka-httpd:88 msgid "root where the server is accessible" msgstr "" #: scripts/prewikka-httpd:89 #, python-format msgid "IP to bind to (default: %(default)s)" msgstr "" #: scripts/prewikka-httpd:90 #, python-format msgid "port number to use (default: %(default)d)" msgstr "" #: scripts/prewikka-httpd:91 msgid "SSL private key to use (default: no SSL)" msgstr "" #: scripts/prewikka-httpd:92 msgid "SSL certificate to use (default: no SSL)" msgstr "" #: scripts/prewikka-httpd:95 #, python-format msgid "" "number of processes to use. Default value matches the number of available" " CPUs (i.e. %d)" msgstr "" prewikka-5.1.1/setup.py0000664000175000017500000002500713555143652016466 0ustar tandrejatandreja00000000000000#!/usr/bin/env python # Copyright (C) 2005-2019 CS-SI. All Rights Reserved. # Author: Nicolas Delon # # This file is part of the Prewikka program. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from glob import glob import io import os import stat import subprocess import sys import tempfile from setuptools import Command, setup, find_packages from setuptools.command.test import test as TestCommand from distutils.dist import Distribution from distutils.command.install import install from distutils.dep_util import newer from distutils.command.build import build as _build LIBPRELUDE_REQUIRED_VERSION = "5.1.0" LIBPRELUDEDB_REQUIRED_VERSION = "5.1.0" def init_siteconfig(conf_prefix, data_prefix): """ Initialize configuration file (prewikka/siteconfig.py). :param str conf_prefix: configuration path :param str data_prefix: data path """ configuration = ( ('tmp_dir', os.path.join(tempfile.gettempdir(), 'prewikka')), ('conf_dir', os.path.abspath(conf_prefix)), ('data_dir', os.path.abspath(data_prefix)), ('libprelude_required_version', LIBPRELUDE_REQUIRED_VERSION), ('libpreludedb_required_version', LIBPRELUDEDB_REQUIRED_VERSION), ) with open('prewikka/siteconfig.py', 'w') as config_file: for option, value in configuration: config_file.write("%s = '%s'\n" % (option, value)) class MyDistribution(Distribution): def __init__(self, attrs): try: os.remove("prewikka/siteconfig.py") except: pass self.conf_files = [] self.closed_source = os.path.exists("PKG-INFO") Distribution.__init__(self, attrs) class my_install(install): def finalize_options(self): # if no prefix is given, configuration should go to /etc or in {prefix}/etc otherwise if self.prefix: self.conf_prefix = self.prefix + "/etc/prewikka" self.data_prefix = self.prefix + "/var/lib/prewikka" else: self.conf_prefix = "/etc/prewikka" self.data_prefix = "/var/lib/prewikka" install.finalize_options(self) def get_outputs(self): tmp = [self.conf_prefix + "/prewikka.conf"] + install.get_outputs(self) return tmp def install_conf(self): self.mkpath((self.root or "") + self.conf_prefix) for file in self.distribution.conf_files: dest = (self.root or "") + self.conf_prefix + "/" + os.path.basename(file) if os.path.exists(dest): dest += "-dist" self.copy_file(file, dest) def create_datadir(self): self.mkpath((self.root or "") + self.data_prefix) def install_wsgi(self): share_dir = os.path.join(self.install_data, 'share', 'prewikka') if not os.path.exists(share_dir): os.makedirs(share_dir) ofile, copied = self.copy_file('scripts/prewikka.wsgi', share_dir) def run(self): os.umask(0o22) self.install_conf() self.install_wsgi() self.create_datadir() init_siteconfig(self.conf_prefix, self.data_prefix) install.run(self) os.chmod((self.root or "") + self.conf_prefix, 0o755) if not self.dry_run: for filename in self.get_outputs(): if filename.find(".conf") != -1: continue mode = os.stat(filename)[stat.ST_MODE] mode |= 0o44 if mode & 0o100: mode |= 0o11 os.chmod(filename, mode) class build(_build): sub_commands = [('compile_catalog', None), ('build_custom', None)] + _build.sub_commands class build_custom(Command): @staticmethod def _need_compile(template, outfile): if os.path.exists(outfile) and not any(newer(tmpl, outfile) for tmpl in template): return False directory = os.path.dirname(outfile) if not os.path.exists(directory): print("creating %s" % directory) os.makedirs(directory) print("compiling %s -> %s" % (template, outfile)) return True def initialize_options(self): pass def finalize_options(self): pass def run(self): style = os.path.join("prewikka", "htdocs", "css", "style.less") for less in glob("themes/*.less"): css = os.path.join("prewikka", "htdocs", "css", "themes", "%s.css" % os.path.basename(less[:-5])) if self._need_compile([less, style], css): io.open(css, "wb").write(subprocess.check_output(["lesscpy", "-I", less, style])) class PrewikkaTest(TestCommand): """ Custom command for Prewikka test suite with pytest. Based on https://docs.pytest.org/en/2.7.3/goodpractises.html#integration-with-setuptools-test-commands """ user_options = [ ('pytest-args=', 'a', 'Arguments to pass to pytest') ] def initialize_options(self): TestCommand.initialize_options(self) self.pytest_args = [] def finalize_options(self): TestCommand.finalize_options(self) self.test_args = [] self.test_suite = True def run_tests(self): init_siteconfig('conf', 'tests/downloads') import pytest # import here, cause outside the eggs aren't loaded if not isinstance(self.pytest_args, list): self.pytest_args = self.pytest_args.split() errno = pytest.main(self.pytest_args + ['tests']) sys.exit(errno) class PrewikkaCoverage(Command): """ Coverage command. """ user_options = [ ('run-args=', None, 'Arguments to pass to coverage during run'), ('report-args=', None, 'Arguments to pass to coverage for report') ] description = 'Run tests with coverage.' def initialize_options(self): self.run_args = [] self.report_args = [] def finalize_options(self): pass def run(self): subprocess.call(['coverage', 'run', 'setup.py', 'test'] + self.run_args) subprocess.call(['coverage', 'report'] + self.report_args) setup( name="prewikka", version="5.1.1", maintainer="Prelude Team", maintainer_email="support.prelude@c-s.fr", url="http://www.prelude-siem.com", packages=find_packages(exclude=[ 'tests', 'tests.*' ]), setup_requires=[ 'Babel' ], entry_points={ 'prewikka.renderer.backend': [ 'ChartJS = prewikka.renderer.chartjs:ChartJSPlugin', ], 'prewikka.renderer.type': [ 'ChartJSBar = prewikka.renderer.chartjs.bar:ChartJSBarPlugin', 'ChartJSTimebar = prewikka.renderer.chartjs.timeline:ChartJSTimebarPlugin', ], 'prewikka.dataprovider.backend': [ 'IDMEFAlert = prewikka.dataprovider.plugins.idmef:IDMEFAlertPlugin', 'IDMEFHeartbeat = prewikka.dataprovider.plugins.idmef:IDMEFHeartbeatPlugin', ], 'prewikka.dataprovider.type': [ 'alert = prewikka.dataprovider.idmef:IDMEFAlertProvider', 'heartbeat = prewikka.dataprovider.idmef:IDMEFHeartbeatProvider', ], 'prewikka.plugins': [], 'prewikka.session': [ 'Anonymous = prewikka.session.anonymous:AnonymousSession', ], 'prewikka.auth': [], 'prewikka.views': [ 'About = prewikka.views.about:About', 'AboutPlugin = prewikka.views.aboutplugin:AboutPlugin', 'AgentPlugin = prewikka.views.agents:AgentPlugin', 'AlertDataSearch = prewikka.views.datasearch.alert:AlertDataSearch', 'CrontabView = prewikka.views.crontab:CrontabView', 'FilterView = prewikka.views.filter.filter:FilterView', 'HeartbeatDataSearch = prewikka.views.datasearch.heartbeat:HeartbeatDataSearch', "IDMEFnav = prewikka.views.idmefnav:IDMEFNav", 'MessageSummary = prewikka.views.messagesummary:MessageSummary', 'ThreatDataSearch = prewikka.views.datasearch.threat:ThreatDataSearch', 'UserManagement = prewikka.views.usermanagement:UserManagement', 'Warning = prewikka.plugins.warning:Warning', ], 'prewikka.updatedb': [ 'prewikka = prewikka.sql', 'prewikka.views.filter.filter = prewikka.views.filter.sql' ] }, package_data={ '': [ "htdocs/css/*.*", "htdocs/css/themes/*.css", "htdocs/css/images/*.*", "htdocs/fonts/*.*", "htdocs/images/*.*", "htdocs/js/*.js", "htdocs/js/locales/*.js", "htdocs/js/locales/*/*.js", "htdocs/js/*.map", "htdocs/js/locales/*.map", "locale/*.pot", "locale/*/LC_MESSAGES/*.mo", "sql/*.py", "templates/*.mak" ], 'prewikka.renderer.chartjs': [ "htdocs/js/*.js" ], 'prewikka.views.about': [ "htdocs/css/*.css", "htdocs/images/*.png" ], 'prewikka.views.aboutplugin': [ "htdocs/css/*.css" ], "prewikka.views.idmefnav": [ "htdocs/yaml/*.yml", "htdocs/graph/*", ], }, scripts=[ "scripts/prewikka-cli", "scripts/prewikka-crontab", "scripts/prewikka-httpd" ], conf_files=[ "conf/prewikka.conf", "conf/menu.yml" ], cmdclass={ 'build': build, 'build_custom': build_custom, 'coverage': PrewikkaCoverage, 'install': my_install, 'test': PrewikkaTest, }, tests_require=[ 'pytest' ], distclass=MyDistribution, message_extractors={ 'scripts': [ ('prewikka-cli', 'python', None), ('prewikka-httpd', 'python', None), ('prewikka-crontab', 'python', None) ], 'prewikka': [ ('**.py', 'python', None), ('**/templates/*.mak', 'mako', None) ] } ) prewikka-5.1.1/PKG-INFO0000664000175000017500000000033613555143705016046 0ustar tandrejatandreja00000000000000Metadata-Version: 1.0 Name: prewikka Version: 5.1.1 Summary: UNKNOWN Home-page: http://www.prelude-siem.com Author: Prelude Team Author-email: support.prelude@c-s.fr License: UNKNOWN Description: UNKNOWN Platform: UNKNOWN prewikka-5.1.1/setup.cfg0000664000175000017500000000073313555143705016573 0ustar tandrejatandreja00000000000000[extract_messages] output_file = prewikka.pot [compile_catalog] domain = prewikka directory = prewikka/locale [update_catalog] domain = prewikka input_file = prewikka.pot output_dir = prewikka/locale [flake8] exclude = .git,__pycache__,build max_line_length = 200 builtins = _,N_,ngettext,env,url_for,text_type format = pylint statistics = True [pytest] minversion = 2.7 norecursedirs = .* *.egg build dist tmp [egg_info] tag_build = tag_date = 0 tag_svn_revision = 0